aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/dhcpc.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-12-12 17:13:54 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2021-12-12 17:13:54 +0100
commite67b80f4739c4075b51b0a575701b73928fe0bf1 (patch)
tree20c9163f50db185493b7fa7d6e778742c51a3b37 /networking/udhcp/dhcpc.c
parent9b678807198611308cfd8b10427f9e08c62f7bec (diff)
downloadbusybox-w32-e67b80f4739c4075b51b0a575701b73928fe0bf1.tar.gz
busybox-w32-e67b80f4739c4075b51b0a575701b73928fe0bf1.tar.bz2
busybox-w32-e67b80f4739c4075b51b0a575701b73928fe0bf1.zip
udhcpc6: fix udhcp_find_option to actually find DHCP6 options
udhcp_insert_new_option treats code for IPv6 as follows: new->data[D6_OPT_CODE] = code >> 8; new->data[D6_OPT_CODE + 1] = code & 0xff; udhcp_find_option tests the code as follows: while (opt_list && opt_list->data[OPT_CODE] < code) ... if (opt_list && opt_list->data[OPT_CODE] == code) So yes, OPT_CODE and D6_OPT_CODE are both 0, but the D6_OPT_CLIENTID = 1 value means that the 1 is in the seconds byte, and udhcp_find_option is only looking at the first byte, So the send_d6_release can never find it the created option. function old new delta udhcp_find_option 28 53 +25 attach_option 276 284 +8 udhcpc6_main 2602 2607 +5 perform_d6_release 262 267 +5 udhcpd_main 1518 1520 +2 udhcpc_main 2542 2544 +2 add_serverid_and_clientid_options 46 48 +2 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 7/0 up/down: 49/0) Total: 49 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/udhcp/dhcpc.c')
-rw-r--r--networking/udhcp/dhcpc.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 331f13a8c..c757fb37c 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -658,7 +658,7 @@ static void add_client_options(struct dhcp_packet *packet)
658 658
659 // This will be needed if we remove -V VENDOR_STR in favor of 659 // This will be needed if we remove -V VENDOR_STR in favor of
660 // -x vendor:VENDOR_STR 660 // -x vendor:VENDOR_STR
661 //if (!udhcp_find_option(packet.options, DHCP_VENDOR)) 661 //if (!udhcp_find_option(packet.options, DHCP_VENDOR, /*dhcpv6:*/ 0))
662 // /* not set, set the default vendor ID */ 662 // /* not set, set the default vendor ID */
663 // ...add (DHCP_VENDOR, "udhcp "BB_VER) opt... 663 // ...add (DHCP_VENDOR, "udhcp "BB_VER) opt...
664} 664}
@@ -676,7 +676,7 @@ static void add_serverid_and_clientid_options(struct dhcp_packet *packet, uint32
676 * If the client used a 'client identifier' when it obtained the lease, 676 * If the client used a 'client identifier' when it obtained the lease,
677 * it MUST use the same 'client identifier' in the DHCPRELEASE message. 677 * it MUST use the same 'client identifier' in the DHCPRELEASE message.
678 */ 678 */
679 ci = udhcp_find_option(client_data.options, DHCP_CLIENT_ID); 679 ci = udhcp_find_option(client_data.options, DHCP_CLIENT_ID, /*dhcpv6:*/ 0);
680 if (ci) 680 if (ci)
681 udhcp_add_binary_option(packet, ci->data); 681 udhcp_add_binary_option(packet, ci->data);
682} 682}
@@ -1328,7 +1328,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1328 } 1328 }
1329 1329
1330 clientid_mac_ptr = NULL; 1330 clientid_mac_ptr = NULL;
1331 if (!(opt & OPT_C) && !udhcp_find_option(client_data.options, DHCP_CLIENT_ID)) { 1331 if (!(opt & OPT_C) && !udhcp_find_option(client_data.options, DHCP_CLIENT_ID, /*dhcpv6:*/ 0)) {
1332 /* not suppressed and not set, create default client ID */ 1332 /* not suppressed and not set, create default client ID */
1333 clientid_mac_ptr = udhcp_insert_new_option( 1333 clientid_mac_ptr = udhcp_insert_new_option(
1334 &client_data.options, DHCP_CLIENT_ID, 1334 &client_data.options, DHCP_CLIENT_ID,