summaryrefslogtreecommitdiff
path: root/snmp_mibII
diff options
context:
space:
mode:
Diffstat (limited to 'snmp_mibII')
-rw-r--r--snmp_mibII/Makefile.in48
-rw-r--r--snmp_mibII/mibII.c72
-rw-r--r--snmp_mibII/mibII.h6
-rw-r--r--snmp_mibII/mibII_interfaces.c23
-rw-r--r--snmp_mibII/snmp_mibII.h3
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;
};