implementation of mib2c generated code

2.1k Views Asked by At
/*
 * Note: this file originally auto-generated by mib2c using
 *  $
 */

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "pool.h"

/** Initializes the pool module */
void
init_pool(void)
{
  /* here we initialize all the tables we're planning on supporting */
    initialize_table_poolTable();
}

  //Determine the first/last column names

/** Initialize the poolTable table by defining its contents and how it's structured */
void
initialize_table_poolTable(void)
{
    const oid poolTable_oid[] = {1,3,6,1,4,1,21068,4,2};
    const size_t poolTable_oid_len   = OID_LENGTH(poolTable_oid);
    netsnmp_handler_registration    *reg;
    netsnmp_iterator_info           *iinfo;
    netsnmp_table_registration_info *table_info;

    DEBUGMSGTL(("pool:init", "initializing table poolTable\n"));

    reg = netsnmp_create_handler_registration(
              "poolTable",     poolTable_handler,
              poolTable_oid, poolTable_oid_len,
              HANDLER_CAN_RONLY
              );

    table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
    netsnmp_table_helper_add_indexes(table_info,
                           ASN_INTEGER,  /* index: ifIndex */
                           0);
    table_info->min_column = 1;
    table_info->max_column = COLUMN_POOLINOCTETS;

    iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
    iinfo->get_first_data_point = poolTable_get_first_data_point;
    iinfo->get_next_data_point  = poolTable_get_next_data_point;
    iinfo->table_reginfo        = table_info;

    netsnmp_register_table_iterator( reg, iinfo );

    /* Initialise the contents of the table here */
}

    /* Typical data structure for a row entry */
struct poolTable_entry {
    /* Index values */
    long ifIndex;

    /* Column values */
    u_long poolInOctets;

    /* Illustrate using a simple linked list */
    int   valid;
    struct poolTable_entry *next;
};

struct poolTable_entry  *poolTable_head;

/* create a new row in the (unsorted) table */
struct poolTable_entry *
poolTable_createEntry(
                 long  ifIndex
                ) {
    struct poolTable_entry *entry;

    entry = SNMP_MALLOC_TYPEDEF(struct poolTable_entry);
    if (!entry)
        return NULL;

    entry->ifIndex = ifIndex;
    entry->next = poolTable_head;
    poolTable_head = entry;
    return entry;
}

/* remove a row from the table */
void
poolTable_removeEntry( struct poolTable_entry *entry ) {
    struct poolTable_entry *ptr, *prev;

    if (!entry)
        return;    /* Nothing to remove */

    for ( ptr  = poolTable_head, prev = NULL;
          ptr != NULL;
          prev = ptr, ptr = ptr->next ) {
        if ( ptr == entry )
            break;
    }
    if ( !ptr )
        return;    /* Can't find it */

    if ( prev == NULL )
        poolTable_head = ptr->next;
    else
        prev->next = ptr->next;

    SNMP_FREE( entry );   /* XXX - release any other internal resources */
}


/* Example iterator hook routines - using 'get_next' to do most of the work */
netsnmp_variable_list *
poolTable_get_first_data_point(void **my_loop_context,
                          void **my_data_context,
                          netsnmp_variable_list *put_index_data,
                          netsnmp_iterator_info *mydata)
{
    *my_loop_context = poolTable_head;
    return poolTable_get_next_data_point(my_loop_context, my_data_context,
                                    put_index_data,  mydata );
}

netsnmp_variable_list *
poolTable_get_next_data_point(void **my_loop_context,
                          void **my_data_context,
                          netsnmp_variable_list *put_index_data,
                          netsnmp_iterator_info *mydata)
{
    struct poolTable_entry *entry = (struct poolTable_entry *)*my_loop_context;
    netsnmp_variable_list *idx = put_index_data;

    if ( entry ) {
        snmp_set_var_typed_integer( idx, ASN_INTEGER, entry->ifIndex );
        idx = idx->next_variable;
        *my_data_context = (void *)entry;
        *my_loop_context = (void *)entry->next;
        return put_index_data;
    } else {
        return NULL;
    }
}


/** handles requests for the poolTable table */
int
poolTable_handler(
    netsnmp_mib_handler               *handler,
    netsnmp_handler_registration      *reginfo,
    netsnmp_agent_request_info        *reqinfo,
    netsnmp_request_info              *requests) {

    netsnmp_request_info       *request;
    netsnmp_table_request_info *table_info;
    struct poolTable_entry          *table_entry;

    DEBUGMSGTL(("pool:handler", "Processing request (%d)\n", reqinfo->mode));

    switch (reqinfo->mode) {
        /*
         * Read-support (also covers GetNext requests)
         */
    case MODE_GET:
        for (request=requests; request; request=request->next) {
            table_entry = (struct poolTable_entry *)
                              netsnmp_extract_iterator_context(request);
            table_info  =     netsnmp_extract_table_info(      request);

            switch (table_info->colnum) {
            case COLUMN_POOLINOCTETS:
                if ( !table_entry ) {
                    netsnmp_set_request_error(reqinfo, request,
                                              SNMP_NOSUCHINSTANCE);
                    continue;
                }
                snmp_set_var_typed_integer( request->requestvb, ASN_COUNTER,
                                            table_entry->poolInOctets);
                break;
            default:
                netsnmp_set_request_error(reqinfo, request,
                                          SNMP_NOSUCHOBJECT);
                break;
            }
        }
        break;

    }
    return SNMP_ERR_NOERROR;
}

above is my mib2c generated code. I am compiling it as subagent... but it is not showing any kind of values. What should be my next step to implement it ? from where can I get data? Please help me to implement it.

snmpwalk -c public -v 2c localhost 1.3.6.1.4.1.21068 POOL-MIB::elite = No Such Object available on this agent at this OID

Thansks in advance.

1

There are 1 best solutions below

2
On

You need to add data to the poolTable_head linked list of data. You can do this like so:

struct poolTable_entry *entry = poolTable_createEntry(1);
entry->poolInOctets = 42;

And then put that code, which is just very basic example code with static numbers, somewhere that will get called. You could, for example, put it at the bottom of the initialize_table_poolTable() function.

Note that mib2c generates a lot of different coding styles, and based on what I see above I'm not quite convinced you chose the right style as it doesn't look like your data will be highly static and thus you'll need to set an alarm (see snmp_alarm(3)) to update the poolInOctets numbers on a regular basis.