1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _SOCK_REUSEPORT_H
3 #define _SOCK_REUSEPORT_H
4 
5 #include <linux/filter.h>
6 #include <linux/skbuff.h>
7 #include <linux/types.h>
8 #include <linux/spinlock.h>
9 #include <net/sock.h>
10 
11 extern spinlock_t reuseport_lock;
12 
13 struct sock_reuseport {
14 	struct rcu_head		rcu;
15 
16 	u16			max_socks;		/* length of socks */
17 	u16			num_socks;		/* elements in socks */
18 	u16			num_closed_socks;	/* closed elements in socks */
19 	/* The last synq overflow event timestamp of this
20 	 * reuse->socks[] group.
21 	 */
22 	unsigned int		synq_overflow_ts;
23 	/* ID stays the same even after the size of socks[] grows. */
24 	unsigned int		reuseport_id;
25 	unsigned int		bind_inany:1;
26 	unsigned int		has_conns:1;
27 	struct bpf_prog __rcu	*prog;		/* optional BPF sock selector */
28 	struct sock		*socks[];	/* array of sock pointers */
29 };
30 
31 extern int reuseport_alloc(struct sock *sk, bool bind_inany);
32 extern int reuseport_add_sock(struct sock *sk, struct sock *sk2,
33 			      bool bind_inany);
34 extern void reuseport_detach_sock(struct sock *sk);
35 void reuseport_stop_listen_sock(struct sock *sk);
36 extern struct sock *reuseport_select_sock(struct sock *sk,
37 					  u32 hash,
38 					  struct sk_buff *skb,
39 					  int hdr_len);
40 struct sock *reuseport_migrate_sock(struct sock *sk,
41 				    struct sock *migrating_sk,
42 				    struct sk_buff *skb);
43 extern int reuseport_attach_prog(struct sock *sk, struct bpf_prog *prog);
44 extern int reuseport_detach_prog(struct sock *sk);
45 
reuseport_has_conns(struct sock * sk,bool set)46 static inline bool reuseport_has_conns(struct sock *sk, bool set)
47 {
48 	struct sock_reuseport *reuse;
49 	bool ret = false;
50 
51 	rcu_read_lock();
52 	reuse = rcu_dereference(sk->sk_reuseport_cb);
53 	if (reuse) {
54 		if (set)
55 			reuse->has_conns = 1;
56 		ret = reuse->has_conns;
57 	}
58 	rcu_read_unlock();
59 
60 	return ret;
61 }
62 
63 #endif  /* _SOCK_REUSEPORT_H */
64