MFD: ifXTable Data Structures
Let's take a look in ifXTable.h. Since we will be using
the netsnmp access routines to get the interface data, we specified
netsnmp_interface_entry as our data context. You might
expect to run into it a lot in the code. Instead, the code uses
a typedef:
|
|
/*
* data context
*/
typedef netsnmp_interface_entry ifXTable_data;
|
Whenever you see ifXTable_data, remember that it is
simply a typedef for netsnmp_interface_entry. As we will
see in a moment, the the row request context has a pointer to an
ifXTable_data structure. The first edit we need to make
is to include the interface access header file:
|
|
#include <net-snmp/library/asn1.h>
#include <net-snmp/data_access/interface.h>
|
However, the netsnmp_interface_entry does not contain all
the information we need to implement all the ifXTable columns.
In particluar, the ifLinkUpDownTrapEnable and ifAlias columns are
specific to the ifXTable, and not kept in the netsnmp_interface_entry
structure. To keep track of them, we'll add them to the
rowrequest_context. Because we specified a type for our
data context, mib2c did not generate storage for any columns. So
we need to add storage. For consistency's sake, we'll use mib2c to
generate a data context. We specify dummy as the output file
name, so that it won't get confused with the other ifXTable
implementation files.
|
|
$ mib2c -f dummy -c mib2c.column_storage.conf ifXTable
|
Then we copy the definitions we need from dummy_storage.h
to the rowrequest_context in ifXTable.h:
|
|
/*
*********************************************************************
* Row request context
* When your functions are called, you will be passed a
* ifXTable_rowreq_ctx pointer.
*/
typedef struct ifXTable_rowreq_ctx_s {
/** this must be first for container compare to work */
netsnmp_index oid_idx;
oid oid_tmp[MAX_OID_LEN]; /* xxx-rks: shrink this */
ifXTable_mib_index tbl_idx;
ifXTable_data *data;
ifXTable_undo_data *undo;
/** implementor's context pointer provided during registration */
ifXTable_registration_ptr ifXTable_reg;
/*
* TODO:
* add any other useful data
* (e.g. flags for when a column has been set)
*/
/** ifLinkUpDownTrapEnable(14)/INTEGER/ASN_INTEGER/long(u_long)//l/A/W/E/r/d/h */
u_long ifLinkUpDownTrapEnable;
/** ifAlias(18)/DisplayString/ASN_OCTET_STR/char(char)//L/A/W/e/R/d/H */
char ifAlias[64];
size_t ifAlias_len; /* # of char elements, not bytes */
/*
* storage for future expansion
*/
netsnmp_data_list *ifXTable_data_list;
} ifXTable_rowreq_ctx;
|