]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/mlx5e: Add Rx data path offload
authorRaed Salem <raeds@nvidia.com>
Wed, 17 Sep 2025 00:09:45 +0000 (17:09 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 18 Sep 2025 10:32:07 +0000 (12:32 +0200)
On receive flow inspect received packets for PSP offload indication using
the cqe, for PSP offloaded packets set SKB PSP metadata i.e spi, header
length and key generation number to stack for further processing.

Signed-off-by: Raed Salem <raeds@nvidia.com>
Signed-off-by: Rahul Rameshbabu <rrameshbabu@nvidia.com>
Signed-off-by: Cosmin Ratiu <cratiu@nvidia.com>
Signed-off-by: Daniel Zahka <daniel.zahka@gmail.com>
Link: https://patch.msgid.link/20250917000954.859376-19-daniel.zahka@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_rxtx.h
drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp_rxtx.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/psp_rxtx.h
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c

index 3cc6406692473394723136a1b8bd97de55ed79ee..45b0d19e735cbb800e9f5ada4c45e59601d7371f 100644 (file)
@@ -40,7 +40,7 @@
 #include "en/txrx.h"
 
 /* Bit31: IPsec marker, Bit30: reserved, Bit29-24: IPsec syndrome, Bit23-0: IPsec obj id */
-#define MLX5_IPSEC_METADATA_MARKER(metadata)  (((metadata) >> 31) & 0x1)
+#define MLX5_IPSEC_METADATA_MARKER(metadata)  ((((metadata) >> 30) & 0x3) == 0x2)
 #define MLX5_IPSEC_METADATA_SYNDROM(metadata) (((metadata) >> 24) & GENMASK(5, 0))
 #define MLX5_IPSEC_METADATA_HANDLE(metadata)  ((metadata) & GENMASK(23, 0))
 
index 2ae5dafcc43fb2f290b0e3a2827299740c7a2358..828bff1137aff99b56207d213aa279ec384de2f1 100644 (file)
 #include "en_accel/psp_rxtx.h"
 #include "en_accel/psp.h"
 
+enum {
+       MLX5E_PSP_OFFLOAD_RX_SYNDROME_DECRYPTED,
+       MLX5E_PSP_OFFLOAD_RX_SYNDROME_AUTH_FAILED,
+       MLX5E_PSP_OFFLOAD_RX_SYNDROME_BAD_TRAILER,
+};
+
 static void mlx5e_psp_set_swp(struct sk_buff *skb,
                              struct mlx5e_accel_tx_psp_state *psp_st,
                              struct mlx5_wqe_eth_seg *eseg)
@@ -113,6 +119,30 @@ out:
        return ret;
 }
 
+bool mlx5e_psp_offload_handle_rx_skb(struct net_device *netdev, struct sk_buff *skb,
+                                    struct mlx5_cqe64 *cqe)
+{
+       u32 psp_meta_data = be32_to_cpu(cqe->ft_metadata);
+       struct mlx5e_priv *priv = netdev_priv(netdev);
+       u16 dev_id = priv->psp->psp->id;
+       bool strip_icv = true;
+       u8 generation = 0;
+
+       /* TBD: report errors as SW counters to ethtool, any further handling ? */
+       if (MLX5_PSP_METADATA_SYNDROME(psp_meta_data) != MLX5E_PSP_OFFLOAD_RX_SYNDROME_DECRYPTED)
+               goto drop;
+
+       if (psp_dev_rcv(skb, dev_id, generation, strip_icv))
+               goto drop;
+
+       skb->decrypted = 1;
+       return false;
+
+drop:
+       kfree_skb(skb);
+       return true;
+}
+
 void mlx5e_psp_tx_build_eseg(struct mlx5e_priv *priv, struct sk_buff *skb,
                             struct mlx5e_accel_tx_psp_state *psp_st,
                             struct mlx5_wqe_eth_seg *eseg)
index 521b2c3620e65054244f962b0ae485b153f7bd5a..70289c921bd6b3e3e138fc8baa3f83f7743c9260 100644 (file)
 #include "en.h"
 #include "en/txrx.h"
 
