Add a new leaf to the net.link.generic.ifdata.%d sysctl to retrieve

the name and unit number assigned by the driver. This is needed by
SNMP to find interfaces after they have been renamed.

MFC after:	4 weeks
This commit is contained in:
Hartmut Brandt 2006-01-04 12:57:09 +00:00
parent d5231b4a7f
commit 154508976b
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=154023
3 changed files with 44 additions and 5 deletions

View File

@ -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;
}

View File

@ -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

View File

@ -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);