diff options
Diffstat (limited to 'snmp_mibII')
-rw-r--r-- | snmp_mibII/Makefile.in | 48 | ||||
-rw-r--r-- | snmp_mibII/mibII.c | 72 | ||||
-rw-r--r-- | snmp_mibII/mibII.h | 6 | ||||
-rw-r--r-- | snmp_mibII/mibII_interfaces.c | 23 | ||||
-rw-r--r-- | snmp_mibII/snmp_mibII.h | 3 |
5 files changed, 70 insertions, 82 deletions
diff --git a/snmp_mibII/Makefile.in b/snmp_mibII/Makefile.in deleted file mode 100644 index a0bd6b95b66fd..0000000000000 --- a/snmp_mibII/Makefile.in +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (c) 2004-2009,2018 -# Hartmut Brandt -# All rights reserved. -# Copyright (c) 2003 -# Fraunhofer Institute for Open Communication Systems (FhG Fokus). -# All rights reserved. -# -# Author: Harti Brandt <harti@freebsd.org> -# -# $Begemot: bsnmp/trunk/snmp_mibII/Makefile.in 1492 2009-11-21 18:56:19Z brandt_h $ -# -MOD= mibII -SRCS= ${MOD}_tree.c mibII.c mibII_begemot.c mibII_ifmib.c mibII_ifstack.c \ - mibII_interfaces.c mibII_ip.c mibII_ipaddr.c mibII_nettomedia.c \ - mibII_rcvaddr.c mibII_route.c mibII_tcp.c mibII_udp.c -INCS= snmp_${MOD}.h -DEFS= mibII_tree.def -MAN3= snmp_mibII.3 -MANFILTER= sed -e 's%@MODPATH@%${LIBDIR}/%g' \ - -e 's%@DEFPATH@%${DEFSDIR}/%g' \ - -e 's%@MIBSPATH@%${MIBSDIR}/%g' - -XSYM= ipAddrTable ifTable ifRcvAddressEntry ifMIB ipMIB tcpMIB udpMIB \ - ipForward ifIndex linkDown linkUp - -BMIBS= BEGEMOT-IP-MIB.txt BEGEMOT-MIB2-MIB.txt -DEFS= mibII_tree.def -INCS= snmp_mibII.h - -LIB= snmp_${MOD}.la -SHLIB_MAJOR= 3 -SHLIB_MINOR= 0 - -CFLAGS+= -I$(srcdir) -I$(srcdir)/../lib -I$(builddir) -I$(srcdir)/../snmpd - -CLEANFILES += ${MOD}_oid.h ${MOD}_tree.c ${MOD}_tree.h *.3out - -# for bootstrapping -GENSNMPTREE= $(builddir)/../gensnmptree/gensnmptree -I${srcdir}/../lib - -$(LIB): ${MOD}_oid.h ${MOD}_tree.h $(SRCS:.c=.lo) - $(LIBTOOL) --mode=link $(CC) $(LDLAGS) -module -o $@ $(SRCS:.c=.lo) -rpath $(libdir) -version-info $(SHLIB_MAJOR):$(SHLIB_MINOR) - -${MOD}_oid.h: ${MOD}_tree.def - ${GENSNMPTREE} <${srcdir}/${MOD}_tree.def -e ${XSYM} >$@ - -${MOD}_tree.h ${MOD}_tree.c : ${MOD}_tree.def - ${GENSNMPTREE} <${srcdir}/${MOD}_tree.def -l -p ${MOD}_ diff --git a/snmp_mibII/mibII.c b/snmp_mibII/mibII.c index 6c35d926c593c..2a4e3756bdc5e 100644 --- a/snmp_mibII/mibII.c +++ b/snmp_mibII/mibII.c @@ -411,7 +411,7 @@ mibif_reset_hc_timer(void) hc_update_timer = NULL; } update_hc_counters(NULL); - if ((hc_update_timer = timer_start_repeat(ticks * 10, ticks * 10, + if ((hc_update_timer = timer_start_repeat(ticks, ticks, update_hc_counters, NULL, module)) == NULL) { syslog(LOG_ERR, "timer_start(%u): %m", ticks); return; @@ -439,11 +439,15 @@ mibif_restart_mibII_poll_timer(void) int mib_fetch_ifmib(struct mibif *ifp) { + static int kmib[2] = { -1, 0 }; /* for sysctl net.ifdescr_maxlen */ + int name[6]; + size_t kmiblen = nitems(kmib); size_t len; void *newmib; struct ifmibdata oldmib = ifp->mib; struct ifreq irr; + u_int alias_maxlen = MIBIF_ALIAS_SIZE_MAX; if (fetch_generic_mib(ifp, &oldmib) == -1) return (-1); @@ -515,18 +519,68 @@ mib_fetch_ifmib(struct mibif *ifp) } 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)); - irr.ifr_buffer.buffer = MIBIF_PRIV(ifp)->alias; - irr.ifr_buffer.length = sizeof(MIBIF_PRIV(ifp)->alias); + irr.ifr_buffer.buffer = ifp->alias; + irr.ifr_buffer.length = alias_maxlen; if (ioctl(mib_netsock, SIOCGIFDESCR, &irr) == -1) { - MIBIF_PRIV(ifp)->alias[0] = 0; + free(ifp->alias); + ifp->alias = NULL; if (errno != ENOMSG) syslog(LOG_WARNING, "SIOCGIFDESCR (%s): %m", ifp->name); } 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)", 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(); return (0); } @@ -706,6 +760,10 @@ mibif_free(struct mibif *ifp) mibif_reset_hc_timer(); } + if (ifp->alias != NULL) { + free(ifp->alias); + ifp->alias = NULL; + } free(ifp->private); ifp->private = NULL; free(ifp->physaddr); @@ -1772,8 +1830,7 @@ mibII_loading(const struct lmodule *mod, int loaded) mib_unregister_newif(mod); } -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmissing-variable-declarations" +extern const struct snmp_module config; const struct snmp_module config = { "This module implements the interface and ip groups.", mibII_init, @@ -1787,7 +1844,6 @@ const struct snmp_module config = { mibII_CTREE_SIZE, mibII_loading }; -#pragma GCC diagnostic push /* * Should have a list of these attached to each interface. diff --git a/snmp_mibII/mibII.h b/snmp_mibII/mibII.h index 4d82530a9f241..e84be682d7aed 100644 --- a/snmp_mibII/mibII.h +++ b/snmp_mibII/mibII.h @@ -57,8 +57,9 @@ #include "snmp_mibII.h" #include "mibII_tree.h" -/* maximum size of the interface alias */ +/* maximum size of interface alias unless overridden with net.ifdescr_maxlen */ #define MIBIF_ALIAS_SIZE (64 + 1) +#define MIBIF_ALIAS_SIZE_MAX 1024 /* * Interface list and flags. @@ -80,9 +81,6 @@ struct mibif_private { uint64_t hc_opackets; uint64_t hc_imcasts; uint64_t hc_ipackets; - - /* this should be made public */ - char alias[MIBIF_ALIAS_SIZE]; }; #define MIBIF_PRIV(IFP) ((struct mibif_private *)((IFP)->private)) diff --git a/snmp_mibII/mibII_interfaces.c b/snmp_mibII/mibII_interfaces.c index 03ca28c8718ef..f156dee673277 100644 --- a/snmp_mibII/mibII_interfaces.c +++ b/snmp_mibII/mibII_interfaces.c @@ -373,11 +373,6 @@ op_ifxtable(struct snmp_context *ctx, struct snmp_value *value, switch (op) { - again: - if (op != SNMP_OP_GETNEXT) - return (SNMP_ERR_NOSUCHNAME); - /* FALLTHROUGH */ - case SNMP_OP_GETNEXT: if ((ifp = NEXT_OBJECT_INT(&mibif_list, &value->var, sub)) == NULL) return (SNMP_ERR_NOSUCHNAME); @@ -460,52 +455,36 @@ op_ifxtable(struct snmp_context *ctx, struct snmp_value *value, break; case LEAF_ifHCInOctets: - if (!(ifp->flags & MIBIF_HIGHSPEED)) - goto again; value->v.counter64 = MIBIF_PRIV(ifp)->hc_inoctets; break; case LEAF_ifHCInUcastPkts: - if (!(ifp->flags & (MIBIF_VERYHIGHSPEED|MIBIF_HIGHSPEED))) - goto again; value->v.counter64 = MIBIF_PRIV(ifp)->hc_ipackets - MIBIF_PRIV(ifp)->hc_imcasts; break; case LEAF_ifHCInMulticastPkts: - if (!(ifp->flags & (MIBIF_VERYHIGHSPEED|MIBIF_HIGHSPEED))) - goto again; value->v.counter64 = MIBIF_PRIV(ifp)->hc_imcasts; break; case LEAF_ifHCInBroadcastPkts: - if (!(ifp->flags & (MIBIF_VERYHIGHSPEED|MIBIF_HIGHSPEED))) - goto again; value->v.counter64 = 0; break; case LEAF_ifHCOutOctets: - if (!(ifp->flags & MIBIF_HIGHSPEED)) - goto again; value->v.counter64 = MIBIF_PRIV(ifp)->hc_outoctets; break; case LEAF_ifHCOutUcastPkts: - if (!(ifp->flags & (MIBIF_VERYHIGHSPEED|MIBIF_HIGHSPEED))) - goto again; value->v.counter64 = MIBIF_PRIV(ifp)->hc_opackets - MIBIF_PRIV(ifp)->hc_omcasts; break; case LEAF_ifHCOutMulticastPkts: - if (!(ifp->flags & (MIBIF_VERYHIGHSPEED|MIBIF_HIGHSPEED))) - goto again; value->v.counter64 = MIBIF_PRIV(ifp)->hc_omcasts; break; case LEAF_ifHCOutBroadcastPkts: - if (!(ifp->flags & (MIBIF_VERYHIGHSPEED|MIBIF_HIGHSPEED))) - goto again; value->v.counter64 = 0; break; @@ -528,7 +507,7 @@ op_ifxtable(struct snmp_context *ctx, struct snmp_value *value, break; case LEAF_ifAlias: - ret = string_get(value, MIBIF_PRIV(ifp)->alias, -1); + ret = string_get(value, ifp->alias, ifp->alias_size - 1); break; case LEAF_ifCounterDiscontinuityTime: diff --git a/snmp_mibII/snmp_mibII.h b/snmp_mibII/snmp_mibII.h index 5df80c8eb6cd1..d524d668a857b 100644 --- a/snmp_mibII/snmp_mibII.h +++ b/snmp_mibII/snmp_mibII.h @@ -80,6 +80,9 @@ struct mibif { /* to be set by ifType specific modules. This is ifSpecific. */ struct asn_oid spec_oid; + char *alias; + size_t alias_size; + /* private data - don't touch */ void *private; }; |