net-snmp/agent/mibgroup/mibII/ipCidrRouteTable.c

1126 lines
46 KiB
C

/*
* Note: this file originally auto-generated by mib2c using
* : mib2c.iterate_access.conf$
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-features.h>
#include "route_headers.h"
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#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;
}