Sophie

Sophie

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

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

diff -up net-snmp-5.3.2.2/agent/mibgroup/mibII/icmp.c.icmp-msg-stats-table2 net-snmp-5.3.2.2/agent/mibgroup/mibII/icmp.c
--- net-snmp-5.3.2.2/agent/mibgroup/mibII/icmp.c.icmp-msg-stats-table2	2008-07-10 16:24:02.000000000 +0200
+++ net-snmp-5.3.2.2/agent/mibgroup/mibII/icmp.c	2008-07-10 16:24:02.000000000 +0200
@@ -143,156 +143,206 @@ int
 icmp_msg_stats_load(netsnmp_cache *cache, void *vmagic)
 {
 	struct icmp_mib v4icmp;
+	struct icmp4_msg_mib v4icmpmsg;
 	struct icmp6_mib v6icmp;
-	int i;
+	struct icmp6_msg_mib v6icmp_msg;
+	int i, j, k = 0, flag = 0, inc = 0;
 	
 	memset(&icmp_msg_stats_table, 0, sizeof(icmp_msg_stats_table));
-	linux_read_icmp_stat(&v4icmp);
-	
-	/* set the IP version and default flags */
-	for (i=0; i<ICMP_MSG_STATS_IPV4_COUNT; i++) {
-		icmp_msg_stats_table[i].ipVer = 1;
-		icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
-	}
-#ifdef INET6
-	for (i=0; i<ICMP_MSG_STATS_IPV6_COUNT; i++) {
-		icmp_msg_stats_table[ICMP_MSG_STATS_IPV4_COUNT+i].ipVer = 2;
-		icmp_msg_stats_table[ICMP_MSG_STATS_IPV4_COUNT+i].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
-	}
-#endif /* INET6 */
-	
+	linux_read_icmp_msg_stat(&v4icmp, &v4icmpmsg, &flag);
 	i=0;
+        if (flag) {	
+	   	while (k != 254) {
+                       if (v4icmpmsg.vals[k].InType) {
+                           icmp_msg_stats_table[i].ipVer = 1;
+                           icmp_msg_stats_table[i].icmpMsgStatsType = k;
+                           icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmpmsg.vals[k].InType;
+                           icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_IN;
+                           inc = 1; /*Set this if we found a valid entry */
+                       }
+                       if (v4icmpmsg.vals[k].OutType) {
+                           icmp_msg_stats_table[i].ipVer = 1;
+                           icmp_msg_stats_table[i].icmpMsgStatsType = k;
+                           icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmpmsg.vals[k].OutType;
+                           icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_OUT;
+                           inc = 1; /*Set this if we found a valid entry */
+                       }
+                       if (inc) {
+                           i++;
+                           inc = 0;
+                       }
+                       k++;
+                }
+	} else {
+        	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ECHOREPLY;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInEchoReps;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutEchoReps;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_DEST_UNREACH;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInDestUnreachs;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutDestUnreachs;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ECHOREPLY;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInEchoReps;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutEchoReps;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_SOURCE_QUENCH;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInSrcQuenchs;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutSrcQuenchs;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_DEST_UNREACH;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInDestUnreachs;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutDestUnreachs;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_SOURCE_QUENCH;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInSrcQuenchs;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutSrcQuenchs;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_REDIRECT;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInRedirects;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutRedirects;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ECHO;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInEchos;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutEchos;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIME_EXCEEDED;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimeExcds;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimeExcds;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_PARAMETERPROB;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInParmProbs;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutParmProbs;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIMESTAMP;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimestamps;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimestamps;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIMESTAMPREPLY;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimestampReps;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimestampReps;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ADDRESS;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInAddrMasks;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutAddrMasks;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ADDRESSREPLY;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInAddrMaskReps;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutAddrMaskReps;
-	i++;
-
-#ifdef INET6
-	linux_read_icmp6_stat(&v6icmp);
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_DST_UNREACH;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InDestUnreachs;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutDestUnreachs;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_REDIRECT;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInRedirects;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutRedirects;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_PACKET_TOO_BIG;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InPktTooBigs;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutPktTooBigs;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ECHO;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInEchos;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutEchos;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_TIME_EXCEEDED;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InTimeExcds;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutTimeExcds;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIME_EXCEEDED;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimeExcds;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimeExcds;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_PARAM_PROB;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InParmProblems;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutParmProblems;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_PARAMETERPROB;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInParmProbs;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutParmProbs;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_ECHO_REQUEST;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InEchos;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
-	icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIMESTAMP;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimestamps;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimestamps;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_ECHO_REPLY;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InEchoReplies;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutEchoReplies;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_TIMESTAMPREPLY;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInTimestampReps;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutTimestampReps;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_QUERY;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembQueries;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
-	icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ADDRESS;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInAddrMasks;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutAddrMasks;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_REPORT;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembResponses;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutGroupMembResponses;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP_ADDRESSREPLY;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v4icmp.icmpInAddrMaskReps;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v4icmp.icmpOutAddrMaskReps;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_REDUCTION;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembReductions;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutGroupMembReductions;
-	i++;
+		/* set the IP version and default flags */
+		for (j=0; j<ICMP_MSG_STATS_IPV4_COUNT; j++) {
+		     icmp_msg_stats_table[j].ipVer = 1;
+		     icmp_msg_stats_table[j].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
+		}
+	}
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ND_ROUTER_SOLICIT;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRouterSolicits;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutRouterSolicits;
-	i++;
+#ifdef INET6
+        flag = 0;
+        k = 0;
+        inc = 0;
+	linux_read_icmp6_msg_stat(&v6icmp, &v6icmp_msg, &flag);
+	if (flag) {
+	    while (k != 254) {
+                   if (v6icmp_msg.vals[k].InType) {
+                       icmp_msg_stats_table[i].ipVer = 2;
+                       icmp_msg_stats_table[i].icmpMsgStatsType = k;
+		       icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp_msg.vals[k].InType;
+		       icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_IN;
+                       inc = 1; /*Set this if we found a valid entry */
+                   } 
+                   if (v6icmp_msg.vals[k].OutType) {
+                       icmp_msg_stats_table[i].ipVer = 2;
+                       icmp_msg_stats_table[i].icmpMsgStatsType = k;
+		       icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp_msg.vals[k].OutType; 
+		       icmp_msg_stats_table[i].flags = icmp_msg_stats_table[i].flags | ICMP_MSG_STATS_HAS_OUT;
+                       inc = 1; /*Set this if we found a valid entry */
+                   }
+                   if (inc) {	
+                       i++;
+                       inc = 0;
+                   }
+                   k++;
+            }
+	} else {
+
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_DST_UNREACH;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InDestUnreachs;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutDestUnreachs;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_PACKET_TOO_BIG;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InPktTooBigs;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutPktTooBigs;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_TIME_EXCEEDED;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InTimeExcds;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutTimeExcds;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ND_ROUTER_ADVERT;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRouterAdvertisements;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
-	icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_PARAM_PROB;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InParmProblems;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutParmProblems;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_ECHO_REQUEST;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InEchos;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
+		icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = ICMP6_ECHO_REPLY;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InEchoReplies;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutEchoReplies;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_QUERY;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembQueries;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
+		icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_REPORT;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembResponses;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutGroupMembResponses;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = MLD_LISTENER_REDUCTION;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InGroupMembReductions;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutGroupMembReductions;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = ND_ROUTER_SOLICIT;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRouterSolicits;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutRouterSolicits;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = ND_ROUTER_ADVERT;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRouterAdvertisements;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = 0;
+		icmp_msg_stats_table[i].flags = ICMP_MSG_STATS_HAS_IN;
+		i++;
+		
+		icmp_msg_stats_table[i].icmpMsgStatsType = ND_NEIGHBOR_SOLICIT;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InNeighborSolicits;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutNeighborSolicits;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ND_NEIGHBOR_SOLICIT;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InNeighborSolicits;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutNeighborSolicits;
-	i++;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ND_NEIGHBOR_ADVERT;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InNeighborAdvertisements;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutNeighborAdvertisements;
+		i++;
 	
-	icmp_msg_stats_table[i].icmpMsgStatsType = ND_NEIGHBOR_ADVERT;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InNeighborAdvertisements;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutNeighborAdvertisements;
-	i++;
-
-	icmp_msg_stats_table[i].icmpMsgStatsType = ND_REDIRECT;
-	icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRedirects;
-	icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutRedirects;
+		icmp_msg_stats_table[i].icmpMsgStatsType = ND_REDIRECT;
+		icmp_msg_stats_table[i].icmpMsgStatsInPkts = v6icmp.icmp6InRedirects;
+		icmp_msg_stats_table[i].icmpMsgStatsOutPkts = v6icmp.icmp6OutRedirects;
+		for (j=0; j<ICMP_MSG_STATS_IPV6_COUNT; j++) {
+		     icmp_msg_stats_table[ICMP_MSG_STATS_IPV4_COUNT+j].ipVer = 2;
+		     icmp_msg_stats_table[ICMP_MSG_STATS_IPV4_COUNT+j].flags = ICMP_MSG_STATS_HAS_IN | ICMP_MSG_STATS_HAS_OUT;
+		}
 #endif /* INET6 */
 	
+	}
 	return 0;
 }
 
