Blame agent/mibgroup/Rmon/alarmTable.c

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