* [RFC PATCH net v2] ipv4: ip_gre: Fix drops of small packets in ipgre_xmit
@ 2024-09-24 1:30 Anton Danilov
2024-09-24 11:41 ` Eric Dumazet
0 siblings, 1 reply; 2+ messages in thread
From: Anton Danilov @ 2024-09-24 1:30 UTC (permalink / raw)
To: netdev
Cc: Anton Danilov, David S. Miller, David Ahern, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Shigeru Yoshida, Suman Ghosh,
linux-kernel
Regression Description:
Depending on the GRE tunnel device options, small packets are being
dropped. This occurs because the pskb_network_may_pull function fails due
to insufficient space in the network header. For example, if only the key
option is specified for the tunnel device, packets of sizes up to 27
(including the IPv4 header itself) will be dropped. This affects both
locally originated and forwarded packets in the DMVPN-like setups.
How to reproduce (for local originated packets):
ip link add dev gre1 type gre ikey 1.9.8.4 okey 1.9.8.4 \
local <your-ip> remote 0.0.0.0
ip link set mtu 1400 dev gre1
ip link set up dev gre1
ip address add 192.168.13.1/24 dev gre1
ip neighbor add 192.168.13.2 lladdr <remote-ip> dev gre1
ping -s 1374 -c 10 192.168.13.2
tcpdump -vni gre1
tcpdump -vni <your-ext-iface> 'ip proto 47'
ip -s -s -d link show dev gre1
Solution:
Use the pskb_may_pull function instead the pskb_network_may_pull.
Fixes: 80d875cfc9d3 ("ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()")
Signed-off-by: Anton Danilov <littlesmilingcloud@gmail.com>
---
v1 -> v2 :
- Fix the reproduce commands
- Move out the 'tnl_params' assignment line to the more suitable place
with Eric's suggestion
https://lore.kernel.org/netdev/CANn89iJoMcxe6xAOE=QGfqmOa1p+_ssSr_2y4KUJr-Qap3xk0Q@mail.gmail.com/
---
net/ipv4/ip_gre.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 5f6fd382af38..f1f31ebfc793 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -662,11 +662,11 @@ static netdev_tx_t ipgre_xmit(struct sk_buff *skb,
if (skb_cow_head(skb, 0))
goto free_skb;
- tnl_params = (const struct iphdr *)skb->data;
-
- if (!pskb_network_may_pull(skb, pull_len))
+ if (!pskb_may_pull(skb, pull_len))
goto free_skb;
+ tnl_params = (const struct iphdr *)skb->data;
+
/* ip_tunnel_xmit() needs skb->data pointing to gre header. */
skb_pull(skb, pull_len);
skb_reset_mac_header(skb);
--
2.39.2
^ permalink raw reply [flat|nested] 2+ messages in thread* Re: [RFC PATCH net v2] ipv4: ip_gre: Fix drops of small packets in ipgre_xmit
2024-09-24 1:30 [RFC PATCH net v2] ipv4: ip_gre: Fix drops of small packets in ipgre_xmit Anton Danilov
@ 2024-09-24 11:41 ` Eric Dumazet
0 siblings, 0 replies; 2+ messages in thread
From: Eric Dumazet @ 2024-09-24 11:41 UTC (permalink / raw)
To: Anton Danilov
Cc: netdev, David S. Miller, David Ahern, Jakub Kicinski,
Paolo Abeni, Shigeru Yoshida, Suman Ghosh, linux-kernel
On Tue, Sep 24, 2024 at 3:31 AM Anton Danilov
<littlesmilingcloud@gmail.com> wrote:
>
> Regression Description:
>
> Depending on the GRE tunnel device options, small packets are being
> dropped. This occurs because the pskb_network_may_pull function fails due
> to insufficient space in the network header.
I find this a bit confusing.
Perhaps explain that pskb_network_may_pull() is adding 20 extra bytes,
to the 28 needed bytes (20 for the IPv4 header, 8 bytes for GRE)
So, instead of making sure 28 bytes were present in skb->head, we were
requesting 48
bytes. For small packets, this was failing.
> For example, if only the key
> option is specified for the tunnel device, packets of sizes up to 27
> (including the IPv4 header itself) will be dropped. This affects both
> locally originated and forwarded packets in the DMVPN-like setups.
>
> How to reproduce (for local originated packets):
>
> ip link add dev gre1 type gre ikey 1.9.8.4 okey 1.9.8.4 \
> local <your-ip> remote 0.0.0.0
>
> ip link set mtu 1400 dev gre1
> ip link set up dev gre1
> ip address add 192.168.13.1/24 dev gre1
> ip neighbor add 192.168.13.2 lladdr <remote-ip> dev gre1
> ping -s 1374 -c 10 192.168.13.2
> tcpdump -vni gre1
> tcpdump -vni <your-ext-iface> 'ip proto 47'
> ip -s -s -d link show dev gre1
>
> Solution:
>
> Use the pskb_may_pull function instead the pskb_network_may_pull.
>
> Fixes: 80d875cfc9d3 ("ipv4: ip_gre: Avoid skb_pull() failure in ipgre_xmit()")
> Signed-off-by: Anton Danilov <littlesmilingcloud@gmail.com>
Please send a V3 without the RFC tag in the title.
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-09-24 11:41 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-09-24 1:30 [RFC PATCH net v2] ipv4: ip_gre: Fix drops of small packets in ipgre_xmit Anton Danilov
2024-09-24 11:41 ` Eric Dumazet
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®