+/* Bit30: PSP marker, Bit29-23: PSP syndrome, Bit22-0: PSP obj id */
+#define MLX5_PSP_METADATA_MARKER(metadata)  ((((metadata) >> 30) & 0x3) == 0x3)
+#define MLX5_PSP_METADATA_SYNDROME(metadata) (((metadata) >> 23) & GENMASK(6, 0))
+#define MLX5_PSP_METADATA_HANDLE(metadata)  ((metadata) & GENMASK(22, 0))
+
 struct mlx5e_accel_tx_psp_state {
        u32 tailen;
        u32 keyid;
@@ -75,6 +80,14 @@ static inline unsigned int mlx5e_psp_tx_ids_len(struct mlx5e_accel_tx_psp_state
 {
        return psp_st->tailen;
 }
+
+static inline bool mlx5e_psp_is_rx_flow(struct mlx5_cqe64 *cqe)
+{
+       return MLX5_PSP_METADATA_MARKER(be32_to_cpu(cqe->ft_metadata));
+}
+
+bool mlx5e_psp_offload_handle_rx_skb(struct net_device *netdev, struct sk_buff *skb,
+                                    struct mlx5_cqe64 *cqe);
 #else
 static inline bool mlx5e_psp_is_offload_state(struct mlx5e_accel_tx_psp_state *psp_state)
 {
@@ -92,5 +105,17 @@ static inline bool mlx5e_psp_txwqe_build_eseg_csum(struct mlx5e_txqsq *sq, struc
 {
        return false;
 }
+
+static inline bool mlx5e_psp_is_rx_flow(struct mlx5_cqe64 *cqe)
+{
+       return false;
+}
+
+static inline bool mlx5e_psp_offload_handle_rx_skb(struct net_device *netdev,
+                                                  struct sk_buff *skb,
+                                                  struct mlx5_cqe64 *cqe)
+{
+       return false;
+}
 #endif /* CONFIG_MLX5_EN_PSP */
 #endif /* __MLX5E_PSP_RXTX_H__ */
index 2925ece136c4060eccaf5bde218b615e156cecd3..4ed43ee9aa35b5e645d8003bbb3950552089f584 100644 (file)
@@ -51,6 +51,7 @@
 #include "ipoib/ipoib.h"
 #include "en_accel/ipsec.h"
 #include "en_accel/macsec.h"
+#include "en_accel/psp_rxtx.h"
 #include "en_accel/ipsec_rxtx.h"
 #include "en_accel/ktls_txrx.h"
 #include "en/xdp.h"
@@ -1521,6 +1522,11 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,
                skb->ip_summed = CHECKSUM_COMPLETE;
                skb->csum = csum_unfold((__force __sum16)cqe->check_sum);
 
+               if (unlikely(mlx5e_psp_is_rx_flow(cqe))) {
+                       /* TBD: PSP csum complete corrections for now chose csum_unnecessary path */
+                       goto csum_unnecessary;
+               }
+
                if (test_bit(MLX5E_RQ_STATE_CSUM_FULL, &rq->state))
                        return; /* CQE csum covers all received bytes */
 
@@ -1549,7 +1555,7 @@ csum_none:
 
 #define MLX5E_CE_BIT_MASK 0x80
 
-static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,
+static inline bool mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,
                                      u32 cqe_bcnt,
                                      struct mlx5e_rq *rq,
                                      struct sk_buff *skb)
@@ -1563,6 +1569,11 @@ static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,
        if (unlikely(get_cqe_tls_offload(cqe)))
                mlx5e_ktls_handle_rx_skb(rq, skb, cqe, &cqe_bcnt);
 
+       if (unlikely(mlx5e_psp_is_rx_flow(cqe))) {
+               if (mlx5e_psp_offload_handle_rx_skb(netdev, skb, cqe))
+                       return true;
+       }
+
        if (unlikely(mlx5_ipsec_is_rx_flow(cqe)))
                mlx5e_ipsec_offload_handle_rx_skb(netdev, skb,
                                                  be32_to_cpu(cqe->ft_metadata));
@@ -1608,9 +1619,11 @@ static inline void mlx5e_build_rx_skb(struct mlx5_cqe64 *cqe,
 
        if (unlikely(mlx5e_skb_is_multicast(skb)))
                stats->mcast_packets++;
+
+       return false;
 }
 
-static void mlx5e_shampo_complete_rx_cqe(struct mlx5e_rq *rq,
+static bool mlx5e_shampo_complete_rx_cqe(struct mlx5e_rq *rq,
                                         struct mlx5_cqe64 *cqe,
                                         u32 cqe_bcnt,
                                         struct sk_buff *skb)
@@ -1620,16 +1633,20 @@ static void mlx5e_shampo_complete_rx_cqe(struct mlx5e_rq *rq,
        stats->packets++;
        stats->bytes += cqe_bcnt;
        if (NAPI_GRO_CB(skb)->count != 1)
-               return;
-       mlx5e_build_rx_skb(cqe, cqe_bcnt, rq, skb);
+               return false;
+
+       if (mlx5e_build_rx_skb(cqe, cqe_bcnt, rq, skb))
+               return true;
+
        skb_reset_network_header(skb);
        if (!skb_flow_dissect_flow_keys(skb, &rq->hw_gro_data->fk, 0)) {
                napi_gro_receive(rq->cq.napi, skb);
                rq->hw_gro_data->skb = NULL;
        }
+       return false;
 }
 
-static inline void mlx5e_complete_rx_cqe(struct mlx5e_rq *rq,
+static inline bool mlx5e_complete_rx_cqe(struct mlx5e_rq *rq,
                                         struct mlx5_cqe64 *cqe,
                                         u32 cqe_bcnt,
                                         struct sk_buff *skb)
@@ -1638,7 +1655,7 @@ static inline void mlx5e_complete_rx_cqe(struct mlx5e_rq *rq,
 
        stats->packets++;
        stats->bytes += cqe_bcnt;
-       mlx5e_build_rx_skb(cqe, cqe_bcnt, rq, skb);
+       return mlx5e_build_rx_skb(cqe, cqe_bcnt, rq, skb);
 }
 
 static inline
@@ -1854,7 +1871,8 @@ static void mlx5e_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
                goto wq_cyc_pop;
        }
 
-       mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
+       if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb))
+               goto wq_cyc_pop;
 
        if (mlx5e_cqe_regb_chain(cqe))
                if (!mlx5e_tc_update_skb_nic(cqe, skb)) {
@@ -1901,7 +1919,8 @@ static void mlx5e_handle_rx_cqe_rep(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
                goto wq_cyc_pop;
        }
 
-       mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
+       if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb))
+               goto wq_cyc_pop;
 
        if (rep->vlan && skb_vlan_tag_present(skb))
                skb_vlan_pop(skb);
@@ -1950,7 +1969,8 @@ static void mlx5e_handle_rx_cqe_mpwrq_rep(struct mlx5e_rq *rq, struct mlx5_cqe64
        if (!skb)
                goto mpwrq_cqe_out;
 
-       mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
+       if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb))
+               goto mpwrq_cqe_out;
 
        mlx5e_rep_tc_receive(cqe, rq, skb);
 
