Strange error in test program...

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 ...


Go Back   Usenet Forums > Networking and Network Related > SNMP Coders

FAQ Members List Calendar Search Today's Posts Mark Forums Read
  #1 (permalink)  
Old 04-08-2008
Kris van Rens
 
Posts: n/a
Default Strange error in test program...

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
Reply With Quote
Reply


Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT +1. The time now is 08:38 PM.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO 3.0.0