/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 1.67 $ of : mfd-interface.m2c,v $ 
 *
 * $Id$
 */
/*
 * *********************************************************************
 * *********************************************************************
 * *********************************************************************
 * ***                                                               ***
 * ***  NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE  ***
 * ***                                                               ***
 * ***                                                               ***
 * ***       THIS FILE DOES NOT CONTAIN ANY USER EDITABLE CODE.      ***
 * ***                                                               ***
 * ***                                                               ***
 * ***       THE GENERATED CODE IS INTERNAL IMPLEMENTATION, AND      ***
 * ***                                                               ***
 * ***                                                               ***
 * ***    IS SUBJECT TO CHANGE WITHOUT WARNING IN FUTURE RELEASES.   ***
 * ***                                                               ***
 * ***                                                               ***
 * *********************************************************************
 * *********************************************************************
 * *********************************************************************
 */

/*
 * standard Net-SNMP includes 
 */
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>

/*
 * include our parent header 
 */
#include "ipSystemStatsTable.h"


#include <net-snmp/agent/table_container.h>
#include <net-snmp/library/container.h>

#include "ipSystemStatsTable_interface.h"

#include <ctype.h>

/**********************************************************************
 **********************************************************************
 ***
 *** Table ipSystemStatsTable
 ***
 **********************************************************************
 **********************************************************************/
/*
 * IP-MIB::ipSystemStatsTable is subid 1 of ipTrafficStats.
 * Its status is Current.
 * OID: .1.3.6.1.2.1.4.31.1, length: 9
 */
typedef struct ipSystemStatsTable_interface_ctx_s {

    netsnmp_container *container;
    netsnmp_cache  *cache;

    ipSystemStatsTable_registration *user_ctx;

    netsnmp_table_registration_info tbl_info;

    netsnmp_baby_steps_access_methods access_multiplexer;

} ipSystemStatsTable_interface_ctx;

static ipSystemStatsTable_interface_ctx ipSystemStatsTable_if_ctx;

static void
                _ipSystemStatsTable_container_init(ipSystemStatsTable_interface_ctx *
                                                   if_ctx);
static void
                _ipSystemStatsTable_container_shutdown(ipSystemStatsTable_interface_ctx *
                                                       if_ctx);


netsnmp_container *
ipSystemStatsTable_container_get(void)
{
    return ipSystemStatsTable_if_ctx.container;
}

ipSystemStatsTable_registration *
ipSystemStatsTable_registration_get(void)
{
    return ipSystemStatsTable_if_ctx.user_ctx;
}

ipSystemStatsTable_registration *
ipSystemStatsTable_registration_set(ipSystemStatsTable_registration *
                                    newreg)
{
    ipSystemStatsTable_registration *old =
        ipSystemStatsTable_if_ctx.user_ctx;
    ipSystemStatsTable_if_ctx.user_ctx = newreg;
    return old;
}

int
ipSystemStatsTable_container_size(void)
{
    return CONTAINER_SIZE(ipSystemStatsTable_if_ctx.container);
}

/*
 * mfd multiplexer modes
 */
static Netsnmp_Node_Handler _mfd_ipSystemStatsTable_pre_request;
static Netsnmp_Node_Handler _mfd_ipSystemStatsTable_post_request;
static Netsnmp_Node_Handler _mfd_ipSystemStatsTable_object_lookup;
static Netsnmp_Node_Handler _mfd_ipSystemStatsTable_get_values;
/**
 * @internal
 * Initialize the table ipSystemStatsTable 
 *    (Define its contents and how it's structured)
 */
