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
This commit is contained in:
Alexander V. Chernikov 2020-06-22 07:35:23 +00:00
parent a19aa4f704
commit b158cfb3fc
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=362487
2 changed files with 29 additions and 24 deletions

View File

@ -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_conn_param *conn_param)
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_conn_param *conn_param)
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) {

View File

@ -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 ifnet *ifp,
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 ifnet *ifp,
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);