net/mlx5e: Update TX ESN context for IPSec hardware offload
authorJianbo Liu <jianbol@nvidia.com>
Thu, 19 Dec 2024 12:37:30 +0000 (14:37 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Tue, 7 Jan 2025 12:12:11 +0000 (13:12 +0100)
ESN context must be synced between software and hardware for both RX
and TX. As the call to xfrm_dev_state_advance_esn() is added for TX,
this patch add the missing logic for TX. So the update is also checked
on every packet sent, to see if need to trigger ESN update worker.

Signed-off-by: Jianbo Liu <jianbol@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c

index 3dd4f24920908857fbfe503e7b1d35051ca9dc9a..8489b0a0e8bdf1a9c4a09ca8d911c25868027921 100644 (file)
@@ -94,25 +94,14 @@ static bool mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry)
        u32 esn, esn_msb;
        u8 overlap;
 
-       switch (x->xso.type) {
-       case XFRM_DEV_OFFLOAD_PACKET:
-               switch (x->xso.dir) {
-               case XFRM_DEV_OFFLOAD_IN:
-                       esn = x->replay_esn->seq;
-                       esn_msb = x->replay_esn->seq_hi;
-                       break;
-               case XFRM_DEV_OFFLOAD_OUT:
-                       esn = x->replay_esn->oseq;
-                       esn_msb = x->replay_esn->oseq_hi;
-                       break;
-               default:
-                       WARN_ON(true);
-                       return false;
-               }
-               break;
-       case XFRM_DEV_OFFLOAD_CRYPTO:
-               /* Already parsed by XFRM core */
+       switch (x->xso.dir) {
+       case XFRM_DEV_OFFLOAD_IN:
                esn = x->replay_esn->seq;
+               esn_msb = x->replay_esn->seq_hi;
+               break;
+       case XFRM_DEV_OFFLOAD_OUT:
+               esn = x->replay_esn->oseq;
+               esn_msb = x->replay_esn->oseq_hi;
                break;
        default:
                WARN_ON(true);
@@ -121,11 +110,15 @@ static bool mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry)
 
        overlap = sa_entry->esn_state.overlap;
 
-       if (esn >= x->replay_esn->replay_window)
-               seq_bottom = esn - x->replay_esn->replay_window + 1;
+       if (!x->replay_esn->replay_window) {
+               seq_bottom = esn;
+       } else {
+               if (esn >= x->replay_esn->replay_window)
+                       seq_bottom = esn - x->replay_esn->replay_window + 1;
 
-       if (x->xso.type == XFRM_DEV_OFFLOAD_CRYPTO)
-               esn_msb = xfrm_replay_seqhi(x, htonl(seq_bottom));
+               if (x->xso.type == XFRM_DEV_OFFLOAD_CRYPTO)
+                       esn_msb = xfrm_replay_seqhi(x, htonl(seq_bottom));
+       }
 
        if (sa_entry->esn_state.esn_msb)
                sa_entry->esn_state.esn = esn;
@@ -980,9 +973,6 @@ static void mlx5e_xfrm_advance_esn_state(struct xfrm_state *x)
        struct mlx5e_ipsec_sa_entry *sa_entry_shadow;
        bool need_update;
 
-       if (x->xso.dir != XFRM_DEV_OFFLOAD_IN)
-               return;
-
        need_update = mlx5e_ipsec_update_esn_state(sa_entry);
        if (!need_update)
                return;