Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > c0394d3068b44395994f031447c8052d > files > 15

net-snmp-5.3.2.2-7.el5_4.2.src.rpm

256041: icmpStatsTable is not reported correctly

Source: http://net-snmp.svn.sourceforge.net/viewvc/net-snmp/trunk/net-snmp/agent/mibgroup/mibII/icmp.c?r1=16328&r2=16391&view=patch
Source: http://sourceforge.net/tracker/index.php?func=detail&aid=1823465&group_id=12694&atid=312694
Reviewed-By: Jan Safranek <jsafrane@redhat.com>

Index: net-snmp-upstream/agent/mibgroup/mibII/icmp.c
===================================================================
--- net-snmp-upstream/agent/mibgroup/mibII/icmp.c	(revision 16328)
+++ net-snmp-upstream/agent/mibgroup/mibII/icmp.c	(revision 16391)
@@ -1,6 +1,5 @@
 /*
  *  ICMP MIB group implementation - icmp.c
- *
  */
 
 #include <net-snmp/net-snmp-config.h>
@@ -68,14 +67,14 @@
 
 #ifdef linux
 struct icmp_stats_table_entry {
-	__uint32_t ipVer;
-        __uint32_t icmpStatsInMsgs;
-        __uint32_t icmpStatsInErrors;
-        __uint32_t icmpStatsOutMsgs;
-        __uint32_t icmpStatsOutErrors;
+	uint32_t ipVer;
+        uint32_t icmpStatsInMsgs;
+        uint32_t icmpStatsInErrors;
+        uint32_t icmpStatsOutMsgs;
+        uint32_t icmpStatsOutErrors;
 };
 
-struct icmp_stats_table_entry icmp_stats_table[3];
+struct icmp_stats_table_entry icmp_stats_table[2];
  
 int
 icmp_stats_load(netsnmp_cache *cache, void *vmagic)
@@ -92,9 +91,9 @@
 	int i;
 	struct icmp_mib v4icmp;
 	struct icmp6_mib v6icmp;
-	for(i=0;i<3;i++) {
+	for(i=0;i<2;i++) {
 		switch(i) {
-			case 1:
+			case 0:
 				linux_read_icmp_stat(&v4icmp);
 				icmp_stats_table[i].icmpStatsInMsgs = v4icmp.icmpInMsgs;
 				icmp_stats_table[i].icmpStatsInErrors = v4icmp.icmpInErrors;
@@ -113,7 +112,7 @@
 					v6icmp.icmp6OutParmProblems;
 				break;
 		}
-		icmp_stats_table[i].ipVer=i;
+		icmp_stats_table[i].ipVer=i+1;
 	}
 
 	return 0;
@@ -128,7 +127,7 @@
 	int i = (int)(*loop_context);
 	netsnmp_variable_list *idx = index;
 
-	if(i > 2)
+	if(i > 1)
 		return NULL;
 
 
@@ -136,37 +135,9 @@
 	 *set IP version
 	 */
 	snmp_set_var_typed_value(idx, ASN_INTEGER, (u_char *)&icmp_stats_table[i].ipVer,
-                                sizeof(__uint32_t));
+                                sizeof(uint32_t));
 	idx = idx->next_variable;
 
-
-	/*
-	 * set icmpStatsInMsgs
-	 */
-	snmp_set_var_typed_value(idx, ASN_COUNTER, (u_char *)&icmp_stats_table[i].icmpStatsInMsgs,
-                                sizeof(__uint32_t));
-	idx = idx->next_variable;
-
-	/*
-	 * set icmpStatsInErrors
-	 */
-	snmp_set_var_typed_value(idx, ASN_COUNTER, (u_char *)&icmp_stats_table[i].icmpStatsInErrors,
-                                sizeof(__uint32_t));
-	idx = idx->next_variable;
-
-	/*
-	 * set icmpStatsOutMsgs
-	 */
-	snmp_set_var_typed_value(idx, ASN_COUNTER, (u_char *)&icmp_stats_table[i].icmpStatsOutMsgs,
-                                sizeof(__uint32_t));
-	idx = idx->next_variable;
-
-	/*
-	 * set icmpStatsOutErrors
-	 */
-	snmp_set_var_typed_value(idx, ASN_COUNTER, (u_char *)&icmp_stats_table[i].icmpStatsOutErrors,
-                                sizeof(__uint32_t));
-
 	*data_context = &icmp_stats_table[i];
 
 	*loop_context = (void *)(++i);
@@ -202,17 +173,6 @@
     reginfo = netsnmp_create_handler_registration("icmp", icmp_handler,
 		    icmp_oid, OID_LENGTH(icmp_oid), HANDLER_CAN_RONLY);
     netsnmp_register_scalar_group(reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS);
-    /*
-     * .... with a local cache
-     *    (except for HP-UX 11, which extracts objects individually)
-     */
-#ifndef hpux11
-    netsnmp_inject_handler( reginfo,
-		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
-			   		icmp_load, icmp_free,
-					icmp_oid, OID_LENGTH(icmp_oid)));
-#endif
-
 #ifdef linux
     reginfo = netsnmp_create_handler_registration("icmpStatsTable",
 		icmp_stats_table_handler, icmp_stats_tbl_oid,
@@ -223,13 +183,9 @@
         return;
     }
 
