diff options
author | Martin Lewis | 2020-06-09 16:59:54 -0500 |
---|---|---|
committer | Denys Vlasenko | 2020-06-09 17:59:56 +0200 |
commit | d30d1ebc117db182a6156df182057291d6fbaae1 (patch) | |
tree | 59acd2bbd808d350f8e35dbb04e773002e6060f2 | |
parent | 17764603f2a10bd43d174dc05512f38ab16a080a (diff) | |
download | busybox-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.h | 2 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.c | 41 |
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 |