Skip to content

Commit

Permalink
Merge branch 'inet-ping-remove-extra-skb_clone-consume_skb'
Browse files Browse the repository at this point in the history
Eric Dumazet says:

====================
inet: ping: remove extra skb_clone()/consume_skb()

First patch in the series moves ICMP_EXT_ECHOREPLY handling in icmp_rcv()
to prepare the second patch.

The second patch removes one skb_clone()/consume_skb() pair
when processing ICMP_EXT_REPLY packets. Some people
use hundreds of "ping -fq ..." to stress hosts :)
====================

Link: https://patch.msgid.link/20250226183437.1457318-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Jakub Kicinski committed Feb 28, 2025
2 parents 8e7e3d9 + a7e3820 commit 090119a
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 36 deletions.
33 changes: 17 additions & 16 deletions net/ipv4/icmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -1248,22 +1248,6 @@ int icmp_rcv(struct sk_buff *skb)
goto reason_check;
}

if (icmph->type == ICMP_EXT_ECHOREPLY) {
reason = ping_rcv(skb);
goto reason_check;
}

/*
* 18 is the highest 'known' ICMP type. Anything else is a mystery
*
* RFC 1122: 3.2.2 Unknown ICMP messages types MUST be silently
* discarded.
*/
if (icmph->type > NR_ICMP_TYPES) {
reason = SKB_DROP_REASON_UNHANDLED_PROTO;
goto error;
}

/*
* Parse the ICMP message
*/
Expand All @@ -1290,6 +1274,23 @@ int icmp_rcv(struct sk_buff *skb)
}
}

if (icmph->type == ICMP_EXT_ECHOREPLY ||
icmph->type == ICMP_ECHOREPLY) {
reason = ping_rcv(skb);
return reason ? NET_RX_DROP : NET_RX_SUCCESS;
}

/*
* 18 is the highest 'known' ICMP type. Anything else is a mystery
*
* RFC 1122: 3.2.2 Unknown ICMP messages types MUST be silently
* discarded.
*/
if (icmph->type > NR_ICMP_TYPES) {
reason = SKB_DROP_REASON_UNHANDLED_PROTO;
goto error;
}

reason = icmp_pointers[icmph->type].handler(skb);
reason_check:
if (!reason) {
Expand Down
20 changes: 5 additions & 15 deletions net/ipv4/ping.c
Original file line number Diff line number Diff line change
Expand Up @@ -966,10 +966,9 @@ EXPORT_SYMBOL_GPL(ping_queue_rcv_skb);

enum skb_drop_reason ping_rcv(struct sk_buff *skb)
{
enum skb_drop_reason reason = SKB_DROP_REASON_NO_SOCKET;
struct sock *sk;
struct net *net = dev_net(skb->dev);
struct icmphdr *icmph = icmp_hdr(skb);
struct sock *sk;

/* We assume the packet has already been checked by icmp_rcv */

Expand All @@ -980,20 +979,11 @@ enum skb_drop_reason ping_rcv(struct sk_buff *skb)
skb_push(skb, skb->data - (u8 *)icmph);

sk = ping_lookup(net, skb, ntohs(icmph->un.echo.id));
if (sk) {
struct sk_buff *skb2 = skb_clone(skb, GFP_ATOMIC);

pr_debug("rcv on socket %p\n", sk);
if (skb2)
reason = __ping_queue_rcv_skb(sk, skb2);
else
reason = SKB_DROP_REASON_NOMEM;
}

if (reason)
pr_debug("no socket, dropping\n");
if (sk)
return __ping_queue_rcv_skb(sk, skb);

return reason;
kfree_skb_reason(skb, SKB_DROP_REASON_NO_SOCKET);
return SKB_DROP_REASON_NO_SOCKET;
}
EXPORT_SYMBOL_GPL(ping_rcv);

Expand Down
7 changes: 2 additions & 5 deletions net/ipv6/icmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -957,12 +957,9 @@ static int icmpv6_rcv(struct sk_buff *skb)
break;

case ICMPV6_ECHO_REPLY:
reason = ping_rcv(skb);
break;

case ICMPV6_EXT_ECHO_REPLY:
reason = ping_rcv(skb);
break;
ping_rcv(skb);
return 0;

case ICMPV6_PKT_TOOBIG:
/* BUGGG_FUTURE: if packet contains rthdr, we cannot update
Expand Down

0 comments on commit 090119a

Please sign in to comment.