/* * Note: this file originally auto-generated by mib2c using * : mib2c.iterate_access.conf$ */ #include #include #include "route_headers.h" #include #include #include "ipCidrRouteTable.h" #include "ipCidrRouteTable_checkfns.h" #include "ipCidrRouteTable_access.h" #include "var_route.h" netsnmp_feature_require(oid_stash) netsnmp_feature_require(get_routes) netsnmp_feature_require(oid_stash_get_data) netsnmp_feature_require(oid_stash_add_data) static netsnmp_oid_stash_node *undoStorage; struct undoInfo { void *ptr; size_t len; }; void free_undoInfo(void *vp) { struct undoInfo *ui = (struct undoInfo *) vp; if (!ui) return; SNMP_FREE(ui->ptr); SNMP_FREE(ui); } /** Initialize the ipCidrRouteTable table by defining its contents and how it's structured */ void initialize_table_ipCidrRouteTable(void) { static oid ipCidrRouteTable_oid[] = { 1, 3, 6, 1, 2, 1, 4, 24, 4 }; netsnmp_table_registration_info *table_info; netsnmp_handler_registration *my_handler; netsnmp_iterator_info *iinfo; /** create the table registration information structures */ 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("ipCidrRouteTable", ipCidrRouteTable_handler, ipCidrRouteTable_oid, OID_LENGTH (ipCidrRouteTable_oid), HANDLER_CAN_RWRITE); if (!my_handler || !table_info || !iinfo) { snmp_log(LOG_ERR, "malloc failed in initialize_table_ipCidrRouteTable"); return; /** Serious error. */ } /*************************************************** * Setting up the table's definition */ netsnmp_table_helper_add_indexes(table_info, ASN_IPADDRESS, /** index: ipCidrRouteDest */ ASN_IPADDRESS, /** index: ipCidrRouteMask */ ASN_INTEGER, /** index: ipCidrRouteTos */ ASN_IPADDRESS, /** index: ipCidrRouteNextHop */ 0); /** Define the minimum and maximum accessible columns. This optimizes retrieval. */ table_info->min_column = 1; table_info->max_column = 16; /** iterator access routines */ iinfo->get_first_data_point = ipCidrRouteTable_get_first_data_point; iinfo->get_next_data_point = ipCidrRouteTable_get_next_data_point; /** you may wish to set these as well */ #ifdef MAYBE_USE_THESE iinfo->make_data_context = ipCidrRouteTable_context_convert_function; iinfo->free_data_context = ipCidrRouteTable_data_free; /** pick *only* one of these if you use them */ iinfo->free_loop_context = ipCidrRouteTable_loop_free; iinfo->free_loop_context_at_end = ipCidrRouteTable_loop_free; #endif /** tie the two structures together */ iinfo->table_reginfo = table_info; /*************************************************** * registering the table with the master agent */ DEBUGMSGTL(("initialize_table_ipCidrRouteTable", "Registering table ipCidrRouteTable as a table iterator\n")); netsnmp_register_table_iterator2(my_handler, iinfo); } /** Initializes the ipCidrRouteTable module */ void init_ipCidrRouteTable(void) { /** here we initialize all the tables we're planning on supporting */ initialize_table_ipCidrRouteTable(); } /* globals */ static size_t rtsize; static RTENTRY **rthead; netsnmp_variable_list * ipCidrRouteTable_set_indexes(RTENTRY *ourroute, netsnmp_variable_list *put_index_data) { netsnmp_variable_list *vptr; /** ipCidrRouteDest */ vptr = put_index_data; snmp_set_var_value(vptr, (u_char *) &((struct sockaddr_in *) (&ourroute->rt_dst))->sin_addr.s_addr, sizeof(((struct sockaddr_in *) (&ourroute->rt_dst))->sin_addr)); /** ipCidrRouteMask */ vptr = vptr->next_variable; snmp_set_var_value(vptr, (u_char *) &((struct sockaddr_in *) (&ourroute->rt_genmask))->sin_addr.s_addr, sizeof(((struct sockaddr_in *) (&ourroute->rt_genmask))->sin_addr)); /** ipCidrRouteTos */ vptr = vptr->next_variable; snmp_set_var_value(vptr, (u_char *) &ourroute->rt_tos, sizeof(ourroute->rt_tos)); vptr = vptr->next_variable; /** ipCidrRouteNextHop */ snmp_set_var_value(vptr, (u_char *) &((struct sockaddr_in *) (&ourroute->rt_gateway))->sin_addr.s_addr, sizeof(((struct sockaddr_in *) (&ourroute->rt_gateway))->sin_addr)); return put_index_data; } /** returns the first data point within the ipCidrRouteTable 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 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 * ipCidrRouteTable_get_first_data_point(void **my_loop_context, void **my_data_context, netsnmp_variable_list * put_index_data, netsnmp_iterator_info *mydata) { int *position; /* we could do this with a file-static variable, but for learning purposes we'll use memory allocation to demonstrate simplistic freeing of a loop_context */ position = malloc(sizeof(position)); if (!position) return NULL; /* read the routing table into the route array. This function is defined in var_route.c, but is sorted incorrectly for this table. By using a table_iterator we don't do any sorting ourselves and the table_iterator handles it all for us, so we don't resort with different criteria. */ rthead = netsnmp_get_routes(&rtsize); if (!rthead) { snmp_log(LOG_ERR,"ipCidrRouteTable: failed to get routes\n"); free(position); return NULL; } /* We use the positinonal count as our loop context */ *position = 0; *my_loop_context = position; /* our data context is the individual array element, in this case it's the first. */ *my_data_context = rthead[*position]; /* now, save the index data into the passed in (linked list) pointer */ return ipCidrRouteTable_set_indexes(rthead[*position], put_index_data); } /** functionally the same as ipCidrRouteTable_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 * ipCidrRouteTable_get_next_data_point(void **my_loop_context, void **my_data_context, netsnmp_variable_list * put_index_data, netsnmp_iterator_info *mydata) { int *position = (int *) *my_loop_context; /* make sure we were called correctly */ if (!position) return NULL; /* go to the next route in the list */ (*position)++; /* Are we beyond the end? */ if (*position >= rtsize) { /* End of routes. stop here by returning NULL */ SNMP_FREE(position); *my_loop_context = NULL; *my_data_context = NULL; return NULL; } /* our data context is the individual array element, in this case it's the first. */ *my_data_context = rthead[*position]; /* now, save the index data into the passed in (linked list) pointer */ return ipCidrRouteTable_set_indexes(rthead[*position], put_index_data); } /** handles requests for the ipCidrRouteTable table, if anything else needs to be done */ int ipCidrRouteTable_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; void *data_context; /** column and row index encoded portion */ const oid * const suffix = requests->requestvb->name + reginfo->rootoid_len + 1; const size_t suffix_len = requests->requestvb->name_length - (reginfo->rootoid_len + 1); for (request = requests; request; request = request->next) { var = request->requestvb; if (request->processed != 0) continue; data_context = netsnmp_extract_iterator_context(request); if (data_context == 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) { case MODE_GET: switch (table_info->colnum) { case COLUMN_IPCIDRROUTEDEST: { u_long *retval; size_t retval_len = 0; retval = get_ipCidrRouteDest(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_IPADDRESS, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEMASK: { u_long *retval; size_t retval_len = 0; retval = get_ipCidrRouteMask(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_IPADDRESS, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTETOS: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteTos(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTENEXTHOP: { u_long *retval; size_t retval_len = 0; retval = get_ipCidrRouteNextHop(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_IPADDRESS, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEIFINDEX: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteIfIndex(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTETYPE: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteType(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEPROTO: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteProto(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEAGE: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteAge(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEINFO: { oid *retval; size_t retval_len = 0; retval = get_ipCidrRouteInfo(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_OBJECT_ID, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTENEXTHOPAS: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteNextHopAS(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEMETRIC1: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteMetric1(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEMETRIC2: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteMetric2(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEMETRIC3: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteMetric3(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEMETRIC4: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteMetric4(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTEMETRIC5: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteMetric5(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; case COLUMN_IPCIDRROUTESTATUS: { long *retval; size_t retval_len = 0; retval = get_ipCidrRouteStatus(data_context, &retval_len); snmp_set_var_typed_value(var, ASN_INTEGER, (const u_char *) retval, retval_len); } break; default: /** We shouldn't get here */ snmp_log(LOG_ERR, "problem encountered in ipCidrRouteTable_handler: unknown column\n"); } break; case MODE_SET_RESERVE1: /** mib2cXXX: clear out old undo info if we have any. Remove if table_iterator becomes un-serialized */ netsnmp_oid_stash_free(&undoStorage, free_undoInfo); switch (table_info->colnum) { case COLUMN_IPCIDRROUTEIFINDEX: { int ret = check_ipCidrRouteIfIndex(request->requestvb->type, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTETYPE: { int ret = check_ipCidrRouteType(request->requestvb->type, (long *) request->requestvb-> val.string, request->requestvb->val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEINFO: { int ret = check_ipCidrRouteInfo(request->requestvb->type, (oid *) request->requestvb-> val.string, request->requestvb->val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTENEXTHOPAS: { int ret = check_ipCidrRouteNextHopAS(request->requestvb-> type, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC1: { int ret = check_ipCidrRouteMetric1(request->requestvb->type, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC2: { int ret = check_ipCidrRouteMetric2(request->requestvb->type, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC3: { int ret = check_ipCidrRouteMetric3(request->requestvb->type, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC4: { int ret = check_ipCidrRouteMetric4(request->requestvb->type, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC5: { int ret = check_ipCidrRouteMetric5(request->requestvb->type, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTESTATUS: { int ret = check_ipCidrRouteStatus(request->requestvb->type, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret != 0) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; default: netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_NOTWRITABLE); break; } break; case MODE_SET_RESERVE2: /** save a variable copy */ switch (table_info->colnum) { case COLUMN_IPCIDRROUTEIFINDEX: { long *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteIfIndex(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; case COLUMN_IPCIDRROUTETYPE: { long *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteType(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; case COLUMN_IPCIDRROUTEINFO: { oid *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteInfo(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; case COLUMN_IPCIDRROUTENEXTHOPAS: { long *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteNextHopAS(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; case COLUMN_IPCIDRROUTEMETRIC1: { long *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteMetric1(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; case COLUMN_IPCIDRROUTEMETRIC2: { long *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteMetric2(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; case COLUMN_IPCIDRROUTEMETRIC3: { long *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteMetric3(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; case COLUMN_IPCIDRROUTEMETRIC4: { long *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteMetric4(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; case COLUMN_IPCIDRROUTEMETRIC5: { long *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteMetric5(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; case COLUMN_IPCIDRROUTESTATUS: { long *retval; size_t retval_len = 0; struct undoInfo *ui; retval = get_ipCidrRouteStatus(data_context, &retval_len); if (retval) { ui = SNMP_MALLOC_STRUCT(undoInfo); ui->len = retval_len; ui->ptr = netsnmp_memdup(retval, ui->len); netsnmp_oid_stash_add_data(&undoStorage, suffix, suffix_len, ui); } } break; } break; case MODE_SET_FREE: /** Forget undo data, if exists */ netsnmp_oid_stash_free(&undoStorage, free_undoInfo); break; case MODE_SET_ACTION: /** save a variable copy */ switch (table_info->colnum) { case COLUMN_IPCIDRROUTEIFINDEX: { int ret = set_ipCidrRouteIfIndex(data_context, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTETYPE: { int ret = set_ipCidrRouteType(data_context, (long *) request-> requestvb-> val.string, request-> requestvb-> val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEINFO: { int ret = set_ipCidrRouteInfo(data_context, (oid *) request-> requestvb-> val.string, request-> requestvb-> val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTENEXTHOPAS: { int ret = set_ipCidrRouteNextHopAS(data_context, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC1: { int ret = set_ipCidrRouteMetric1(data_context, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC2: { int ret = set_ipCidrRouteMetric2(data_context, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC3: { int ret = set_ipCidrRouteMetric3(data_context, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC4: { int ret = set_ipCidrRouteMetric4(data_context, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTEMETRIC5: { int ret = set_ipCidrRouteMetric5(data_context, (long *) request-> requestvb->val.string, request->requestvb-> val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; case COLUMN_IPCIDRROUTESTATUS: { int ret = set_ipCidrRouteStatus(data_context, (long *) request->requestvb-> val.string, request->requestvb->val_len); if (ret) { netsnmp_set_request_error(reqinfo, requests, ret); } } break; } break; case MODE_SET_COMMIT: /** answers were all good. Forget undo data */ netsnmp_oid_stash_free(&undoStorage, free_undoInfo); /** mib2cXXX: call commit hook */ break; case MODE_SET_UNDO: /** save a variable copy */ switch (table_info->colnum) { case COLUMN_IPCIDRROUTEIFINDEX: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteIfIndex(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; case COLUMN_IPCIDRROUTETYPE: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteType(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; case COLUMN_IPCIDRROUTEINFO: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteInfo(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; case COLUMN_IPCIDRROUTENEXTHOPAS: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteNextHopAS(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; case COLUMN_IPCIDRROUTEMETRIC1: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteMetric1(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; case COLUMN_IPCIDRROUTEMETRIC2: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteMetric2(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; case COLUMN_IPCIDRROUTEMETRIC3: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteMetric3(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; case COLUMN_IPCIDRROUTEMETRIC4: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteMetric4(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; case COLUMN_IPCIDRROUTEMETRIC5: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteMetric5(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; case COLUMN_IPCIDRROUTESTATUS: { int retval; struct undoInfo *ui; ui = netsnmp_oid_stash_get_data(undoStorage, suffix, suffix_len); retval = set_ipCidrRouteStatus(data_context, ui->ptr, ui->len); if (retval) { netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_UNDOFAILED); } } break; } /** mib2cXXX: remove cache! hard to do when serialized, however */ break; default: snmp_log(LOG_ERR, "problem encountered in ipCidrRouteTable_handler: unsupported mode\n"); } } return SNMP_ERR_NOERROR; }