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,