[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