svn commit: r256615 - user/ae/inet6/sys/netinet6
Andrey V. Elsukov
ae at FreeBSD.org
Wed Oct 16 10:11:31 UTC 2013
Author: ae
Date: Wed Oct 16 10:11:30 2013
New Revision: 256615
URL: http://svnweb.freebsd.org/changeset/base/256615
Log:
Remove in6_selectroute, in6_selectroute_fib, in6_selectif and
selectroute functions.
Modified:
user/ae/inet6/sys/netinet6/in6_src.c
user/ae/inet6/sys/netinet6/ip6_var.h
Modified: user/ae/inet6/sys/netinet6/in6_src.c
==============================================================================
--- user/ae/inet6/sys/netinet6/in6_src.c Wed Oct 16 09:56:40 2013 (r256614)
+++ user/ae/inet6/sys/netinet6/in6_src.c Wed Oct 16 10:11:30 2013 (r256615)
@@ -139,13 +139,6 @@ static int handle_pktinfo(const struct s
struct route_in6 *ro, u_int fibnum, struct ifnet **ifpp,
struct in6_addr *srcp, int *done);
-static int selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
- struct ip6_moptions *, struct route_in6 *, struct ifnet **,
- struct rtentry **, int, u_int);
-static int in6_selectif(struct sockaddr_in6 *, struct ip6_pktopts *,
- struct ip6_moptions *, struct route_in6 *ro, struct ifnet **,
- struct ifnet *, u_int);
-
static int lookup_policy_label(const struct in6_addr *, uint32_t);
static void init_policy_queue(void);
@@ -788,339 +781,6 @@ in6_selectsrc(struct sockaddr_in6 *dst,
}
/*
- * clone - meaningful only for bsdi and freebsd
- */
-static int
-selectroute(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
- struct ip6_moptions *mopts, struct route_in6 *ro,
- struct ifnet **retifp, struct rtentry **retrt, int norouteok, u_int fibnum)
-{
- int error = 0;
- struct ifnet *ifp = NULL;
- struct rtentry *rt = NULL;
- struct sockaddr_in6 *sin6_next;
- struct in6_pktinfo *pi = NULL;
- struct in6_addr *dst = &dstsock->sin6_addr;
-#if 0
- char ip6buf[INET6_ADDRSTRLEN];
-
- if (dstsock->sin6_addr.s6_addr32[0] == 0 &&
- dstsock->sin6_addr.s6_addr32[1] == 0 &&
- !IN6_IS_ADDR_LOOPBACK(&dstsock->sin6_addr)) {
- printf("in6_selectroute: strange destination %s\n",
- ip6_sprintf(ip6buf, &dstsock->sin6_addr));
- } else {
- printf("in6_selectroute: destination = %s%%%d\n",
- ip6_sprintf(ip6buf, &dstsock->sin6_addr),
- dstsock->sin6_scope_id); /* for debug */
- }
-#endif
-
- /* If the caller specify the outgoing interface explicitly, use it. */
- if (opts && (pi = opts->ip6po_pktinfo) != NULL && pi->ipi6_ifindex) {
- /* XXX boundary check is assumed to be already done. */
- ifp = ifnet_byindex(pi->ipi6_ifindex);
- if (ifp != NULL &&
- (norouteok || retrt == NULL ||
- IN6_IS_ADDR_MULTICAST(dst))) {
- /*
- * we do not have to check or get the route for
- * multicast.
- */
- goto done;
- } else
- goto getroute;
- }
-
- /*
- * If the destination address is a multicast address and the outgoing
- * interface for the address is specified by the caller, use it.
- */
- if (IN6_IS_ADDR_MULTICAST(dst) &&
- mopts != NULL && (ifp = mopts->im6o_multicast_ifp) != NULL) {
- goto done; /* we do not need a route for multicast. */
- }
-
- getroute:
- /*
- * If the next hop address for the packet is specified by the caller,
- * use it as the gateway.
- */
- if (opts && opts->ip6po_nexthop) {
- struct route_in6 *ron;
- struct llentry *la;
-
- sin6_next = satosin6(opts->ip6po_nexthop);
-
- /* at this moment, we only support AF_INET6 next hops */
- if (sin6_next->sin6_family != AF_INET6) {
- error = EAFNOSUPPORT; /* or should we proceed? */
- goto done;
- }
-
- /*
- * If the next hop is an IPv6 address, then the node identified
- * by that address must be a neighbor of the sending host.
- */
- ron = &opts->ip6po_nextroute;
- /*
- * XXX what do we do here?
- * PLZ to be fixing
- */
-
-
- if (ron->ro_rt == NULL) {
- in6_rtalloc(ron, fibnum); /* multi path case? */
- if (ron->ro_rt == NULL) {
- /* XXX-BZ WT.? */
- if (ron->ro_rt) {
- RTFREE(ron->ro_rt);
- ron->ro_rt = NULL;
- }
- error = EHOSTUNREACH;
- goto done;
- }
- }
-
- rt = ron->ro_rt;
- ifp = rt->rt_ifp;
- IF_AFDATA_RLOCK(ifp);
- la = lla_lookup(LLTABLE6(ifp), 0, (struct sockaddr *)&sin6_next->sin6_addr);
- IF_AFDATA_RUNLOCK(ifp);
- if (la != NULL)
- LLE_RUNLOCK(la);
- else {
- error = EHOSTUNREACH;
- goto done;
- }
-#if 0
- if ((ron->ro_rt &&
- (ron->ro_rt->rt_flags & (RTF_UP | RTF_LLINFO)) !=
- (RTF_UP | RTF_LLINFO)) ||
- !IN6_ARE_ADDR_EQUAL(&satosin6(&ron->ro_dst)->sin6_addr,
- &sin6_next->sin6_addr)) {
- if (ron->ro_rt) {
- RTFREE(ron->ro_rt);
- ron->ro_rt = NULL;
- }
- *satosin6(&ron->ro_dst) = *sin6_next;
- }
- if (ron->ro_rt == NULL) {
- in6_rtalloc(ron, fibnum); /* multi path case? */
- if (ron->ro_rt == NULL ||
- !(ron->ro_rt->rt_flags & RTF_LLINFO)) {
- if (ron->ro_rt) {
- RTFREE(ron->ro_rt);
- ron->ro_rt = NULL;
- }
- error = EHOSTUNREACH;
- goto done;
- }
- }
-#endif
-
- /*
- * When cloning is required, try to allocate a route to the
- * destination so that the caller can store path MTU
- * information.
- */
- goto done;
- }
-
- /*
- * Use a cached route if it exists and is valid, else try to allocate
- * a new one. Note that we should check the address family of the
- * cached destination, in case of sharing the cache with IPv4.
- */
- if (ro) {
- if (ro->ro_rt &&
- (!(ro->ro_rt->rt_flags & RTF_UP) ||
- ((struct sockaddr *)(&ro->ro_dst))->sa_family != AF_INET6 ||
- !IN6_ARE_ADDR_EQUAL(&satosin6(&ro->ro_dst)->sin6_addr,
- dst))) {
- RTFREE(ro->ro_rt);
- ro->ro_rt = (struct rtentry *)NULL;
- }
- if (ro->ro_rt == (struct rtentry *)NULL) {
- struct sockaddr_in6 *sa6;
-
- /* No route yet, so try to acquire one */
- bzero(&ro->ro_dst, sizeof(struct sockaddr_in6));
- sa6 = (struct sockaddr_in6 *)&ro->ro_dst;
- *sa6 = *dstsock;
- sa6->sin6_scope_id = 0;
-
-#ifdef RADIX_MPATH
- rtalloc_mpath_fib((struct route *)ro,
- ntohl(sa6->sin6_addr.s6_addr32[3]), fibnum);
-#else
- ro->ro_rt = in6_rtalloc1((struct sockaddr *)
- &ro->ro_dst, 0, 0UL, fibnum);
- if (ro->ro_rt)
- RT_UNLOCK(ro->ro_rt);
-#endif
- }
-
- /*
- * do not care about the result if we have the nexthop
- * explicitly specified.
- */
- if (opts && opts->ip6po_nexthop)
- goto done;
-
- if (ro->ro_rt) {
- ifp = ro->ro_rt->rt_ifp;
-
- if (ifp == NULL) { /* can this really happen? */
- RTFREE(ro->ro_rt);
- ro->ro_rt = NULL;
- }
- }
- if (ro->ro_rt == NULL)
- error = EHOSTUNREACH;
- rt = ro->ro_rt;
-
- /*
- * Check if the outgoing interface conflicts with
- * the interface specified by ipi6_ifindex (if specified).
- * Note that loopback interface is always okay.
- * (this may happen when we are sending a packet to one of
- * our own addresses.)
- */
- if (ifp && opts && opts->ip6po_pktinfo &&
- opts->ip6po_pktinfo->ipi6_ifindex) {
- if (!(ifp->if_flags & IFF_LOOPBACK) &&
- ifp->if_index !=
- opts->ip6po_pktinfo->ipi6_ifindex) {
- error = EHOSTUNREACH;
- goto done;
- }
- }
- }
-
- done:
- if (ifp == NULL && rt == NULL) {
- /*
- * This can happen if the caller did not pass a cached route
- * nor any other hints. We treat this case an error.
- */
- error = EHOSTUNREACH;
- }
- if (error == EHOSTUNREACH)
- IP6STAT_INC(ip6s_noroute);
-
- if (retifp != NULL) {
- *retifp = ifp;
-
- /*
- * Adjust the "outgoing" interface. If we're going to loop
- * the packet back to ourselves, the ifp would be the loopback
- * interface. However, we'd rather know the interface associated
- * to the destination address (which should probably be one of
- * our own addresses.)
- */
- if (rt) {
- if ((rt->rt_ifp->if_flags & IFF_LOOPBACK) &&
- (rt->rt_gateway->sa_family == AF_LINK))
- *retifp =
- ifnet_byindex(((struct sockaddr_dl *)
- rt->rt_gateway)->sdl_index);
- }
- }
-
- if (retrt != NULL)
- *retrt = rt; /* rt may be NULL */
-
- return (error);
-}
-
-static int
-in6_selectif(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
- struct ip6_moptions *mopts, struct route_in6 *ro, struct ifnet **retifp,
- struct ifnet *oifp, u_int fibnum)
-{
- int error;
- struct route_in6 sro;
- struct rtentry *rt = NULL;
-
- KASSERT(retifp != NULL, ("%s: retifp is NULL", __func__));
-
- if (ro == NULL) {
- bzero(&sro, sizeof(sro));
- ro = &sro;
- }
-
- if ((error = selectroute(dstsock, opts, mopts, ro, retifp,
- &rt, 1, fibnum)) != 0) {
- if (ro == &sro && rt && rt == sro.ro_rt)
- RTFREE(rt);
- /* Help ND. See oifp comment in in6_selectsrc(). */
- if (oifp != NULL && fibnum == RT_DEFAULT_FIB) {
- *retifp = oifp;
- error = 0;
- }
- return (error);
- }
-
- /*
- * do not use a rejected or black hole route.
- * XXX: this check should be done in the L2 output routine.
- * However, if we skipped this check here, we'd see the following
- * scenario:
- * - install a rejected route for a scoped address prefix
- * (like fe80::/10)
- * - send a packet to a destination that matches the scoped prefix,
- * with ambiguity about the scope zone.
- * - pick the outgoing interface from the route, and disambiguate the
- * scope zone with the interface.
- * - ip6_output() would try to get another route with the "new"
- * destination, which may be valid.
- * - we'd see no error on output.
- * Although this may not be very harmful, it should still be confusing.
- * We thus reject the case here.
- */
- if (rt && (rt->rt_flags & (RTF_REJECT | RTF_BLACKHOLE))) {
- int flags = (rt->rt_flags & RTF_HOST ? EHOSTUNREACH : ENETUNREACH);
-
- if (ro == &sro && rt && rt == sro.ro_rt)
- RTFREE(rt);
- return (flags);
- }
-
- if (ro == &sro && rt && rt == sro.ro_rt)
- RTFREE(rt);
- return (0);
-}
-
-/*
- * Public wrapper function to selectroute().
- *
- * XXX-BZ in6_selectroute() should and will grow the FIB argument. The
- * in6_selectroute_fib() function is only there for backward compat on stable.
- */
-int
-in6_selectroute(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
- struct ip6_moptions *mopts, struct route_in6 *ro,
- struct ifnet **retifp, struct rtentry **retrt)
-{
-
- return (selectroute(dstsock, opts, mopts, ro, retifp,
- retrt, 0, RT_DEFAULT_FIB));
-}
-
-#ifndef BURN_BRIDGES
-int
-in6_selectroute_fib(struct sockaddr_in6 *dstsock, struct ip6_pktopts *opts,
- struct ip6_moptions *mopts, struct route_in6 *ro,
- struct ifnet **retifp, struct rtentry **retrt, u_int fibnum)
-{
-
- return (selectroute(dstsock, opts, mopts, ro, retifp,
- retrt, 0, fibnum));
-}
-#endif
-
-/*
* Default hop limit selection. The precedence is as follows:
* 1. Hoplimit value specified via ioctl.
* 2. (If the outgoing interface is detected) the current
Modified: user/ae/inet6/sys/netinet6/ip6_var.h
==============================================================================
--- user/ae/inet6/sys/netinet6/ip6_var.h Wed Oct 16 09:56:40 2013 (r256614)
+++ user/ae/inet6/sys/netinet6/ip6_var.h Wed Oct 16 10:11:30 2013 (r256615)
@@ -455,12 +455,6 @@ int none_input(struct mbuf **, int *, in
int in6_selectsrc(struct sockaddr_in6 *, struct ip6_pktopts *,
struct inpcb *inp, struct route_in6 *, struct ucred *cred,
struct ifnet **, struct in6_addr *);
-int in6_selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
- struct ip6_moptions *, struct route_in6 *, struct ifnet **,
- struct rtentry **);
-int in6_selectroute_fib(struct sockaddr_in6 *, struct ip6_pktopts *,
- struct ip6_moptions *, struct route_in6 *, struct ifnet **,
- struct rtentry **, u_int);
u_int32_t ip6_randomid(void);
u_int32_t ip6_randomflowlabel(void);
#endif /* _KERNEL */
More information about the svn-src-user
mailing list