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