コード例 #1
0
ファイル: main.c プロジェクト: Agochka/klibc
static void process_timeout_event(struct state *s, time_t now)
{
	int ret = 0;

	/*
	 * Is the link up?  If not, try again in 1 second.
	 */
	if (!netdev_running(s->dev)) {
		s->expire = now + 1;
		s->state = s->restart_state;
		return;
	}

	/*
	 * If we had an error, restore a sane state to
	 * restart from.
	 */
	if (s->state == DEVST_ERROR)
		s->state = s->restart_state;

	/*
	 * Now send a packet depending on our state.
	 */
	switch (s->state) {
	case DEVST_BOOTP:
		ret = bootp_send_request(s->dev);
		s->restart_state = DEVST_BOOTP;
		break;

	case DEVST_DHCPDISC:
		ret = dhcp_send_discover(s->dev);
		s->restart_state = DEVST_DHCPDISC;
		break;

	case DEVST_DHCPREQ:
		ret = dhcp_send_request(s->dev);
		s->restart_state = DEVST_DHCPDISC;
		break;
	}

	if (ret == -1) {
		s->state = DEVST_ERROR;
		s->expire = now + 10;
	} else {
		s->expire = now + s->retry_period;

		s->retry_period *= 2;
		if (s->retry_period > 60)
			s->retry_period = 60;
	}
}
コード例 #2
0
ファイル: bootp_net.c プロジェクト: muccc/matemat
void
bootp_net_main(void)
{
    if(uip_newdata())
	bootp_handle_reply();

    if(! uip_udp_conn->appstate.bootp.retry_timer) {
	bootp_send_request();

	if(uip_udp_conn->appstate.bootp.retry_counter < 5)
	    uip_udp_conn->appstate.bootp.retry_timer = 
		2 << (++ uip_udp_conn->appstate.bootp.retry_counter);
	else
	    uip_udp_conn->appstate.bootp.retry_timer = 64 + (rand() & 63);
    }
    else
	uip_udp_conn->appstate.bootp.retry_timer --;
}