[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