diff options
author | Sean Edmond <seanedmond@microsoft.com> | 2024-05-08 19:39:03 -0700 |
---|---|---|
committer | Tom Rini <trini@konsulko.com> | 2025-05-23 11:28:51 -0600 |
commit | 2111bd7e93a3044f0590c942a41f2667d15d923d (patch) | |
tree | 4511c669fb98692f4946ea17fe6a533c470db5b0 | |
parent | e6bca3305bbc333cc71e5bf1ee483bbacfa84736 (diff) |
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>
-rw-r--r-- | cmd/Kconfig | 7 | ||||
-rw-r--r-- | net/bootp.c | 31 |
2 files changed, 24 insertions, 14 deletions
diff --git a/cmd/Kconfig b/cmd/Kconfig index 54c4ab8570c..82f6a089586 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -1909,6 +1909,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 && (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 config DHCP6_PXE_CLIENTARCH diff --git a/net/bootp.c b/net/bootp.c index c34ffe27854..285fcba7348 100644 --- a/net/bootp.c +++ b/net/bootp.c @@ -834,22 +834,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 |