/*
 * Note: this file originally auto-generated by mib2c using
 *       version : 14170 $ of $ 
 *
 * $Id:$
 */
/*
 * 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 "etherStatsTable.h"
#include "etherStatsTable_data_access.h"

#if defined(linux)
#include "ioctl_imp_common.h"
#endif

/** @ingroup interface
 * @addtogroup data_access data_access: Routines to access data
 *
 * These routines are used to locate the data used to satisfy
 * requests.
 * 
 * @{
 */
/**********************************************************************
 **********************************************************************
 ***
 *** Table etherStatsTable
 ***
 **********************************************************************
 **********************************************************************/
/*
 * RMON-MIB::etherStatsTable is subid 1 of statistics.
 * Its status is Current.
 * OID: .1.3.6.1.2.1.16.1.1, length: 9
 */

/**
 * initialization for etherStatsTable data access
 *
 * This function is called during startup to allow you to
 * allocate any resources you need for the data table.
 *
 * @param etherStatsTable_reg
 *        Pointer to etherStatsTable_registration
 *
 * @retval MFD_SUCCESS : success.
 * @retval MFD_ERROR   : unrecoverable error.
 */
int
etherStatsTable_init_data(etherStatsTable_registration *
                          etherStatsTable_reg)
{
    DEBUGMSGTL(("verbose:etherStatsTable:etherStatsTable_init_data",
                "called\n"));

    /*
     * TODO:303:o: Initialize etherStatsTable data.
     */

    return MFD_SUCCESS;
}                               /* etherStatsTable_init_data */

/**
 * container overview
 *
 */

/**
 * container initialization
 *
 * @param container_ptr_ptr A pointer to a container pointer. If you
 *        create a custom container, use this parameter to return it
 *        to the MFD helper. If set to NULL, the MFD helper will
 *        allocate a container for you.
 * @param  cache A pointer to a cache structure. You can set the timeout
 *         and other cache flags using this pointer.
 *
 *  This function is called at startup to allow you to customize certain
 *  aspects of the access method. For the most part, it is for advanced
 *  users. The default code should suffice for most cases. If no custom
 *  container is allocated, the MFD code will create one for your.
 *
 *  This is also the place to set up cache behavior. The default, to
 *  simply set the cache timeout, will work well with the default
 *  container. If you are using a custom container, you may want to
 *  look at the cache helper documentation to see if there are any
 *  flags you want to set.
 *
 * @remark
 *  This would also be a good place to do any initialization needed
 *  for you data source. For example, opening a connection to another
 *  process that will supply the data, opening a database, etc.
 */
void
etherStatsTable_container_init(netsnmp_container ** container_ptr_ptr,
                               netsnmp_cache * cache)
{
    DEBUGMSGTL(("verbose:etherStatsTable:etherStatsTable_container_init",
                "called\n"));

    if (NULL == container_ptr_ptr) {
        snmp_log(LOG_ERR,
                 "bad container param to etherStatsTable_container_init\n");
        return;
    }

    /*
     * For advanced users, you can use a custom container. If you
     * do not create one, one will be created for you.
     */
    *container_ptr_ptr = NULL;

    if (NULL == cache) {
        snmp_log(LOG_ERR,
                 "bad cache param to etherStatsTable_container_init\n");
        return;
    }

    /*
     * TODO:345:A: Set up etherStatsTable cache properties.
     *
     * Also for advanced users, you can set parameters for the
     * cache. Do not change the magic pointer, as it is used
     * by the MFD helper. To completely disable caching, set
     * cache->enabled to 0.
     */
    cache->timeout = ETHERSTATSTABLE_CACHE_TIMEOUT;     /* seconds */
}                               /* etherStatsTable_container_init */

/**
 * container shutdown
 *
 * @param container_ptr A pointer to the container.
 *
 *  This function is called at shutdown to allow you to customize certain
 *  aspects of the access method. For the most part, it is for advanced
 *  users. The default code should suffice for most cases.
 *
 *  This function is called before etherStatsTable_container_free().
 *
 * @remark
 *  This would also be a good place to do any cleanup needed
 *  for you data source. For example, closing a connection to another
 *  process that supplied the data, closing a database, etc.
 */
