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
This commit is contained in:
parent
2d25491ed0
commit
08a61180ce
@ -11,26 +11,34 @@
|
||||
*
|
||||
*/
|
||||
|
||||
//#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;
|
||||
|
@ -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__ */
|
||||
|
Loading…
Reference in New Issue
Block a user