--- net-snmp-5.4.1/agent/mibgroup/kernel_sunos5.c 2009-05-11 15:32:06.000000000 -0700
+++ net-snmp-5.4.1.fix/agent/mibgroup/kernel_sunos5.c 2009-05-11 16:47:40.637063871 -0700
@@ -170,7 +170,7 @@
size_t *length, int (*comp)(void *, void *), void *arg);
static void
set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags,
- int mtu);
+ boolean_t flags_unknown, int mtu);
static int get_if_stats(mib2_ifEntry_t *ifp);
#if defined(HAVE_IF_NAMEINDEX) && defined(NETSNMP_INCLUDE_IFTABLE_REWRITES)
@@ -1332,8 +1332,9 @@
mib2_ifEntry_t *ifp;
int nentries = size / sizeof(mib2_ifEntry_t);
found_e result = NOT_FOUND;
- boolean_t if_isv6;
+ boolean_t if_isv6, flags_unknown;
uint64_t if_flags;
+ short mtu = 0;
struct if_nameindex *ifname, *ifnp;
lifrp = &lifreq;
@@ -1365,6 +1366,7 @@
memcpy(lifrp->lifr_name, ifnp->if_name, LIFNAMSIZ);
if_isv6 = B_FALSE;
+ flags_unknown = B_FALSE;
if (ioctl(ifsd, SIOCGLIFFLAGS, lifrp) < 0) {
if (ifsd6 == -1) {
if ((ifsd6 = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
@@ -1373,17 +1375,19 @@
}
}
if (ioctl(ifsd6, SIOCGLIFFLAGS, lifrp) < 0) {
- snmp_log(LOG_ERR, "SIOCGLIFFLAGS %s: %s\n",
- lifrp->lifr_name, strerror(errno));
- continue;
+ DEBUGMSGTL(("kernel_sunos5",
+ "...... SIOCGLIFFLAGS failed\n"));
+ flags_unknown = B_TRUE;
}
if_isv6 = B_TRUE;
}
if_flags = lifrp->lifr_flags;
if (ioctl(if_isv6?ifsd6:ifsd, SIOCGLIFMTU, lifrp) < 0) {
+ mtu = 0;
DEBUGMSGTL(("kernel_sunos5", "...... SIOCGLIFMTU failed\n"));
- continue;
+ } else {
+ mtu = lifrp->lifr_mtu;
}
memset(ifp, 0, sizeof(mib2_ifEntry_t));
@@ -1398,11 +1402,12 @@
}
set_if_info(ifp, ifnp->if_index, ifnp->if_name, if_flags,
- lifrp->lifr_metric);
+ flags_unknown, mtu);
if (get_if_stats(ifp) < 0) {
+ snmp_log(LOG_ERR, "Failed to get interface statistics for %s\n",
+ ifnp->if_name);
DEBUGMSGTL(("kernel_sunos5", "...... get_if_stats failed\n"));
- continue;
}
/*
@@ -1581,7 +1586,7 @@
static void
set_if_info(mib2_ifEntry_t *ifp, unsigned index, char *name, uint64_t flags,
- int mtu)
+ boolean_t flags_unknown, int mtu)
{
boolean_t havespeed = B_FALSE;
@@ -1592,7 +1597,10 @@
ifp->ifDescr.o_length = strlen(name);
strcpy(ifp->ifDescr.o_bytes, name);
ifp->ifAdminStatus = (flags & IFF_UP) ? 1 : 2;
- ifp->ifOperStatus = ((flags & IFF_UP) && (flags & IFF_RUNNING)) ? 1 : 2;
+ if (flags_unknown)
+ ifp->ifOperStatus = 4; /* status unknown */
+ else
+ ifp->ifOperStatus = ((flags & IFF_UP) && (flags & IFF_RUNNING)) ? 1 : 2;
ifp->ifLastChange = 0; /* Who knows ... */
ifp->flags = flags;
ifp->ifMtu = mtu;