[ipxe-devel] [PATCH] [dhcp] More spec compliant DHCP/PXE timeouts

Alex Williamson alex.williamson at redhat.com
Fri Jun 7 20:22:03 UTC 2013


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 <alex.williamson at redhat.com>
---
 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,
 };
 
 /****************************************************************************




More information about the ipxe-devel mailing list