]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfrm: Support ESN context update to hardware for TX
authorJianbo Liu <jianbol@nvidia.com>
Thu, 19 Dec 2024 12:37:29 +0000 (14:37 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Tue, 7 Jan 2025 12:12:11 +0000 (13:12 +0100)
Previously xfrm_dev_state_advance_esn() was added for RX only. But
it's possible that ESN context also need to be synced to hardware for
TX, so call it for outbound in this patch.

Signed-off-by: Jianbo Liu <jianbol@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
Documentation/networking/xfrm_device.rst
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.c
net/xfrm/xfrm_replay.c

index bfea9d8579ede0949c1f81af4c0bbf3065964c76..66f6e9a9b59ae81575ee12f1f6b63aa09984d4f7 100644 (file)
@@ -169,7 +169,8 @@ the stack in xfrm_input().
 
        hand the packet to napi_gro_receive() as usual
 
-In ESN mode, xdo_dev_state_advance_esn() is called from xfrm_replay_advance_esn().
+In ESN mode, xdo_dev_state_advance_esn() is called from
+xfrm_replay_advance_esn() for RX, and xfrm_replay_overflow_offload_esn for TX.
 Driver will check packet seq number and update HW ESN state machine if needed.
 
 Packet offload mode:
index 97a261d5357e22078c314b7ed48f518399e244da..1b3254b49443368c56e8032a5c23af7e932301f5 100644 (file)
@@ -6559,6 +6559,9 @@ static void cxgb4_advance_esn_state(struct xfrm_state *x)
 {
        struct adapter *adap = netdev2adap(x->xso.dev);
 
+       if (x->xso.dir != XFRM_DEV_OFFLOAD_IN)
+               return;
+
        if (!mutex_trylock(&uld_mutex)) {
                dev_dbg(adap->pdev_dev,
                        "crypto uld critical resource is under use\n");
index ca92e518be766973d9d19d29e0c7de902f461be4..3dd4f24920908857fbfe503e7b1d35051ca9dc9a 100644 (file)
@@ -980,6 +980,9 @@ 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;
index bc56c6305725275ea2286373543af5d9333e34f4..e500aebbad22f2d62123ac1adf58a9ecddeb6dbe 100644 (file)
@@ -729,6 +729,7 @@ static int xfrm_replay_overflow_offload_esn(struct xfrm_state *x, struct sk_buff
                }
 
                replay_esn->oseq = oseq;
+               xfrm_dev_state_advance_esn(x);
 
                if (xfrm_aevent_is_on(net))
                        xfrm_replay_notify(x, XFRM_REPLAY_UPDATE);