All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lothar Waßmann" <LW@KARO-electronics.de>
To: seanedmond@linux.microsoft.com
Cc: u-boot@lists.denx.de, joe.hershberger@ni.com, rfried.dev@gmail.com
Subject: Re: [PATCH 2/3] net: bootp: BOOTP/DHCPv4 retransmission improvements
Date: Wed, 27 Sep 2023 06:11:25 +0200	[thread overview]
Message-ID: <20230927061125.3f1702a0@karo-electronics.de> (raw)
In-Reply-To: <20230925202935.118652-3-seanedmond@linux.microsoft.com>

Hi,

On Mon, 25 Sep 2023 13:29:34 -0700 seanedmond@linux.microsoft.com wrote:
> From: Sean Edmond <seanedmond@microsoft.com>
> 
> This patch introduces 3 improvements to align with RFC 951:
> - retransmission backoff interval maximum is configurable
> - initial retranmission backoff interval is configurable
> - transaction ID is kept the same for each BOOTP/DHCPv4 request
> 
> In applications where thousands of nodes are serviced by a single DHCP
> server, maximizing the retransmission backoff interval at 2 seconds (the
> current u-boot default) exerts high pressure on the DHCP server and
> network layer.
> 
> RFC 951 “7.2. Client Retransmission Strategy” states that the
> retransmission backoff interval should maximize at 60 seconds.  This
> patch allows the interval to be configurable using the environment
> variable "bootpretransmitperiodmax"
> 
> The initial retranmission backoff period defaults to 250ms, which is
> also too small for these scenarios with many clients.  This patch makes
> the initial retransmission interval to be configurable using the
> environment variable "bootpretransmitperiodinit".
> 
> Also, on a retransmission it is not expected for the transaction ID to
> change (only the 'secs' field should be updated). Let's save the
> transaction ID and use the same transaction ID for each BOOTP/DHCPv4
> exchange.
> 
> Signed-off-by: Sean Edmond <seanedmond@microsoft.com>
> ---
>  net/bootp.c | 63 +++++++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 47 insertions(+), 16 deletions(-)
> 
> diff --git a/net/bootp.c b/net/bootp.c
> index 013d54c7ed..7248536cc4 100644
> --- a/net/bootp.c
> +++ b/net/bootp.c
> @@ -42,6 +42,17 @@
>   */
>  #define TIMEOUT_MS	((3 + (CONFIG_NET_RETRY_COUNT * 5)) * 1000)
>  
> +/*
> + * According to rfc951 : 7.2. Client Retransmission Strategy
> + * "After the 'average' backoff reaches about 60 seconds, it should be
> + * increased no further, but still randomized."
> + *
> + * U-Boot has saturated this backoff at 2 seconds for a long time.
> + * To modify, set the environment variable "bootpretransmitperiodmax"
> + */
> +#define RETRANSMIT_PERIOD_MAX_MS	2000
> +#define RETRANSMIT_PERIOD_INIT_MS	250
> +
>  #define PORT_BOOTPS	67		/* BOOTP server UDP port */
>  #define PORT_BOOTPC	68		/* BOOTP client UDP port */
>  
> @@ -56,6 +67,7 @@
>  u32		bootp_ids[CFG_BOOTP_ID_CACHE_SIZE];
>  unsigned int	bootp_num_ids;
>  int		bootp_try;
> +u32		bootp_id;
>  ulong		bootp_start;
>  ulong		bootp_timeout;
>  char net_nis_domain[32] = {0,}; /* Our NIS domain */
> @@ -63,6 +75,7 @@ char net_hostname[32] = {0,}; /* Our hostname */
>  char net_root_path[CONFIG_BOOTP_MAX_ROOT_PATH_LEN] = {0,}; /* Our bootpath */
>  
>  static ulong time_taken_max;
> +static u32   retransmit_period_max_ms;
>  
>  #if defined(CONFIG_CMD_DHCP)
>  static dhcp_state_t dhcp_state = INIT;
> @@ -417,8 +430,8 @@ static void bootp_timeout_handler(void)
>  		}
>  	} else {
>  		bootp_timeout *= 2;
> -		if (bootp_timeout > 2000)
> -			bootp_timeout = 2000;
> +		if (bootp_timeout > retransmit_period_max_ms)
> +			bootp_timeout = retransmit_period_max_ms;
>  		net_set_timeout_handler(bootp_timeout, bootp_timeout_handler);
>  		bootp_request();
>  	}
> @@ -714,10 +727,18 @@ static int bootp_extended(u8 *e)
>  
>  void bootp_reset(void)
>  {
> +	char *ep;  /* Environment pointer */
> +
>  	bootp_num_ids = 0;
>  	bootp_try = 0;
>  	bootp_start = get_timer(0);
> -	bootp_timeout = 250;
> +
> +	ep = env_get("bootpretransmitperiodinit");
> +	if (ep)
> +		bootp_timeout = dectoul(ep, NULL);
> +	else
> +		bootp_timeout = RETRANSMIT_PERIOD_INIT_MS;
> +
bootp_timeout = env_get_ulong("bootpretransmitperiodinit", 0, RETRANSMIT_PERIOD_INIT_MS);
does the same...

>  }
>  
>  void bootp_request(void)
> @@ -729,7 +750,6 @@ void bootp_request(void)
>  #ifdef CONFIG_BOOTP_RANDOM_DELAY
>  	ulong rand_ms;
>  #endif
> -	u32 bootp_id;
>  	struct in_addr zero_ip;
>  	struct in_addr bcast_ip;
>  	char *ep;  /* Environment pointer */
> @@ -745,6 +765,12 @@ void bootp_request(void)
>  	else
>  		time_taken_max = TIMEOUT_MS;
>  
> +	ep = env_get("bootpretransmitperiodmax");
> +	if (ep)
> +		retransmit_period_max_ms = dectoul(ep, NULL);
> +	else
> +		retransmit_period_max_ms = RETRANSMIT_PERIOD_MAX_MS;
> +
see above


Lothar Waßmann

  reply	other threads:[~2023-09-27  4:11 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-25 20:29 [PATCH 0/3] BOOTP/DHCPv4 enhancements seanedmond
2023-09-25 20:29 ` [PATCH 1/3] net: Get pxe config file from dhcp option 209 seanedmond
2023-09-25 20:29 ` [PATCH 2/3] net: bootp: BOOTP/DHCPv4 retransmission improvements seanedmond
2023-09-27  4:11   ` Lothar Waßmann [this message]
2023-10-03 18:15     ` Sean Edmond
2023-09-25 20:29 ` [PATCH 3/3] net: bootp: add config option BOOTP_RANDOM_XID seanedmond
2023-09-26 16:45 ` [PATCH 0/3] BOOTP/DHCPv4 enhancements Peter Robinson
2023-10-03 18:14   ` Sean Edmond

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230927061125.3f1702a0@karo-electronics.de \
    --to=lw@karo-electronics.de \
    --cc=joe.hershberger@ni.com \
    --cc=rfried.dev@gmail.com \
    --cc=seanedmond@linux.microsoft.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.