void
_ipSystemStatsTable_initialize_interface(ipSystemStatsTable_registration *
                                         reg_ptr, u_long flags)
{
    netsnmp_baby_steps_access_methods *access_multiplexer =
        &ipSystemStatsTable_if_ctx.access_multiplexer;
    netsnmp_table_registration_info *tbl_info =
        &ipSystemStatsTable_if_ctx.tbl_info;
    netsnmp_handler_registration *reginfo;
    netsnmp_mib_handler *handler;
    int             mfd_modes = 0;

    DEBUGMSGTL(("internal:ipSystemStatsTable:_ipSystemStatsTable_initialize_interface", "called\n"));


    /*************************************************
     *
     * save interface context for ipSystemStatsTable
     */
    /*
     * Setting up the table's definition
     */
    netsnmp_table_helper_add_indexes(tbl_info, ASN_INTEGER,
                                               /** index: ipSystemStatsIPVersion */
                                     0);

    /*
     * Define the minimum and maximum accessible columns.  This
     * optimizes retrieval. 
     */
    tbl_info->min_column = IPSYSTEMSTATSTABLE_MIN_COL;
    tbl_info->max_column = IPSYSTEMSTATSTABLE_MAX_COL;

    /*
     * save users context
     */
    ipSystemStatsTable_if_ctx.user_ctx = reg_ptr;

    /*
     * call data access initialization code
     */
    ipSystemStatsTable_init_data(reg_ptr);

    /*
     * set up the container
     */
    _ipSystemStatsTable_container_init(&ipSystemStatsTable_if_ctx);
    if (NULL == ipSystemStatsTable_if_ctx.container) {
        snmp_log(LOG_ERR,
                 "could not initialize container for ipSystemStatsTable\n");
        return;
    }

    /*
     * access_multiplexer: REQUIRED wrapper for get request handling
     */
    access_multiplexer->object_lookup =
        _mfd_ipSystemStatsTable_object_lookup;
    access_multiplexer->get_values = _mfd_ipSystemStatsTable_get_values;

    /*
     * no wrappers yet
     */
    access_multiplexer->pre_request = _mfd_ipSystemStatsTable_pre_request;
    access_multiplexer->post_request =
        _mfd_ipSystemStatsTable_post_request;


    /*************************************************
     *
     * Create a registration, save our reg data, register table.
     */
    DEBUGMSGTL(("ipSystemStatsTable:init_ipSystemStatsTable",
                "Registering ipSystemStatsTable as a mibs-for-dummies table.\n"));
    handler =
        netsnmp_baby_steps_access_multiplexer_get(access_multiplexer);
    reginfo =
        netsnmp_handler_registration_create("ipSystemStatsTable", handler,
                                            ipSystemStatsTable_oid,
                                            ipSystemStatsTable_oid_size,
                                            HANDLER_CAN_BABY_STEP |
                                            HANDLER_CAN_RONLY);
    if (NULL == reginfo) {
        snmp_log(LOG_ERR, "error registering table ipSystemStatsTable\n");
        return;
    }
    reginfo->my_reg_void = &ipSystemStatsTable_if_ctx;

    /*************************************************
     *
     * set up baby steps handler, create it and inject it
     */
    if (access_multiplexer->object_lookup)
        mfd_modes |= BABY_STEP_OBJECT_LOOKUP;
    if (access_multiplexer->pre_request)
        mfd_modes |= BABY_STEP_PRE_REQUEST;
    if (access_multiplexer->post_request)
        mfd_modes |= BABY_STEP_POST_REQUEST;

#ifndef NETSNMP_DISABLE_SET_SUPPORT
    if (access_multiplexer->set_values)
        mfd_modes |= BABY_STEP_SET_VALUES;
    if (access_multiplexer->irreversible_commit)
        mfd_modes |= BABY_STEP_IRREVERSIBLE_COMMIT;
    if (access_multiplexer->object_syntax_checks)
        mfd_modes |= BABY_STEP_CHECK_OBJECT;

    if (access_multiplexer->undo_setup)
        mfd_modes |= BABY_STEP_UNDO_SETUP;
    if (access_multiplexer->undo_cleanup)
        mfd_modes |= BABY_STEP_UNDO_CLEANUP;
    if (access_multiplexer->undo_sets)
        mfd_modes |= BABY_STEP_UNDO_SETS;

    if (access_multiplexer->row_creation)
        mfd_modes |= BABY_STEP_ROW_CREATE;
    if (access_multiplexer->consistency_checks)
        mfd_modes |= BABY_STEP_CHECK_CONSISTENCY;
    if (access_multiplexer->commit)
        mfd_modes |= BABY_STEP_COMMIT;
    if (access_multiplexer->undo_commit)
        mfd_modes |= BABY_STEP_UNDO_COMMIT;
#endif

    handler = netsnmp_baby_steps_handler_get(mfd_modes);
    netsnmp_inject_handler(reginfo, handler);

    /*************************************************
     *
     * inject row_merge helper with prefix rootoid_len + 2 (entry.col)
     */
    handler = netsnmp_get_row_merge_handler(reginfo->rootoid_len + 2);
    netsnmp_inject_handler(reginfo, handler);

    /*************************************************
     *
     * inject container_table helper
     */
    handler =
        netsnmp_container_table_handler_get(tbl_info,
                                            ipSystemStatsTable_if_ctx.
                                            container,
                                            TABLE_CONTAINER_KEY_NETSNMP_INDEX);
    netsnmp_inject_handler(reginfo, handler);

    /*************************************************
     *
     * inject cache helper
     */
    if (NULL != ipSystemStatsTable_if_ctx.cache) {
        handler =
            netsnmp_cache_handler_get(ipSystemStatsTable_if_ctx.cache);
        netsnmp_inject_handler(reginfo, handler);
    }

    /*
     * register table
     */
    netsnmp_register_table(reginfo, tbl_info);

}                               /* _ipSystemStatsTable_initialize_interface */

