Date: Sat, 29 Nov 2014 19:27:44 +0000 (UTC) From: "Alexander V. Chernikov" <melifaro@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r275263 - in projects/routing/sys: net netinet netinet6 Message-ID: <201411291927.sATJRiLq062881@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201411291927.sATJRiLq062881>