svn commit: r362487 - in head/sys/dev/cxgbe: iw_cxgbe tom

Alexander V. Chernikov melifaro at FreeBSD.org
Mon Jun 22 07:35:24 UTC 2020


Author: melifaro
Date: Mon Jun 22 07:35:23 2020
New Revision: 362487
URL: https://svnweb.freebsd.org/changeset/base/362487

Log:
  Switch cxgbe interface lookup to use fibX_lookup() from older
   fibX_lookup_nh_ext().
  
  fibX_lookup_nh_ represents pre-epoch generation of fib kpi,
  providing less guarantees over pointer validness and requiring
  on-stack data copying.
  
  Reviewed by:	np
  Differential Revision:	https://reviews.freebsd.org/D24975

Modified:
  head/sys/dev/cxgbe/iw_cxgbe/cm.c
  head/sys/dev/cxgbe/tom/t4_listen.c

Modified: head/sys/dev/cxgbe/iw_cxgbe/cm.c
==============================================================================
--- head/sys/dev/cxgbe/iw_cxgbe/cm.c	Mon Jun 22 07:00:26 2020	(r362486)
+++ head/sys/dev/cxgbe/iw_cxgbe/cm.c	Mon Jun 22 07:35:23 2020	(r362487)
@@ -45,6 +45,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/taskqueue.h>
 #include <netinet/in.h>
 #include <net/route.h>
+#include <net/route/nhop.h>
 
 #include <netinet/in_systm.h>
 #include <netinet/in_pcb.h>
@@ -537,32 +538,29 @@ static int
 get_ifnet_from_raddr(struct sockaddr_storage *raddr, struct ifnet **ifp)
 {
 	int err = 0;
+	struct nhop_object *nh;
 
 	if (raddr->ss_family == AF_INET) {
 		struct sockaddr_in *raddr4 = (struct sockaddr_in *)raddr;
-		struct nhop4_extended nh4 = {0};
 
-		err = fib4_lookup_nh_ext(RT_DEFAULT_FIB, raddr4->sin_addr,
-				NHR_REF, 0, &nh4);
-		*ifp = nh4.nh_ifp;
-		if (err)
-			fib4_free_nh_ext(RT_DEFAULT_FIB, &nh4);
+		nh = fib4_lookup(RT_DEFAULT_FIB, raddr4->sin_addr, 0,
+				NHR_NONE, 0);
 	} else {
 		struct sockaddr_in6 *raddr6 = (struct sockaddr_in6 *)raddr;
-		struct nhop6_extended nh6 = {0};
 		struct in6_addr addr6;
 		uint32_t scopeid;
 
 		memset(&addr6, 0, sizeof(addr6));
 		in6_splitscope((struct in6_addr *)&raddr6->sin6_addr,
 					&addr6, &scopeid);
-		err = fib6_lookup_nh_ext(RT_DEFAULT_FIB, &addr6, scopeid,
-				NHR_REF, 0, &nh6);
-		*ifp = nh6.nh_ifp;
-		if (err)
-			fib6_free_nh_ext(RT_DEFAULT_FIB, &nh6);
+		nh = fib6_lookup(RT_DEFAULT_FIB, &addr6, scopeid,
+				NHR_NONE, 0);
 	}
 
+	if (nh == NULL)
+		err = EHOSTUNREACH;
+	else
+		*ifp = nh->nh_ifp;
 	CTR2(KTR_IW_CXGBE, "%s: return: %d", __func__, err);
 	return err;
 }
@@ -2589,6 +2587,7 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_
 	struct c4iw_dev *dev = to_c4iw_dev(cm_id->device);
 	struct c4iw_ep *ep = NULL;
 	struct ifnet    *nh_ifp;        /* Logical egress interface */
+	struct epoch_tracker et;
 #ifdef VIMAGE
 	struct rdma_cm_id *rdma_id = (struct rdma_cm_id*)cm_id->context;
 	struct vnet *vnet = rdma_id->route.addr.dev_addr.net;
