| /* SPDX-License-Identifier: GPL-2.0 */ |
| /* Copyright (c) 2026 Isovalent */ |
| |
| #ifndef _KSOCK_COMMON_H |
| #define _KSOCK_COMMON_H |
| |
| #include "errno.h" |
| |
| #define SOCK_DGRAM 2 |
| #define IPPROTO_UDP 17 |
| |
| struct bpf_ksock *bpf_ksock_create(const struct bpf_ksock_create_opts *opts, |
| u32 opts__sz, int *err__uninit) __ksym; |
| int bpf_ksock_connect(struct bpf_ksock *ks, const union bpf_ksock_addr *addr, |
| u32 addr__sz) __ksym; |
| struct bpf_ksock *bpf_ksock_acquire(struct bpf_ksock *ks) __ksym; |
| void bpf_ksock_release(struct bpf_ksock *ks) __ksym; |
| int bpf_ksock_send(struct bpf_ksock *ks, const void *data, u32 data__sz) __ksym; |
| void bpf_rcu_read_lock(void) __ksym; |
| void bpf_rcu_read_unlock(void) __ksym; |
| |
| struct __ksock_ctx_value { |
| struct bpf_ksock __kptr * ctx; |
| }; |
| |
| struct { |
| __uint(type, BPF_MAP_TYPE_ARRAY); |
| __type(key, int); |
| __type(value, struct __ksock_ctx_value); |
| __uint(max_entries, 1); |
| } __ksock_ctx_map SEC(".maps"); |
| |
| static inline struct __ksock_ctx_value *ksock_ctx_value_lookup(void) |
| { |
| u32 key = 0; |
| |
| return bpf_map_lookup_elem(&__ksock_ctx_map, &key); |
| } |
| |
| static inline struct bpf_ksock *ksock_ctx_get(void) |
| { |
| struct __ksock_ctx_value *v; |
| struct bpf_ksock *ks = NULL, *tmp; |
| |
| v = ksock_ctx_value_lookup(); |
| if (!v) |
| return NULL; |
| |
| bpf_rcu_read_lock(); |
| tmp = v->ctx; |
| if (tmp) |
| ks = bpf_ksock_acquire(tmp); |
| bpf_rcu_read_unlock(); |
| |
| return ks; |
| } |
| |
| static inline int ksock_ctx_insert(struct bpf_ksock *ctx) |
| { |
| struct __ksock_ctx_value *v; |
| struct bpf_ksock *old; |
| |
| v = ksock_ctx_value_lookup(); |
| if (!v) { |
| bpf_ksock_release(ctx); |
| return -ENOENT; |
| } |
| |
| old = bpf_kptr_xchg(&v->ctx, ctx); |
| if (old) { |
| bpf_ksock_release(old); |
| return -EEXIST; |
| } |
| |
| return 0; |
| } |
| |
| #endif /* _KSOCK_COMMON_H */ |