|
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 |
}
|