| From foo@baz Sat 16 May 2020 02:04:40 PM CEST |
| From: "Maciej Żenczykowski" <maze@google.com> |
| Date: Tue, 5 May 2020 11:57:23 -0700 |
| Subject: Revert "ipv6: add mtu lock check in __ip6_rt_update_pmtu" |
| |
| From: "Maciej Żenczykowski" <maze@google.com> |
| |
| [ Upstream commit 09454fd0a4ce23cb3d8af65066c91a1bf27120dd ] |
| |
| This reverts commit 19bda36c4299ce3d7e5bce10bebe01764a655a6d: |
| |
| | ipv6: add mtu lock check in __ip6_rt_update_pmtu |
| | |
| | Prior to this patch, ipv6 didn't do mtu lock check in ip6_update_pmtu. |
| | It leaded to that mtu lock doesn't really work when receiving the pkt |
| | of ICMPV6_PKT_TOOBIG. |
| | |
| | This patch is to add mtu lock check in __ip6_rt_update_pmtu just as ipv4 |
| | did in __ip_rt_update_pmtu. |
| |
| The above reasoning is incorrect. IPv6 *requires* icmp based pmtu to work. |
| There's already a comment to this effect elsewhere in the kernel: |
| |
| $ git grep -p -B1 -A3 'RTAX_MTU lock' |
| net/ipv6/route.c=4813= |
| |
| static int rt6_mtu_change_route(struct fib6_info *f6i, void *p_arg) |
| ... |
| /* In IPv6 pmtu discovery is not optional, |
| so that RTAX_MTU lock cannot disable it. |
| We still use this lock to block changes |
| caused by addrconf/ndisc. |
| */ |
| |
| This reverts to the pre-4.9 behaviour. |
| |
| Cc: Eric Dumazet <edumazet@google.com> |
| Cc: Willem de Bruijn <willemb@google.com> |
| Cc: Xin Long <lucien.xin@gmail.com> |
| Cc: Hannes Frederic Sowa <hannes@stressinduktion.org> |
| Signed-off-by: Maciej Żenczykowski <maze@google.com> |
| Fixes: 19bda36c4299 ("ipv6: add mtu lock check in __ip6_rt_update_pmtu") |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv6/route.c | 6 ++++-- |
| 1 file changed, 4 insertions(+), 2 deletions(-) |
| |
| --- a/net/ipv6/route.c |
| +++ b/net/ipv6/route.c |
| @@ -2725,8 +2725,10 @@ static void __ip6_rt_update_pmtu(struct |
| const struct in6_addr *daddr, *saddr; |
| struct rt6_info *rt6 = (struct rt6_info *)dst; |
| |
| - if (dst_metric_locked(dst, RTAX_MTU)) |
| - return; |
| + /* Note: do *NOT* check dst_metric_locked(dst, RTAX_MTU) |
| + * IPv6 pmtu discovery isn't optional, so 'mtu lock' cannot disable it. |
| + * [see also comment in rt6_mtu_change_route()] |
| + */ |
| |
| if (iph) { |
| daddr = &iph->daddr; |