2012-10-17 87 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編碼,所以我選擇了我發現它們有點容易的東西。 –