]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
xfrm: skip templates check for packet offload tunnel mode
authorLeon Romanovsky <leonro@nvidia.com>
Tue, 27 Jan 2026 12:49:23 +0000 (14:49 +0200)
committerSteffen Klassert <steffen.klassert@secunet.com>
Mon, 2 Feb 2026 07:15:38 +0000 (08:15 +0100)
In packet offload, hardware is responsible to check templates. The
result of its operation is forwarded through secpath by relevant
drivers. That secpath is actually removed in __xfrm_policy_check2().

In case packet is forwarded, this secpath is reset in RX, but pushed
again to TX where policy is rechecked again against dummy secpath
in xfrm_policy_ok().

Such situation causes to unexpected XfrmInTmplMismatch increase.

As a solution, simply skip template mismatch check.

Fixes: 600258d555f0 ("xfrm: delete intermediate secpath entry in packet offload mode")
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Reviewed-by: Jianbo Liu <jianbol@nvidia.com>
Reviewed-by: Cosmin Ratiu <cratiu@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
net/xfrm/xfrm_policy.c

index 62486f866975213621c60ea72f66d1dd5c7e3c83..5428185196a1ff7d59ebbf9b4ae095e7debab627 100644 (file)
@@ -3801,8 +3801,8 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
                struct xfrm_tmpl *tp[XFRM_MAX_DEPTH];
                struct xfrm_tmpl *stp[XFRM_MAX_DEPTH];
                struct xfrm_tmpl **tpp = tp;
+               int i, k = 0;
                int ti = 0;
-               int i, k;
 
                sp = skb_sec_path(skb);
                if (!sp)
@@ -3828,6 +3828,12 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
                        tpp = stp;
                }
 
+               if (pol->xdo.type == XFRM_DEV_OFFLOAD_PACKET && sp == &dummy)
+                       /* This policy template was already checked by HW
+                        * and secpath was removed in __xfrm_policy_check2.
+                        */
+                       goto out;
+
                /* For each tunnel xfrm, find the first matching tmpl.
                 * For each tmpl before that, find corresponding xfrm.
                 * Order is _important_. Later we will implement
@@ -3837,7 +3843,7 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
                 * verified to allow them to be skipped in future policy
                 * checks (e.g. nested tunnels).
                 */
-               for (i = xfrm_nr-1, k = 0; i >= 0; i--) {
+               for (i = xfrm_nr - 1; i >= 0; i--) {
                        k = xfrm_policy_ok(tpp[i], sp, k, family, if_id);
                        if (k < 0) {
                                if (k < -1)
@@ -3853,6 +3859,7 @@ int __xfrm_policy_check(struct sock *sk, int dir, struct sk_buff *skb,
                        goto reject;
                }
 
+out:
                xfrm_pols_put(pols, npols);
                sp->verified_cnt = k;