--- /dev/null
+From 9990ddf47d4168088e2246c3d418bf526e40830d Mon Sep 17 00:00:00 2001
+From: Menglong Dong <menglong8.dong@gmail.com>
+Date: Wed, 9 Oct 2024 10:28:21 +0800
+Subject: net: tunnel: make skb_vlan_inet_prepare() return drop reasons
+
+From: Menglong Dong <menglong8.dong@gmail.com>
+
+commit 9990ddf47d4168088e2246c3d418bf526e40830d upstream.
+
+Make skb_vlan_inet_prepare return the skb drop reasons, which is just
+what pskb_may_pull_reason() returns. Meanwhile, adjust all the call of
+it.
+
+Signed-off-by: Menglong Dong <dongml2@chinatelecom.cn>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Cc: Eric Dumazet <edumazet@google.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/bareudp.c | 4 ++--
+ drivers/net/geneve.c | 4 ++--
+ drivers/net/vxlan/vxlan_core.c | 2 +-
+ include/net/ip_tunnels.h | 13 ++++++++-----
+ 4 files changed, 13 insertions(+), 10 deletions(-)
+
+--- a/drivers/net/bareudp.c
++++ b/drivers/net/bareudp.c
+@@ -317,7 +317,7 @@ static int bareudp_xmit_skb(struct sk_bu
+ __be32 saddr;
+ int err;
+
+- if (!skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
++ if (skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
+ return -EINVAL;
+
+ if (!sock)
+@@ -387,7 +387,7 @@ static int bareudp6_xmit_skb(struct sk_b
+ __be16 sport;
+ int err;
+
+- if (!skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
++ if (skb_vlan_inet_prepare(skb, skb->protocol != htons(ETH_P_TEB)))
+ return -EINVAL;
+
+ if (!sock)
+--- a/drivers/net/geneve.c
++++ b/drivers/net/geneve.c
+@@ -827,7 +827,7 @@ static int geneve_xmit_skb(struct sk_buf
+ __be16 sport;
+ int err;
+
+- if (!skb_vlan_inet_prepare(skb, inner_proto_inherit))
++ if (skb_vlan_inet_prepare(skb, inner_proto_inherit))
+ return -EINVAL;
+
+ if (!gs4)
+@@ -937,7 +937,7 @@ static int geneve6_xmit_skb(struct sk_bu
+ __be16 sport;
+ int err;
+
+- if (!skb_vlan_inet_prepare(skb, inner_proto_inherit))
++ if (skb_vlan_inet_prepare(skb, inner_proto_inherit))
+ return -EINVAL;
+
+ if (!gs6)
+--- a/drivers/net/vxlan/vxlan_core.c
++++ b/drivers/net/vxlan/vxlan_core.c
+@@ -2381,7 +2381,7 @@ void vxlan_xmit_one(struct sk_buff *skb,
+ __be32 vni = 0;
+
+ no_eth_encap = flags & VXLAN_F_GPE && skb->protocol != htons(ETH_P_TEB);
+- if (!skb_vlan_inet_prepare(skb, no_eth_encap))
++ if (skb_vlan_inet_prepare(skb, no_eth_encap))
+ goto drop;
+
+ old_iph = ip_hdr(skb);
+--- a/include/net/ip_tunnels.h
++++ b/include/net/ip_tunnels.h
+@@ -467,11 +467,12 @@ static inline bool pskb_inet_may_pull(st
+
+ /* Variant of pskb_inet_may_pull().
+ */
+-static inline bool skb_vlan_inet_prepare(struct sk_buff *skb,
+- bool inner_proto_inherit)
++static inline enum skb_drop_reason
++skb_vlan_inet_prepare(struct sk_buff *skb, bool inner_proto_inherit)
+ {
+ int nhlen = 0, maclen = inner_proto_inherit ? 0 : ETH_HLEN;
+ __be16 type = skb->protocol;
++ enum skb_drop_reason reason;
+
+ /* Essentially this is skb_protocol(skb, true)
+ * And we get MAC len.
+@@ -492,11 +493,13 @@ static inline bool skb_vlan_inet_prepare
+ /* For ETH_P_IPV6/ETH_P_IP we make sure to pull
+ * a base network header in skb->head.
+ */
+- if (!pskb_may_pull(skb, maclen + nhlen))
+- return false;
++ reason = pskb_may_pull_reason(skb, maclen + nhlen);
++ if (reason)
++ return reason;
+
+ skb_set_network_header(skb, maclen);
+- return true;
++
++ return SKB_NOT_DROPPED_YET;
+ }
+
+ static inline int ip_encap_hlen(struct ip_tunnel_encap *e)