Re: cache problems with table data mib2c
Kathy McLeod <[email protected]>
| Newsgroups | gmane.network.net-snmp.user |
|---|---|
| Message-ID | <OFE9B2DEFC.A8F95DF1-ON86257743.006F3763-86257743.00721EC1@us.ibm.com> |
Hi -
Here are the files I was using before (See attached file:
lldpPortConfigTable.c)(See attached file: lldpPortConfigTable.h)and here is
my compile command
gcc `net-snmp-config --cflags` -fPIC -shared -g -O0 -o
lldpPortConfigTable.so lldpPortConfigTable.c `net-snmp-config --libs`
These files are pretty much the same, except for the debug messages, and I
added struct back in and changed to HANDLER based on your comments below,
and I changed back to .c and .h (I only need .C and .H for newer code).
I think your diagnosis is correct. It is setting up for the row and column
in the old table and then when those rows are not in the new table, I get
errors. This does not seem correct to me - isn't the point of reloading to
have the latest and greatest before the handler is called?
(Also, there is still the issue of unload happening in the middle of a
command being handled. I can avoid that when testing because I know when
the timer will expire, but that is going to be a problem with customers.)
Here are my results:
With the flags set to check with my code before unloading and reloading,
and currently a 20 second timer and testFlag always TRUE:
command reloads result
snmpbulkwalk yes seg. fault
snmpbulkget yes gets old
values, or a seg. fault
snmptable yes seg. fault
snmpget yes gets old vals, or rarely a
seg. fault
snmpgetnext yes gets old next value
snmpwalk yes seg. fault, or ok but has
one old row and then the new
rows
snmpset yes seg. fault
With the flags off, so it unloads when the timer expires and reloads (or
should) when an instruction is issued:
snmpbulkwalk no "No such instance" message
snmpbulkget no gets from the next MIB,
SNMPv2-MIB
snmptable no "No entries" message
snmpget yes gets old value
snmpgetnext yes gets first in new table
(when val from old table was used
on command)
snmpwalk no nothing shows up on command
line
snmpset no seg. fault
Thanks.
Kathy McLeod
Dept S82 CCB - SNMP
IBM Rochester, MN
(507) 253-4803
Dave Shield
<D.T.Shield@liver
pool.ac.uk> To
Sent by: Kathy McLeod/Rochester/IBM@IBMUS
dave.shield@googl cc
email.com net-snmp users
<[email protected]
et>
06/15/2010 03:27 Subject
AM Re: cache problems with table data
mib2c
On 14 June 2010 20:25, Kathy McLeod <[email protected]> wrote:
> (See attached file: lldpPortConfigTable.C)
Unfortunately, this file did not actually compile.
(it complained about line 210
entry = SNMP_MALLOC_TYPEDEF(lldpPortConfigTable_entry);
which should presumable be "struct lldpPortConfigTable_entry"
)
This is slightly worrying, since it implies you are working with
a different code file than the version you supplied.
> Summary of problems is 1) load is only called for an snmpget, not for
other
> commands; 2) the first get after the load always fails, and then when I
> repeat the command, it works (I am testing using a command line
interface);
Hmmm... this sounds as if the cache load routine is being called *after*
the decisions about which row of the table to process, rather than before.
Try tweaking the injection of the cache handler to use 'TABLE_HANDLER_NAME'
rather than 'TABLE_TDATA_NAME'. That seems to trigger the cache load
at a slightly earlier point, so that it's available both for the first
GET request,
and also for GETNEXT (and similar) requests.
Dave
------------------------------------------------------------------------------
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-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.c
(application/octet-stream, 19.9 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>
//#include <utils.H>
//#include <ethm/base/EthMgr.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);
}
/*
* 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;
};
/** 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;
// netsnmp_tdata_row *row;
// short int i = 0;
// struct lldpPortConfigTable_entry * ent;
//entry = SNMP_MALLOC_TYPEDEF(struct lldpPortConfigTable_entry);
//if(!entry)
//return 0;
// row = netsnmp_tdata_create_row();
//if(!row) {
// SNMP_FREE(entry);
// return 0;
// }
// row->data = entry;
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_HANDLER_NAME);
/*
* Initialise the contents of the table here
*/
DEBUGMSGTL(("lldpPortConfigTable", "check and reload\n"));
netsnmp_cache_check_and_reload( cache );
/* 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 */
// row = lldpPortConfigTable_createEntry(table_data, tempNode->port_tab_portnum);
/* ent = (struct lldpPortConfigTable_entry*) (row->data);
ent->lldpPortConfigAdminStatus = tempNode->port_tab_status;
ent->old_lldpPortConfigAdminStatus = 0;
ent->lldpPortConfigNotificationEnable = tempNode->port_tab_notify;
ent->old_lldpPortConfigAdminStatus = 0;
ent->lldpPortConfigTLVsTxEnable[0] = tempNode->port_tab_tlvs;
ent->lldpPortConfigTLVsTxEnable_len = 1;
ent->old_lldpPortConfigTLVsTxEnable[0] = 0;
ent->old_lldpPortConfigTLVsTxEnable_len = 1;
}
SNMP_FREE(tempNode);
tempNode = NULL; */
alreadyReg = 1;
alreadyDereg = 0;
}
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;
alreadyReg = 0;
}
/*
* 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
*/
static short int j = 0;
int
lldpPortConfigTable_load(netsnmp_cache * cache, void *vmagic) {
netsnmp_tdata * table = (netsnmp_tdata *) vmagic;
netsnmp_tdata_row *row;
short int i;
struct lldpPortConfigTable_entry * ent;
/* entry = SNMP_MALLOC_TYPEDEF(struct lldpPortConfigTable_entry);
if(!entry)
return 0;
row = netsnmp_tdata_create_row();
if(!row) {
SNMP_FREE(entry);
return 0;
}
row->data = entry; */
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=j; i<j+4; i++)
{
DEBUGMSGTL(("lldpPortConfigTable", "cache for loop%d\n", i));
tempNode->port_tab_portnum = i+1;
tempNode->port_tab_status = (i+1) % 4 + 1; /* 1 thru 4 */
tempNode->port_tab_notify = i % 2; /* true or false */
tempNode->port_tab_tlvs = bits[i % 4]; /* 0 - 3 */
row = lldpPortConfigTable_createEntry(table, tempNode->port_tab_portnum);
ent = (struct lldpPortConfigTable_entry *)(row->data);
ent->lldpPortConfigAdminStatus = tempNode->port_tab_status;
ent->old_lldpPortConfigAdminStatus = 0;
ent->lldpPortConfigNotificationEnable = tempNode->port_tab_notify;
ent->old_lldpPortConfigAdminStatus = 0;
ent->lldpPortConfigTLVsTxEnable[0] = tempNode->port_tab_tlvs;
ent->lldpPortConfigTLVsTxEnable_len = 1;
ent->old_lldpPortConfigTLVsTxEnable[0] = 0;
ent->old_lldpPortConfigTLVsTxEnable_len = 1;
DEBUGMSGTL(("lldpPortConfigTable", "cache for loop bottom%d\n", i));
}
j = i;
SNMP_FREE(tempNode);
tempNode = NULL;
DEBUGMSGTL(("lldpPortConfigTable", "cache after loop%d\n", j));
return(SNMP_ERR_NOERROR);
}
void
lldpPortConfigTable_free(netsnmp_cache * cache, void *vmagic) {
// netsnmp_tdata * table = (netsnmp_tdata *) vmagic;
netsnmp_tdata_row *thisRow;
netsnmp_tdata * table;
table = (netsnmp_tdata *) vmagic;
DEBUGMSGTL(("lldpPortConfigTable", "cache free\n"));
/* change from netsnmp_tdata_get_first_row */
while ((thisRow = netsnmp_tdata_row_first(table))) {
DEBUGMSGTL(("lldpPortConfigTable", "cache free while\n"));
netsnmp_tdata_remove_and_delete_row(table, thisRow);
DEBUGMSGTL(("lldpPortConfigTable", "cache free while2\n"));
}
}
/** 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;
}
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
#ifdef __cplusplus
extern "C" {
#endif
/*
* 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 30 // 30, 60, -1
/*
* 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 */
#ifdef __cplusplus
}
#endif