Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8041243 authored by Cong Wang's avatar Cong Wang Committed by Greg Kroah-Hartman
Browse files

sit: update dev->needed_headroom in ipip6_tunnel_bind_dev()



[ Upstream commit c88f8d5cd95fd039cff95d682b8e71100c001df0 ]

When a tunnel device is bound with the underlying device, its
dev->needed_headroom needs to be updated properly. IPv4 tunnels
already do the same in ip_tunnel_bind_dev(). Otherwise we may
not have enough header room for skb, especially after commit
b17f709a ("gue: TX support for using remote checksum offload option").

Fixes: 32b8a8e5 ("sit: add IPv4 over IPv4 support")
Reported-by: default avatarPalash Oswal <oswalpalash@gmail.com>
Link: https://lore.kernel.org/netdev/CAGyP=7fDcSPKu6nttbGwt7RXzE3uyYxLjCSE97J64pRxJP8jPA@mail.gmail.com/


Cc: Kuniyuki Iwashima <kuniyu@amazon.com>
Cc: Eric Dumazet <edumazet@google.com>
Signed-off-by: default avatarCong Wang <cong.wang@bytedance.com>
Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
Reviewed-by: default avatarKuniyuki Iwashima <kuniyu@amazon.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent cc5fe387
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -1054,12 +1054,13 @@ static netdev_tx_t sit_tunnel_xmit(struct sk_buff *skb,

static void ipip6_tunnel_bind_dev(struct net_device *dev)
{
	struct ip_tunnel *tunnel = netdev_priv(dev);
	int t_hlen = tunnel->hlen + sizeof(struct iphdr);
	struct net_device *tdev = NULL;
	struct ip_tunnel *tunnel;
	int hlen = LL_MAX_HEADER;
	const struct iphdr *iph;
	struct flowi4 fl4;

	tunnel = netdev_priv(dev);
	iph = &tunnel->parms.iph;

	if (iph->daddr) {
@@ -1082,14 +1083,15 @@ static void ipip6_tunnel_bind_dev(struct net_device *dev)
		tdev = __dev_get_by_index(tunnel->net, tunnel->parms.link);

	if (tdev && !netif_is_l3_master(tdev)) {
		int t_hlen = tunnel->hlen + sizeof(struct iphdr);
		int mtu;

		mtu = tdev->mtu - t_hlen;
		if (mtu < IPV6_MIN_MTU)
			mtu = IPV6_MIN_MTU;
		WRITE_ONCE(dev->mtu, mtu);
		hlen = tdev->hard_header_len + tdev->needed_headroom;
	}
	dev->needed_headroom = t_hlen + hlen;
}

static void ipip6_tunnel_update(struct ip_tunnel *t, struct ip_tunnel_parm *p,