• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Alan-Jowett / ebpf-verifier / 18658728485

18 Oct 2025 05:56PM UTC coverage: 88.47% (+0.4%) from 88.11%
18658728485

push

github

elazarg
Bump external/bpf_conformance from `8f3c2fe` to `6fa6a20`

Bumps [external/bpf_conformance](https://github.com/Alan-Jowett/bpf_conformance) from `8f3c2fe` to `6fa6a20`.
- [Release notes](https://github.com/Alan-Jowett/bpf_conformance/releases)
- [Commits](https://github.com/Alan-Jowett/bpf_conformance/compare/8f3c2fe88...<a class=hub.com/Alan-Jowett/ebpf-verifier/commit/6fa6a20ac6fd3612ea9338312a67408687b9f06b">6fa6a20ac)

---
updated-dependencies:
- dependency-name: external/bpf_conformance
  dependency-version: 6fa6a20ac6fd3612ea9338312a67408687b9f06b
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>

8954 of 10121 relevant lines covered (88.47%)

18293099.16 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

91.67
/src/linux/gpl/spec_prototypes.cpp
1
#include "platform.hpp"
2
#include "spec_type_descriptors.hpp"
3

4
namespace prevail {
5
// Unsupported or partially supported return types
6

7
// Returns pointer to struct sock_common or NULL on lookup failure.
8
// Used by: bpf_sk_lookup_tcp(), bpf_skc_lookup_tcp()
9
// Requires: BTF type information for socket structures
10
#define EBPF_RETURN_TYPE_PTR_TO_SOCK_COMMON_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
11

12
// Returns pointer to struct socket (full socket) or NULL.
13
// Used by: bpf_sk_lookup_udp(), bpf_sk_fullsock()
14
// Requires: BTF type information, socket state validation
15
#define EBPF_RETURN_TYPE_PTR_TO_SOCKET_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
16

17
// Returns pointer to struct tcp_sock (TCP-specific socket) or NULL.
18
// Used by: bpf_tcp_sock(), bpf_get_listener_sock()
19
// Requires: BTF type information, TCP socket casting validation
20
#define EBPF_RETURN_TYPE_PTR_TO_TCP_SOCKET_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
21

22
// Returns pointer to dynamically allocated memory or NULL.
23
// Used by: bpf_ringbuf_reserve()
24
// Requires: Memory allocation tracking, release validation
25
// Note: Returned memory must be submitted or discarded, enforced by verifier
26
#define EBPF_RETURN_TYPE_PTR_TO_ALLOC_MEM_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
27

28
// Returns pointer to kernel object identified by BTF type ID, or NULL.
29
// Used by: bpf_skc_to_tcp_sock(), bpf_skc_to_tcp6_sock(), bpf_sock_from_file()
30
// Requires: BTF type information, dynamic type casting validation
31
// Note: Type ID determines what kernel structure is pointed to
32
#define EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
33

34
// Returns pointer to either generic memory or BTF-identified object, or NULL.
35
// Used by: bpf_dynptr_data(), bpf_per_cpu_ptr()
36
// Requires: BTF for type identification, memory bounds tracking
37
// Note: Dual nature allows flexibility in return type
38
#define EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
39

40
// Returns non-NULL pointer to kernel object identified by BTF type ID.
41
// Used by: bpf_get_current_task_btf(), bpf_task_pt_regs()
42
// Requires: BTF type information
43
// Note: Unlike _OR_NULL variant, verifier can assume non-null
44
#define EBPF_RETURN_TYPE_PTR_TO_BTF_ID EBPF_RETURN_TYPE_UNSUPPORTED
45

46
// Returns non-NULL pointer to either generic memory or BTF-identified object.
47
// Used by: bpf_this_cpu_ptr()
48
// Requires: BTF for type identification when returning BTF object
49
// Note: Always succeeds, never returns NULL
50
#define EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID EBPF_RETURN_TYPE_UNSUPPORTED
51

52
// Alias: Treat non-nullable map value return as nullable for compatibility.
53
// Used by: bpf_get_local_storage()
54
// Reason: Simplifies implementation - both map value return types use same code path
55
// Note: Helper actually never returns NULL, but type system treats as nullable
56
#define EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL
57

58
// Unsupported or partially supported argument types
59

60
// Pointer to struct sock_common identified by BTF.
61
// Used by: bpf_sk_release(), bpf_sk_cgroup_id(), bpf_tcp_check_syncookie()
62
// Requires: BTF type information, socket pointer validation
63
// Note: Base socket type that other socket types derive from
64
#define EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON EBPF_ARGUMENT_TYPE_UNSUPPORTED
65

66
// Pointer to struct bpf_spin_lock within a map value.
67
// Used by: bpf_spin_lock(), bpf_spin_unlock()
68
// Requires: BTF to locate lock field, 4-byte alignment validation
69
// Note: Lock must be at top level of map value struct, cannot be nested
70
#define EBPF_ARGUMENT_TYPE_PTR_TO_SPIN_LOCK EBPF_ARGUMENT_TYPE_UNSUPPORTED
71

72
// Pointer to struct sock_common (non-BTF variant).
73
// Used by: bpf_sk_fullsock(), bpf_tcp_sock(), bpf_get_listener_sock()
74
// Requires: Socket type validation, state checking
75
// Note: Less type-safe than PTR_TO_BTF_ID_SOCK_COMMON
76
#define EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON EBPF_ARGUMENT_TYPE_UNSUPPORTED
77

78
// Pointer to kernel object identified by BTF type ID.
79
// Used by: bpf_task_storage_get(), bpf_inode_storage_get(), bpf_tcp_send_ack()
80
// Requires: BTF type information, type-specific validation
81
// Note: Generic BTF pointer - actual type determined by helper's BTF ID specification
82
#define EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID EBPF_ARGUMENT_TYPE_UNSUPPORTED
83

84
// Pointer to long integer for output.
85
// Used by: bpf_strtol(), bpf_strtoul(), bpf_get_func_arg(), bpf_get_func_ret()
86
// Requires: Writable memory validation, proper alignment (8 bytes)
87
// Note: Output parameter for functions that return long values
88
#define EBPF_ARGUMENT_TYPE_PTR_TO_LONG EBPF_ARGUMENT_TYPE_UNSUPPORTED
89

90
// Pointer to int for output.
91
// Used by: bpf_check_mtu() (for mtu_len parameter)
92
// Requires: Writable memory validation, proper alignment (4 bytes)
93
// Note: Output parameter for functions that return int values
94
#define EBPF_ARGUMENT_TYPE_PTR_TO_INT EBPF_ARGUMENT_TYPE_UNSUPPORTED
95

96
// Pointer to constant null-terminated string in read-only memory.
97
// Used by: bpf_strncmp(), bpf_snprintf() (format string)
98
// Requires: Read-only memory validation, null termination verification
99
// Note: String must be compile-time constant or from read-only map
100
#define EBPF_ARGUMENT_TYPE_PTR_TO_CONST_STR EBPF_ARGUMENT_TYPE_UNSUPPORTED
101

102
// Pointer to a static BPF function for callbacks.
103
// Used by: bpf_for_each_map_elem(), bpf_loop(), bpf_timer_set_callback(), bpf_find_vma()
104
// Requires: Function signature validation, static function verification
105
// Note: Function must be in same BPF program, cannot be helper or external function
106
#define EBPF_ARGUMENT_TYPE_PTR_TO_FUNC EBPF_ARGUMENT_TYPE_UNSUPPORTED
107

108
// Pointer to stack memory, NULL allowed (optional context for callbacks).
109
// Used by: bpf_for_each_map_elem(), bpf_loop(), bpf_find_vma() (callback_ctx)
110
// Requires: Stack bounds validation when non-NULL
111
// Note: Typically used to pass optional context to callback functions
112
#define EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL EBPF_ARGUMENT_TYPE_UNSUPPORTED
113

114
// Constant allocation size, zero allowed (for dynamic memory allocation).
115
// Used by: bpf_ringbuf_reserve() (size parameter)
116
// Requires: Compile-time constant or bounded value, zero is valid (allocation fails gracefully)
117
// Note: Used to reserve variable-sized memory chunks
118
#define EBPF_ARGUMENT_TYPE_CONST_ALLOC_SIZE_OR_ZERO EBPF_ARGUMENT_TYPE_UNSUPPORTED
119

120
// Pointer to previously allocated memory (for release operations).
121
// Used by: bpf_ringbuf_submit(), bpf_ringbuf_discard()
122
// Requires: Verification that pointer was from bpf_ringbuf_reserve()
123
// Note: Verifier tracks allocation/release pairing
124
#define EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM EBPF_ARGUMENT_TYPE_UNSUPPORTED
125

126
// Alias: Allow NULL map value pointers (for optional map value arguments).
127
// Used by: bpf_sk_storage_get() (value parameter when creating new entry)
128
// Reason: Simplifies handling - same validation as non-nullable, plus NULL check
129
// Note: NULL means "use zero-initialized value" for storage creation
130
#define EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE
131

132
// Pointer to struct bpf_timer within a map value.
133
// Used by: bpf_timer_init(), bpf_timer_set_callback(), bpf_timer_start(), bpf_timer_cancel()
134
// Requires: BTF to locate timer field, proper initialization tracking
135
// Note: Timer must be in map value, similar constraints to spin locks
136
#define EBPF_ARGUMENT_TYPE_PTR_TO_TIMER EBPF_ARGUMENT_TYPE_UNSUPPORTED
137

138
// Pointer to per-CPU BTF-identified object.
139
// Used by: bpf_per_cpu_ptr() returns this, bpf_this_cpu_ptr()
140
// Requires: BTF type information, per-CPU variable handling
141
// Note: Points to per-CPU copy of kernel variable
142
#define EBPF_ARGUMENT_TYPE_PTR_TO_PERCPU_BTF_ID EBPF_ARGUMENT_TYPE_UNSUPPORTED
143

144
// Alias: Modern name for read-only memory pointer.
145
// Reason: Naming consistency with kernel terminology (readonly vs readable)
146
// Note: Functionally identical to PTR_TO_READABLE_MEM
147
#define EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM
148

149
// Alias: Modern name for optional read-only memory pointer.
150
// Reason: Naming consistency with kernel terminology
151
// Note: Functionally identical to PTR_TO_READABLE_MEM_OR_NULL
152
#define EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM_OR_NULL EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL
153

154
// Alias: Uninitialized map value (output parameter for map operations).
155
// Used by: bpf_map_pop_elem(), bpf_map_peek_elem()
156
// Reason: Semantically identical to PTR_TO_MAP_VALUE - memory will be written
157
// Note: Indicates helper will initialize the memory (pop/peek operations)
158
#define EBPF_ARGUMENT_TYPE_PTR_TO_UNINIT_MAP_VALUE EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE
159

160
// Alias: Const-qualified map pointer (helper won't modify map structure).
161
// Used by: bpf_map_peek_elem(), bpf_ringbuf_query() (read-only map operations)
162
// Reason: Same validation as PTR_TO_MAP - const is semantic documentation
163
// Note: Indicates helper only reads map metadata, doesn't modify map
164
#define EBPF_ARGUMENT_TYPE_CONST_PTR_TO_MAP EBPF_ARGUMENT_TYPE_PTR_TO_MAP
165

166
const ebpf_context_descriptor_t g_sk_buff = sk_buff;
167
const ebpf_context_descriptor_t g_xdp_md = xdp_md;
168
const ebpf_context_descriptor_t g_sk_msg_md = sk_msg_md;
169
const ebpf_context_descriptor_t g_unspec_descr = unspec_descr;
170
const ebpf_context_descriptor_t g_cgroup_dev_descr = cgroup_dev_descr;
171
const ebpf_context_descriptor_t g_kprobe_descr = kprobe_descr;
172
const ebpf_context_descriptor_t g_tracepoint_descr = tracepoint_descr;
173
const ebpf_context_descriptor_t g_perf_event_descr = perf_event_descr;
174
const ebpf_context_descriptor_t g_cgroup_sock_descr = cgroup_sock_descr;
175
const ebpf_context_descriptor_t g_sock_ops_descr = sock_ops_descr;
176

177
// eBPF helpers are documented at the following links:
178
// https://github.com/iovisor/bpf-docs/blob/master/bpf_helpers.rst
179
// https://www.man7.org/linux/man-pages/man7/bpf-helpers.7.html
180

181
static constexpr EbpfHelperPrototype bpf_unspec_proto = {
182
    .name = "unspec",
183
    .return_type = EBPF_RETURN_TYPE_UNSUPPORTED,
184
};
185

186
constexpr EbpfHelperPrototype bpf_tail_call_proto = {
187
    .name = "tail_call",
188
    .return_type = EBPF_RETURN_TYPE_INTEGER_OR_NO_RETURN_IF_SUCCEED,
189
    .argument_type =
190
        {
191
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
192
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_OF_PROGRAMS,
193
            EBPF_ARGUMENT_TYPE_ANYTHING,
194
        },
195
};
196

197
static constexpr EbpfHelperPrototype bpf_override_return_proto = {
198
    .name = "override_return",
199
    .return_type = EBPF_RETURN_TYPE_INTEGER,
200
    .argument_type =
201
        {
202
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
203
            EBPF_ARGUMENT_TYPE_ANYTHING,
204
        },
205
};
206

207
static constexpr EbpfHelperPrototype bpf_probe_read_proto = {
208
    .name = "probe_read",
209
    .return_type = EBPF_RETURN_TYPE_INTEGER,
210
    .argument_type =
211
        {
212
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
213
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
214
            EBPF_ARGUMENT_TYPE_ANYTHING,
215
        },
216
};
217

218
static constexpr EbpfHelperPrototype bpf_probe_read_str_proto = {
219
    .name = "probe_read_str",
220
    .return_type = EBPF_RETURN_TYPE_INTEGER,
221
    .argument_type =
222
        {
223
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
224
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
225
            EBPF_ARGUMENT_TYPE_ANYTHING,
226
        },
227
};
228

229
static constexpr EbpfHelperPrototype bpf_probe_write_user_proto = {
230
    .name = "probe_write_user",
231
    .return_type = EBPF_RETURN_TYPE_INTEGER,
232
    .argument_type =
233
        {
234
            EBPF_ARGUMENT_TYPE_ANYTHING,
235
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
236
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
237
        },
238
};
239

240
static constexpr EbpfHelperPrototype bpf_trace_printk_proto = {
241
    .name = "trace_printk",
242
    .return_type = EBPF_RETURN_TYPE_INTEGER,
243
    .argument_type =
244
        {
245
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
246
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
247
        },
248
};
249

250
static constexpr EbpfHelperPrototype bpf_perf_event_read_proto = {
251
    .name = "perf_event_read",
252
    .return_type = EBPF_RETURN_TYPE_INTEGER,
253
    .argument_type =
254
        {
255
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
256
            EBPF_ARGUMENT_TYPE_ANYTHING,
257
        },
258
};
259

260
static constexpr EbpfHelperPrototype bpf_perf_event_read_value_proto = {
261
    .name = "perf_event_read_value",
262
    .return_type = EBPF_RETURN_TYPE_INTEGER,
263
    .argument_type =
264
        {
265
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
266
            EBPF_ARGUMENT_TYPE_ANYTHING,
267
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
268
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
269
        },
270
};
271

272
static constexpr EbpfHelperPrototype bpf_perf_event_output_proto = {
273
    .name = "perf_event_output",
274
    .return_type = EBPF_RETURN_TYPE_INTEGER,
275
    .argument_type =
276
        {
277
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
278
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
279
            EBPF_ARGUMENT_TYPE_ANYTHING,
280
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
281
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
282
        },
283
};
284

285
static constexpr EbpfHelperPrototype bpf_get_current_task_proto = {
286
    .name = "get_current_task",
287
    .return_type = EBPF_RETURN_TYPE_INTEGER,
288
};
289

290
static constexpr EbpfHelperPrototype bpf_current_task_under_cgroup_proto = {
291
    .name = "current_task_under_cgroup",
292
    .return_type = EBPF_RETURN_TYPE_INTEGER,
293
    .argument_type =
294
        {
295
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
296
            EBPF_ARGUMENT_TYPE_ANYTHING,
297
        },
298
};
299

300
static constexpr EbpfHelperPrototype bpf_perf_prog_read_value_proto = {
301
    .name = "perf_prog_read_value",
302
    .return_type = EBPF_RETURN_TYPE_INTEGER,
303
    .argument_type =
304
        {
305
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
306
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
307
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
308
        },
309
    .context_descriptor = &g_perf_event_descr,
310
};
311

312
static constexpr EbpfHelperPrototype bpf_map_lookup_elem_proto = {
313
    .name = "map_lookup_elem",
314
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
315
    .argument_type =
316
        {
317
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
318
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
319
            EBPF_ARGUMENT_TYPE_DONTCARE,
320
            EBPF_ARGUMENT_TYPE_DONTCARE,
321
            EBPF_ARGUMENT_TYPE_DONTCARE,
322
        },
323
};
324

325
static constexpr EbpfHelperPrototype bpf_map_update_elem_proto = {
326
    .name = "map_update_elem",
327
    .return_type = EBPF_RETURN_TYPE_INTEGER,
328
    .argument_type =
329
        {
330
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
331
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
332
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,
333
            EBPF_ARGUMENT_TYPE_ANYTHING,
334
            EBPF_ARGUMENT_TYPE_DONTCARE,
335
        },
336
};
337

338
static constexpr EbpfHelperPrototype bpf_map_delete_elem_proto = {
339
    .name = "map_delete_elem",
340
    .return_type = EBPF_RETURN_TYPE_INTEGER,
341
    .argument_type =
342
        {
343
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
344
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
345
            EBPF_ARGUMENT_TYPE_DONTCARE,
346
            EBPF_ARGUMENT_TYPE_DONTCARE,
347
            EBPF_ARGUMENT_TYPE_DONTCARE,
348
        },
349
};
350

351
static constexpr EbpfHelperPrototype bpf_get_prandom_u32_proto = {
352
    .name = "get_prandom_u32",
353
    .return_type = EBPF_RETURN_TYPE_INTEGER,
354
};
355

356
static constexpr EbpfHelperPrototype bpf_get_smp_processor_id_proto = {
357
    .name = "get_smp_processor_id",
358
    .return_type = EBPF_RETURN_TYPE_INTEGER,
359
};
360

361
static constexpr EbpfHelperPrototype bpf_get_numa_node_id_proto = {
362
    .name = "get_numa_node_id",
363
    .return_type = EBPF_RETURN_TYPE_INTEGER,
364
};
365

366
static constexpr EbpfHelperPrototype bpf_ktime_get_ns_proto = {
367
    .name = "ktime_get_ns",
368
    .return_type = EBPF_RETURN_TYPE_INTEGER,
369
};
370

371
static constexpr EbpfHelperPrototype bpf_get_current_pid_tgid_proto = {
372
    .name = "get_current_pid_tgid",
373
    .return_type = EBPF_RETURN_TYPE_INTEGER,
374
};
375

376
static constexpr EbpfHelperPrototype bpf_get_current_uid_gid_proto = {
377
    .name = "get_current_uid_gid",
378
    .return_type = EBPF_RETURN_TYPE_INTEGER,
379
};
380

381
static constexpr EbpfHelperPrototype bpf_get_current_comm_proto = {
382
    .name = "get_current_comm",
383
    .return_type = EBPF_RETURN_TYPE_INTEGER,
384
    .argument_type =
385
        {
386
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
387
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
388
        },
389
};
390

391
static constexpr EbpfHelperPrototype bpf_get_current_cgroup_id_proto = {
392
    .name = "get_current_cgroup_id",
393
    .return_type = EBPF_RETURN_TYPE_INTEGER,
394
};
395

396
static constexpr EbpfHelperPrototype bpf_sock_map_update_proto = {
397
    .name = "sock_map_update",
398
    .return_type = EBPF_RETURN_TYPE_INTEGER,
399
    .argument_type =
400
        {
401
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
402
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
403
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
404
            EBPF_ARGUMENT_TYPE_ANYTHING,
405
            EBPF_ARGUMENT_TYPE_DONTCARE,
406
        },
407
    .context_descriptor = &g_sock_ops_descr,
408
};
409

410
static constexpr EbpfHelperPrototype bpf_sock_hash_update_proto = {
411
    .name = "sock_hash_update",
412
    .return_type = EBPF_RETURN_TYPE_INTEGER,
413
    .argument_type =
414
        {
415
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
416
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
417
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
418
            EBPF_ARGUMENT_TYPE_ANYTHING,
419
            EBPF_ARGUMENT_TYPE_DONTCARE,
420
        },
421
    .context_descriptor = &g_sock_ops_descr,
422
};
423

424
static constexpr EbpfHelperPrototype bpf_get_stackid_proto = {
425
    .name = "get_stackid",
426
    .return_type = EBPF_RETURN_TYPE_INTEGER,
427
    .argument_type =
428
        {
429
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
430
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
431
            EBPF_ARGUMENT_TYPE_ANYTHING,
432
        },
433
};
434

435
static constexpr EbpfHelperPrototype bpf_get_stack_proto = {
436
    .name = "get_stack",
437
    .return_type = EBPF_RETURN_TYPE_INTEGER,
438
    .argument_type =
439
        {
440
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
441
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
442
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
443
            EBPF_ARGUMENT_TYPE_ANYTHING,
444
        },
445
};
446

447
static constexpr EbpfHelperPrototype bpf_skb_store_bytes_proto = {
448
    .name = "skb_store_bytes",
449
    .return_type = EBPF_RETURN_TYPE_INTEGER,
450
    .argument_type =
451
        {
452
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
453
            EBPF_ARGUMENT_TYPE_ANYTHING,
454
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
455
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
456
            EBPF_ARGUMENT_TYPE_ANYTHING,
457
        },
458
    .context_descriptor = &g_sk_buff,
459
};
460

461
static constexpr EbpfHelperPrototype bpf_skb_load_bytes_proto = {
462
    .name = "skb_load_bytes",
463
    .return_type = EBPF_RETURN_TYPE_INTEGER,
464
    .argument_type =
465
        {
466
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
467
            EBPF_ARGUMENT_TYPE_ANYTHING,
468
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
469
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
470
        },
471
    .context_descriptor = &g_sk_buff,
472
};
473

474
static constexpr EbpfHelperPrototype bpf_skb_load_bytes_relative_proto = {
475
    .name = "skb_load_bytes_relative",
476
    .return_type = EBPF_RETURN_TYPE_INTEGER,
477
    .argument_type =
478
        {
479
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
480
            EBPF_ARGUMENT_TYPE_ANYTHING,
481
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
482
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
483
            EBPF_ARGUMENT_TYPE_ANYTHING,
484
        },
485
    .context_descriptor = &g_sk_buff,
486
};
487

488
static constexpr EbpfHelperPrototype bpf_skb_pull_data_proto = {
489
    .name = "skb_pull_data",
490
    .return_type = EBPF_RETURN_TYPE_INTEGER,
491
    .argument_type =
492
        {
493
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
494
            EBPF_ARGUMENT_TYPE_ANYTHING,
495
        },
496
    .context_descriptor = &g_sk_buff,
497
};
498

499
static constexpr EbpfHelperPrototype bpf_l3_csum_replace_proto = {
500
    .name = "l3_csum_replace",
501
    .return_type = EBPF_RETURN_TYPE_INTEGER,
502
    .argument_type =
503
        {
504
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
505
            EBPF_ARGUMENT_TYPE_ANYTHING,
506
            EBPF_ARGUMENT_TYPE_ANYTHING,
507
            EBPF_ARGUMENT_TYPE_ANYTHING,
508
            EBPF_ARGUMENT_TYPE_ANYTHING,
509
        },
510
    .context_descriptor = &g_sk_buff,
511
};
512

513
static constexpr EbpfHelperPrototype bpf_l4_csum_replace_proto = {
514
    .name = "l4_csum_replace",
515
    .return_type = EBPF_RETURN_TYPE_INTEGER,
516
    .argument_type =
517
        {
518
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
519
            EBPF_ARGUMENT_TYPE_ANYTHING,
520
            EBPF_ARGUMENT_TYPE_ANYTHING,
521
            EBPF_ARGUMENT_TYPE_ANYTHING,
522
            EBPF_ARGUMENT_TYPE_ANYTHING,
523
        },
524
    .context_descriptor = &g_sk_buff,
525
};
526

527
static constexpr EbpfHelperPrototype bpf_csum_diff_proto = {
528
    .name = "csum_diff",
529
    .return_type = EBPF_RETURN_TYPE_INTEGER,
530
    .argument_type =
531
        {
532
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
533
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
534
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
535
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
536
            EBPF_ARGUMENT_TYPE_ANYTHING,
537
        },
538
};
539

540
static constexpr EbpfHelperPrototype bpf_csum_update_proto = {
541
    .name = "csum_update",
542
    .return_type = EBPF_RETURN_TYPE_INTEGER,
543
    .argument_type =
544
        {
545
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
546
            EBPF_ARGUMENT_TYPE_ANYTHING,
547
        },
548
    .context_descriptor = &g_sk_buff,
549
};
550

551
static constexpr EbpfHelperPrototype bpf_clone_redirect_proto = {
552
    .name = "clone_redirect",
553
    .return_type = EBPF_RETURN_TYPE_INTEGER,
554
    .argument_type =
555
        {
556
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
557
            EBPF_ARGUMENT_TYPE_ANYTHING,
558
            EBPF_ARGUMENT_TYPE_ANYTHING,
559
        },
560
    .context_descriptor = &g_sk_buff,
561
};
562

563
static constexpr EbpfHelperPrototype bpf_redirect_proto = {
564
    .name = "redirect",
565
    .return_type = EBPF_RETURN_TYPE_INTEGER,
566
    .argument_type =
567
        {
568
            EBPF_ARGUMENT_TYPE_ANYTHING,
569
            EBPF_ARGUMENT_TYPE_ANYTHING,
570
        },
571
};
572

573
static constexpr EbpfHelperPrototype bpf_sk_redirect_hash_proto = {
574
    .name = "sk_redirect_hash",
575
    .return_type = EBPF_RETURN_TYPE_INTEGER,
576
    .argument_type =
577
        {
578
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
579
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
580
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
581
            EBPF_ARGUMENT_TYPE_ANYTHING,
582
        },
583
    .context_descriptor = &g_sk_buff,
584
};
585

586
static constexpr EbpfHelperPrototype bpf_sk_redirect_map_proto = {
587
    .name = "sk_redirect_map",
588
    .return_type = EBPF_RETURN_TYPE_INTEGER,
589
    .argument_type =
590
        {
591
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
592
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
593
            EBPF_ARGUMENT_TYPE_ANYTHING,
594
            EBPF_ARGUMENT_TYPE_ANYTHING,
595
        },
596
    .context_descriptor = &g_sk_buff,
597
};
598

599
static constexpr EbpfHelperPrototype bpf_msg_redirect_hash_proto = {
600
    .name = "msg_redirect_hash",
601
    .return_type = EBPF_RETURN_TYPE_INTEGER,
602
    .argument_type =
603
        {
604
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
605
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
606
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
607
            EBPF_ARGUMENT_TYPE_ANYTHING,
608
        },
609
    .context_descriptor = &g_sk_msg_md,
610
};
611

612
static constexpr EbpfHelperPrototype bpf_msg_redirect_map_proto = {
613
    .name = "msg_redirect_map",
614
    .return_type = EBPF_RETURN_TYPE_INTEGER,
615
    .argument_type =
616
        {
617
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
618
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
619
            EBPF_ARGUMENT_TYPE_ANYTHING,
620
            EBPF_ARGUMENT_TYPE_ANYTHING,
621
        },
622
    .context_descriptor = &g_sk_msg_md,
623
};
624

625
static constexpr EbpfHelperPrototype bpf_msg_apply_bytes_proto = {
626
    .name = "msg_apply_bytes",
627
    .return_type = EBPF_RETURN_TYPE_INTEGER,
628
    .argument_type =
629
        {
630
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
631
            EBPF_ARGUMENT_TYPE_ANYTHING,
632
        },
633
    .context_descriptor = &g_sk_msg_md,
634
};
635

636
static constexpr EbpfHelperPrototype bpf_msg_cork_bytes_proto = {
637
    .name = "msg_cork_bytes",
638
    .return_type = EBPF_RETURN_TYPE_INTEGER,
639
    .argument_type =
640
        {
641
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
642
            EBPF_ARGUMENT_TYPE_ANYTHING,
643
        },
644
    .context_descriptor = &g_sk_msg_md,
645
};
646

647
static constexpr EbpfHelperPrototype bpf_msg_pull_data_proto = {
648
    .name = "msg_pull_data",
649
    .return_type = EBPF_RETURN_TYPE_INTEGER,
650
    .argument_type =
651
        {
652
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
653
            EBPF_ARGUMENT_TYPE_ANYTHING,
654
            EBPF_ARGUMENT_TYPE_ANYTHING,
655
            EBPF_ARGUMENT_TYPE_ANYTHING,
656
        },
657
    .context_descriptor = &g_sk_msg_md,
658
};
659
static constexpr EbpfHelperPrototype bpf_get_cgroup_classid_proto = {
660
    .name = "get_cgroup_classid",
661
    .return_type = EBPF_RETURN_TYPE_INTEGER,
662
    .argument_type =
663
        {
664
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
665
        },
666
    .context_descriptor = &g_sk_buff,
667
};
668

669
static constexpr EbpfHelperPrototype bpf_get_route_realm_proto = {
670
    .name = "get_route_realm",
671
    .return_type = EBPF_RETURN_TYPE_INTEGER,
672
    .argument_type =
673
        {
674
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
675
        },
676
    .context_descriptor = &g_sk_buff,
677
};
678

679
static constexpr EbpfHelperPrototype bpf_get_hash_recalc_proto = {
680
    .name = "get_hash_recalc",
681
    .return_type = EBPF_RETURN_TYPE_INTEGER,
682
    .argument_type =
683
        {
684
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
685
        },
686
    .context_descriptor = &g_sk_buff,
687
};
688

689
static constexpr EbpfHelperPrototype bpf_set_hash_invalid_proto = {
690
    .name = "set_hash_invalid",
691
    .return_type = EBPF_RETURN_TYPE_INTEGER,
692
    .argument_type =
693
        {
694
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
695
        },
696
    .context_descriptor = &g_sk_buff,
697
};
698

699
static constexpr EbpfHelperPrototype bpf_set_hash_proto = {
700
    .name = "set_hash",
701
    .return_type = EBPF_RETURN_TYPE_INTEGER,
702
    .argument_type =
703
        {
704
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
705
            EBPF_ARGUMENT_TYPE_ANYTHING,
706
        },
707
    .context_descriptor = &g_sk_buff,
708
};
709

710
static constexpr EbpfHelperPrototype bpf_skb_vlan_push_proto = {
711
    .name = "skb_vlan_push",
712
    .return_type = EBPF_RETURN_TYPE_INTEGER,
713
    .argument_type =
714
        {
715
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
716
            EBPF_ARGUMENT_TYPE_ANYTHING,
717
            EBPF_ARGUMENT_TYPE_ANYTHING,
718
        },
719
    .context_descriptor = &g_sk_buff,
720
};
721

722
static constexpr EbpfHelperPrototype bpf_skb_vlan_pop_proto = {
723
    .name = "skb_vlan_pop",
724
    .return_type = EBPF_RETURN_TYPE_INTEGER,
725
    .argument_type =
726
        {
727
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
728
        },
729
    .context_descriptor = &g_sk_buff,
730
};
731

732
static constexpr EbpfHelperPrototype bpf_skb_change_proto_proto = {
733
    .name = "skb_change_proto",
734
    .return_type = EBPF_RETURN_TYPE_INTEGER,
735
    .argument_type =
736
        {
737
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
738
            EBPF_ARGUMENT_TYPE_ANYTHING,
739
            EBPF_ARGUMENT_TYPE_ANYTHING,
740
        },
741
    .context_descriptor = &g_sk_buff,
742
};
743

744
static constexpr EbpfHelperPrototype bpf_skb_change_type_proto = {
745
    .name = "skb_change_type",
746
    .return_type = EBPF_RETURN_TYPE_INTEGER,
747
    .argument_type =
748
        {
749
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
750
            EBPF_ARGUMENT_TYPE_ANYTHING,
751
        },
752
    .context_descriptor = &g_sk_buff,
753
};
754

755
static constexpr EbpfHelperPrototype bpf_skb_adjust_room_proto = {
756
    .name = "skb_adjust_room",
757
    .return_type = EBPF_RETURN_TYPE_INTEGER,
758
    .argument_type =
759
        {
760
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
761
            EBPF_ARGUMENT_TYPE_ANYTHING,
762
            EBPF_ARGUMENT_TYPE_ANYTHING,
763
            EBPF_ARGUMENT_TYPE_ANYTHING,
764
        },
765
    .reallocate_packet = true,
766
    .context_descriptor = &g_sk_buff,
767
};
768

769
static constexpr EbpfHelperPrototype bpf_skb_change_tail_proto = {
770
    .name = "skb_change_tail",
771
    .return_type = EBPF_RETURN_TYPE_INTEGER,
772
    .argument_type =
773
        {
774
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
775
            EBPF_ARGUMENT_TYPE_ANYTHING,
776
            EBPF_ARGUMENT_TYPE_ANYTHING,
777
        },
778
    .context_descriptor = &g_sk_buff,
779
};
780

781
static constexpr EbpfHelperPrototype bpf_skb_change_head_proto = {
782
    .name = "skb_change_head",
783
    .return_type = EBPF_RETURN_TYPE_INTEGER,
784
    .argument_type =
785
        {
786
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
787
            EBPF_ARGUMENT_TYPE_ANYTHING,
788
            EBPF_ARGUMENT_TYPE_ANYTHING,
789
        },
790
    .reallocate_packet = true,
791
    .context_descriptor = &g_sk_buff,
792
};
793

794
static constexpr EbpfHelperPrototype bpf_xdp_adjust_head_proto = {
795
    .name = "xdp_adjust_head",
796
    .return_type = EBPF_RETURN_TYPE_INTEGER,
797
    .argument_type =
798
        {
799
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
800
            EBPF_ARGUMENT_TYPE_ANYTHING,
801
        },
802
    .reallocate_packet = true,
803
    .context_descriptor = &g_xdp_descr,
804
};
805

806
static constexpr EbpfHelperPrototype bpf_xdp_adjust_tail_proto = {
807
    .name = "xdp_adjust_tail",
808
    .return_type = EBPF_RETURN_TYPE_INTEGER,
809
    .argument_type =
810
        {
811
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
812
            EBPF_ARGUMENT_TYPE_ANYTHING,
813
        },
814
    .reallocate_packet = true,
815
    .context_descriptor = &g_xdp_descr,
816
};
817

818
static constexpr EbpfHelperPrototype bpf_xdp_adjust_meta_proto = {
819
    .name = "xdp_adjust_meta",
820
    .return_type = EBPF_RETURN_TYPE_INTEGER,
821
    .argument_type =
822
        {
823
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
824
            EBPF_ARGUMENT_TYPE_ANYTHING,
825
        },
826
    .reallocate_packet = true,
827
    .context_descriptor = &g_xdp_descr,
828
};
829

830
static constexpr EbpfHelperPrototype bpf_skb_get_tunnel_key_proto = {
831
    .name = "skb_get_tunnel_key",
832
    .return_type = EBPF_RETURN_TYPE_INTEGER,
833
    .argument_type =
834
        {
835
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
836
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
837
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
838
            EBPF_ARGUMENT_TYPE_ANYTHING,
839
        },
840
    .context_descriptor = &g_sk_buff,
841
};
842

843
static constexpr EbpfHelperPrototype bpf_skb_get_tunnel_opt_proto = {
844
    .name = "skb_get_tunnel_opt",
845
    .return_type = EBPF_RETURN_TYPE_INTEGER,
846
    .argument_type =
847
        {
848
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
849
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
850
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
851
        },
852
    .context_descriptor = &g_sk_buff,
853
};
854

855
static constexpr EbpfHelperPrototype bpf_skb_set_tunnel_key_proto = {
856
    .name = "skb_set_tunnel_key",
857
    .return_type = EBPF_RETURN_TYPE_INTEGER,
858
    .argument_type =
859
        {
860
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
861
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
862
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
863
            EBPF_ARGUMENT_TYPE_ANYTHING,
864
        },
865
    .context_descriptor = &g_sk_buff,
866
};
867

868
/*
869
 * int bpf_skb_set_tunnel_opt(skb, opt, size)
870
 *     populate tunnel options metadata
871
 *     @skb: pointer to skb
872
 *     @opt: pointer to raw tunnel option data
873
 *     @size: size of @opt
874
 *     Return: 0 on success or negative error
875
 */
876
static constexpr EbpfHelperPrototype bpf_skb_set_tunnel_opt_proto = {
877
    .name = "skb_set_tunnel_opt",
878
    .return_type = EBPF_RETURN_TYPE_INTEGER,
879
    .argument_type =
880
        {
881
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
882
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
883
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
884
        },
885
    .context_descriptor = &g_sk_buff,
886
};
887

888
static constexpr EbpfHelperPrototype bpf_skb_under_cgroup_proto = {
889
    .name = "skb_under_cgroup",
890
    .return_type = EBPF_RETURN_TYPE_INTEGER,
891
    .argument_type =
892
        {
893
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
894
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
895
            EBPF_ARGUMENT_TYPE_ANYTHING,
896
        },
897
    .context_descriptor = &g_sk_buff,
898
};
899

900
static constexpr EbpfHelperPrototype bpf_skb_cgroup_id_proto = {
901
    .name = "skb_cgroup_id",
902
    .return_type = EBPF_RETURN_TYPE_INTEGER,
903
    .argument_type =
904
        {
905
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
906
        },
907
    .context_descriptor = &g_sk_buff,
908
};
909

910
static constexpr EbpfHelperPrototype bpf_get_socket_cookie_proto = {
911
    .name = "get_socket_cookie",
912
    .return_type = EBPF_RETURN_TYPE_INTEGER,
913
    .argument_type =
914
        {
915
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
916
        },
917
    .context_descriptor = &g_sk_buff,
918
};
919

920
static constexpr EbpfHelperPrototype bpf_get_socket_uid_proto = {
921
    .name = "get_socket_uid",
922
    .return_type = EBPF_RETURN_TYPE_INTEGER,
923
    .argument_type =
924
        {
925
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
926
        },
927
    .context_descriptor = &g_sk_buff,
928
};
929

930
static constexpr EbpfHelperPrototype bpf_setsockopt_proto = {
931
    .name = "setsockopt",
932
    .return_type = EBPF_RETURN_TYPE_INTEGER,
933
    .argument_type =
934
        {
935
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
936
            EBPF_ARGUMENT_TYPE_ANYTHING,
937
            EBPF_ARGUMENT_TYPE_ANYTHING,
938
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
939
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
940
        },
941
};
942

943
static constexpr EbpfHelperPrototype bpf_getsockopt_proto = {
944
    .name = "getsockopt",
945
    .return_type = EBPF_RETURN_TYPE_INTEGER,
946
    .argument_type =
947
        {
948
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
949
            EBPF_ARGUMENT_TYPE_ANYTHING,
950
            EBPF_ARGUMENT_TYPE_ANYTHING,
951
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
952
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
953
        },
954
};
955

956
static constexpr EbpfHelperPrototype bpf_sock_ops_cb_flags_set_proto = {
957
    .name = "sock_ops_cb_flags_set",
958
    .return_type = EBPF_RETURN_TYPE_INTEGER,
959
    .argument_type =
960
        {
961
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
962
            EBPF_ARGUMENT_TYPE_ANYTHING,
963
        },
964
    .context_descriptor = &g_sock_ops_descr,
965
};
966

967
static constexpr EbpfHelperPrototype bpf_bind_proto = {
968
    .name = "bind",
969
    .return_type = EBPF_RETURN_TYPE_INTEGER,
970
    .argument_type =
971
        {
972
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
973
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
974
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
975
        },
976
};
977

978
static constexpr EbpfHelperPrototype bpf_skb_get_xfrm_state_proto = {
979
    .name = "skb_get_xfrm_state",
980
    .return_type = EBPF_RETURN_TYPE_INTEGER,
981
    .argument_type =
982
        {
983
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
984
            EBPF_ARGUMENT_TYPE_ANYTHING,
985
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
986
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
987
            EBPF_ARGUMENT_TYPE_ANYTHING,
988
        },
989
    .context_descriptor = &g_sk_buff,
990
};
991

992
static constexpr EbpfHelperPrototype bpf_fib_lookup_proto = {
993
    .name = "fib_lookup",
994
    .return_type = EBPF_RETURN_TYPE_INTEGER,
995
    .argument_type =
996
        {
997
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
998
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
999
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1000
            EBPF_ARGUMENT_TYPE_ANYTHING,
1001
        },
1002
};
1003

1004
static constexpr EbpfHelperPrototype bpf_lwt_push_encap_proto = {
1005
    .name = "lwt_push_encap",
1006
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1007
    .argument_type =
1008
        {
1009
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1010
            EBPF_ARGUMENT_TYPE_ANYTHING,
1011
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1012
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1013
        },
1014
    .context_descriptor = &g_sk_buff,
1015
};
1016

1017
static constexpr EbpfHelperPrototype bpf_lwt_seg6_store_bytes_proto = {
1018
    .name = "lwt_seg6_store_bytes",
1019
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1020
    .argument_type =
1021
        {
1022
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1023
            EBPF_ARGUMENT_TYPE_ANYTHING,
1024
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1025
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1026
        },
1027
    .context_descriptor = &g_sk_buff,
1028
};
1029

1030
static constexpr EbpfHelperPrototype bpf_lwt_seg6_action_proto = {
1031
    .name = "lwt_seg6_action",
1032
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1033
    .argument_type =
1034
        {
1035
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1036
            EBPF_ARGUMENT_TYPE_ANYTHING,
1037
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1038
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1039
        },
1040
    .context_descriptor = &g_sk_buff,
1041
};
1042

1043
static constexpr EbpfHelperPrototype bpf_lwt_seg6_adjust_srh_proto = {
1044
    .name = "lwt_seg6_adjust_srh",
1045
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1046
    .argument_type =
1047
        {
1048
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1049
            EBPF_ARGUMENT_TYPE_ANYTHING,
1050
            EBPF_ARGUMENT_TYPE_ANYTHING,
1051
        },
1052
    .reallocate_packet = true,
1053
    .context_descriptor = &g_sk_buff,
1054
};
1055

1056
static constexpr EbpfHelperPrototype bpf_rc_repeat_proto = {
1057
    .name = "rc_repeat",
1058
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1059
    .argument_type =
1060
        {
1061
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1062
        },
1063
};
1064

1065
static constexpr EbpfHelperPrototype bpf_rc_keydown_proto = {
1066
    .name = "rc_keydown",
1067
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1068
    .argument_type =
1069
        {
1070
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1071
            EBPF_ARGUMENT_TYPE_ANYTHING,
1072
            EBPF_ARGUMENT_TYPE_ANYTHING,
1073
            EBPF_ARGUMENT_TYPE_ANYTHING,
1074
        },
1075
};
1076

1077
static constexpr EbpfHelperPrototype bpf_get_local_storage_proto = {
1078
    .name = "get_local_storage",
1079
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE,
1080
    .argument_type =
1081
        {
1082
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1083
            EBPF_ARGUMENT_TYPE_ANYTHING,
1084
        },
1085
};
1086

1087
static constexpr EbpfHelperPrototype bpf_redirect_map_proto = {
1088
    .name = "redirect_map",
1089
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1090
    .argument_type =
1091
        {
1092
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1093
            EBPF_ARGUMENT_TYPE_ANYTHING,
1094
            EBPF_ARGUMENT_TYPE_ANYTHING,
1095
        },
1096
};
1097

1098
static constexpr EbpfHelperPrototype bpf_sk_select_reuseport_proto = {
1099
    .name = "sk_select_reuseport",
1100
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1101
    .argument_type{
1102
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1103
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1104
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
1105
        EBPF_ARGUMENT_TYPE_ANYTHING,
1106
    },
1107
};
1108

1109
static constexpr EbpfHelperPrototype bpf_get_current_ancestor_cgroup_id_proto = {
1110
    .name = "get_current_ancestor_cgroup_id",
1111
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1112
    .argument_type{
1113
        EBPF_ARGUMENT_TYPE_ANYTHING,
1114
    },
1115
};
1116

1117
static constexpr EbpfHelperPrototype bpf_sk_lookup_tcp_proto = {
1118
    .name = "sk_lookup_tcp",
1119
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCK_COMMON_OR_NULL,
1120
    .argument_type =
1121
        {
1122
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1123
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1124
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1125
            EBPF_ARGUMENT_TYPE_ANYTHING,
1126
            EBPF_ARGUMENT_TYPE_ANYTHING,
1127
        },
1128
};
1129
static constexpr EbpfHelperPrototype bpf_sk_lookup_udp_proto = {
1130
    .name = "sk_lookup_udp",
1131
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCKET_OR_NULL,
1132
    .argument_type{
1133
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1134
        EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1135
        EBPF_ARGUMENT_TYPE_CONST_SIZE,
1136
        EBPF_ARGUMENT_TYPE_ANYTHING,
1137
        EBPF_ARGUMENT_TYPE_ANYTHING,
1138
    },
1139
};
1140

1141
static constexpr EbpfHelperPrototype bpf_sk_release_proto = {
1142
    .name = "sk_release",
1143
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1144
    .argument_type =
1145
        {
1146
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1147
        },
1148
};
1149

1150
static constexpr EbpfHelperPrototype bpf_map_push_elem_proto = {
1151
    .name = "map_push_elem",
1152
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1153
    .argument_type{
1154
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1155
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,
1156
        EBPF_ARGUMENT_TYPE_ANYTHING,
1157
    },
1158
};
1159

1160
static constexpr EbpfHelperPrototype bpf_map_pop_elem_proto = {
1161
    .name = "map_pop_elem",
1162
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1163
    .argument_type{
1164
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1165
        EBPF_ARGUMENT_TYPE_PTR_TO_UNINIT_MAP_VALUE,
1166
    },
1167
};
1168

1169
static constexpr EbpfHelperPrototype bpf_map_peek_elem_proto = {
1170
    .name = "map_peek_elem",
1171
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1172
    .argument_type{
1173
        EBPF_ARGUMENT_TYPE_CONST_PTR_TO_MAP,
1174
        EBPF_ARGUMENT_TYPE_PTR_TO_UNINIT_MAP_VALUE,
1175
    },
1176
};
1177

1178
static constexpr EbpfHelperPrototype bpf_msg_push_data_proto = {
1179
    .name = "msg_push_data",
1180
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1181
    .argument_type{
1182
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1183
        EBPF_ARGUMENT_TYPE_ANYTHING,
1184
        EBPF_ARGUMENT_TYPE_ANYTHING,
1185
        EBPF_ARGUMENT_TYPE_ANYTHING,
1186
    },
1187
    .context_descriptor = &g_sk_msg_md,
1188
};
1189

1190
static constexpr EbpfHelperPrototype bpf_msg_pop_data_proto = {
1191
    .name = "msg_pop_data",
1192
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1193
    .argument_type{
1194
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1195
        EBPF_ARGUMENT_TYPE_ANYTHING,
1196
        EBPF_ARGUMENT_TYPE_ANYTHING,
1197
        EBPF_ARGUMENT_TYPE_ANYTHING,
1198
    },
1199
    .context_descriptor = &g_sk_msg_md,
1200
};
1201

1202
static constexpr EbpfHelperPrototype bpf_rc_pointer_rel_proto = {
1203
    .name = "rc_pointer_rel",
1204
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1205
    .argument_type{
1206
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1207
        EBPF_ARGUMENT_TYPE_ANYTHING,
1208
        EBPF_ARGUMENT_TYPE_ANYTHING,
1209
    },
1210
};
1211

1212
static constexpr EbpfHelperPrototype bpf_spin_lock_proto = {
1213
    .name = "spin_lock",
1214
    .return_type = EBPF_RETURN_TYPE_INTEGER, // returns 0
1215
    .argument_type =
1216
        {
1217
            EBPF_ARGUMENT_TYPE_PTR_TO_SPIN_LOCK,
1218
        },
1219
};
1220

1221
static constexpr EbpfHelperPrototype bpf_spin_unlock_proto = {
1222
    .name = "spin_unlock",
1223
    .return_type = EBPF_RETURN_TYPE_INTEGER, // returns 0
1224
    .argument_type =
1225
        {
1226
            EBPF_ARGUMENT_TYPE_PTR_TO_SPIN_LOCK,
1227
        },
1228
};
1229

1230
static constexpr EbpfHelperPrototype bpf_jiffies64_proto = {
1231
    .name = "jiffies64",
1232
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1233
};
1234

1235
static constexpr EbpfHelperPrototype bpf_sk_fullsock_proto = {
1236
    .name = "sk_fullsock",
1237
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCKET_OR_NULL,
1238
    .argument_type =
1239
        {
1240
            EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON,
1241
        },
1242
};
1243

1244
static constexpr EbpfHelperPrototype bpf_tcp_sock_proto = {
1245
    .name = "tcp_sock",
1246
    .return_type = EBPF_RETURN_TYPE_PTR_TO_TCP_SOCKET_OR_NULL,
1247
    .argument_type =
1248
        {
1249
            EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON,
1250
        },
1251
};
1252

1253
static constexpr EbpfHelperPrototype bpf_skb_ecn_set_ce_proto = {
1254
    .name = "skb_ecn_set_ce",
1255
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1256
    .argument_type =
1257
        {
1258
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1259
        },
1260
};
1261

1262
static constexpr EbpfHelperPrototype bpf_tcp_check_syncookie_proto = {
1263
    .name = "tcp_check_syncookie",
1264
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1265
    .argument_type =
1266
        {
1267
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1268
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1269
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1270
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1271
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1272
        },
1273
};
1274

1275
static constexpr EbpfHelperPrototype bpf_get_listener_sock_proto = {
1276
    .name = "get_listener_sock",
1277
    .return_type = EBPF_RETURN_TYPE_PTR_TO_TCP_SOCKET_OR_NULL,
1278
    .argument_type =
1279
        {
1280
            EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON,
1281
        },
1282
};
1283

1284
static constexpr EbpfHelperPrototype bpf_skc_lookup_tcp_proto = {
1285
    .name = "skc_lookup_tcp",
1286
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCK_COMMON_OR_NULL,
1287
    .argument_type =
1288
        {
1289
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1290
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1291
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1292
            EBPF_ARGUMENT_TYPE_ANYTHING,
1293
            EBPF_ARGUMENT_TYPE_ANYTHING,
1294
        },
1295
};
1296

1297
static constexpr EbpfHelperPrototype bpf_sysctl_get_name_proto = {
1298
    .name = "sysctl_get_name",
1299
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1300
    .argument_type =
1301
        {
1302
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1303
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1304
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1305
            EBPF_ARGUMENT_TYPE_ANYTHING,
1306
        },
1307
};
1308

1309
static constexpr EbpfHelperPrototype bpf_sysctl_get_current_value_proto = {
1310
    .name = "sysctl_get_current_value",
1311
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1312
    .argument_type =
1313
        {
1314
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1315
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1316
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1317
        },
1318
};
1319

1320
static constexpr EbpfHelperPrototype bpf_sysctl_get_new_value_proto = {
1321
    .name = "sysctl_get_new_value",
1322
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1323
    .argument_type =
1324
        {
1325
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1326
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1327
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1328
        },
1329
};
1330

1331
static constexpr EbpfHelperPrototype bpf_sysctl_set_new_value_proto = {
1332
    .name = "sysctl_set_new_value",
1333
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1334
    .argument_type =
1335
        {
1336
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1337
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1338
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1339
        },
1340
};
1341

1342
static constexpr EbpfHelperPrototype bpf_strtol_proto = {
1343
    .name = "strtol",
1344
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1345
    .argument_type =
1346
        {
1347
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1348
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1349
            EBPF_ARGUMENT_TYPE_ANYTHING,
1350
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
1351
        },
1352
};
1353

1354
static constexpr EbpfHelperPrototype bpf_strtoul_proto = {
1355
    .name = "strtoul",
1356
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1357
    .argument_type =
1358
        {
1359
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1360
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1361
            EBPF_ARGUMENT_TYPE_ANYTHING,
1362
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
1363
        },
1364
};
1365

1366
static constexpr EbpfHelperPrototype bpf_strncmp_proto = {
1367
    .name = "strncmp",
1368
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1369
    .argument_type =
1370
        {
1371
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1372
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1373
            EBPF_ARGUMENT_TYPE_PTR_TO_CONST_STR,
1374
        },
1375
};
1376

1377
static constexpr EbpfHelperPrototype bpf_sk_storage_get_proto = {
1378
    .name = "sk_storage_get",
1379
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1380
    .argument_type =
1381
        {
1382
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1383
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1384
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1385
            EBPF_ARGUMENT_TYPE_ANYTHING,
1386
        },
1387
};
1388

1389
static constexpr EbpfHelperPrototype bpf_sk_storage_delete_proto = {
1390
    .name = "sk_storage_delete",
1391
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1392
    .argument_type =
1393
        {
1394
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1395
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1396
        },
1397
};
1398

1399
static constexpr EbpfHelperPrototype bpf_send_signal_proto = {
1400
    .name = "send_signal",
1401
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1402
    .argument_type =
1403
        {
1404
            EBPF_ARGUMENT_TYPE_ANYTHING,
1405
        },
1406
};
1407

1408
static constexpr EbpfHelperPrototype bpf_send_signal_thread_proto = {
1409
    .name = "send_signal_thread",
1410
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1411
    .argument_type =
1412
        {
1413
            EBPF_ARGUMENT_TYPE_ANYTHING,
1414
        },
1415
};
1416

1417
static constexpr EbpfHelperPrototype bpf_tcp_gen_syncookie_proto = {
1418
    .name = "tcp_gen_syncookie",
1419
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1420
    .argument_type =
1421
        {
1422
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1423
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1424
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1425
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1426
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1427
        },
1428
};
1429

1430
static constexpr EbpfHelperPrototype bpf_skb_output_proto = {
1431
    .name = "skb_event_output",
1432
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1433
    .argument_type =
1434
        {
1435
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1436
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP, // originally const
1437
            EBPF_ARGUMENT_TYPE_ANYTHING,
1438
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1439
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1440
        },
1441
    //.arg1_btf_id = &bpf_skb_output_btf_ids[0],
1442
};
1443

1444
static constexpr EbpfHelperPrototype bpf_probe_read_user_proto = {
1445
    .name = "probe_read_user",
1446
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1447
    .argument_type =
1448
        {
1449
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1450
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1451
            EBPF_ARGUMENT_TYPE_ANYTHING,
1452
        },
1453
};
1454

1455
static constexpr EbpfHelperPrototype bpf_probe_read_user_str_proto = {
1456
    .name = "probe_read_user_str",
1457
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1458
    .argument_type =
1459
        {
1460
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1461
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1462
            EBPF_ARGUMENT_TYPE_ANYTHING,
1463
        },
1464
};
1465

1466
static constexpr EbpfHelperPrototype bpf_probe_read_kernel_proto = {
1467
    .name = "probe_read_kernel",
1468
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1469
    .argument_type =
1470
        {
1471
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1472
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1473
            EBPF_ARGUMENT_TYPE_ANYTHING,
1474
        },
1475
};
1476

1477
static constexpr EbpfHelperPrototype bpf_probe_read_kernel_str_proto = {
1478
    .name = "probe_read_kernel_str",
1479
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1480
    .argument_type =
1481
        {
1482
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1483
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1484
            EBPF_ARGUMENT_TYPE_ANYTHING,
1485
        },
1486
};
1487

1488
static constexpr EbpfHelperPrototype bpf_tcp_send_ack_proto = {
1489
    .name = "tcp_send_ack",
1490
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1491
    .argument_type =
1492
        {
1493
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1494
            EBPF_ARGUMENT_TYPE_ANYTHING,
1495
        },
1496
    //.arg1_btf_id = &tcp_sock_id[0],
1497
};
1498

1499
static constexpr EbpfHelperPrototype bpf_read_branch_records_proto = {
1500
    .name = "read_branch_records",
1501
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1502
    .argument_type =
1503
        {
1504
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1505
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1506
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1507
            EBPF_ARGUMENT_TYPE_ANYTHING,
1508
        },
1509
};
1510

1511
static constexpr EbpfHelperPrototype bpf_get_ns_current_pid_tgid_proto = {
1512
    .name = "get_ns_current_pid_tgid",
1513
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1514
    .argument_type =
1515
        {
1516
            EBPF_ARGUMENT_TYPE_ANYTHING,
1517
            EBPF_ARGUMENT_TYPE_ANYTHING,
1518
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM_OR_NULL, // TODO: or null
1519
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1520
        },
1521
};
1522

1523
static constexpr EbpfHelperPrototype bpf_xdp_output_proto = {
1524
    .name = "xdp_event_output",
1525
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1526
    .argument_type =
1527
        {
1528
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1529
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1530
            EBPF_ARGUMENT_TYPE_ANYTHING,
1531
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1532
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1533
        },
1534
    // .arg1_btf_id = &bpf_xdp_output_btf_ids[0],
1535
};
1536

1537
static constexpr EbpfHelperPrototype bpf_sk_assign_proto = {
1538
    .name = "sk_assign",
1539
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1540
    .argument_type =
1541
        {
1542
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1543
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1544
            EBPF_ARGUMENT_TYPE_ANYTHING,
1545
        },
1546
};
1547

1548
static constexpr EbpfHelperPrototype bpf_ktime_get_boot_ns_proto = {
1549
    .name = "ktime_get_boot_ns",
1550
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1551
};
1552

1553
static constexpr EbpfHelperPrototype bpf_seq_printf_proto = {
1554
    .name = "seq_printf",
1555
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1556
    .argument_type =
1557
        {
1558
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1559
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1560
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1561
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1562
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1563
        },
1564
    // .arg1_btf_id = &btf_seq_file_ids[0],
1565
};
1566

1567
static constexpr EbpfHelperPrototype bpf_seq_write_proto = {
1568
    .name = "seq_write",
1569
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1570
    .argument_type =
1571
        {
1572
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1573
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1574
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1575
        },
1576
};
1577

1578
static constexpr EbpfHelperPrototype bpf_sk_cgroup_id_proto = {
1579
    .name = "sk_cgroup_id",
1580
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1581
    .argument_type =
1582
        {
1583
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1584
        },
1585
};
1586

1587
static constexpr EbpfHelperPrototype bpf_sk_ancestor_cgroup_id_proto = {
1588
    .name = "sk_ancestor_cgroup_id",
1589
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1590
    .argument_type =
1591
        {
1592
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1593
            EBPF_ARGUMENT_TYPE_ANYTHING,
1594
        },
1595
};
1596

1597
static constexpr EbpfHelperPrototype bpf_ringbuf_reserve_proto = {
1598
    .name = "ringbuf_reserve",
1599
    .return_type = EBPF_RETURN_TYPE_PTR_TO_ALLOC_MEM_OR_NULL,
1600
    .argument_type =
1601
        {
1602
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1603
            EBPF_ARGUMENT_TYPE_CONST_ALLOC_SIZE_OR_ZERO,
1604
            EBPF_ARGUMENT_TYPE_ANYTHING,
1605
        },
1606
};
1607

1608
static constexpr EbpfHelperPrototype bpf_ringbuf_submit_proto = {
1609
    .name = "ringbuf_submit",
1610
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1611
    .argument_type =
1612
        {
1613
            EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM,
1614
            EBPF_ARGUMENT_TYPE_ANYTHING,
1615
        },
1616
};
1617

1618
static constexpr EbpfHelperPrototype bpf_ringbuf_discard_proto = {
1619
    .name = "ringbuf_discard",
1620
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1621
    .argument_type =
1622
        {
1623
            EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM,
1624
            EBPF_ARGUMENT_TYPE_ANYTHING,
1625
        },
1626
};
1627

1628
static constexpr EbpfHelperPrototype bpf_ringbuf_output_proto = {
1629
    .name = "ringbuf_output",
1630
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1631
    .argument_type =
1632
        {
1633
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1634
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1635
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1636
            EBPF_ARGUMENT_TYPE_ANYTHING,
1637
        },
1638
};
1639

1640
constexpr EbpfHelperPrototype bpf_ringbuf_query_proto = {
1641
    .name = "ringbuf_query",
1642
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1643
    .argument_type =
1644
        {
1645
            EBPF_ARGUMENT_TYPE_CONST_PTR_TO_MAP,
1646
            EBPF_ARGUMENT_TYPE_ANYTHING,
1647
        },
1648
};
1649

1650
static constexpr EbpfHelperPrototype bpf_csum_level_proto = {
1651
    .name = "csum_level",
1652
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1653
    .argument_type =
1654
        {
1655
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1656
            EBPF_ARGUMENT_TYPE_ANYTHING,
1657
        },
1658
};
1659

1660
static constexpr EbpfHelperPrototype bpf_skc_to_tcp6_sock_proto = {
1661
    .name = "skc_to_tcp6_sock",
1662
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1663
    .argument_type =
1664
        {
1665
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1666
        },
1667
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP6],
1668
};
1669

1670
static constexpr EbpfHelperPrototype bpf_skc_to_tcp_sock_proto = {
1671
    .name = "skc_to_tcp_sock",
1672
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1673
    .argument_type =
1674
        {
1675
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1676
        },
1677
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP],
1678
};
1679

1680
static constexpr EbpfHelperPrototype bpf_skc_to_tcp_timewait_sock_proto = {
1681
    .name = "skc_to_tcp_timewait_sock",
1682
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1683
    .argument_type =
1684
        {
1685
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1686
        },
1687
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP_TW],
1688
};
1689

1690
static constexpr EbpfHelperPrototype bpf_skc_to_tcp_request_sock_proto = {
1691
    .name = "skc_to_tcp_request_sock",
1692
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1693
    .argument_type =
1694
        {
1695
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1696
        },
1697
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP_REQ],
1698
};
1699

