Hi  Dave,
Thanks for your quick reply. For the time being I want to work with the second index only. (/* index: iwsCpuIndex */) . I don't know why it is picking the first index also, which is unwanted.

Second thins is that things working fine with a normal iterator helper. But when ever I am giving it for snmp_alarm_register() it is not working . For your referrence I am providing you the normal iterator code, which works fine

Thanks & regards
Partha





On Tue, 2005-06-14 at 06:07, partha wrote:
For you referrence I am attaching the souce code with you .
Please let  me know what is wrong

Well for a start, you're not providing all the index
information.

When you register the table, you say it has two indexes:


   netsnmp_table_helper_add_indexes(table_info,
                                 ASN_INTEGER, /* index: iwsInstanceIndex */
                                 ASN_INTEGER, /* index: iwsCpuIndex */


But in the 'get_first_data' hook routine, you only supply one of them:

   vptr = put_index_data;
   snmp_set_var_value(vptr, (u_char *) &firstNode->iwsCpuIndex,
                                 sizeof(firstNode->iwsCpuIndex));
   vptr = vptr->next_variable;

And you're putting the second index value into the first varbind.
This ought to contain the iwsInstanceIndex value, and the *second*
varbind (put_index_data->next_variable) should take the iwsCpuIndex
value.
 That's what you've documented in the registration code, anyway.

And the same in the 'get_next_data' hook routine as well.


I suggest you get things working with a normal iterator helper first,
before you start worrying about how to add the cache handler.

Dave



/*
 * Note: this file originally auto-generated by mib2c using
 *        : mib2c.iterate.conf,v 1.3 2003/07/07 17:43:17 rr144420 Exp $
 */

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "iwsCpuTable.h"

wsCpuEntry* testhead ; 
void  construct_cpu_table(){
    int total = 3, i;
    wsCpuEntry* prevPtr = 0;
    /* Too lazy, so I make an ordered list */
    for (i=1; i<=total; i++) {
        wsCpuEntry* ptr = (wsCpuEntry *) malloc(sizeof(wsCpuEntry)); 
        ptr->iwsCpuIndex = i;
        sprintf(ptr->iwsCpuId,"SUN Ultra %d",i);
        sprintf(ptr->iwsCpuIdleTime," = %d",i);
        sprintf(ptr->iwsCpuUserTime," = %d",i*10);
        sprintf(ptr->iwsCpuKernelTime," = %d",i*5);
        ptr->pNext = NULL;
        if (prevPtr == NULL) {
            testhead =  prevPtr = ptr;
        }
            prevPtr->pNext = ptr;
            prevPtr = ptr;


    }
}

/** Initialize the iwsCpuTable table by defining its contents and how it's 
structured */
void
initialize_table_iwsCpuTable(void)
{
    static oid iwsCpuTable_oid[] = {1,3,6,1,4,1,42,1,60,1,6};
    netsnmp_table_registration_info *table_info;
    netsnmp_handler_registration *my_handler;
    netsnmp_iterator_info *iinfo;

    /* create the table structure itself */
    table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
    iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);

    /* if your table is read only, it's easiest to change the
       HANDLER_CAN_RWRITE definition below to HANDLER_CAN_RONLY */
    my_handler = netsnmp_create_handler_registration("iwsCpuTable",
                                             iwsCpuTable_handler,
                                             iwsCpuTable_oid,
                                             OID_LENGTH(iwsCpuTable_oid),
                                             HANDLER_CAN_RWRITE);
            
    if (!my_handler || !table_info || !iinfo)
        return; /* mallocs failed */

    /***************************************************
     * Setting up the table's definition
     */
    netsnmp_table_helper_add_indexes(table_info,
                                  ASN_INTEGER, /* index: iwsInstanceIndex */
                                  ASN_INTEGER, /* index: iwsCpuIndex */
                             0);

    table_info->min_column = 1;
    table_info->max_column = 5;

    /* iterator access routines */
    iinfo->get_first_data_point = iwsCpuTable_get_first_data_point;
    iinfo->get_next_data_point = iwsCpuTable_get_next_data_point;

    iinfo->table_reginfo = table_info;

    /***************************************************
     * registering the table with the master agent
     */
    DEBUGMSGTL(("initialize_table_iwsCpuTable",
                "Registering table iwsCpuTable as a table iterator\n"));        
         
    netsnmp_register_table_iterator(my_handler, iinfo);
}

/** Initializes the iwsCpuTable module */
void
init_iwsCpuTable(void)
{

  /* here we initialize all the tables we're planning on supporting */
    initialize_table_iwsCpuTable();
        construct_cpu_table();
}

