components/net-snmp-57/patches/010.if-mib-zone.patch
author Gowtham Thommandra <Gowtham.Thommandra@Oracle.COM>
Fri, 11 Dec 2015 03:49:26 -0800
changeset 5867 445e2cf1c845
parent 252 components/net-snmp/patches/010.if-mib-zone.patch@ee0fb1eabcbf
permissions -rw-r--r--
PSARC/2014/169 Net-snmp upgrade to version 5.7.2.1 15685782 SUNBT7005330 NET-SNMP upgrade to 5.7.2.1 15705167 SUNBT7030994 find memory leaks for snmp-notify after doing libfmnotif

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