reduce size by de-duplicate initialization of netlink reqest structure
initialization.

function                                             old     new   delta
init_rtnlmsg_rtmsg_req                                 -      34     +34
init_nlmsg_ifinfomsg_req                               -      34     +34
set_master                                           191     171     -20
iproute_modify                                      1241    1218     -23
iproute_get                                          880     857     -23
do_add_or_delete                                    1344    1319     -25
iprule_modify                                        955     928     -27
------------------------------------------------------------------------------

v2: unmodified, but re-sent for convienience.

(add/remove: 2/0 grow/shrink: 0/5 up/down: 68/-118)           Total: -50
bytes
   text    data     bss     dec     hex filename
 876517   15636    2080  894233   da519 busybox_old
 876467   15636    2080  894183   da4e7 busybox_unstripped
---
 networking/libiproute/ip_common.h |  7 ++++++
 networking/libiproute/iplink.c    | 37 ++++++++++++++-----------------
 networking/libiproute/iproute.c   | 35 ++++++++++++-----------------
 networking/libiproute/iprule.c    | 12 ++--------
 4 files changed, 40 insertions(+), 51 deletions(-)

diff --git a/networking/libiproute/ip_common.h 
b/networking/libiproute/ip_common.h
index 15f9bb4df..5230a5b20 100644
--- a/networking/libiproute/ip_common.h
+++ b/networking/libiproute/ip_common.h
@@ -15,6 +15,13 @@
 
 PUSH_AND_SET_FUNCTION_VISIBILITY_TO_HIDDEN
 
+struct rtnlmsg_rtmsg_req {
+       struct nlmsghdr n;
+       struct rtmsg    r;
+       char            buf[1024];
+};
+
+void FAST_FUNC init_rtnlmsg_rtmsg_req(struct rtnlmsg_rtmsg_req *req);
 char FAST_FUNC **ip_parse_common_args(char **argv);
 //int FAST_FUNC print_neigh(struct sockaddr_nl *who, struct nlmsghdr *n, void 
*arg);
 int FAST_FUNC ipaddr_list_or_flush(char **argv, int flush);
diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c
index 1a1064bdc..32a0613e0 100644
--- a/networking/libiproute/iplink.c
+++ b/networking/libiproute/iplink.c
@@ -43,6 +43,12 @@ struct ifla_vlan_flags {
 };
 #endif
 
+struct nlmsg_ifinfomsg_req {
+       struct nlmsghdr  n;
+       struct ifinfomsg i;
+       char             buf[1024];
+};
+
 /* taken from linux/sockios.h */
 #define SIOCSIFNAME  0x8923  /* set interface name */
 
