This is a discussion on Strange error in test program... within the SNMP Coders forums, part of the Networking and Network Related category; Hi There, I'm experiencing strange behaviour with a test program for NET-SNMP I've made (in Linux that ...
|
|||||||
| FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read |
|
|||
|
Hi There,
I'm experiencing strange behaviour with a test program for NET-SNMP I've made (in Linux that is). The test program source code is concatenated below and executes the following things in chronological order: ** Initialise a SNMP session ** Build a PDU that requests 'IF-MIB::ifNumber.0' to get the total amount of interfaces, this value is used to build the next PDU ** Build a PDU that requests 'IF-MIB::ifPhysAddress.x' for each interface (thus request the MAC-addresses). ** Close the SNMP session The program will be used to check the MAC addresses against an other list. When I compile and run the program I get: --- # gcc -Wall `net-snmp-config --cflags` `net-snmp-config --libs` `net-snmp-config --external-libs` snmptest.c -o snmptest # ./snmptest INTEGER: 3 num_if = 3 No log handling enabled - turning on stderr logging snmp_build: unknown failureE: snmp_synch_response() failed! (ret = 1) --- Hmmm...a search for this error did not turn up any useful information. I came to discover that the error is due to the combination of requests I make; I request 'ifNumber.0' and then, for every interface 'ifPhysAddress.x' (where 'x' is the index of the interface of course). I can make the error disappear by doing a request for 'ifAdminStatus.2' (for example) instead of 'ifNumber.0'; in this case I get: --- # ./snmptest INTEGER: up(1) num_if = 1 STRING: xx:xx:xx:xx:xx:xx --- The MAC-address is scrambled, and because now 'if_num' receives the wrong value, I set it to '3' afterwards. The program works and finished without an error, as it should. How can this be? Am I not allowed to make this combination of requests? Can anyone help me on this? Thanks in advance! Greetings, Kris van Rens PS. Another thing. What about the error that is printed when the failure happens, is there some way to turn this off? snmp_build prints an error but I'd like to do my own error handling and print it when appropriate, thank you. ---------< start program source code: >----------- #include <net-snmp/net-snmp-config.h> #include <net-snmp/net-snmp-includes.h> #include <string.h> int main(void) { struct snmp_session sess, *sess_h; struct snmp_pdu *req, *resp; oid if_oid[MAX_OID_LEN]; size_t if_oid_len = MAX_OID_LEN; struct variable_list *vars; int ret, i, num_if; char oid_str[32]; // Initialise SNMP session init_snmp("test"); snmp_sess_init(&sess); sess.version = SNMP_VERSION_1; sess.community = (unsigned char *)"public"; sess.community_len = strlen((char *)sess.community); sess.peername = "localhost"; sess_h = snmp_open(&sess); if (sess_h == NULL) goto out_snmp_open; // // STEP 1: Get the # of network interfaces ----------------------------------- // // Create a PDU (SNMP packet) req = snmp_pdu_create(SNMP_MSG_GET); read_objid("IF-MIB::ifAdminStatus.2", if_oid, &if_oid_len); // ...works //read_objid("IF-MIB::ifNumber.0", if_oid, &if_oid_len); // ...doesn't work snmp_add_null_var(req, if_oid, if_oid_len); // Send request PDU ret = snmp_synch_response(sess_h, req, &resp); if (ret != STAT_SUCCESS || resp->errstat != SNMP_ERR_NOERROR) goto out_snmp_synch_response; // Copy value memmove(&num_if, resp->variables->val.integer, resp->variables->val_len); // DEBUG -- will be removed print_value(resp->variables->name, resp->variables->name_length, resp->variables); printf("num_if = %d\n", num_if); // Free response PDU if (resp) snmp_free_pdu(resp); // // STEP 2: Request information for every interface --------------------------- // // Create a PDU (SNMP packet) req = snmp_pdu_create(SNMP_MSG_GET); // Pack in variables for (i = 0; i < num_if; i++) { sprintf(oid_str, "IF-MIB::ifPhysAddress.%d", i+1); read_objid(oid_str, if_oid, &if_oid_len); snmp_add_null_var(req, if_oid, if_oid_len); } // Send request PDU ret = snmp_synch_response(sess_h, req, &resp); if (ret != STAT_SUCCESS || resp->errstat != SNMP_ERR_NOERROR) goto out_snmp_synch_response; // Save MAC addresses for (vars = resp->variables; vars; vars = vars->next_variable) { if (vars->val_len != 0) { // // COMPARISON OF MACs ... // // DEBUG -- will be removed print_value(vars->name, vars->name_length, vars); } } // Free response PDU if (resp) snmp_free_pdu(resp); // Close SNMP session snmp_close(sess_h); // Normal exit return 0; out_snmp_open: printf("E: snmp_open() failed!\n"); snmp_sess_perror("test", &sess); return -1; out_snmp_synch_response: printf("E: snmp_synch_response() failed! (ret = %d)\n", ret); snmp_close(sess_h); return -1; } ---------< end program source code: >----------- ---------< start snmpwalk snippet >-------------- .... IF-MIB::ifNumber.0 = INTEGER: 3 IF-MIB::ifIndex.1 = INTEGER: 1 IF-MIB::ifIndex.2 = INTEGER: 2 IF-MIB::ifIndex.3 = INTEGER: 3 IF-MIB::ifDescr.1 = STRING: lo IF-MIB::ifDescr.2 = STRING: eth0 IF-MIB::ifDescr.3 = STRING: sit0 IF-MIB::ifType.1 = INTEGER: softwareLoopback(24) IF-MIB::ifType.2 = INTEGER: ethernetCsmacd(6) IF-MIB::ifType.3 = INTEGER: tunnel(131) IF-MIB::ifMtu.1 = INTEGER: 16436 IF-MIB::ifMtu.2 = INTEGER: 1500 IF-MIB::ifMtu.3 = INTEGER: 1480 IF-MIB::ifSpeed.1 = Gauge32: 10000000 IF-MIB::ifSpeed.2 = Gauge32: 100000000 IF-MIB::ifSpeed.3 = Gauge32: 0 IF-MIB::ifPhysAddress.1 = STRING: IF-MIB::ifPhysAddress.2 = STRING: xx:xx:xx:xx:xx:xx IF-MIB::ifPhysAddress.3 = STRING: .... ---------< end snmpwalk snippet >--------------- ------------------------------------------------------------------------- This SF.net email is sponsored by the 2008 JavaOne(SM) Conference Register now and save $200. Hurry, offer ends at 11:59 p.m., Monday, April 7! Use priority code J8TLD2. http://ad.doubleclick.net/clk;198757...un.com/javaone _______________________________________________ Net-snmp-coders mailing list Net-snmp-coders@lists.sourceforge.net https://lists.sourceforge.net/lists/...et-snmp-coders |
![]() |
| Thread Tools | |
| Display Modes | |
|
|