1700
static constexpr EbpfHelperPrototype bpf_skc_to_udp6_sock_proto = {
1701
    .name = "skc_to_udp6_sock",
1702
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1703
    .argument_type =
1704
        {
1705
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1706
        },
1707
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_UDP6],
1708
};
1709

1710
static constexpr EbpfHelperPrototype bpf_sock_from_file_proto = {
1711
    .name = "sock_from_file",
1712
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1713
    .argument_type =
1714
        {
1715
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1716
        },
1717
    //.ret_btf_id = &bpf_sock_from_file_btf_ids[0],
1718
    //.arg1_btf_id = &bpf_sock_from_file_btf_ids[1],
1719
};
1720

1721
static constexpr EbpfHelperPrototype bpf_get_task_stack_proto = {
1722
    .name = "get_task_stack",
1723
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1724
    .argument_type =
1725
        {
1726
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1727
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1728
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1729
            EBPF_ARGUMENT_TYPE_ANYTHING,
1730
        },
1731
    // .arg1_btf_id = &bpf_get_task_stack_btf_ids[0],
1732
};
1733

1734
static constexpr EbpfHelperPrototype bpf_inode_storage_get_proto = {
1735
    .name = "inode_storage_get",
1736
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1737
    .argument_type =
1738
        {
1739
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1740
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1741
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1742
            EBPF_ARGUMENT_TYPE_ANYTHING,
1743
        },
1744
    //.arg2_btf_id = &bpf_inode_storage_btf_ids[0],
1745
};
1746

