From 2058e73ce6b110e2e96898057787a6b6f571ae6c Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Fri, 7 Mar 2014 16:28:28 -0500 Subject: [PATCH] Extend DHCP timeou Per Alex Williamson : 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. --- src/include/ipxe/dhcp.h | 4 ---- src/net/udp/dhcp.c | 21 ++++++++++++--------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/include/ipxe/dhcp.h b/src/include/ipxe/dhcp.h index 6c028466..badc142c 100644 --- a/src/include/ipxe/dhcp.h +++ b/src/include/ipxe/dhcp.h @@ -643,10 +643,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 1f4910d5..1d95f623 100644 --- a/src/net/udp/dhcp.c +++ b/src/net/udp/dhcp.c @@ -185,8 +185,8 @@ 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; + uint8_t min_timeout; + uint8_t max_timeout; }; static struct dhcp_session_state dhcp_state_discover; @@ -286,9 +286,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 +460,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 +598,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 +700,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 +848,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, }; /****************************************************************************