Blame agent/mibgroup/ip-forward-mib/data_access/route_solaris.c

Packit fcad23
/*
Packit fcad23
 *  Interface MIB architecture support
Packit fcad23
 *
Packit fcad23
 * $Id$
Packit fcad23
 */
Packit fcad23
#include <net-snmp/net-snmp-config.h>
Packit fcad23
#include <net-snmp/net-snmp-includes.h>
Packit fcad23
#include "mibII/mibII_common.h"
Packit fcad23
Packit fcad23
#include <net-snmp/agent/net-snmp-agent-includes.h>
Packit fcad23
#include <net-snmp/data_access/interface.h>
Packit fcad23
#include <net-snmp/data_access/route.h>
Packit fcad23
#include <net-snmp/data_access/ipaddress.h>
Packit fcad23
Packit fcad23
#include <inet/ip.h>
Packit fcad23
#include <inet/mib2.h>
Packit fcad23
Packit fcad23
#include "ip-forward-mib/data_access/route_ioctl.h"
Packit fcad23
#include "ip-forward-mib/inetCidrRouteTable/inetCidrRouteTable_constants.h"
Packit fcad23
#include "if-mib/data_access/interface_ioctl.h"
Packit fcad23
#include "route_private.h"
Packit fcad23
Packit fcad23
static int _load_v4(netsnmp_container *container, u_long *count);
Packit fcad23
static int _load_v6(netsnmp_container *container, u_long *count);
Packit fcad23
Packit fcad23
/** arch specific load
Packit fcad23
 * @internal
Packit fcad23
 *
Packit fcad23
 * @retval  0 success
Packit fcad23
 * @retval -1 no container specified
Packit fcad23
 * @retval -2 could not open data file
Packit fcad23
 */
Packit fcad23
int
Packit fcad23
netsnmp_access_route_container_arch_load(netsnmp_container* container,
Packit fcad23
                                         u_int load_flags)
