From: Lorenz Bauer lmb@isovalent.com Date: Wed, 28 Jun 2023 10:48:21 +0100
diff --git a/include/net/inet6_hashtables.h b/include/net/inet6_hashtables.h index a6722d6ef80f..7d677b89f269 100644 --- a/include/net/inet6_hashtables.h +++ b/include/net/inet6_hashtables.h @@ -103,6 +103,46 @@ static inline struct sock *__inet6_lookup(struct net *net, daddr, hnum, dif, sdif); } +static inline +struct sock *inet6_steal_sock(struct net *net, struct sk_buff *skb, int doff,
const struct in6_addr *saddr, const __be16 sport,
const struct in6_addr *daddr, const __be16 dport,
bool *refcounted, inet6_ehashfn_t *ehashfn)
+{
- struct sock *sk, *reuse_sk;
- bool prefetched;
- sk = skb_steal_sock(skb, refcounted, &prefetched);
- if (!sk)
return NULL;
- if (!prefetched)
return sk;
- if (sk->sk_protocol == IPPROTO_TCP) {
if (sk->sk_state != TCP_LISTEN)
return sk;
- } else if (sk->sk_protocol == IPPROTO_UDP) {
if (sk->sk_state != TCP_CLOSE)
return sk;
- } else {
return sk;
- }
- reuse_sk = inet6_lookup_reuseport(net, sk, skb, doff,
saddr, sport, daddr, ntohs(dport),
ehashfn);
- if (!reuse_sk || reuse_sk == sk)
return sk;
- /* We've chosen a new reuseport sock which is never refcounted. This
* implies that sk also isn't refcounted.
*/
- WARN_ON_ONCE(*refcounted);
One more nit.
WARN_ON_ONCE() should be tested before inet6?_lookup_reuseport() not to miss the !reuse_sk case.
- return reuse_sk;
+}