svn commit: r275263 - in projects/routing/sys: net netinet netinet6

Alexander V. Chernikov melifaro at FreeBSD.org
Sat Nov 29 19:27:46 UTC 2014


Author: melifaro
Date: Sat Nov 29 19:27:43 2014
New Revision: 275263
URL: https://svnweb.freebsd.org/changeset/base/275263

Log:
  Provide rte_<get|set> methods to access rtentry for external consumers.

Modified:
  projects/routing/sys/net/if.c
  projects/routing/sys/net/route.c
  projects/routing/sys/net/route.h
  projects/routing/sys/netinet/if_ether.c
  projects/routing/sys/netinet/in_rmx.c
  projects/routing/sys/netinet6/in6_ifattach.c
  projects/routing/sys/netinet6/in6_rmx.c

Modified: projects/routing/sys/net/if.c
==============================================================================
--- projects/routing/sys/net/if.c	Sat Nov 29 18:44:52 2014	(r275262)
+++ projects/routing/sys/net/if.c	Sat Nov 29 19:27:43 2014	(r275263)
@@ -76,7 +76,6 @@
 #include <net/if_vlan_var.h>
 #include <net/radix.h>
 #include <net/route.h>
-#include <net/route_internal.h>
 #include <net/vnet.h>
 
 #if defined(INET) || defined(INET6)
@@ -1893,8 +1892,6 @@ ifa_preferred(struct ifaddr *cur, struct
 	    ((*carp_master_p)(next) && !(*carp_master_p)(cur))));
 }
 
