diff options
author | Jakub Kicinski <kuba@kernel.org> | 2024-03-11 20:37:53 -0700 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2024-03-11 20:38:36 -0700 |
commit | ed1f164038b50c5864aa85389f3ffd456f050cca (patch) | |
tree | f0f9d0fd52a798fbe3450d3d85795346411003a6 /net/ipv4 | |
parent | a318d3d54c44f9916cd77ad272083d4a4d68899b (diff) | |
parent | 84e95149bd341705f0eca6a7fcb955c548805002 (diff) | |
download | linux-ed1f164038b50c5864aa85389f3ffd456f050cca.tar.gz linux-ed1f164038b50c5864aa85389f3ffd456f050cca.tar.bz2 linux-ed1f164038b50c5864aa85389f3ffd456f050cca.zip |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
Merge in late fixes to prepare for the 6.9 net-next PR.
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/ip_tunnel.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c index d3ee6565fcfb..1b8d8ff9a237 100644 --- a/net/ipv4/ip_tunnel.c +++ b/net/ipv4/ip_tunnel.c @@ -377,7 +377,7 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, bool log_ecn_error) { const struct iphdr *iph = ip_hdr(skb); - int err; + int nh, err; #ifdef CONFIG_NET_IPGRE_BROADCAST if (ipv4_is_multicast(iph->daddr)) { @@ -403,8 +403,21 @@ int ip_tunnel_rcv(struct ip_tunnel *tunnel, struct sk_buff *skb, tunnel->i_seqno = ntohl(tpi->seq) + 1; } + /* Save offset of outer header relative to skb->head, + * because we are going to reset the network header to the inner header + * and might change skb->head. + */ + nh = skb_network_header(skb) - skb->head; + skb_set_network_header(skb, (tunnel->dev->type == ARPHRD_ETHER) ? ETH_HLEN : 0); + if (!pskb_inet_may_pull(skb)) { + DEV_STATS_INC(tunnel->dev, rx_length_errors); + DEV_STATS_INC(tunnel->dev, rx_errors); + goto drop; + } + iph = (struct iphdr *)(skb->head + nh); + err = IP_ECN_decapsulate(iph, skb); if (unlikely(err)) { if (log_ecn_error) |