Changeset View
Changeset View
Standalone View
Standalone View
head/contrib/bsnmp/snmp_mibII/mibII.c
Show First 20 Lines • Show All 433 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
/* | /* | ||||
* Fetch new MIB data. | * Fetch new MIB data. | ||||
*/ | */ | ||||
int | int | ||||
mib_fetch_ifmib(struct mibif *ifp) | mib_fetch_ifmib(struct mibif *ifp) | ||||
{ | { | ||||
static int kmib[2] = { -1, 0 }; /* for sysctl net.ifdescr_maxlen */ | |||||
int name[6]; | int name[6]; | ||||
size_t kmiblen = nitems(kmib); | |||||
size_t len; | size_t len; | ||||
void *newmib; | void *newmib; | ||||
struct ifmibdata oldmib = ifp->mib; | struct ifmibdata oldmib = ifp->mib; | ||||
struct ifreq irr; | struct ifreq irr; | ||||
unsigned int alias_maxlen = MIBIF_ALIAS_SIZE_MAX; | |||||
if (fetch_generic_mib(ifp, &oldmib) == -1) | if (fetch_generic_mib(ifp, &oldmib) == -1) | ||||
return (-1); | return (-1); | ||||
/* | /* | ||||
* Quoting RFC2863, 3.1.15: "... LinkUp and linkDown traps are | * Quoting RFC2863, 3.1.15: "... LinkUp and linkDown traps are | ||||
* generated just after ifOperStatus leaves, or just before it | * generated just after ifOperStatus leaves, or just before it | ||||
* enters, the down state, respectively;" | * enters, the down state, respectively;" | ||||
▲ Show 20 Lines • Show All 55 Lines • ▼ Show 20 Lines | if (sysctl(name, nitems(name), ifp->specmib, &len, NULL, 0) == -1) { | ||||
syslog(LOG_WARNING, "sysctl linkmib (%s): %m", ifp->name); | syslog(LOG_WARNING, "sysctl linkmib (%s): %m", ifp->name); | ||||
if (ifp->specmib != NULL) { | if (ifp->specmib != NULL) { | ||||
ifp->specmib = NULL; | ifp->specmib = NULL; | ||||
ifp->specmiblen = 0; | ifp->specmiblen = 0; | ||||
} | } | ||||
} | } | ||||
out: | out: | ||||
/* | |||||
* Find sysctl mib for net.ifdescr_maxlen (one time). | |||||
* kmib[0] == -1 at first call to mib_fetch_ifmib(). | |||||
* Then kmib[0] > 0 if we found sysctl mib for net.ifdescr_maxlen. | |||||
* Else, kmib[0] == 0 (unexpected error from a kernel). | |||||
*/ | |||||
if (kmib[0] < 0 && | |||||
sysctlnametomib("net.ifdescr_maxlen", kmib, &kmiblen) < 0) { | |||||
kmib[0] = 0; | |||||
syslog(LOG_WARNING, "sysctlnametomib net.ifdescr_maxlen: %m"); | |||||
} | |||||
/* | |||||
* Fetch net.ifdescr_maxlen value every time to catch up with changes. | |||||
*/ | |||||
len = sizeof(alias_maxlen); | |||||
if (kmib[0] > 0 && sysctl(kmib, 2, &alias_maxlen, &len, NULL, 0) < 0) { | |||||
/* unexpected error from the kernel, use default value */ | |||||
alias_maxlen = MIBIF_ALIAS_SIZE_MAX; | |||||
syslog(LOG_WARNING, "sysctl net.ifdescr_maxlen: %m"); | |||||
} | |||||
/* | |||||
* Kernel limit might be decreased after interfaces got | |||||
* their descriptions assigned. Try to obtain them anyway. | |||||
*/ | |||||
if (alias_maxlen == 0) | |||||
alias_maxlen = MIBIF_ALIAS_SIZE_MAX; | |||||
/* | |||||
* Allocate maximum memory for a buffer and later reallocate | |||||
* to free extra memory. | |||||
*/ | |||||
if ((ifp->alias = malloc(alias_maxlen)) == NULL) { | |||||
syslog(LOG_WARNING, "malloc(%d) failed: %m", (int)alias_maxlen); | |||||
goto fin; | |||||
} | |||||
strlcpy(irr.ifr_name, ifp->name, sizeof(irr.ifr_name)); | strlcpy(irr.ifr_name, ifp->name, sizeof(irr.ifr_name)); | ||||
irr.ifr_buffer.buffer = MIBIF_PRIV(ifp)->alias; | irr.ifr_buffer.buffer = ifp->alias; | ||||
irr.ifr_buffer.length = sizeof(MIBIF_PRIV(ifp)->alias); | irr.ifr_buffer.length = alias_maxlen; | ||||
if (ioctl(mib_netsock, SIOCGIFDESCR, &irr) == -1) { | if (ioctl(mib_netsock, SIOCGIFDESCR, &irr) == -1) { | ||||
MIBIF_PRIV(ifp)->alias[0] = 0; | free(ifp->alias); | ||||
ifp->alias = NULL; | |||||
if (errno != ENOMSG) | if (errno != ENOMSG) | ||||
syslog(LOG_WARNING, "SIOCGIFDESCR (%s): %m", ifp->name); | syslog(LOG_WARNING, "SIOCGIFDESCR (%s): %m", ifp->name); | ||||
} else if (irr.ifr_buffer.buffer == NULL) { | } else if (irr.ifr_buffer.buffer == NULL) { | ||||
MIBIF_PRIV(ifp)->alias[0] = 0; | free(ifp->alias); | ||||
ifp->alias = NULL; | |||||
syslog(LOG_WARNING, "SIOCGIFDESCR (%s): too long (%zu)", | syslog(LOG_WARNING, "SIOCGIFDESCR (%s): too long (%zu)", | ||||
ifp->name, irr.ifr_buffer.length); | ifp->name, irr.ifr_buffer.length); | ||||
} else { | |||||
ifp->alias_size = strnlen(ifp->alias, alias_maxlen) + 1; | |||||
if (ifp->alias_size > MIBIF_ALIAS_SIZE) | |||||
ifp->alias_size = MIBIF_ALIAS_SIZE; | |||||
if (ifp->alias_size < alias_maxlen) | |||||
ifp->alias = realloc(ifp->alias, ifp->alias_size); | |||||
} | } | ||||
fin: | |||||
ifp->mibtick = get_ticks(); | ifp->mibtick = get_ticks(); | ||||
return (0); | return (0); | ||||
} | } | ||||
/* find first/next address for a given interface */ | /* find first/next address for a given interface */ | ||||
struct mibifa * | struct mibifa * | ||||
mib_first_ififa(const struct mibif *ifp) | mib_first_ififa(const struct mibif *ifp) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 163 Lines • ▼ Show 20 Lines | if (ifp->mib.ifmd_data.ifi_baudrate == mibif_maxspeed) { | ||||
mibif_maxspeed = ifp->mib.ifmd_data.ifi_baudrate; | mibif_maxspeed = ifp->mib.ifmd_data.ifi_baudrate; | ||||
TAILQ_FOREACH(ifp1, &mibif_list, link) | TAILQ_FOREACH(ifp1, &mibif_list, link) | ||||
if (ifp1->mib.ifmd_data.ifi_baudrate > mibif_maxspeed) | if (ifp1->mib.ifmd_data.ifi_baudrate > mibif_maxspeed) | ||||
mibif_maxspeed = | mibif_maxspeed = | ||||
ifp1->mib.ifmd_data.ifi_baudrate; | ifp1->mib.ifmd_data.ifi_baudrate; | ||||
mibif_reset_hc_timer(); | mibif_reset_hc_timer(); | ||||
} | } | ||||
if (ifp->alias != NULL) { | |||||
free(ifp->alias); | |||||
ifp->alias = NULL; | |||||
} | |||||
free(ifp->private); | free(ifp->private); | ||||
ifp->private = NULL; | ifp->private = NULL; | ||||
free(ifp->physaddr); | free(ifp->physaddr); | ||||
ifp->physaddr = NULL; | ifp->physaddr = NULL; | ||||
free(ifp->specmib); | free(ifp->specmib); | ||||
ifp->specmib = NULL; | ifp->specmib = NULL; | ||||
STAILQ_FOREACH(map, &mibindexmap_list, link) | STAILQ_FOREACH(map, &mibindexmap_list, link) | ||||
▲ Show 20 Lines • Show All 1,096 Lines • Show Last 20 Lines |