-    netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER,
-                                                 ASN_COUNTER,
-                                                 ASN_COUNTER,
-                                                 ASN_COUNTER,
-                                                 ASN_COUNTER, 0);
-    table_info->min_column = 1;
-    table_info->max_column = 5;
+    netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, 0);
+    table_info->min_column = ICMP_STAT_INMSG;
+    table_info->max_column = ICMP_STAT_OUTERR;
 
 
     iinfo      = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
@@ -242,6 +198,16 @@
 
     netsnmp_register_table_iterator(reginfo, iinfo);
 #endif
+    /*
+     * .... with a local cache
+     *    (except for HP-UX 11, which extracts objects individually)
+     */
+#ifndef hpux11
+    netsnmp_inject_handler( reginfo,
+		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
+			   		icmp_load, icmp_free,
+					icmp_oid, OID_LENGTH(icmp_oid)));
+#endif
 #ifdef USING_MIBII_IP_MODULE
     if (++ip_module_count == 2)
         REGISTER_SYSOR_TABLE(ip_module_oid, ip_module_oid_len,
@@ -704,6 +670,7 @@
 }
 
 
+#ifdef linux
 int
 icmp_stats_table_handler(netsnmp_mib_handler  *handler,
                  netsnmp_handler_registration *reginfo,
@@ -727,25 +694,21 @@
 				subid      = table_info->colnum;
 
 				switch (subid) {
-					case ICMP_STAT_IPVER:
-						snmp_set_var_typed_value(requestvb, ASN_INTEGER,
-							(u_char *)&entry->ipVer, sizeof(__uint32_t));
-						break;
 					case ICMP_STAT_INMSG:
 						snmp_set_var_typed_value(requestvb, ASN_COUNTER,
-							(u_char *)&entry->icmpStatsInMsgs, sizeof(__uint32_t));
+							(u_char *)&entry->icmpStatsInMsgs, sizeof(uint32_t));
 						break;	
 					case ICMP_STAT_INERR:
 						snmp_set_var_typed_value(requestvb, ASN_COUNTER,
-							(u_char *)&entry->icmpStatsInErrors, sizeof(__uint32_t));
+							(u_char *)&entry->icmpStatsInErrors, sizeof(uint32_t));
 						break;
 					case ICMP_STAT_OUTMSG:
 						snmp_set_var_typed_value(requestvb, ASN_COUNTER,
-							(u_char *)&entry->icmpStatsOutMsgs, sizeof(__uint32_t));
+							(u_char *)&entry->icmpStatsOutMsgs, sizeof(uint32_t));
 						break;
 					case ICMP_STAT_OUTERR:
 						snmp_set_var_typed_value(requestvb, ASN_COUNTER,
-							(u_char *)&entry->icmpStatsOutErrors, sizeof(__uint32_t));
+							(u_char *)&entry->icmpStatsOutErrors, sizeof(uint32_t));
 						break;
 					default:
 						snmp_log(LOG_WARNING, "mibII/icmpStatsTable: Unrecognised column (%d)\n",(int)subid);
@@ -772,6 +735,7 @@
 
 	return SNMP_ERR_NOERROR;
 }
+#endif		/* linux */
 
         /*********************
 	 *
--- orig/agent/mibgroup/mibII/icmp.c	2007-10-31 15:03:26.000000000 +0100
+++ net-snmp-5.3.1/agent/mibgroup/mibII/icmp.c	2007-10-31 15:07:02.000000000 +0100
@@ -443,6 +443,16 @@
     reginfo = netsnmp_create_handler_registration("icmp", icmp_handler,
 		    icmp_oid, OID_LENGTH(icmp_oid), HANDLER_CAN_RONLY);
     netsnmp_register_scalar_group(reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS);
+    /*
+     * .... with a local cache
+     *    (except for HP-UX 11, which extracts objects individually)
+     */
+#ifndef hpux11
+    netsnmp_inject_handler( reginfo,
+		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
+			   		icmp_load, icmp_free,
+					icmp_oid, OID_LENGTH(icmp_oid)));
+#endif
 #ifdef linux
     
     /* register icmpStatsTable */
@@ -469,8 +479,11 @@
     iinfo->table_reginfo        = table_info;
 
     netsnmp_register_table_iterator(reginfo, iinfo);
+    netsnmp_inject_handler( reginfo,
+		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
+			   		icmp_load, icmp_free,
+			   		icmp_stats_tbl_oid, OID_LENGTH(icmp_stats_tbl_oid)));
 
-    
     /* register icmpMsgStatsTable */
     msg_stats_reginfo = netsnmp_create_handler_registration("icmpMsgStatsTable",
 		icmp_msg_stats_table_handler, icmp_msg_stats_tbl_oid,
@@ -498,17 +511,8 @@
 		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
 			   		icmp_load, icmp_free,
 			   		icmp_msg_stats_tbl_oid, OID_LENGTH(icmp_msg_stats_tbl_oid)));
-#endif
-    /*
-     * .... with a local cache
-     *    (except for HP-UX 11, which extracts objects individually)
-     */
-#ifndef hpux11
-    netsnmp_inject_handler( reginfo,
-		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
-			   		icmp_load, icmp_free,
-					icmp_oid, OID_LENGTH(icmp_oid)));
-#endif
+#endif /* linux */
+    
 #ifdef USING_MIBII_IP_MODULE
     if (++ip_module_count == 2)
         REGISTER_SYSOR_TABLE(ip_module_oid, ip_module_oid_len,