1747
static constexpr EbpfHelperPrototype bpf_inode_storage_delete_proto = {
1748
    .name = "inode_storage_delete",
1749
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1750
    .argument_type =
1751
        {
1752
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1753
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1754
        },
1755
    //.arg2_btf_id = &bpf_inode_storage_btf_ids[0],
1756
};
1757

1758
static constexpr EbpfHelperPrototype bpf_d_path_proto = {
1759
    .name = "d_path",
1760
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1761
    .argument_type =
1762
        {
1763
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1764
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1765
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1766
        },
1767
    // .allowed = bpf_d_path_allowed,
1768
    // .arg1_btf_id = &bpf_d_path_btf_ids[0],
1769
};
1770

1771
static constexpr EbpfHelperPrototype bpf_copy_from_user_proto = {
1772
    .name = "copy_from_user",
1773
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1774
    .argument_type =
1775
        {
1776
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1777
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1778
            EBPF_ARGUMENT_TYPE_ANYTHING,
1779
        },
1780
};
1781

1782
static constexpr EbpfHelperPrototype bpf_per_cpu_ptr_proto = {
1783
    .name = "per_cpu_ptr",
1784
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID_OR_NULL,
1785
    .argument_type =
1786
        {
1787
            EBPF_ARGUMENT_TYPE_PTR_TO_PERCPU_BTF_ID,
1788
            EBPF_ARGUMENT_TYPE_ANYTHING,
1789
        },
1790
};
1791

