2012-10-17 50 views
0
/* 
* 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生成的代码。我正在编译它作为子代理...但它没有显示任何类型的值。我应该采取什么措施来实施它?我从哪里可以获取数据?请帮我实施它。执行mib2c生成的代码

snmpwalk的-c公共-v 2C本地主机1.3.6.1.4.1.21068 POOL-MIB ::精英=无此对象在该代理可在此OID

Thansks提前。

回答

1

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

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

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

请注意,mib2c会产生很多不同的编码风格,根据我上面的看法,我不太相信你选择了正确的风格,因为它看起来不像你的数据是高度静态的,您需要设置一个警报(请参阅snmp_alarm(3))以定期更新poolInOctets数字。

+0

我遵循了你的建议,但现在显示“目前没有此实例存在于此OID” –

+0

你能帮我吗我应该在哪里做所有更改?我想添加在同一个表中添加数千个数据。或者如你所说,我想用另一种方法,但我不知道很多snmp编码,所以我选择了我发现它们有点容易的东西。 –