[PATCH v2 3/3] net: bootp: add config option BOOTP_RANDOM_XID
Heinrich Schuchardt
xypron.glpk at gmx.de
Tue Oct 24 08:19:19 CEST 2023
On 10/24/23 02:21, seanedmond at linux.microsoft.com wrote:
> From: Sean Edmond <seanedmond at 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 at 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 adbb1a6187..910f465d14 100644
> --- a/cmd/Kconfig
> +++ b/cmd/Kconfig
> @@ -1838,6 +1838,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
The rand() function requires CONFIG_LIB_RAND=y or
CONFIG_EXYNOS_ACE_SHA=y or CONFIG_RNG_NPCM=y.
Best regards
Heinrich
> + 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 bab17a9ceb..f1ca2efacf 100644
> --- a/net/bootp.c
> +++ b/net/bootp.c
> @@ -822,22 +822,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
More information about the U-Boot
mailing list