Hi all, I'm trying to develop a private mib module that involves both
scalars and a couple of tables. I don't have any problems with the scalars,
I can read them using snmpwalk without problems. But when I try to read a
table..the snmpd deamon crashes. I use mib2c to generate my code's template,
and after that only includes a couple of threads that will read some files
constantly and fill my mibs tables. Could anyone give me an idea of where to
start to lookaround???
Here is part of my mib file (one of the tables)...
MonThreadsTable OBJECT-TYPE
SYNTAX SEQUENCE OF monThreadsEntry
MAX-ACCESS not-accessible
STATUS current
DESCRIPTION
"softelMonitor Threads Info table"
::= { softelMonitor 1 }
monThreadsEntry OBJECT-TYPE
SYNTAX monThreadsDetailsEntry
ACCESS not-accessible
STATUS current
DESCRIPTION
"The monThreadsEntry row definition."
INDEX { IdThread }
::= { MonThreadsTable 1 }
monThreadsDetailsEntry ::=
SEQUENCE {
IdThread INTEGER,
ProcTime Unsigned32,
MaxProcTime Unsigned32,
ExecNumber Unsigned32
}
IdThread OBJECT-TYPE
SYNTAX INTEGER
ACCESS read-only
STATUS current
DESCRIPTION
"Thread Id"
::= { monThreadsEntry 1 }
ProcTime OBJECT-TYPE
SYNTAX Unsigned32
ACCESS read-only
STATUS current
DESCRIPTION
"Thread's last processing time"
::= { monThreadsEntry 2 }
MaxProcTime OBJECT-TYPE
SYNTAX Unsigned32
ACCESS read-only
STATUS current
DESCRIPTION
"Thread's maximum processing time"
::= { monThreadsEntry 3 }
ExecNumber OBJECT-TYPE
SYNTAX Unsigned32
ACCESS read-only
STATUS current
DESCRIPTION
"Thread's executions count"
::= { monThreadsEntry 4 }
and here's the code mib2c generated...I will include the data acquisition
fucntions I made
/* Typical data structure for a row entry */
typedef struct MonThreadsTable_entry_s
{
/* Column values */
long IdThread;
u_long ProcTime;
u_long MaxProcTime;
u_long ExecNumber;
/* Illustrate using a simple linked list */
int valid;
struct MonThreadsTable_entry_s *next;
}MonThreadsTable_entry;
MonThreadsTable_entry *MonThreadsTable_head=NULL;
void MonThreadsTable_createEntry(MonThreadsTable_entry *data);
MonThreadsTable_entry *MonThreadsTable_fetchEntry(MonThreadsTable_entry
*entry);
void MonThreadsTable_removeEntry(MonThreadsTable_entry *entry );
void AnalizeProcMon(char *buffer,int len_buffer)
{
MonThreadsTable_entry data;
MonThreadsTable_entry *ptr;
ptr=NULL;
sscanf(buffer,"%ld %ld %ld %ld",&data.IdThread,
&data.ProcTime,&data.MaxProcTime,&data.ExecNumber);
ptr=MonThreadsTable_fetchEntry(&data);
if(ptr==NULL)
MonThreadsTable_createEntry(&data);
else
{
ptr->ProcTime=data.ProcTime;
ptr->MaxProcTime=data.MaxProcTime;
ptr->ExecNumber=data.ExecNumber;
}
}
void *setProcMonThread(void *parameter)
{
FILE *fp;
int sizeBuffer;
sizeBuffer = 100;
int len_buffer=0;
char buffer[sizeBuffer];
while( 1 )
{
// Obteniendo flujo de datos
fp = fopen( "/usr/monitorMSC/procesosSNMP.dat", "r" );
if ( fp == NULL )
return NULL;
memset(buffer,0x0,sizeBuffer);
while( feof( fp ) == 0 )
{
buffer[len_buffer]=fgetc(fp);
len_buffer++;
if(buffer[len_buffer-1]=='\n')
{
//DEBUGMSGTL(("softelMonitor", "Trama ProcMon\n"));
//DEBUGMSGTL(("softelMonitor", buffer));
AnalizeProcMon(buffer,len_buffer-1);
len_buffer=0;
memset(buffer,0x0,sizeBuffer);
}
}
fclose(fp);
sleep(5);
}
}// FIN setProcMonThread()
/** Initialize the MonThreadsTable table by defining its contents and how
it's structured */
void initialize_table_MonThreadsTable(void)
{
static oid MonThreadsTable_oid[] = {1,3,6,1,4,1,17723,2,1,1,19,1};
size_t MonThreadsTable_oid_len = OID_LENGTH(MonThreadsTable_oid);
netsnmp_handler_registration *reg;
netsnmp_iterator_info *iinfo;
netsnmp_table_registration_info *table_info;
reg = netsnmp_create_handler_registration(
"MonThreadsTable",
MonThreadsTable_handler,
MonThreadsTable_oid,
MonThreadsTable_oid_len,
HANDLER_CAN_RONLY);
/** create the table structure itself */
table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
/*indica que solo tenemos un índice de tipo entero*/
netsnmp_table_helper_add_indexes(table_info,
ASN_INTEGER, /* index: IdThread */
0);
/*define el minimo y maximo de columnas accesibles*/
table_info->min_column = 1;
table_info->max_column = 4;
iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
iinfo->get_first_data_point = MonThreadsTable_get_first_data_point;
iinfo->get_next_data_point = MonThreadsTable_get_next_data_point;
iinfo->table_reginfo = table_info;
netsnmp_register_table_iterator( reg, iinfo );
DEBUGMSGTL(("softelMonitor", "threads init\n"));
/* Initialise the contents of the table here */
}
/* create a new row in the (unsorted) table */
void MonThreadsTable_createEntry(MonThreadsTable_entry *data)
{
MonThreadsTable_entry *entry;
entry = (MonThreadsTable_entry *)malloc(sizeof(MonThreadsTable_entry));
//entry = SNMP_MALLOC_TYPEDEF(MonThreadsTable_entry);
if (!entry)
return;
entry->IdThread = data->IdThread;
entry->ProcTime= data->ProcTime;
entry->MaxProcTime= data->MaxProcTime;
entry->ExecNumber= data->ExecNumber;
entry->next = MonThreadsTable_head;
MonThreadsTable_head = entry;
}
/*fetch a row from the table*/
MonThreadsTable_entry *MonThreadsTable_fetchEntry(MonThreadsTable_entry
*entry)
{
MonThreadsTable_entry *ptr,*prev;
if (!entry)
return NULL;
for ( ptr = MonThreadsTable_head, prev=NULL;ptr!=NULL;prev=ptr,ptr =
ptr->next)
{
if ( ptr->IdThread == entry->IdThread )
return entry;
}
return NULL;
}
/* remove a row from the table */
void MonThreadsTable_removeEntry(MonThreadsTable_entry *entry )
{
MonThreadsTable_entry *ptr, *prev;
if (!entry)
return; /* Nothing to remove */
for ( ptr = MonThreadsTable_head, prev=NULL;ptr!=NULL;prev=ptr,ptr =
ptr->next)
{
if ( ptr->IdThread == entry->IdThread )
break;
}
if ( !ptr )
return; /* Can't find it */
if ( prev == NULL )
MonThreadsTable_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 *MonThreadsTable_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 = MonThreadsTable_head;
return MonThreadsTable_get_next_data_point(my_loop_context,
my_data_context,
put_index_data, mydata );
}
netsnmp_variable_list *MonThreadsTable_get_next_data_point(void
**my_loop_context,
void **my_data_context,
netsnmp_variable_list *put_index_data,
netsnmp_iterator_info *mydata)
{
MonThreadsTable_entry *entry = (MonThreadsTable_entry
*)*my_loop_context;
netsnmp_variable_list *idx = put_index_data;
if ( entry )
{
snmp_set_var_value( idx,(u_char *)entry->IdThread,
sizeof(entry->IdThread) );
idx = idx->next_variable;
*my_data_context = (void *)entry;
*my_loop_context = (void *)entry->next;
}
else
{
return NULL;
}
return idx;
}
/** handles requests for the MonThreadsTable table */
int MonThreadsTable_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;
MonThreadsTable_entry *table_entry;
DEBUGMSGTL(("softelMonitor", "handler threads mode_get\n"));
switch (reqinfo->mode)
{
/*
* Read-support (also covers GetNext requests)
*/
case MODE_GET:
for (request=requests; request; request=request->next) {
table_entry = (MonThreadsTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info(request);
switch (table_info->colnum)
{
case COLUMN_IDTHREAD:
snmp_set_var_typed_value(
request->requestvb,ASN_INTEGER,
(u_char *)table_entry->IdThread,
sizeof(table_entry->IdThread));
break;
case COLUMN_PROCTIME:
snmp_set_var_typed_value( request->requestvb,
ASN_UNSIGNED,
(u_char *)table_entry->ProcTime,
sizeof(table_entry->ProcTime));
break;
case COLUMN_MAXPROCTIME:
snmp_set_var_typed_value( request->requestvb,
ASN_UNSIGNED,
(u_char
*)table_entry->MaxProcTime,
sizeof(table_entry->MaxProcTime));
break;
case COLUMN_EXECNUMBER:
snmp_set_var_typed_value( request->requestvb,
ASN_UNSIGNED,
(u_char *)table_entry->ExecNumber,
sizeof(table_entry->ExecNumber));
break;
}
}
break;
}
return SNMP_ERR_NOERROR;
}
Thanks in advance,
Alejandro
-------------------------------------------------------------------------
This SF.net email is sponsored by the 2008 JavaOne(SM) Conference
Don't miss this year's exciting event. There's still time to save $100.
Use priority code J8TL2D2.
http://ad.doubleclick.net/clk;198757673;13503038;p?http://java.sun.com/javaone
_______________________________________________
Net-snmp-coders mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/net-snmp-coders