1792
static constexpr EbpfHelperPrototype bpf_this_cpu_ptr_proto = {
1793
    .name = "this_cpu_ptr",
1794
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID,
1795
    .argument_type =
1796
        {
1797
            EBPF_ARGUMENT_TYPE_PTR_TO_PERCPU_BTF_ID,
1798
        },
1799
};
1800

1801
static constexpr EbpfHelperPrototype bpf_snprintf_btf_proto = {
1802
    .name = "snprintf_btf",
1803
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1804
    .argument_type =
1805
        {
1806
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1807
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1808
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1809
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1810
            EBPF_ARGUMENT_TYPE_ANYTHING,
1811
        },
1812
};
1813

1814
static constexpr EbpfHelperPrototype bpf_seq_printf_btf_proto = {
1815
    .name = "seq_printf_btf",
1816
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1817
    .argument_type =
1818
        {
1819
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1820
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1821
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1822
            EBPF_ARGUMENT_TYPE_ANYTHING,
1823
        },
1824
    // .arg1_btf_id        = &btf_seq_file_ids[0],
1825
};
1826

1827
static constexpr EbpfHelperPrototype bpf_skb_cgroup_classid_proto = {
1828
    .name = "skb_cgroup_classid",
1829
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1830
    .argument_type =
1831
        {
1832
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1833
        },
1834
};
1835

