blob: 61816287ded9a232cb10f25d806eebd5e31b5eab [file] [log] [blame]
/*--------------------------------------------------------------------------+
| Edition History: |
| # Date Comments By |
| --- -------- -------------------------------------------------------- --- |
| 1 07/05/18 Created. emi |
+--------------------------------------------------------------------------*/
/*
* Note: this file originally auto-generated by mib2c using
* : mib2c.table_data.conf,v 1.11.2.1 2006/01/11 15:17:47 dts12 Exp $
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-features.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "utilities/iquery.h"
#include "alarmTable.h"
netsnmp_feature_require(iquery)
netsnmp_feature_require(query_set_default_session)
netsnmp_feature_require(table_tdata)
netsnmp_feature_require(check_vb_type_and_max_size)
netsnmp_feature_require(table_tdata_extract_table)
#ifndef NETSNMP_NO_WRITE_SUPPORT
netsnmp_feature_require(table_tdata_insert_row)
netsnmp_feature_require(iquery_pdu_session)
#endif /* NETSNMP_NO_WRITE_SUPPORT */
/** Initializes the alarmTable module */
void
init_alarmTable(void)
{
/*
* here we initialize all the tables we're planning on supporting
*/
initialize_table_alarmTable();
}
/** Initialize the alarmTable table by defining its contents and how it's structured */
void
initialize_table_alarmTable(void)
{
static oid alarmTable_oid[] = { 1, 3, 6, 1, 2, 1, 16, 3, 1 };
size_t alarmTable_oid_len = OID_LENGTH(alarmTable_oid);
netsnmp_handler_registration *reg;
netsnmp_tdata *table_data;
netsnmp_table_registration_info *table_info;
DEBUGMSGTL(( "rmon:alarmTable", "initialize_table_alarmTable called.\n"));
reg =
netsnmp_create_handler_registration("alarmTable",
alarmTable_handler,
alarmTable_oid,
alarmTable_oid_len,
HANDLER_CAN_RWRITE);
table_data = netsnmp_tdata_create_table("alarmTable", 0);
table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, /* index: alarmIndex */
0);
table_info->min_column = COLUMN_ALARMINDEX;
table_info->max_column = COLUMN_ALARMSTATUS;
netsnmp_tdata_register(reg, table_data, table_info);
/*
* Initialise the contents of the table here
*/
}
extern int
event_api_send_alarm(u_char is_rising,
u_long alarm_index,
u_long event_index,
oid * alarmed_var,
size_t alarmed_var_length,
u_long sample_type,
u_long value,
u_long the_threshold, const char *alarm_descr);
#define ALARM_STR1_LEN 32
typedef enum {
RMON1_ENTRY_VALID = 1,
RMON1_ENTRY_CREATE_REQUEST,
RMON1_ENTRY_UNDER_CREATION,
RMON1_ENTRY_INVALID
} RMON1_ENTRY_STATUS_T;
typedef enum {
SAMPLE_TYPE_ABSOLUTE =
1,
SAMPLE_TYPE_DELTE
} SAMPLE_TYPE_T;
typedef enum {
ALARM_NOTHING =
0,
ALARM_RISING,
ALARM_FALLING,
ALARM_BOTH
} ALARM_TYPE_T;
/*
* Typical data structure for a row entry
*/
struct alarmTable_entry {
/*
* Index values
*/
long alarmIndex;
/*
* Column values
*/
long alarmInterval;
long old_alarmInterval;
oid alarmVariable[ALARM_STR1_LEN];
size_t alarmVariable_len;
oid old_alarmVariable[ALARM_STR1_LEN];
size_t old_alarmVariable_len;
long alarmSampleType;
long old_alarmSampleType;
long alarmValue;
long alarmStartupAlarm;
long old_alarmStartupAlarm;
long alarmRisingThreshold;
long old_alarmRisingThreshold;
long alarmFallingThreshold;
long old_alarmFallingThreshold;
long alarmRisingEventIndex;
long old_alarmRisingEventIndex;
long alarmFallingEventIndex;
long old_alarmFallingEventIndex;
char alarmOwner[ALARM_STR1_LEN];
size_t alarmOwner_len;
char old_alarmOwner[ALARM_STR1_LEN];
size_t old_alarmOwner_len;
long alarmStatus;
long old_alarmStatus;
int valid;
unsigned int alarm_reg;
netsnmp_session *session;
u_long last_abs_value;
ALARM_TYPE_T prev_alarm; /* NOTHING | RISING | FALLING */
};
void
alarmTable_run( unsigned int reg, void *clientarg)
{
struct alarmTable_entry *entry = (struct alarmTable_entry *)clientarg;
netsnmp_variable_list *var;
u_long new_value;
int rc;
if (!entry) {
snmp_alarm_unregister( reg );
return;
}
/*
* Retrieve the requested MIB value(s)...
*/
DEBUGMSGTL(( "rmon:alarmTable", "alarmTable_run called\n"));
var = (netsnmp_variable_list *)SNMP_MALLOC_TYPEDEF( netsnmp_variable_list );
if (!var) {
snmp_log(LOG_ERR,"failed to create alarmTable query varbind");
return;
}
snmp_set_var_objid( var, entry->alarmVariable,
entry->alarmVariable_len );
rc = netsnmp_query_get( var, entry->session );
if ( rc != SNMP_ERR_NOERROR ) {
DEBUGMSGTL(( "rmon:alarmTable", "alarmVariable query failed (%d)\n", rc));
snmp_free_varbind(var);
return;
}
switch (var->type) {
case ASN_INTEGER:
case ASN_COUNTER:
case ASN_TIMETICKS:
case ASN_GAUGE:
case ASN_COUNTER64:
new_value = *var->val.integer;
break;
default:
DEBUGMSGTL(("rmon:alarmTable", "invalid type (%d)\n", var->type));
snmp_free_varbind(var);
return ;
}
DEBUGMSGTL(("rmon:alarmTable", "alarmIndex.%ld last value (%ld)\n", entry->alarmIndex, entry->last_abs_value));
DEBUGMSGTL(("rmon:alarmTable", "alarmIndex.%ld new_value (%ld)\n", entry->alarmIndex, new_value));
entry->alarmValue = (SAMPLE_TYPE_ABSOLUTE == entry->alarmSampleType) ?
new_value : new_value - entry->last_abs_value;
entry->last_abs_value = new_value;
if (ALARM_RISING != entry->prev_alarm &&
entry->alarmValue >= entry->alarmRisingThreshold) {
if (SNMP_ERR_NOERROR == event_api_send_alarm(1, entry->alarmIndex,
entry->alarmRisingEventIndex,
entry->alarmVariable,
entry->alarmVariable_len,
entry->alarmSampleType,
entry->alarmValue,
entry->alarmRisingThreshold,
"Rising"))
entry->prev_alarm = ALARM_RISING;
else
snmp_log(LOG_ERR,"failed to send rising alarm\n");
}
else if (ALARM_FALLING != entry->prev_alarm &&
entry->alarmValue <= entry->alarmFallingThreshold) {
if (SNMP_ERR_NOERROR == event_api_send_alarm(0, entry->alarmIndex,
entry->alarmFallingEventIndex,
entry->alarmVariable,
entry->alarmVariable_len,
entry->alarmSampleType,
entry->alarmValue,
entry->alarmFallingThreshold,
"Falling"))
entry->prev_alarm = ALARM_FALLING;
else
snmp_log(LOG_ERR,"failed to send falling alarm\n");
}
else
DEBUGMSGTL(("rmon:alarmTable", "no alarm sent\n"));
snmp_free_varbind(var);
}
void
alarmTable_enable( struct alarmTable_entry *entry )
{
if (!entry)
return;
DEBUGMSGTL(( "rmon:alarmTable", "alarmTable_enable called.\n"));
if (entry->alarm_reg) {
snmp_alarm_unregister( entry->alarm_reg );
entry->alarm_reg = 0;
}
if (entry->alarmInterval) {
/*
* register once to run ASAP, and another to run
* at the trigger frequency
*/
snmp_alarm_register(0, 0, alarmTable_run, entry );
entry->alarm_reg = snmp_alarm_register(
entry->alarmInterval, SA_REPEAT,
alarmTable_run, entry );
}
}
void
alarmTable_disable( struct alarmTable_entry *entry )
{
if (!entry)
return;
DEBUGMSGTL(( "rmon:alarmTable", "alarmTable_disable called.\n"));
if (entry->alarm_reg) {
snmp_alarm_unregister( entry->alarm_reg );
entry->alarm_reg = 0;
/* XXX - perhaps release any previous results */
}
}
/*
* create a new row in the table
*/
netsnmp_tdata_row *
alarmTable_createEntry(netsnmp_tdata * table_data, long alarmIndex)
{
struct alarmTable_entry *entry;
netsnmp_tdata_row *row;
DEBUGMSGTL(( "rmon:alarmTable", "alarmTable_createEntry called.\n"));
entry = SNMP_MALLOC_TYPEDEF(struct alarmTable_entry);
if (!entry)
return NULL;
row = netsnmp_tdata_create_row();
if (!row) {
SNMP_FREE(entry);
return NULL;
}
row->data = entry;
entry->alarmIndex = alarmIndex;
entry->alarmInterval = 1;
entry->alarmSampleType = SAMPLE_TYPE_ABSOLUTE;
entry->alarmStartupAlarm = ALARM_BOTH;
entry->alarmRisingThreshold = 10;
entry->alarmFallingThreshold = 5;
entry->alarmRisingEventIndex = alarmIndex;
entry->alarmFallingEventIndex = alarmIndex;
entry->prev_alarm = ALARM_NOTHING;
netsnmp_tdata_row_add_index(row, ASN_INTEGER,
&(entry->alarmIndex),
sizeof(entry->alarmIndex));
netsnmp_tdata_add_row(table_data, row);
return row;
}
/*
* remove a row from the table
*/
void
alarmTable_removeEntry(netsnmp_tdata * table_data, netsnmp_tdata_row * row)
{
struct alarmTable_entry *entry;
DEBUGMSGTL(( "rmon:alarmTable", "alarmTable_removeEntry called.\n"));
if (!row)
return; /* Nothing to remove */
entry = (struct alarmTable_entry *)
netsnmp_tdata_remove_and_delete_row(table_data, row);
if (entry) {
alarmTable_disable(entry);
SNMP_FREE(entry); /* XXX - release any other internal resources */
}
}
/** handles requests for the alarmTable table */
int
alarmTable_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 alarmTable_entry *table_entry;
int ret;
netsnmp_session *sess = NULL;
char *secName;
DEBUGMSGTL(( "rmon:alarmTable", "alarmTable_handler called.\n"));
switch (reqinfo->mode) {
/*
* Read-support (also covers GetNext requests)
*/
case MODE_GET:
for (request = requests; request; request = request->next) {
table_entry = (struct alarmTable_entry *)
netsnmp_tdata_extract_entry(request);
table_info = netsnmp_extract_table_info(request);
switch (table_info->colnum) {
case COLUMN_ALARMINDEX:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->alarmIndex);
break;
case COLUMN_ALARMINTERVAL:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->alarmInterval);
break;
case COLUMN_ALARMVARIABLE:
snmp_set_var_typed_value(request->requestvb, ASN_OBJECT_ID,
(u_char *) table_entry->
alarmVariable,
table_entry->alarmVariable_len *
sizeof(oid));
break;
case COLUMN_ALARMSAMPLETYPE:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->alarmSampleType);
break;
case COLUMN_ALARMVALUE:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->alarmValue);
break;
case COLUMN_ALARMSTARTUPALARM:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->alarmStartupAlarm);
break;
case COLUMN_ALARMRISINGTHRESHOLD:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->
alarmRisingThreshold);
break;
case COLUMN_ALARMFALLINGTHRESHOLD:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->
alarmFallingThreshold);
break;
case COLUMN_ALARMRISINGEVENTINDEX:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->
alarmRisingEventIndex);
break;
case COLUMN_ALARMFALLINGEVENTINDEX:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->
alarmFallingEventIndex);
break;
case COLUMN_ALARMOWNER:
snmp_set_var_typed_value(request->requestvb, ASN_OCTET_STR,
(u_char *) table_entry->
alarmOwner,
table_entry->alarmOwner_len);
break;
case COLUMN_ALARMSTATUS:
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
table_entry->alarmStatus);
break;
}
}
break;
/*
* Write-support
*/
case MODE_SET_RESERVE1:
for (request = requests; request; request = request->next) {
table_entry = (struct alarmTable_entry *)
netsnmp_tdata_extract_entry(request);
table_info = netsnmp_extract_table_info(request);
switch (table_info->colnum) {
case COLUMN_ALARMINTERVAL:
/*
* 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;
}
break;
case COLUMN_ALARMVARIABLE:
/*
* or possibly 'netsnmp_check_vb_type_and_max_size'
*/
break;
case COLUMN_ALARMSAMPLETYPE:
/*
* 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;
}
break;
case COLUMN_ALARMSTARTUPALARM:
/*
* 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;
}
break;
case COLUMN_ALARMRISINGTHRESHOLD:
/*
* 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;
}
break;
case COLUMN_ALARMFALLINGTHRESHOLD:
/*
* 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;
}
break;
case COLUMN_ALARMRISINGEVENTINDEX:
/*
* 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;
}
break;
case COLUMN_ALARMFALLINGEVENTINDEX:
/*
* 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;
}
break;
case COLUMN_ALARMOWNER:
/*
* or possibly 'netsnmp_check_vb_type_and_max_size'
*/
break;
case COLUMN_ALARMSTATUS:
/*
* 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;
}
break;
default:
netsnmp_set_request_error(reqinfo, request,
SNMP_ERR_NOTWRITABLE);
return SNMP_ERR_NOERROR;
}
}
break;
case MODE_SET_RESERVE2:
for (request = requests; request; request = request->next) {
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_ALARMINTERVAL:
case COLUMN_ALARMVARIABLE:
case COLUMN_ALARMSAMPLETYPE:
case COLUMN_ALARMSTARTUPALARM:
case COLUMN_ALARMRISINGTHRESHOLD:
case COLUMN_ALARMFALLINGTHRESHOLD:
case COLUMN_ALARMRISINGEVENTINDEX:
case COLUMN_ALARMFALLINGEVENTINDEX:
case COLUMN_ALARMOWNER:
case COLUMN_ALARMSTATUS:
if (!table_row) {
table_row =
alarmTable_createEntry(table_data,
*table_info->indexes->val.
integer);
if (table_row) {
netsnmp_insert_tdata_row(request, table_row);
} else {
netsnmp_set_request_error(reqinfo, request,
SNMP_ERR_RESOURCEUNAVAILABLE);
return SNMP_ERR_NOERROR;
}
}
break;
}
}
break;
case MODE_SET_FREE:
for (request = requests; request; request = request->next) {
table_entry = (struct alarmTable_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_ALARMINTERVAL:
case COLUMN_ALARMVARIABLE:
case COLUMN_ALARMSAMPLETYPE:
case COLUMN_ALARMSTARTUPALARM:
case COLUMN_ALARMRISINGTHRESHOLD:
case COLUMN_ALARMFALLINGTHRESHOLD:
case COLUMN_ALARMRISINGEVENTINDEX:
case COLUMN_ALARMFALLINGEVENTINDEX:
case COLUMN_ALARMOWNER:
case COLUMN_ALARMSTATUS:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
}
break;
}
}
break;
case MODE_SET_ACTION:
for (request = requests; request; request = request->next) {
table_entry = (struct alarmTable_entry *)
netsnmp_tdata_extract_entry(request);
table_info = netsnmp_extract_table_info(request);
switch (table_info->colnum) {
case COLUMN_ALARMINTERVAL:
table_entry->old_alarmInterval =
table_entry->alarmInterval;
table_entry->alarmInterval =
*request->requestvb->val.integer;
break;
case COLUMN_ALARMVARIABLE:
table_entry->alarmVariable_len =
request->requestvb->val_len / sizeof(oid);
memset(table_entry->alarmVariable, 0,
sizeof(table_entry->alarmVariable));
memcpy(table_entry->alarmVariable,
request->requestvb->val.objid,
request->requestvb->val_len);
break;
case COLUMN_ALARMSAMPLETYPE:
table_entry->old_alarmSampleType =
table_entry->alarmSampleType;
table_entry->alarmSampleType =
*request->requestvb->val.integer;
break;
case COLUMN_ALARMSTARTUPALARM:
table_entry->old_alarmStartupAlarm =
table_entry->alarmStartupAlarm;
table_entry->alarmStartupAlarm =
*request->requestvb->val.integer;
break;
case COLUMN_ALARMRISINGTHRESHOLD:
table_entry->old_alarmRisingThreshold =
table_entry->alarmRisingThreshold;
table_entry->alarmRisingThreshold =
*request->requestvb->val.integer;
break;
case COLUMN_ALARMFALLINGTHRESHOLD:
table_entry->old_alarmFallingThreshold =
table_entry->alarmFallingThreshold;
table_entry->alarmFallingThreshold =
*request->requestvb->val.integer;
break;
case COLUMN_ALARMRISINGEVENTINDEX:
table_entry->old_alarmRisingEventIndex =
table_entry->alarmRisingEventIndex;
table_entry->alarmRisingEventIndex =
*request->requestvb->val.integer;
break;
case COLUMN_ALARMFALLINGEVENTINDEX:
table_entry->old_alarmFallingEventIndex =
table_entry->alarmFallingEventIndex;
table_entry->alarmFallingEventIndex =
*request->requestvb->val.integer;
break;
case COLUMN_ALARMOWNER:
memcpy(table_entry->old_alarmOwner,
table_entry->alarmOwner,
sizeof(table_entry->alarmOwner));
table_entry->old_alarmOwner_len =
table_entry->alarmOwner_len;
memset(table_entry->alarmOwner, 0,
sizeof(table_entry->alarmOwner));
memcpy(table_entry->alarmOwner,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->alarmOwner_len = request->requestvb->val_len;
break;
case COLUMN_ALARMSTATUS:
table_entry->old_alarmStatus = table_entry->alarmStatus;
table_entry->alarmStatus =
*request->requestvb->val.integer;
break;
}
}
break;
case MODE_SET_UNDO:
for (request = requests; request; request = request->next) {
table_entry = (struct alarmTable_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_ALARMINTERVAL:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
table_entry->alarmInterval =
table_entry->old_alarmInterval;
table_entry->old_alarmInterval = 0;
}
break;
case COLUMN_ALARMVARIABLE:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
memcpy(table_entry->alarmVariable,
table_entry->old_alarmVariable,
sizeof(table_entry->alarmVariable));
memset(table_entry->old_alarmVariable, 0,
sizeof(table_entry->alarmVariable));
table_entry->alarmVariable_len =
table_entry->old_alarmVariable_len;
}
break;
case COLUMN_ALARMSAMPLETYPE:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
table_entry->alarmSampleType =
table_entry->old_alarmSampleType;
table_entry->old_alarmSampleType = 0;
}
break;
case COLUMN_ALARMSTARTUPALARM:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
table_entry->alarmStartupAlarm =
table_entry->old_alarmStartupAlarm;
table_entry->old_alarmStartupAlarm = 0;
}
break;
case COLUMN_ALARMRISINGTHRESHOLD:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
table_entry->alarmRisingThreshold =
table_entry->old_alarmRisingThreshold;
table_entry->old_alarmRisingThreshold = 0;
}
break;
case COLUMN_ALARMFALLINGTHRESHOLD:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
table_entry->alarmFallingThreshold =
table_entry->old_alarmFallingThreshold;
table_entry->old_alarmFallingThreshold = 0;
}
break;
case COLUMN_ALARMRISINGEVENTINDEX:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
table_entry->alarmRisingEventIndex =
table_entry->old_alarmRisingEventIndex;
table_entry->old_alarmRisingEventIndex = 0;
}
break;
case COLUMN_ALARMFALLINGEVENTINDEX:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
table_entry->alarmFallingEventIndex =
table_entry->old_alarmFallingEventIndex;
table_entry->old_alarmFallingEventIndex = 0;
}
break;
case COLUMN_ALARMOWNER:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
memcpy(table_entry->alarmOwner,
table_entry->old_alarmOwner,
sizeof(table_entry->alarmOwner));
memset(table_entry->old_alarmOwner, 0,
sizeof(table_entry->alarmOwner));
table_entry->alarmOwner_len =
table_entry->old_alarmOwner_len;
}
break;
case COLUMN_ALARMSTATUS:
if (table_entry && !table_entry->valid) {
alarmTable_removeEntry(table_data, table_row);
} else {
table_entry->alarmStatus =
table_entry->old_alarmStatus;
table_entry->old_alarmStatus = 0;
}
break;
}
}
break;
case MODE_SET_COMMIT:
for (request = requests; request; request = request->next) {
table_entry = (struct alarmTable_entry *)
netsnmp_tdata_extract_entry(request);
table_info = netsnmp_extract_table_info(request);
switch (table_info->colnum) {
case COLUMN_ALARMINTERVAL:
case COLUMN_ALARMVARIABLE:
case COLUMN_ALARMSAMPLETYPE:
case COLUMN_ALARMSTARTUPALARM:
case COLUMN_ALARMRISINGTHRESHOLD:
case COLUMN_ALARMFALLINGTHRESHOLD:
case COLUMN_ALARMRISINGEVENTINDEX:
case COLUMN_ALARMFALLINGEVENTINDEX:
case COLUMN_ALARMOWNER:
if (table_entry && !table_entry->valid) {
table_entry->valid = 1;
}
break;
case COLUMN_ALARMSTATUS:
switch (*request->requestvb->val.integer) {
case RMON1_ENTRY_VALID:
alarmTable_enable( table_entry );
break;
case RMON1_ENTRY_UNDER_CREATION:
alarmTable_disable( table_entry );
#if 0
table_entry->session = (netsnmp_session *)
netsnmp_iquery_pdu_session(reqinfo->asp->pdu);
#else
secName = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
NETSNMP_DS_AGENT_INTERNAL_SECNAME);
if (secName) {
sess = netsnmp_iquery_user_session(secName);
netsnmp_query_set_default_session(sess);
DEBUGMSGTL(("rmon:alarmTable", "user name %s\n", secName));
} else {
snmp_log(LOG_ERR, "user name %s not found\n", secName);
config_perror("Unknown user name\n");
}
if (NULL == sess) {
sess = netsnmp_query_get_default_session();
if (NULL == sess) {
config_perror
("You must specify a default user name using the agentSecName token\n");
return SNMP_ERR_NOERROR;
}
}
#endif
break;
case RMON1_ENTRY_INVALID:
table_row = netsnmp_tdata_extract_row(request);
table_data = netsnmp_tdata_extract_table(request);
alarmTable_removeEntry(table_data, table_row);
}
break;
}
}
break;
}
return SNMP_ERR_NOERROR;
}