summaryrefslogtreecommitdiff
path: root/agent/mibgroup/mibII/ipCidrRouteTable.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/mibgroup/mibII/ipCidrRouteTable.c')
-rw-r--r--agent/mibgroup/mibII/ipCidrRouteTable.c1135
1 files changed, 1135 insertions, 0 deletions
diff --git a/agent/mibgroup/mibII/ipCidrRouteTable.c b/agent/mibgroup/mibII/ipCidrRouteTable.c
new file mode 100644
index 0000000..c9ad6e7
--- /dev/null
+++ b/agent/mibgroup/mibII/ipCidrRouteTable.c
@@ -0,0 +1,1135 @@
+/*
+ * 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+ memdup((u_char **) & ui->ptr,
+ (u_char *) 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;
+}