1836
static constexpr EbpfHelperPrototype bpf_redirect_neigh_proto = {
1837
    .name = "redirect_neigh",
1838
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1839
    .argument_type =
1840
        {
1841
            EBPF_ARGUMENT_TYPE_ANYTHING,
1842
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1843
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1844
            EBPF_ARGUMENT_TYPE_ANYTHING,
1845
        },
1846
};
1847

1848
static constexpr EbpfHelperPrototype bpf_redirect_peer_proto = {
1849
    .name = "redirect_peer",
1850
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1851
    .argument_type =
1852
        {
1853
            EBPF_ARGUMENT_TYPE_ANYTHING,
1854
            EBPF_ARGUMENT_TYPE_ANYTHING,
1855
        },
1856
};
1857

1858
static constexpr EbpfHelperPrototype bpf_task_storage_get_proto = {
1859
    .name = "task_storage_get",
1860
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1861
    .argument_type =
1862
        {
1863
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1864
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1865
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1866
            EBPF_ARGUMENT_TYPE_ANYTHING,
1867
        },
1868
    // .arg2_btf_id = &bpf_task_storage_btf_ids[0],
1869
};
1870

1871
static constexpr EbpfHelperPrototype bpf_task_storage_delete_proto = {
1872
    .name = "task_storage_delete",
1873
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1874
    .argument_type =
1875
        {
1876
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1877
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1878
        },
1879
    // .arg2_btf_id = &bpf_task_storage_btf_ids[0],
1880
};
1881

