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>
This commit is contained in:
Martin Lewis 2020-06-09 16:59:54 -05:00 committed by Denys Vlasenko
parent 17764603f2
commit d30d1ebc11
2 changed files with 16 additions and 27 deletions

View File

@ -78,7 +78,7 @@ struct BUG_bad_sizeof_struct_ip_udp_dhcp_packet {
/*** Options ***/ /*** Options ***/
enum { enum {
OPTION_IP = 1, OPTION_IP = 0,
OPTION_IP_PAIR, OPTION_IP_PAIR,
OPTION_STRING, OPTION_STRING,
/* Opts of STRING_HOST type will be sanitized before they are passed /* Opts of STRING_HOST type will be sanitized before they are passed

View File

@ -208,8 +208,7 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_
case OPTION_IP: case OPTION_IP:
case OPTION_IP_PAIR: case OPTION_IP_PAIR:
dest += sprint_nip(dest, "", option); dest += sprint_nip(dest, "", option);
if (type == OPTION_IP) if (type == OPTION_IP_PAIR)
break;
dest += sprint_nip(dest, "/", option + 4); dest += sprint_nip(dest, "/", option + 4);
break; break;
// case OPTION_BOOLEAN: // case OPTION_BOOLEAN:
@ -312,7 +311,7 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_
* IPv4MaskLen <= 32, * IPv4MaskLen <= 32,
* 6rdPrefixLen <= 128, * 6rdPrefixLen <= 128,
* 6rdPrefixLen + (32 - IPv4MaskLen) <= 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=") * Else, return envvar with empty value ("optname=")
*/ */
if (len >= (1 + 1 + 16 + 4) if (len >= (1 + 1 + 16 + 4)
@ -326,17 +325,12 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_
/* 6rdPrefix */ /* 6rdPrefix */
dest += sprint_nip6(dest, /* "", */ option); dest += sprint_nip6(dest, /* "", */ option);
option += 16; option += 16;
len -= 1 + 1 + 16 + 4; len -= 1 + 1 + 16;
/* "+ 4" above corresponds to the length of IPv4 addr *dest++ = ' ';
* we consume in the loop below */ /* 6rdBRIPv4Address(es), use common IPv4 logic to process them */
while (1) { type = OPTION_IP;
/* 6rdBRIPv4Address(es) */ optlen = 4;
dest += sprint_nip(dest, " ", option); continue;
option += 4;
len -= 4; /* do we have yet another 4+ bytes? */
if (len < 0)
break; /* no */
}
} }
return ret; return ret;
@ -358,23 +352,18 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_
*/ */
option++; option++;
len--; len--;
if (option[-1] == 1) {
/* use common IPv4 logic to process IP addrs */
type = OPTION_IP;
optlen = 4;
continue;
}
if (option[-1] == 0) { if (option[-1] == 0) {
dest = dname_dec(option, len, ret); dest = dname_dec(option, len, ret);
if (dest) { if (dest) {
free(ret); free(ret);
return dest; 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; return ret;
#endif #endif