function old new delta len_of_option_as_string 14 13 -1 dhcp_option_lengths 14 13 -1 udhcp_str2optset 717 715 -2 .rodata 159869 159867 -2 static.xmalloc_optname_optval 959 828 -131 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/5 up/down: 0/-137) Total: -137 bytes text data bss dec hex filename 993252 16923 1872 1012047 f714f busybox_old 993117 16923 1872 1011912 f70c8 busybox_unstripped
Signed-off-by: Martin Lewis <[email protected]> --- networking/udhcp/common.h | 2 +- networking/udhcp/dhcpc.c | 47 ++++++++++++++++------------------------------- 2 files changed, 17 insertions(+), 32 deletions(-) diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h index 60255eefa..0640c1241 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..5cff53d60 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"); @@ -262,7 +261,6 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_ while (len >= 1 + 4) { /* mask + 0-byte ip + router */ uint32_t nip; - uint8_t *p; unsigned mask; int bytes; @@ -272,12 +270,12 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_ len--; nip = 0; - p = (void*) &nip; bytes = (mask + 7) / 8; /* 0 -> 0, 1..8 -> 1, 9..16 -> 2 etc */ - while (--bytes >= 0) { - *p++ = *option++; - len--; - } + + memcpy(&nip, option, bytes); + len -= bytes; + option += bytes; + if (len < 4) break; @@ -326,17 +324,11 @@ 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++ = ' '; + type = OPTION_IP; + optlen = 4; + continue; } return ret; @@ -364,17 +356,10 @@ static NOINLINE char *xmalloc_optname_optval(uint8_t *option, const struct dhcp_ 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; - } + } else if (option[-1] == 1) { + type = OPTION_IP; + optlen = 4; + continue; } return ret; #endif -- 2.11.0 _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