1882
static constexpr EbpfHelperPrototype bpf_get_current_task_btf_proto = {
1883
    .name = "get_current_task_btf", .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID,
1884
    // .ret_btf_id = &bpf_get_current_btf_ids[0],
1885
};
1886

1887
static constexpr EbpfHelperPrototype bpf_bprm_opts_set_proto = {
1888
    .name = "bprm_opts_set",
1889
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1890
    .argument_type =
1891
        {
1892
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1893
            EBPF_ARGUMENT_TYPE_ANYTHING,
1894
        }
1895
    // .arg1_btf_id        = &bpf_bprm_opts_set_btf_ids[0],
1896
};
1897

1898
static constexpr EbpfHelperPrototype bpf_ima_inode_hash_proto = {
1899
    .name = "ima_inode_hash",
1900
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1901
    .argument_type =
1902
        {
1903
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1904
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1905
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1906
        },
1907
    //    .allowed        = bpf_ima_inode_hash_allowed,
1908
    //    .arg1_btf_id        = &bpf_ima_inode_hash_btf_ids[0],
1909
};
1910

1911
static constexpr EbpfHelperPrototype bpf_ktime_get_coarse_ns_proto = {
1912
    .name = "ktime_get_coarse_ns",
1913
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1914
};
1915

1916
// bpf_skb_check_mtu_proto/bpf_xdp_check_mtu_proto
1917
static constexpr EbpfHelperPrototype bpf_check_mtu_proto = {
1918
    .name = "check_mtu",
1919
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1920
    .argument_type =
1921
        {
1922
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1923
            EBPF_ARGUMENT_TYPE_ANYTHING,
1924
            EBPF_ARGUMENT_TYPE_PTR_TO_INT,
1925
            EBPF_ARGUMENT_TYPE_ANYTHING,
1926
            EBPF_ARGUMENT_TYPE_ANYTHING,
1927
        },
1928
};
1929

1930
static constexpr EbpfHelperPrototype bpf_for_each_map_elem_proto = {
1931
    .name = "for_each_map_elem",
1932
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1933
    .argument_type =
1934
        {
1935
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1936
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
1937
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
1938
            EBPF_ARGUMENT_TYPE_ANYTHING,
1939
        },
1940
};
1941

1942
static constexpr EbpfHelperPrototype bpf_snprintf_proto = {
1943
    .name = "snprintf",
1944
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1945
    .argument_type =
1946
        {
1947
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1948
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1949
            EBPF_ARGUMENT_TYPE_PTR_TO_CONST_STR,
1950
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM_OR_NULL,
1951
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1952
        },
1953
};
1954

1955
static constexpr EbpfHelperPrototype bpf_sys_bpf_proto = {
1956
    .name = "sys_bpf",
1957
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1958
    .argument_type =
1959
        {
1960
            EBPF_ARGUMENT_TYPE_ANYTHING,
1961
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1962
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1963
        },
1964
};
1965

1966
static constexpr EbpfHelperPrototype bpf_btf_find_by_name_kind_proto = {
1967
    .name = "btf_find_by_name_kind",
1968
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1969
    .argument_type =
1970
        {
1971
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1972
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1973
            EBPF_ARGUMENT_TYPE_ANYTHING,
1974
            EBPF_ARGUMENT_TYPE_ANYTHING,
1975
        },
1976
};
1977

1978
static constexpr EbpfHelperPrototype bpf_sys_close_proto = {
1979
    .name = "sys_close",
1980
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1981
    .argument_type =
1982
        {
1983
            EBPF_ARGUMENT_TYPE_ANYTHING,
1984
        },
1985
};
1986

1987
static constexpr EbpfHelperPrototype bpf_kallsyms_lookup_name_proto = {
1988
    .name = "kallsyms_lookup_name",
1989
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1990
    .argument_type =
1991
        {
1992
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1993
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1994
            EBPF_ARGUMENT_TYPE_ANYTHING,
1995
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
1996
        },
1997
};
1998

1999
static constexpr EbpfHelperPrototype bpf_timer_init_proto = {
2000
    .name = "timer_init",
2001
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2002
    .argument_type =
2003
        {
2004
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
2005
            EBPF_ARGUMENT_TYPE_CONST_PTR_TO_MAP,
2006
            EBPF_ARGUMENT_TYPE_ANYTHING,
2007
        },
2008
};
2009

2010
static constexpr EbpfHelperPrototype bpf_timer_set_callback_proto = {
2011
    .name = "timer_set_callback",
2012
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2013
    .argument_type =
2014
        {
2015
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
2016
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2017
        },
2018
};
2019

2020
static constexpr EbpfHelperPrototype bpf_timer_start_proto = {
2021
    .name = "timer_start",
2022
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2023
    .argument_type =
2024
        {
2025
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
2026
            EBPF_ARGUMENT_TYPE_ANYTHING,
2027
            EBPF_ARGUMENT_TYPE_ANYTHING,
2028
        },
2029
};
2030

2031
static constexpr EbpfHelperPrototype bpf_timer_cancel_proto = {
2032
    .name = "timer_cancel",
2033
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2034
    .argument_type =
2035
        {
2036
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
2037
        },
2038
};
2039

2040
// same signature for bpf_get_func_ip_proto_kprobe/bpf_get_func_ip_proto_tracing
2041
static constexpr EbpfHelperPrototype bpf_get_func_ip_proto = {
2042
    .name = "get_func_ip",
2043
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2044
    .argument_type =
2045
        {
2046
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2047
        },
2048
};
2049

2050
static constexpr EbpfHelperPrototype bpf_get_attach_cookie_proto = {
2051
    .name = "get_attach_cookie",
2052
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2053
    .argument_type =
2054
        {
2055
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2056
        },
2057
};
2058

2059
static constexpr EbpfHelperPrototype bpf_task_pt_regs_proto = {
2060
    .name = "task_pt_regs",
2061
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID,
2062
    .argument_type =
2063
        {
2064
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2065
        },
2066
    //    .arg1_btf_id        = &btf_tracing_ids[BTF_TRACING_TYPE_TASK],
2067
    //    .ret_btf_id        = &bpf_task_pt_regs_ids[0],
2068
};
2069

2070
static constexpr EbpfHelperPrototype bpf_get_branch_snapshot_proto = {
2071
    .name = "get_branch_snapshot",
2072
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2073
    .argument_type =
2074
        {
2075
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
2076
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
2077
        },
2078
};
2079

2080
static constexpr EbpfHelperPrototype bpf_get_func_arg_proto = {
2081
    .name = "get_func_arg",
2082
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2083
    .argument_type =
2084
        {
2085
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2086
            EBPF_ARGUMENT_TYPE_ANYTHING,
2087
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
2088
        },
2089
};
2090

2091
static constexpr EbpfHelperPrototype bpf_get_func_ret_proto = {
2092
    .name = "get_func_ret",
2093
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2094
    .argument_type =
2095
        {
2096
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2097
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
2098
        },
2099
};
2100

2101
static constexpr EbpfHelperPrototype bpf_get_func_arg_cnt_proto = {
2102
    .name = "get_func_arg_cnt",
2103
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2104
    .argument_type =
2105
        {
2106
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2107
        },
2108
};
2109

2110
static constexpr EbpfHelperPrototype bpf_trace_vprintk_proto = {
2111
    .name = "trace_vprintk",
2112
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2113
    .argument_type =
2114
        {
2115
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
2116
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
2117
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM_OR_NULL,
2118
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
2119
        },
2120
};
2121

2122
constexpr EbpfHelperPrototype bpf_skc_to_unix_sock_proto = {
2123
    .name = "skc_to_unix_sock",
2124
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
2125
    .argument_type =
2126
        {
2127
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
2128
        }
2129
    //    .ret_btf_id                = &btf_sock_ids[BTF_SOCK_TYPE_UNIX],
2130
};
2131

