Line data Source code
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 : /* The last synq overflow event timestamp of this 19 : * reuse->socks[] group. 20 : */ 21 : unsigned int synq_overflow_ts; 22 : /* ID stays the same even after the size of socks[] grows. */ 23 : unsigned int reuseport_id; 24 : unsigned int bind_inany:1; 25 : unsigned int has_conns:1; 26 : struct bpf_prog __rcu *prog; /* optional BPF sock selector */ 27 : struct sock *socks[]; /* array of sock pointers */ 28 : }; 29 : 30 : extern int reuseport_alloc(struct sock *sk, bool bind_inany); 31 : extern int reuseport_add_sock(struct sock *sk, struct sock *sk2, 32 : bool bind_inany); 33 : extern void reuseport_detach_sock(struct sock *sk); 34 : extern struct sock *reuseport_select_sock(struct sock *sk, 35 : u32 hash, 36 : struct sk_buff *skb, 37 : int hdr_len); 38 : extern int reuseport_attach_prog(struct sock *sk, struct bpf_prog *prog); 39 : extern int reuseport_detach_prog(struct sock *sk); 40 : 41 13 : static inline bool reuseport_has_conns(struct sock *sk, bool set) 42 : { 43 13 : struct sock_reuseport *reuse; 44 13 : bool ret = false; 45 : 46 13 : rcu_read_lock(); 47 13 : reuse = rcu_dereference(sk->sk_reuseport_cb); 48 13 : if (reuse) { 49 0 : if (set) 50 0 : reuse->has_conns = 1; 51 0 : ret = reuse->has_conns; 52 : } 53 13 : rcu_read_unlock(); 54 : 55 13 : return ret; 56 : } 57 : 58 : #endif /* _SOCK_REUSEPORT_H */