hello, everyone,
i tried to accomplish my c file which is generated by mib2c with the
mib2c.iterate.conf template. see the following code, the red part is what i
added. i tried to intialize the table with 2 rows, each of them has Index,
Name and Status, 3 elements. Everything seems ok, i compiled it into a
dynamic library(.so), and loaded the library in my agent, but when i used
snmpwalk, i got this :
xxxNetInterfaceIndex.0 = INTEGER: 0
xxxNetInterfaceIndex.1 = INTEGER: 1
xxxNetInterfaceName.0 = STRING:
xxxNetInterfaceName.1 = STRING:
xxxNetInterfaceStatus.0 = INTEGER: deactivated(0)
xxxNetInterfaceStatus.1 = INTEGER: deactivated(0)
The variable Name is empty. Did i miss anything in my program?
Thanks in advance.
Yi

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

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

/** Initializes the xxxMIB module */
void
init_xxxMIB(void)
{
  /* here we initialize all the tables we're planning on supporting */
    initialize_table_xxxNetInterfaceTable();
}

//  # Determine the first/last column names
long status=0;

void
fill_xxxNetInterfaceTable(void);

/** Initialize the xxxNetInterfaceTable table by defining its contents and
how
it's structured */
void
initialize_table_xxxNetInterfaceTable(void)
{
    static oid xxxNetInterfaceTable_oid[] = {1,3,6,1,3,10,166,2,1};
    size_t xxxNetInterfaceTable_oid_len   =
OID_LENGTH(xxxNetInterfaceTable_oid);
    netsnmp_handler_registration    *reg;
    netsnmp_iterator_info           *iinfo;
    netsnmp_table_registration_info *table_info;

    reg = netsnmp_create_handler_registration(
              "xxxNetInterfaceTable",     xxxNetInterfaceTable_handler,
              xxxNetInterfaceTable_oid, xxxNetInterfaceTable_oid_len,
              HANDLER_CAN_RONLY
              );

    table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
    netsnmp_table_helper_add_indexes(table_info,
                           ASN_INTEGER,  /* index: xxxNetInterfaceIndex */
                           0);
    table_info->min_column = COLUMN_XXXNETINTERFACEINDEX;
    table_info->max_column = COLUMN_XXXNETINTERFACESTATUS;

    iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
    iinfo->get_first_data_point = xxxNetInterfaceTable_get_first_data_point;
    iinfo->get_next_data_point  = xxxNetInterfaceTable_get_next_data_point;
    iinfo->table_reginfo        = table_info;

    netsnmp_register_table_iterator( reg, iinfo );

    /* Initialise the contents of the table here */
    fill_xxxNetInterfaceTable();
}

    /* Typical data structure for a row entry */
struct xxxNetInterfaceTable_entry {
    /* Index values */
    long xxxNetInterfaceIndex;

    /* Column values */
    //long xxxNetInterfaceIndex;
    char xxxNetInterfaceName[64];
    size_t xxxNetInterfaceName_len;
    long xxxNetInterfaceStatus;

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

struct xxxNetInterfaceTable_entry  *xxxNetInterfaceTable_head;

/* create a new row in the (unsorted) table */
struct xxxNetInterfaceTable_entry *
xxxNetInterfaceTable_createEntry(
                 long  xxxNetInterfaceIndex
                ) {
    struct xxxNetInterfaceTable_entry *entry;

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

    entry->xxxNetInterfaceIndex = xxxNetInterfaceIndex;
    entry->next = xxxNetInterfaceTable_head;
    xxxNetInterfaceTable_head = entry;
    return entry;
}

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

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

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

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

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

void
fill_xxxNetInterfaceTable(void)
{
    struct xxxNetInterfaceTable_entry *entry;
    entry = SNMP_MALLOC_TYPEDEF(struct xxxNetInterfaceTable_entry);
    char* strName = "Ethernet";
    size_t len = strlen("Ethernet");

    entry = xxxNetInterfaceTable_createEntry(0);
    memcpy(entry->xxxNetInterfaceName, strName, len);
    entry->xxxNetInterfaceStatus = 0;

     char* strName = "RTC Interface";
    size_t len = strlen("RTC Interface");
    entry = xxxNetInterfaceTable_createEntry(1);
    memcpy(entry->xxxNetInterfaceName,, strlen("RTC Interface")+1);
    entry->xxxNetInterfaceStatus = 0;
}

/* Example iterator hook routines - using 'get_next' to do most of the work
*/
netsnmp_variable_list *
xxxNetInterfaceTable_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 = xxxNetInterfaceTable_head;
    return xxxNetInterfaceTable_get_next_data_point(my_loop_context,
my_data_co
ntext,
                                    put_index_data,  mydata );
}

netsnmp_variable_list *
xxxNetInterfaceTable_get_next_data_point(void **my_loop_context,
                          void **my_data_context,
                          netsnmp_variable_list *put_index_data,
                          netsnmp_iterator_info *mydata)
{
    struct xxxNetInterfaceTable_entry *entry = (struct
xxxNetInterfaceTable_en
try *)*my_loop_context;
    netsnmp_variable_list *idx = put_index_data;
    if ( entry ) {
        snmp_set_var_typed_integer( idx, ASN_INTEGER,
entry->xxxNetInterfaceInd
ex );
        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 xxxNetInterfaceTable table */
int
xxxNetInterfaceTable_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 xxxNetInterfaceTable_entry          *table_entry;

    switch (reqinfo->mode) {
        /*
         * Read-support (also covers GetNext requests)
         */
    case MODE_GET:
        for (request=requests; request; request=request->next) {
            table_entry = (struct xxxNetInterfaceTable_entry *)
                              netsnmp_extract_iterator_context(request);
            table_info  =     netsnmp_extract_table_info(      request);
            switch (table_info->colnum) {
            case COLUMN_XXXNETINTERFACEINDEX:
                ...
                break;
            case COLUMN_XXXNETINTERFACENAME:
                if ( !table_entry ) {
                    netsnmp_set_request_error(reqinfo, request,
                                              SNMP_NOSUCHINSTANCE);
                    continue;
                }
                snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
                                 (u_char*)table_entry->xxxNetInterfaceName,

table_entry->xxxNetInterfaceName_len);
                break;
            case COLUMN_XXXNETINTERFACESTATUS:
              ...
                break;
            default:
                netsnmp_set_request_error(reqinfo, request,
                                          SNMP_NOSUCHOBJECT);
                break;
            }
        }
        break;

    }
    return SNMP_ERR_NOERROR;
}
------------------------------------------------------------------------------
ThinkGeek and WIRED's GeekDad team up for the Ultimate 
GeekDad Father's Day Giveaway. ONE MASSIVE PRIZE to the 
lucky parental unit.  See the prize list and enter to win: 
http://p.sf.net/sfu/thinkgeek-promo
_______________________________________________
Net-snmp-coders mailing list
Net-snmp-coders@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders

Reply via email to