Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Apr 2020 08:06:57 +0000 (UTC)
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r360431 - in head/sys: net netinet
Message-ID:  <202004280806.03S86vQC087708@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: melifaro
Date: Tue Apr 28 08:06:56 2020
New Revision: 360431
URL: https://svnweb.freebsd.org/changeset/base/360431

Log:
  Convert rtalloc_mpath_fib() users to the new KPI.
  
  New fib[46]_lookup() functions support multipath transparently.
  Given that, switch the last rtalloc_mpath_fib() calls to
   dib4_lookup() and eliminate the function itself.
  
  Note: proper flowid generation (especially for the outbound traffic) is a
   bigger topic and will be handled in a separate review.
  This change leaves flowid generation intact.
  
  Differential Revision:	https://reviews.freebsd.org/D24595

Modified:
  head/sys/net/radix_mpath.c
  head/sys/net/radix_mpath.h
  head/sys/netinet/ip_input.c
  head/sys/netinet/ip_output.c

Modified: head/sys/net/radix_mpath.c
==============================================================================
--- head/sys/net/radix_mpath.c	Tue Apr 28 07:25:34 2020	(r360430)
+++ head/sys/net/radix_mpath.c	Tue Apr 28 08:06:56 2020	(r360431)
@@ -257,46 +257,6 @@ rt_mpath_select(struct rtentry *rte, uint32_t hash)
 }
 
 void
-rtalloc_mpath_fib(struct route *ro, uint32_t hash, u_int fibnum)
-{
-	struct rtentry *rt, *rt_tmp;
-
-	/*
-	 * XXX we don't attempt to lookup cached route again; what should
-	 * be done for sendto(3) case?
-	 */
-	if (ro->ro_nh && RT_LINK_IS_UP(ro->ro_nh->nh_ifp))
-		return;				 
-	ro->ro_nh = NULL;
-	rt_tmp = rtalloc1_fib(&ro->ro_dst, 1, 0, fibnum);
-
-	/* if the route does not exist or it is not multipath, don't care */
-	if (rt_tmp == NULL)
-		return;
-	if (rn_mpath_next((struct radix_node *)rt_tmp) == NULL) {
-		ro->ro_nh = rt_tmp->rt_nhop;
-		nhop_ref_object(ro->ro_nh);
-		RT_UNLOCK(rt_tmp);
-		return;
-	}
-
-	rt = rt_mpath_selectrte(rt_tmp, hash);
-	/* XXX try filling rt_gwroute and avoid unreachable gw  */
-
-	/* gw selection has failed - there must be only zero weight routes */
-	if (!rt) {
-		RT_UNLOCK(rt_tmp);
-		return;
-	}
-	if (rt_tmp != rt) {
-		RTFREE_LOCKED(rt_tmp);
-		ro->ro_nh = rt->rt_nhop;
-		nhop_ref_object(ro->ro_nh);
-	} else
-		RT_UNLOCK(rt_tmp);
-}
-
-void
 rt_mpath_init_rnh(struct rib_head *rnh)
 {
 

Modified: head/sys/net/radix_mpath.h
==============================================================================
--- head/sys/net/radix_mpath.h	Tue Apr 28 07:25:34 2020	(r360430)
+++ head/sys/net/radix_mpath.h	Tue Apr 28 08:06:56 2020	(r360431)
@@ -54,7 +54,6 @@ u_int32_t rn_mpath_count(struct radix_node *);
 struct rtentry *rt_mpath_matchgate(struct rtentry *, struct sockaddr *);
 int rt_mpath_conflict(struct rib_head *, struct rtentry *,
     struct sockaddr *);
-void rtalloc_mpath_fib(struct route *, u_int32_t, u_int);
 struct rtentry *rt_mpath_select(struct rtentry *, uint32_t);
 struct rtentry *rt_mpath_selectrte(struct rtentry *, uint32_t);
 int rt_mpath_deldup(struct rtentry *, struct rtentry *);

Modified: head/sys/netinet/ip_input.c
==============================================================================
--- head/sys/netinet/ip_input.c	Tue Apr 28 07:25:34 2020	(r360430)
+++ head/sys/netinet/ip_input.c	Tue Apr 28 08:06:56 2020	(r360431)
@@ -954,6 +954,7 @@ ip_forward(struct mbuf *m, int srcrt)
 	struct sockaddr_in *sin;
 	struct in_addr dest;
 	struct route ro;
+	uint32_t flowid;
 	int error, type = 0, code = 0, mtu = 0;
 
 	NET_EPOCH_ASSERT();
@@ -978,13 +979,11 @@ ip_forward(struct mbuf *m, int srcrt)
 	sin->sin_len = sizeof(*sin);
 	sin->sin_addr = ip->ip_dst;
 #ifdef RADIX_MPATH
-	rtalloc_mpath_fib(&ro,
-	    ntohl(ip->ip_src.s_addr ^ ip->ip_dst.s_addr),
-	    M_GETFIB(m));
+	flowid = ntohl(ip->ip_src.s_addr ^ ip->ip_dst.s_addr);
 #else
-	ro.ro_nh = fib4_lookup(M_GETFIB(m), ip->ip_dst, 0, NHR_REF,
-	    m->m_pkthdr.flowid);
+	flowid = m->m_pkthdr.flowid;
 #endif
+	ro.ro_nh = fib4_lookup(M_GETFIB(m), ip->ip_dst, 0, NHR_REF, flowid);
 	if (ro.ro_nh != NULL) {
 		ia = ifatoia(ro.ro_nh->nh_ifa);
 	} else

Modified: head/sys/netinet/ip_output.c
==============================================================================
--- head/sys/netinet/ip_output.c	Tue Apr 28 07:25:34 2020	(r360430)
+++ head/sys/netinet/ip_output.c	Tue Apr 28 08:06:56 2020	(r360431)
@@ -68,9 +68,6 @@ __FBSDID("$FreeBSD$");
 #include <net/pfil.h>
 #include <net/route.h>
 #include <net/route/nhop.h>
-#ifdef RADIX_MPATH
-#include <net/radix_mpath.h>
-#endif
 #include <net/rss_config.h>
 #include <net/vnet.h>
 
@@ -470,14 +467,15 @@ again:
 			 * layer, as this is probably required in all cases
 			 * for correct operation (as it is for ARP).
 			 */
+			uint32_t flowid;
 #ifdef RADIX_MPATH
-			rtalloc_mpath_fib(ro,
-			    ntohl(ip->ip_src.s_addr ^ ip->ip_dst.s_addr),
-			    fibnum);
+			flowid = ntohl(ip->ip_src.s_addr ^ ip->ip_dst.s_addr);
 #else
-			ro->ro_nh = fib4_lookup(fibnum, dst->sin_addr, 0,
-			    NHR_REF, m->m_pkthdr.flowid);
+			flowid = m->m_pkthdr.flowid;
 #endif
+			ro->ro_nh = fib4_lookup(fibnum, dst->sin_addr, 0,
+			    NHR_REF, flowid);
+
 			if (ro->ro_nh == NULL || (!NH_IS_VALID(ro->ro_nh)) ||
 			    !RT_LINK_IS_UP(ro->ro_nh->nh_ifp)) {
 #if defined(IPSEC) || defined(IPSEC_SUPPORT)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202004280806.03S86vQC087708>