summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Lewis2020-06-09 16:59:54 -0500
committerDenys Vlasenko2020-06-09 17:59:56 +0200
commitd30d1ebc117db182a6156df182057291d6fbaae1 (patch)
tree59acd2bbd808d350f8e35dbb04e773002e6060f2
parent17764603f2a10bd43d174dc05512f38ab16a080a (diff)
downloadbusybox-d30d1ebc117db182a6156df182057291d6fbaae1.zip
busybox-d30d1ebc117db182a6156df182057291d6fbaae1.tar.gz
dhcpc: refactor xmalloc_optname_optval to shrink binary size
function old new delta len_of_option_as_string 14 13 -1 dhcp_option_lengths 14 13 -1 udhcp_str2optset 641 637 -4 static.xmalloc_optname_optval 777 718 -59 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/4 up/down: 0/-65) Total: -65 bytes Signed-off-by: Martin Lewis <martin.lewis.x84@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--networking/udhcp/common.h2
-rw-r--r--networking/udhcp/dhcpc.c41
2 files changed, 16 insertions, 27 deletions
diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h
index 73f860a..6214db0 100644
--- a/networking/udhcp/common.h
+++ b/networking/udhcp/common.h
@@ -78,7 +78,7 @@ struct BUG_bad_sizeof_struct_ip_udp_dhcp_packet {
/*** Options ***/
enum {
- OPTION_IP = 1,
+ OPTION_IP = 0,
OPTION_IP_PAIR,
OPTION_STRING,
/* Opts of STRING_HOST type will be sanitized before they are passed
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 6422181..102178a 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -208,9 +208,8 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_
case OPTION_IP:
case OPTION_IP_PAIR:
dest += sprint_nip(dest, "", option);
- if (type == OPTION_IP)
- break;
- dest += sprint_nip(dest, "/", option + 4);
+ if (type == OPTION_IP_PAIR)
+ dest += sprint_nip(dest, "/", option + 4);
break;
// case OPTION_BOOLEAN:
// dest += sprintf(dest, *option ? "yes" : "no");
@@ -312,7 +311,7 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_
* IPv4MaskLen <= 32,
* 6rdPrefixLen <= 128,
* 6rdPrefixLen + (32 - IPv4MaskLen) <= 128
- * (2nd condition need no check - it follows from 1st and 3rd).
+ * (2nd condition needs no check - it follows from 1st and 3rd).
* Else, return envvar with empty value ("optname=")
*/
if (len >= (1 + 1 + 16 + 4)
@@ -326,17 +325,12 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_
/* 6rdPrefix */
dest += sprint_nip6(dest, /* "", */ option);
option += 16;
- len -= 1 + 1 + 16 + 4;
- /* "+ 4" above corresponds to the length of IPv4 addr
- * we consume in the loop below */
- while (1) {
- /* 6rdBRIPv4Address(es) */
- dest += sprint_nip(dest, " ", option);
- option += 4;
- len -= 4; /* do we have yet another 4+ bytes? */
- if (len < 0)
- break; /* no */
- }
+ len -= 1 + 1 + 16;
+ *dest++ = ' ';
+ /* 6rdBRIPv4Address(es), use common IPv4 logic to process them */
+ type = OPTION_IP;
+ optlen = 4;
+ continue;
}
return ret;
@@ -358,23 +352,18 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_
*/
option++;
len--;
+ if (option[-1] == 1) {
+ /* use common IPv4 logic to process IP addrs */
+ type = OPTION_IP;
+ optlen = 4;
+ continue;
+ }
if (option[-1] == 0) {
dest = dname_dec(option, len, ret);
if (dest) {
free(ret);
return dest;
}
- } else
- if (option[-1] == 1) {
- const char *pfx = "";
- while (1) {
- len -= 4;
- if (len < 0)
- break;
- dest += sprint_nip(dest, pfx, option);
- pfx = " ";
- option += 4;
- }
}
return ret;
#endif