net: bootp: add config option BOOTP_RANDOM_XID

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>
Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
Sean Edmond 2024-05-08 19:39:03 -07:00 committed by Tom Rini
parent e6bca3305b
commit 2111bd7e93
2 changed files with 24 additions and 14 deletions

View File

@ -1909,6 +1909,13 @@ config BOOTP_VCI_STRING
default "U-Boot.arm" if ARM default "U-Boot.arm" if ARM
default "U-Boot" default "U-Boot"
config BOOTP_RANDOM_XID
bool "Send random transaction ID to BOOTP/DHCP server"
depends on CMD_BOOTP && (LIB_RAND || LIB_HW_RAND)
help
Selecting this will allow for a random transaction ID to get
selected for each BOOTP/DHCPv4 exchange.
if CMD_DHCP6 if CMD_DHCP6
config DHCP6_PXE_CLIENTARCH config DHCP6_PXE_CLIENTARCH

View File

@ -834,22 +834,25 @@ void bootp_request(void)
/* Only generate a new transaction ID for each new BOOTP request */ /* Only generate a new transaction ID for each new BOOTP request */
if (bootp_try == 1) { if (bootp_try == 1) {
/* if (IS_ENABLED(CONFIG_BOOTP_RANDOM_XID)) {
* Bootp ID is the lower 4 bytes of our ethernet address srand(get_ticks() + rand());
* plus the current time in ms. bootp_id = rand();
*/ } else {
bootp_id = ((u32)net_ethaddr[2] << 24) /*
| ((u32)net_ethaddr[3] << 16) * Bootp ID is the lower 4 bytes of our ethernet address
| ((u32)net_ethaddr[4] << 8) * plus the current time in ms.
| (u32)net_ethaddr[5]; */
bootp_id += get_timer(0); bootp_id = ((u32)net_ethaddr[2] << 24)
bootp_id = htonl(bootp_id); | ((u32)net_ethaddr[3] << 16)
bootp_add_id(bootp_id); | ((u32)net_ethaddr[4] << 8)
net_copy_u32(&bp->bp_id, &bootp_id); | (u32)net_ethaddr[5];
} else { bootp_id += get_timer(0);
net_copy_u32(&bp->bp_id, &bootp_id); 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 * Calculate proper packet lengths taking into account the
* variable size of the options field * variable size of the options field