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
This commit is contained in:
parent
a56bea78dd
commit
de3a576222
@ -326,7 +326,7 @@ t4_connect(struct toedev *tod, struct socket *so, struct rtentry *rt,
|
||||
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, struct rtentry *rt,
|
||||
|
||||
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);
|
||||
|
@ -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);
|
||||
|
@ -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 *inp, int *pktlen,
|
||||
ipv6 = inp->inp_vflag & INP_IPV6;
|
||||
len = 0;
|
||||
|
||||
if (vtag == 0xffff) {
|
||||
if (EVL_VLANOFTAG(vtag) == 0xfff) {
|
||||
struct ether_header *eh = (void *)pkt;
|
||||
|
||||
if (ipv6)
|
||||
|
@ -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, struct sockaddr *sa)
|
||||
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, struct sockaddr *sa)
|
||||
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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user