| From foo@baz Tue Nov 17 10:40:32 AM CET 2020 |
| From: Oliver Herms <oliver.peter.herms@gmail.com> |
| Date: Tue, 3 Nov 2020 11:41:33 +0100 |
| Subject: IPv6: Set SIT tunnel hard_header_len to zero |
| |
| From: Oliver Herms <oliver.peter.herms@gmail.com> |
| |
| [ Upstream commit 8ef9ba4d666614497a057d09b0a6eafc1e34eadf ] |
| |
| Due to the legacy usage of hard_header_len for SIT tunnels while |
| already using infrastructure from net/ipv4/ip_tunnel.c the |
| calculation of the path MTU in tnl_update_pmtu is incorrect. |
| This leads to unnecessary creation of MTU exceptions for any |
| flow going over a SIT tunnel. |
| |
| As SIT tunnels do not have a header themsevles other than their |
| transport (L3, L2) headers we're leaving hard_header_len set to zero |
| as tnl_update_pmtu is already taking care of the transport headers |
| sizes. |
| |
| This will also help avoiding unnecessary IPv6 GC runs and spinlock |
| contention seen when using SIT tunnels and for more than |
| net.ipv6.route.gc_thresh flows. |
| |
| Fixes: c54419321455 ("GRE: Refactor GRE tunneling code.") |
| Signed-off-by: Oliver Herms <oliver.peter.herms@gmail.com> |
| Acked-by: Willem de Bruijn <willemb@google.com> |
| Link: https://lore.kernel.org/r/20201103104133.GA1573211@tws |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/ipv6/sit.c | 2 -- |
| 1 file changed, 2 deletions(-) |
| |
| --- a/net/ipv6/sit.c |
| +++ b/net/ipv6/sit.c |
| @@ -1072,7 +1072,6 @@ static void ipip6_tunnel_bind_dev(struct |
| if (tdev && !netif_is_l3_master(tdev)) { |
| int t_hlen = tunnel->hlen + sizeof(struct iphdr); |
| |
| - dev->hard_header_len = tdev->hard_header_len + sizeof(struct iphdr); |
| dev->mtu = tdev->mtu - t_hlen; |
| if (dev->mtu < IPV6_MIN_MTU) |
| dev->mtu = IPV6_MIN_MTU; |
| @@ -1372,7 +1371,6 @@ static void ipip6_tunnel_setup(struct ne |
| dev->destructor = ipip6_dev_free; |
| |
| dev->type = ARPHRD_SIT; |
| - dev->hard_header_len = LL_MAX_HEADER + t_hlen; |
| dev->mtu = ETH_DATA_LEN - t_hlen; |
| dev->flags = IFF_NOARP; |
| netif_keep_dst(dev); |