* [PATCH 1/3] net: Get pxe config file from dhcp option 209
2023-09-25 20:29 [PATCH 0/3] BOOTP/DHCPv4 enhancements seanedmond
@ 2023-09-25 20:29 ` seanedmond
2023-09-25 20:29 ` [PATCH 2/3] net: bootp: BOOTP/DHCPv4 retransmission improvements seanedmond
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: seanedmond @ 2023-09-25 20:29 UTC (permalink / raw)
To: u-boot; +Cc: joe.hershberger, rfried.dev
From: Sean Edmond <seanedmond@microsoft.com>
Allow dhcp server pass pxe config file full path by using option 209
Signed-off-by: Sean Edmond <seanedmond@microsoft.com>
---
cmd/Kconfig | 4 ++++
cmd/pxe.c | 10 ++++++++++
net/bootp.c | 21 +++++++++++++++++++++
3 files changed, 35 insertions(+)
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 43ca10f69c..25c1efc41e 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1817,6 +1817,10 @@ config BOOTP_PXE_CLIENTARCH
default 0x15 if ARM
default 0 if X86
+config BOOTP_PXE_DHCP_OPTION
+ bool "Request & store 'pxe_configfile' from BOOTP/DHCP server"
+ depends on BOOTP_PXE
+
config BOOTP_VCI_STRING
string
depends on CMD_BOOTP
diff --git a/cmd/pxe.c b/cmd/pxe.c
index 677142520b..83c4ed5411 100644
--- a/cmd/pxe.c
+++ b/cmd/pxe.c
@@ -65,6 +65,8 @@ static int pxe_dhcp_option_path(struct pxe_context *ctx, unsigned long pxefile_a
int ret = get_pxe_file(ctx, pxelinux_configfile, pxefile_addr_r);
free(pxelinux_configfile);
+ /* set to NULL to avoid double-free if DHCP is tried again */
+ pxelinux_configfile = NULL;
return ret;
}
@@ -141,6 +143,14 @@ int pxe_get(ulong pxefile_addr_r, char **bootdirp, ulong *sizep, bool use_ipv6)
env_get("bootfile"), use_ipv6))
return -ENOMEM;
+ if (IS_ENABLED(CONFIG_BOOTP_PXE_DHCP_OPTION) &&
+ pxelinux_configfile && !use_ipv6) {
+ if (pxe_dhcp_option_path(&ctx, pxefile_addr_r) > 0)
+ goto done;
+
+ goto error_exit;
+ }
+
if (IS_ENABLED(CONFIG_DHCP6_PXE_DHCP_OPTION) &&
pxelinux_configfile && use_ipv6) {
if (pxe_dhcp_option_path(&ctx, pxefile_addr_r) > 0)
diff --git a/net/bootp.c b/net/bootp.c
index 8b1a4ae2ef..013d54c7ed 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -26,6 +26,7 @@
#ifdef CONFIG_BOOTP_RANDOM_DELAY
#include "net_rand.h"
#endif
+#include <malloc.h>
#define BOOTP_VENDOR_MAGIC 0x63825363 /* RFC1048 Magic Cookie */
@@ -604,6 +605,10 @@ static int dhcp_extended(u8 *e, int message_type, struct in_addr server_ip,
*e++ = 42;
*cnt += 1;
#endif
+ if (IS_ENABLED(CONFIG_BOOTP_PXE_DHCP_OPTION)) {
+ *e++ = 209; /* PXELINUX Config File */
+ *cnt += 1;
+ }
/* no options, so back up to avoid sending an empty request list */
if (*cnt == 0)
e -= 2;
@@ -912,6 +917,22 @@ static void dhcp_process_options(uchar *popt, uchar *end)
net_boot_file_name[size] = 0;
}
break;
+ case 209: /* PXELINUX Config File */
+ if (IS_ENABLED(CONFIG_BOOTP_PXE_DHCP_OPTION)) {
+ /* In case it has already been allocated when get DHCP Offer packet,
+ * free first to avoid memory leak.
+ */
+ if (pxelinux_configfile)
+ free(pxelinux_configfile);
+
+ pxelinux_configfile = (char *)malloc((oplen + 1) * sizeof(char));
+
+ if (pxelinux_configfile)
+ strlcpy(pxelinux_configfile, popt + 2, oplen + 1);
+ else
+ printf("Error: Failed to allocate pxelinux_configfile\n");
+ }
+ break;
default:
#if defined(CONFIG_BOOTP_VENDOREX)
if (dhcp_vendorex_proc(popt))
--
2.40.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH 2/3] net: bootp: BOOTP/DHCPv4 retransmission improvements
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 ` seanedmond
2023-09-27 4:11 ` Lothar Waßmann
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
3 siblings, 1 reply; 8+ messages in thread
From: seanedmond @ 2023-09-25 20:29 UTC (permalink / raw)
To: u-boot; +Cc: joe.hershberger, rfried.dev
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;
+
}
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;
+
#ifdef CONFIG_BOOTP_RANDOM_DELAY /* Random BOOTP delay */
if (bootp_try == 0)
srand_mac();
@@ -804,18 +830,23 @@ void bootp_request(void)
extlen = bootp_extended((u8 *)bp->bp_vend);
#endif
- /*
- * Bootp ID is the lower 4 bytes of our ethernet address
- * plus the current time in ms.
- */
- bootp_id = ((u32)net_ethaddr[2] << 24)
- | ((u32)net_ethaddr[3] << 16)
- | ((u32)net_ethaddr[4] << 8)
- | (u32)net_ethaddr[5];
- bootp_id += get_timer(0);
- bootp_id = htonl(bootp_id);
- bootp_add_id(bootp_id);
- net_copy_u32(&bp->bp_id, &bootp_id);
+ /* Only generate a new transaction ID for each new BOOTP request */
+ if (bootp_try == 1) {
+ /*
+ * Bootp ID is the lower 4 bytes of our ethernet address
+ * plus the current time in ms.
+ */
+ bootp_id = ((u32)net_ethaddr[2] << 24)
+ | ((u32)net_ethaddr[3] << 16)
+ | ((u32)net_ethaddr[4] << 8)
+ | (u32)net_ethaddr[5];
+ bootp_id += get_timer(0);
+ bootp_id = htonl(bootp_id);
+ bootp_add_id(bootp_id);
+ net_copy_u32(&bp->bp_id, &bootp_id);
+ } else {
+ net_copy_u32(&bp->bp_id, &bootp_id);
+ }
/*
* Calculate proper packet lengths taking into account the
--
2.40.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH 2/3] net: bootp: BOOTP/DHCPv4 retransmission improvements
2023-09-25 20:29 ` [PATCH 2/3] net: bootp: BOOTP/DHCPv4 retransmission improvements seanedmond
@ 2023-09-27 4:11 ` Lothar Waßmann
2023-10-03 18:15 ` Sean Edmond
0 siblings, 1 reply; 8+ messages in thread
From: Lothar Waßmann @ 2023-09-27 4:11 UTC (permalink / raw)
To: seanedmond; +Cc: u-boot, joe.hershberger, rfried.dev
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
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH 2/3] net: bootp: BOOTP/DHCPv4 retransmission improvements
2023-09-27 4:11 ` Lothar Waßmann
@ 2023-10-03 18:15 ` Sean Edmond
0 siblings, 0 replies; 8+ messages in thread
From: Sean Edmond @ 2023-10-03 18:15 UTC (permalink / raw)
To: Lothar Waßmann; +Cc: u-boot, joe.hershberger, rfried.dev
On 2023-09-26 9:11 p.m., Lothar Waßmann wrote:
> 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...
Thanks for the suggestion, will fix in v2.
>> }
>>
>> 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
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/3] net: bootp: add config option BOOTP_RANDOM_XID
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-25 20:29 ` seanedmond
2023-09-26 16:45 ` [PATCH 0/3] BOOTP/DHCPv4 enhancements Peter Robinson
3 siblings, 0 replies; 8+ messages in thread
From: seanedmond @ 2023-09-25 20:29 UTC (permalink / raw)
To: u-boot; +Cc: joe.hershberger, rfried.dev
From: Sean Edmond <seanedmond@microsoft.com>
The new config option BOOTP_RANDOM_XID will randomize the transaction ID
for each new BOOT/DHCPv4 exchange.
Signed-off-by: Sean Edmond <seanedmond@microsoft.com>
---
cmd/Kconfig | 7 +++++++
net/bootp.c | 31 +++++++++++++++++--------------
2 files changed, 24 insertions(+), 14 deletions(-)
diff --git a/cmd/Kconfig b/cmd/Kconfig
index 25c1efc41e..4be5be8724 100644
--- a/cmd/Kconfig
+++ b/cmd/Kconfig
@@ -1829,6 +1829,13 @@ config BOOTP_VCI_STRING
default "U-Boot.arm" if ARM
default "U-Boot"
+config BOOTP_RANDOM_XID
+ bool "Send random transaction ID to BOOTP/DHCP server"
+ depends on CMD_BOOTP
+ help
+ Selecting this will allow for a random transaction ID to get
+ selected for each BOOTP/DHCPv4 exchange.
+
if CMD_DHCP6
config DHCP6_PXE_CLIENTARCH
diff --git a/net/bootp.c b/net/bootp.c
index 7248536cc4..5053a1b870 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -832,22 +832,25 @@ void bootp_request(void)
/* Only generate a new transaction ID for each new BOOTP request */
if (bootp_try == 1) {
- /*
- * Bootp ID is the lower 4 bytes of our ethernet address
- * plus the current time in ms.
- */
- bootp_id = ((u32)net_ethaddr[2] << 24)
- | ((u32)net_ethaddr[3] << 16)
- | ((u32)net_ethaddr[4] << 8)
- | (u32)net_ethaddr[5];
- bootp_id += get_timer(0);
- bootp_id = htonl(bootp_id);
- bootp_add_id(bootp_id);
- net_copy_u32(&bp->bp_id, &bootp_id);
- } else {
- net_copy_u32(&bp->bp_id, &bootp_id);
+ if (IS_ENABLED(CONFIG_BOOTP_RANDOM_XID)) {
+ srand(get_ticks() + rand());
+ bootp_id = rand();
+ } else {
+ /*
+ * Bootp ID is the lower 4 bytes of our ethernet address
+ * plus the current time in ms.
+ */
+ bootp_id = ((u32)net_ethaddr[2] << 24)
+ | ((u32)net_ethaddr[3] << 16)
+ | ((u32)net_ethaddr[4] << 8)
+ | (u32)net_ethaddr[5];
+ bootp_id += get_timer(0);
+ bootp_id = htonl(bootp_id);
+ }
}
+ bootp_add_id(bootp_id);
+ net_copy_u32(&bp->bp_id, &bootp_id);
/*
* Calculate proper packet lengths taking into account the
* variable size of the options field
--
2.40.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH 0/3] BOOTP/DHCPv4 enhancements
2023-09-25 20:29 [PATCH 0/3] BOOTP/DHCPv4 enhancements seanedmond
` (2 preceding siblings ...)
2023-09-25 20:29 ` [PATCH 3/3] net: bootp: add config option BOOTP_RANDOM_XID seanedmond
@ 2023-09-26 16:45 ` Peter Robinson
2023-10-03 18:14 ` Sean Edmond
3 siblings, 1 reply; 8+ messages in thread
From: Peter Robinson @ 2023-09-26 16:45 UTC (permalink / raw)
To: seanedmond; +Cc: u-boot, joe.hershberger, rfried.dev
Hi Sean,
> In our datacenter application, a single DHCP server is servicing 36000+ clients.
> Improvements are required to the DHCPv4 retransmission behavior to align with
> RFC and ensure less pressure is exerted on the server:
> - retransmission backoff interval maximum is configurable
> (environment variable bootpretransmitperiodmax)
> - initial retransmission backoff interval is configurable
> (environment variable bootpretransmitperiodinit)
> - transaction ID is kept the same for each BOOTP/DHCPv4 request
> (not recreated on each retry)
Might be also worth looking at the series adding LWIP support [1] and
see what impact that may have on this too.
Peter
[1] https://lists.denx.de/pipermail/u-boot/2023-September/531716.html
> For our application we'll use:
> - bootpretransmitperiodmax=16000
> - bootpretransmitperiodinit=2000
>
> A new configuration BOOTP_RANDOM_XID has been added to enable a randomized
> BOOTP/DHCPv4 transaction ID.
>
> Add functionality for DHCPv4 sending/parsing option 209 (PXE config file).
> Enabled with Kconfig BOOTP_PXE_DHCP_OPTION. Note, this patch was
> submitted previously but this latest version has been enhanced to
> avoid a possible double free().
>
> Sean Edmond (3):
> net: Get pxe config file from dhcp option 209
> net: bootp: BOOTP/DHCPv4 retransmission improvements
> net: bootp: add config option BOOTP_RANDOM_XID
>
> cmd/Kconfig | 11 +++++++
> cmd/pxe.c | 10 +++++++
> net/bootp.c | 85 +++++++++++++++++++++++++++++++++++++++++++----------
> 3 files changed, 91 insertions(+), 15 deletions(-)
>
> --
> 2.40.0
>
^ permalink raw reply [flat|nested] 8+ messages in thread* Re: [PATCH 0/3] BOOTP/DHCPv4 enhancements
2023-09-26 16:45 ` [PATCH 0/3] BOOTP/DHCPv4 enhancements Peter Robinson
@ 2023-10-03 18:14 ` Sean Edmond
0 siblings, 0 replies; 8+ messages in thread
From: Sean Edmond @ 2023-10-03 18:14 UTC (permalink / raw)
To: Peter Robinson; +Cc: u-boot, joe.hershberger, rfried.dev
On 2023-09-26 9:45 a.m., Peter Robinson wrote:
> Hi Sean,
>
>> In our datacenter application, a single DHCP server is servicing 36000+ clients.
>> Improvements are required to the DHCPv4 retransmission behavior to align with
>> RFC and ensure less pressure is exerted on the server:
>> - retransmission backoff interval maximum is configurable
>> (environment variable bootpretransmitperiodmax)
>> - initial retransmission backoff interval is configurable
>> (environment variable bootpretransmitperiodinit)
>> - transaction ID is kept the same for each BOOTP/DHCPv4 request
>> (not recreated on each retry)
> Might be also worth looking at the series adding LWIP support [1] and
> see what impact that may have on this too.
>
> Peter
>
> [1]https://lists.denx.de/pipermail/u-boot/2023-September/531716.html
I'm aware of the LWIP addition but haven't made any attempt to
characterize the retransmission behavior.
My understanding is that LWIP doesn't support DHCPv6 or TFTP with IPv6
yet. Our preference would be to stick with the u-boot networking stack
for now until LWIP adds full support for IPv6.
Given the importance of the retransmission behavior is for our use-case
(36000+ clients pers server), we would have to qualify/validate LWIP
before transitioning.
>> For our application we'll use:
>> - bootpretransmitperiodmax=16000
>> - bootpretransmitperiodinit=2000
>>
>> A new configuration BOOTP_RANDOM_XID has been added to enable a randomized
>> BOOTP/DHCPv4 transaction ID.
>>
>> Add functionality for DHCPv4 sending/parsing option 209 (PXE config file).
>> Enabled with Kconfig BOOTP_PXE_DHCP_OPTION. Note, this patch was
>> submitted previously but this latest version has been enhanced to
>> avoid a possible double free().
>>
>> Sean Edmond (3):
>> net: Get pxe config file from dhcp option 209
>> net: bootp: BOOTP/DHCPv4 retransmission improvements
>> net: bootp: add config option BOOTP_RANDOM_XID
>>
>> cmd/Kconfig | 11 +++++++
>> cmd/pxe.c | 10 +++++++
>> net/bootp.c | 85 +++++++++++++++++++++++++++++++++++++++++++----------
>> 3 files changed, 91 insertions(+), 15 deletions(-)
>>
>> --
>> 2.40.0
>>
^ permalink raw reply [flat|nested] 8+ messages in thread