net/mana: add vlan tagging support
PATCH v2 1/1 net/mana: add vlan tagging support
For tx path, use LONG_PACKET_FORMAT if vlan tag is present. For rx, extract vlan id from oob, put into mbuf and set the vlan flags in mbuf.
Signed-off-by Wei Hu <[email protected]>
---
v2:
- Use existing vlan tag processing macros.
- Add vlan header back if vlan_strip flag is not set on the receiving path.
drivers/net/mana/mana.c | 3 +++ drivers/net/mana/mana.h | 4 ++++ drivers/net/mana/rx.c | 15 +++++++++++++++ drivers/net/mana/tx.c | 21 ++++++++++++++++++--- 4 files changed, 40 insertions(+), 3 deletions(-)
drivers/net/mana/mana.c +3 -0
@@ -94,6 +94,9 @@ mana_dev_configure(struct rte_eth_dev *dev)return -EINVAL ; } + priv->vlan_strip = !!(dev_conf->rxmode.offloads & +RTE_ETH_RX_OFFLOAD_VLAN_STRIP ); + priv->num_queues = dev->data->nb_rx_queues; manadv_set_context_attr(priv->ib_ctx, MANADV_CTX_ATTR_BUF_ALLOCATORS,
drivers/net/mana/mana.h +4 -0
@@ -21,10 +21,12 @@ struct mana_shared_data {#define MANA_MAX_MAC_ADDR 1#define MANA_DEV_RX_OFFLOAD_SUPPORT ( \ + RTE_ETH_RX_OFFLOAD_VLAN_STRIP | \ RTE_ETH_RX_OFFLOAD_CHECKSUM | \ RTE_ETH_RX_OFFLOAD_RSS_HASH)#define MANA_DEV_TX_OFFLOAD_SUPPORT ( \ + RTE_ETH_TX_OFFLOAD_VLAN_INSERT | \ RTE_ETH_TX_OFFLOAD_MULTI_SEGS | \ RTE_ETH_TX_OFFLOAD_IPV4_CKSUM | \ RTE_ETH_TX_OFFLOAD_TCP_CKSUM | \
@@ -345,6 +347,8 @@ struct mana_priv {/* IB device port */ uint8_t dev_port; +uint8_t vlan_strip; +struct ibv_context *ib_ctx;struct ibv_pd *ib_pd;struct ibv_pd *ib_parent_pd;
drivers/net/mana/rx.c +15 -0
@@ -532,6 +532,21 @@ mana_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) mbuf->hash.rss = oob->packet_info[pkt_idx].packet_hash; } +if (oob->rx_vlan_tag_present) { + mbuf->ol_flags |= +RTE_MBUF_F_RX_VLAN |RTE_MBUF_F_RX_VLAN_STRIPPED ; + mbuf->vlan_tci = oob->rx_vlan_id; + +if (!priv->vlan_strip &&rte_vlan_insert (&mbuf)) { +DRV_LOG (ERR ,"vlan insert failed" ); + rxq->stats.errors++; +rte_pktmbuf_free (mbuf); + + i++; + goto drop; + } + } + pkts[pkt_received++] = mbuf; rxq->stats.packets++; rxq->stats.bytes += mbuf->data_len;
drivers/net/mana/tx.c +18 -3
@@ -254,7 +254,18 @@ mana_tx_burst(void *dpdk_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) }/* Fill in the oob */ - tx_oob.short_oob.packet_format =SHORT_PACKET_FORMAT ; +if (m_pkt->ol_flags &RTE_MBUF_F_TX_VLAN ) { + tx_oob.short_oob.packet_format =LONG_PACKET_FORMAT ; + tx_oob.long_oob.inject_vlan_prior_tag =1 ; + tx_oob.long_oob.priority_code_point = +RTE_VLAN_TCI_PRI (m_pkt->vlan_tci); + tx_oob.long_oob.drop_eligible_indicator = +RTE_VLAN_TCI_DEI (m_pkt->vlan_tci); + tx_oob.long_oob.vlan_identifier = +RTE_VLAN_TCI_ID (m_pkt->vlan_tci); + }else { + tx_oob.short_oob.packet_format =SHORT_PACKET_FORMAT ; + } tx_oob.short_oob.tx_is_outer_ipv4 = m_pkt->ol_flags &RTE_MBUF_F_TX_IPV4 ?1 :0 ; tx_oob.short_oob.tx_is_outer_ipv6 =
@@ -409,8 +420,12 @@ mana_tx_burst(void *dpdk_txq, struct rte_mbuf **tx_pkts, uint16_t nb_pkts) work_req.sgl = sgl.gdma_sgl; work_req.num_sgl_elements = m_pkt->nb_segs; - work_req.inline_oob_size_in_bytes = -sizeof (struct transmit_short_oob_v2 ); +if (tx_oob.short_oob.packet_format ==SHORT_PACKET_FORMAT ) + work_req.inline_oob_size_in_bytes = +sizeof (struct transmit_short_oob_v2 ); +else + work_req.inline_oob_size_in_bytes = +sizeof (struct transmit_oob_v2 ); work_req.inline_oob_data = &tx_oob; work_req.flags =0 ; work_req.client_data_unit =NOT_USING_CLIENT_DATA_UNIT ;
Signature · 1 line
2.34.1
Quoted 11 lines
drivers/net/mana/rx.c +3
-0@@ -532,6 +532,21 @@ mana_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n) mbuf->hash.rss = oob- >packet_info[pkt_idx].packet_hash; } +if (oob->rx_vlan_tag_present) { + mbuf->ol_flags |= + RTE_MBUF_F_RX_VLAN |
drivers/net/mana/rx.c mana_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, · line 549
Quoted 10 lines
drivers/net/mana/rx.c +9
-0RTE_MBUF_F_RX_VLAN_STRIPPED ; + mbuf->vlan_tci = oob->rx_vlan_id; + +if (!priv->vlan_strip &&rte_vlan_insert (&mbuf)) { +DRV_LOG (ERR ,"vlan insert failed" ); + rxq->stats.errors++; +rte_pktmbuf_free (mbuf); + + i++; + goto drop;
This is not correct. On CQE_RX_COALESCED_4, there may be up to 4 packets in a CQE. Need to update pkt_idx on vlan error.
Thanks,
Long