For discovery, both the DHCP and PXE specs suggest timeouts of 4, 8, 16, and 32 seconds. This gives us a maximum timeout of 60 seconds, versus the current timeout of 15 seconds at timeouts of 1, 2, 4, and 8 seconds.
On the request phase, the specs are quite different. RFC2131 for DHCP suggests the same intervals as above for discovery, while the PXE spec recommends intervals of 1, 2, 3, and 4 seconds. Our timer only wants to do exponential back-off, so we compromise and adjust to intervals of 1, 2, 4, and 8 seconds. PXE boot server discovery appears to want the same timeouts as the DHCP request phase. Signed-off-by: Alex Williamson <[email protected]> --- src/include/ipxe/dhcp.h | 4 ---- src/net/udp/dhcp.c | 22 +++++++++++++--------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/include/ipxe/dhcp.h b/src/include/ipxe/dhcp.h index b97dfe3..f3f7185 100644 --- a/src/include/ipxe/dhcp.h +++ b/src/include/ipxe/dhcp.h @@ -631,10 +631,6 @@ struct dhcphdr { */ #define DHCP_MIN_LEN 552 -/** Timeouts for sending DHCP packets */ -#define DHCP_MIN_TIMEOUT ( 1 * TICKS_PER_SEC ) -#define DHCP_MAX_TIMEOUT ( 10 * TICKS_PER_SEC ) - /** Maximum time that we will wait for ProxyDHCP responses */ #define PROXYDHCP_MAX_TIMEOUT ( 2 * TICKS_PER_SEC ) diff --git a/src/net/udp/dhcp.c b/src/net/udp/dhcp.c index 762ae73..d67e1e5 100644 --- a/src/net/udp/dhcp.c +++ b/src/net/udp/dhcp.c @@ -185,8 +185,9 @@ struct dhcp_session_state { void ( * expired ) ( struct dhcp_session *dhcp ); /** Transmitted message type */ uint8_t tx_msgtype; - /** Apply minimum timeout */ - uint8_t apply_min_timeout; + /** Timer parameters (seconds) */ + unsigned long min_timeout; + unsigned long max_timeout; }; static struct dhcp_session_state dhcp_state_discover; @@ -286,9 +287,8 @@ static void dhcp_set_state ( struct dhcp_session *dhcp, dhcp->state = state; dhcp->start = currticks(); stop_timer ( &dhcp->timer ); - dhcp->timer.min_timeout = - ( state->apply_min_timeout ? DHCP_MIN_TIMEOUT : 0 ); - dhcp->timer.max_timeout = DHCP_MAX_TIMEOUT; + dhcp->timer.min_timeout = state->min_timeout * TICKS_PER_SEC; + dhcp->timer.max_timeout = state->max_timeout * TICKS_PER_SEC; start_timer_nodelay ( &dhcp->timer ); } @@ -461,7 +461,8 @@ static struct dhcp_session_state dhcp_state_discover = { .rx = dhcp_discovery_rx, .expired = dhcp_discovery_expired, .tx_msgtype = DHCPDISCOVER, - .apply_min_timeout = 1, + .min_timeout = 4, + .max_timeout = 32, }; /** @@ -598,7 +599,8 @@ static struct dhcp_session_state dhcp_state_request = { .rx = dhcp_request_rx, .expired = dhcp_request_expired, .tx_msgtype = DHCPREQUEST, - .apply_min_timeout = 0, + .min_timeout = 1, + .max_timeout = 8, }; /** @@ -699,7 +701,8 @@ static struct dhcp_session_state dhcp_state_proxy = { .rx = dhcp_proxy_rx, .expired = dhcp_proxy_expired, .tx_msgtype = DHCPREQUEST, - .apply_min_timeout = 0, + .min_timeout = 1, + .max_timeout = 8, }; /** @@ -846,7 +849,8 @@ static struct dhcp_session_state dhcp_state_pxebs = { .rx = dhcp_pxebs_rx, .expired = dhcp_pxebs_expired, .tx_msgtype = DHCPREQUEST, - .apply_min_timeout = 1, + .min_timeout = 1, + .max_timeout = 8, }; /**************************************************************************** _______________________________________________ ipxe-devel mailing list [email protected] https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel

