/*
 * Note: this file originally auto-generated by mib2c using
 *        : mib2c.access_functions.conf $
 */
#ifndef IPCIDRROUTETABLE_ACCESS_H
#define IPCIDRROUTETABLE_ACCESS_H

/*
 * User-defined data access functions for data in table ipCidrRouteTable 
 */
u_long         *get_ipCidrRouteDest(void *data_context, size_t * ret_len);
u_long         *get_ipCidrRouteMask(void *data_context, size_t * ret_len);
long           *get_ipCidrRouteTos(void *data_context, size_t * ret_len);
u_long         *get_ipCidrRouteNextHop(void *data_context,
                                       size_t * ret_len);
long           *get_ipCidrRouteIfIndex(void *data_context,
                                       size_t * ret_len);
int             set_ipCidrRouteIfIndex(void *data_context, long *val,
                                       size_t val_len);
long           *get_ipCidrRouteType(void *data_context, size_t * ret_len);
int             set_ipCidrRouteType(void *data_context, long *val,
                                    size_t val_len);
long           *get_ipCidrRouteProto(void *data_context, size_t * ret_len);
long           *get_ipCidrRouteAge(void *data_context, size_t * ret_len);
oid            *get_ipCidrRouteInfo(void *data_context, size_t * ret_len);
int             set_ipCidrRouteInfo(void *data_context, oid * val,
                                    size_t val_len);
long           *get_ipCidrRouteNextHopAS(void *data_context,
                                         size_t * ret_len);
int             set_ipCidrRouteNextHopAS(void *data_context, long *val,
                                         size_t val_len);
long           *get_ipCidrRouteMetric1(void *data_context,
                                       size_t * ret_len);
int             set_ipCidrRouteMetric1(void *data_context, long *val,
                                       size_t val_len);
long           *get_ipCidrRouteMetric2(void *data_context,
                                       size_t * ret_len);
int             set_ipCidrRouteMetric2(void *data_context, long *val,
                                       size_t val_len);
long           *get_ipCidrRouteMetric3(void *data_context,
                                       size_t * ret_len);
int             set_ipCidrRouteMetric3(void *data_context, long *val,
                                       size_t val_len);
long           *get_ipCidrRouteMetric4(void *data_context,
                                       size_t * ret_len);
int             set_ipCidrRouteMetric4(void *data_context, long *val,
                                       size_t val_len);
long           *get_ipCidrRouteMetric5(void *data_context,
                                       size_t * ret_len);
int             set_ipCidrRouteMetric5(void *data_context, long *val,
                                       size_t val_len);
long           *get_ipCidrRouteStatus(void *data_context,
                                      size_t * ret_len);
int             set_ipCidrRouteStatus(void *data_context, long *val,
                                      size_t val_len);

#endif                          /* IPCIDRROUTETABLE_ACCESS_H */
