FAILED: patch "[PATCH] netfilter: Update ip6_route_me_harder to consider L3 domain" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 8ddffdb9442a9d60b4a6e679ac48d7d21403a674 Mon Sep 17 00:00:00 2001
From: Martin Willi <[email protected]>
Date: Tue, 19 Apr 2022 15:47:00 +0200
Subject: [PATCH] netfilter: Update ip6_route_me_harder to consider L3 domain
The commit referenced below fixed packet re-routing if Netfilter mangles a routing key property of a packet and the packet is routed in a VRF L3 domain. The fix, however, addressed IPv4 re-routing, only.
This commit applies the same behavior for IPv6. While at it, untangle the nested ternary operator to make the code more readable.
net/ipv6/netfilter.c +8 -2
@@ -24,14 +24,13 @@ int ip6_route_me_harder(struct net *net, struct sock *sk_partial, struct sk_buff {const struct ipv6hdr *iph =ipv6_hdr (skb);struct sock *sk =sk_to_full_sk (sk_partial); +struct net_device *dev =skb_dst (skb)->dev;struct flow_keys flkeys;unsigned int hh_len;struct dst_entry *dst;int strict = (ipv6_addr_type (&iph->daddr) & (IPV6_ADDR_MULTICAST |IPV6_ADDR_LINKLOCAL ));struct flowi6 fl6 = { - .flowi6_oif = sk && sk->sk_bound_dev_if ? sk->sk_bound_dev_if : - strict ?skb_dst (skb)->dev->ifindex :0 , .flowi6_mark = skb->mark, .flowi6_uid =sock_net_uid (net, sk), .daddr = iph->daddr,
@@ -39,6 +38,13 @@ int ip6_route_me_harder(struct net *net, struct sock *sk_partial, struct sk_buff };int err; +if (sk && sk->sk_bound_dev_if) + fl6.flowi6_oif = sk->sk_bound_dev_if; +else if (strict) + fl6.flowi6_oif = dev->ifindex; +else + fl6.flowi6_oif =l3mdev_master_ifindex (dev); +fib6_rules_early_flow_dissect (net, skb, &fl6, &flkeys); dst =ip6_route_output (net, sk, &fl6); err = dst->error;