From d30d1ebc117db182a6156df182057291d6fbaae1 Mon Sep 17 00:00:00 2001 From: Martin Lewis Date: Tue, 9 Jun 2020 16:59:54 -0500 Subject: [PATCH] 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 Signed-off-by: Denys Vlasenko --- networking/udhcp/common.h | 2 +- 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 73f860a77..6214db06a 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 6422181da..102178a4f 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