diff options
-rw-r--r-- | sys/net/if_mib.c | 19 | ||||
-rw-r--r-- | sys/net/if_mib.h | 1 | ||||
-rw-r--r-- | tools/tools/ifinfo/ifinfo.c | 29 |
3 files changed, 44 insertions, 5 deletions
diff --git a/sys/net/if_mib.c b/sys/net/if_mib.c index c061e7f..dc2b8e1 100644 --- a/sys/net/if_mib.c +++ b/sys/net/if_mib.c @@ -75,6 +75,8 @@ sysctl_ifdata(SYSCTL_HANDLER_ARGS) /* XXX bad syntax! */ u_int namelen = arg2; struct ifnet *ifp; struct ifmibdata ifmd; + size_t dlen; + char *dbuf; if (namelen != 2) return EINVAL; @@ -134,7 +136,22 @@ sysctl_ifdata(SYSCTL_HANDLER_ARGS) /* XXX bad syntax! */ error = SYSCTL_IN(req, ifp->if_linkmib, ifp->if_linkmiblen); if (error) return error; - + + case IFDATA_DRIVERNAME: + /* 20 is enough for 64bit ints */ + dlen = strlen(ifp->if_dname) + 20 + 1; + if ((dbuf = malloc(dlen, M_TEMP, M_NOWAIT)) == NULL) + return (ENOMEM); + if (ifp->if_dunit == IF_DUNIT_NONE) + strcpy(dbuf, ifp->if_dname); + else + sprintf(dbuf, "%s%d", ifp->if_dname, ifp->if_dunit); + + error = SYSCTL_OUT(req, dbuf, strlen(dbuf) + 1); + if (error == 0 && req->newptr != NULL) + error = EPERM; + free(dbuf, M_TEMP); + return (error); } return 0; } diff --git a/sys/net/if_mib.h b/sys/net/if_mib.h index 445bd5b..e2b80c8 100644 --- a/sys/net/if_mib.h +++ b/sys/net/if_mib.h @@ -54,6 +54,7 @@ struct ifmibdata { */ #define IFDATA_GENERAL 1 /* generic stats for all kinds of ifaces */ #define IFDATA_LINKSPECIFIC 2 /* specific to the type of interface */ +#define IFDATA_DRIVERNAME 3 /* driver name and unit */ /* * MIB tags at the net.link.generic.system level diff --git a/tools/tools/ifinfo/ifinfo.c b/tools/tools/ifinfo/ifinfo.c index 54ca164..22053c5 100644 --- a/tools/tools/ifinfo/ifinfo.c +++ b/tools/tools/ifinfo/ifinfo.c @@ -47,7 +47,7 @@ #include "ifinfo.h" -static void printit(const struct ifmibdata *); +static void printit(const struct ifmibdata *, const char *); static const char *iftype(int); static const char *ifphys(int, int); static int isit(int, char **, const char *); @@ -72,6 +72,7 @@ main(int argc, char **argv) void *linkmib; size_t linkmiblen; printfcn pf; + char *dname; while ((c = getopt(argc, argv, "l")) != -1) { switch(c) { @@ -110,7 +111,24 @@ main(int argc, char **argv) if (!isit(argc - optind, argv + optind, ifmd.ifmd_name)) continue; - printit(&ifmd); + + dname = NULL; + len = 0; + name[5] = IFDATA_DRIVERNAME; + if (sysctl(name, 6, NULL, &len, 0, 0) < 0) { + warn("sysctl(net.link.ifdata.%d.drivername)", i); + } else { + if ((dname = malloc(len)) == NULL) + err(EX_OSERR, NULL); + if (sysctl(name, 6, dname, &len, 0, 0) < 0) { + warn("sysctl(net.link.ifdata.%d.drivername)", + i); + free(dname); + dname = NULL; + } + } + printit(&ifmd, dname); + free(dname); if (dolink && (pf = findlink(ifmd.ifmd_data.ifi_type))) { name[5] = IFDATA_LINKSPECIFIC; if (sysctl(name, 6, 0, &linkmiblen, 0, 0) < 0) @@ -135,9 +153,12 @@ main(int argc, char **argv) } static void -printit(const struct ifmibdata *ifmd) +printit(const struct ifmibdata *ifmd, const char *dname) { - printf("Interface %.*s:\n", IFNAMSIZ, ifmd->ifmd_name); + printf("Interface %.*s", IFNAMSIZ, ifmd->ifmd_name); + if (dname != NULL) + printf(" (%s)", dname); + printf(":\n"); printf("\tflags: %x\n", ifmd->ifmd_flags); printf("\tpromiscuous listeners: %d\n", ifmd->ifmd_pcount); printf("\tsend queue length: %d\n", ifmd->ifmd_snd_len); |