cache load never gets called
Kathy McLeod <[email protected]>
| Newsgroups | gmane.network.net-snmp.user |
|---|---|
| Message-ID | <OFD3CFC148.D224DDEC-ON862576F6.006DEE54-862576F6.006F03DB@us.ibm.com> |
Hi - I ran the mib2c to generate a cache handler for a file created using mib2c.table_data.conf. The main function still works ok, but even tho I set the cache timeout value to -1, it never seems to expire. I also tested with a timeout value of 60 and it didn't expire. The only debug statements I get are the ones in the init and deinit routines. I am not able to figure out what is wrong. I didn't attach the MIB - let me know if you need it. (It is also atteched to a couple of earlier notes.) Thanks for your help. (See attached file: lldpPortConfigTable.h)(See attached file: lldpPortConfigTable.c) Kathy McLeod ------------------------------------------------------------------------------ Download Intel® Parallel Studio Eval Try the new software tools for yourself. Speed compiling, find bugs proactively, and fine-tune applications for parallel performance. See why Intel Parallel Studio got high marks during beta. http://p.sf.net/sfu/intel-sw-dev _______________________________________________ Net-snmp-users mailing list [email protected] Please see the following page to unsubscribe or change other options: https://lists.sourceforge.net/lists/listinfo/net-snmp-users
lldpPortConfigTable.h
(application/octet-stream, 1.1 KB)
/*
* Note: this file originally auto-generated by mib2c using
* : mib2c.table_data.conf 16004 2007-03-27 09:20:28Z dts12 $
*/
#ifndef LLDPPORTCONFIGTABLE_H
#define LLDPPORTCONFIGTABLE_H
/*
* function declarations
*/
void init_lldpPortConfigTable(void);
void initialize_table_lldpPortConfigTable(void);
void deinit_lldpPortConfigTable(void);
Netsnmp_Node_Handler lldpPortConfigTable_handler;
NetsnmpCacheLoad lldpPortConfigTable_load;
NetsnmpCacheFree lldpPortConfigTable_free;
#define LLDPPORTCONFIGTABLE_TIMEOUT -1 // 60
/*
* column number definitions for table lldpPortConfigTable
*/
#define COLUMN_LLDPPORTCONFIGPORTNUM 1
#define COLUMN_LLDPPORTCONFIGADMINSTATUS 2
#define COLUMN_LLDPPORTCONFIGNOTIFICATIONENABLE 3
#define COLUMN_LLDPPORTCONFIGTLVSTXENABLE 4
typedef struct port_tab_entry_s {
long port_tab_portnum;
long port_tab_status;
long port_tab_notify;
char port_tab_tlvs;
} port_tab_entry_t;
static int alreadyReg = 0;
static int alreadyDereg = 0;
#endif /* LLDPPORTCONFIGTABLE_H */
lldpPortConfigTable.c
(application/octet-stream, 17.8 KB)
/*
* Note: this file originally auto-generated by mib2c using
* : mib2c.table_data.conf 16004 2007-03-27 09:20:28Z dts12 $
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <net-snmp/library/tools.h>
#include <net-snmp/agent/cache_handler.h>
#include <net-snmp/agent/table_tdata.h>
#include "lldpPortConfigTable.h"
static oid lldpPortConfigTable_oid[] =
{ 1, 0, 8802, 1, 1, 2, 1, 1, 6 };
size_t lldpPortConfigTable_oid_len =
OID_LENGTH(lldpPortConfigTable_oid);
netsnmp_tdata_row * lldpPortConfigTable_createEntry(netsnmp_tdata * table_data,
long lldpPortConfigPortNum);
static char bits[] = {0x80, 0x40, 0x20, 0x10};
static char nullset = 0x00;
static port_tab_entry_t *tempNode;
int checkNumericRange(int min, int max, int newValue)
{
if (newValue >= min &&
newValue <= max)
return(SNMP_ERR_NOERROR);
else
return(SNMP_ERR_WRONGVALUE);
}
int checkBoolean(int newValue)
{
if (newValue == TRUE ||
newValue == FALSE)
return(SNMP_ERR_NOERROR);
else
return(SNMP_ERR_WRONGVALUE);
}
int checkTlvsBITS(int newVal)
{
if (newVal == nullset ||
newVal == bits[0] ||
newVal == bits[1] ||
newVal == bits[2] ||
newVal == bits[3])
return(SNMP_ERR_NOERROR);
else
return(SNMP_ERR_WRONGVALUE);
}
/** Initializes the lldpPortConfigTable module */
void
init_lldpPortConfigTable(void)
{
/*
* here we initialize all the tables we're planning on supporting
*/
initialize_table_lldpPortConfigTable();
}
/*# Determine the first/last column names */
/** Initialize the lldpPortConfigTable table by defining its contents and how it's structured */
void
initialize_table_lldpPortConfigTable(void)
{
static oid lldpPortConfigTable_oid[] =
{ 1, 0, 8802, 1, 1, 2, 1, 1, 6 };
size_t lldpPortConfigTable_oid_len =
OID_LENGTH(lldpPortConfigTable_oid);
netsnmp_handler_registration *reg;
netsnmp_tdata *table_data;
netsnmp_table_registration_info *table_info;
netsnmp_cache *cache;
short int i = 0;
DEBUGMSGTL(("lldpPortConfigTable", "initing table1\n"));
if (alreadyReg > 0)
return;
DEBUGMSGTL(("lldpPortConfigTable", "initing table\n"));
reg =
netsnmp_create_handler_registration("lldpPortConfigTable",
lldpPortConfigTable_handler,
lldpPortConfigTable_oid,
lldpPortConfigTable_oid_len,
HANDLER_CAN_RWRITE);
table_data = netsnmp_tdata_create_table("lldpPortConfigTable", 0);
table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, /* index: lldpPortConfigPortNum */
0);
table_info->min_column = COLUMN_LLDPPORTCONFIGADMINSTATUS;
table_info->max_column = COLUMN_LLDPPORTCONFIGTLVSTXENABLE;
netsnmp_tdata_register(reg, table_data, table_info);
cache = netsnmp_cache_create(LLDPPORTCONFIGTABLE_TIMEOUT,
lldpPortConfigTable_load,
lldpPortConfigTable_free,
lldpPortConfigTable_oid,
lldpPortConfigTable_oid_len);
cache->magic = (void *) table_data;
netsnmp_inject_handler_before(reg, netsnmp_cache_handler_get(cache), TABLE_DATA_NAME);
/*
* Initialise the contents of the table here
*/
DEBUGMSGTL(("lldpPortConfigTable", "for loop\n"));
tempNode = SNMP_MALLOC_TYPEDEF(port_tab_entry_t);
for(i=0; i<4; i++)
{
DEBUGMSGTL(("lldpPortConfigTable", "for loop%d\n", i));
tempNode->port_tab_portnum = i+1;
tempNode->port_tab_status = (i+1) % 5; /* 1 thru 4 */
tempNode->port_tab_notify = i % 2; /* true or false */
tempNode->port_tab_tlvs = bits[i]; /* 0 - 3 */
lldpPortConfigTable_createEntry(table_data, tempNode->port_tab_portnum);
}
SNMP_FREE(tempNode);
tempNode = NULL;
}
void deinit_lldpPortConfigTable(void) {
DEBUGMSGTL(("lldpPortConfigTable", "deiniting1 mibs\n"));
if (alreadyDereg > 0)
return;
DEBUGMSGTL(("lldpPortConfigTable", "deiniting mibs\n"));
/* int unregister_mib(oid *, size_t); */
unregister_mib(lldpPortConfigTable_oid, lldpPortConfigTable_oid_len);
alreadyDereg = 1;
}
/*
* Typical data structure for a row entry
*/
struct lldpPortConfigTable_entry {
/*
* Index values
*/
long lldpPortConfigPortNum;
/*
* Column values
*/
long lldpPortConfigAdminStatus;
long old_lldpPortConfigAdminStatus;
long lldpPortConfigNotificationEnable;
long old_lldpPortConfigNotificationEnable;
char lldpPortConfigTLVsTxEnable[1];
size_t lldpPortConfigTLVsTxEnable_len;
char old_lldpPortConfigTLVsTxEnable[1];
size_t old_lldpPortConfigTLVsTxEnable_len;
int valid;
};
/*
* create a new row in the table
*/
netsnmp_tdata_row *lldpPortConfigTable_createEntry(netsnmp_tdata *
table_data,
long
lldpPortConfigPortNum) {
struct lldpPortConfigTable_entry *entry;
netsnmp_tdata_row *row;
entry = SNMP_MALLOC_TYPEDEF(struct lldpPortConfigTable_entry);
if(!entry)
return NULL;
row = netsnmp_tdata_create_row();
if(!row) {
SNMP_FREE(entry);
return NULL;
}
row->data = entry;
entry->lldpPortConfigPortNum = lldpPortConfigPortNum;
// test ascending but not consecutive indexes
// entry->lldpPortConfigPortNum = 2*lldpPortConfigPortNum;
// test unordered index
// entry->lldpPortConfigPortNum = 60 - (8*lldpPortConfigPortNum);
netsnmp_tdata_row_add_index(row, ASN_INTEGER,
&(entry->lldpPortConfigPortNum),
sizeof(entry->lldpPortConfigPortNum));
/*****************************/
entry->lldpPortConfigAdminStatus = tempNode->port_tab_status;
entry->old_lldpPortConfigAdminStatus = 0;
entry->lldpPortConfigNotificationEnable = tempNode->port_tab_notify;
entry->old_lldpPortConfigAdminStatus = 0;
entry->lldpPortConfigTLVsTxEnable[0] = tempNode->port_tab_tlvs;
entry->lldpPortConfigTLVsTxEnable_len = 1;
entry->old_lldpPortConfigTLVsTxEnable[0] = 0;
entry->old_lldpPortConfigTLVsTxEnable_len = 1;
/*****************************/
netsnmp_tdata_add_row(table_data, row);
return row;
}
/*
* remove a row from the table
*/
void
lldpPortConfigTable_removeEntry(netsnmp_tdata * table_data,
netsnmp_tdata_row * row) {
struct lldpPortConfigTable_entry *entry;
if (!row)
return; /* Nothing to remove */
entry = (struct lldpPortConfigTable_entry *)
netsnmp_tdata_remove_and_delete_row(table_data, row);
if (entry)
SNMP_FREE(entry); /* XXX - release any other internal resources */
}
/*
* Example cache handling - set up table_data list from a suitable file
*/
int
lldpPortConfigTable_load(netsnmp_cache * cache, void *vmagic) {
netsnmp_tdata * table = (netsnmp_tdata *) vmagic;
// netsnmp_tdata_row *row;
short int i;
DEBUGMSGTL(("lldpPortConfigTable", "cache load\n"));
/*
* Initialise the contents of the table here
*/
DEBUGMSGTL(("lldpPortConfigTable", "cache for loop\n"));
tempNode = SNMP_MALLOC_TYPEDEF(port_tab_entry_t);
for(i=3; i<8; i++)
{
DEBUGMSGTL(("lldpPortConfigTable", "cache for loop%d\n", i));
tempNode->port_tab_portnum = i+1;
tempNode->port_tab_status = (i+1) % 5; /* 1 thru 4 */
tempNode->port_tab_notify = i % 2; /* true or false */
tempNode->port_tab_tlvs = bits[i % 4]; /* 0 - 3 */
lldpPortConfigTable_createEntry(table, tempNode->port_tab_portnum);
}
SNMP_FREE(tempNode);
tempNode = NULL;
return(SNMP_ERR_NOERROR);
}
void
lldpPortConfigTable_free(netsnmp_cache * cache, void *vmagic) {
// netsnmp_tdata * table = (netsnmp_tdata *) vmagic;
netsnmp_tdata_row *this;
netsnmp_tdata * table;
table = (netsnmp_tdata *) vmagic;
DEBUGMSGTL(("lldpPortConfigTable", "cache free\n"));
/* change from netsnmp_tdata_get_first_row */
while ((this = netsnmp_tdata_row_first(table))) {
netsnmp_tdata_remove_and_delete_row(table, this);
}
}
/** handles requests for the lldpPortConfigTable table */
int lldpPortConfigTable_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;
netsnmp_tdata * table_data;
netsnmp_tdata_row *table_row;
struct lldpPortConfigTable_entry *table_entry;
int ret;
switch (reqinfo->mode) {
/*
* Read-support (also covers GetNext requests)
*/
case MODE_GET:
for (request = requests; request; request = request->next) {
table_entry = (struct lldpPortConfigTable_entry *)
netsnmp_tdata_extract_entry(request);
table_info = netsnmp_extract_table_info(request);
switch (table_info->colnum) {
case COLUMN_LLDPPORTCONFIGADMINSTATUS:
if (!table_entry) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->
lldpPortConfigAdminStatus);
break;
case COLUMN_LLDPPORTCONFIGNOTIFICATIONENABLE:
if (!table_entry) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->
lldpPortConfigNotificationEnable);
break;
case COLUMN_LLDPPORTCONFIGTLVSTXENABLE:
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->
lldpPortConfigTLVsTxEnable,
table_entry->
lldpPortConfigTLVsTxEnable_len);
break;
default:
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHOBJECT);
break;
}
}
break;
/*
* Write-support
*/
case MODE_SET_RESERVE1:
for (request = requests; request; request = request->next) {
table_entry = (struct lldpPortConfigTable_entry *)
netsnmp_tdata_extract_entry(request);
table_info = netsnmp_extract_table_info(request);
switch (table_info->colnum) {
case COLUMN_LLDPPORTCONFIGADMINSTATUS:
/*
* or possibly 'netsnmp_check_vb_int_range'
*/
ret = netsnmp_check_vb_int(request->requestvb);
if (ret != SNMP_ERR_NOERROR) {
netsnmp_set_request_error(reqinfo, request, ret);
return SNMP_ERR_NOERROR;
}
ret = checkNumericRange(1, 4, *request->requestvb->val.integer);
if (ret != SNMP_ERR_NOERROR) {
netsnmp_set_request_error(reqinfo, request, ret);
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_LLDPPORTCONFIGNOTIFICATIONENABLE:
/*
* or possibly 'netsnmp_check_vb_int_range'
*/
ret = netsnmp_check_vb_int(request->requestvb);
if (ret != SNMP_ERR_NOERROR) {
netsnmp_set_request_error(reqinfo, request, ret);
return SNMP_ERR_NOERROR;
}
ret = checkBoolean(*request->requestvb->val.integer);
if (ret != SNMP_ERR_NOERROR) {
netsnmp_set_request_error(reqinfo, request, ret);
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_LLDPPORTCONFIGTLVSTXENABLE:
/*
* or possiblc 'netsnmp_check_vb_type_and_size'
*/
ret =
netsnmp_check_vb_type_and_max_size(request->requestvb,
ASN_OCTET_STR,
sizeof(table_entry->
lldpPortConfigTLVsTxEnable));
if (ret != SNMP_ERR_NOERROR) {
netsnmp_set_request_error(reqinfo, request, ret);
return SNMP_ERR_NOERROR;
}
ret = checkTlvsBITS(*request->requestvb->val.string);
if (ret != SNMP_ERR_NOERROR) {
netsnmp_set_request_error(reqinfo, request, ret);
return SNMP_ERR_NOERROR;
}
break;
default:
netsnmp_set_request_error(reqinfo, request,
SNMP_ERR_NOTWRITABLE);
return SNMP_ERR_NOERROR;
}
}
break;
case MODE_SET_RESERVE2:
break;
case MODE_SET_FREE:
break;
case MODE_SET_ACTION:
for (request = requests; request; request = request->next) {
table_entry = (struct lldpPortConfigTable_entry *)
netsnmp_tdata_extract_entry(request);
table_info = netsnmp_extract_table_info(request);
switch (table_info->colnum) {
case COLUMN_LLDPPORTCONFIGADMINSTATUS:
table_entry->old_lldpPortConfigAdminStatus =
table_entry->lldpPortConfigAdminStatus;
table_entry->lldpPortConfigAdminStatus =
*request->requestvb->val.integer;
break;
case COLUMN_LLDPPORTCONFIGNOTIFICATIONENABLE:
table_entry->old_lldpPortConfigNotificationEnable =
table_entry->lldpPortConfigNotificationEnable;
table_entry->lldpPortConfigNotificationEnable =
*request->requestvb->val.integer;
break;
case COLUMN_LLDPPORTCONFIGTLVSTXENABLE:
memcpy(table_entry->old_lldpPortConfigTLVsTxEnable,
table_entry->lldpPortConfigTLVsTxEnable,
sizeof(table_entry->lldpPortConfigTLVsTxEnable));
table_entry->old_lldpPortConfigTLVsTxEnable_len =
table_entry->lldpPortConfigTLVsTxEnable_len;
memset(table_entry->lldpPortConfigTLVsTxEnable, 0,
sizeof(table_entry->lldpPortConfigTLVsTxEnable));
memcpy(table_entry->lldpPortConfigTLVsTxEnable,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->lldpPortConfigTLVsTxEnable_len =
request->requestvb->val_len;
break;
}
}
break;
case MODE_SET_UNDO:
for (request = requests; request; request = request->next) {
table_entry = (struct lldpPortConfigTable_entry *)
netsnmp_tdata_extract_entry(request);
table_row = netsnmp_tdata_extract_row(request);
table_data = netsnmp_tdata_extract_table(request);
table_info = netsnmp_extract_table_info(request);
switch (table_info->colnum) {
case COLUMN_LLDPPORTCONFIGADMINSTATUS:
table_entry->lldpPortConfigAdminStatus =
table_entry->old_lldpPortConfigAdminStatus;
table_entry->old_lldpPortConfigAdminStatus = 0;
break;
case COLUMN_LLDPPORTCONFIGNOTIFICATIONENABLE:
table_entry->lldpPortConfigNotificationEnable =
table_entry->old_lldpPortConfigNotificationEnable;
table_entry->old_lldpPortConfigNotificationEnable = 0;
break;
case COLUMN_LLDPPORTCONFIGTLVSTXENABLE:
memcpy(table_entry->lldpPortConfigTLVsTxEnable,
table_entry->old_lldpPortConfigTLVsTxEnable,
sizeof(table_entry->lldpPortConfigTLVsTxEnable));
memset(table_entry->old_lldpPortConfigTLVsTxEnable, 0,
sizeof(table_entry->lldpPortConfigTLVsTxEnable));
table_entry->lldpPortConfigTLVsTxEnable_len =
table_entry->old_lldpPortConfigTLVsTxEnable_len;
break;
}
}
break;
case MODE_SET_COMMIT:
break;
}
return SNMP_ERR_NOERROR;
}