diff options
author | Denys Vlasenko | 2021-12-12 17:13:54 +0100 |
---|---|---|
committer | Denys Vlasenko | 2021-12-12 17:13:54 +0100 |
commit | e67b80f4739c4075b51b0a575701b73928fe0bf1 (patch) | |
tree | 20c9163f50db185493b7fa7d6e778742c51a3b37 /networking/udhcp/common.h | |
parent | 9b678807198611308cfd8b10427f9e08c62f7bec (diff) | |
download | busybox-e67b80f4739c4075b51b0a575701b73928fe0bf1.zip busybox-e67b80f4739c4075b51b0a575701b73928fe0bf1.tar.gz |
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/common.h')
-rw-r--r-- | networking/udhcp/common.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h index e374771..5882238 100644 --- a/networking/udhcp/common.h +++ b/networking/udhcp/common.h @@ -245,7 +245,11 @@ void udhcp_add_simple_option(struct dhcp_packet *packet, uint8_t code, uint32_t char *dname_dec(const uint8_t *cstr, int clen, const char *pre) FAST_FUNC; uint8_t *dname_enc(/*const uint8_t *cstr, int clen,*/ const char *src, int *retlen) FAST_FUNC; #endif -struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code) FAST_FUNC; +#if !ENABLE_UDHCPC6 +#define udhcp_find_option(opt_list, code, dhcpv6) \ + udhcp_find_option(opt_list, code) +#endif +struct option_set *udhcp_find_option(struct option_set *opt_list, uint8_t code, bool dhcpv6) FAST_FUNC; // RFC 2131 Table 5: Fields and options used by DHCP clients // |