/**
 * @internal
 * Shutdown the table ipSystemStatsTable
 */
void
_ipSystemStatsTable_shutdown_interface(ipSystemStatsTable_registration *
                                       reg_ptr)
{
    /*
     * shutdown the container
     */
    _ipSystemStatsTable_container_shutdown(&ipSystemStatsTable_if_ctx);
}

void
ipSystemStatsTable_valid_columns_set(netsnmp_column_info *vc)
{
    ipSystemStatsTable_if_ctx.tbl_info.valid_columns = vc;
}                               /* ipSystemStatsTable_valid_columns_set */

/**
 * @internal
 * convert the index component stored in the context to an oid
 */
int
ipSystemStatsTable_index_to_oid(netsnmp_index * oid_idx,
                                ipSystemStatsTable_mib_index * mib_idx)
{
    int             err = SNMP_ERR_NOERROR;

    /*
     * temp storage for parsing indexes
     */
    /*
     * ipSystemStatsIPVersion(1)/InetVersion/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h
     */
    netsnmp_variable_list var_ipSystemStatsIPVersion;

    /*
     * set up varbinds
     */
    memset(&var_ipSystemStatsIPVersion, 0x00,
           sizeof(var_ipSystemStatsIPVersion));
    var_ipSystemStatsIPVersion.type = ASN_INTEGER;

    /*
     * chain temp index varbinds together
     */
    var_ipSystemStatsIPVersion.next_variable = NULL;


    DEBUGMSGTL(("verbose:ipSystemStatsTable:ipSystemStatsTable_index_to_oid", "called\n"));

    /*
     * ipSystemStatsIPVersion(1)/InetVersion/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h 
     */
    snmp_set_var_value(&var_ipSystemStatsIPVersion,
                       (u_char *) & mib_idx->ipSystemStatsIPVersion,
                       sizeof(mib_idx->ipSystemStatsIPVersion));


    err = build_oid_noalloc(oid_idx->oids, oid_idx->len, &oid_idx->len,
                            NULL, 0, &var_ipSystemStatsIPVersion);
    if (err)
        snmp_log(LOG_ERR, "error %d converting index to oid\n", err);

    /*
     * parsing may have allocated memory. free it.
     */
    snmp_reset_var_buffers(&var_ipSystemStatsIPVersion);

    return err;
}                               /* ipSystemStatsTable_index_to_oid */

/**
 * extract ipSystemStatsTable indexes from a netsnmp_index
 *
 * @retval SNMP_ERR_NOERROR  : no error
 * @retval SNMP_ERR_GENERR   : error
 */
int
ipSystemStatsTable_index_from_oid(netsnmp_index * oid_idx,
                                  ipSystemStatsTable_mib_index * mib_idx)
{
    int             err = SNMP_ERR_NOERROR;

    /*
     * temp storage for parsing indexes
     */
    /*
     * ipSystemStatsIPVersion(1)/InetVersion/ASN_INTEGER/long(u_long)//l/a/w/E/r/d/h
     */
    netsnmp_variable_list var_ipSystemStatsIPVersion;

    /*
     * set up varbinds
     */
    memset(&var_ipSystemStatsIPVersion, 0x00,
           sizeof(var_ipSystemStatsIPVersion));
    var_ipSystemStatsIPVersion.type = ASN_INTEGER;

    /*
     * chain temp index varbinds together
     */
    var_ipSystemStatsIPVersion.next_variable = NULL;


    DEBUGMSGTL(("verbose:ipSystemStatsTable:ipSystemStatsTable_index_from_oid", "called\n"));

    /*
     * parse the oid into the individual index components
     */
    err = parse_oid_indexes(oid_idx->oids, oid_idx->len,
                            &var_ipSystemStatsIPVersion);
    if (err == SNMP_ERR_NOERROR) {
        /*
         * copy out values
         */
        mib_idx->ipSystemStatsIPVersion =
            *((u_long *) var_ipSystemStatsIPVersion.val.string);


    }

    /*
     * parsing may have allocated memory. free it.
     */
    snmp_reset_var_buffers(&var_ipSystemStatsIPVersion);

    return err;
}                               /* ipSystemStatsTable_index_from_oid */


