| /*--------------------------------------------------------------------------+ |
| | 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; |
| } |