-#include <net/if_llatbl.h>
-
 /*
  * Default action when installing a route with a Link Level gateway.
  * Lookup an appropriate real ifa to point to.
@@ -1904,16 +1901,18 @@ static void
 link_rtrequest(int cmd, struct rtentry *rt, struct rt_addrinfo *info)
 {
 	struct ifaddr *ifa, *oifa;
-	struct sockaddr *dst;
+	const struct sockaddr *dst;
 	struct ifnet *ifp;
 
-	if (cmd != RTM_ADD || ((ifa = rt->rt_ifa) == 0) ||
-	    ((ifp = ifa->ifa_ifp) == 0) || ((dst = rt_key(rt)) == 0))
+	ifp = rte_get_lifp(rt);
+	oifa = rte_get_ifa(rt);
+	dst = rte_get_dst(rt);
+
+	if (cmd != RTM_ADD || oifa == NULL || ifp == NULL || dst == NULL)
 		return;
-	ifa = ifaof_ifpforaddr(dst, ifp);
+	ifa = ifaof_ifpforaddr(__DECONST(struct sockaddr *, dst), ifp);
 	if (ifa) {
-		oifa = rt->rt_ifa;
-		rt->rt_ifa = ifa;
+		rte_set_ifa(rt, ifa);
 		ifa_free(oifa);
 		if (ifa->ifa_rtrequest && ifa->ifa_rtrequest != link_rtrequest)
 			ifa->ifa_rtrequest(cmd, rt, info);

Modified: projects/routing/sys/net/route.c
==============================================================================
--- projects/routing/sys/net/route.c	Sat Nov 29 18:44:52 2014	(r275262)
+++ projects/routing/sys/net/route.c	Sat Nov 29 19:27:43 2014	(r275263)
@@ -512,6 +512,94 @@ done:
 	RT_UNLOCK(rt);
 }
 
+/*
+ * Route entry get/set methods for external consumers.
+ */
+
+const struct sockaddr *
+rte_get_dst(struct rtentry *rte)
+{
+
+	return ((const struct sockaddr *)rt_key(rte));
+}
+
+const struct sockaddr *
+rte_get_mask(struct rtentry *rte)
+{
+
+	return ((const struct sockaddr *)rt_mask(rte));
+}
+
+struct sockaddr *
+rte_get_gw(struct rtentry *rte)
+{
+
+	return ((struct sockaddr *)rte->rt_gateway);
+}
+
+struct ifnet *
+rte_get_lifp(struct rtentry *rte)
+{
+
+	return (rte->rt_ifp);
+}
+
+struct ifaddr *
+rte_get_ifa(struct rtentry *rte)
+{
+
+	return (rte->rt_ifa);
+}
+
+void
+rte_set_ifa(struct rtentry *rte, struct ifaddr *ifa)
+{
+
+	rte->rt_ifa = ifa;
+}
+
+unsigned int
+rte_get_flags(struct rtentry *rte)
+{
+
+	return ((unsigned int)rte->rt_flags);
+}
+
+void
+rte_set_flags(struct rtentry *rte, unsigned int rt_flags)
+{
+
+	rte->rt_flags = rt_flags;
+}
+
+unsigned long
+rte_get_mtu(struct rtentry *rte)
+{
+
+	return ((unsigned int)rte->rt_mtu);
+}
+
+void
+rte_set_mtu(struct rtentry *rte, unsigned long mtu)
+{
+
+	rte->rt_mtu = (u_long)mtu;
+}
+
+unsigned long
+rte_get_weight(struct rtentry *rte)
+{
+
+	return ((uint32_t)rte->rt_weight);
+}
+
+void
+rte_set_weight(struct rtentry *rte, unsigned long weight)
+{
+
+	rte->rt_weight = weight;
+}
+
 
 /*
  * Force a routing table entry to the specified

Modified: projects/routing/sys/net/route.h
==============================================================================
--- projects/routing/sys/net/route.h	Sat Nov 29 18:44:52 2014	(r275262)
+++ projects/routing/sys/net/route.h	Sat Nov 29 19:27:43 2014	(r275263)
@@ -178,6 +178,19 @@ struct rtentry {
 	(RTF_PROTO1 | RTF_PROTO2 | RTF_PROTO3 | RTF_BLACKHOLE | \
 	 RTF_REJECT | RTF_STATIC | RTF_STICKY)
 
+const struct sockaddr *rte_get_dst(struct rtentry *rte);
+const struct sockaddr *rte_get_mask(struct rtentry *rte);
+struct sockaddr *rte_get_gw(struct rtentry *rte);
+struct ifnet *rte_get_lifp(struct rtentry *rte);
+struct ifaddr *rte_get_ifa(struct rtentry *rte);
+void rte_set_ifa(struct rtentry *rte, struct ifaddr *ifa);
+unsigned int rte_get_flags(struct rtentry *rte);
+void rte_set_flags(struct rtentry *rte, unsigned int rt_flags);
+unsigned long rte_get_mtu(struct rtentry *rte);
+void rte_set_mtu(struct rtentry *rte, unsigned long mtu);
+unsigned long rte_get_weight(struct rtentry *rte);
+void rte_set_weight(struct rtentry *rte, unsigned long weight);;
+
 /*
  * Routing statistics.
  */

Modified: projects/routing/sys/netinet/if_ether.c
==============================================================================
--- projects/routing/sys/netinet/if_ether.c	Sat Nov 29 18:44:52 2014	(r275262)
+++ projects/routing/sys/netinet/if_ether.c	Sat Nov 29 19:27:43 2014	(r275263)
@@ -61,7 +61,6 @@ __FBSDID("$FreeBSD$");
 #include <net/if_llc.h>
 #include <net/ethernet.h>
 #include <net/route.h>
-#include <net/route_internal.h>
 #include <net/vnet.h>
 
 #include <netinet/in.h>
@@ -471,7 +470,7 @@ arpresolve(struct ifnet *ifp, struct rte
 	}
 	IF_AFDATA_RUN_RUNLOCK(ifp);
 
-	is_gw = (rt0 != NULL && (rt0->rt_flags & RTF_GATEWAY)) ? 1 : 0;
+	is_gw = (rt0 != NULL) ? (rte_get_flags(rt0) & RTF_GATEWAY) : 0;
 	return (arpresolve_slow(ifp, is_gw, m, dst, desten, lle));
 }
 

