From e67b80f4739c4075b51b0a575701b73928fe0bf1 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 12 Dec 2021 17:13:54 +0100 Subject: 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 --- networking/udhcp/dhcpd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'networking/udhcp/dhcpd.c') diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c index 0f5edb7..66750e2 100644 --- a/networking/udhcp/dhcpd.c +++ b/networking/udhcp/dhcpd.c @@ -935,7 +935,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) bb_simple_info_msg("started, v"BB_VER); - option = udhcp_find_option(server_data.options, DHCP_LEASE_TIME); + option = udhcp_find_option(server_data.options, DHCP_LEASE_TIME, /*dhcpv6:*/ 0); server_data.max_lease_sec = DEFAULT_LEASE_TIME; if (option) { move_from_unaligned32(server_data.max_lease_sec, option->data + OPT_DATA); -- cgit v1.1