/* vi: set sw=4 ts=4: */
/*
- * ll_map.c
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version
- * 2 of the License, or (at your option) any later version.
- *
- * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
*
+ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
*/
-#include <net/if.h> /* struct ifreq and co. */
+#include <net/if.h> /* struct ifreq and co. */
#include "libbb.h"
#include "libnetlink.h"
char name[16];
};
-static struct idxmap *idxmap[16];
+static struct idxmap **idxmap; /* treat as *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;
+ if (idxmap)
+ for (im = idxmap[idx & 0xF]; im; im = im->next)
+ if (im->index == idx)
+ return im;
return NULL;
}
-int ll_remember_index(const struct sockaddr_nl *who ATTRIBUTE_UNUSED,
+int FAST_FUNC ll_remember_index(const struct sockaddr_nl *who UNUSED_PARAM,
struct nlmsghdr *n,
- void *arg ATTRIBUTE_UNUSED)
+ void *arg UNUSED_PARAM)
{
int h;
struct ifinfomsg *ifi = NLMSG_DATA(n);
if (tb[IFLA_IFNAME] == NULL)
return 0;
- h = ifi->ifi_index & 0xF;
+ if (!idxmap)
+ idxmap = xzalloc(sizeof(idxmap[0]) * 16);
+ h = ifi->ifi_index & 0xF;
for (imp = &idxmap[h]; (im = *imp) != NULL; imp = &im->next)
if (im->index == ifi->ifi_index)
goto found;
return 0;
}
-const char *ll_idx_n2a(int idx, char *buf)
+static
+const char FAST_FUNC *ll_idx_n2a(int idx/*, char *buf*/)
{
struct idxmap *im;
im = find_by_index(idx);
if (im)
return im->name;
- snprintf(buf, 16, "if%d", idx);
- return buf;
+ //snprintf(buf, 16, "if%d", idx);
+ //return buf;
+ return auto_string(xasprintf("if%d", idx));
}
-
-const char *ll_index_to_name(int idx)
+const char FAST_FUNC *ll_index_to_name(int idx)
{
- static char nbuf[16];
-
- return ll_idx_n2a(idx, nbuf);
+ //static char nbuf[16];
+ return ll_idx_n2a(idx/*, nbuf*/);
}
#ifdef UNUSED
}
#endif
-unsigned ll_index_to_flags(int idx)
+unsigned FAST_FUNC ll_index_to_flags(int idx)
{
struct idxmap *im;
return 0;
}
-int xll_name_to_index(const char *const name)
+int FAST_FUNC xll_name_to_index(const char *name)
{
int ret = 0;
- int sock_fd;
/* caching is not warranted - no users which repeatedly call it */
#ifdef UNUSED
ret = icache;
goto out;
}
- for (i = 0; i < 16; i++) {
- for (im = idxmap[i]; im; im = im->next) {
- if (strcmp(im->name, name) == 0) {
- icache = im->index;
- strcpy(ncache, name);
- ret = im->index;
- goto out;
+ if (idxmap) {
+ for (i = 0; i < 16; i++) {
+ for (im = idxmap[i]; im; im = im->next) {
+ if (strcmp(im->name, name) == 0) {
+ icache = im->index;
+ strcpy(ncache, name);
+ ret = im->index;
+ goto out;
+ }
}
}
}
- /* We have not found the interface in our cache, but the kernel
- * may still know about it. One reason is that we may be using
- * module on-demand loading, which means that the kernel will
- * load the module and make the interface exist only when
- * 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);
- close(sock_fd);
- if (tmp >= 0)
- /* In theory, we should redump the interface list
- * to update our cache, this is left as an exercise
- * to the reader... Jean II */
- ret = ifr.ifr_ifindex;
- }
+ ret = if_nametoindex(name);
/* out:*/
if (ret <= 0)
- bb_error_msg_and_die("cannot find device \"%s\"", name);
+ bb_error_msg_and_die("can't find device '%s'", name);
return ret;
}
-int ll_init_map(struct rtnl_handle *rth)
+int FAST_FUNC ll_init_map(struct rtnl_handle *rth)
{
xrtnl_wilddump_request(rth, AF_UNSPEC, RTM_GETLINK);
- xrtnl_dump_filter(rth, ll_remember_index, &idxmap);
+ xrtnl_dump_filter(rth, ll_remember_index, NULL);
return 0;
}