diff options
author | Denys Vlasenko | 2021-06-02 13:50:26 +0200 |
---|---|---|
committer | Denys Vlasenko | 2021-06-02 14:07:26 +0200 |
commit | 265fcddd08f22c99a2a419a1537c18f4d6d43e9f (patch) | |
tree | e1cfb7a18bb0887b95700a7417f88ff90883bfa3 /networking/udhcp/d6_dhcpc.c | |
parent | 9659a8db1dd28bdf8659fdae5d097b6f48bd2736 (diff) | |
download | busybox-265fcddd08f22c99a2a419a1537c18f4d6d43e9f.zip busybox-265fcddd08f22c99a2a419a1537c18f4d6d43e9f.tar.gz |
udhcpc: include client-id option in DECLINEs, even if it's a custom -x 61:HEX option
client_data.vendorclass, .hostname and .fqdn probably need the same treatment:
just insert them into the list of -x opts, get rid of
if (client_data.vendorclass)
udhcp_add_binary_option(packet, client_data.vendorclass);
if (client_data.hostname)
udhcp_add_binary_option(packet, client_data.hostname);
if (client_data.fqdn)
udhcp_add_binary_option(packet, client_data.fqdn);
function old new delta
udhcp_insert_new_option - 166 +166
perform_release 171 207 +36
perform_d6_release 227 259 +32
udhcpc6_main 2558 2580 +22
init_d6_packet 103 84 -19
udhcpc_main 2585 2564 -21
attach_option 397 253 -144
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 3/3 up/down: 256/-184) Total: 72 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/udhcp/d6_dhcpc.c')
-rw-r--r-- | networking/udhcp/d6_dhcpc.c | 58 |
1 files changed, 30 insertions, 28 deletions
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c index 5bca4a8..c4bedb2 100644 --- a/networking/udhcp/d6_dhcpc.c +++ b/networking/udhcp/d6_dhcpc.c @@ -482,7 +482,6 @@ static ALWAYS_INLINE uint32_t random_xid(void) static uint8_t *init_d6_packet(struct d6_packet *packet, char type, uint32_t xid) { uint8_t *ptr; - struct d6_option *clientid; unsigned secs; memset(packet, 0, sizeof(*packet)); @@ -503,9 +502,7 @@ static uint8_t *init_d6_packet(struct d6_packet *packet, char type, uint32_t xid *((uint16_t*)ptr) = (secs < 0xffff) ? htons(secs) : 0xffff; ptr += 2; - /* add CLIENTID option */ - clientid = (void*)client_data.clientid; - return mempcpy(ptr, clientid, clientid->len + 2+2); + return ptr; } static uint8_t *add_d6_client_options(uint8_t *ptr) @@ -593,10 +590,10 @@ static NOINLINE int send_d6_info_request(uint32_t xid) struct d6_packet packet; uint8_t *opt_ptr; - /* Fill in: msg type, client id */ + /* Fill in: msg type */ opt_ptr = init_d6_packet(&packet, D6_MSG_INFORMATION_REQUEST, xid); - /* Add options: + /* Add options: client-id, * "param req" option according to -O, options specified with -x */ opt_ptr = add_d6_client_options(opt_ptr); @@ -693,7 +690,7 @@ static NOINLINE int send_d6_discover(uint32_t xid, struct in6_addr *requested_ip uint8_t *opt_ptr; unsigned len; - /* Fill in: msg type, client id */ + /* Fill in: msg type */ opt_ptr = init_d6_packet(&packet, D6_MSG_SOLICIT, xid); /* Create new IA_NA, optionally with included IAADDR with requested IP */ @@ -726,7 +723,7 @@ static NOINLINE int send_d6_discover(uint32_t xid, struct in6_addr *requested_ip opt_ptr = mempcpy(opt_ptr, client6_data.ia_pd, len); } - /* Add options: + /* Add options: client-id, * "param req" option according to -O, options specified with -x */ opt_ptr = add_d6_client_options(opt_ptr); @@ -771,7 +768,7 @@ static NOINLINE int send_d6_select(uint32_t xid) struct d6_packet packet; uint8_t *opt_ptr; - /* Fill in: msg type, client id */ + /* Fill in: msg type */ opt_ptr = init_d6_packet(&packet, D6_MSG_REQUEST, xid); /* server id */ @@ -783,7 +780,7 @@ static NOINLINE int send_d6_select(uint32_t xid) if (client6_data.ia_pd) opt_ptr = mempcpy(opt_ptr, client6_data.ia_pd, client6_data.ia_pd->len + 2+2); - /* Add options: + /* Add options: client-id, * "param req" option according to -O, options specified with -x */ opt_ptr = add_d6_client_options(opt_ptr); @@ -844,7 +841,7 @@ static NOINLINE int send_d6_renew(uint32_t xid, struct in6_addr *server_ipv6, st struct d6_packet packet; uint8_t *opt_ptr; - /* Fill in: msg type, client id */ + /* Fill in: msg type */ opt_ptr = init_d6_packet(&packet, DHCPREQUEST, xid); /* server id */ @@ -856,7 +853,7 @@ static NOINLINE int send_d6_renew(uint32_t xid, struct in6_addr *server_ipv6, st if (client6_data.ia_pd) opt_ptr = mempcpy(opt_ptr, client6_data.ia_pd, client6_data.ia_pd->len + 2+2); - /* Add options: + /* Add options: client-id, * "param req" option according to -O, options specified with -x */ opt_ptr = add_d6_client_options(opt_ptr); @@ -878,6 +875,7 @@ int send_d6_release(struct in6_addr *server_ipv6, struct in6_addr *our_cur_ipv6) { struct d6_packet packet; uint8_t *opt_ptr; + struct option_set *ci; /* Fill in: msg type, client id */ opt_ptr = init_d6_packet(&packet, D6_MSG_RELEASE, random_xid()); @@ -889,6 +887,10 @@ int send_d6_release(struct in6_addr *server_ipv6, struct in6_addr *our_cur_ipv6) /* IA PD */ if (client6_data.ia_pd) opt_ptr = mempcpy(opt_ptr, client6_data.ia_pd, client6_data.ia_pd->len + 2+2); + /* Client-id */ + ci = udhcp_find_option(client_data.options, D6_OPT_CLIENTID); + if (ci) + opt_ptr = mempcpy(opt_ptr, ci->data, D6_OPT_DATA + 2+2 + 6); bb_info_msg("sending %s", "release"); return d6_send_kernel_packet_from_client_data_ifindex( @@ -1184,7 +1186,7 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) { const char *str_r; IF_FEATURE_UDHCP_PORT(char *str_P;) - void *clientid_mac_ptr; + uint8_t *clientid_mac_ptr; llist_t *list_O = NULL; llist_t *list_x = NULL; int tryagain_timeout = 20; @@ -1284,22 +1286,19 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) if (d6_read_interface(client_data.interface, &client_data.ifindex, &client6_data.ll_ip6, - client_data.client_mac) + client_data_client_mac) ) { return 1; } - /* Create client ID based on mac, set clientid_mac_ptr */ - { - struct d6_option *clientid; - clientid = xzalloc(2+2+2+2+6); - clientid->code = D6_OPT_CLIENTID; - clientid->len = 2+2+6; - clientid->data[1] = 3; /* DUID-LL */ - clientid->data[3] = 1; /* ethernet */ - clientid_mac_ptr = clientid->data + 2+2; - memcpy(clientid_mac_ptr, client_data.client_mac, 6); - client_data.clientid = (void*)clientid; + clientid_mac_ptr = NULL; + if (!udhcp_find_option(client_data.options, D6_OPT_CLIENTID)) { + /* not set, set the default client ID */ + client_data.clientid[1] = 3; /* DUID-LL */ + client_data.clientid[3] = 1; /* ethernet */ + clientid_mac_ptr = udhcp_insert_new_option(&client_data.options, D6_OPT_CLIENTID, + client_data.clientid, 2+2 + 6, /*dhcp6:*/ 1); + clientid_mac_ptr += 2+2 + 2+2; /* skip option code, len, DUID-LL, ethernet */ } #if !BB_MMU @@ -1386,12 +1385,13 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) if (d6_read_interface(client_data.interface, &client_data.ifindex, &client6_data.ll_ip6, - client_data.client_mac) + client_data_client_mac) ) { goto ret0; /* iface is gone? */ } - memcpy(clientid_mac_ptr, client_data.client_mac, 6); + if (clientid_mac_ptr) + memcpy(clientid_mac_ptr, client_data_client_mac, 6); switch (client_data.state) { case INIT_SELECTING: @@ -1505,7 +1505,9 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv) continue; /* case RELEASED: */ } - /* yah, I know, *you* say it would never happen */ + /* RELEASED state (when we got SIGUSR2) ends up here. + * (wait for SIGUSR1 to re-init, or for TERM, etc) + */ timeout = INT_MAX; continue; /* back to main loop */ } /* if poll timed out */ |