[ipxe-devel] [PATCH] [dhcp] More spec compliant DHCP/PXE timeouts
Ján ONDREJ (SAL)
ondrejj at salstar.sk
Sat Jun 8 10:55:29 UTC 2013
+1 for a patch, which can fix DHCP timeouts on spanning-tree enabled non
fast ports. If I can't manage switches, where my server is connected,
it's hard to boot from this network.
SAL
On Fri, Jun 07, 2013 at 02:22:03PM -0600, Alex Williamson wrote:
> 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,
> };
>
> /****************************************************************************
>
> _______________________________________________
> ipxe-devel mailing list
> ipxe-devel at lists.ipxe.org
> https://lists.ipxe.org/mailman/listinfo.cgi/ipxe-devel
More information about the ipxe-devel
mailing list