NGI
NGI

Reputation: 902

SNMP Agent: Could mib2c generate code for InetAddress or String type (ie something not an integer type)

I was able to transform 95% of a dedicated MIB to C code and make it run in a sub-agent like described in the last part of this Net-SNMP tutorial

For this I naturally use the mib2c.mfd.conf (I just read that mfd stands for Mib For Dummies ... all is said ...)

mib2c -I -c mib2c.mfd.conf my_mib_node

It generated a long .c file with almost all the oids like the one below.

Almost no lines were generated for the VideoInetAddr OID

//ABSTRACT OF SOURCE FILE GENERATED BY MIB2C
//...

long    VideoFormat = 0;  /* XXX: set default value */
// <<<=== NOTHING GENERATED HERE FOR VideoInetAddr OF TYPE INETADDRESS
// WHEREAS OTHER INTEGERS ARE NORMALLY PRESENT
long    VideoInetPort = 0;  /* XXX: set default value */
//...

void init_my_mib_node(void)
{
 //...

    const oid VideoFormat_oid[] = { 1,3,6,1,4,1,a,b,c,d,e };
    static netsnmp_watcher_info VideoFormat_winfo;
    // <<<=== NO OID GENERATED for VideoInetAddr OF TYPE INETADDRESS
    // WHEREAS OTHER OIDs ARE NORMALLY GENERATED
    static netsnmp_watcher_info VideoInetAddr_winfo; //We have the winfo after all
    const oid VideoInetPort_oid[] = { 1,3,6,1,4,1,a,b,c,d,g };
    static netsnmp_watcher_info VideoInetPort_winfo;

    DEBUGMSGTL(("my_mib_node",
    "Initializing VideoFormat scalar integer.  Default value = %d\n",
                VideoFormat));

    reg = netsnmp_create_handler_registration(
         "VideoFormat", NULL,
          VideoFormat_oid, OID_LENGTH(VideoFormat_oid),
          HANDLER_CAN_RWRITE);

    netsnmp_init_watcher_info(&VideoFormat_winfo, &VideoFormat, 
    sizeof(long),ASN_INTEGER, WATCHER_FIXED_SIZE);

   if (netsnmp_register_watched_scalar( reg, &VideoFormat_winfo ) < 0 ) {
    snmp_log( LOG_ERR, "Failed to register watched VideoFormat" );
   //...
}

This worked fine and needed 5 minutes (no code to write, just call the init() function), I was able to GET and SET all ... integers ...

Some oids are of Type InetAddress were not generated, neither were strings

Question

I tried the mib2c.old-api.conf which generates code also for the non-integer oids but I find it not as convenient. There is more boilerplate code to write.

Upvotes: 0

Views: 1307

Answers (2)

Vlad
Vlad

Reputation: 320

Yes, mib2c could generate code for IP addresses. I cannot say that mfd does this, but, definitely, some mib2c.iterate.conf (for tables) does this.

The type of IP in SNMP is ASN_IPADDRESS represented by unint32_t in C. Also,You need to make sure that in MIB-file for object, which represents IP, you have "SYNTAX IpAddress".

Have a look: at the MIB file with IP object and implementation in C

Upvotes: 1

NGI
NGI

Reputation: 902

Piece of answer but I am very far from comprehension and so side problems persist

Very pragmatically I managed to add by hand

//I put here ONLY what I added, see question above to complete code
#define STR_LENGTH_IPV4 sizeof("xxx.yyy.zzz.www")
char   VideoInetAddr[STR_LENGTH_IPV4] = "192.168.2.3";
//...
const oid VideoInetAddr_oid[] = { 1,3,6,1,4,1,a,b,c,d,f };

reg = netsnmp_create_handler_registration(
         "VideoInetAddr", NULL,
          VideoInetAddr_oid, OID_LENGTH(VideoInetAddr_oid),
          HANDLER_CAN_RWRITE);

netsnmp_init_watcher_info(&VideoInetAddr_winfo, &VideoInetAddr, sizeof(VideoInetAddr),
              ASN_OCTET_STR,  WATCHER_MAX_SIZE );

if (netsnmp_register_watched_scalar( reg, &VideoInetAddr_winfo ) < 0 ) {
    snmp_log( LOG_ERR, "Failed to register watched VideoInetAddr" );
}

It still need to understand exactly the option like WATCHER_MAX_SIZE (is-it the good one ?)

Upvotes: 0

Related Questions