Branch data 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[0]; /* 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 : : static inline bool reuseport_has_conns(struct sock *sk, bool set) 42 : : { 43 : : struct sock_reuseport *reuse; 44 : : bool ret = false; 45 : : 46 : : rcu_read_lock(); 47 : 1035 : reuse = rcu_dereference(sk->sk_reuseport_cb); 48 [ - + ]: 1035 : if (reuse) { 49 : : if (set) 50 : 0 : reuse->has_conns = 1; 51 : 0 : ret = reuse->has_conns; 52 : : } 53 : : rcu_read_unlock(); 54 : : 55 : : return ret; 56 : : } 57 : : 58 : : int reuseport_get_id(struct sock_reuseport *reuse); 59 : : 60 : : #endif /* _SOCK_REUSEPORT_H */