@@ -1178,7 +1228,6 @@ int
 icmp_load(netsnmp_cache *cache, void *vmagic)
 {
     long            ret_value = -1;
-
     ret_value = linux_read_icmp_stat(&icmpstat);
 
     if ( ret_value < 0 ) {
diff -up net-snmp-5.3.2.2/agent/mibgroup/mibII/kernel_linux.c.icmp-msg-stats-table2 net-snmp-5.3.2.2/agent/mibgroup/mibII/kernel_linux.c
--- net-snmp-5.3.2.2/agent/mibgroup/mibII/kernel_linux.c.icmp-msg-stats-table2	2008-07-10 16:24:02.000000000 +0200
+++ net-snmp-5.3.2.2/agent/mibgroup/mibII/kernel_linux.c	2008-07-10 16:31:48.000000000 +0200
@@ -17,47 +17,52 @@
 #include <sys/param.h>
 #endif
 
+#include <errno.h>
 #include "kernel_linux.h"
 
-struct ip_mib   cached_ip_mib;
-struct ip6_mib   cached_ip6_mib;
-struct icmp_mib cached_icmp_mib;
-struct icmp6_mib cached_icmp6_mib;
-struct tcp_mib  cached_tcp_mib;
-struct udp_mib  cached_udp_mib;
-struct udp6_mib  cached_udp6_mib;
+struct ip_mib        cached_ip_mib;
+struct ip6_mib       cached_ip6_mib;
+struct icmp_mib      cached_icmp_mib;
+struct icmp6_mib     cached_icmp6_mib;
+struct icmp4_msg_mib cached_icmp4_msg_mib;
+struct tcp_mib       cached_tcp_mib;
+struct udp_mib       cached_udp_mib;
+struct udp6_mib      cached_udp6_mib;
 
 #define IP_STATS_LINE	"Ip: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu"
 #define ICMP_STATS_LINE	"Icmp: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu"
+#define ICMP_MSG_STATS_LINE "IcmpMsg: "
 #define TCP_STATS_LINE	"Tcp: %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu"
 #define UDP_STATS_LINE	"Udp: %lu %lu %lu %lu"
-#define UDP6_STATS_LINE "Udp6"
-
-#define IP_STATS_PREFIX_LEN	4
-#define ICMP_STATS_PREFIX_LEN	6
-#define TCP_STATS_PREFIX_LEN	5
-#define UDP_STATS_PREFIX_LEN	5
-#define UDP6_STATS_PREFIX_LEN   4
+#define IP6_STATS_LINE   "Ip6"
+#define ICMP6_STATS_LINE "Icmp6"
+#define UDP6_STATS_LINE  "Udp6"
+
+#define IP_STATS_PREFIX_LEN       4
+#define ICMP_STATS_PREFIX_LEN     6
+#define ICMP_MSG_STATS_PREFIX_LEN 9
+#define TCP_STATS_PREFIX_LEN	  5
+#define UDP_STATS_PREFIX_LEN	  5
+#define IP6_STATS_PREFIX_LEN      3
+#define ICMP6_STATS_PREFIX_LEN    5
+#define UDP6_STATS_PREFIX_LEN     4
 
 
 int
 linux_read_mibII_stats(void)
 {
     FILE           *in = fopen("/proc/net/snmp", "r");
-#ifdef NETSNMP_ENABLE_IPV6
-    FILE           *in6;
-    unsigned long   value;
-#endif
-    char            line[1024];
-    unsigned long *snmp6_ptr = NULL;
-    int i;
-    int ret = -1;
+    char            line[1024], data[1024];
+    int ret = 0;
+    int flag = 0;
     if (!in) {
-        DEBUGMSGTL(("mibII/kernel_linux","Unable to open /proc/net/snmp"));
+        DEBUGMSGTL(("mibII/kernel_linux","Unable to open /proc/net/snmp")); 
         return -1;
     }
 
 
+    memset(&line, '\0', sizeof(line));
+    memset(&data, '\0', sizeof(data));
     while (line == fgets(line, sizeof(line), in)) {
         if (!strncmp(line, IP_STATS_LINE, IP_STATS_PREFIX_LEN)) {
             sscanf(line, IP_STATS_LINE,
@@ -109,6 +114,17 @@ linux_read_mibII_stats(void)
                    &cached_icmp_mib.icmpOutTimestampReps,
                    &cached_icmp_mib.icmpOutAddrMasks,
                    &cached_icmp_mib.icmpOutAddrMaskReps);
+	} else if (!strncmp(line, ICMP_MSG_STATS_LINE, ICMP_MSG_STATS_PREFIX_LEN)) {
+	    /* Note : We have to do this differently from other stats as the counters *
+	     * to this stats are dynamic. So we will not know the number of counters  *
+	     * at a given time.							      */
+	    fgets(data, sizeof(data), in);
+	    if(decode_icmp_msg(line + ICMP_MSG_STATS_PREFIX_LEN,
+			       data + ICMP_MSG_STATS_PREFIX_LEN,
+			       &cached_icmp4_msg_mib) < 0) {
+		continue;
+	    }
+            ret = 1;	
         } else if (!strncmp(line, TCP_STATS_LINE, TCP_STATS_PREFIX_LEN)) {
             int             ret = sscanf(line, TCP_STATS_LINE,
                                          &cached_tcp_mib.tcpRtoAlgorithm,
@@ -181,50 +197,62 @@ linux_read_mibII_stats(void)
      */
     if (!cached_tcp_mib.tcpRtoAlgorithm)
         cached_tcp_mib.tcpRtoAlgorithm = 1;
+    
+    return ret;
+}
 
-    snmp_log(LOG_CRIT, "MIBII: READING SNMP6 STATS\n");
-    in = fopen("/proc/net/snmp6","r");
-
-    if (!in)
-       return -1;
-
-    /*
-     * lets try to accelerate this a bit
-     * by assuming we know the order that 
-     * the file is in (which we really should)
-     */
-    for (snmp6_ptr = (unsigned long *)&cached_ip6_mib, i=0;
-	 i < (sizeof(struct ip6_mib)/sizeof(unsigned long));
-         snmp6_ptr++, i++) {
-
-        if (EOF == fscanf(in, "%*s %lu",snmp6_ptr))
-		goto out;
-	snmp_log(LOG_ERR, "SNMP6: READ VALUE %lu\n",*snmp6_ptr);
-    }
-
-    for (snmp6_ptr = (unsigned long *)&cached_icmp6_mib, i=0;
-         i < (sizeof(struct icmp6_mib)/sizeof(unsigned long));
-         snmp6_ptr++, i++) {
-
-        if (EOF == fscanf(in, "%*s %lu\n",snmp6_ptr))
-		goto out;
-	snmp_log(LOG_ERR, "SNMP6: READ VALUE %lu\n",*snmp6_ptr);
-    }
-
-    for (snmp6_ptr = (unsigned long *)&cached_udp6_mib, i=0;
-         i < (sizeof(struct udp6_mib)/sizeof(unsigned long));
-         snmp6_ptr++, i++) {
-
-        if (EOF == fscanf(in, "%*s %lu\n",snmp6_ptr))
-		goto out;
-	snmp_log(LOG_ERR, "SNMP6: READ VALUE %lu\n",*snmp6_ptr);
+int
+decode_icmp_msg(char *line, char *data, struct icmp4_msg_mib *msg)
+{
+    char *token, *saveptr, *lineptr, *saveptr1, *dataptr, *delim = NULL;
+    char line_cpy[1024];
+    char data_cpy[1024];
+    long index;
+
+    if(data == NULL)
+       return -1;    
+    memset(&line_cpy, '\0', sizeof(line_cpy));
+    memset(&data_cpy, '\0', sizeof(data_cpy));
+    /*Since we are using strtok, there is a possiblity of the orginal data getting modified *
+     *So we take a local copy for this purpose even though its expensive.                   */
+    memcpy(&line_cpy, line, sizeof(line_cpy));
+    memcpy(&data_cpy, data, sizeof(data_cpy));
+    lineptr = line_cpy;
+    dataptr = data_cpy;
+    while(1) {
+          if((token = strtok_r(lineptr, " ", &saveptr)) == NULL)
+              break;
+          lineptr = NULL;
+          errno = 0;
+          if(strncmp(strsep(&token, "e"),"OutTyp",6) == 0) {
+              index = strtol(token, &delim, 0);
+              if (ERANGE == errno) {
+                  continue;
+       	      } else if (index > LONG_MAX) {
+                  continue;
+              } else if (index < LONG_MIN) {
+                  continue;
+              }
+              if((token = strtok_r(dataptr, " ", &saveptr1)) == NULL)
+                  break;
+              dataptr = NULL;
+              msg->vals[index].OutType =  atoi(token);
+          } else {
+              index = strtol(token, &delim, 0);
+              if (ERANGE == errno) {
+                  continue;
+       	      } else if (index > LONG_MAX) {
+                  continue;
+              } else if (index < LONG_MIN) {
+                  continue;
+              }
+              if((token = strtok_r(dataptr, " ", &saveptr1)) == NULL)
+                  break;
+              dataptr = NULL;
+              msg->vals[index].InType = atoi(token);
+          }
     }
- 
-    ret = 0; 
-out: 
-    fclose(in);
- 
-    return ret;
+    return 0;
 }
 
 int
@@ -239,31 +267,353 @@ linux_read_ip_stat(struct ip_mib *ipstat
 
 int linux_read_ip6_stat( struct ip6_mib *ip6stat)
 {
+#ifdef INET6
+    FILE           *in;
+    char            line[1024];
+    unsigned long   stats;
+    char           *endp;
+    int             match;
+#endif
 
     memset((char *) ip6stat, (0), sizeof(*ip6stat));
-    if (linux_read_mibII_stats() == -1)
-        return -1;
+
+#ifdef INET6
+    DEBUGMSGTL(("mibII/kernel_linux/ip6stats",
+                "Reading /proc/net/snmp6 stats\n"));
+    if (NULL == (in = fopen("/proc/net/snmp6", "r"))) {
+        DEBUGMSGTL(("mibII/kernel_linua/ip6stats",
+                    "Failed to open /proc/net/snmp6\n"));
+       return -1;
+    }
+
+    while (NULL != fgets(line, sizeof(line), in)) {
+        if (0 != strncmp(line, IP6_STATS_LINE, IP6_STATS_PREFIX_LEN))
+            continue;
+
+        if (1 != sscanf(line, "%*s %lu", &stats))
+            continue;
+
+        endp = strchr(line, ' ');
+        *endp = '\0';
+        DEBUGMSGTL(("mibII/kernel_linux/ip6stats", "Find tag: %s\n", line));
+
+        match = 1;
+        if ('I' == line[3]) {           /* In */
+            if ('A' == line[5]) {
+                cached_ip6_mib.ip6InAddrErrors = stats;
+            } else if ('D' == line[5]) {
+                if ('e' == line[6]) {
+                    cached_ip6_mib.ip6InDelivers = stats;
+                } else if ('i' == line[6]) {
+                    cached_ip6_mib.ip6InDiscards = stats;
+                } else {
+                    match = 0;
+                }
+            } else if ('H' == line[5]) {
+                cached_ip6_mib.ip6InHdrErrors = stats;
+            } else if ('M' == line[5]) {
+                cached_ip6_mib.ip6InMcastPkts = stats;
+            } else if ('N' == line[5]) {
+                cached_ip6_mib.ip6InNoRoutes = stats;
+            } else if ('R' == line[5]) {
+                cached_ip6_mib.ip6InReceives = stats;
+            } else if ('T' == line[5]) {
+                if ('r' == line[6]) {
+                    cached_ip6_mib.ip6InTruncatedPkts = stats;
+                } else if ('o' == line[6]) {
+                    cached_ip6_mib.ip6InTooBigErrors = stats;
+                } else {
+                    match = 0;
+                }
+            } else if ('U' == line[5]) {
+                cached_ip6_mib.ip6InUnknownProtos = stats;
+            } else {
+                match = 0;
+            }
+        } else if ('O' == line[3]) {    /* Out */
+            if ('D' == line[6]) {
+                cached_ip6_mib.ip6OutDiscards = stats;
+            } else if ('F' == line[6]) {
+                cached_ip6_mib.ip6OutForwDatagrams = stats;
+            } else if ('M' == line[6]) {
+                cached_ip6_mib.ip6OutMcastPkts = stats;
+            } else if ('N' == line[6]) {
+                cached_ip6_mib.ip6OutNoRoutes = stats;
+            } else if ('R' == line[6]) {
+                cached_ip6_mib.ip6OutRequests = stats;
+            } else {
+                match = 0;
+            }
+        } else if ('R' == line[3]) {    /* Reasm */
+            if ('F' == line[8]) {
+                cached_ip6_mib.ip6ReasmFails = stats;
+            } else if ('O' == line[8]) {
+                cached_ip6_mib.ip6ReasmOKs = stats;
+            } else if ('R' == line[8]) {
+                cached_ip6_mib.ip6ReasmReqds = stats;
+            } else if ('T' == line[8]) {
+                cached_ip6_mib.ip6ReasmTimeout = stats;
+            } else {
+                match = 0;
+            }
+        } else if ('F' == line[3]) {    /* Frag */
+            if ('C' == line[7]) {
+                cached_ip6_mib.ip6FragCreates = stats;
+            } else if ('F' == line[7]) {
+                cached_ip6_mib.ip6FragFails = stats;
+            } else if ('O' == line[7]) {
+                cached_ip6_mib.ip6FragOKs = stats;
+            } else {
+                match = 0;
+            }
+        } else {
+            match = 0;
+        }
+
+        if(!match)
+            DEBUGMSGTL(("mibII/kernel_linux/ip6stats",
+                        "%s is an unknown tag\n", line));
+    }
+ 
+    fclose(in);
+#endif 
+
     memcpy((char *) ip6stat, (char *) &cached_ip6_mib, sizeof(*ip6stat));
 }
 
 int
+linux_read_icmp_msg_stat(struct icmp_mib *icmpstat, struct icmp4_msg_mib *icmpmsgstat, int *flag)
+{
+    int ret;
+    memset((char *) icmpstat, (0), sizeof(*icmpstat));
+    memset((char *) icmpmsgstat, (0), sizeof(*icmpmsgstat));
+    if ((ret = linux_read_mibII_stats()) == -1)
+        return -1;
+    if(ret) {
+       memcpy((char *) icmpmsgstat, (char *) &cached_icmp4_msg_mib,
+               sizeof(*icmpmsgstat));
+       *flag = 1; /* We have a valid icmpmsg */
+    }
+
+    memcpy((char *) icmpstat, (char *) &cached_icmp_mib,
+            sizeof(*icmpstat));
+    return 0;
+}
+
+
+int
 linux_read_icmp_stat(struct icmp_mib *icmpstat)
 {
     memset((char *) icmpstat, (0), sizeof(*icmpstat));
     if (linux_read_mibII_stats() == -1)
         return -1;
+
     memcpy((char *) icmpstat, (char *) &cached_icmp_mib,
-           sizeof(*icmpstat));
+            sizeof(*icmpstat));
     return 0;
 }
 
+int
+linux_read_icmp6_msg_stat(struct icmp6_mib *icmp6stat, 
+		          struct icmp6_msg_mib *icmp6msgstat,
+			  int *support)
+{
+     if (linux_read_icmp6_parse(icmp6stat, icmp6msgstat, support) < 0)
+         return -1;
+     else
+         return 0;
 
+}
 int
 linux_read_icmp6_stat(struct icmp6_mib *icmp6stat)
 {
+   if (linux_read_icmp6_parse(icmp6stat, NULL, NULL) < 0)
+       return -1;
+   else
+       return 0;
+}
+
+int
+linux_read_icmp6_parse(struct icmp6_mib *icmp6stat, struct icmp6_msg_mib *icmp6msgstat, int *support)
+{
+#ifdef INET6
+    FILE           *in;
+    char            line[1024];
+    char 	    name[255];
+    unsigned long   stats;
+    char           *endp ,*token, *vals;
+    int             match, count = 0;
+#endif
+
     memset((char *) icmp6stat, (0), sizeof(*icmp6stat));
-    if (linux_read_mibII_stats() == -1)
-        return -1;
+    if (icmp6msgstat != NULL)
+        memset((char *) icmp6msgstat, (0), sizeof(*icmp6msgstat));
+
+#ifdef INET6
+    DEBUGMSGTL(("mibII/kernel_linux/icmp6stats",
+                "Reading /proc/net/snmp6 stats\n"));
+    if (NULL == (in = fopen("/proc/net/snmp6", "r"))) {
+        DEBUGMSGTL(("mibII/kernel_linux/icmp6stats",
+                    "Failed to open /proc/net/snmp6\n"));
+       return -1;
+    }
+    while (NULL != fgets(line, sizeof(line), in)) {
+        if (0 != strncmp(line, ICMP6_STATS_LINE, ICMP6_STATS_PREFIX_LEN))
+            continue;
+
+        if (2 != sscanf(line, "%s %lu", &name, &stats))
+            continue;
+
+        endp = strchr(line, ' ');
+        *endp = '\0';
+
+        vals = &name;
+	if (icmp6msgstat != NULL) {
+            if (!strncmp(name, "Icmp6OutType", 12)) {
+                token = strsep(&vals, "e");
+	        icmp6msgstat->vals[atoi(vals)].OutType = stats;
+                *support = 1;
+	        continue;
+            } else if (!strncmp(name, "Icmp6InType", 11)) {
+                token = strsep(&vals, "e"); 
+	        icmp6msgstat->vals[atoi(vals)].InType = stats;
+                *support = 1;
+	        continue;
+            }
+        }
+        DEBUGMSGTL(("mibII/kernel_linux/icmp6stats", "Find tag: %s\n", line));
+        match = 1;
+        if ('I' == line[5]) {           /* In */
+            if ('D' == line[7]) {
+                cached_icmp6_mib.icmp6InDestUnreachs = stats;
+            } else if ('E' == line[7]) {
+                if ('c' == line[8]) {
+                    if ('s' == line[11]) {
+                        cached_icmp6_mib.icmp6InEchos = stats;
+                    } else if ('s' == line [17]) {
+                        cached_icmp6_mib.icmp6InEchoReplies = stats;
+                    } else {
+                        match = 0;
+                    }
+                } else if ('r' == line[8]) {
+                    cached_icmp6_mib.icmp6InErrors = stats;
+                } else {
+                    match = 0;
+                }
+            } else if ('G' == line[7]) {
+                if ('Q' == line[16]) {
+                    cached_icmp6_mib.icmp6InGroupMembQueries = stats;
+                } else if ('R' == line[16]) {
+                    if ('d' == line[18]) {
+                        cached_icmp6_mib.icmp6InGroupMembReductions = stats;
+                    } else if ('s' == line[18]) {
+                        cached_icmp6_mib.icmp6InGroupMembResponses = stats;
+                    } else {
+                        match = 0;
+                    }
+                } else {
+                    match = 0;
+                }
+            } else if ('M' == line[7]) {
+                cached_icmp6_mib.icmp6InMsgs = stats;
+            } else if ('N' == line[7]) {
+                if ('A' == line[15]) {
+                    cached_icmp6_mib.icmp6InNeighborAdvertisements = stats;
+                } else if ('S' == line[15]) {
+                    cached_icmp6_mib.icmp6InNeighborSolicits = stats;
+                } else {
+                    match = 0;
+                }
+            } else if ('P' == line[7]) {
+                if ('T' == line[10]) {
+                    cached_icmp6_mib.icmp6InPktTooBigs = stats;
+                } else if ('P' == line[11]) {
+                    cached_icmp6_mib.icmp6InParmProblems = stats;
+                } else {
+                    match = 0;
+                }
+            } else if ('R' == line[7]) {
+                if ('c' == line[13]) {
+                    cached_icmp6_mib.icmp6InRedirects = stats;
+                } else if ('A' == line[13]) {
+                    cached_icmp6_mib.icmp6InRouterAdvertisements = stats;
+                } else if ('S' == line[13]) {
+                    cached_icmp6_mib.icmp6InRouterSolicits = stats;
+                } else {
+                    match = 0;
+                }
+            } else if ('T' == line[7]) {
+                cached_icmp6_mib.icmp6InTimeExcds = stats;
+            } else {
+                match = 0;
+            }
+        } else if ('O' == line[5]) {            /* Out */
+            if ('D' == line[8]) {
+                cached_icmp6_mib.icmp6OutDestUnreachs = stats;
+            } else if ('E' == line[8]) {
+                if ('c' == line[9]) {
+                    if ('s' == line [18]) {
+                        cached_icmp6_mib.icmp6OutEchoReplies = stats;
+                    } else {
+                        match = 0;
+                    }
+                } else {
+                    match = 0;
+                }
+            } else if ('G' == line[8]) {
+                if ('R' == line[17]) {
+                    if ('d' == line[19]) {
+                        cached_icmp6_mib.icmp6OutGroupMembReductions = stats;
+                    } else if ('s' == line[19]) {
+                        cached_icmp6_mib.icmp6OutGroupMembResponses = stats;
+                    } else {
+                        match = 0;
+                    }
+                } else {
+                    match = 0;
+                }
+            } else if ('M' == line[8]) {
+                cached_icmp6_mib.icmp6OutMsgs = stats;
+            } else if ('N' == line[8]) {
+                if ('A' == line[16]) {
+                    cached_icmp6_mib.icmp6OutNeighborAdvertisements = stats;
+                } else if ('S' == line[16]) {
+                    cached_icmp6_mib.icmp6OutNeighborSolicits = stats;
+                } else {
+                    match = 0;
+                }
+            } else if ('P' == line[8]) {
+                if ('T' == line[11]) {
+                    cached_icmp6_mib.icmp6OutPktTooBigs = stats;
+                } else if ('P' == line[12]) {
+                    cached_icmp6_mib.icmp6OutParmProblems = stats;
+                } else {
+                    match = 0;
+                }
+            } else if ('R' == line[8]) {
+                if ('c' == line[14]) {
+                    cached_icmp6_mib.icmp6OutRedirects = stats;
+                } else if ('S' == line[14]) {
+                    cached_icmp6_mib.icmp6OutRouterSolicits = stats;
+                } else {
+                    match = 0;
+                }
+            } else if ('T' == line[8]) {
+                cached_icmp6_mib.icmp6OutTimeExcds = stats;
+            } else {
+                match = 0;
+            }
+        } else {
+            match = 0;
+        }
+        if(!match)
+            DEBUGMSGTL(("mibII/kernel_linux/icmp6stats",
+                        "%s is an unknown tag\n", line));
+    }
+
+    fclose(in);
+#endif
+
     memcpy((char *) icmp6stat, (char *) &cached_icmp6_mib,
            sizeof(*icmp6stat));
     return 0;
@@ -285,6 +635,20 @@ linux_read_udp_stat(struct udp_mib *udps
     memset((char *) udpstat, (0), sizeof(*udpstat));
     if (linux_read_mibII_stats() == -1)
         return -1;
+
+#ifdef INET6
+    {
+        struct udp6_mib udp6stat;
+        memset(&udp6stat, (0), sizeof(udp6stat));
+
+        if (linux_read_udp6_stat(&udp6stat) == 0) {
+            cached_udp_mib.udpOutDatagrams += udp6stat.udp6OutDatagrams;
+            cached_udp_mib.udpNoPorts      += udp6stat.udp6NoPorts;
+            cached_udp_mib.udpInDatagrams  += udp6stat.udp6InDatagrams;
+            cached_udp_mib.udpInErrors     += udp6stat.udp6InErrors;
+        }
+    }
+#endif
     memcpy((char *) udpstat, (char *) &cached_udp_mib, sizeof(*udpstat));
     return 0;
 }
@@ -292,9 +656,52 @@ linux_read_udp_stat(struct udp_mib *udps
 int
 linux_read_udp6_stat(struct udp6_mib *udp6stat)
 {
+#ifdef INET6
+    FILE           *in;
+    char            line[1024];
+    unsigned long   stats;
+    char           *endp;
+#endif
+
     memset((char *) udp6stat, (0), sizeof(*udp6stat));
-    if (linux_read_mibII_stats() == -1)
-        return -1;
+
+#ifdef INET6
+    DEBUGMSGTL(("mibII/kernel_linux/udp6stats",
+                "Reading /proc/net/snmp6 stats\n"));
+    if (NULL == (in = fopen("/proc/net/snmp6", "r"))) {
+        DEBUGMSGTL(("mibII/kernel_linux/udp6stats",
+                    "Failed to open /proc/net/snmp6\n"));
+       return -1;
+    }
+
+    while (NULL != fgets(line, sizeof(line), in)) {
+        if (0 != strncmp(line, UDP6_STATS_LINE, UDP6_STATS_PREFIX_LEN))
+            continue;
+
+        if (1 != sscanf(line, "%*s %lu", &stats))
+            continue;
+
+        endp = strchr(line, ' ');
+        *endp = '\0';
+        DEBUGMSGTL(("mibII/kernel_linux/udp6stats", "Find tag: %s\n", line));
+
+        if ('O' == line[4]) {
+            cached_udp6_mib.udp6OutDatagrams = stats;
+        } else if ('N' == line[4]) {
+            cached_udp6_mib.udp6NoPorts = stats;
+        } else if ('D' == line[6]) {
+            cached_udp6_mib.udp6InDatagrams = stats;
+        } else if ('E' == line[6]) {
+            cached_udp6_mib.udp6InErrors = stats;
+        } else {
+            DEBUGMSGTL(("mibII/kernel_linux/udp6stats",
+                        "%s is an unknown tag\n", line));
+        }
+    }
+ 
+    fclose(in);
+#endif
+
     memcpy((char *) udp6stat, (char *) &cached_udp6_mib, sizeof(*udp6stat));
     return 0;
 }
diff -up net-snmp-5.3.2.2/agent/mibgroup/mibII/kernel_linux.h.icmp-msg-stats-table2 net-snmp-5.3.2.2/agent/mibgroup/mibII/kernel_linux.h
--- net-snmp-5.3.2.2/agent/mibgroup/mibII/kernel_linux.h.icmp-msg-stats-table2	2008-07-10 16:24:02.000000000 +0200
+++ net-snmp-5.3.2.2/agent/mibgroup/mibII/kernel_linux.h	2008-07-10 16:24:02.000000000 +0200
@@ -114,6 +114,20 @@ struct icmp6_mib {
     unsigned long icmp6OutGroupMembReductions;
 };
 
+struct icmp_msg_mib {
+    unsigned long InType;
+    unsigned long OutType;
+};
+
+/* Lets use wrapper structures for future expansion */
+struct icmp4_msg_mib {
+    struct icmp_msg_mib vals[255];
+};
+
+struct icmp6_msg_mib {
+    struct icmp_msg_mib vals[255];
+};
+
 struct udp_mib {
     unsigned long   udpInDatagrams;
     unsigned long   udpNoPorts;