@@ -2387,7 +2407,10 @@ static void mlx5e_handle_rx_cqe_mpwrq_shampo(struct mlx5e_rq *rq, struct mlx5_cq
                stats->hds_nosplit_bytes += data_bcnt;
        }
 
-       mlx5e_shampo_complete_rx_cqe(rq, cqe, cqe_bcnt, *skb);
+       if (mlx5e_shampo_complete_rx_cqe(rq, cqe, cqe_bcnt, *skb)) {
+               *skb = NULL;
+               goto free_hd_entry;
+       }
        if (flush && rq->hw_gro_data->skb)
                mlx5e_shampo_flush_skb(rq, cqe, match);
 free_hd_entry:
@@ -2445,7 +2468,8 @@ static void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cq
        if (!skb)
                goto mpwrq_cqe_out;
 
-       mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
+       if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb))
+               goto mpwrq_cqe_out;
 
        if (mlx5e_cqe_regb_chain(cqe))
                if (!mlx5e_tc_update_skb_nic(cqe, skb)) {
@@ -2778,7 +2802,8 @@ static void mlx5e_trap_handle_rx_cqe(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe
        if (!skb)
                goto wq_cyc_pop;
 
-       mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb);
+       if (mlx5e_complete_rx_cqe(rq, cqe, cqe_bcnt, skb))
+               goto wq_cyc_pop;
        skb_push(skb, ETH_HLEN);
 
        mlx5_devlink_trap_report(rq->mdev, trap_id, skb,