/*
 *********************************************************************
 * @internal
 * allocate resources for a ipSystemStatsTable_rowreq_ctx
 */
ipSystemStatsTable_rowreq_ctx *
ipSystemStatsTable_allocate_rowreq_ctx(ipSystemStatsTable_data * data,
                                       void *user_init_ctx)
{
    ipSystemStatsTable_rowreq_ctx *rowreq_ctx =
        SNMP_MALLOC_TYPEDEF(ipSystemStatsTable_rowreq_ctx);

    DEBUGMSGTL(("internal:ipSystemStatsTable:ipSystemStatsTable_allocate_rowreq_ctx", "called\n"));

    if (NULL == rowreq_ctx) {
        snmp_log(LOG_ERR, "Couldn't allocate memory for a "
                 "ipSystemStatsTable_rowreq_ctx.\n");
        return NULL;
    } else {
        if (NULL != data) {
            /*
             * track if we got data from user
             */
            rowreq_ctx->rowreq_flags |= MFD_ROW_DATA_FROM_USER;
            rowreq_ctx->data = data;
        } else if (NULL ==
                   (rowreq_ctx->data =
                    ipSystemStatsTable_allocate_data())) {
            SNMP_FREE(rowreq_ctx);
            return NULL;
        }
    }

    /*
     * undo context will be allocated when needed (in *_undo_setup)
     */

    rowreq_ctx->oid_idx.oids = rowreq_ctx->oid_tmp;

    rowreq_ctx->ipSystemStatsTable_data_list = NULL;

    /*
     * if we allocated data, call init routine
     */
    if (!(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER)) {
        if (SNMPERR_SUCCESS !=
            ipSystemStatsTable_rowreq_ctx_init(rowreq_ctx,
                                               user_init_ctx)) {
            ipSystemStatsTable_release_rowreq_ctx(rowreq_ctx);
            rowreq_ctx = NULL;
        }
    }

    return rowreq_ctx;
}                               /* ipSystemStatsTable_allocate_rowreq_ctx */

/*
 * @internal
 * release resources for a ipSystemStatsTable_rowreq_ctx
 */