void
etherStatsTable_container_shutdown(netsnmp_container * container_ptr)
{
    DEBUGMSGTL(("verbose:etherStatsTable:etherStatsTable_container_shutdown", "called\n"));

    if (NULL == container_ptr) {
        snmp_log(LOG_ERR,
                 "bad params to etherStatsTable_container_shutdown\n");
        return;
    }

}                               /* etherStatsTable_container_shutdown */

/**
 * load initial data
 *
 * TODO:350:M: Implement etherStatsTable data load
 * This function will also be called by the cache helper to load
 * the container again (after the container free function has been
 * called to free the previous contents).
 *
 * @param container container to which items should be inserted
 *
 * @retval MFD_SUCCESS              : success.
 * @retval MFD_RESOURCE_UNAVAILABLE : Can't access data source
 * @retval MFD_ERROR                : other error.
 *
 *  This function is called to load the index(es) (and data, optionally)
 *  for the every row in the data set.
 *
 * @remark
 *  While loading the data, the only important thing is the indexes.
 *  If access to your data is cheap/fast (e.g. you have a pointer to a
 *  structure in memory), it would make sense to update the data here.
 *  If, however, the accessing the data invovles more work (e.g. parsing
 *  some other existing data, or peforming calculations to derive the data),
 *  then you can limit yourself to setting the indexes and saving any
 *  information you will need later. Then use the saved information in
 *  etherStatsTable_row_prep() for populating data.
 *
 * @note
 *  If you need consistency between rows (like you want statistics
 *  for each row to be from the same time frame), you should set all
 *  data here.
 *
 */
int
etherStatsTable_container_load(netsnmp_container * container)
{
    etherStatsTable_rowreq_ctx *rowreq_ctx;
    size_t          count = 0;

    DEBUGMSGTL(("verbose:etherStatsTable:etherStatsTable_container_load",
                "called\n"));

    /*
     * TODO:352:M: |   |-> set indexes in new etherStatsTable rowreq context.
     * data context will be set from the param (unless NULL,
     *      in which case a new data context will be allocated)
     */

    /*
     * temporary storage for index values
     */
    
    /*
     * etherStatsIndex(1)/INTEGER32/ASN_INTEGER/long(long)//l/A/w/e/R/d/h
     */

    long            etherStatsIndex;
    int             fd;
    int             rc = 0, retval = 0;

#if defined(linux)
    struct ifname *list_head = NULL, *p = NULL;
#endif
    
    /*
     * create socket for ioctls
     */

    fd = socket(AF_INET, SOCK_DGRAM, 0);
    if(fd < 0) {
        snmp_log(LOG_ERR, "could not create socket\n");
        return -2;
    }

    /*
     * get the interface names of the devices present in the system, in case of failure retval suggests the reson for failure
     * and list_head contains null
     */

#if defined(linux)
    list_head = etherstats_interface_name_list_get (list_head, &retval);

    if (!list_head) {
        snmp_log (LOG_ERR, "access:etherStatsTable, error getting the interface names present in the system\n");
        DEBUGMSGTL(("access:etherStatsTable", "error getting the interface names present in the system"));
        close(fd);
        return MFD_ERROR;
    }

    /*
     * Walk over the list of interface names present in the system and retreive the statistics 
     */

    for (p = list_head; p; p = p->ifn_next) {
        DEBUGMSGTL(("access:etherStatsTable", "processing '%s'\n", p->name));

        /*
         * get index via ioctl.
         */

        etherStatsIndex = (long) etherstats_interface_ioctl_ifindex_get(-1, p->name);

        /* 
         *  get the etherstats contents populated, if the device is not an ethernet device
         *  the operation will not be supported and an error message will be logged
         */
        
        rowreq_ctx = etherStatsTable_allocate_rowreq_ctx(NULL);
        if (NULL == rowreq_ctx) {
            snmp_log(LOG_ERR, "memory allocation failed\n");
            close(fd);
            return MFD_RESOURCE_UNAVAILABLE;
        }

        if (MFD_SUCCESS !=
            etherStatsTable_indexes_set(rowreq_ctx, etherStatsIndex)) {
            snmp_log(LOG_ERR,
                     "error setting index while loading "
                     "etherStatsTable data.\n");
            etherStatsTable_release_rowreq_ctx(rowreq_ctx);
            continue;
        }

        /*
         * TODO:352:r: |   |-> populate etherStatsTable data context.
         * Populate data context here. (optionally, delay until row prep)
         */
        /*
         * non-TRANSIENT data: no need to copy. set pointer to data 
         */

        memset (&rowreq_ctx->data, 0, sizeof (rowreq_ctx->data));
        rc = interface_ioctl_etherstats_get (rowreq_ctx, fd, p->name);

        if (rc < 0) {
            DEBUGMSGTL(("access:etherStatsTable", "error getting the statistics for interface |%s| "
                        "etherStatsTable data, operation might not be supported\n", p->name));
            etherStatsTable_release_rowreq_ctx(rowreq_ctx);
            continue;
        }

        /*
         * insert into table container
         */
        rc = CONTAINER_INSERT(container, rowreq_ctx);
        if (rc < 0) {
            DEBUGMSGTL(("access:etherStatsTable", "error inserting |%s| ", p->name));
            etherStatsTable_release_rowreq_ctx(rowreq_ctx);
            continue;
        }

        ++count;
    }

    close(fd);

    /*
     * free the interface names list 
     */

    if ( (etherstats_interface_name_list_free(list_head)) < 0) {
        snmp_log(LOG_ERR, "access:etherStatsTable, error freeing the interface name list \n");
        DEBUGMSGTL(("access:etherStatsTable", "error freeing the interface name list\n"));
        return MFD_ERROR;
    }
#endif
    
    DEBUGMSGT(("verbose:etherStatsTable:etherStatsTable_container_load",
               "inserted %d records\n", count));

    return MFD_SUCCESS;
}
                               /* etherStatsTable_container_load */