2132
constexpr EbpfHelperPrototype bpf_find_vma_proto = {
2133
    .name = "find_vma",
2134
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2135
    .argument_type =
2136
        {
2137
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2138
            EBPF_ARGUMENT_TYPE_ANYTHING,
2139
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2140
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
2141
            EBPF_ARGUMENT_TYPE_ANYTHING,
2142
        },
2143
    // .arg1_btf_id = &btf_tracing_ids[BTF_TRACING_TYPE_TASK],
2144
};
2145

2146
constexpr EbpfHelperPrototype bpf_loop_proto = {
2147
    .name = "loop",
2148
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2149
    .argument_type =
2150
        {
2151
            EBPF_ARGUMENT_TYPE_ANYTHING,
2152
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2153
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
2154
            EBPF_ARGUMENT_TYPE_ANYTHING,
2155
        },
2156
};
2157
// Map operations
2158
static constexpr EbpfHelperPrototype bpf_map_lookup_percpu_elem_proto = {
2159
    .name = "map_lookup_percpu_elem",
2160
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
2161
    .argument_type =
2162
        {
2163
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2164
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
2165
            EBPF_ARGUMENT_TYPE_ANYTHING,
2166
            EBPF_ARGUMENT_TYPE_DONTCARE,
2167
            EBPF_ARGUMENT_TYPE_DONTCARE,
2168
        },
2169
};
2170

2171
// Time operations
2172
static constexpr EbpfHelperPrototype bpf_ktime_get_tai_ns_proto = {
2173
    .name = "ktime_get_tai_ns",
2174
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2175
};
2176

2177
// Dynptr ringbuf operations (UNSUPPORTED - dynptr not implemented)
2178
static constexpr EbpfHelperPrototype bpf_ringbuf_reserve_dynptr_proto = {
2179
    .name = "ringbuf_reserve_dynptr",
2180
    .return_type = EBPF_RETURN_TYPE_PTR_TO_ALLOC_MEM_OR_NULL,
2181
    .argument_type =
2182
        {
2183
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2184
            EBPF_ARGUMENT_TYPE_ANYTHING,
2185
            EBPF_ARGUMENT_TYPE_ANYTHING,
2186
            EBPF_ARGUMENT_TYPE_ANYTHING,
2187
        },
2188
    .unsupported = true,
2189
};
2190

2191
static constexpr EbpfHelperPrototype bpf_ringbuf_submit_dynptr_proto = {
2192
    .name = "ringbuf_submit_dynptr",
2193
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2194
    .argument_type =
2195
        {
2196
            EBPF_ARGUMENT_TYPE_ANYTHING,
2197
            EBPF_ARGUMENT_TYPE_ANYTHING,
2198
        },
2199
    .unsupported = true,
2200
};
2201

2202
// Helper 199 - ringbuf_discard_dynptr
2203
static constexpr EbpfHelperPrototype bpf_ringbuf_discard_dynptr_proto = {
2204
    .name = "ringbuf_discard_dynptr",
2205
    .return_type = EBPF_RETURN_TYPE_INTEGER, // Returns void (always succeeds) = 0
2206
    .argument_type =
2207
        {
2208
            EBPF_ARGUMENT_TYPE_ANYTHING, // ptr (dynptr)
2209
            EBPF_ARGUMENT_TYPE_ANYTHING, // flags
2210
        },
2211
    .unsupported = true,
2212
};
2213

2214
// Socket type conversions
2215
static constexpr EbpfHelperPrototype bpf_skc_to_mptcp_sock_proto = {
2216
    .name = "skc_to_mptcp_sock",
2217
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
2218
    .argument_type =
2219
        {
2220
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
2221
        },
2222
};
2223

2224
// Copy from user task
2225
static constexpr EbpfHelperPrototype bpf_copy_from_user_task_proto = {
2226
    .name = "copy_from_user_task",
2227
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2228
    .argument_type =
2229
        {
2230
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
2231
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
2232
            EBPF_ARGUMENT_TYPE_ANYTHING,
2233
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2234
            EBPF_ARGUMENT_TYPE_ANYTHING,
2235
        },
2236
};
2237

2238
// Return value operations
2239
static constexpr EbpfHelperPrototype bpf_set_retval_proto = {
2240
    .name = "set_retval",
2241
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2242
    .argument_type =
2243
        {
2244
            EBPF_ARGUMENT_TYPE_ANYTHING,
2245
        },
2246
};
2247

2248
static constexpr EbpfHelperPrototype bpf_get_retval_proto = {
2249
    .name = "get_retval",
2250
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2251
};
2252

2253
// User ringbuf (UNSUPPORTED - user ringbuf not implemented)
2254
static constexpr EbpfHelperPrototype bpf_user_ringbuf_drain_proto = {
2255
    .name = "user_ringbuf_drain",
2256
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2257
    .argument_type =
2258
        {
2259
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2260
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2261
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
2262
            EBPF_ARGUMENT_TYPE_ANYTHING,
2263
        },
2264
    .unsupported = true,
2265
};
2266

2267
// Cgroup storage
2268
static constexpr EbpfHelperPrototype bpf_cgrp_storage_get_proto = {
2269
    .name = "cgrp_storage_get",
2270
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
2271
    .argument_type =
2272
        {
2273
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2274
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2275
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,
2276
            EBPF_ARGUMENT_TYPE_ANYTHING,
2277
        },
2278
};
2279

2280
static constexpr EbpfHelperPrototype bpf_cgrp_storage_delete_proto = {
2281
    .name = "cgrp_storage_delete",
2282
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2283
    .argument_type =
2284
        {
2285
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2286
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2287
        },
2288
};
2289
// Helper 83 - skb_ancestor_cgroup_id
2290
static constexpr EbpfHelperPrototype bpf_skb_ancestor_cgroup_id_proto = {
2291
    .name = "skb_ancestor_cgroup_id",
2292
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2293
    .argument_type =
2294
        {
2295
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2296
            EBPF_ARGUMENT_TYPE_ANYTHING, // ancestor_level
2297
        },
2298
    .context_descriptor = &g_sk_buff,
2299
};
2300

2301
// Helper 122 - get_netns_cookie
2302
static constexpr EbpfHelperPrototype bpf_get_netns_cookie_proto = {
2303
    .name = "get_netns_cookie",
2304
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2305
    .argument_type =
2306
        {
2307
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX, // Can be NULL or various context types
2308
        },
2309
};
2310

2311
// Helper 142 - load_hdr_opt (sock_ops_load_hdr_opt)
2312
static constexpr EbpfHelperPrototype bpf_load_hdr_opt_proto = {
2313
    .name = "load_hdr_opt",
2314
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2315
    .argument_type =
2316
        {
2317
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2318
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // searchby_res
2319
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2320
            EBPF_ARGUMENT_TYPE_ANYTHING,            // flags
2321
        },
2322
    .context_descriptor = &g_sock_ops_descr,
2323
};
2324

2325
// Helper 143 - store_hdr_opt (sock_ops_store_hdr_opt)
2326
static constexpr EbpfHelperPrototype bpf_store_hdr_opt_proto = {
2327
    .name = "store_hdr_opt",
2328
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2329
    .argument_type =
2330
        {
2331
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2332
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // from
2333
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2334
            EBPF_ARGUMENT_TYPE_ANYTHING,            // flags
2335
        },
2336
    .context_descriptor = &g_sock_ops_descr,
2337
};
2338

2339
// Helper 144 - reserve_hdr_opt (sock_ops_reserve_hdr_opt)
2340
static constexpr EbpfHelperPrototype bpf_reserve_hdr_opt_proto = {
2341
    .name = "reserve_hdr_opt",
2342
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2343
    .argument_type =
2344
        {
2345
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2346
            EBPF_ARGUMENT_TYPE_ANYTHING, // len
2347
            EBPF_ARGUMENT_TYPE_ANYTHING, // flags
2348
        },
2349
    .context_descriptor = &g_sock_ops_descr,
2350
};
2351

2352
// Helper 188 - xdp_get_buff_len
2353
static constexpr EbpfHelperPrototype bpf_xdp_get_buff_len_proto = {
2354
    .name = "xdp_get_buff_len",
2355
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2356
    .argument_type =
2357
        {
2358
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2359
        },
2360
    .context_descriptor = &g_xdp_md,
2361
};
2362

2363
// Helper 189 - xdp_load_bytes
2364
static constexpr EbpfHelperPrototype bpf_xdp_load_bytes_proto = {
2365
    .name = "xdp_load_bytes",
2366
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2367
    .argument_type =
2368
        {
2369
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2370
            EBPF_ARGUMENT_TYPE_ANYTHING,            // offset
2371
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // buf
2372
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2373
        },
2374
    .context_descriptor = &g_xdp_md,
2375
};
2376

2377
// Helper 190 - xdp_store_bytes
2378
static constexpr EbpfHelperPrototype bpf_xdp_store_bytes_proto = {
2379
    .name = "xdp_store_bytes",
2380
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2381
    .argument_type =
2382
        {
2383
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2384
            EBPF_ARGUMENT_TYPE_ANYTHING,            // offset
2385
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // buf
2386
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2387
        },
2388
    .context_descriptor = &g_xdp_md,
2389
};
2390

2391
// Helper 192 - skb_set_tstamp
2392
static constexpr EbpfHelperPrototype bpf_skb_set_tstamp_proto = {
2393
    .name = "skb_set_tstamp",
2394
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2395
    .argument_type =
2396
        {
2397
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2398
            EBPF_ARGUMENT_TYPE_ANYTHING, // tstamp (u64)
2399
            EBPF_ARGUMENT_TYPE_ANYTHING, // tstamp_type (u32)
2400
        },
2401
    .context_descriptor = &g_sk_buff,
2402
};
2403

2404
// Helper 193 - ima_file_hash
2405
static constexpr EbpfHelperPrototype bpf_ima_file_hash_proto = {
2406
    .name = "ima_file_hash",
2407
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2408
    .argument_type =
2409
        {
2410
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,       // file
2411
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // dst
2412
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // size
2413
        },
2414
};
2415

2416
// Helper 194 - kptr_xchg
2417
static constexpr EbpfHelperPrototype bpf_kptr_xchg_proto = {
2418
    .name = "kptr_xchg",
2419
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
2420
    .argument_type =
2421
        {
2422
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE, // dst (kptr location)
2423
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,    // ptr (can be NULL)
2424
        },
2425
};
2426

2427
// Helper 197 - dynptr_from_mem (UNSUPPORTED - dynptr not implemented)
2428
static constexpr EbpfHelperPrototype bpf_dynptr_from_mem_proto = {
2429
    .name = "dynptr_from_mem",
2430
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2431
    .argument_type =
2432
        {
2433
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,    // data
2434
            EBPF_ARGUMENT_TYPE_ANYTHING,            // size
2435
            EBPF_ARGUMENT_TYPE_ANYTHING,            // flags
2436
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // ptr (dynptr out)
2437
        },
2438
    .unsupported = true,
2439
};
2440

2441
// Helper 201 - dynptr_read
2442
static constexpr EbpfHelperPrototype bpf_dynptr_read_proto = {
2443
    .name = "dynptr_read",
2444
    .return_type = EBPF_RETURN_TYPE_INTEGER, // Returns 0 on success, negative error on failure
2445
    .argument_type =
2446
        {
2447
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // dst
2448
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2449
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // src (dynptr)
2450
            EBPF_ARGUMENT_TYPE_ANYTHING,            // offset
2451
            EBPF_ARGUMENT_TYPE_ANYTHING,            // flags
2452
        },
2453
    .unsupported = true,
2454
};
2455

2456
// Helper 202 - dynptr_write
2457
static constexpr EbpfHelperPrototype bpf_dynptr_write_proto = {
2458
    .name = "dynptr_write",
2459
    .return_type = EBPF_RETURN_TYPE_INTEGER, // Returns 0 on success, negative error on failure
2460
    .argument_type =
2461
        {
2462
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // dst (dynptr)
2463
            EBPF_ARGUMENT_TYPE_ANYTHING,            // offset
2464
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // src
2465
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2466
            EBPF_ARGUMENT_TYPE_ANYTHING,            // flags
2467
        },
2468
    .unsupported = true,
2469
};
2470

2471
// Helper 203 - dynptr_data
2472
static constexpr EbpfHelperPrototype bpf_dynptr_data_proto = {
2473
    .name = "dynptr_data",
2474
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID_OR_NULL, // Pointer or NULL
2475
    .argument_type =
2476
        {
2477
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // ptr (dynptr)
2478
            EBPF_ARGUMENT_TYPE_ANYTHING,            // offset
2479
            EBPF_ARGUMENT_TYPE_ANYTHING,            // len
2480
        },
2481
    .unsupported = true,
2482
};
2483

