diff options
author | Eric Dumazet <edumazet@google.com> | 2024-03-07 16:29:43 +0000 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2024-03-08 11:39:29 -0800 |
commit | 026763ece881b4c636173c25d012cde085689027 (patch) | |
tree | 5e99a3e0fec491ad175a3343d85d53a6ae36a6a1 /net | |
parent | 5d9b7cb383bb3228d72066c15206299858214f92 (diff) |
ipv6: raw: check sk->sk_rcvbuf earlier
There is no point cloning an skb and having to free the clone
if the receive queue of the raw socket is full.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reviewed-by: Willem de Bruijn <willemb@google.com>
Link: https://lore.kernel.org/r/20240307162943.2523817-1-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'net')
-rw-r--r-- | net/ipv6/raw.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/net/ipv6/raw.c b/net/ipv6/raw.c index 779274055abf..ca49e6617afa 100644 --- a/net/ipv6/raw.c +++ b/net/ipv6/raw.c @@ -160,6 +160,13 @@ static bool ipv6_raw_deliver(struct sk_buff *skb, int nexthdr) if (!raw_v6_match(net, sk, nexthdr, daddr, saddr, inet6_iif(skb), inet6_sdif(skb))) continue; + + if (atomic_read(&sk->sk_rmem_alloc) >= + READ_ONCE(sk->sk_rcvbuf)) { + atomic_inc(&sk->sk_drops); + continue; + } + delivered = true; switch (nexthdr) { case IPPROTO_ICMPV6: |