Fix packet length handling for reassembly failure cases.
Also updated few macros as per cn20k platform.

Fixes: 5856f23129bb ("net/cnxk: support CN20K inline IPsec Rx")
Cc: [email protected]

Signed-off-by: Rahul Bhansali <[email protected]>
---
 drivers/net/cnxk/cn20k_rx.h | 42 +++++++++++++++++++++----------------
 1 file changed, 24 insertions(+), 18 deletions(-)

diff --git a/drivers/net/cnxk/cn20k_rx.h b/drivers/net/cnxk/cn20k_rx.h
index f8fa6de2b9..0e9d562317 100644
--- a/drivers/net/cnxk/cn20k_rx.h
+++ b/drivers/net/cnxk/cn20k_rx.h
@@ -258,8 +258,7 @@ nix_sec_meta_to_mbuf_sc(uint64_t cq_w5, uint64_t cpth, 
const uint64_t sa_base,
                        *rte_security_dynfield(mbuf) = 
(uint64_t)inb_priv->userdata;
        } else {
                /* Update dynamic field with userdata */
-               if (flags & NIX_RX_REAS_F && inb_priv->userdata)
-                       *rte_security_dynfield(mbuf) = 
(uint64_t)inb_priv->userdata;
+               *rte_security_dynfield(mbuf) = (uint64_t)inb_priv->userdata;
        }
 
        *len = ((w3 >> 48) & 0xFFFF) + ((cq_w5 >> 16) & 0xFF) - (cq_w5 & 0xFF);
@@ -346,16 +345,17 @@ nix_cqe_xtract_mseg(const union nix_rx_parse_u *rx, 
struct rte_mbuf *mbuf, uint6
        uint16_t rlen = hdr->w3.rlen;
        const rte_iova_t *iova_list;
        uint8_t sg_cnt = 1, nb_segs;
+       uint16_t sg_len, data_len;
        uint16x4_t fsz, sg_swap;
        uint16_t later_skip = 0;
        bool reas_fail = false;
+       bool first_frag = true;
        const rte_iova_t *eol;
        uint16_t data_off = 0;
        bool is_oop = false;
        uint16_t l4_off = 0;
        uint8_t ts_rx_off;
        int dyn_off = 0;
-       uint16_t sg_len;
        int64_t len;
        uintptr_t p;
 
@@ -403,9 +403,11 @@ nix_cqe_xtract_mseg(const union nix_rx_parse_u *rx, struct 
rte_mbuf *mbuf, uint6
                                /* Reverse the order of fragment sizes */
                                fsz = 
vreinterpret_u16_u64(vdup_n_u64(finfo->w1.u64));
                                fsz = vrev64_u16(fsz);
-                               fsz_w1 = 
vget_lane_u64(vreinterpret_u64_u16(fsz), 0) >> 16;
+                               fsz_w1 = 
vget_lane_u64(vreinterpret_u64_u16(fsz), 0);
                                finfo++;
                                l4_off = ((cq_w5 >> 24) & 0xFF) - (cq_w5 & 
0xFF);
+                               mbuf->pkt_len = l4_off + (fsz_w1 & 0xFFFF) - 
ts_rx_off;
+                               fsz_w1 >>= 16;
                        }
                }
 
