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