From 08a61180ceeafaa09e33ef5afc8af45a219ccdf1 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Tue, 19 Jun 2007 12:11:20 +0000 Subject: [PATCH] ll_map: disable interface name caching code 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 | 77 +++++++++++++++++++--------------- networking/libiproute/ll_map.h | 14 +++---- 2 files changed, 51 insertions(+), 40 deletions(-) diff --git a/networking/libiproute/ll_map.c b/networking/libiproute/ll_map.c index eb9b0a4ff..e8a8279b0 100644 --- a/networking/libiproute/ll_map.c +++ b/networking/libiproute/ll_map.c @@ -11,26 +11,34 @@ * */ -//#include /* socket() */ #include /* struct ifreq and co. */ -//#include /* 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; diff --git a/networking/libiproute/ll_map.h b/networking/libiproute/ll_map.h index abb640444..2dfc84422 100644 --- a/networking/libiproute/ll_map.h +++ b/networking/libiproute/ll_map.h @@ -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__ */ -- 2.25.1