@@ -55,6 +61,13 @@ struct ifla_vlan_flags {
 
 #define str_on_off "on\0""off\0"
 
+static void init_nlmsg_ifinfomsg_req(struct nlmsg_ifinfomsg_req *req) {
+       memset(req, 0, sizeof(*req));
+       req->n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
+       req->n.nlmsg_flags = NLM_F_REQUEST;
+       req->i.ifi_family = preferred_family;
+}
+
 /* Exits on error */
 static int get_ctl_fd(void)
 {
@@ -131,18 +144,10 @@ static void set_mtu(char *dev, int mtu)
 static void set_master(char *dev, int master)
 {
        struct rtnl_handle rth;
-       struct {
-               struct nlmsghdr  n;
-               struct ifinfomsg i;
-               char             buf[1024];
-       } req;
-
-       memset(&req, 0, sizeof(req));
+       struct nlmsg_ifinfomsg_req req;
 
-       req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
-       req.n.nlmsg_flags = NLM_F_REQUEST;
+       init_nlmsg_ifinfomsg_req(&req);
        req.n.nlmsg_type = RTM_NEWLINK;
-       req.i.ifi_family = preferred_family;
 
        xrtnl_open(&rth);
        req.i.ifi_index = xll_name_to_index(dev);
@@ -596,11 +601,7 @@ static int do_add_or_delete(char **argv, const unsigned 
rtm)
                ARG_address,
        };
        struct rtnl_handle rth;
-       struct {
-               struct nlmsghdr  n;
-               struct ifinfomsg i;
-               char             buf[1024];
-       } req;
+       struct nlmsg_ifinfomsg_req req;
        smalluint arg;
        char *name_str = NULL;
        char *link_str = NULL;
@@ -608,12 +609,8 @@ static int do_add_or_delete(char **argv, const unsigned 
rtm)
        char *dev_str = NULL;
        char *address_str = NULL;
 
-       memset(&req, 0, sizeof(req));
-
-       req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
-       req.n.nlmsg_flags = NLM_F_REQUEST;
+       init_nlmsg_ifinfomsg_req(&req);
        req.n.nlmsg_type = rtm;
-       req.i.ifi_family = preferred_family;
        if (rtm == RTM_NEWLINK)
                req.n.nlmsg_flags |= NLM_F_CREATE|NLM_F_EXCL;
 
diff --git a/networking/libiproute/iproute.c b/networking/libiproute/iproute.c
index 9a58fdbb5..cf562fd5f 100644
--- a/networking/libiproute/iproute.c
+++ b/networking/libiproute/iproute.c
@@ -348,6 +348,15 @@ static int str_is_lock(const char *str)
        return strcmp(str, "lock") == 0;
 }
 
+void init_rtnlmsg_rtmsg_req(struct rtnlmsg_rtmsg_req *req)
+{
+       memset(req, 0, sizeof(*req));
+       req->n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
+       if (NLM_F_REQUEST)
+               req->n.nlmsg_flags = NLM_F_REQUEST;
+       req->r.rtm_family = preferred_family;
+}
+
 /* Return value becomes exitcode. It's okay to not return at all */
 static int iproute_modify(int cmd, unsigned flags, char **argv)
 {
@@ -384,11 +393,7 @@ IF_FEATURE_IP_RULE(ARG_table,)
                type_ok = 1 << 3
        };
        struct rtnl_handle rth;
-       struct {
-               struct nlmsghdr n;
-               struct rtmsg    r;
-               char            buf[1024];
-       } req;
+       struct rtnlmsg_rtmsg_req req;
        char mxbuf[256];
        struct rtattr * mxrta = (void*)mxbuf;
        unsigned mxlock = 0;
@@ -397,12 +402,10 @@ IF_FEATURE_IP_RULE(ARG_table,)
        smalluint scope_ok = 0;
        int arg;
 
-       memset(&req, 0, sizeof(req));
+       init_rtnlmsg_rtmsg_req(&req);
 
-       req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
-       req.n.nlmsg_flags = NLM_F_REQUEST | flags;
+       req.n.nlmsg_flags |= flags;
        req.n.nlmsg_type = cmd;
-       req.r.rtm_family = preferred_family;
        if (RT_TABLE_MAIN != 0) /* if it is zero, memset already did it */
                req.r.rtm_table = RT_TABLE_MAIN;
        if (RT_SCOPE_NOWHERE != 0)
@@ -961,16 +964,11 @@ static int iproute_list_or_flush(char **argv, int flush)
        return 0;
 }
 
-
 /* Return value becomes exitcode. It's okay to not return at all */
 static int iproute_get(char **argv)
 {
        struct rtnl_handle rth;
-       struct {
-               struct nlmsghdr n;
-               struct rtmsg    r;
-               char            buf[1024];
-       } req;
+       struct rtnlmsg_rtmsg_req req;
        char *idev = NULL;
        char *odev = NULL;
        bool connected = 0;
@@ -978,16 +976,11 @@ static int iproute_get(char **argv)
        static const char options[] ALIGN1 =
                "from\0""iif\0""oif\0""dev\0""notify\0""connected\0""to\0";
 
-       memset(&req, 0, sizeof(req));
-
+       init_rtnlmsg_rtmsg_req(&req);
        iproute_reset_filter();
 
-       req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
-       if (NLM_F_REQUEST)
-               req.n.nlmsg_flags = NLM_F_REQUEST;
        if (RTM_GETROUTE)
                req.n.nlmsg_type = RTM_GETROUTE;
-       req.r.rtm_family = preferred_family;
        /*req.r.rtm_table = 0; - memset did this already */
        /*req.r.rtm_protocol = 0;*/
        /*req.r.rtm_scope = 0;*/
diff --git a/networking/libiproute/iprule.c b/networking/libiproute/iprule.c
index 0ce0dfeef..5ac34149a 100644
--- a/networking/libiproute/iprule.c
+++ b/networking/libiproute/iprule.c
@@ -201,19 +201,11 @@ static int iprule_modify(int cmd, char **argv)
 {
        bool table_ok = 0;
        struct rtnl_handle rth;
-       struct {
-               struct nlmsghdr n;
-               struct rtmsg    r;
-               char            buf[1024];
-       } req;
+       struct rtnlmsg_rtmsg_req req;
        smalluint key;
 
-       memset(&req, 0, sizeof(req));
-
+       init_rtnlmsg_rtmsg_req(&req);
        req.n.nlmsg_type = cmd;
-       req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
-       req.n.nlmsg_flags = NLM_F_REQUEST;
-       req.r.rtm_family = preferred_family;
        req.r.rtm_protocol = RTPROT_BOOT;
        if (RT_SCOPE_UNIVERSE != 0)
                req.r.rtm_scope = RT_SCOPE_UNIVERSE;
-- 
2.25.0

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to