| From foo@baz Wed Nov 21 13:17:56 CET 2018 |
| From: David Ahern <dsahern@gmail.com> |
| Date: Sun, 18 Nov 2018 10:45:30 -0800 |
| Subject: ipv6: Fix PMTU updates for UDP/raw sockets in presence of VRF |
| |
| From: David Ahern <dsahern@gmail.com> |
| |
| [ Upstream commit 7ddacfa564870cdd97275fd87decb6174abc6380 ] |
| |
| Preethi reported that PMTU discovery for UDP/raw applications is not |
| working in the presence of VRF when the socket is not bound to a device. |
| The problem is that ip6_sk_update_pmtu does not consider the L3 domain |
| of the skb device if the socket is not bound. Update the function to |
| set oif to the L3 master device if relevant. |
| |
| Fixes: ca254490c8df ("net: Add VRF support to IPv6 stack") |
| Reported-by: Preethi Ramachandra <preethir@juniper.net> |
| Signed-off-by: David Ahern <dsahern@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv6/route.c | 7 +++++-- |
| 1 file changed, 5 insertions(+), 2 deletions(-) |
| |
| --- a/net/ipv6/route.c |
| +++ b/net/ipv6/route.c |
| @@ -1439,10 +1439,13 @@ EXPORT_SYMBOL_GPL(ip6_update_pmtu); |
| |
| void ip6_sk_update_pmtu(struct sk_buff *skb, struct sock *sk, __be32 mtu) |
| { |
| + int oif = sk->sk_bound_dev_if; |
| struct dst_entry *dst; |
| |
| - ip6_update_pmtu(skb, sock_net(sk), mtu, |
| - sk->sk_bound_dev_if, sk->sk_mark); |
| + if (!oif && skb->dev) |
| + oif = l3mdev_master_ifindex(skb->dev); |
| + |
| + ip6_update_pmtu(skb, sock_net(sk), mtu, oif, sk->sk_mark); |
| |
| dst = __sk_dst_get(sk); |
| if (!dst || !dst->obsolete || |