@@ -427,6 +429,7 @@ nix_cqe_xtract_mseg(const union nix_rx_parse_u *rx, struct 
rte_mbuf *mbuf, uint6
                        return;
 
                len = rx->pkt_lenm1 + 1;
+               mbuf->pkt_len = len;
 
                /* Skip SG_S and first IOVA */
                eol = ((const rte_iova_t *)(rx + 1) + ((rx->desc_sizem1 + 1) << 
1));
@@ -434,6 +437,7 @@ nix_cqe_xtract_mseg(const union nix_rx_parse_u *rx, struct 
rte_mbuf *mbuf, uint6
        }
 
        sg_len = sg & 0xFFFF;
+       data_len = sg_len;
        sg = sg >> 16;
 
        /* Update data len as per the segment size */
@@ -478,14 +482,16 @@ nix_cqe_xtract_mseg(const union nix_rx_parse_u *rx, 
struct rte_mbuf *mbuf, uint6
 
                        /* Reset last mbuf next and start new mbuf chain */
                        last_mbuf->next = NULL;
+                       head->nb_segs = sg_cnt;
+                       head->data_len =
+                               (!first_frag && (sg_cnt == 1)) ? data_len + 
l4_off : data_len;
                        head = mbuf;
                        len = fsz_w1 & 0xFFFF;
                        head->pkt_len = l4_off + len - ts_rx_off;
-                       head->nb_segs = sg_cnt;
-                       /* later frag size update*/
-                       sg_len += l4_off;
+                       data_len = sg_len;
                        data_off = rearm & 0xFFFF;
                        sg_cnt = 0;
+                       first_frag = false;
                        nxt_frag = nxt_frag >> 1;
                        fsz_w1 = fsz_w1 >> 16;
                        if (--num_frags == 4) {
@@ -568,6 +574,7 @@ nix_cqe_xtract_mseg(const union nix_rx_parse_u *rx, struct 
rte_mbuf *mbuf, uint6
 
        /* Update for last failure fragment */
        if ((flags & NIX_RX_REAS_F) && reas_fail) {
+               head->data_len = (!first_frag && (sg_cnt == 1)) ? data_len + 
l4_off : data_len;
                cnxk_ip_reassembly_dynfield(head, dyn_off)->next_frag = NULL;
                cnxk_ip_reassembly_dynfield(head, dyn_off)->nb_frags = 0;
        }
@@ -1079,10 +1086,9 @@ nix_sec_meta_to_mbuf(uintptr_t inb_sa, uintptr_t cpth, 
struct rte_mbuf **inner,
                *rearm = (*rearm & ~(BIT_ULL(16) - 1)) | inner_m->data_off;
        } else {
                /* Get SPI from CPT_PARSE_S's cookie(already swapped) */
-               inb_priv = roc_nix_inl_ot_ipsec_inb_sa_sw_rsvd((void *)inb_sa);
+               inb_priv = roc_nix_inl_ow_ipsec_inb_sa_sw_rsvd((void *)inb_sa);
                /* Update dynamic field with userdata */
-               if (flags & NIX_RX_REAS_F && inb_priv->userdata)
-                       *rte_security_dynfield(inner_m) = 
(uint64_t)inb_priv->userdata;
+               *rte_security_dynfield(inner_m) = (uint64_t)inb_priv->userdata;
        }
 
        /* Clear and update original lower 16 bit of data offset */
@@ -1444,8 +1450,8 @@ cn20k_nix_recv_pkts_vector(void *args, struct rte_mbuf 
**mbufs, uint16_t pkts, c
                                mask23 = vceqq_u64(sa23, 
vdupq_n_u64(0xFFFFFFFF));
                        }
 
-                       sa01 = vshlq_n_u64(sa01, 
ROC_NIX_INL_OT_IPSEC_INB_SA_SZ_LOG2);
-                       sa23 = vshlq_n_u64(sa23, 
ROC_NIX_INL_OT_IPSEC_INB_SA_SZ_LOG2);
+                       sa01 = vshlq_n_u64(sa01, 
ROC_NIX_INL_OW_IPSEC_INB_SA_SZ_LOG2);
+                       sa23 = vshlq_n_u64(sa23, 
ROC_NIX_INL_OW_IPSEC_INB_SA_SZ_LOG2);
                        sa01 = vaddq_u64(sa01, vdupq_n_u64(sa_base));
                        sa23 = vaddq_u64(sa23, vdupq_n_u64(sa_base));
 
@@ -1456,23 +1462,23 @@ cn20k_nix_recv_pkts_vector(void *args, struct rte_mbuf 
**mbufs, uint16_t pkts, c
 
                        const uint8x16x2_t tbl = {{
                                {
-                                       /* ROC_IE_OT_UCC_SUCCESS_PKT_IP_BADCSUM 
*/
+                                       /* ROC_IE_OW_UCC_SUCCESS_PKT_IP_BADCSUM 
*/
                                        RTE_MBUF_F_RX_IP_CKSUM_BAD >> 1,
-                                       /* 
ROC_IE_OT_UCC_SUCCESS_PKT_L4_GOODCSUM */
+                                       /* 
ROC_IE_OW_UCC_SUCCESS_PKT_L4_GOODCSUM */
                                        (RTE_MBUF_F_RX_IP_CKSUM_GOOD |
                                         RTE_MBUF_F_RX_L4_CKSUM_GOOD) >>
                                                1,
-                                       /* ROC_IE_OT_UCC_SUCCESS_PKT_L4_BADCSUM 
*/
+                                       /* ROC_IE_OW_UCC_SUCCESS_PKT_L4_BADCSUM 
*/
                                        (RTE_MBUF_F_RX_IP_CKSUM_GOOD |
                                         RTE_MBUF_F_RX_L4_CKSUM_BAD) >>
                                                1,
                                        1,
-                                       /* 
ROC_IE_OT_UCC_SUCCESS_PKT_UDPESP_NZCSUM */
+                                       /* 
ROC_IE_OW_UCC_SUCCESS_PKT_UDPESP_NZCSUM */
                                        (RTE_MBUF_F_RX_IP_CKSUM_GOOD |
                                         RTE_MBUF_F_RX_L4_CKSUM_GOOD) >>
                                                1,
                                        1,
-                                       /* 
ROC_IE_OT_UCC_SUCCESS_PKT_UDP_ZEROCSUM */
+                                       /* 
ROC_IE_OW_UCC_SUCCESS_PKT_UDP_ZEROCSUM */
                                        (RTE_MBUF_F_RX_IP_CKSUM_GOOD |
                                         RTE_MBUF_F_RX_L4_CKSUM_GOOD) >>
                                                1,
@@ -1490,7 +1496,7 @@ cn20k_nix_recv_pkts_vector(void *args, struct rte_mbuf 
**mbufs, uint16_t pkts, c
                                        1,
                                        1,
                                        1,
-                                       /* 
ROC_IE_OT_UCC_SUCCESS_PKT_IP_GOODCSUM */
+                                       /* 
ROC_IE_OW_UCC_SUCCESS_PKT_IP_GOODCSUM */
                                        RTE_MBUF_F_RX_IP_CKSUM_GOOD >> 1,
                                        /* Rest 0 to indicate 
RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED */
                                        0,
-- 
2.34.1

Reply via email to