aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-06-02 15:51:50 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2021-06-02 15:51:50 +0200
commit949e9621d10faada3bb55a4aa206df44e7d39ae8 (patch)
tree63778eac77dc9b9fb6f30410a581d87f7ae2b707
parent698cdef538f51bb85b68d591b1e42eb6b04d891c (diff)
downloadbusybox-w32-949e9621d10faada3bb55a4aa206df44e7d39ae8.tar.gz
busybox-w32-949e9621d10faada3bb55a4aa206df44e7d39ae8.tar.bz2
busybox-w32-949e9621d10faada3bb55a4aa206df44e7d39ae8.zip
udhcpc: get rid of client_data.fqdn field
function old new delta attach_option 253 276 +23 udhcpc_main 2582 2588 +6 udhcpc6_main 2579 2571 -8 add_client_options 175 158 -17 udhcp_insert_new_option 169 138 -31 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 2/3 up/down: 29/-56) Total: -27 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/udhcp/common.c13
-rw-r--r--networking/udhcp/common.h5
-rw-r--r--networking/udhcp/d6_dhcpc.c40
-rw-r--r--networking/udhcp/dhcpc.c71
-rw-r--r--networking/udhcp/dhcpc.h4
5 files changed, 57 insertions, 76 deletions
diff --git a/networking/udhcp/common.c b/networking/udhcp/common.c
index 7929950f5..b325c4112 100644
--- a/networking/udhcp/common.c
+++ b/networking/udhcp/common.c
@@ -424,7 +424,6 @@ int FAST_FUNC udhcp_str2nip(const char *str, void *arg)
424void* FAST_FUNC udhcp_insert_new_option( 424void* FAST_FUNC udhcp_insert_new_option(
425 struct option_set **opt_list, 425 struct option_set **opt_list,
426 unsigned code, 426 unsigned code,
427 const void *buffer,
428 unsigned length, 427 unsigned length,
429 bool dhcpv6) 428 bool dhcpv6)
430{ 429{
@@ -434,17 +433,15 @@ void* FAST_FUNC udhcp_insert_new_option(
434 log2("attaching option %02x to list", code); 433 log2("attaching option %02x to list", code);
435 new = xmalloc(sizeof(*new)); 434 new = xmalloc(sizeof(*new));
436 if (!dhcpv6) { 435 if (!dhcpv6) {
437 new->data = xmalloc(length + OPT_DATA); 436 new->data = xzalloc(length + OPT_DATA);
438 new->data[OPT_CODE] = code; 437 new->data[OPT_CODE] = code;
439 new->data[OPT_LEN] = length; 438 new->data[OPT_LEN] = length;
440 memcpy(new->data + OPT_DATA, buffer, length);
441 } else { 439 } else {
442 new->data = xmalloc(length + D6_OPT_DATA); 440 new->data = xzalloc(length + D6_OPT_DATA);
443 new->data[D6_OPT_CODE] = code >> 8; 441 new->data[D6_OPT_CODE] = code >> 8;
444 new->data[D6_OPT_CODE + 1] = code & 0xff; 442 new->data[D6_OPT_CODE + 1] = code & 0xff;
445 new->data[D6_OPT_LEN] = length >> 8; 443 new->data[D6_OPT_LEN] = length >> 8;
446 new->data[D6_OPT_LEN + 1] = length & 0xff; 444 new->data[D6_OPT_LEN + 1] = length & 0xff;
447 memcpy(new->data + D6_OPT_DATA, buffer, length);
448 } 445 }
449 446
450 curr = opt_list; 447 curr = opt_list;
@@ -498,7 +495,11 @@ static NOINLINE void attach_option(
498 existing = udhcp_find_option(*opt_list, optflag->code); 495 existing = udhcp_find_option(*opt_list, optflag->code);
499 if (!existing) { 496 if (!existing) {
500 /* make a new option */ 497 /* make a new option */
501 udhcp_insert_new_option(opt_list, optflag->code, buffer, length, dhcpv6); 498 uint8_t *p = udhcp_insert_new_option(opt_list, optflag->code, length, dhcpv6);
499 if (!dhcpv6)
500 memcpy(p + OPT_DATA, buffer, length);
501 else
502 memcpy(p + D6_OPT_DATA, buffer, length);
502 goto ret; 503 goto ret;
503 } 504 }
504 505
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h
index e5af62874..48a23792a 100644
--- a/networking/udhcp/common.h
+++ b/networking/udhcp/common.h
@@ -321,12 +321,11 @@ void udhcp_dump_packet(struct dhcp_packet *packet) FAST_FUNC;
321int FAST_FUNC udhcp_str2nip(const char *str, void *arg); 321int FAST_FUNC udhcp_str2nip(const char *str, void *arg);
322 322
323#if !ENABLE_UDHCPC6 323#if !ENABLE_UDHCPC6
324#define udhcp_insert_new_option(opt_list, code, buffer, length, dhcpv6) \ 324#define udhcp_insert_new_option(opt_list, code, length, dhcpv6) \
325 udhcp_insert_new_option(opt_list, code, buffer, length) 325 udhcp_insert_new_option(opt_list, code, length)
326#endif 326#endif
327void* FAST_FUNC udhcp_insert_new_option(struct option_set **opt_list, 327void* FAST_FUNC udhcp_insert_new_option(struct option_set **opt_list,
328 unsigned code, 328 unsigned code,
329 const void *buffer,
330 unsigned length, 329 unsigned length,
331 bool dhcpv6); 330 bool dhcpv6);
332 331
diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c
index 3fd1fa7ce..c68dc8c4f 100644
--- a/networking/udhcp/d6_dhcpc.c
+++ b/networking/udhcp/d6_dhcpc.c
@@ -1111,17 +1111,6 @@ static void perform_d6_release(struct in6_addr *server_ipv6, struct in6_addr *ou
1111 client_data.state = RELEASED; 1111 client_data.state = RELEASED;
1112} 1112}
1113 1113
1114///static uint8_t* alloc_dhcp_option(int code, const char *str, int extra)
1115///{
1116/// uint8_t *storage;
1117/// int len = strnlen(str, 255);
1118/// storage = xzalloc(len + extra + OPT_DATA);
1119/// storage[OPT_CODE] = code;
1120/// storage[OPT_LEN] = len + extra;
1121/// memcpy(storage + extra + OPT_DATA, str, len);
1122/// return storage;
1123///}
1124
1125#if BB_MMU 1114#if BB_MMU
1126static void client_background(void) 1115static void client_background(void)
1127{ 1116{
@@ -1283,23 +1272,24 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
1283 free(optstr); 1272 free(optstr);
1284 } 1273 }
1285 1274
1286 if (d6_read_interface(client_data.interface,
1287 &client_data.ifindex,
1288 &client6_data.ll_ip6,
1289 client_data_client_mac)
1290 ) {
1291 return 1;
1292 }
1293
1294 clientid_mac_ptr = NULL; 1275 clientid_mac_ptr = NULL;
1295 if (!udhcp_find_option(client_data.options, D6_OPT_CLIENTID)) { 1276 if (!udhcp_find_option(client_data.options, D6_OPT_CLIENTID)) {
1296 /* not set, set the default client ID */ 1277 /* not set, set the default client ID */
1297 client_data.clientid[1] = 3; /* DUID-LL */
1298 client_data.clientid[3] = 1; /* ethernet */
1299 clientid_mac_ptr = udhcp_insert_new_option( 1278 clientid_mac_ptr = udhcp_insert_new_option(
1300 &client_data.options, D6_OPT_CLIENTID, 1279 &client_data.options, D6_OPT_CLIENTID,
1301 client_data.clientid, 2+2 + 6, /*dhcp6:*/ 1); 1280 2+2 + 6, /*dhcp6:*/ 1);
1302 clientid_mac_ptr += 2+2 + 2+2; /* skip option code, len, DUID-LL, ethernet */ 1281 clientid_mac_ptr += 2+2; /* skip option code, len */
1282 clientid_mac_ptr[1] = 3; /* DUID-LL */
1283 clientid_mac_ptr[3] = 1; /* type: ethernet */
1284 clientid_mac_ptr += 2+2; /* skip DUID-LL, ethernet */
1285 }
1286
1287 if (d6_read_interface(client_data.interface,
1288 &client_data.ifindex,
1289 &client6_data.ll_ip6,
1290 client_data.client_mac)
1291 ) {
1292 return 1;
1303 } 1293 }
1304 1294
1305#if !BB_MMU 1295#if !BB_MMU
@@ -1386,13 +1376,13 @@ int udhcpc6_main(int argc UNUSED_PARAM, char **argv)
1386 if (d6_read_interface(client_data.interface, 1376 if (d6_read_interface(client_data.interface,
1387 &client_data.ifindex, 1377 &client_data.ifindex,
1388 &client6_data.ll_ip6, 1378 &client6_data.ll_ip6,
1389 client_data_client_mac) 1379 client_data.client_mac)
1390 ) { 1380 ) {
1391 goto ret0; /* iface is gone? */ 1381 goto ret0; /* iface is gone? */
1392 } 1382 }
1393 1383
1394 if (clientid_mac_ptr) 1384 if (clientid_mac_ptr)
1395 memcpy(clientid_mac_ptr, client_data_client_mac, 6); 1385 memcpy(clientid_mac_ptr, client_data.client_mac, 6);
1396 1386
1397 switch (client_data.state) { 1387 switch (client_data.state) {
1398 case INIT_SELECTING: 1388 case INIT_SELECTING:
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 16228f048..ab669d2b5 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -609,7 +609,7 @@ static void init_packet(struct dhcp_packet *packet, char type)
609 secs = client_data.last_secs - client_data.first_secs; 609 secs = client_data.last_secs - client_data.first_secs;
610 packet->secs = (secs < 0xffff) ? htons(secs) : 0xffff; 610 packet->secs = (secs < 0xffff) ? htons(secs) : 0xffff;
611 611
612 memcpy(packet->chaddr, client_data_client_mac, 6); 612 memcpy(packet->chaddr, client_data.client_mac, 6);
613} 613}
614 614
615static void add_client_options(struct dhcp_packet *packet) 615static void add_client_options(struct dhcp_packet *packet)
@@ -635,9 +635,6 @@ static void add_client_options(struct dhcp_packet *packet)
635 packet->options[end + OPT_DATA + len] = DHCP_END; 635 packet->options[end + OPT_DATA + len] = DHCP_END;
636 } 636 }
637 637
638 if (client_data.fqdn)
639 udhcp_add_binary_option(packet, client_data.fqdn);
640
641 /* Request broadcast replies if we have no IP addr */ 638 /* Request broadcast replies if we have no IP addr */
642 if ((option_mask32 & OPT_B) && packet->ciaddr == 0) 639 if ((option_mask32 & OPT_B) && packet->ciaddr == 0)
643 packet->flags |= htons(BROADCAST_FLAG); 640 packet->flags |= htons(BROADCAST_FLAG);
@@ -715,7 +712,6 @@ static NOINLINE int send_discover(uint32_t xid, uint32_t requested)
715 udhcp_add_simple_option(&packet, DHCP_REQUESTED_IP, requested); 712 udhcp_add_simple_option(&packet, DHCP_REQUESTED_IP, requested);
716 713
717 /* Add options: maxsize, 714 /* Add options: maxsize,
718 * optionally: fqdn, client-id,
719 * "param req" option according to -O, options specified with -x 715 * "param req" option according to -O, options specified with -x
720 */ 716 */
721 add_client_options(&packet); 717 add_client_options(&packet);
@@ -759,7 +755,6 @@ static NOINLINE int send_select(uint32_t xid, uint32_t server, uint32_t requeste
759 udhcp_add_simple_option(&packet, DHCP_SERVER_ID, server); 755 udhcp_add_simple_option(&packet, DHCP_SERVER_ID, server);
760 756
761 /* Add options: maxsize, 757 /* Add options: maxsize,
762 * optionally: fqdn, client-id,
763 * "param req" option according to -O, and options specified with -x 758 * "param req" option according to -O, and options specified with -x
764 */ 759 */
765 add_client_options(&packet); 760 add_client_options(&packet);
@@ -804,7 +799,6 @@ static NOINLINE int send_renew(uint32_t xid, uint32_t server, uint32_t ciaddr)
804 packet.ciaddr = ciaddr; 799 packet.ciaddr = ciaddr;
805 800
806 /* Add options: maxsize, 801 /* Add options: maxsize,
807 * optionally: fqdn, client-id,
808 * "param req" option according to -O, and options specified with -x 802 * "param req" option according to -O, and options specified with -x
809 */ 803 */
810 add_client_options(&packet); 804 add_client_options(&packet);
@@ -1154,17 +1148,6 @@ static void perform_release(uint32_t server_addr, uint32_t requested_ip)
1154 client_data.state = RELEASED; 1148 client_data.state = RELEASED;
1155} 1149}
1156 1150
1157static uint8_t* alloc_dhcp_option(int code, const char *str, int extra)
1158{
1159 uint8_t *storage;
1160 int len = strnlen(str, 255);
1161 storage = xzalloc(len + extra + OPT_DATA);
1162 storage[OPT_CODE] = code;
1163 storage[OPT_LEN] = len + extra;
1164 memcpy(storage + extra + OPT_DATA, str, len);
1165 return storage;
1166}
1167
1168#if BB_MMU 1151#if BB_MMU
1169static void client_background(void) 1152static void client_background(void)
1170{ 1153{
@@ -1284,8 +1267,13 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1284 IF_UDHCP_VERBOSE(, &dhcp_verbose) 1267 IF_UDHCP_VERBOSE(, &dhcp_verbose)
1285 ); 1268 );
1286 if (opt & OPT_F) { 1269 if (opt & OPT_F) {
1270 char *p;
1271 unsigned len;
1287 /* FQDN option format: [0x51][len][flags][0][0]<fqdn> */ 1272 /* FQDN option format: [0x51][len][flags][0][0]<fqdn> */
1288 client_data.fqdn = alloc_dhcp_option(DHCP_FQDN, str_F, 3); 1273 len = strlen(str_F);
1274 p = udhcp_insert_new_option(
1275 &client_data.options, DHCP_FQDN,
1276 len + 3, /*dhcp6:*/ 0);
1289 /* Flag bits: 0000NEOS 1277 /* Flag bits: 0000NEOS
1290 * S: 1 = Client requests server to update A RR in DNS as well as PTR 1278 * S: 1 = Client requests server to update A RR in DNS as well as PTR
1291 * O: 1 = Server indicates to client that DNS has been updated regardless 1279 * O: 1 = Server indicates to client that DNS has been updated regardless
@@ -1294,9 +1282,10 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1294 * N: 1 = Client requests server to not update DNS (S must be 0 then) 1282 * N: 1 = Client requests server to not update DNS (S must be 0 then)
1295 * Two [0] bytes which follow are deprecated and must be 0. 1283 * Two [0] bytes which follow are deprecated and must be 0.
1296 */ 1284 */
1297 client_data.fqdn[OPT_DATA + 0] = 0x1; 1285 p[OPT_DATA + 0] = 0x1;
1298 /*client_data.fqdn[OPT_DATA + 1] = 0; - xzalloc did it */ 1286 /*p[OPT_DATA + 1] = 0; - xzalloc did it */
1299 /*client_data.fqdn[OPT_DATA + 2] = 0; */ 1287 /*p[OPT_DATA + 2] = 0; */
1288 memcpy(p + OPT_DATA + 3, str_F, len); /* do not store NUL byte */
1300 } 1289 }
1301 if (opt & OPT_r) 1290 if (opt & OPT_r)
1302 requested_ip = inet_addr(str_r); 1291 requested_ip = inet_addr(str_r);
@@ -1333,31 +1322,35 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1333 free(optstr); 1322 free(optstr);
1334 } 1323 }
1335 if (str_V[0] != '\0') { 1324 if (str_V[0] != '\0') {
1325 char *p;
1326 unsigned len;
1336 //msg added 2021-06 1327 //msg added 2021-06
1337 bb_error_msg("option -V VENDOR is deprecated, use -x vendor:VENDOR"); 1328 bb_error_msg("option -V VENDOR is deprecated, use -x vendor:VENDOR");
1338 udhcp_insert_new_option( 1329 len = strlen(str_V);
1330 p = udhcp_insert_new_option(
1339 &client_data.options, DHCP_VENDOR, 1331 &client_data.options, DHCP_VENDOR,
1340 str_V, strlen(str_V), /*dhcp6:*/ 0); 1332 len, /*dhcp6:*/ 0);
1333 memcpy(p + OPT_DATA, str_V, len); /* do not store NUL byte */
1334 }
1335
1336 clientid_mac_ptr = NULL;
1337 if (!(opt & OPT_C) && !udhcp_find_option(client_data.options, DHCP_CLIENT_ID)) {
1338 /* not suppressed and not set, create default client ID */
1339 clientid_mac_ptr = udhcp_insert_new_option(
1340 &client_data.options, DHCP_CLIENT_ID,
1341 1 + 6, /*dhcp6:*/ 0);
1342 clientid_mac_ptr[OPT_DATA] = 1; /* type: ethernet */
1343 clientid_mac_ptr += OPT_DATA + 1; /* skip option code, len, ethernet */
1341 } 1344 }
1342 1345
1343 if (udhcp_read_interface(client_data.interface, 1346 if (udhcp_read_interface(client_data.interface,
1344 &client_data.ifindex, 1347 &client_data.ifindex,
1345 NULL, 1348 NULL,
1346 client_data_client_mac) 1349 client_data.client_mac)
1347 ) { 1350 ) {
1348 return 1; 1351 return 1;
1349 } 1352 }
1350 1353
1351 clientid_mac_ptr = NULL;
1352 if (!(opt & OPT_C) && !udhcp_find_option(client_data.options, DHCP_CLIENT_ID)) {
1353 /* not suppressed and not set, set the default client ID */
1354 client_data_client_mac[-1] = 1; /* type: ethernet */
1355 clientid_mac_ptr = udhcp_insert_new_option(
1356 &client_data.options, DHCP_CLIENT_ID,
1357 client_data_client_mac - 1, 1 + 6, /*dhcp6:*/ 0);
1358 clientid_mac_ptr += 3; /* skip option code, len, ethernet */
1359 }
1360
1361#if !BB_MMU 1354#if !BB_MMU
1362 /* on NOMMU reexec (i.e., background) early */ 1355 /* on NOMMU reexec (i.e., background) early */
1363 if (!(opt & OPT_f)) { 1356 if (!(opt & OPT_f)) {
@@ -1443,12 +1436,12 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1443 if (udhcp_read_interface(client_data.interface, 1436 if (udhcp_read_interface(client_data.interface,
1444 &client_data.ifindex, 1437 &client_data.ifindex,
1445 NULL, 1438 NULL,
1446 client_data_client_mac) 1439 client_data.client_mac)
1447 ) { 1440 ) {
1448 goto ret0; /* iface is gone? */ 1441 goto ret0; /* iface is gone? */
1449 } 1442 }
1450 if (clientid_mac_ptr) 1443 if (clientid_mac_ptr)
1451 memcpy(clientid_mac_ptr, client_data_client_mac, 6); 1444 memcpy(clientid_mac_ptr, client_data.client_mac, 6);
1452 1445
1453 switch (client_data.state) { 1446 switch (client_data.state) {
1454 case INIT_SELECTING: 1447 case INIT_SELECTING:
@@ -1643,7 +1636,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1643 1636
1644 /* Ignore packets that aren't for us */ 1637 /* Ignore packets that aren't for us */
1645 if (packet.hlen != 6 1638 if (packet.hlen != 6
1646 || memcmp(packet.chaddr, client_data_client_mac, 6) != 0 1639 || memcmp(packet.chaddr, client_data.client_mac, 6) != 0
1647 ) { 1640 ) {
1648//FIXME: need to also check that last 10 bytes are zero 1641//FIXME: need to also check that last 10 bytes are zero
1649 log1("chaddr does not match%s", ", ignoring packet"); // log2? 1642 log1("chaddr does not match%s", ", ignoring packet"); // log2?
@@ -1755,7 +1748,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
1755 if (!arpping(requested_ip, 1748 if (!arpping(requested_ip,
1756 NULL, 1749 NULL,
1757 (uint32_t) 0, 1750 (uint32_t) 0,
1758 client_data_client_mac, 1751 client_data.client_mac,
1759 client_data.interface, 1752 client_data.interface,
1760 arpping_ms) 1753 arpping_ms)
1761 ) { 1754 ) {
diff --git a/networking/udhcp/dhcpc.h b/networking/udhcp/dhcpc.h
index 5c710963f..cd9ead6bd 100644
--- a/networking/udhcp/dhcpc.h
+++ b/networking/udhcp/dhcpc.h
@@ -8,8 +8,7 @@
8PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN 8PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
9 9
10struct client_data_t { 10struct client_data_t {
11 uint8_t clientid[2+2 + 6]; /* Our mac address (prefixed by padding used for client-id) */ 11 uint8_t client_mac[6]; /* Our mac address */
12#define client_data_client_mac (client_data.clientid + 2+2)
13 IF_FEATURE_UDHCP_PORT(uint16_t port;) 12 IF_FEATURE_UDHCP_PORT(uint16_t port;)
14 int ifindex; /* Index number of the interface to use */ 13 int ifindex; /* Index number of the interface to use */
15 uint8_t opt_mask[256 / 8]; /* Bitmask of options to send (-O option) */ 14 uint8_t opt_mask[256 / 8]; /* Bitmask of options to send (-O option) */
@@ -18,7 +17,6 @@ struct client_data_t {
18 char *pidfile; /* Optionally store the process ID */ 17 char *pidfile; /* Optionally store the process ID */
19 const char *script; /* User script to run at dhcp events */ 18 const char *script; /* User script to run at dhcp events */
20 struct option_set *options; /* list of DHCP options to send to server */ 19 struct option_set *options; /* list of DHCP options to send to server */
21 uint8_t *fqdn; /* Optional fully qualified domain name to use */
22 llist_t *envp; /* list of DHCP options used for env vars */ 20 llist_t *envp; /* list of DHCP options used for env vars */
23 21
24 unsigned first_secs; 22 unsigned first_secs;