net/mlx5: support TOS and TTL fields on E-Switch
[dpdk.git] / drivers / net / thunderx / nicvf_rxtx.c
index 4980dab..1c42874 100644 (file)
@@ -61,6 +61,14 @@ fill_sq_desc_header(union sq_entry_t *entry, struct rte_mbuf *pkt)
        entry->buff[0] = sqe.buff[0];
 }
 
+static inline void __hot
+fill_sq_desc_header_zero_w1(union sq_entry_t *entry,
+                               struct rte_mbuf *pkt)
+{
+       fill_sq_desc_header(entry, pkt);
+       entry->buff[1] = 0ULL;
+}
+
 void __hot
 nicvf_single_pool_free_xmited_buffers(struct nicvf_txq *sq)
 {
@@ -204,7 +212,7 @@ nicvf_xmit_pkts_multiseg(void *tx_queue, struct rte_mbuf **tx_pkts,
                used_bufs += nb_segs;
 
                txbuffs[tail] = NULL;
-               fill_sq_desc_header(desc_ptr + tail, pkt);
+               fill_sq_desc_header_zero_w1(desc_ptr + tail, pkt);
                tail = (tail + 1) & qlen_mask;
 
                txbuffs[tail] = pkt;
@@ -445,6 +453,14 @@ nicvf_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts,
                        pkt->ol_flags = 0;
                if (flag & NICVF_RX_OFFLOAD_CKSUM)
                        pkt->ol_flags = nicvf_set_olflags(cqe_rx_w0);
+               if (flag & NICVF_RX_OFFLOAD_VLAN_STRIP) {
+                       if (unlikely(cqe_rx_w0.vlan_stripped)) {
+                               pkt->ol_flags |= PKT_RX_VLAN
+                                                       | PKT_RX_VLAN_STRIPPED;
+                               pkt->vlan_tci =
+                                       rte_cpu_to_be_16(cqe_rx_w2.vlan_tci);
+                       }
+               }
                pkt->data_len = cqe_rx_w3.rb0_sz;
                pkt->pkt_len = cqe_rx_w3.rb0_sz;
                pkt->packet_type = nicvf_rx_classify_pkt(cqe_rx_w0);
@@ -485,6 +501,22 @@ nicvf_recv_pkts_cksum(void *rx_queue, struct rte_mbuf **rx_pkts,
                        NICVF_RX_OFFLOAD_CKSUM);
 }
 
+uint16_t __hot
+nicvf_recv_pkts_vlan_strip(void *rx_queue, struct rte_mbuf **rx_pkts,
+               uint16_t nb_pkts)
+{
+       return nicvf_recv_pkts(rx_queue, rx_pkts, nb_pkts,
+                       NICVF_RX_OFFLOAD_NONE | NICVF_RX_OFFLOAD_VLAN_STRIP);
+}
+
+uint16_t __hot
+nicvf_recv_pkts_cksum_vlan_strip(void *rx_queue, struct rte_mbuf **rx_pkts,
+               uint16_t nb_pkts)
+{
+       return nicvf_recv_pkts(rx_queue, rx_pkts, nb_pkts,
+                       NICVF_RX_OFFLOAD_CKSUM | NICVF_RX_OFFLOAD_VLAN_STRIP);
+}
+
 static __rte_always_inline uint16_t __hot
 nicvf_process_cq_mseg_entry(struct cqe_rx_t *cqe_rx,
                        uint64_t mbuf_phys_off,
@@ -516,6 +548,13 @@ nicvf_process_cq_mseg_entry(struct cqe_rx_t *cqe_rx,
                pkt->ol_flags = 0;
        if (flag & NICVF_RX_OFFLOAD_CKSUM)
                pkt->ol_flags = nicvf_set_olflags(cqe_rx_w0);
+       if (flag & NICVF_RX_OFFLOAD_VLAN_STRIP) {
+               if (unlikely(cqe_rx_w0.vlan_stripped)) {
+                       pkt->ol_flags |= PKT_RX_VLAN
+                               | PKT_RX_VLAN_STRIPPED;
+                       pkt->vlan_tci = rte_cpu_to_be_16(cqe_rx_w2.vlan_tci);
+               }
+       }
        nicvf_rx_offload(cqe_rx_w0, cqe_rx_w2, pkt);
 
        *rx_pkt = pkt;
@@ -594,6 +633,22 @@ nicvf_recv_pkts_multiseg_cksum(void *rx_queue, struct rte_mbuf **rx_pkts,
                        NICVF_RX_OFFLOAD_CKSUM);
 }
 
+uint16_t __hot
+nicvf_recv_pkts_multiseg_vlan_strip(void *rx_queue, struct rte_mbuf **rx_pkts,
+               uint16_t nb_pkts)
+{
+       return nicvf_recv_pkts_multiseg(rx_queue, rx_pkts, nb_pkts,
+                       NICVF_RX_OFFLOAD_NONE | NICVF_RX_OFFLOAD_VLAN_STRIP);
+}
+
+uint16_t __hot
+nicvf_recv_pkts_multiseg_cksum_vlan_strip(void *rx_queue,
+               struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
+{
+       return nicvf_recv_pkts_multiseg(rx_queue, rx_pkts, nb_pkts,
+                       NICVF_RX_OFFLOAD_CKSUM | NICVF_RX_OFFLOAD_VLAN_STRIP);
+}
+
 uint32_t
 nicvf_dev_rx_queue_count(struct rte_eth_dev *dev, uint16_t queue_idx)
 {