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;