ll_map: disable interface name caching code
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 19 Jun 2007 12:11:20 +0000 (12:11 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 19 Jun 2007 12:11:20 +0000 (12:11 -0000)
function                                             old     new   delta
find_by_index                                          -      26     +26
static.icache                                          4       -      -4
ll_idx_n2a                                            71      59     -12
static.ncache                                         16       -     -16
ll_index_to_flags                                     40      24     -16
xll_name_to_index                                    206     104    -102
------------------------------------------------------------------------------
(add/remove: 1/2 grow/shrink: 0/3 up/down: 26/-150)          Total: -124 bytes

   text    data     bss     dec     hex filename
 734703    3040   14440  752183   b7a37 busybox_old
 734599    3040   14416  752055   b79b7 busybox_unstripped

networking/libiproute/ll_map.c
networking/libiproute/ll_map.h

index eb9b0a4ffc9d99312e301c5128aa30797faeaddd..e8a8279b0ae8829a1f66f4baf97dc778725b1c73 100644 (file)
  *
  */
 
-//#include <sys/socket.h>      /* socket() */
 #include <net/if.h>    /* struct ifreq and co. */
-//#include <sys/ioctl.h>       /* ioctl() & SIOCGIFINDEX */
 
 #include "libbb.h"
 #include "libnetlink.h"
 #include "ll_map.h"
 
 struct idxmap {
-       struct idxmap * next;
-       int             index;
-       int             type;
-       int             alen;
-       unsigned        flags;
-       unsigned char   addr[8];
-       char            name[16];
+       struct idxmap *next;
+       int            index;
+       int            type;
+       int            alen;
+       unsigned       flags;
+       unsigned char  addr[8];
+       char           name[16];
 };
 
 static struct idxmap *idxmap[16];
 
+static struct idxmap *find_by_index(int idx)
+{
+       struct idxmap *im;
+
+       for (im = idxmap[idx & 0xF]; im; im = im->next)
+               if (im->index == idx)
+                       return im;
+       return NULL;
+}
+
 int ll_remember_index(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
 {
        int h;
@@ -44,25 +52,22 @@ int ll_remember_index(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg)
        if (n->nlmsg_len < NLMSG_LENGTH(sizeof(ifi)))
                return -1;
 
-
        memset(tb, 0, sizeof(tb));
        parse_rtattr(tb, IFLA_MAX, IFLA_RTA(ifi), IFLA_PAYLOAD(n));
        if (tb[IFLA_IFNAME] == NULL)
                return 0;
 
-       h = ifi->ifi_index&0xF;
+       h = ifi->ifi_index & 0xF;
 
        for (imp = &idxmap[h]; (im = *imp) != NULL; imp = &im->next)
                if (im->index == ifi->ifi_index)
-                       break;
-
-       if (im == NULL) {
-               im = xmalloc(sizeof(*im));
-               im->next = *imp;
-               im->index = ifi->ifi_index;
-               *imp = im;
-       }
+                       goto found;
 
+       im = xmalloc(sizeof(*im));
+       im->next = *imp;
+       im->index = ifi->ifi_index;
+       *imp = im;
+ found:
        im->type = ifi->ifi_type;
        im->flags = ifi->ifi_flags;
        if (tb[IFLA_ADDRESS]) {
@@ -85,9 +90,9 @@ const char *ll_idx_n2a(int idx, char *buf)
 
        if (idx == 0)
                return "*";
-       for (im = idxmap[idx & 0xF]; im; im = im->next)
-               if (im->index == idx)
-                       return im->name;
+       im = find_by_index(idx);
+       if (im)
+               return im->name;
        snprintf(buf, 16, "if%d", idx);
        return buf;
 }
@@ -100,17 +105,19 @@ const char *ll_index_to_name(int idx)
        return ll_idx_n2a(idx, nbuf);
 }
 
+#ifdef UNUSED
 int ll_index_to_type(int idx)
 {
        struct idxmap *im;
 
        if (idx == 0)
                return -1;
-       for (im = idxmap[idx & 0xF]; im; im = im->next)
-               if (im->index == idx)
-                       return im->type;
+       im = find_by_index(idx);
+       if (im)
+               return im->type;
        return -1;
 }
+#endif
 
 unsigned ll_index_to_flags(int idx)
 {
@@ -118,23 +125,24 @@ unsigned ll_index_to_flags(int idx)
 
        if (idx == 0)
                return 0;
-
-       for (im = idxmap[idx & 0xF]; im; im = im->next)
-               if (im->index == idx)
-                       return im->flags;
+       im = find_by_index(idx);
+       if (im)
+               return im->flags;
        return 0;
 }
 
-// TODO: caching is not warranted - no users which repeatedly call it
 int xll_name_to_index(const char * const name)
 {
+       int ret = 0;
+       int sock_fd;
+
+/* caching is not warranted - no users which repeatedly call it */
+#ifdef UNUSED
        static char ncache[16];
        static int icache;
 
        struct idxmap *im;
-       int sock_fd;
        int i;
-       int ret = 0;
 
        if (name == NULL)
                goto out;
@@ -159,10 +167,13 @@ int xll_name_to_index(const char * const name)
         * we explicitely request it (check for dev_load() in net/core/dev.c).
         * I can think of other similar scenario, but they are less common...
         * Jean II */
+#endif
+
        sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
        if (sock_fd) {
                struct ifreq ifr;
                int tmp;
+
                strncpy(ifr.ifr_name, name, IFNAMSIZ);
                ifr.ifr_ifindex = -1;
                tmp = ioctl(sock_fd, SIOCGIFINDEX, &ifr);
@@ -173,7 +184,7 @@ int xll_name_to_index(const char * const name)
                         * to the reader... Jean II */
                        ret = ifr.ifr_ifindex;
        }
-out:
+/* out:*/
        if (ret <= 0)
                bb_error_msg_and_die("cannot find device \"%s\"", name);
        return ret;
index abb640444e164d7c2edf9f4067e2234f09c2585d..2dfc8442299887868def9177cbe87c3a0d6ffd7b 100644 (file)
@@ -2,12 +2,12 @@
 #ifndef __LL_MAP_H__
 #define __LL_MAP_H__ 1
 
-extern int ll_remember_index(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);
-extern int ll_init_map(struct rtnl_handle *rth);
-extern int xll_name_to_index(const char * const name);
-extern const char *ll_index_to_name(int idx);
-extern const char *ll_idx_n2a(int idx, char *buf);
-extern int ll_index_to_type(int idx);
-extern unsigned ll_index_to_flags(int idx);
+int ll_remember_index(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);
+int ll_init_map(struct rtnl_handle *rth);
+int xll_name_to_index(const char * const name);
+const char *ll_index_to_name(int idx);
+const char *ll_idx_n2a(int idx, char *buf);
+/* int ll_index_to_type(int idx); */
+unsigned ll_index_to_flags(int idx);
 
 #endif /* __LL_MAP_H__ */