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

Alex Williamson alex.williamson at redhat.com
Wed Sep 17 16:38:23 BST 2014


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

This continues to be a problem that customer complain about.  The
xNBA version of ipxe has already included this commit [1][2].  Others
have also expressed support for this patch in the past [3].  Previous
postings of this patch can be found here [4][5].  I understand the
reluctance to increase the timeout, but the benefit is that ipxe can
work more reliably for more users, which seems worthwhile.

[1] http://lists.ipxe.org/pipermail/ipxe-devel/2014-March/003223.html
[2] http://sourceforge.net/p/xcat/xnba/ci/fea8166abfa856884792021d61d4095ebd00a984/
[3] http://lists.ipxe.org/pipermail/ipxe-devel/2013-June/002576.html
[4] http://lists.ipxe.org/pipermail/ipxe-devel/2014-February/003156.html
[5] http://lists.ipxe.org/pipermail/ipxe-devel/2013-June/002573.html

 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 bcfb85c..595f0c1 100644
--- a/src/include/ipxe/dhcp.h
+++ b/src/include/ipxe/dhcp.h
@@ -639,10 +639,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 e6d3edd..87c8d6e 100644
--- a/src/net/udp/dhcp.c
+++ b/src/net/udp/dhcp.c
@@ -171,8 +171,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;
@@ -272,9 +273,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 );
 }
 
@@ -447,7 +447,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,
 };
 
 /**
@@ -584,7 +585,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,
 };
 
 /**
@@ -685,7 +687,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,
 };
 
 /**
@@ -832,7 +835,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