执行mib2c生成的代码

时间:2012-10-17 10:44:36

标签: snmp net-snmp snmp4j snmpd

/*
 * 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;
}

上面是我的mib2c生成的代码。我正在将它编译为子代理...但它没有显示任何类型的值。我应该采取的下一步措施是什么?从哪里可以获得数据?请帮我实现它。

snmpwalk -c public -v 2c localhost 1.3.6.1.4.1.21068 POOL-MIB :: elite =在此OID上此代理上没有此类对象

提前解决。

1 个答案:

答案 0 :(得分:1)

您需要将数据添加到poolTable_head链接的数据列表中。你可以这样做:

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

然后把那些代码,这只是带有静态数字的非常基本的示例代码,在某个地方被调用。例如,您可以将它放在initialize_table_poolTable()函数的底部。

请注意,mib2c会生成许多不同的编码样式,基于我上面所看到的,我不太相信你选择了正确的样式,因为它看起来不像你的数据会非常静态,因此你会需要设置一个警报(参见snmp_alarm(3))以定期更新poolInOctets数字。