net/ngbe: support MAC filters
[dpdk.git] / drivers / net / cnxk / cn9k_rx.h
index bdedeab..225bb41 100644 (file)
@@ -31,6 +31,9 @@
 #define CQE_CAST(x)         ((struct nix_cqe_hdr_s *)(x))
 #define CQE_SZ(x)           ((x) * CNXK_NIX_CQ_ENTRY_SZ)
 
+#define IPSEC_SQ_LO_IDX 4
+#define IPSEC_SQ_HI_IDX 8
+
 union mbuf_initializer {
        struct {
                uint16_t data_off;
@@ -100,9 +103,9 @@ nix_update_match_id(const uint16_t match_id, uint64_t ol_flags,
         * 0 to CNXK_FLOW_ACTION_FLAG_DEFAULT - 2
         */
        if (likely(match_id)) {
-               ol_flags |= PKT_RX_FDIR;
+               ol_flags |= RTE_MBUF_F_RX_FDIR;
                if (match_id != CNXK_FLOW_ACTION_FLAG_DEFAULT) {
-                       ol_flags |= PKT_RX_FDIR_ID;
+                       ol_flags |= RTE_MBUF_F_RX_FDIR_ID;
                        mbuf->hash.fdir.hi = match_id - 1;
                }
        }
@@ -148,7 +151,7 @@ nix_cqe_xtract_mseg(const union nix_rx_parse_u *rx, struct rte_mbuf *mbuf,
                mbuf->next = ((struct rte_mbuf *)*iova_list) - 1;
                mbuf = mbuf->next;
 
-               __mempool_check_cookies(mbuf->pool, (void **)&mbuf, 1, 1);
+               RTE_MEMPOOL_CHECK_COOKIES(mbuf->pool, (void **)&mbuf, 1, 1);
 
                mbuf->data_len = sg & 0xFFFF;
                sg = sg >> 16;
@@ -166,6 +169,48 @@ nix_cqe_xtract_mseg(const union nix_rx_parse_u *rx, struct rte_mbuf *mbuf,
        mbuf->next = NULL;
 }
 
+static inline int
+ipsec_antireplay_check(struct roc_onf_ipsec_inb_sa *sa,
+                      struct cn9k_inb_priv_data *priv, uintptr_t data,
+                      uint32_t win_sz)
+{
+       struct cnxk_on_ipsec_ar *ar = &priv->ar;
+       uint64_t seq_in_sa;
+       uint32_t seqh = 0;
+       uint32_t seql;
+       uint64_t seq;
+       uint8_t esn;
+       int rc;
+
+       esn = sa->ctl.esn_en;
+       seql = rte_be_to_cpu_32(*((uint32_t *)(data + IPSEC_SQ_LO_IDX)));
+
+       if (!esn) {
+               seq = (uint64_t)seql;
+       } else {
+               seqh = rte_be_to_cpu_32(*((uint32_t *)(data +
+                                       IPSEC_SQ_HI_IDX)));
+               seq = ((uint64_t)seqh << 32) | seql;
+       }
+
+       if (unlikely(seq == 0))
+               return -1;
+
+       rte_spinlock_lock(&ar->lock);
+       rc = cnxk_on_anti_replay_check(seq, ar, win_sz);
+       if (esn && !rc) {
+               seq_in_sa = ((uint64_t)rte_be_to_cpu_32(sa->esn_hi) << 32) |
+                           rte_be_to_cpu_32(sa->esn_low);
+               if (seq > seq_in_sa) {
+                       sa->esn_low = rte_cpu_to_be_32(seql);
+                       sa->esn_hi = rte_cpu_to_be_32(seqh);
+               }
+       }
+       rte_spinlock_unlock(&ar->lock);
+
+       return rc;
+}
+
 static __rte_always_inline uint64_t
 nix_rx_sec_mbuf_update(const struct nix_cqe_hdr_s *cq, struct rte_mbuf *m,
                       uintptr_t sa_base, uint64_t *rearm_val, uint16_t *len)
@@ -178,8 +223,8 @@ nix_rx_sec_mbuf_update(const struct nix_cqe_hdr_s *cq, struct rte_mbuf *m,
        uint8_t lcptr = rx->lcptr;
        struct rte_ipv4_hdr *ipv4;
        uint16_t data_off, res;
+       uint32_t spi, win_sz;
        uint32_t spi_mask;
-       uint32_t spi;
        uintptr_t data;
        __uint128_t dw;
        uint8_t sa_w;
@@ -192,7 +237,7 @@ nix_rx_sec_mbuf_update(const struct nix_cqe_hdr_s *cq, struct rte_mbuf *m,
        rte_prefetch0((void *)data);
 
        if (unlikely(res != (CPT_COMP_GOOD | ROC_IE_ONF_UCC_SUCCESS << 8)))
-               return PKT_RX_SEC_OFFLOAD | PKT_RX_SEC_OFFLOAD_FAILED;
+               return RTE_MBUF_F_RX_SEC_OFFLOAD | RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED;
 
        data += lcptr;
        /* 20 bits of tag would have the SPI */
@@ -209,6 +254,13 @@ nix_rx_sec_mbuf_update(const struct nix_cqe_hdr_s *cq, struct rte_mbuf *m,
        dw = *(__uint128_t *)sa_priv;
        *rte_security_dynfield(m) = (uint64_t)dw;
 
+       /* Check if anti-replay is enabled */
+       win_sz = (uint32_t)(dw >> 64);
+       if (win_sz) {
+               if (ipsec_antireplay_check(sa, sa_priv, data, win_sz) < 0)
+                       return RTE_MBUF_F_RX_SEC_OFFLOAD | RTE_MBUF_F_RX_SEC_OFFLOAD_FAILED;
+       }
+
        /* Get total length from IPv4 header. We can assume only IPv4 */
        ipv4 = (struct rte_ipv4_hdr *)(data + ROC_ONF_IPSEC_INB_SPI_SEQ_SZ +
                                       ROC_ONF_IPSEC_INB_MAX_L2_SZ);
@@ -220,7 +272,7 @@ nix_rx_sec_mbuf_update(const struct nix_cqe_hdr_s *cq, struct rte_mbuf *m,
        *rearm_val |= data_off;
 
        *len = rte_be_to_cpu_16(ipv4->total_length) + lcptr;
-       return PKT_RX_SEC_OFFLOAD;
+       return RTE_MBUF_F_RX_SEC_OFFLOAD;
 }
 
 static __rte_always_inline void
@@ -236,7 +288,7 @@ cn9k_nix_cqe_to_mbuf(const struct nix_cqe_hdr_s *cq, const uint32_t tag,
        uint64_t ol_flags = 0;
 
        /* Mark mempool obj as "get" as it is alloc'ed by NIX */
-       __mempool_check_cookies(mbuf->pool, (void **)&mbuf, 1, 1);
+       RTE_MEMPOOL_CHECK_COOKIES(mbuf->pool, (void **)&mbuf, 1, 1);
 
        if (flag & NIX_RX_OFFLOAD_PTYPE_F)
                packet_type = nix_ptype_get(lookup_mem, w1);
@@ -267,7 +319,7 @@ cn9k_nix_cqe_to_mbuf(const struct nix_cqe_hdr_s *cq, const uint32_t tag,
 
        if (flag & NIX_RX_OFFLOAD_RSS_F) {
                mbuf->hash.rss = tag;
-               ol_flags |= PKT_RX_RSS_HASH;
+               ol_flags |= RTE_MBUF_F_RX_RSS_HASH;
        }
 
        if (flag & NIX_RX_OFFLOAD_CHECKSUM_F)
@@ -276,11 +328,11 @@ cn9k_nix_cqe_to_mbuf(const struct nix_cqe_hdr_s *cq, const uint32_t tag,
 skip_parse:
        if (flag & NIX_RX_OFFLOAD_VLAN_STRIP_F) {
                if (rx->cn9k.vtag0_gone) {
-                       ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
+                       ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;
                        mbuf->vlan_tci = rx->cn9k.vtag0_tci;
                }
                if (rx->cn9k.vtag1_gone) {
-                       ol_flags |= PKT_RX_QINQ | PKT_RX_QINQ_STRIPPED;
+                       ol_flags |= RTE_MBUF_F_RX_QINQ | RTE_MBUF_F_RX_QINQ_STRIPPED;
                        mbuf->vlan_tci_outer = rx->cn9k.vtag1_tci;
                }
        }
@@ -385,7 +437,7 @@ static __rte_always_inline uint64_t
 nix_vlan_update(const uint64_t w2, uint64_t ol_flags, uint8x16_t *f)
 {
        if (w2 & BIT_ULL(21) /* vtag0_gone */) {
-               ol_flags |= PKT_RX_VLAN | PKT_RX_VLAN_STRIPPED;
+               ol_flags |= RTE_MBUF_F_RX_VLAN | RTE_MBUF_F_RX_VLAN_STRIPPED;
                *f = vsetq_lane_u16((uint16_t)(w2 >> 32), *f, 5);
        }
 
@@ -396,7 +448,7 @@ static __rte_always_inline uint64_t
 nix_qinq_update(const uint64_t w2, uint64_t ol_flags, struct rte_mbuf *mbuf)
 {
        if (w2 & BIT_ULL(23) /* vtag1_gone */) {
-               ol_flags |= PKT_RX_QINQ | PKT_RX_QINQ_STRIPPED;
+               ol_flags |= RTE_MBUF_F_RX_QINQ | RTE_MBUF_F_RX_QINQ_STRIPPED;
                mbuf->vlan_tci_outer = (uint16_t)(w2 >> 48);
        }
 
@@ -497,10 +549,10 @@ cn9k_nix_recv_pkts_vector(void *rx_queue, struct rte_mbuf **rx_pkts,
                        f1 = vsetq_lane_u32(cq1_w0, f1, 3);
                        f2 = vsetq_lane_u32(cq2_w0, f2, 3);
                        f3 = vsetq_lane_u32(cq3_w0, f3, 3);
-                       ol_flags0 = PKT_RX_RSS_HASH;
-                       ol_flags1 = PKT_RX_RSS_HASH;
-                       ol_flags2 = PKT_RX_RSS_HASH;
-                       ol_flags3 = PKT_RX_RSS_HASH;
+                       ol_flags0 = RTE_MBUF_F_RX_RSS_HASH;
+                       ol_flags1 = RTE_MBUF_F_RX_RSS_HASH;
+                       ol_flags2 = RTE_MBUF_F_RX_RSS_HASH;
+                       ol_flags3 = RTE_MBUF_F_RX_RSS_HASH;
                } else {
                        ol_flags0 = 0;
                        ol_flags1 = 0;
@@ -573,8 +625,8 @@ cn9k_nix_recv_pkts_vector(void *rx_queue, struct rte_mbuf **rx_pkts,
                                                  RTE_PTYPE_L2_ETHER_TIMESYNC,
                                                  RTE_PTYPE_L2_ETHER_TIMESYNC,
                                                  RTE_PTYPE_L2_ETHER_TIMESYNC};
-                       const uint64_t ts_olf = PKT_RX_IEEE1588_PTP |
-                                               PKT_RX_IEEE1588_TMST |
+                       const uint64_t ts_olf = RTE_MBUF_F_RX_IEEE1588_PTP |
+                                               RTE_MBUF_F_RX_IEEE1588_TMST |
                                                rxq->tstamp->rx_tstamp_dynflag;
                        const uint32x4_t and_mask = {0x1, 0x2, 0x4, 0x8};
                        uint64x2_t ts01, ts23, mask;
@@ -705,10 +757,10 @@ cn9k_nix_recv_pkts_vector(void *rx_queue, struct rte_mbuf **rx_pkts,
                roc_prefetch_store_keep(mbuf3);
 
                /* Mark mempool obj as "get" as it is alloc'ed by NIX */
-               __mempool_check_cookies(mbuf0->pool, (void **)&mbuf0, 1, 1);
-               __mempool_check_cookies(mbuf1->pool, (void **)&mbuf1, 1, 1);
-               __mempool_check_cookies(mbuf2->pool, (void **)&mbuf2, 1, 1);
-               __mempool_check_cookies(mbuf3->pool, (void **)&mbuf3, 1, 1);
+               RTE_MEMPOOL_CHECK_COOKIES(mbuf0->pool, (void **)&mbuf0, 1, 1);
+               RTE_MEMPOOL_CHECK_COOKIES(mbuf1->pool, (void **)&mbuf1, 1, 1);
+               RTE_MEMPOOL_CHECK_COOKIES(mbuf2->pool, (void **)&mbuf2, 1, 1);
+               RTE_MEMPOOL_CHECK_COOKIES(mbuf3->pool, (void **)&mbuf3, 1, 1);
 
                /* Advance head pointer and packets */
                head += NIX_DESCS_PER_LOOP;