]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
netfilter: flowtable: use correct direction to set up tunnel route
authorPablo Neira Ayuso <pablo@netfilter.org>
Thu, 9 Jul 2026 11:40:25 +0000 (13:40 +0200)
committerFlorian Westphal <fw@strlen.de>
Fri, 10 Jul 2026 14:28:47 +0000 (16:28 +0200)
The layer 2 encapsulation and layer 3 tunnel information in the xmit
path is taken from the other tuple, because the tunnel information that
is included in the tuple for hashtable lookups is also used to perform
the egress encapsulation in the transmit path.

This patch uses the correct direction when setting up the tunnel, the
original proposed patch to address this fix uses the reversed direction.

While at it, remove the redundant check to call dst_release() to drop
the reference on the dst that was obtained from the forward path, which
is not useful in the direct xmit path unless tunneling is performed.

Fixes: fa7395c02d95 ("netfilter: flowtable: support IPIP tunnel with direct xmit")
Cc: stable@vger.kernel.org
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Signed-off-by: Florian Westphal <fw@strlen.de>
net/netfilter/nf_flow_table_core.c

index 2a829b5e8240a7c03b821722722f7b2490623a47..b66e6543934117763bef14c550f8f09621d09ea1 100644 (file)
@@ -127,18 +127,18 @@ static int flow_offload_fill_route(struct flow_offload *flow,
 
        switch (route->tuple[dir].xmit_type) {
        case FLOW_OFFLOAD_XMIT_DIRECT:
-               if (flow_tuple->tun_num) {
+               if (route->tuple[!dir].in.num_tuns) {
                        flow_tuple->dst_cache = dst;
                        flow_tuple->dst_cookie =
                                flow_offload_dst_cookie(flow_tuple);
+               } else {
+                       dst_release(dst);
                }
                memcpy(flow_tuple->out.h_dest, route->tuple[dir].out.h_dest,
                       ETH_ALEN);
                memcpy(flow_tuple->out.h_source, route->tuple[dir].out.h_source,
                       ETH_ALEN);
                flow_tuple->out.ifidx = route->tuple[dir].out.ifindex;
-               if (!flow_tuple->tun_num)
-                       dst_release(dst);
                break;
        case FLOW_OFFLOAD_XMIT_XFRM:
        case FLOW_OFFLOAD_XMIT_NEIGH: