xref: /linux/tools/testing/selftests/bpf/progs/ksock_common.h (revision 5a8cd539ac19f7a68e68e1d25ef9ca2ff55b8500)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright (c) 2026 Isovalent */
3 
4 #ifndef _KSOCK_COMMON_H
5 #define _KSOCK_COMMON_H
6 
7 #include "errno.h"
8 
9 #define SOCK_DGRAM	2
10 #define IPPROTO_UDP	17
11 
12 struct bpf_ksock *bpf_ksock_create(const struct bpf_ksock_create_opts *opts,
13 				   u32 opts__sz, int *err__uninit) __ksym;
14 int bpf_ksock_connect(struct bpf_ksock *ks, const union bpf_ksock_addr *addr,
15 		      u32 addr__sz) __ksym;
16 struct bpf_ksock *bpf_ksock_acquire(struct bpf_ksock *ks) __ksym;
17 void bpf_ksock_release(struct bpf_ksock *ks) __ksym;
18 int bpf_ksock_send(struct bpf_ksock *ks, const void *data, u32 data__sz) __ksym;
19 void bpf_rcu_read_lock(void) __ksym;
20 void bpf_rcu_read_unlock(void) __ksym;
21 
22 struct __ksock_ctx_value {
23 	struct bpf_ksock __kptr * ctx;
24 };
25 
26 struct {
27 	__uint(type, BPF_MAP_TYPE_ARRAY);
28 	__type(key, int);
29 	__type(value, struct __ksock_ctx_value);
30 	__uint(max_entries, 1);
31 } __ksock_ctx_map SEC(".maps");
32 
ksock_ctx_value_lookup(void)33 static inline struct __ksock_ctx_value *ksock_ctx_value_lookup(void)
34 {
35 	u32 key = 0;
36 
37 	return bpf_map_lookup_elem(&__ksock_ctx_map, &key);
38 }
39 
ksock_ctx_get(void)40 static inline struct bpf_ksock *ksock_ctx_get(void)
41 {
42 	struct __ksock_ctx_value *v;
43 	struct bpf_ksock *ks = NULL, *tmp;
44 
45 	v = ksock_ctx_value_lookup();
46 	if (!v)
47 		return NULL;
48 
49 	bpf_rcu_read_lock();
50 	tmp = v->ctx;
51 	if (tmp)
52 		ks = bpf_ksock_acquire(tmp);
53 	bpf_rcu_read_unlock();
54 
55 	return ks;
56 }
57 
ksock_ctx_insert(struct bpf_ksock * ctx)58 static inline int ksock_ctx_insert(struct bpf_ksock *ctx)
59 {
60 	struct __ksock_ctx_value *v;
61 	struct bpf_ksock *old;
62 
63 	v = ksock_ctx_value_lookup();
64 	if (!v) {
65 		bpf_ksock_release(ctx);
66 		return -ENOENT;
67 	}
68 
69 	old = bpf_kptr_xchg(&v->ctx, ctx);
70 	if (old) {
71 		bpf_ksock_release(old);
72 		return -EEXIST;
73 	}
74 
75 	return 0;
76 }
77 
78 #endif /* _KSOCK_COMMON_H */
79