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

Alex Williamson alex.williamson at redhat.com
Fri Jun 21 21:16:50 UTC 2013


Ping.  Comments?  There was one +1 for some fix in this space.  Thanks,

Alex

On Fri, 2013-06-07 at 14:22 -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