Packit fcad23
{
Packit fcad23
    u_long          count = 0;
Packit fcad23
    int             rc;
Packit fcad23
Packit fcad23
    DEBUGMSGTL(("access:route:container",
Packit fcad23
                "route_container_arch_load (flags %x)\n", load_flags));
Packit fcad23
Packit fcad23
    if (NULL == container) {
Packit fcad23
        snmp_log(LOG_ERR, "no container specified/found for access_route\n");
Packit fcad23
        return -1;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    rc = _load_v4(container, &count);
Packit fcad23
    
Packit fcad23
#ifdef NETSNMP_ENABLE_IPV6
Packit fcad23
    if((0 != rc) || (load_flags & NETSNMP_ACCESS_ROUTE_LOAD_IPV4_ONLY))
Packit fcad23
        return rc;
Packit fcad23
Packit fcad23
    /*
Packit fcad23
     * load ipv6. ipv6 module might not be loaded,
Packit fcad23
     * so ignore -2 err (file not found)
Packit fcad23
     */
Packit fcad23
    rc = _load_v6(container, &count);
Packit fcad23
    if (-2 == rc)
Packit fcad23
        rc = 0;
Packit fcad23
#endif
Packit fcad23
Packit fcad23
    return rc;
Packit fcad23
}
Packit fcad23
Packit fcad23
/*
Packit fcad23
 * create a new entry
Packit fcad23
 */
Packit fcad23
int
Packit fcad23
netsnmp_arch_route_create(netsnmp_route_entry *entry)
Packit fcad23
{
Packit fcad23
    if (NULL == entry)
Packit fcad23
        return -1;
Packit fcad23
Packit fcad23
    if (4 != entry->rt_dest_len) {
Packit fcad23
        DEBUGMSGT(("access:route:create", "only ipv4 supported\n"));
Packit fcad23
        return -2;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    /* return _netsnmp_ioctl_route_set_v4(entry); */
Packit fcad23
    return -2;
Packit fcad23
}
Packit fcad23
Packit fcad23
/*
Packit fcad23
 * create a new entry
Packit fcad23
 */
Packit fcad23
int
Packit fcad23
netsnmp_arch_route_delete(netsnmp_route_entry *entry)
Packit fcad23
{
Packit fcad23
    if (NULL == entry)
Packit fcad23
        return -1;
Packit fcad23
Packit fcad23
    if (4 != entry->rt_dest_len) {
Packit fcad23
        DEBUGMSGT(("access:route:create", "only ipv4 supported\n"));
Packit fcad23
        return -2;
Packit fcad23
    }
Packit fcad23
Packit fcad23
    /* return _netsnmp_ioctl_route_delete_v4(entry); */
Packit fcad23
    return -2;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
static int
Packit fcad23
IP_Cmp_Route(void *addr, void *ep)
Packit fcad23
{
Packit fcad23
    mib2_ipRouteEntry_t *Ep = ep, *Addr = addr;
Packit fcad23
Packit fcad23
    if ((Ep->ipRouteDest == Addr->ipRouteDest) &&
Packit fcad23
        (Ep->ipRouteNextHop == Addr->ipRouteNextHop) &&
Packit fcad23
        (Ep->ipRouteType == Addr->ipRouteType) &&
Packit fcad23
        (Ep->ipRouteProto == Addr->ipRouteProto) &&
Packit fcad23
        (Ep->ipRouteMask == Addr->ipRouteMask) &&
Packit fcad23
        (Ep->ipRouteInfo.re_max_frag == Addr->ipRouteInfo.re_max_frag) &&
Packit fcad23
        (Ep->ipRouteInfo.re_rtt == Addr->ipRouteInfo.re_rtt) &&
Packit fcad23
        (Ep->ipRouteInfo.re_ref == Addr->ipRouteInfo.re_ref) &&
Packit fcad23
        (Ep->ipRouteInfo.re_frag_flag == Addr->ipRouteInfo.re_frag_flag) &&
Packit fcad23
        (Ep->ipRouteInfo.re_src_addr == Addr->ipRouteInfo.re_src_addr) &&
Packit fcad23
        (Ep->ipRouteInfo.re_ire_type == Addr->ipRouteInfo.re_ire_type) &&
Packit fcad23
        (Ep->ipRouteInfo.re_obpkt == Addr->ipRouteInfo.re_obpkt) &&
Packit fcad23
        (Ep->ipRouteInfo.re_ibpkt == Addr->ipRouteInfo.re_ibpkt)
Packit fcad23
        )
Packit fcad23
        return (0);
Packit fcad23
    else
Packit fcad23
        return (1);             /* Not found */
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
static int
Packit fcad23
IP6_Cmp_Route(void *addr, void *ep)
Packit fcad23
{
Packit fcad23
    mib2_ipv6RouteEntry_t *Ep = ep, *Addr = addr;
Packit fcad23
Packit fcad23
    if ((memcmp(&Ep->ipv6RouteDest, &Addr->ipv6RouteDest, 16) == 0) &&
Packit fcad23
        (memcmp(&Ep->ipv6RouteNextHop, &Addr->ipv6RouteNextHop, 16) == 0) &&
Packit fcad23
        (Ep->ipv6RouteType == Addr->ipv6RouteType) &&
Packit fcad23
        (Ep->ipv6RouteInfo.re_max_frag == Addr->ipv6RouteInfo.re_max_frag) &&
Packit fcad23
        (Ep->ipv6RouteInfo.re_rtt == Addr->ipv6RouteInfo.re_rtt) &&
Packit fcad23
        (Ep->ipv6RouteInfo.re_ref == Addr->ipv6RouteInfo.re_ref) &&
Packit fcad23
        (Ep->ipv6RouteInfo.re_frag_flag == Addr->ipv6RouteInfo.re_frag_flag) &&
Packit fcad23
        (memcmp(&Ep->ipv6RouteInfo.re_src_addr, &Addr->ipv6RouteInfo.re_src_addr, 16) == 0) &&
Packit fcad23
        (Ep->ipv6RouteInfo.re_ire_type == Addr->ipv6RouteInfo.re_ire_type) &&
Packit fcad23
        (Ep->ipv6RouteInfo.re_obpkt == Addr->ipv6RouteInfo.re_obpkt) &&
Packit fcad23
        (Ep->ipv6RouteInfo.re_ibpkt == Addr->ipv6RouteInfo.re_ibpkt)
Packit fcad23
        )
Packit fcad23
        return (0);
Packit fcad23
    else
Packit fcad23
        return (1);             /* Not found */
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
static int _load_v4(netsnmp_container *container, u_long *count)
Packit fcad23
{
Packit fcad23
    netsnmp_route_entry *entry;
Packit fcad23
    mib2_ipRouteEntry_t Curentry, Nextentry;
Packit fcad23
    int req_type;
Packit fcad23
Packit fcad23
    for (Nextentry.ipRouteDest = (u_long) -2, req_type = GET_FIRST;;
Packit fcad23
             Nextentry = Curentry, req_type = GET_NEXT) {
Packit fcad23
	if (getMibstat(MIB_IP_ROUTE, &Curentry, sizeof(mib2_ipRouteEntry_t),
Packit fcad23
		       req_type, &IP_Cmp_Route, &Nextentry) != 0)
Packit fcad23
	    break;
Packit fcad23
#ifdef HAVE_DEFINED_IRE_CACHE
Packit fcad23
	if (Curentry.ipRouteInfo.re_ire_type & IRE_CACHE)
Packit fcad23
	    continue;
Packit fcad23
#endif /* HAVE_DEFINED_IRE_CACHE */
Packit fcad23
	if (Curentry.ipRouteInfo.re_ire_type & IRE_BROADCAST)
Packit fcad23
	    continue;
Packit fcad23
	entry = netsnmp_access_route_entry_create();
Packit fcad23
	Curentry.ipRouteIfIndex.o_bytes[Curentry.ipRouteIfIndex.o_length] = '\0';
Packit fcad23
	entry->if_index = netsnmp_access_interface_index_find(
Packit fcad23
                Curentry.ipRouteIfIndex.o_bytes);
Packit fcad23
	entry->ns_rt_index = entry->if_index;
Packit fcad23
Packit fcad23
	entry->rt_dest_type = INETADDRESSTYPE_IPV4;
Packit fcad23
	entry->rt_dest_len = 4;
Packit fcad23
	memcpy(entry->rt_dest, &Curentry.ipRouteDest, 4);
Packit fcad23
	memcpy(&entry->rt_mask, &Curentry.ipRouteMask, 4);
Packit fcad23
Packit fcad23
	entry->rt_nexthop_type = INETADDRESSTYPE_IPV4;
Packit fcad23
	entry->rt_nexthop_len = 4;
Packit fcad23
	memcpy(entry->rt_nexthop, &Curentry.ipRouteNextHop, 4);
Packit fcad23
Packit fcad23
	entry->rt_pfx_len = netsnmp_ipaddress_ipv4_prefix_len(Curentry.ipRouteMask);
Packit fcad23
	entry->rt_type = Curentry.ipRouteType;
Packit fcad23
	entry->rt_proto = Curentry.ipRouteProto;
Packit fcad23
	entry->rt_age = Curentry.ipRouteAge;
Packit fcad23
	entry->rt_metric1 = Curentry.ipRouteMetric1;
Packit fcad23
	entry->rt_metric2 = Curentry.ipRouteMetric2;
Packit fcad23
	entry->rt_metric3 = Curentry.ipRouteMetric3;
Packit fcad23
	entry->rt_metric4 = Curentry.ipRouteMetric4;
Packit fcad23
Packit fcad23
	/*
Packit fcad23
	 * insert into container
Packit fcad23
	 */
Packit fcad23
	if (CONTAINER_INSERT(container, entry) < 0) {
Packit fcad23
	    DEBUGMSGTL(("access:route:container", "error with route_entry: insert into container failed.\n"));
Packit fcad23
	    netsnmp_access_route_entry_free(entry);
Packit fcad23
	    continue;
Packit fcad23
	}
Packit fcad23
	*count++;
Packit fcad23
    }
Packit fcad23
    return 0;
Packit fcad23
}
Packit fcad23
Packit fcad23
Packit fcad23
static int _load_v6(netsnmp_container *container, u_long *count)
Packit fcad23
{
Packit fcad23
    netsnmp_route_entry *entry;
Packit fcad23
    mib2_ipv6RouteEntry_t Curentry, Nextentry;
Packit fcad23
    int req_type;
Packit fcad23
Packit fcad23
    memset(&Nextentry, 0, sizeof(Nextentry));
Packit fcad23
    for (req_type = GET_FIRST;;
Packit fcad23
             Nextentry = Curentry, req_type = GET_NEXT) {
Packit fcad23
	if (getMibstat(MIB_IP6_ROUTE, &Curentry, sizeof(mib2_ipv6RouteEntry_t),
Packit fcad23
		       req_type, &IP6_Cmp_Route, &Nextentry) != 0)
Packit fcad23
	    break;
Packit fcad23
#ifdef HAVE_DEFINED_IRE_CACHE
Packit fcad23
	if (Curentry.ipv6RouteInfo.re_ire_type & IRE_CACHE)
Packit fcad23
	    continue;
Packit fcad23
#endif /* HAVE_DEFINED_IRE_CACHE */
Packit fcad23
	if (Curentry.ipv6RouteInfo.re_ire_type & IRE_BROADCAST)
Packit fcad23
	    continue;
Packit fcad23
	entry = netsnmp_access_route_entry_create();
Packit fcad23
	Curentry.ipv6RouteIfIndex.o_bytes[Curentry.ipv6RouteIfIndex.o_length] = '\0';
Packit fcad23
	entry->if_index = netsnmp_access_interface_index_find(
Packit fcad23
                Curentry.ipv6RouteIfIndex.o_bytes);
Packit fcad23
	entry->ns_rt_index = entry->if_index;
Packit fcad23
Packit fcad23
	entry->rt_dest_type = INETADDRESSTYPE_IPV6;
Packit fcad23
	entry->rt_dest_len = 16;
Packit fcad23
	memcpy(entry->rt_dest, &Curentry.ipv6RouteDest, 16);
Packit fcad23
Packit fcad23
	entry->rt_nexthop_type = INETADDRESSTYPE_IPV6;
Packit fcad23
	entry->rt_nexthop_len = 16;
Packit fcad23
	memcpy(entry->rt_nexthop, &Curentry.ipv6RouteNextHop, 16);
Packit fcad23
Packit fcad23
	entry->rt_pfx_len = Curentry.ipv6RoutePfxLength;
Packit fcad23
	entry->rt_type = Curentry.ipv6RouteType;
Packit fcad23
	entry->rt_proto = Curentry.ipv6RouteProtocol;
Packit fcad23
	entry->rt_age = Curentry.ipv6RouteAge;
Packit fcad23
	entry->rt_policy = calloc(3, sizeof(oid));
Packit fcad23
	entry->rt_policy_len = 3;
Packit fcad23
	entry->rt_policy[2] = Curentry.ipv6RoutePolicy;
Packit fcad23
	entry->rt_metric1 = Curentry.ipv6RouteMetric;
Packit fcad23
	entry->rt_metric2 = Curentry.ipv6RouteWeight;
Packit fcad23
Packit fcad23
	/*
Packit fcad23
	 * insert into container
Packit fcad23
	 */
Packit fcad23
	if (CONTAINER_INSERT(container, entry) < 0) {
Packit fcad23
	    DEBUGMSGTL(("access:route:container", "error with route_entry: insert into container failed.\n"));
Packit fcad23
	    netsnmp_access_route_entry_free(entry);
Packit fcad23
	    continue;
Packit fcad23
	}
Packit fcad23
	*count++;
Packit fcad23
    }
Packit fcad23
    return 0;
Packit fcad23
}