dhcpc: refactor xmalloc_optname_optval to shrink binary size
authorMartin Lewis <martin.lewis.x84@gmail.com>
Tue, 9 Jun 2020 21:59:54 +0000 (16:59 -0500)
committerDenys Vlasenko <vda.linux@googlemail.com>
Tue, 9 Jun 2020 15:59:56 +0000 (17:59 +0200)
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>
networking/udhcp/common.h
networking/udhcp/dhcpc.c

index 73f860a77dda228dce04cc453e5bda36d6ca02b6..6214db06afcb046c17487f8012a60336f1d85e54 100644 (file)
@@ -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
index 6422181da4ed9a13c4ee25c1d6b219dc7fcf8e1d..102178a4f94e18be637a06c193337a28e44960ce 100644 (file)
@@ -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