Modified: projects/routing/sys/netinet/in_rmx.c
==============================================================================
--- projects/routing/sys/netinet/in_rmx.c	Sat Nov 29 18:44:52 2014	(r275262)
+++ projects/routing/sys/netinet/in_rmx.c	Sat Nov 29 19:27:43 2014	(r275263)
@@ -64,9 +64,18 @@ static struct radix_node *
 in_addroute(void *v_arg, void *n_arg, struct radix_head *head,
     struct radix_node *treenodes)
 {
-	struct rtentry *rt = (struct rtentry *)treenodes;
-	struct sockaddr_in *sin = (struct sockaddr_in *)rt_key(rt);
+	unsigned int mtu, rt_flags;
+	struct rtentry *rt;
+	const struct sockaddr_in *sin;
+	struct ifnet *ifp;
+	struct ifaddr *ifa;
 
+	rt = (struct rtentry *)treenodes;
+	sin = (const struct sockaddr_in *)rte_get_dst(rt);
+	rt_flags = rte_get_flags(rt);
+	ifp = rte_get_lifp(rt);
+	ifa = rte_get_ifa(rt);
+	
 	/*
 	 * A little bit of help for both IP output and input:
 	 *   For host routes, we make sure that RTF_BROADCAST
@@ -82,28 +91,31 @@ in_addroute(void *v_arg, void *n_arg, st
 	 * it's easy to do and might be useful (but this is much more
 	 * dubious since it's so easy to inspect the address).
 	 */
-	if (rt->rt_flags & RTF_HOST) {
-		if (in_broadcast(sin->sin_addr, rt->rt_ifp)) {
-			rt->rt_flags |= RTF_BROADCAST;
-		} else if (satosin(rt->rt_ifa->ifa_addr)->sin_addr.s_addr ==
+	if (rt_flags & RTF_HOST) {
+		if (in_broadcast(sin->sin_addr, ifp)) {
+			rt_flags |= RTF_BROADCAST;
+		} else if (satosin(ifa->ifa_addr)->sin_addr.s_addr ==
 		    sin->sin_addr.s_addr) {
-			rt->rt_flags |= RTF_LOCAL;
+			rt_flags |= RTF_LOCAL;
 		}
 	}
 	if (IN_MULTICAST(ntohl(sin->sin_addr.s_addr)))
-		rt->rt_flags |= RTF_MULTICAST;
+		rt_flags |= RTF_MULTICAST;
+
+	rte_set_flags(rt, rt_flags);
 
-	if (rt->rt_ifp != NULL) {
+	if (ifp != NULL) {
 
 		/*
 		 * Check route MTU:
 		 * inherit interface MTU if not set or
 		 * check if MTU is too large.
 		 */
-		if (rt->rt_mtu == 0) {
-			rt->rt_mtu = rt->rt_ifp->if_mtu;
-		} else if (rt->rt_mtu > rt->rt_ifp->if_mtu)
-			rt->rt_mtu = rt->rt_ifp->if_mtu;
+		mtu = rte_get_mtu(rt);
+		if (mtu == 0) {
+			rte_set_mtu(rt, ifp->if_mtu);
+		} else if (mtu > ifp->if_mtu)
+			rte_set_mtu(rt, ifp->if_mtu);
 	}
 
 	return (rn_addroute(v_arg, n_arg, head, treenodes));

Modified: projects/routing/sys/netinet6/in6_ifattach.c
==============================================================================
--- projects/routing/sys/netinet6/in6_ifattach.c	Sat Nov 29 18:44:52 2014	(r275262)
+++ projects/routing/sys/netinet6/in6_ifattach.c	Sat Nov 29 19:27:43 2014	(r275263)
@@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
 #include <net/if_dl.h>
 #include <net/if_types.h>
 #include <net/route.h>
-#include <net/route_internal.h>
 #include <net/vnet.h>
 
 #include <netinet/in.h>

Modified: projects/routing/sys/netinet6/in6_rmx.c
==============================================================================
--- projects/routing/sys/netinet6/in6_rmx.c	Sat Nov 29 18:44:52 2014	(r275262)
+++ projects/routing/sys/netinet6/in6_rmx.c	Sat Nov 29 19:27:43 2014	(r275263)
@@ -106,12 +106,22 @@ static struct radix_node *
 in6_addroute(void *v_arg, void *n_arg, struct radix_head *head,
     struct radix_node *treenodes)
 {
-	struct rtentry *rt = (struct rtentry *)treenodes;
-	struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)rt_key(rt);
+	unsigned int mtu, rt_flags;
+	struct rtentry *rt;
+	const struct sockaddr_in6 *sin6;
+	struct ifnet *ifp;
+	struct ifaddr *ifa;
+
+	rt = (struct rtentry *)treenodes;
+	sin6 = (const struct sockaddr_in6 *)rte_get_dst(rt);
+	rt_flags = rte_get_flags(rt);
+	ifp = rte_get_lifp(rt);
+	ifa = rte_get_ifa(rt);
+	
 	struct radix_node *ret;
 
 	if (IN6_IS_ADDR_MULTICAST(&sin6->sin6_addr))
-		rt->rt_flags |= RTF_MULTICAST;
+		rt_flags |= RTF_MULTICAST;
 
 	/*
 	 * A little bit of help for both IPv6 output and input:
@@ -127,30 +137,33 @@ in6_addroute(void *v_arg, void *n_arg, s
 	 * XXX
 	 * should elaborate the code.
 	 */
-	if (rt->rt_flags & RTF_HOST) {
-		if (IN6_ARE_ADDR_EQUAL(&satosin6(rt->rt_ifa->ifa_addr)
-					->sin6_addr,
-				       &sin6->sin6_addr)) {
-			rt->rt_flags |= RTF_LOCAL;
+	if (rt_flags & RTF_HOST) {
+		if (IN6_ARE_ADDR_EQUAL(&satosin6(ifa->ifa_addr)->sin6_addr,
+		    &sin6->sin6_addr)) {
+			rt_flags |= RTF_LOCAL;
 		}
 	}
 
-	if (rt->rt_ifp != NULL) {
+	rte_set_flags(rt, rt_flags);
+
+	if (ifp != NULL) {
 
 		/*
 		 * Check route MTU:
 		 * inherit interface MTU if not set or
 		 * check if MTU is too large.
 		 */
-		if (rt->rt_mtu == 0) {
-			rt->rt_mtu = IN6_LINKMTU(rt->rt_ifp);
-		} else if (rt->rt_mtu > IN6_LINKMTU(rt->rt_ifp))
-			rt->rt_mtu = IN6_LINKMTU(rt->rt_ifp);
+		mtu = rte_get_mtu(rt);
+		if (mtu == 0) {
+			rte_set_mtu(rt, IN6_LINKMTU(rt->rt_ifp));
+		} else if (mtu > IN6_LINKMTU(rt->rt_ifp))
+			rte_set_mtu(rt, IN6_LINKMTU(rt->rt_ifp));
 	}
 
 	ret = rn_addroute(v_arg, n_arg, head, treenodes);
 	if (ret == NULL) {
 		struct rtentry *rt2;
+		struct sockaddr *gw;
 		/*
 		 * We are trying to add a net route, but can't.
 		 * The following case should be allowed, so we'll make a
@@ -166,10 +179,13 @@ in6_addroute(void *v_arg, void *n_arg, s
 		rt2 = in6_rtalloc1((struct sockaddr *)sin6, 0, RTF_RNH_LOCKED,
 		    rt->rt_fibnum);
 		if (rt2) {
-			if (((rt2->rt_flags & (RTF_HOST|RTF_GATEWAY)) == 0)
-			 && rt2->rt_gateway
-			 && rt2->rt_gateway->sa_family == AF_LINK
-			 && rt2->rt_ifp == rt->rt_ifp) {
+			rt_flags = rte_get_flags(rt2);
+			ifp = rte_get_lifp(rt2);
+			gw = rte_get_gw(rt2);
+			if (((rt_flags & (RTF_HOST|RTF_GATEWAY)) == 0)
+			 && gw != NULL 
+			 && gw->sa_family == AF_LINK
+			 && ifp == rte_get_lifp(rt)) {
 				ret = rt2->rt_nodes;
 			}
 			RTFREE_LOCKED(rt2);


More information about the svn-src-projects mailing list