void
ipSystemStatsTable_release_rowreq_ctx(ipSystemStatsTable_rowreq_ctx *
                                      rowreq_ctx)
{
    DEBUGMSGTL(("internal:ipSystemStatsTable:ipSystemStatsTable_release_rowreq_ctx", "called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    ipSystemStatsTable_rowreq_ctx_cleanup(rowreq_ctx);

    /*
     * for non-transient data, don't free data we got from the user
     */
    if ((rowreq_ctx->data) &&
        !(rowreq_ctx->rowreq_flags & MFD_ROW_DATA_FROM_USER))
        ipSystemStatsTable_release_data(rowreq_ctx->data);

    /*
     * free index oid pointer
     */
    if (rowreq_ctx->oid_idx.oids != rowreq_ctx->oid_tmp)
        free(rowreq_ctx->oid_idx.oids);

    SNMP_FREE(rowreq_ctx);
}                               /* ipSystemStatsTable_release_rowreq_ctx */

/**
 * @internal
 * wrapper
 */
static int
_mfd_ipSystemStatsTable_pre_request(netsnmp_mib_handler *handler,
                                    netsnmp_handler_registration *reginfo,
                                    netsnmp_agent_request_info
                                    *agtreq_info,
                                    netsnmp_request_info *requests)
{
    int             rc;

    DEBUGMSGTL(("internal:ipSystemStatsTable:_mfd_ipSystemStatsTable_pre_request", "called\n"));

    if (1 != netsnmp_row_merge_status_first(reginfo, agtreq_info)) {
        DEBUGMSGTL(("internal:ipSystemStatsTable",
                    "skipping additional pre_request\n"));
        return SNMP_ERR_NOERROR;
    }

    rc = ipSystemStatsTable_pre_request(ipSystemStatsTable_if_ctx.
                                        user_ctx);
    if (MFD_SUCCESS != rc) {
        /*
         * nothing we can do about it but log it
         */
        DEBUGMSGTL(("ipSystemStatsTable", "error %d from "
                    "ipSystemStatsTable_pre_request\n", rc));
        netsnmp_request_set_error_all(requests, SNMP_VALIDATE_ERR(rc));
    }

    return SNMP_ERR_NOERROR;
}                               /* _mfd_ipSystemStatsTable_pre_request */

/**
 * @internal
 * wrapper
 */
static int
_mfd_ipSystemStatsTable_post_request(netsnmp_mib_handler *handler,
                                     netsnmp_handler_registration *reginfo,
                                     netsnmp_agent_request_info
                                     *agtreq_info,
                                     netsnmp_request_info *requests)
{
    ipSystemStatsTable_rowreq_ctx *rowreq_ctx = (ipSystemStatsTable_rowreq_ctx*)
        netsnmp_container_table_row_extract(requests);
    int             rc, packet_rc;

    DEBUGMSGTL(("internal:ipSystemStatsTable:_mfd_ipSystemStatsTable_post_request", "called\n"));

    /*
     * release row context, if deleted
     */
    if (rowreq_ctx && (rowreq_ctx->rowreq_flags & MFD_ROW_DELETED))
        ipSystemStatsTable_release_rowreq_ctx(rowreq_ctx);

    /*
     * wait for last call before calling user
     */
    if (1 != netsnmp_row_merge_status_last(reginfo, agtreq_info)) {
        DEBUGMSGTL(("internal:ipSystemStatsTable",
                    "waiting for last post_request\n"));
        return SNMP_ERR_NOERROR;
    }

    packet_rc = netsnmp_check_all_requests_error(agtreq_info->asp, 0);
    rc = ipSystemStatsTable_post_request(ipSystemStatsTable_if_ctx.
                                         user_ctx, packet_rc);
    if (MFD_SUCCESS != rc) {
        /*
         * nothing we can do about it but log it
         */
        DEBUGMSGTL(("ipSystemStatsTable", "error %d from "
                    "ipSystemStatsTable_post_request\n", rc));
    }

    return SNMP_ERR_NOERROR;
}                               /* _mfd_ipSystemStatsTable_post_request */

/**
 * @internal
 * wrapper
 */
static int
_mfd_ipSystemStatsTable_object_lookup(netsnmp_mib_handler *handler, netsnmp_handler_registration
                                      *reginfo, netsnmp_agent_request_info
                                      *agtreq_info,
                                      netsnmp_request_info *requests)
{
    int             rc = SNMP_ERR_NOERROR;
    ipSystemStatsTable_rowreq_ctx *rowreq_ctx = (ipSystemStatsTable_rowreq_ctx*)
        netsnmp_container_table_row_extract(requests);

    DEBUGMSGTL(("internal:ipSystemStatsTable:_mfd_ipSystemStatsTable_object_lookup", "called\n"));

    /*
     * get our context from mfd
     * ipSystemStatsTable_interface_ctx *if_ctx =
     *             (ipSystemStatsTable_interface_ctx *)reginfo->my_reg_void;
     */

    if (NULL == rowreq_ctx) {
        rc = SNMP_ERR_NOCREATION;
    }

    if (MFD_SUCCESS != rc)
        netsnmp_request_set_error_all(requests, rc);
    else
        ipSystemStatsTable_row_prep(rowreq_ctx);

    return SNMP_VALIDATE_ERR(rc);
}                               /* _mfd_ipSystemStatsTable_object_lookup */

/***********************************************************************
 *
 * GET processing
 *
 ***********************************************************************/
/*
 * @internal
 * Retrieve the value for a particular column
 */
NETSNMP_STATIC_INLINE int
_ipSystemStatsTable_get_column(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
                               netsnmp_variable_list * var, int column)
{
    int             rc = SNMPERR_SUCCESS;

    DEBUGMSGTL(("internal:ipSystemStatsTable:_mfd_ipSystemStatsTable_get_column", "called for %d\n", column));


    netsnmp_assert(NULL != rowreq_ctx);

    switch (column) {

        /*
         * ipSystemStatsInReceives(3)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINRECEIVES:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInReceives_get(rowreq_ctx,
                                         (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCInReceives(4)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCINRECEIVES:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCInReceives_get(rowreq_ctx,
                                           (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsInOctets(5)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINOCTETS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInOctets_get(rowreq_ctx,
                                       (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCInOctets(6)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCINOCTETS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCInOctets_get(rowreq_ctx,
                                         (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsInHdrErrors(7)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINHDRERRORS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInHdrErrors_get(rowreq_ctx,
                                          (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsInNoRoutes(8)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINNOROUTES:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInNoRoutes_get(rowreq_ctx,
                                         (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsInAddrErrors(9)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINADDRERRORS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInAddrErrors_get(rowreq_ctx,
                                           (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsInUnknownProtos(10)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINUNKNOWNPROTOS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInUnknownProtos_get(rowreq_ctx,
                                              (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsInTruncatedPkts(11)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINTRUNCATEDPKTS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInTruncatedPkts_get(rowreq_ctx,
                                              (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsInForwDatagrams(12)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINFORWDATAGRAMS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInForwDatagrams_get(rowreq_ctx,
                                              (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCInForwDatagrams(13)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCINFORWDATAGRAMS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCInForwDatagrams_get(rowreq_ctx,
                                                (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsReasmReqds(14)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSREASMREQDS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsReasmReqds_get(rowreq_ctx,
                                         (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsReasmOKs(15)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSREASMOKS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsReasmOKs_get(rowreq_ctx,
                                       (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsReasmFails(16)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSREASMFAILS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsReasmFails_get(rowreq_ctx,
                                         (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsInDiscards(17)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINDISCARDS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInDiscards_get(rowreq_ctx,
                                         (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsInDelivers(18)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINDELIVERS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInDelivers_get(rowreq_ctx,
                                         (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCInDelivers(19)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCINDELIVERS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCInDelivers_get(rowreq_ctx,
                                           (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsOutRequests(20)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTREQUESTS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutRequests_get(rowreq_ctx,
                                          (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCOutRequests(21)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCOUTREQUESTS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCOutRequests_get(rowreq_ctx,
                                            (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsOutNoRoutes(22)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTNOROUTES:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutNoRoutes_get(rowreq_ctx,
                                          (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsOutForwDatagrams(23)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTFORWDATAGRAMS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutForwDatagrams_get(rowreq_ctx,
                                               (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCOutForwDatagrams(24)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCOUTFORWDATAGRAMS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCOutForwDatagrams_get(rowreq_ctx,
                                                 (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsOutDiscards(25)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTDISCARDS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutDiscards_get(rowreq_ctx,
                                          (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsOutFragReqds(26)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTFRAGREQDS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutFragReqds_get(rowreq_ctx,
                                           (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsOutFragOKs(27)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTFRAGOKS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutFragOKs_get(rowreq_ctx,
                                         (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsOutFragFails(28)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTFRAGFAILS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutFragFails_get(rowreq_ctx,
                                           (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsOutFragCreates(29)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTFRAGCREATES:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutFragCreates_get(rowreq_ctx,
                                             (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsOutTransmits(30)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTTRANSMITS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutTransmits_get(rowreq_ctx,
                                           (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCOutTransmits(31)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCOUTTRANSMITS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCOutTransmits_get(rowreq_ctx,
                                             (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsOutOctets(32)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTOCTETS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutOctets_get(rowreq_ctx,
                                        (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCOutOctets(33)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCOUTOCTETS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCOutOctets_get(rowreq_ctx,
                                          (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsInMcastPkts(34)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINMCASTPKTS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInMcastPkts_get(rowreq_ctx,
                                          (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCInMcastPkts(35)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCINMCASTPKTS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCInMcastPkts_get(rowreq_ctx,
                                            (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsInMcastOctets(36)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINMCASTOCTETS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInMcastOctets_get(rowreq_ctx,
                                            (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCInMcastOctets(37)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCINMCASTOCTETS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCInMcastOctets_get(rowreq_ctx,
                                              (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsOutMcastPkts(38)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTMCASTPKTS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutMcastPkts_get(rowreq_ctx,
                                           (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCOutMcastPkts(39)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCOUTMCASTPKTS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCOutMcastPkts_get(rowreq_ctx,
                                             (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsOutMcastOctets(40)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTMCASTOCTETS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutMcastOctets_get(rowreq_ctx,
                                             (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCOutMcastOctets(41)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCOUTMCASTOCTETS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCOutMcastOctets_get(rowreq_ctx,
                                               (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsInBcastPkts(42)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSINBCASTPKTS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsInBcastPkts_get(rowreq_ctx,
                                          (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCInBcastPkts(43)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCINBCASTPKTS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCInBcastPkts_get(rowreq_ctx,
                                            (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsOutBcastPkts(44)/COUNTER/ASN_COUNTER/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSOUTBCASTPKTS:
        var->val_len = sizeof(u_long);
        var->type = ASN_COUNTER;
        rc = ipSystemStatsOutBcastPkts_get(rowreq_ctx,
                                           (u_long *) var->val.string);
        break;

        /*
         * ipSystemStatsHCOutBcastPkts(45)/COUNTER64/ASN_COUNTER64/U64(U64)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSHCOUTBCASTPKTS:
        var->val_len = sizeof(U64);
        var->type = ASN_COUNTER64;
        rc = ipSystemStatsHCOutBcastPkts_get(rowreq_ctx,
                                             (U64 *) var->val.string);
        break;

        /*
         * ipSystemStatsDiscontinuityTime(46)/TimeStamp/ASN_TIMETICKS/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSDISCONTINUITYTIME:
        var->val_len = sizeof(u_long);
        var->type = ASN_TIMETICKS;
        rc = ipSystemStatsDiscontinuityTime_get(rowreq_ctx,
                                                (u_long *) var->val.
                                                string);
        break;

        /*
         * ipSystemStatsRefreshRate(47)/UNSIGNED32/ASN_UNSIGNED/u_long(u_long)//l/A/w/e/r/d/h 
         */
    case COLUMN_IPSYSTEMSTATSREFRESHRATE:
        var->val_len = sizeof(u_long);
        var->type = ASN_UNSIGNED;
        rc = ipSystemStatsRefreshRate_get(rowreq_ctx,
                                          (u_long *) var->val.string);
        break;

    default:
        snmp_log(LOG_ERR,
                 "unknown column %d in _ipSystemStatsTable_get_column\n",
                 column);
        break;
    }

    return rc;
}                               /* _ipSystemStatsTable_get_column */

int
_mfd_ipSystemStatsTable_get_values(netsnmp_mib_handler *handler,
                                   netsnmp_handler_registration *reginfo,
                                   netsnmp_agent_request_info *agtreq_info,
                                   netsnmp_request_info *requests)
{
    ipSystemStatsTable_rowreq_ctx *rowreq_ctx = (ipSystemStatsTable_rowreq_ctx*)
        netsnmp_container_table_row_extract(requests);
    netsnmp_table_request_info *tri;
    u_char         *old_string;
    void            (*dataFreeHook) (void *);
    int             rc;

    DEBUGMSGTL(("internal:ipSystemStatsTable:_mfd_ipSystemStatsTable_get_values", "called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    for (; requests; requests = requests->next) {
        /*
         * save old pointer, so we can free it if replaced
         */
        old_string = requests->requestvb->val.string;
        dataFreeHook = requests->requestvb->dataFreeHook;
        if (NULL == requests->requestvb->val.string) {
            requests->requestvb->val.string = requests->requestvb->buf;
            requests->requestvb->val_len =
                sizeof(requests->requestvb->buf);
        } else if (requests->requestvb->buf ==
                   requests->requestvb->val.string) {
            if (requests->requestvb->val_len !=
                sizeof(requests->requestvb->buf))
                requests->requestvb->val_len =
                    sizeof(requests->requestvb->buf);
        }

        /*
         * get column data
         */
        tri = netsnmp_extract_table_info(requests);
        if (NULL == tri)
            continue;

        rc = _ipSystemStatsTable_get_column(rowreq_ctx,
                                            requests->requestvb,
                                            tri->colnum);
        if (rc) {
            if (MFD_SKIP == rc) {
                requests->requestvb->type = SNMP_NOSUCHINSTANCE;
                rc = SNMP_ERR_NOERROR;
            }
        } else if (NULL == requests->requestvb->val.string) {
            snmp_log(LOG_ERR, "NULL varbind data pointer!\n");
            rc = SNMP_ERR_GENERR;
        }
        if (rc)
            netsnmp_request_set_error(requests, SNMP_VALIDATE_ERR(rc));

        /*
         * if the buffer wasn't used previously for the old data (i.e. it
         * was allcoated memory)  and the get routine replaced the pointer,
         * we need to free the previous pointer.
         */
        if (old_string && (old_string != requests->requestvb->buf) &&
            (requests->requestvb->val.string != old_string)) {
            if (dataFreeHook)
                (*dataFreeHook) (old_string);
            else
                free(old_string);
        }
    }                           /* for results */

    return SNMP_ERR_NOERROR;
}                               /* _mfd_ipSystemStatsTable_get_values */


#ifndef NETSNMP_DISABLE_SET_SUPPORT
/***********************************************************************
 *
 * SET processing
 *
 ***********************************************************************/

/*
 * SET PROCESSING NOT APPLICABLE (per MIB or user setting)
 */
#endif

/***********************************************************************
 *
 * DATA ACCESS
 *
 ***********************************************************************/
static void     _container_free(netsnmp_container *container);

/**
 * @internal
 */
static int
_cache_load(netsnmp_cache * cache, void *vmagic)
{
    DEBUGMSGTL(("internal:ipSystemStatsTable:_cache_load", "called\n"));

    if ((NULL == cache) || (NULL == cache->magic)) {
        snmp_log(LOG_ERR,
                 "invalid cache for ipSystemStatsTable_cache_load\n");
        return -1;
    }

    /** should only be called for an invalid or expired cache */
    netsnmp_assert((0 == cache->valid) || (1 == cache->expired));

    /*
     * call user code
     */
    return ipSystemStatsTable_container_load((netsnmp_container *) cache->
                                             magic);
}                               /* _cache_load */

/**
 * @internal
 */
static void
_cache_free(netsnmp_cache * cache, void *magic)
{
    netsnmp_container *container;

    DEBUGMSGTL(("internal:ipSystemStatsTable:_cache_free", "called\n"));

    if ((NULL == cache) || (NULL == cache->magic)) {
        snmp_log(LOG_ERR,
                 "invalid cache in ipSystemStatsTable_cache_free\n");
        return;
    }

    container = (netsnmp_container *) cache->magic;

    _container_free(container);
}                               /* _cache_free */

/**
 * @internal
 */
static void
_container_item_free(ipSystemStatsTable_rowreq_ctx * rowreq_ctx,
                     void *context)
{
    DEBUGMSGTL(("internal:ipSystemStatsTable:_container_item_free",
                "called\n"));

    if (NULL == rowreq_ctx)
        return;

    ipSystemStatsTable_release_rowreq_ctx(rowreq_ctx);
}                               /* _container_item_free */

/**
 * @internal
 */
static void
_container_free(netsnmp_container *container)
{
    DEBUGMSGTL(("internal:ipSystemStatsTable:_container_free",
                "called\n"));

    if (NULL == container) {
        snmp_log(LOG_ERR,
                 "invalid container in ipSystemStatsTable_container_free\n");
        return;
    }

    /*
     * call user code
     */
    ipSystemStatsTable_container_free(container);

    /*
     * free all items. inefficient, but easy.
     */
    CONTAINER_CLEAR(container,
                    (netsnmp_container_obj_func *) _container_item_free,
                    NULL);
}                               /* _container_free */

/**
 * @internal
 * initialize the container with functions or wrappers
 */
void
_ipSystemStatsTable_container_init(ipSystemStatsTable_interface_ctx *
                                   if_ctx)
{
    DEBUGMSGTL(("internal:ipSystemStatsTable:_ipSystemStatsTable_container_init", "called\n"));

    /*
     * cache init
     */
    if_ctx->cache = netsnmp_cache_create(30,    /* timeout in seconds */
                                         _cache_load, _cache_free,
                                         ipSystemStatsTable_oid,
                                         ipSystemStatsTable_oid_size);

    if (NULL == if_ctx->cache) {
        snmp_log(LOG_ERR, "error creating cache for ipSystemStatsTable\n");
        return;
    }

    if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;

    ipSystemStatsTable_container_init(&if_ctx->container, if_ctx->cache);
    if (NULL == if_ctx->container)
        if_ctx->container =
            netsnmp_container_find("ipSystemStatsTable:table_container");
    if (NULL == if_ctx->container) {
        snmp_log(LOG_ERR, "error creating container in "
                 "ipSystemStatsTable_container_init\n");
        return;
    }

    if (NULL != if_ctx->cache)
        if_ctx->cache->magic = (void *) if_ctx->container;
}                               /* _ipSystemStatsTable_container_init */

/**
 * @internal
 * shutdown the container with functions or wrappers
 */
void
_ipSystemStatsTable_container_shutdown(ipSystemStatsTable_interface_ctx *
                                       if_ctx)
{
    DEBUGMSGTL(("internal:ipSystemStatsTable:_ipSystemStatsTable_container_shutdown", "called\n"));

    ipSystemStatsTable_container_shutdown(if_ctx->container);

    _container_free(if_ctx->container);

}                               /* _ipSystemStatsTable_container_shutdown */


ipSystemStatsTable_rowreq_ctx *
ipSystemStatsTable_row_find_by_mib_index(ipSystemStatsTable_mib_index *
                                         mib_idx)
{
    ipSystemStatsTable_rowreq_ctx *rowreq_ctx;
    oid             oid_tmp[MAX_OID_LEN];
    netsnmp_index   oid_idx;
    int             rc;

    /*
     * set up storage for OID
     */
    oid_idx.oids = oid_tmp;
    oid_idx.len = sizeof(oid_tmp) / sizeof(oid);

    /*
     * convert
     */
    rc = ipSystemStatsTable_index_to_oid(&oid_idx, mib_idx);
    if (MFD_SUCCESS != rc)
        return NULL;

    rowreq_ctx = (ipSystemStatsTable_rowreq_ctx*)
        CONTAINER_FIND(ipSystemStatsTable_if_ctx.container, &oid_idx);

    return rowreq_ctx;
}