@@ -2639,9 +2638,11 @@ int c4iw_connect(struct iw_cm_id *cm_id, struct iw_cm_
 	ref_qp(ep);
 	ep->com.thread = curthread;
 
+	NET_EPOCH_ENTER(et);
 	CURVNET_SET(vnet);
 	err = get_ifnet_from_raddr(&cm_id->remote_addr, &nh_ifp);
 	CURVNET_RESTORE();
+	NET_EPOCH_EXIT(et);
 
 	if (err) {
 

Modified: head/sys/dev/cxgbe/tom/t4_listen.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_listen.c	Mon Jun 22 07:00:26 2020	(r362486)
+++ head/sys/dev/cxgbe/tom/t4_listen.c	Mon Jun 22 07:35:23 2020	(r362487)
@@ -51,6 +51,7 @@ __FBSDID("$FreeBSD$");
 #include <net/if_types.h>
 #include <net/if_vlan_var.h>
 #include <net/route.h>
+#include <net/route/nhop.h>
 #include <netinet/in.h>
 #include <netinet/in_fib.h>
 #include <netinet/in_pcb.h>
@@ -1052,10 +1053,9 @@ get_l2te_for_nexthop(struct port_info *pi, struct ifne
 	struct l2t_entry *e;
 	struct sockaddr_in6 sin6;
 	struct sockaddr *dst = (void *)&sin6;
+	struct nhop_object *nh;
 
 	if (inc->inc_flags & INC_ISIPV6) {
-		struct nhop6_basic nh6;
-
 		bzero(dst, sizeof(struct sockaddr_in6));
 		dst->sa_len = sizeof(struct sockaddr_in6);
 		dst->sa_family = AF_INET6;
@@ -1066,24 +1066,28 @@ get_l2te_for_nexthop(struct port_info *pi, struct ifne
 			return (e);
 		}
 
-		if (fib6_lookup_nh_basic(RT_DEFAULT_FIB, &inc->inc6_faddr,
-		    0, 0, 0, &nh6) != 0)
+		nh = fib6_lookup(RT_DEFAULT_FIB, &inc->inc6_faddr, 0, NHR_NONE, 0);
+		if (nh == NULL)
 			return (NULL);
-		if (nh6.nh_ifp != ifp)
+		if (nh->nh_ifp != ifp)
 			return (NULL);
-		((struct sockaddr_in6 *)dst)->sin6_addr = nh6.nh_addr;
+		if (nh->nh_flags & NHF_GATEWAY)
+			((struct sockaddr_in6 *)dst)->sin6_addr = nh->gw6_sa.sin6_addr;
+		else
+			((struct sockaddr_in6 *)dst)->sin6_addr = inc->inc6_faddr;
 	} else {
-		struct nhop4_basic nh4;
-
 		dst->sa_len = sizeof(struct sockaddr_in);
 		dst->sa_family = AF_INET;
 
-		if (fib4_lookup_nh_basic(RT_DEFAULT_FIB, inc->inc_faddr, 0, 0,
-		    &nh4) != 0)
+		nh = fib4_lookup(RT_DEFAULT_FIB, inc->inc_faddr, 0, NHR_NONE, 0);
+		if (nh == NULL)
 			return (NULL);
-		if (nh4.nh_ifp != ifp)
+		if (nh->nh_ifp != ifp)
 			return (NULL);
-		((struct sockaddr_in *)dst)->sin_addr = nh4.nh_addr;
+		if (nh->nh_flags & NHF_GATEWAY)
+			((struct sockaddr_in *)dst)->sin_addr = nh->gw4_sa.sin_addr;
+		else
+			((struct sockaddr_in *)dst)->sin_addr = inc->inc_faddr;
 	}
 
 	e = t4_l2t_get(pi, ifp, dst);


More information about the svn-src-head mailing list