2484
// Helper 204 - tcp_raw_gen_syncookie_ipv4
2485
static constexpr EbpfHelperPrototype bpf_tcp_raw_gen_syncookie_ipv4_proto = {
2486
    .name = "tcp_raw_gen_syncookie_ipv4",
2487
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2488
    .argument_type =
2489
        {
2490
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // iph
2491
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // th
2492
            EBPF_ARGUMENT_TYPE_ANYTHING,            // th_len
2493
        },
2494
};
2495

2496
// Helper 205 - tcp_raw_gen_syncookie_ipv6
2497
static constexpr EbpfHelperPrototype bpf_tcp_raw_gen_syncookie_ipv6_proto = {
2498
    .name = "tcp_raw_gen_syncookie_ipv6",
2499
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2500
    .argument_type =
2501
        {
2502
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // iph
2503
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // th
2504
            EBPF_ARGUMENT_TYPE_ANYTHING,            // th_len
2505
        },
2506
};
2507

2508
// Helper 206 - tcp_raw_check_syncookie_ipv4
2509
static constexpr EbpfHelperPrototype bpf_tcp_raw_check_syncookie_ipv4_proto = {
2510
    .name = "tcp_raw_check_syncookie_ipv4",
2511
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2512
    .argument_type =
2513
        {
2514
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // iph
2515
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // th
2516
        },
2517
};
2518

2519
// Helper 207 - tcp_raw_check_syncookie_ipv6
2520
static constexpr EbpfHelperPrototype bpf_tcp_raw_check_syncookie_ipv6_proto = {
2521
    .name = "tcp_raw_check_syncookie_ipv6",
2522
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2523
    .argument_type =
2524
        {
2525
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // iph
2526
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // th
2527
        },
2528
};
2529

2530
#define FN(N, x) bpf_##x##_proto
2531
static constexpr EbpfHelperPrototype prototypes[] = {
2532
    FN(0, unspec),
2533
    FN(1, map_lookup_elem),
2534
    FN(2, map_update_elem),
2535
    FN(3, map_delete_elem),
2536
    FN(4, probe_read),
2537
    FN(5, ktime_get_ns),
2538
    FN(6, trace_printk),
2539
    FN(7, get_prandom_u32),
2540
    FN(8, get_smp_processor_id),
2541
    FN(9, skb_store_bytes),
2542
    FN(10, l3_csum_replace),
2543
    FN(11, l4_csum_replace),
2544
    FN(12, tail_call),
2545
    FN(13, clone_redirect),
2546
    FN(14, get_current_pid_tgid),
2547
    FN(15, get_current_uid_gid),
2548
    FN(16, get_current_comm),
2549
    FN(17, get_cgroup_classid),
2550
    FN(18, skb_vlan_push),
2551
    FN(19, skb_vlan_pop),
2552
    FN(20, skb_get_tunnel_key),
2553
    FN(21, skb_set_tunnel_key),
2554
    FN(22, perf_event_read),
2555
    FN(23, redirect),
2556
    FN(24, get_route_realm),
2557
    FN(25, perf_event_output),
2558
    FN(26, skb_load_bytes),
2559
    FN(27, get_stackid),
2560
    FN(28, csum_diff),
2561
    FN(29, skb_get_tunnel_opt),
2562
    FN(30, skb_set_tunnel_opt),
2563
    FN(31, skb_change_proto),
2564
    FN(32, skb_change_type),
2565
    FN(33, skb_under_cgroup),
2566
    FN(34, get_hash_recalc),
2567
    FN(35, get_current_task),
2568
    FN(36, probe_write_user),
2569
    FN(37, current_task_under_cgroup),
2570
    FN(38, skb_change_tail),
2571
    FN(39, skb_pull_data),
2572
    FN(40, csum_update),
2573
    FN(41, set_hash_invalid),
2574
    FN(42, get_numa_node_id),
2575
    FN(43, skb_change_head),
2576
    FN(44, xdp_adjust_head),
2577
    FN(45, probe_read_str),
2578
    FN(46, get_socket_cookie),
2579
    FN(47, get_socket_uid),
2580
    FN(48, set_hash),
2581
    FN(49, setsockopt),
2582
    FN(50, skb_adjust_room),
2583
    FN(51, redirect_map),
2584
    FN(52, sk_redirect_map),
2585
    FN(53, sock_map_update),
2586
    FN(54, xdp_adjust_meta),
2587
    FN(55, perf_event_read_value),
2588
    FN(56, perf_prog_read_value),
2589
    FN(57, getsockopt),
2590
    FN(58, override_return),
2591
    FN(59, sock_ops_cb_flags_set),
2592
    FN(60, msg_redirect_map),
2593
    FN(61, msg_apply_bytes),
2594
    FN(62, msg_cork_bytes),
2595
    FN(63, msg_pull_data),
2596
    FN(64, bind),
2597
    FN(65, xdp_adjust_tail),
2598
    FN(66, skb_get_xfrm_state),
2599
    FN(67, get_stack),
2600
    FN(68, skb_load_bytes_relative),
2601
    FN(69, fib_lookup),
2602
    FN(70, sock_hash_update),
2603
    FN(71, msg_redirect_hash),
2604
    FN(72, sk_redirect_hash),
2605
    FN(73, lwt_push_encap),
2606
    FN(74, lwt_seg6_store_bytes),
2607
    FN(75, lwt_seg6_adjust_srh),
2608
    FN(76, lwt_seg6_action),
2609
    FN(77, rc_repeat),
2610
    FN(78, rc_keydown),
2611
    FN(79, skb_cgroup_id),
2612
    FN(80, get_current_cgroup_id),
2613
    FN(81, get_local_storage),
2614
    FN(82, sk_select_reuseport),
2615
    FN(83, skb_ancestor_cgroup_id),
2616
    FN(84, sk_lookup_tcp),
2617
    FN(85, sk_lookup_udp),
2618
    FN(86, sk_release),
2619
    FN(87, map_push_elem),
2620
    FN(88, map_pop_elem),
2621
    FN(89, map_peek_elem),
2622
    FN(90, msg_push_data),
2623
    FN(91, msg_pop_data),
2624
    FN(92, rc_pointer_rel),
2625
    FN(93, spin_lock),
2626
    FN(94, spin_unlock),
2627
    FN(95, sk_fullsock),
2628
    FN(96, tcp_sock),
2629
    FN(97, skb_ecn_set_ce),
2630
    FN(98, get_listener_sock),
2631
    FN(99, skc_lookup_tcp),
2632
    FN(100, tcp_check_syncookie),
2633
    FN(101, sysctl_get_name),
2634
    FN(102, sysctl_get_current_value),
2635
    FN(103, sysctl_get_new_value),
2636
    FN(104, sysctl_set_new_value),
2637
    FN(105, strtol),
2638
    FN(106, strtoul),
2639
    FN(107, sk_storage_get),
2640
    FN(108, sk_storage_delete),
2641
    FN(109, send_signal),
2642
    FN(110, tcp_gen_syncookie),
2643
    FN(111, skb_output),
2644
    FN(112, probe_read_user),
2645
    FN(113, probe_read_kernel),
2646
    FN(114, probe_read_user_str),
2647
    FN(115, probe_read_kernel_str),
2648
    FN(116, tcp_send_ack),
2649
    FN(117, send_signal_thread),
2650
    FN(118, jiffies64),
2651
    FN(119, read_branch_records),
2652
    FN(120, get_ns_current_pid_tgid),
2653
    FN(121, xdp_output),
2654
    FN(122, get_netns_cookie),
2655
    FN(123, get_current_ancestor_cgroup_id),
2656
    FN(124, sk_assign),
2657
    FN(125, ktime_get_boot_ns),
2658
    FN(126, seq_printf),
2659
    FN(127, seq_write),
2660
    FN(128, sk_cgroup_id),
2661
    FN(129, sk_ancestor_cgroup_id),
2662
    FN(130, ringbuf_output),
2663
    FN(131, ringbuf_reserve),
2664
    FN(132, ringbuf_submit),
2665
    FN(133, ringbuf_discard),
2666
    FN(134, ringbuf_query),
2667
    FN(135, csum_level),
2668
    FN(136, skc_to_tcp6_sock),
2669
    FN(137, skc_to_tcp_sock),
2670
    FN(138, skc_to_tcp_timewait_sock),
2671
    FN(139, skc_to_tcp_request_sock),
2672
    FN(140, skc_to_udp6_sock),
2673
    FN(141, get_task_stack),
2674
    FN(142, load_hdr_opt),
2675
    FN(143, store_hdr_opt),
2676
    FN(144, reserve_hdr_opt),
2677
    FN(145, inode_storage_get),
2678
    FN(146, inode_storage_delete),
2679
    FN(147, d_path),
2680
    FN(148, copy_from_user),
2681
    FN(149, snprintf_btf),
2682
    FN(150, seq_printf_btf),
2683
    FN(151, skb_cgroup_classid),
2684
    FN(152, redirect_neigh),
2685
    FN(153, per_cpu_ptr),
2686
    FN(154, this_cpu_ptr),
2687
    FN(155, redirect_peer),
2688
    FN(156, task_storage_get),
2689
    FN(157, task_storage_delete),
2690
    FN(158, get_current_task_btf),
2691
    FN(159, bprm_opts_set),
2692
    FN(160, ktime_get_coarse_ns),
2693
    FN(161, ima_inode_hash),
2694
    FN(162, sock_from_file),
2695
    FN(163, check_mtu),
2696
    FN(164, for_each_map_elem),
2697
    FN(165, snprintf),
2698
    FN(166, sys_bpf),
2699
    FN(167, btf_find_by_name_kind),
2700
    FN(168, sys_close),
2701
    FN(169, timer_init),
2702
    FN(170, timer_set_callback),
2703
    FN(171, timer_start),
2704
    FN(172, timer_cancel),
2705
    FN(173, get_func_ip),
2706
    FN(174, get_attach_cookie),
2707
    FN(175, task_pt_regs),
2708
    FN(176, get_branch_snapshot),
2709
    FN(177, trace_vprintk),
2710
    FN(178, skc_to_unix_sock),
2711
    FN(179, kallsyms_lookup_name),
2712
    FN(180, find_vma),
2713
    FN(181, loop),
2714
    FN(182, strncmp),
2715
    FN(183, get_func_arg),
2716
    FN(184, get_func_ret),
2717
    FN(185, get_func_arg_cnt),
2718
    FN(186, get_retval),
2719
    FN(187, set_retval),
2720
    FN(188, xdp_get_buff_len),
2721
    FN(189, xdp_load_bytes),
2722
    FN(190, xdp_store_bytes),
2723
    FN(191, copy_from_user_task),
2724
    FN(192, skb_set_tstamp),
2725
    FN(193, ima_file_hash),
2726
    FN(194, kptr_xchg),
2727
    FN(195, map_lookup_percpu_elem),
2728
    FN(196, skc_to_mptcp_sock),
2729
    FN(197, dynptr_from_mem),
2730
    FN(198, ringbuf_reserve_dynptr),
2731
    FN(199, ringbuf_submit_dynptr),
2732
    FN(200, ringbuf_discard_dynptr),
2733
    FN(201, dynptr_read),
2734
    FN(202, dynptr_write),
2735
    FN(203, dynptr_data),
2736
    FN(204, tcp_raw_gen_syncookie_ipv4),
2737
    FN(205, tcp_raw_gen_syncookie_ipv6),
2738
    FN(206, tcp_raw_check_syncookie_ipv4),
2739
    FN(207, tcp_raw_check_syncookie_ipv6),
2740
    FN(208, ktime_get_tai_ns),
2741
    FN(209, user_ringbuf_drain),
2742
    FN(210, cgrp_storage_get),
2743
    FN(211, cgrp_storage_delete),
2744
};
2745

2746
bool is_helper_usable_linux(const int32_t n) {
41,076✔
2747
    if (n >= static_cast<int>(std::size(prototypes)) || n < 0) {
41,076✔
2748
        return false;
4✔
2749
    }
2750

2751
    // Check if explicitly marked as unsupported
2752
    if (prototypes[n].unsupported) {
41,068✔
2753
        return false;
2754
    }
2755

2756
    // If the helper has a context_descriptor, it must match the hook's context_descriptor.
2757
    if (prototypes[n].context_descriptor &&
44,935✔
2758
        prototypes[n].context_descriptor != thread_local_program_info->type.context_descriptor) {
7,734✔
2759
        return false;
1✔
2760
    }
2761

2762
    return true;
20,533✔
2763
}
2764

2765
EbpfHelperPrototype get_helper_prototype_linux(const int32_t n) {
21,012✔
2766
    if (!is_helper_usable_linux(n)) {
21,012✔
2767
        throw std::exception();
×
2768
    }
2769
    return prototypes[n];
21,012✔
2770
}
2771
} // namespace prevail
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc