Hello, when polling some Cisco router I discovered that the perl snmp bulkwalk function did not abort bulkwalking when some of the routers did not increase their OIDs.
This patch adds an option 'NonIncreasing' to SNMP::Session->new. If this option is set, an error is return instead of bulkwalking in an never ending loop (making my life miserable :-) Can somebody review and test this patch? [This patch depends on the previous patch for the bus error] Kind regards, Ole Bjørn. rocs3(obh) net-snmp 575$ cat patch.nonincreasing diff -cr net-snmp-5.3.pre4-orig/include/net-snmp/library/snmp_api.h net-snmp-5.3.pre4-obh/include/net-snmp/library/snmp_api.h *** net-snmp-5.3.pre4-orig/include/net-snmp/library/snmp_api.h Tue Aug 30 02:24:45 2005 --- net-snmp-5.3.pre4-obh/include/net-snmp/library/snmp_api.h Tue Nov 22 15:57:21 2005 *************** *** 487,494 **** #define SNMPERR_MALLOC (-62) #define SNMPERR_KRB5 (-63) #define SNMPERR_PROTOCOL (-64) ! #define SNMPERR_MAX (-64) #define non_repeaters errstat #define max_repetitions errindex --- 493,501 ---- #define SNMPERR_MALLOC (-62) #define SNMPERR_KRB5 (-63) #define SNMPERR_PROTOCOL (-64) + #define SNMPERR_OID_NONINCREASING (-65) ! #define SNMPERR_MAX (-65) #define non_repeaters errstat #define max_repetitions errindex diff -cr net-snmp-5.3.pre4-orig/perl/SNMP/SNMP.pm net-snmp-5.3.pre4-obh/perl/SNMP/SNMP.pm *** net-snmp-5.3.pre4-orig/perl/SNMP/SNMP.pm Sun Nov 20 22:16:23 2005 --- net-snmp-5.3.pre4-obh/perl/SNMP/SNMP.pm Tue Nov 22 15:16:30 2005 *************** *** 116,121 **** --- 116,123 ---- $best_guess = 0; # determine whether or not to enable best-guess regular # expression object name translation. 1 = Regex (-Ib), # 2 = random (-IR) + $non_increasing = 0; # stop polling with an "OID not increasing"-error + # when an OID does not increases in bulkwalk. $replace_newer = 0; # determine whether or not to tell the parser to replace # older MIB modules with newer ones when loading MIBs. # WARNING: This can cause an incorrect hierarchy. *************** *** 542,547 **** --- 544,550 ---- $this->{UseSprintValue} = $SNMP::use_sprint_value unless exists $this->{UseSprintValue}; $this->{BestGuess} = $SNMP::best_guess unless exists $this->{BestGuess}; + $this->{NonIncreasing} ||= $SNMP::non_increasing; $this->{UseEnums} = $SNMP::use_enums unless exists $this->{UseEnums}; $this->{UseNumeric} = $SNMP::use_numeric unless exists $this->{UseNumeric}; *************** *** 570,575 **** --- 573,579 ---- $this->{UseSprintValue} = $SNMP::use_sprint_value unless exists $this->{UseSprintValue}; $this->{BestGuess} = $SNMP::best_guess unless exists $this->{BestGuess}; + $this->{NonIncreasing} ||= $SNMP::non_increasing; $this->{UseEnums} = $SNMP::use_enums unless exists $this->{UseEnums}; $this->{UseNumeric} = $SNMP::use_numeric unless exists $this->{UseNumeric}; *************** *** 1524,1529 **** --- 1528,1541 ---- 0 causes a regular lookup. setting to 1 causes a regular expression match (defined as -Ib in snmpcmd) and setting to 2 causes a random access lookup (defined as -IR in snmpcmd). + + =item NonIncreasing + + defaults to the value of SNMP::non_increasing at time of session + creation. this setting controls if a non-increasing OID during + bulkwalk will causes an error. setting to 0 causes the default + behaviour (which may, in very badly performing agents, result in a never-ending loop). + setting to 1 causes an error (OID not increasing) when this error occur. =item ErrorStr diff -cr net-snmp-5.3.pre4-orig/perl/SNMP/SNMP.xs net-snmp-5.3.pre4-obh/perl/SNMP/SNMP.xs *** net-snmp-5.3.pre4-orig/perl/SNMP/SNMP.xs Wed Oct 5 14:26:46 2005 --- net-snmp-5.3.pre4-obh/perl/SNMP/SNMP.xs Tue Nov 22 15:11:45 2005 *************** *** 1957,1962 **** --- 1957,1963 ---- SV **err_str_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorStr", 8, 1); SV **err_num_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorNum", 8, 1); SV **err_ind_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorInd", 8, 1); + int check = SvIV(*hv_fetch((HV*)SvRV(context->sess_ref), "NonIncreasing",13,1)); DBPRT(3, (DBOUT "bulkwalk: sess_ref = 0x%p, sess_ptr_sv = 0x%p\n", context->sess_ref, sess_ptr_sv)); *************** *** 2114,2119 **** --- 2115,2130 ---- context->reqbase[pix].last_oid, context->reqbase[pix].last_len) == 0) { + if (check) + { + DBPRT(2, (DBOUT "Error: OID not increasing: %s\n", + snprint_objid(_debugx, sizeof(_debugx), vars->name,vars->name_length))); + sv_setpv(*err_str_svp, (char*)snmp_api_errstring(SNMPERR_OID_NONINCREASING)); + sv_setiv(*err_num_svp, SNMPERR_OID_NONINCREASING); + sv_setiv(*err_ind_svp, pix); + goto err; + } + DBPRT(2, (DBOUT "Ignoring repeat oid: %s\n", snprint_objid(_debugx, sizeof(_debugx), vars->name,vars->name_length))); diff -cr net-snmp-5.3.pre4-orig/snmplib/snmp_api.c net-snmp-5.3.pre4-obh/snmplib/snmp_api.c *** net-snmp-5.3.pre4-orig/snmplib/snmp_api.c Wed Nov 16 16:10:19 2005 --- net-snmp-5.3.pre4-obh/snmplib/snmp_api.c Tue Nov 22 14:25:19 2005 *************** *** 298,303 **** --- 298,304 ---- "Out of memory (malloc failure)", /* SNMPERR_MALLOC */ "Kerberos related error", /* SNMPERR_KRB5 */ "Protocol error", /* SNMPERR_PROTOCOL */ + "OID not increasing", /* SNMPERR_OID_NONINCREASING */ }; static const char *secLevelName[] = { Ole Bjørn Hessen, NMS-IP, PF-Nett, Telenor Networks ------------------------------------------------------- This SF.Net email is sponsored by the JBoss Inc. Get Certified Today Register for a JBoss Training Course. Free Certification Exam for All Training Attendees Through End of 2005. For more info visit: http://ads.osdn.com/?ad_idv28&alloc_id845&op=click _______________________________________________ Net-snmp-coders mailing list Net-snmp-coders@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/net-snmp-coders