add support geneve inner/outer chksum, and tso offload,<br />support tunnel packet rx_offload outer_udp chksum.<br /> <br />Signed-off-by: Junlong Wang <wang.junlong1@zte.com.cn> <br />---<br /> drivers/net/zxdh/zxdh_ethdev.c |  23 +++++--<br /> drivers/net/zxdh/zxdh_msg.c    |   3 +<br /> drivers/net/zxdh/zxdh_rxtx.c   | 115 +++++++++++++++++++++++++--------<br /> drivers/net/zxdh/zxdh_tables.h |  12 ++--<br /> 4 files changed, 118 insertions(+), 35 deletions(-)<br /> <br />diff --git a/drivers/net/zxdh/zxdh_ethdev.c b/drivers/net/zxdh/zxdh_ethdev.c<br />index cd29162070..7e67983ec2 100644<br />--- a/drivers/net/zxdh/zxdh_ethdev.c<br />+++ b/drivers/net/zxdh/zxdh_ethdev.c<br />@@ -61,7 +61,8 @@ zxdh_dev_infos_get(struct rte_eth_dev *dev,<br />     dev_info->rx_offload_capa |= (RTE_ETH_RX_OFFLOAD_IPV4_CKSUM |<br />                     RTE_ETH_RX_OFFLOAD_UDP_CKSUM |<br />                     RTE_ETH_RX_OFFLOAD_TCP_CKSUM |<br />-                    RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM);<br />+                    RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM |<br />+                    RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM);<br />     dev_info->rx_offload_capa |= (RTE_ETH_RX_OFFLOAD_SCATTER);<br />     dev_info->rx_offload_capa |=  RTE_ETH_RX_OFFLOAD_TCP_LRO;<br />     dev_info->rx_offload_capa |=  RTE_ETH_RX_OFFLOAD_RSS_HASH;<br />@@ -75,15 +76,15 @@ zxdh_dev_infos_get(struct rte_eth_dev *dev,<br />  <br />     dev_info->tx_offload_capa = (RTE_ETH_TX_OFFLOAD_MULTI_SEGS);<br />     dev_info->tx_offload_capa |= (RTE_ETH_TX_OFFLOAD_TCP_TSO |<br />-                    RTE_ETH_TX_OFFLOAD_UDP_TSO);<br />+                    RTE_ETH_TX_OFFLOAD_UDP_TSO |<br />+                    RTE_ETH_TX_OFFLOAD_GENEVE_TNL_TSO);<br />     dev_info->tx_offload_capa |= (RTE_ETH_TX_OFFLOAD_VLAN_INSERT |<br />                     RTE_ETH_TX_OFFLOAD_QINQ_INSERT |<br />                     RTE_ETH_TX_OFFLOAD_VXLAN_TNL_TSO);<br />     dev_info->tx_offload_capa |= (RTE_ETH_TX_OFFLOAD_IPV4_CKSUM |<br />                     RTE_ETH_TX_OFFLOAD_UDP_CKSUM |<br />                     RTE_ETH_TX_OFFLOAD_TCP_CKSUM |<br />-                    RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM |<br />-                    RTE_ETH_TX_OFFLOAD_OUTER_UDP_CKSUM);<br />+                    RTE_ETH_TX_OFFLOAD_OUTER_IPV4_CKSUM);<br />  <br />     return 0;<br /> }<br />@@ -903,6 +904,7 @@ zxdh_rx_csum_lro_offload_configure(struct rte_eth_dev *dev)<br />     uint32_t need_accelerator = rxmode->offloads & (RTE_ETH_RX_OFFLOAD_OUTER_IPV4_CKSUM |<br />         RTE_ETH_RX_OFFLOAD_IPV4_CKSUM |<br />         RTE_ETH_RX_OFFLOAD_UDP_CKSUM |<br />+        RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM |<br />         RTE_ETH_RX_OFFLOAD_TCP_CKSUM |<br />         RTE_ETH_RX_OFFLOAD_TCP_LRO);<br />     int ret;<br />@@ -917,6 +919,8 @@ zxdh_rx_csum_lro_offload_configure(struct rte_eth_dev *dev)<br />         port_attr.tcp_udp_checksum_offload  =<br />         (rxmode->offloads & (RTE_ETH_RX_OFFLOAD_UDP_CKSUM | RTE_ETH_RX_OFFLOAD_TCP_CKSUM))<br />                     ? true : false;<br />+        port_attr.outer_udp_checksum_offload =<br />+            (rxmode->offloads & RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM) ? true : false;<br />         port_attr.lro_offload =<br />                 (rxmode->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO) ? true : false;<br />         port_attr.accelerator_offload_flag  = need_accelerator ? true : false;<br />@@ -959,6 +963,17 @@ zxdh_rx_csum_lro_offload_configure(struct rte_eth_dev *dev)<br />             return -1;<br />         }<br />  <br />+        zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);<br />+        attr_msg->mode = ZXDH_PORT_OUTER_UDP_CHECKSUM_OFFLOAD_FLAG;<br />+        attr_msg->value =<br />+            (rxmode->offloads & RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM) ? true : false;<br />+        ret = zxdh_vf_send_msg_to_pf(dev, &msg_info, sizeof(msg_info), NULL, 0);<br />+        if (ret) {<br />+            PMD_DRV_LOG(ERR,<br />+                "%s outer_udp_checksum offload failed to send msg", __func__);<br />+            return ret;<br />+        }<br />+<br />         zxdh_msg_head_build(hw, ZXDH_PORT_ATTRS_SET, &msg_info);<br />         attr_msg->mode = ZXDH_PORT_LRO_OFFLOAD_FLAG;<br />         attr_msg->value = (rxmode->offloads & RTE_ETH_RX_OFFLOAD_TCP_LRO) ? true : false;<br />diff --git a/drivers/net/zxdh/zxdh_msg.c b/drivers/net/zxdh/zxdh_msg.c<br />index ff2d11706c..a61e5f865c 100644<br />--- a/drivers/net/zxdh/zxdh_msg.c<br />+++ b/drivers/net/zxdh/zxdh_msg.c<br />@@ -1829,6 +1829,9 @@ zxdh_vf_port_attr_set(struct zxdh_hw *pf_hw, uint16_t vport,<br />     case ZXDH_PORT_TCP_UDP_CHKSUM_FLAG:<br />         port_attr.tcp_udp_checksum_offload = attr_msg->value;<br />         break;<br />+    case ZXDH_PORT_OUTER_UDP_CHECKSUM_OFFLOAD_FLAG:<br />+        port_attr.outer_udp_checksum_offload = attr_msg->value;<br />+        break;<br />     case ZXDH_PORT_ACCELERATOR_OFFLOAD_FLAG_FLAG:<br />         port_attr.accelerator_offload_flag = attr_msg->value;<br />         break;<br />diff --git a/drivers/net/zxdh/zxdh_rxtx.c b/drivers/net/zxdh/zxdh_rxtx.c<br />index 3ccef8fd0b..3af0db473a 100644<br />--- a/drivers/net/zxdh/zxdh_rxtx.c<br />+++ b/drivers/net/zxdh/zxdh_rxtx.c<br />@@ -41,7 +41,7 @@<br /> #define ZXDH_PCODE_NO_REASSMBLE_TCP_PKT_TYPE  0x0C<br />  <br /> /* Uplink pd header byte0~1 */<br />-#define ZXDH_MBUF_F_RX_OUTER_L4_CKSUM_GOOD               0x00080000<br />+#define ZXDH_MBUF_F_RX_OUTER_L4_CKSUM_BAD                0x00080000<br /> #define ZXDH_MBUF_F_RX_QINQ                              0x00100000<br /> #define ZXDH_MBUF_F_RX_SEC_OFFLOAD                       0x00200000<br /> #define ZXDH_MBUF_F_RX_QINQ_STRIPPED                     0x00400000<br />@@ -55,6 +55,8 @@<br /> #define ZXDH_MBUF_F_RX_OUTER_IP_CKSUM_BAD                0x20000000<br /> #define ZXDH_MBUF_F_RX_FDIR                              0x40000000<br /> #define ZXDH_MBUF_F_RX_RSS_HASH                          0x80000000<br />+#define ZXDH_MBUF_F_RX_INNER_IP_CKSUM_BAD                0x00020000<br />+#define ZXDH_MBUF_RX_CHECKSUM_BASED_OUTER                0x00010000<br />  <br /> /* Outer/Inner L2 type */<br /> #define ZXDH_PD_L2TYPE_MASK                              0xf000<br />@@ -642,10 +644,69 @@ zxdh_dequeue_burst_rx_packed(struct zxdh_virtqueue *vq,<br /> }<br />  <br /> static inline void<br />-zxdh_rx_update_mbuf(struct rte_mbuf *m, struct zxdh_net_hdr_ul *hdr)<br />+update_outer_rx_l4_csum(struct zxdh_hw *hw, struct zxdh_pi_hdr *pi_hdr,<br />+        struct zxdh_pd_hdr_ul *pd_hdr, struct rte_mbuf *m)<br />+{<br />+    uint32_t pd_pkt_flag = ntohl(pd_hdr->pkt_flag);<br />+    uint32_t packet_type = 0;<br />+    uint32_t idx = 0;<br />+    bool has_ip_verify = hw->eth_dev->data->dev_conf.rxmode.offloads & <br />+            RTE_ETH_RX_OFFLOAD_IPV4_CKSUM;<br />+    uint16_t pkt_type_in = rte_be_to_cpu_16(pd_hdr->pkt_type_in);<br />+<br />+    // pi_hdr as outer csum and pd_hdr as inner csum<br />+    if ((pd_pkt_flag & ZXDH_MBUF_RX_CHECKSUM_BASED_OUTER)) {<br />+        m->ol_flags &= ~RTE_MBUF_F_RX_L4_CKSUM_MASK;<br />+        m->ol_flags &= ~RTE_MBUF_F_RX_IP_CKSUM_MASK;<br />+<br />+        if (pi_hdr) {<br />+            uint16_t err_code = rte_be_to_cpu_16(pi_hdr->ul.err_code);<br />+            if (pi_hdr->pkt_flag_hi8 & ZXDH_RX_TCPUDP_CKSUM_VERIFY) {<br />+                if (err_code & ZXDH_UDP_CSUM_ERR)<br />+                    m->ol_flags |= RTE_MBUF_F_RX_OUTER_L4_CKSUM_BAD;<br />+                else<br />+                    m->ol_flags |= RTE_MBUF_F_RX_OUTER_L4_CKSUM_GOOD;<br />+            }<br />+<br />+            if (pi_hdr->pkt_flag_hi8 & ZXDH_RX_IP_CKSUM_VERIFY) {<br />+                if (err_code & ZXDH_IPV4_CSUM_ERR)<br />+                    m->ol_flags |= RTE_MBUF_F_RX_OUTER_IP_CKSUM_BAD;<br />+            }<br />+        }<br />+        if (pd_pkt_flag & ZXDH_MBUF_F_RX_INNER_IP_CKSUM_BAD) {<br />+            m->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_BAD;<br />+        } else {<br />+            if (has_ip_verify) {<br />+                idx = (pkt_type_in >> 8)  & 0xF;<br />+                packet_type = zxdh_inner_l3_type[idx];<br />+                if (((packet_type & RTE_PTYPE_INNER_L3_MASK) ==<br />+                        RTE_PTYPE_INNER_L3_IPV4) ||<br />+                ((packet_type & RTE_PTYPE_INNER_L3_MASK) ==<br />+                        RTE_PTYPE_INNER_L3_IPV4_EXT))<br />+                    m->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_GOOD;<br />+            }<br />+        }<br />+<br />+    } else {<br />+        if ((m->ol_flags & RTE_MBUF_F_RX_L4_CKSUM_BAD) ==<br />+                RTE_MBUF_F_RX_L4_CKSUM_BAD)<br />+            m->ol_flags |= RTE_MBUF_F_RX_OUTER_L4_CKSUM_UNKNOWN;<br />+        else if ((m->ol_flags & RTE_MBUF_F_RX_L4_CKSUM_GOOD) ==<br />+                    RTE_MBUF_F_RX_L4_CKSUM_GOOD) {<br />+            if (pd_pkt_flag & ZXDH_MBUF_F_RX_OUTER_L4_CKSUM_BAD)<br />+                m->ol_flags |= RTE_MBUF_F_RX_OUTER_L4_CKSUM_BAD;<br />+            else<br />+                m->ol_flags |= RTE_MBUF_F_RX_OUTER_L4_CKSUM_GOOD;<br />+        }<br />+    }<br />+}<br />+<br />+static inline void<br />+zxdh_rx_update_mbuf(struct zxdh_hw *hw, struct rte_mbuf *m, struct zxdh_net_hdr_ul *hdr)<br /> {<br />     uint8_t has_pi = (uint64_t)(hdr->type_hdr.pd_len << 1) > ZXDH_UL_NOPI_HDR_SIZE_MAX;<br />     struct zxdh_pd_hdr_ul *pd_hdr = has_pi ? &hdr->pipd_hdr_ul.pd_hdr : &hdr->pd_hdr;<br />+    struct zxdh_pi_hdr *pi_hdr = NULL;<br />     uint32_t pkt_flag = ntohl(pd_hdr->pkt_flag);<br />     uint32_t idx = 0;<br />     uint32_t striped_vlan_tci = rte_be_to_cpu_32(pd_hdr->striped_vlan_tci);<br />@@ -704,35 +765,31 @@ zxdh_rx_update_mbuf(struct rte_mbuf *m, struct zxdh_net_hdr_ul *hdr)<br />     /* checksum handle */<br />     if (pkt_flag & ZXDH_MBUF_F_RX_OUTER_IP_CKSUM_BAD)<br />         m->ol_flags |= RTE_MBUF_F_RX_OUTER_IP_CKSUM_BAD;<br />-    if (pkt_flag & ZXDH_MBUF_F_RX_OUTER_L4_CKSUM_GOOD)<br />-        m->ol_flags |= RTE_MBUF_F_RX_OUTER_L4_CKSUM_GOOD;<br />  <br />     if (has_pi) {<br />-        struct zxdh_pi_hdr *pi_hdr = &hdr->pipd_hdr_ul.pi_hdr;<br />-        uint16_t pkt_type_masked = pi_hdr->pkt_type & ZXDH_PCODE_MASK;<br />+        pi_hdr = &hdr->pipd_hdr_ul.pi_hdr;<br />         uint16_t err_code = rte_be_to_cpu_16(pi_hdr->ul.err_code);<br />-<br />-        bool is_ip_pkt =<br />-                (pi_hdr->pkt_type == ZXDH_PCODE_IP_PKT_TYPE) ||<br />-                ((pi_hdr->pkt_type & ZXDH_PI_L3TYPE_MASK) == ZXDH_PI_L3TYPE_IP);<br />-<br />-        bool is_l4_pkt =<br />-                (pkt_type_masked == ZXDH_PCODE_UDP_PKT_TYPE) ||<br />-                (pkt_type_masked == ZXDH_PCODE_NO_REASSMBLE_TCP_PKT_TYPE) ||<br />-                (pkt_type_masked == ZXDH_PCODE_TCP_PKT_TYPE);<br />-<br />-        if (is_ip_pkt && (pi_hdr->pkt_flag_hi8 & ZXDH_RX_IP_CKSUM_VERIFY)) {<br />-            if (err_code & ZXDH_IPV4_CSUM_ERR)<br />-                m->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_BAD;<br />-            else<br />-                m->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_GOOD;<br />+        if (pi_hdr->pkt_type == ZXDH_PCODE_IP_PKT_TYPE ||<br />+            ((pi_hdr->pkt_type & ZXDH_PI_L3TYPE_MASK) == ZXDH_PI_L3TYPE_IP)) {<br />+            if (pi_hdr->pkt_flag_hi8 & ZXDH_RX_IP_CKSUM_VERIFY) {<br />+                if (err_code & ZXDH_IPV4_CSUM_ERR)<br />+                    m->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_BAD;<br />+                else<br />+                    m->ol_flags |= RTE_MBUF_F_RX_IP_CKSUM_GOOD;<br />+            }<br />         }<br />  <br />-        if (is_l4_pkt && (pi_hdr->pkt_flag_hi8 & ZXDH_RX_TCPUDP_CKSUM_VERIFY)) {<br />-            if (err_code & (ZXDH_TCP_CSUM_ERR | ZXDH_UDP_CSUM_ERR))<br />-                m->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_BAD;<br />-            else<br />-                m->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_GOOD;<br />+        if (((pi_hdr->pkt_type & ZXDH_PCODE_MASK) == ZXDH_PCODE_UDP_PKT_TYPE) ||<br />+            ((pi_hdr->pkt_type & ZXDH_PCODE_MASK) ==<br />+                ZXDH_PCODE_NO_REASSMBLE_TCP_PKT_TYPE) ||<br />+            ((pi_hdr->pkt_type & ZXDH_PCODE_MASK) == ZXDH_PCODE_TCP_PKT_TYPE)) {<br />+            if (pi_hdr->pkt_flag_hi8 & ZXDH_RX_TCPUDP_CKSUM_VERIFY) {<br />+                if ((err_code & ZXDH_TCP_CSUM_ERR) ||<br />+                    (err_code & ZXDH_UDP_CSUM_ERR))<br />+                    m->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_BAD;<br />+                else<br />+                    m->ol_flags |= RTE_MBUF_F_RX_L4_CKSUM_GOOD;<br />+            }<br />         }<br />  <br />         if (ntohl(pi_hdr->ul.lro_flag) & ZXDH_PI_LRO_FLAG)<br />@@ -759,6 +816,10 @@ zxdh_rx_update_mbuf(struct rte_mbuf *m, struct zxdh_net_hdr_ul *hdr)<br />         m->packet_type |= zxdh_inner_l3_type[idx];<br />         idx = (pkt_type_inner >> 4)  & 0xF;<br />         m->packet_type |= zxdh_inner_l4_type[idx];<br />+<br />+        if (hw->eth_dev->data->dev_conf.rxmode.offloads & <br />+                RTE_ETH_RX_OFFLOAD_OUTER_UDP_CKSUM)<br />+            update_outer_rx_l4_csum(hw, pi_hdr, pd_hdr, m);<br />     }<br /> }<br />  <br />@@ -833,7 +894,7 @@ zxdh_recv_pkts_packed(void *rx_queue, struct rte_mbuf **rx_pkts,<br />         rxm->port = rxvq->port_id;<br />  <br />         /* Update rte_mbuf according to pi/pd header */<br />-        zxdh_rx_update_mbuf(rxm, header);<br />+        zxdh_rx_update_mbuf(hw, rxm, header);<br />         seg_res = seg_num - 1;<br />         /* Merge remaining segments */<br />         while (seg_res != 0 && i < (num - 1)) {<br />diff --git a/drivers/net/zxdh/zxdh_tables.h b/drivers/net/zxdh/zxdh_tables.h<br />index 8cfc833333..3580f1dfba 100644<br />--- a/drivers/net/zxdh/zxdh_tables.h<br />+++ b/drivers/net/zxdh/zxdh_tables.h<br />@@ -76,6 +76,7 @@<br /> #define ZXDH_PORT_BUSINESS_VLAN_OFFLOAD_EN_FLAG   41<br /> #define ZXDH_PORT_RSS_EN_OFF_FLAG                 42<br /> #define ZXDH_PORT_MTU_OFFLOAD_EN_OFF_FLAG         43<br />+#define ZXDH_PORT_OUTER_UDP_CHECKSUM_OFFLOAD_FLAG 51<br />  <br /> #define ZXDH_MTU_STATS_EGRESS_BASE           0x8481<br /> #define ZXDH_MTU_STATS_INGRESS_BASE          0x8981<br />@@ -182,7 +183,9 @@ struct zxdh_port_attr_table {<br />     uint16_t tpid;<br />  <br />     uint16_t vhca : 10;<br />-    uint16_t rsv16_1 : 6;<br />+    uint16_t rsv16_1 : 2;<br />+    uint16_t outer_udp_checksum_offload : 1;<br />+    uint16_t rsv16_2 : 3;<br /> #else<br />     uint8_t hw_bond_enable : 1;<br />     uint8_t rdma_offload_enable: 1;<br />@@ -235,10 +238,11 @@ struct zxdh_port_attr_table {<br />  <br />     uint8_t rss_hash_factor;<br />  <br />-    uint16_t tpid;<br />-<br />     uint16_t vhca : 10;<br />-    uint16_t rsv16_1 : 6;<br />+    uint16_t rsv16_1 : 2;<br />+    uint16_t outer_udp_checksum_offload : 1;<br />+    uint16_t rsv16_2 : 3;<br />+    uint16_t tpid;<br /> #endif<br /> };<br />  <br />--  <br />2.27.0<br />