Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Aug 2018 19:22:46 +0000 (UTC)
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r337986 - head/sys/dev/cxgbe/tom
Message-ID:  <201808171922.w7HJMkTZ012915@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: np
Date: Fri Aug 17 19:22:46 2018
New Revision: 337986
URL: https://svnweb.freebsd.org/changeset/base/337986

Log:
  cxgbe/tom: Put the ifnet or VLAN's PCP value in the 802.1Q tag of frames
  generated by the TOE.  Works with vid 0 (no VLAN, just priority) too.
  
  MFC after:	1 week
  Sponsored by:	Chelsio Communications

Modified:
  head/sys/dev/cxgbe/tom/t4_connect.c
  head/sys/dev/cxgbe/tom/t4_listen.c
  head/sys/dev/cxgbe/tom/t4_tom.c
  head/sys/dev/cxgbe/tom/t4_tom_l2t.c

Modified: head/sys/dev/cxgbe/tom/t4_connect.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_connect.c	Fri Aug 17 19:18:59 2018	(r337985)
+++ head/sys/dev/cxgbe/tom/t4_connect.c	Fri Aug 17 19:22:46 2018	(r337986)
@@ -326,7 +326,7 @@ t4_connect(struct toedev *tod, struct socket *so, stru
 	struct tcpcb *tp = intotcpcb(inp);
 	int reason;
 	struct offload_settings settings;
-	uint16_t vid = 0xffff;
+	uint16_t vid = 0xfff, pcp = 0;
 
 	INP_WLOCK_ASSERT(inp);
 	KASSERT(nam->sa_family == AF_INET || nam->sa_family == AF_INET6,
@@ -339,13 +339,15 @@ t4_connect(struct toedev *tod, struct socket *so, stru
 
 		vi = ifp->if_softc;
 		VLAN_TAG(rt_ifp, &vid);
+		VLAN_PCP(rt_ifp, &pcp);
 	} else if (rt_ifp->if_type == IFT_IEEE8023ADLAG)
 		DONT_OFFLOAD_ACTIVE_OPEN(ENOSYS); /* XXX: implement lagg+TOE */
 	else
 		DONT_OFFLOAD_ACTIVE_OPEN(ENOTSUP);
 
 	rw_rlock(&sc->policy_lock);
-	settings = *lookup_offload_policy(sc, OPEN_TYPE_ACTIVE, NULL, vid, inp);
+	settings = *lookup_offload_policy(sc, OPEN_TYPE_ACTIVE, NULL,
+	    EVL_MAKETAG(vid, pcp, 0), inp);
 	rw_runlock(&sc->policy_lock);
 	if (!settings.offload)
 		DONT_OFFLOAD_ACTIVE_OPEN(EPERM);

Modified: head/sys/dev/cxgbe/tom/t4_listen.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_listen.c	Fri Aug 17 19:18:59 2018	(r337985)
+++ head/sys/dev/cxgbe/tom/t4_listen.c	Fri Aug 17 19:22:46 2018	(r337986)
@@ -521,8 +521,8 @@ t4_listen_start(struct toedev *tod, struct tcpcb *tp)
 	INP_WLOCK_ASSERT(inp);
 
 	rw_rlock(&sc->policy_lock);
-	settings = *lookup_offload_policy(sc, OPEN_TYPE_LISTEN, NULL, 0xffff,
-	    inp);
+	settings = *lookup_offload_policy(sc, OPEN_TYPE_LISTEN, NULL,
+	    EVL_MAKETAG(0xfff, 0, 0), inp);
 	rw_runlock(&sc->policy_lock);
 	if (!settings.offload)
 		return (0);
@@ -1305,7 +1305,7 @@ found:
 	 * XXX: lagg support, lagg + vlan support.
 	 */
 	vid = EVL_VLANOFTAG(be16toh(cpl->vlan));
-	if (vid != 0xfff) {
+	if (vid != 0xfff && vid != 0) {
 		ifp = VLAN_DEVAT(hw_ifp, vid);
 		if (ifp == NULL)
 			REJECT_PASS_ACCEPT();
@@ -1396,7 +1396,8 @@ found:
 	}
 	so = inp->inp_socket;
 	rw_rlock(&sc->policy_lock);
-	settings = *lookup_offload_policy(sc, OPEN_TYPE_PASSIVE, m, 0xffff, inp);
+	settings = *lookup_offload_policy(sc, OPEN_TYPE_PASSIVE, m,
+	    EVL_MAKETAG(0xfff, 0, 0), inp);
 	rw_runlock(&sc->policy_lock);
 	if (!settings.offload) {
 		INP_WUNLOCK(inp);

Modified: head/sys/dev/cxgbe/tom/t4_tom.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_tom.c	Fri Aug 17 19:18:59 2018	(r337985)
+++ head/sys/dev/cxgbe/tom/t4_tom.c	Fri Aug 17 19:22:46 2018	(r337986)
@@ -649,7 +649,7 @@ select_ntuple(struct vi_info *vi, struct l2t_entry *e)
 	 * Initialize each of the fields which we care about which are present
 	 * in the Compressed Filter Tuple.
 	 */
-	if (tp->vlan_shift >= 0 && e->vlan != CPL_L2T_VLAN_NONE)
+	if (tp->vlan_shift >= 0 && EVL_VLANOFTAG(e->vlan) != CPL_L2T_VLAN_NONE)
 		ntuple |= (uint64_t)(F_FT_VLAN_VLD | e->vlan) << tp->vlan_shift;
 
 	if (tp->port_shift >= 0)
@@ -1130,7 +1130,7 @@ prepare_pkt(int open_type, uint16_t vtag, struct inpcb
 	ipv6 = inp->inp_vflag & INP_IPV6;
 	len = 0;
 
-	if (vtag == 0xffff) {
+	if (EVL_VLANOFTAG(vtag) == 0xfff) {
 		struct ether_header *eh = (void *)pkt;
 
 		if (ipv6)

Modified: head/sys/dev/cxgbe/tom/t4_tom_l2t.c
==============================================================================
--- head/sys/dev/cxgbe/tom/t4_tom_l2t.c	Fri Aug 17 19:18:59 2018	(r337985)
+++ head/sys/dev/cxgbe/tom/t4_tom_l2t.c	Fri Aug 17 19:22:46 2018	(r337986)
@@ -236,7 +236,7 @@ resolve_entry(struct adapter *sc, struct l2t_entry *e)
 	struct sockaddr_in6 sin6 = {0};
 	struct sockaddr *sa;
 	uint8_t dmac[ETHER_HDR_LEN];
-	uint16_t vtag = VLAN_NONE;
+	uint16_t vtag;
 	int rc;
 
 	if (e->ipv6 == 0) {
@@ -251,6 +251,7 @@ resolve_entry(struct adapter *sc, struct l2t_entry *e)
 		sa = (void *)&sin6;
 	}
 
+	vtag = EVL_MAKETAG(VLAN_NONE, 0, 0);
 	rc = toe_l2_resolve(tod, e->ifp, sa, dmac, &vtag);
 	if (rc == EWOULDBLOCK)
 		return (rc);
@@ -355,20 +356,27 @@ t4_l2t_get(struct port_info *pi, struct ifnet *ifp, st
 	struct adapter *sc = pi->adapter;
 	struct l2t_data *d = sc->l2t;
 	u_int hash, smt_idx = pi->port_id;
+	uint16_t vid, pcp, vtag;
 
 	KASSERT(sa->sa_family == AF_INET || sa->sa_family == AF_INET6,
 	    ("%s: sa %p has unexpected sa_family %d", __func__, sa,
 	    sa->sa_family));
 
-#ifndef VLAN_TAG
-	if (ifp->if_type == IFT_L2VLAN)
-		return (NULL);
-#endif
+	vid = VLAN_NONE;
+	pcp = 0;
+	if (ifp->if_type == IFT_L2VLAN) {
+		VLAN_TAG(ifp, &vid);
+		VLAN_PCP(ifp, &pcp);
+	} else if (ifp->if_pcp != IFNET_PCP_NONE) {
+		vid = 0;
+		pcp = ifp->if_pcp;
+	}
+	vtag = EVL_MAKETAG(vid, pcp, 0);
 
 	hash = l2_hash(d, sa, ifp->if_index);
 	rw_wlock(&d->lock);
 	for (e = d->l2tab[hash].first; e; e = e->next) {
-		if (l2_cmp(sa, e) == 0 && e->ifp == ifp &&
+		if (l2_cmp(sa, e) == 0 && e->ifp == ifp && e->vlan == vtag &&
 		    e->smt_idx == smt_idx) {
 			l2t_hold(d, e);
 			goto done;
@@ -391,12 +399,7 @@ t4_l2t_get(struct port_info *pi, struct ifnet *ifp, st
 		e->wrq = &sc->sge.ctrlq[pi->port_id];
 		e->iqid = sc->sge.ofld_rxq[pi->vi[0].first_ofld_rxq].iq.abs_id;
 		atomic_store_rel_int(&e->refcnt, 1);
-#ifdef VLAN_TAG
-		if (ifp->if_type == IFT_L2VLAN)
-			VLAN_TAG(ifp, &e->vlan);
-		else
-			e->vlan = VLAN_NONE;
-#endif
+		e->vlan = vtag;
 		mtx_unlock(&e->lock);
 	}
 done:



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