/** returns the first data point within the iwsCpuTable table data.

    Set the my_loop_context variable to the first data point structure
    of your choice (from which you can find the next one).  This could
    be anything from the first node in a linked list, to an integer
    pointer containing the beginning of an array variable.

    Set the my_data_context variable to something to be returned to
    you later (in your main iwsCpuTable_handler routine) that will provide
    you with the data to return in a given row.  This could be the
    same pointer as what my_loop_context is set to, or something
    different.

    The put_index_data variable contains a list of snmp variable
    bindings, one for each index in your table.  Set the values of
    each appropriately according to the data matching the first row
    and return the put_index_data variable at the end of the function.
*/
netsnmp_variable_list *
iwsCpuTable_get_first_data_point(void **my_loop_context, void **my_data_context,
                          netsnmp_variable_list *put_index_data,
                          netsnmp_iterator_info *mydata)
{

    netsnmp_variable_list *vptr;


    wsCpuEntry* firstNode = testhead;
    if (!firstNode) {
        printf("The head is NULL ***********\n");
        return NULL;
    }
    *my_loop_context = firstNode;
    *my_data_context = firstNode;

    vptr = put_index_data;

    snmp_set_var_value(vptr, (u_char *) &firstNode->iwsCpuIndex, 
sizeof(firstNode->iwsCpuIndex));
    vptr = vptr->next_variable;

    return put_index_data;

}

/** functionally the same as iwsCpuTable_get_first_data_point, but
   my_loop_context has already been set to a previous value and should
   be updated to the next in the list.  For example, if it was a
   linked list, you might want to cast it and the return
   my_loop_context->next.  The my_data_context pointer should be set
   to something you need later and the indexes in put_index_data
   updated again. */

netsnmp_variable_list *
iwsCpuTable_get_next_data_point(void **my_loop_context, void **my_data_context,
                         netsnmp_variable_list *put_index_data,
                         netsnmp_iterator_info *mydata)
{

    netsnmp_variable_list *vptr;

    wsCpuEntry* nextNode = (wsCpuEntry*) *my_loop_context;
    nextNode = nextNode->pNext;

    if (!nextNode) {
       printf("No data returned in get_next\n"); 
        return NULL;
    }
    *my_loop_context = nextNode;
    *my_data_context = nextNode;

    vptr = put_index_data;
    
        snmp_set_var_value(vptr, (u_char *) &nextNode->iwsCpuIndex, 
sizeof(nextNode->iwsCpuIndex));
        vptr = vptr->next_variable;

    return put_index_data;

}

/** handles requests for the iwsCpuTable table, if anything else needs to be 
done */
int
iwsCpuTable_handler(
    netsnmp_mib_handler               *handler,
    netsnmp_handler_registration      *reginfo,
    netsnmp_agent_request_info        *reqinfo,
    netsnmp_request_info              *requests) {

    netsnmp_request_info *request;
    netsnmp_table_request_info *table_info;
    netsnmp_variable_list *var;
    wsCpuEntry* data;

    for(request = requests; request; request = request->next) {
        var = request->requestvb;
        if (request->processed != 0)
            continue;

        /* perform anything here that you need to do before each
           request is processed. */

        /* the following extracts the my_data_context pointer set in
           the loop functions above.  You can then use the results to
           help return data for the columns of the iwsCpuTable table in 
question */
                data = (wsCpuEntry *) netsnmp_extract_iterator_context(request);
        if ( data == NULL) {
            if (reqinfo->mode == MODE_GET) {
                netsnmp_set_request_error(reqinfo, request, 
SNMP_NOSUCHINSTANCE);
                continue;
            }
            /* XXX: no row existed, if you support creation and this is a
               set, start dealing with it here, else continue */
        }

        /* extracts the information about the table from the request */
        table_info = netsnmp_extract_table_info(request);
        /* table_info->colnum contains the column number requested */
        /* table_info->indexes contains a linked list of snmp variable
           bindings for the indexes of the table.  Values in the list
           have been set corresponding to the indexes of the
           request */
        if (table_info==NULL) {
            continue;
        }

        switch(reqinfo->mode) {
            /* the table_iterator helper should change all GETNEXTs
               into GETs for you automatically, so you don't have to
               worry about the GETNEXT case.  Only GETs and SETs need
               to be dealt with here */
            case MODE_GET:
                switch(table_info->colnum) {
                    case COLUMN_IWSCPUINDEX:
                        snmp_set_var_typed_value(var, ASN_INTEGER, (u_char *) 
&data->iwsCpuIndex,sizeof(data->iwsCpuIndex));
                        break;

                    case COLUMN_IWSCPUID:
                        snmp_set_var_typed_value(var, ASN_OCTET_STR, (u_char *) 
data->iwsCpuId, strlen(data->iwsCpuId));
                        break;

                    case COLUMN_IWSCPUIDLETIME:
                        snmp_set_var_typed_value(var, ASN_OCTET_STR, (u_char *) 
data->iwsCpuIdleTime, strlen(data->iwsCpuIdleTime));
                        break;

                    case COLUMN_IWSCPUUSERTIME:
                        snmp_set_var_typed_value(var, ASN_OCTET_STR, (u_char *) 
data->iwsCpuUserTime, strlen(data->iwsCpuUserTime));
                        break;

                    case COLUMN_IWSCPUKERNELTIME:
                        snmp_set_var_typed_value(var, ASN_OCTET_STR, (u_char *) 
data->iwsCpuKernelTime, strlen(data->iwsCpuKernelTime));
                        break;

                    default:
                        /* We shouldn't get here */
                        snmp_log(LOG_ERR, "problem encountered in 
iwsCpuTable_handler: unknown column\n");
                }
                break;

            case MODE_SET_RESERVE1:
                /* set handling... */

            default:
                snmp_log(LOG_ERR, "problem encountered in iwsCpuTable_handler: 
unsupported mode\n");
        }
    }
    return SNMP_ERR_NOERROR;
}

Reply via email to