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; } }
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 --; }