> I'm sorry - I don't have the time to try and re-create the rest of the
> code that's missing here. If you want assistance with tracking
> down the problem, can you please post the *complete* code files,
> so that we can try compiling them into a working module.
Here is the code for a cached snmp table module.
Francois
2012/2/13 Dave Shield <d.t.shi...@liverpool.ac.uk>
> On 13 February 2012 15:46, Francois Bouchard <francois.bouch...@mpbc.ca>
> wrote:
> >> Perhaps you could post the code that you're working with
> >> so that we can test this
> > Yes, here is the code for the initialize function (generated using mib2c
> -c
> > mib2c.table_data.conf mpbcRMHAlarmTable (when asked : option 1
> (cache)) )
>
>
> I'm sorry - I don't have the time to try and re-create the rest of the
> code that's missing here. If you want assistance with tracking
> down the problem, can you please post the *complete* code files,
> so that we can try compiling them into a working module.
>
> Dave
>
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "mpbcRMHAlarmTable.h"
#define SD_HOME_NEM_CURALRM "/mnt/sd/MPBC/Alarms/NEM_CurrentAlarm"
#define RMH_NEID_MAX_LEN 100
#define RMH_ALARM_MODULE_LEN 100
#define RMH_ALARM_DESC_LEN 100
#define RMH_TIME_MAX_LEN 100
// lenght of buffer to contain a whole alarm row from file
#define STRMAX 150
/* Typical data structure for a row entry */
struct mpbcRMHAlarmTable_entry {
/* Index values */
long mpbcRMHAlarmIndex;
/* Column values */
char mpbcRMHAlarmNEID[RMH_NEID_MAX_LEN];
size_t mpbcRMHAlarmNEID_len;
long mpbcRMHAlarmSlot;
char mpbcRMHAlarmModule[RMH_ALARM_MODULE_LEN];
size_t mpbcRMHAlarmModule_len;
long mpbcRMHAlarmID;
char mpbcRMHAlarmDescription[RMH_ALARM_DESC_LEN];
size_t mpbcRMHAlarmDescription_len;
long mpbcRMHAlarmSeverity;
char mpbcRMHAlarmStartTime[RMH_TIME_MAX_LEN];
size_t mpbcRMHAlarmStartTime_len;
int valid;
};
/** Initializes the mpbcRMHAlarmTable module */
void init_mpbcRMHAlarmTable(void)
{
/* here we initialize all the tables we're planning on supporting */
initialize_table_mpbcRMHAlarmTable();
}
/** Initialize the mpbcRMHAlarmTable table by defining its contents and how it's structured */
void initialize_table_mpbcRMHAlarmTable(void)
{
const oid mpbcRMHAlarmTable_oid[] = {1,3,6,1,4,1,4464,2,1,1,1};
const size_t mpbcRMHAlarmTable_oid_len = OID_LENGTH(mpbcRMHAlarmTable_oid);
netsnmp_handler_registration *reg;
netsnmp_tdata *table_data;
netsnmp_table_registration_info *table_info;
netsnmp_cache *cache;
DEBUGMSGTL(("mpbcRMHAlarmTable:init", "initializing table mpbcRMHAlarmTable\n"));
snmp_log(LOG_ERR, "initializing table mpbcRMHAlarmTable\n");
reg = netsnmp_create_handler_registration(
"mpbcRMHAlarmTable", mpbcRMHAlarmTable_handler,
mpbcRMHAlarmTable_oid, mpbcRMHAlarmTable_oid_len,
HANDLER_CAN_RONLY
);
table_data = netsnmp_tdata_create_table( "mpbcRMHAlarmTable", 0 );
if (NULL == table_data) {
snmp_log(LOG_ERR,"error creating tdata table for mpbcRMHAlarmTable\n");
return;
}
cache = netsnmp_cache_create(MPBCRMHALARMTABLE_TIMEOUT,
mpbcRMHAlarmTable_load, mpbcRMHAlarmTable_free,
mpbcRMHAlarmTable_oid, mpbcRMHAlarmTable_oid_len);
if (NULL == cache) {
snmp_log(LOG_ERR,"error creating cache for mpbcRMHAlarmTable\n");
}
else
cache->magic = (void *)table_data;
table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
if (NULL == table_info) {
snmp_log(LOG_ERR,"error creating table info for mpbcRMHAlarmTable\n");
return;
}
netsnmp_table_helper_add_indexes(table_info,
ASN_INTEGER, /* index: mpbcRMHAlarmIndex */
0);
table_info->min_column = COLUMN_MPBCRMHALARMNEID;
table_info->max_column = COLUMN_MPBCRMHALARMSTARTTIME;
netsnmp_tdata_register( reg, table_data, table_info );
if (cache) {
netsnmp_inject_handler( reg, netsnmp_cache_handler_get(cache));
}
/* Initialise the contents of the table here */
// N/A
}
/**************************************************************************
FUNCT:
***************************************************************************/
/* create a new row in the table */
netsnmp_tdata_row * mpbcRMHAlarmTable_createEntry(netsnmp_tdata *table_data, long mpbcRMHAlarmIndex)
{
struct mpbcRMHAlarmTable_entry *entry;
netsnmp_tdata_row *row;
snmp_log(LOG_ERR, "mpbcRMHAlarmTable_createEntry\n");
entry = SNMP_MALLOC_TYPEDEF(struct mpbcRMHAlarmTable_entry);
if (!entry)
return NULL;
row = netsnmp_tdata_create_row();
if (!row) {
SNMP_FREE(entry);
return NULL;
}
row->data = entry;
DEBUGMSGT(("mpbcRMHAlarmTable:entry:create", "row 0x%x\n", (uintptr_t)row));
entry->mpbcRMHAlarmIndex = mpbcRMHAlarmIndex;
netsnmp_tdata_row_add_index( row, ASN_INTEGER,
&(entry->mpbcRMHAlarmIndex),
sizeof(entry->mpbcRMHAlarmIndex));
if (table_data)
netsnmp_tdata_add_row( table_data, row );
return row;
}
/**************************************************************************
FUNCT:
***************************************************************************/
/* remove a row from the table */
void mpbcRMHAlarmTable_removeEntry(netsnmp_tdata * table_data, netsnmp_tdata_row *row)
{
struct mpbcRMHAlarmTable_entry *entry;
snmp_log(LOG_ERR, "mpbcRMHAlarmTable_removeEntry\n");
if (!row)
return; /* Nothing to remove */
DEBUGMSGT(("mpbcRMHAlarmTable:entry:remove", "row 0x%x\n", (uintptr_t)row));
entry = (struct mpbcRMHAlarmTable_entry *)row->data;
SNMP_FREE( entry ); /* XXX - release any other internal resources */
if (table_data)
netsnmp_tdata_remove_and_delete_row( table_data, row );
else
netsnmp_tdata_delete_row( row );
}
/**************************************************************************
FUNCT:
***************************************************************************/
/* cache handling - set up table_data list from a suitable file */
int mpbcRMHAlarmTable_load( netsnmp_cache *cache, void *vmagic )
{
long idx = 0;
netsnmp_tdata *table = (netsnmp_tdata *)vmagic;
netsnmp_tdata_row *row;
struct mpbcRMHAlarmTable_entry *this;
FILE *fp;
char buf[STRMAX];
long mpbcRMHAlarmIndex = 0;
/* column items (dummy values for now */
long lmpbcRMHAlarmSlot = 16;
long lmpbcRMHAlarmID = 245;
long lmpbcRMHAlarmSeverity = 1;
char strRMHAlarmNEID[] = "Montreal";
char strRMHAlarmModule[] = "OTM4";
char strRMHAlarmDescription[] = "Loss of frame(s)";
char strRMHAlarmStartTime[] = "13 feb 2012 08:09:12.843";
/* The basic load routine (the data to be reported is held in a file - with one row of the file
for each row of the table. */
fp = fopen( SD_HOME_NEM_CURALRM, "r" );
if ( !fp ) {
return -1;
}
snmp_log(LOG_ERR, "mpbcRMHAlarmTable_load: loaded %s\n", SD_HOME_NEM_CURALRM);
while ( fgets( buf, STRMAX, fp )) {
/* XXX - Unpick 'buf' to extract the individual field values
(or at least the index values for this row) ... */
row = mpbcRMHAlarmTable_createEntry(table, mpbcRMHAlarmIndex++);
if (row == NULL)
continue;
this = (struct mpbcRMHAlarmTable_entry *)row->data;
/* Populate the 'this' data structure with column values extracted from 'buf' above */
// Alarm entry index
this->mpbcRMHAlarmIndex = mpbcRMHAlarmIndex;
// RMH Alarm NEID
memcpy(this->mpbcRMHAlarmNEID, strRMHAlarmNEID, sizeof(strRMHAlarmNEID));
this->mpbcRMHAlarmNEID_len = sizeof(strRMHAlarmNEID);
// RMH Alarm slot number
this->mpbcRMHAlarmSlot = lmpbcRMHAlarmSlot;
// RMH Alarm module name
memcpy(this->mpbcRMHAlarmModule, strRMHAlarmModule, sizeof(strRMHAlarmModule));
this->mpbcRMHAlarmModule_len = sizeof(strRMHAlarmModule);
// RMH Alarm number
this->mpbcRMHAlarmID = lmpbcRMHAlarmID;
// RMH Alarm description
memcpy(this->mpbcRMHAlarmDescription, strRMHAlarmDescription, sizeof(strRMHAlarmDescription));
this->mpbcRMHAlarmDescription_len = sizeof(strRMHAlarmDescription);
// RMH Alarm Severity
this->mpbcRMHAlarmSeverity = lmpbcRMHAlarmSeverity;
// RMH Alarm start time
memcpy(this->mpbcRMHAlarmStartTime, strRMHAlarmStartTime, sizeof(strRMHAlarmStartTime));
this->mpbcRMHAlarmStartTime_len = sizeof(strRMHAlarmStartTime);
}
fclose(fp);
return 0; /* OK */
}
/**************************************************************************
FUNCT:
***************************************************************************/
void mpbcRMHAlarmTable_free( netsnmp_cache *cache, void *vmagic )
{
snmp_log(LOG_ERR, "mpbcRMHAlarmTable_free\n");
netsnmp_tdata *table = (netsnmp_tdata *)vmagic;
netsnmp_tdata_row *this;
while ((this = netsnmp_tdata_row_first(table))) {
netsnmp_tdata_remove_and_delete_row(table, this);
}
}
/**************************************************************************
FUNCT:
***************************************************************************/
/** handles requests for the mpbcRMHAlarmTable table */
int mpbcRMHAlarmTable_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 mpbcRMHAlarmTable_entry *table_entry;
int ret;
DEBUGMSGTL(("mpbcRMHAlarmTable: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 mpbcRMHAlarmTable_entry *)
netsnmp_tdata_extract_entry(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_MPBCRMHALARMNEID:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->mpbcRMHAlarmNEID,
table_entry->mpbcRMHAlarmNEID_len);
break;
case COLUMN_MPBCRMHALARMSLOT:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_integer( request->requestvb, ASN_INTEGER,
table_entry->mpbcRMHAlarmSlot);
break;
case COLUMN_MPBCRMHALARMMODULE:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->mpbcRMHAlarmModule,
table_entry->mpbcRMHAlarmModule_len);
break;
case COLUMN_MPBCRMHALARMID:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_integer( request->requestvb, ASN_INTEGER,
table_entry->mpbcRMHAlarmID);
break;
case COLUMN_MPBCRMHALARMDESCRIPTION:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->mpbcRMHAlarmDescription,
table_entry->mpbcRMHAlarmDescription_len);
break;
case COLUMN_MPBCRMHALARMSEVERITY:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_integer( request->requestvb, ASN_INTEGER,
table_entry->mpbcRMHAlarmSeverity);
break;
case COLUMN_MPBCRMHALARMSTARTTIME:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->mpbcRMHAlarmStartTime,
table_entry->mpbcRMHAlarmStartTime_len);
break;
default:
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHOBJECT);
break;
}
}
break;
}
return SNMP_ERR_NOERROR;
}
#ifndef MPBCRMHALARMTABLE_H
#define MPBCRMHALARMTABLE_H
#define COLUMN_MPBCRMHALARMINDEX 1
#define COLUMN_MPBCRMHALARMNEID 2
#define COLUMN_MPBCRMHALARMSLOT 3
#define COLUMN_MPBCRMHALARMMODULE 4
#define COLUMN_MPBCRMHALARMID 5
#define COLUMN_MPBCRMHALARMDESCRIPTION 6
#define COLUMN_MPBCRMHALARMSEVERITY 7
#define COLUMN_MPBCRMHALARMSTARTTIME 8
#define MPBCRMHALARMTABLE_TIMEOUT 10
/* function declarations */
void init_mpbcRMHAlarmTable(void);
void initialize_table_mpbcRMHAlarmTable(void);
Netsnmp_Node_Handler mpbcRMHAlarmTable_handler;
NetsnmpCacheLoad mpbcRMHAlarmTable_load;
NetsnmpCacheFree mpbcRMHAlarmTable_free;
#endif
------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
Net-snmp-users mailing list
Net-snmp-users@lists.sourceforge.net
Please see the following page to unsubscribe or change other options:
https://lists.sourceforge.net/lists/listinfo/net-snmp-users