/**
 * container clean up
 *
 * @param container container with all current items
 *
 *  This optional callback is called prior to all
 *  item's being removed from the container. If you
 *  need to do any processing before that, do it here.
 *
 * @note
 *  The MFD helper will take care of releasing all the row contexts.
 *
 */
void
etherStatsTable_container_free(netsnmp_container * container)
{
    DEBUGMSGTL(("verbose:etherStatsTable:etherStatsTable_container_free",
                "called\n"));

    /*
     * TODO:380:M: Free etherStatsTable container data.
     */
}                               /* etherStatsTable_container_free */

/**
 * prepare row for processing.
 *
 *  When the agent has located the row for a request, this function is
 *  called to prepare the row for processing. If you fully populated
 *  the data context during the index setup phase, you may not need to
 *  do anything.
 *
 * @param rowreq_ctx pointer to a context.
 *
 * @retval MFD_SUCCESS     : success.
 * @retval MFD_ERROR       : other error.
 */
int
etherStatsTable_row_prep(etherStatsTable_rowreq_ctx * rowreq_ctx)
{
    DEBUGMSGTL(("verbose:etherStatsTable:etherStatsTable_row_prep",
                "called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    /*
     * TODO:390:o: Prepare row for request.
     * If populating row data was delayed, this is the place to
     * fill in the row for this request.
     */

    return MFD_SUCCESS;
}                               /* etherStatsTable_row_prep */

/*
 * TODO:420:r: Implement etherStatsTable index validation.
 */
/*---------------------------------------------------------------------
 * RMON-MIB::etherStatsEntry.etherStatsIndex
 * etherStatsIndex is subid 1 of etherStatsEntry.
 * Its status is Current, and its access level is ReadOnly.
 * OID: .1.3.6.1.2.1.16.1.1.1.1
 * Description:
The value of this object uniquely identifies this
        etherStats entry.
 *
 * Attributes:
 *   accessible 1     isscalar 0     enums  0      hasdefval 0
 *   readable   1     iscolumn 1     ranges 1      hashint   0
 *   settable   0
 *
 * Ranges:  1 - 65535;
 *
 * Its syntax is INTEGER32 (based on perltype INTEGER32)
 * The net-snmp type is ASN_INTEGER. The C type decl is long (long)
 */
/**
 * check validity of etherStatsIndex index portion
 *
 * @retval MFD_SUCCESS   : the incoming value is legal
 * @retval MFD_ERROR     : the incoming value is NOT legal
 *
 * @note this is not the place to do any checks for the sanity
 *       of multiple indexes. Those types of checks should be done in the
 *       etherStatsTable_validate_index() function.
 *
 * @note Also keep in mind that if the index refers to a row in this or
 *       some other table, you can't check for that row here to make
 *       decisions, since that row might not be created yet, but may
 *       be created during the processing this request. If you have
 *       such checks, they should be done in the check_dependencies
 *       function, because any new/deleted/changed rows should be
 *       available then.
 *
 * The following checks have already been done for you:
 *    The value is in (one of) the range set(s):  1 - 65535
 *
 * If there a no other checks you need to do, simply return MFD_SUCCESS.
 */
int
etherStatsIndex_check_index(etherStatsTable_rowreq_ctx * rowreq_ctx)
{
    DEBUGMSGTL(("verbose:etherStatsTable:etherStatsIndex_check_index",
                "called\n"));

    netsnmp_assert(NULL != rowreq_ctx);

    /*
     * TODO:426:M: |-> Check etherStatsTable index etherStatsIndex.
     * check that index value in the table context is legal.
     * (rowreq_ctx->tbl_index.etherStatsIndex)
     */

    return MFD_SUCCESS;         /* etherStatsIndex index ok */
}                               /* etherStatsIndex_check_index */

/**
 * verify specified index is valid.
 *
 * This check is independent of whether or not the values specified for
 * the columns of the new row are valid. Column values and row consistency
 * will be checked later. At this point, only the index values should be
 * checked.
 *
 * All of the individual index validation functions have been called, so this
 * is the place to make sure they are valid as a whole when combined. If
 * you only have one index, then you probably don't need to do anything else
 * here.
 * 
 * @note Keep in mind that if the indexes refer to a row in this or
 *       some other table, you can't check for that row here to make
 *       decisions, since that row might not be created yet, but may
 *       be created during the processing this request. If you have
 *       such checks, they should be done in the check_dependencies
 *       function, because any new/deleted/changed rows should be
 *       available then.
 *
 *
 * @param etherStatsTable_reg
 *        Pointer to the user registration data
 * @param etherStatsTable_rowreq_ctx
 *        Pointer to the users context.
 * @retval MFD_SUCCESS            : success
 * @retval MFD_CANNOT_CREATE_NOW  : index not valid right now
 * @retval MFD_CANNOT_CREATE_EVER : index never valid
 */
int
etherStatsTable_validate_index(etherStatsTable_registration *
                               etherStatsTable_reg,
                               etherStatsTable_rowreq_ctx * rowreq_ctx)
{
    int             rc = MFD_SUCCESS;

    DEBUGMSGTL(("verbose:etherStatsTable:etherStatsTable_validate_index",
                "called\n"));

    /** we should have a non-NULL pointer */
    netsnmp_assert(NULL != rowreq_ctx);

    /*
     * TODO:430:M: |-> Validate potential etherStatsTable index.
     */
    if (1) {
        snmp_log(LOG_WARNING, "invalid index for a new row in the "
                 "etherStatsTable table.\n");
        /*
         * determine failure type.
         *
         * If the index could not ever be created, return MFD_NOT_EVER
         * If the index can not be created under the present circumstances
         * (even though it could be created under other circumstances),
         * return MFD_NOT_NOW.
         */
        if (0) {
            return MFD_CANNOT_CREATE_EVER;
        } else {
            return MFD_CANNOT_CREATE_NOW;
        }
    }

    return rc;
}                               /* etherStatsTable_validate_index */

/** @} */
