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

Alan-Jowett / ebpf-verifier / 18949625295

28 Oct 2025 10:33AM UTC coverage: 87.448% (-1.0%) from 88.47%
18949625295

push

github

elazarg
Bump CLI11 to v2.6.1

Signed-off-by: Elazar Gershuni <elazarg@gmail.com>

9022 of 10317 relevant lines covered (87.45%)

10783407.68 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 "linux/gpl/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
// Constant allocation size, zero allowed (for dynamic memory allocation).
109
// Used by: bpf_ringbuf_reserve() (size parameter)
110
// Requires: Compile-time constant or bounded value, zero is valid (allocation fails gracefully)
111
// Note: Used to reserve variable-sized memory chunks
112
#define EBPF_ARGUMENT_TYPE_CONST_ALLOC_SIZE_OR_ZERO EBPF_ARGUMENT_TYPE_UNSUPPORTED
113

114
// Pointer to previously allocated memory (for release operations).
115
// Used by: bpf_ringbuf_submit(), bpf_ringbuf_discard()
116
// Requires: Verification that pointer was from bpf_ringbuf_reserve()
117
// Note: Verifier tracks allocation/release pairing
118
#define EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM EBPF_ARGUMENT_TYPE_UNSUPPORTED
119

120
// Alias: Allow NULL map value pointers (for optional map value arguments).
121
// Used by: bpf_sk_storage_get() (value parameter when creating new entry)
122
// Reason: Simplifies handling - same validation as non-nullable, plus NULL check
123
// Note: NULL means "use zero-initialized value" for storage creation
124
#define EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE
125

126
// Pointer to struct bpf_timer within a map value.
127
// Used by: bpf_timer_init(), bpf_timer_set_callback(), bpf_timer_start(), bpf_timer_cancel()
128
// Requires: BTF to locate timer field, proper initialization tracking
129
// Note: Timer must be in map value, similar constraints to spin locks
130
#define EBPF_ARGUMENT_TYPE_PTR_TO_TIMER EBPF_ARGUMENT_TYPE_UNSUPPORTED
131

132
// Pointer to per-CPU BTF-identified object.
133
// Used by: bpf_per_cpu_ptr() returns this, bpf_this_cpu_ptr()
134
// Requires: BTF type information, per-CPU variable handling
135
// Note: Points to per-CPU copy of kernel variable
136
#define EBPF_ARGUMENT_TYPE_PTR_TO_PERCPU_BTF_ID EBPF_ARGUMENT_TYPE_UNSUPPORTED
137

138
// Alias: Modern name for read-only memory pointer.
139
// Reason: Naming consistency with kernel terminology (readonly vs readable)
140
// Note: Functionally identical to PTR_TO_READABLE_MEM
141
#define EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM
142

143
// Alias: Modern name for optional read-only memory pointer.
144
// Reason: Naming consistency with kernel terminology
145
// Note: Functionally identical to PTR_TO_READABLE_MEM_OR_NULL
146
#define EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM_OR_NULL EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL
147

148
// Alias: Uninitialized map value (output parameter for map operations).
149
// Used by: bpf_map_pop_elem(), bpf_map_peek_elem()
150
// Reason: Semantically identical to PTR_TO_MAP_VALUE - memory will be written
151
// Note: Indicates helper will initialize the memory (pop/peek operations)
152
#define EBPF_ARGUMENT_TYPE_PTR_TO_UNINIT_MAP_VALUE EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE
153

154
// Alias: Const-qualified map pointer (helper won't modify map structure).
155
// Used by: bpf_map_peek_elem(), bpf_ringbuf_query() (read-only map operations)
156
// Reason: Same validation as PTR_TO_MAP - const is semantic documentation
157
// Note: Indicates helper only reads map metadata, doesn't modify map
158
#define EBPF_ARGUMENT_TYPE_CONST_PTR_TO_MAP EBPF_ARGUMENT_TYPE_PTR_TO_MAP
159

160
const ebpf_context_descriptor_t g_sk_buff = sk_buff;
161
const ebpf_context_descriptor_t g_xdp_md = xdp_md;
162
const ebpf_context_descriptor_t g_sk_msg_md = sk_msg_md;
163
const ebpf_context_descriptor_t g_unspec_descr = unspec_descr;
164
const ebpf_context_descriptor_t g_cgroup_dev_descr = cgroup_dev_descr;
165
const ebpf_context_descriptor_t g_kprobe_descr = kprobe_descr;
166
const ebpf_context_descriptor_t g_tracepoint_descr = tracepoint_descr;
167
const ebpf_context_descriptor_t g_perf_event_descr = perf_event_descr;
168
const ebpf_context_descriptor_t g_cgroup_sock_descr = cgroup_sock_descr;
169
const ebpf_context_descriptor_t g_sock_ops_descr = sock_ops_descr;
170

171
// eBPF helpers are documented at the following links:
172
// https://github.com/iovisor/bpf-docs/blob/master/bpf_helpers.rst
173
// https://www.man7.org/linux/man-pages/man7/bpf-helpers.7.html
174

175
static constexpr EbpfHelperPrototype bpf_unspec_proto = {
176
    .name = "unspec",
177
    .return_type = EBPF_RETURN_TYPE_UNSUPPORTED,
178
};
179

180
constexpr EbpfHelperPrototype bpf_tail_call_proto = {
181
    .name = "tail_call",
182
    .return_type = EBPF_RETURN_TYPE_INTEGER_OR_NO_RETURN_IF_SUCCEED,
183
    .argument_type =
184
        {
185
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
186
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_OF_PROGRAMS,
187
            EBPF_ARGUMENT_TYPE_ANYTHING,
188
        },
189
};
190

191
static constexpr EbpfHelperPrototype bpf_override_return_proto = {
192
    .name = "override_return",
193
    .return_type = EBPF_RETURN_TYPE_INTEGER,
194
    .argument_type =
195
        {
196
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
197
            EBPF_ARGUMENT_TYPE_ANYTHING,
198
        },
199
};
200

201
static constexpr EbpfHelperPrototype bpf_probe_read_proto = {
202
    .name = "probe_read",
203
    .return_type = EBPF_RETURN_TYPE_INTEGER,
204
    .argument_type =
205
        {
206
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
207
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
208
            EBPF_ARGUMENT_TYPE_ANYTHING,
209
        },
210
};
211

212
static constexpr EbpfHelperPrototype bpf_probe_read_str_proto = {
213
    .name = "probe_read_str",
214
    .return_type = EBPF_RETURN_TYPE_INTEGER,
215
    .argument_type =
216
        {
217
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
218
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
219
            EBPF_ARGUMENT_TYPE_ANYTHING,
220
        },
221
};
222

223
static constexpr EbpfHelperPrototype bpf_probe_write_user_proto = {
224
    .name = "probe_write_user",
225
    .return_type = EBPF_RETURN_TYPE_INTEGER,
226
    .argument_type =
227
        {
228
            EBPF_ARGUMENT_TYPE_ANYTHING,
229
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
230
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
231
        },
232
};
233

234
static constexpr EbpfHelperPrototype bpf_trace_printk_proto = {
235
    .name = "trace_printk",
236
    .return_type = EBPF_RETURN_TYPE_INTEGER,
237
    .argument_type =
238
        {
239
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
240
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
241
        },
242
};
243

244
static constexpr EbpfHelperPrototype bpf_perf_event_read_proto = {
245
    .name = "perf_event_read",
246
    .return_type = EBPF_RETURN_TYPE_INTEGER,
247
    .argument_type =
248
        {
249
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
250
            EBPF_ARGUMENT_TYPE_ANYTHING,
251
        },
252
};
253

254
static constexpr EbpfHelperPrototype bpf_perf_event_read_value_proto = {
255
    .name = "perf_event_read_value",
256
    .return_type = EBPF_RETURN_TYPE_INTEGER,
257
    .argument_type =
258
        {
259
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
260
            EBPF_ARGUMENT_TYPE_ANYTHING,
261
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
262
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
263
        },
264
};
265

266
static constexpr EbpfHelperPrototype bpf_perf_event_output_proto = {
267
    .name = "perf_event_output",
268
    .return_type = EBPF_RETURN_TYPE_INTEGER,
269
    .argument_type =
270
        {
271
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
272
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
273
            EBPF_ARGUMENT_TYPE_ANYTHING,
274
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
275
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
276
        },
277
};
278

279
static constexpr EbpfHelperPrototype bpf_get_current_task_proto = {
280
    .name = "get_current_task",
281
    .return_type = EBPF_RETURN_TYPE_INTEGER,
282
};
283

284
static constexpr EbpfHelperPrototype bpf_current_task_under_cgroup_proto = {
285
    .name = "current_task_under_cgroup",
286
    .return_type = EBPF_RETURN_TYPE_INTEGER,
287
    .argument_type =
288
        {
289
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
290
            EBPF_ARGUMENT_TYPE_ANYTHING,
291
        },
292
};
293

294
static constexpr EbpfHelperPrototype bpf_perf_prog_read_value_proto = {
295
    .name = "perf_prog_read_value",
296
    .return_type = EBPF_RETURN_TYPE_INTEGER,
297
    .argument_type =
298
        {
299
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
300
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
301
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
302
        },
303
    .context_descriptor = &g_perf_event_descr,
304
};
305

306
static constexpr EbpfHelperPrototype bpf_map_lookup_elem_proto = {
307
    .name = "map_lookup_elem",
308
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
309
    .argument_type =
310
        {
311
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
312
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
313
            EBPF_ARGUMENT_TYPE_DONTCARE,
314
            EBPF_ARGUMENT_TYPE_DONTCARE,
315
            EBPF_ARGUMENT_TYPE_DONTCARE,
316
        },
317
};
318

319
static constexpr EbpfHelperPrototype bpf_map_update_elem_proto = {
320
    .name = "map_update_elem",
321
    .return_type = EBPF_RETURN_TYPE_INTEGER,
322
    .argument_type =
323
        {
324
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
325
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
326
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,
327
            EBPF_ARGUMENT_TYPE_ANYTHING,
328
            EBPF_ARGUMENT_TYPE_DONTCARE,
329
        },
330
};
331

332
static constexpr EbpfHelperPrototype bpf_map_delete_elem_proto = {
333
    .name = "map_delete_elem",
334
    .return_type = EBPF_RETURN_TYPE_INTEGER,
335
    .argument_type =
336
        {
337
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
338
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
339
            EBPF_ARGUMENT_TYPE_DONTCARE,
340
            EBPF_ARGUMENT_TYPE_DONTCARE,
341
            EBPF_ARGUMENT_TYPE_DONTCARE,
342
        },
343
};
344

345
static constexpr EbpfHelperPrototype bpf_get_prandom_u32_proto = {
346
    .name = "get_prandom_u32",
347
    .return_type = EBPF_RETURN_TYPE_INTEGER,
348
};
349

350
static constexpr EbpfHelperPrototype bpf_get_smp_processor_id_proto = {
351
    .name = "get_smp_processor_id",
352
    .return_type = EBPF_RETURN_TYPE_INTEGER,
353
};
354

355
static constexpr EbpfHelperPrototype bpf_get_numa_node_id_proto = {
356
    .name = "get_numa_node_id",
357
    .return_type = EBPF_RETURN_TYPE_INTEGER,
358
};
359

360
static constexpr EbpfHelperPrototype bpf_ktime_get_ns_proto = {
361
    .name = "ktime_get_ns",
362
    .return_type = EBPF_RETURN_TYPE_INTEGER,
363
};
364

365
static constexpr EbpfHelperPrototype bpf_get_current_pid_tgid_proto = {
366
    .name = "get_current_pid_tgid",
367
    .return_type = EBPF_RETURN_TYPE_INTEGER,
368
};
369

370
static constexpr EbpfHelperPrototype bpf_get_current_uid_gid_proto = {
371
    .name = "get_current_uid_gid",
372
    .return_type = EBPF_RETURN_TYPE_INTEGER,
373
};
374

375
static constexpr EbpfHelperPrototype bpf_get_current_comm_proto = {
376
    .name = "get_current_comm",
377
    .return_type = EBPF_RETURN_TYPE_INTEGER,
378
    .argument_type =
379
        {
380
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
381
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
382
        },
383
};
384

385
static constexpr EbpfHelperPrototype bpf_get_current_cgroup_id_proto = {
386
    .name = "get_current_cgroup_id",
387
    .return_type = EBPF_RETURN_TYPE_INTEGER,
388
};
389

390
static constexpr EbpfHelperPrototype bpf_sock_map_update_proto = {
391
    .name = "sock_map_update",
392
    .return_type = EBPF_RETURN_TYPE_INTEGER,
393
    .argument_type =
394
        {
395
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
396
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
397
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
398
            EBPF_ARGUMENT_TYPE_ANYTHING,
399
            EBPF_ARGUMENT_TYPE_DONTCARE,
400
        },
401
    .context_descriptor = &g_sock_ops_descr,
402
};
403

404
static constexpr EbpfHelperPrototype bpf_sock_hash_update_proto = {
405
    .name = "sock_hash_update",
406
    .return_type = EBPF_RETURN_TYPE_INTEGER,
407
    .argument_type =
408
        {
409
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
410
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
411
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
412
            EBPF_ARGUMENT_TYPE_ANYTHING,
413
            EBPF_ARGUMENT_TYPE_DONTCARE,
414
        },
415
    .context_descriptor = &g_sock_ops_descr,
416
};
417

418
static constexpr EbpfHelperPrototype bpf_get_stackid_proto = {
419
    .name = "get_stackid",
420
    .return_type = EBPF_RETURN_TYPE_INTEGER,
421
    .argument_type =
422
        {
423
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
424
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
425
            EBPF_ARGUMENT_TYPE_ANYTHING,
426
        },
427
};
428

429
static constexpr EbpfHelperPrototype bpf_get_stack_proto = {
430
    .name = "get_stack",
431
    .return_type = EBPF_RETURN_TYPE_INTEGER,
432
    .argument_type =
433
        {
434
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
435
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
436
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
437
            EBPF_ARGUMENT_TYPE_ANYTHING,
438
        },
439
};
440

441
static constexpr EbpfHelperPrototype bpf_skb_store_bytes_proto = {
442
    .name = "skb_store_bytes",
443
    .return_type = EBPF_RETURN_TYPE_INTEGER,
444
    .argument_type =
445
        {
446
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
447
            EBPF_ARGUMENT_TYPE_ANYTHING,
448
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
449
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
450
            EBPF_ARGUMENT_TYPE_ANYTHING,
451
        },
452
    .context_descriptor = &g_sk_buff,
453
};
454

455
static constexpr EbpfHelperPrototype bpf_skb_load_bytes_proto = {
456
    .name = "skb_load_bytes",
457
    .return_type = EBPF_RETURN_TYPE_INTEGER,
458
    .argument_type =
459
        {
460
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
461
            EBPF_ARGUMENT_TYPE_ANYTHING,
462
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
463
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
464
        },
465
    .context_descriptor = &g_sk_buff,
466
};
467

468
static constexpr EbpfHelperPrototype bpf_skb_load_bytes_relative_proto = {
469
    .name = "skb_load_bytes_relative",
470
    .return_type = EBPF_RETURN_TYPE_INTEGER,
471
    .argument_type =
472
        {
473
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
474
            EBPF_ARGUMENT_TYPE_ANYTHING,
475
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
476
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
477
            EBPF_ARGUMENT_TYPE_ANYTHING,
478
        },
479
    .context_descriptor = &g_sk_buff,
480
};
481

482
static constexpr EbpfHelperPrototype bpf_skb_pull_data_proto = {
483
    .name = "skb_pull_data",
484
    .return_type = EBPF_RETURN_TYPE_INTEGER,
485
    .argument_type =
486
        {
487
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
488
            EBPF_ARGUMENT_TYPE_ANYTHING,
489
        },
490
    .context_descriptor = &g_sk_buff,
491
};
492

493
static constexpr EbpfHelperPrototype bpf_l3_csum_replace_proto = {
494
    .name = "l3_csum_replace",
495
    .return_type = EBPF_RETURN_TYPE_INTEGER,
496
    .argument_type =
497
        {
498
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
499
            EBPF_ARGUMENT_TYPE_ANYTHING,
500
            EBPF_ARGUMENT_TYPE_ANYTHING,
501
            EBPF_ARGUMENT_TYPE_ANYTHING,
502
            EBPF_ARGUMENT_TYPE_ANYTHING,
503
        },
504
    .context_descriptor = &g_sk_buff,
505
};
506

507
static constexpr EbpfHelperPrototype bpf_l4_csum_replace_proto = {
508
    .name = "l4_csum_replace",
509
    .return_type = EBPF_RETURN_TYPE_INTEGER,
510
    .argument_type =
511
        {
512
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
513
            EBPF_ARGUMENT_TYPE_ANYTHING,
514
            EBPF_ARGUMENT_TYPE_ANYTHING,
515
            EBPF_ARGUMENT_TYPE_ANYTHING,
516
            EBPF_ARGUMENT_TYPE_ANYTHING,
517
        },
518
    .context_descriptor = &g_sk_buff,
519
};
520

521
static constexpr EbpfHelperPrototype bpf_csum_diff_proto = {
522
    .name = "csum_diff",
523
    .return_type = EBPF_RETURN_TYPE_INTEGER,
524
    .argument_type =
525
        {
526
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
527
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
528
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
529
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
530
            EBPF_ARGUMENT_TYPE_ANYTHING,
531
        },
532
};
533

534
static constexpr EbpfHelperPrototype bpf_csum_update_proto = {
535
    .name = "csum_update",
536
    .return_type = EBPF_RETURN_TYPE_INTEGER,
537
    .argument_type =
538
        {
539
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
540
            EBPF_ARGUMENT_TYPE_ANYTHING,
541
        },
542
    .context_descriptor = &g_sk_buff,
543
};
544

545
static constexpr EbpfHelperPrototype bpf_clone_redirect_proto = {
546
    .name = "clone_redirect",
547
    .return_type = EBPF_RETURN_TYPE_INTEGER,
548
    .argument_type =
549
        {
550
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
551
            EBPF_ARGUMENT_TYPE_ANYTHING,
552
            EBPF_ARGUMENT_TYPE_ANYTHING,
553
        },
554
    .context_descriptor = &g_sk_buff,
555
};
556

557
static constexpr EbpfHelperPrototype bpf_redirect_proto = {
558
    .name = "redirect",
559
    .return_type = EBPF_RETURN_TYPE_INTEGER,
560
    .argument_type =
561
        {
562
            EBPF_ARGUMENT_TYPE_ANYTHING,
563
            EBPF_ARGUMENT_TYPE_ANYTHING,
564
        },
565
};
566

567
static constexpr EbpfHelperPrototype bpf_sk_redirect_hash_proto = {
568
    .name = "sk_redirect_hash",
569
    .return_type = EBPF_RETURN_TYPE_INTEGER,
570
    .argument_type =
571
        {
572
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
573
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
574
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
575
            EBPF_ARGUMENT_TYPE_ANYTHING,
576
        },
577
    .context_descriptor = &g_sk_buff,
578
};
579

580
static constexpr EbpfHelperPrototype bpf_sk_redirect_map_proto = {
581
    .name = "sk_redirect_map",
582
    .return_type = EBPF_RETURN_TYPE_INTEGER,
583
    .argument_type =
584
        {
585
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
586
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
587
            EBPF_ARGUMENT_TYPE_ANYTHING,
588
            EBPF_ARGUMENT_TYPE_ANYTHING,
589
        },
590
    .context_descriptor = &g_sk_buff,
591
};
592

593
static constexpr EbpfHelperPrototype bpf_msg_redirect_hash_proto = {
594
    .name = "msg_redirect_hash",
595
    .return_type = EBPF_RETURN_TYPE_INTEGER,
596
    .argument_type =
597
        {
598
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
599
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
600
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
601
            EBPF_ARGUMENT_TYPE_ANYTHING,
602
        },
603
    .context_descriptor = &g_sk_msg_md,
604
};
605

606
static constexpr EbpfHelperPrototype bpf_msg_redirect_map_proto = {
607
    .name = "msg_redirect_map",
608
    .return_type = EBPF_RETURN_TYPE_INTEGER,
609
    .argument_type =
610
        {
611
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
612
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
613
            EBPF_ARGUMENT_TYPE_ANYTHING,
614
            EBPF_ARGUMENT_TYPE_ANYTHING,
615
        },
616
    .context_descriptor = &g_sk_msg_md,
617
};
618

619
static constexpr EbpfHelperPrototype bpf_msg_apply_bytes_proto = {
620
    .name = "msg_apply_bytes",
621
    .return_type = EBPF_RETURN_TYPE_INTEGER,
622
    .argument_type =
623
        {
624
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
625
            EBPF_ARGUMENT_TYPE_ANYTHING,
626
        },
627
    .context_descriptor = &g_sk_msg_md,
628
};
629

630
static constexpr EbpfHelperPrototype bpf_msg_cork_bytes_proto = {
631
    .name = "msg_cork_bytes",
632
    .return_type = EBPF_RETURN_TYPE_INTEGER,
633
    .argument_type =
634
        {
635
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
636
            EBPF_ARGUMENT_TYPE_ANYTHING,
637
        },
638
    .context_descriptor = &g_sk_msg_md,
639
};
640

641
static constexpr EbpfHelperPrototype bpf_msg_pull_data_proto = {
642
    .name = "msg_pull_data",
643
    .return_type = EBPF_RETURN_TYPE_INTEGER,
644
    .argument_type =
645
        {
646
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
647
            EBPF_ARGUMENT_TYPE_ANYTHING,
648
            EBPF_ARGUMENT_TYPE_ANYTHING,
649
            EBPF_ARGUMENT_TYPE_ANYTHING,
650
        },
651
    .context_descriptor = &g_sk_msg_md,
652
};
653
static constexpr EbpfHelperPrototype bpf_get_cgroup_classid_proto = {
654
    .name = "get_cgroup_classid",
655
    .return_type = EBPF_RETURN_TYPE_INTEGER,
656
    .argument_type =
657
        {
658
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
659
        },
660
    .context_descriptor = &g_sk_buff,
661
};
662

663
static constexpr EbpfHelperPrototype bpf_get_route_realm_proto = {
664
    .name = "get_route_realm",
665
    .return_type = EBPF_RETURN_TYPE_INTEGER,
666
    .argument_type =
667
        {
668
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
669
        },
670
    .context_descriptor = &g_sk_buff,
671
};
672

673
static constexpr EbpfHelperPrototype bpf_get_hash_recalc_proto = {
674
    .name = "get_hash_recalc",
675
    .return_type = EBPF_RETURN_TYPE_INTEGER,
676
    .argument_type =
677
        {
678
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
679
        },
680
    .context_descriptor = &g_sk_buff,
681
};
682

683
static constexpr EbpfHelperPrototype bpf_set_hash_invalid_proto = {
684
    .name = "set_hash_invalid",
685
    .return_type = EBPF_RETURN_TYPE_INTEGER,
686
    .argument_type =
687
        {
688
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
689
        },
690
    .context_descriptor = &g_sk_buff,
691
};
692

693
static constexpr EbpfHelperPrototype bpf_set_hash_proto = {
694
    .name = "set_hash",
695
    .return_type = EBPF_RETURN_TYPE_INTEGER,
696
    .argument_type =
697
        {
698
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
699
            EBPF_ARGUMENT_TYPE_ANYTHING,
700
        },
701
    .context_descriptor = &g_sk_buff,
702
};
703

704
static constexpr EbpfHelperPrototype bpf_skb_vlan_push_proto = {
705
    .name = "skb_vlan_push",
706
    .return_type = EBPF_RETURN_TYPE_INTEGER,
707
    .argument_type =
708
        {
709
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
710
            EBPF_ARGUMENT_TYPE_ANYTHING,
711
            EBPF_ARGUMENT_TYPE_ANYTHING,
712
        },
713
    .context_descriptor = &g_sk_buff,
714
};
715

716
static constexpr EbpfHelperPrototype bpf_skb_vlan_pop_proto = {
717
    .name = "skb_vlan_pop",
718
    .return_type = EBPF_RETURN_TYPE_INTEGER,
719
    .argument_type =
720
        {
721
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
722
        },
723
    .context_descriptor = &g_sk_buff,
724
};
725

726
static constexpr EbpfHelperPrototype bpf_skb_change_proto_proto = {
727
    .name = "skb_change_proto",
728
    .return_type = EBPF_RETURN_TYPE_INTEGER,
729
    .argument_type =
730
        {
731
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
732
            EBPF_ARGUMENT_TYPE_ANYTHING,
733
            EBPF_ARGUMENT_TYPE_ANYTHING,
734
        },
735
    .context_descriptor = &g_sk_buff,
736
};
737

738
static constexpr EbpfHelperPrototype bpf_skb_change_type_proto = {
739
    .name = "skb_change_type",
740
    .return_type = EBPF_RETURN_TYPE_INTEGER,
741
    .argument_type =
742
        {
743
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
744
            EBPF_ARGUMENT_TYPE_ANYTHING,
745
        },
746
    .context_descriptor = &g_sk_buff,
747
};
748

749
static constexpr EbpfHelperPrototype bpf_skb_adjust_room_proto = {
750
    .name = "skb_adjust_room",
751
    .return_type = EBPF_RETURN_TYPE_INTEGER,
752
    .argument_type =
753
        {
754
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
755
            EBPF_ARGUMENT_TYPE_ANYTHING,
756
            EBPF_ARGUMENT_TYPE_ANYTHING,
757
            EBPF_ARGUMENT_TYPE_ANYTHING,
758
        },
759
    .reallocate_packet = true,
760
    .context_descriptor = &g_sk_buff,
761
};
762

763
static constexpr EbpfHelperPrototype bpf_skb_change_tail_proto = {
764
    .name = "skb_change_tail",
765
    .return_type = EBPF_RETURN_TYPE_INTEGER,
766
    .argument_type =
767
        {
768
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
769
            EBPF_ARGUMENT_TYPE_ANYTHING,
770
            EBPF_ARGUMENT_TYPE_ANYTHING,
771
        },
772
    .context_descriptor = &g_sk_buff,
773
};
774

775
static constexpr EbpfHelperPrototype bpf_skb_change_head_proto = {
776
    .name = "skb_change_head",
777
    .return_type = EBPF_RETURN_TYPE_INTEGER,
778
    .argument_type =
779
        {
780
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
781
            EBPF_ARGUMENT_TYPE_ANYTHING,
782
            EBPF_ARGUMENT_TYPE_ANYTHING,
783
        },
784
    .reallocate_packet = true,
785
    .context_descriptor = &g_sk_buff,
786
};
787

788
static constexpr EbpfHelperPrototype bpf_xdp_adjust_head_proto = {
789
    .name = "xdp_adjust_head",
790
    .return_type = EBPF_RETURN_TYPE_INTEGER,
791
    .argument_type =
792
        {
793
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
794
            EBPF_ARGUMENT_TYPE_ANYTHING,
795
        },
796
    .reallocate_packet = true,
797
    .context_descriptor = &g_xdp_descr,
798
};
799

800
static constexpr EbpfHelperPrototype bpf_xdp_adjust_tail_proto = {
801
    .name = "xdp_adjust_tail",
802
    .return_type = EBPF_RETURN_TYPE_INTEGER,
803
    .argument_type =
804
        {
805
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
806
            EBPF_ARGUMENT_TYPE_ANYTHING,
807
        },
808
    .reallocate_packet = true,
809
    .context_descriptor = &g_xdp_descr,
810
};
811

812
static constexpr EbpfHelperPrototype bpf_xdp_adjust_meta_proto = {
813
    .name = "xdp_adjust_meta",
814
    .return_type = EBPF_RETURN_TYPE_INTEGER,
815
    .argument_type =
816
        {
817
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
818
            EBPF_ARGUMENT_TYPE_ANYTHING,
819
        },
820
    .reallocate_packet = true,
821
    .context_descriptor = &g_xdp_descr,
822
};
823

824
static constexpr EbpfHelperPrototype bpf_skb_get_tunnel_key_proto = {
825
    .name = "skb_get_tunnel_key",
826
    .return_type = EBPF_RETURN_TYPE_INTEGER,
827
    .argument_type =
828
        {
829
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
830
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
831
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
832
            EBPF_ARGUMENT_TYPE_ANYTHING,
833
        },
834
    .context_descriptor = &g_sk_buff,
835
};
836

837
static constexpr EbpfHelperPrototype bpf_skb_get_tunnel_opt_proto = {
838
    .name = "skb_get_tunnel_opt",
839
    .return_type = EBPF_RETURN_TYPE_INTEGER,
840
    .argument_type =
841
        {
842
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
843
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
844
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
845
        },
846
    .context_descriptor = &g_sk_buff,
847
};
848

849
static constexpr EbpfHelperPrototype bpf_skb_set_tunnel_key_proto = {
850
    .name = "skb_set_tunnel_key",
851
    .return_type = EBPF_RETURN_TYPE_INTEGER,
852
    .argument_type =
853
        {
854
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
855
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
856
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
857
            EBPF_ARGUMENT_TYPE_ANYTHING,
858
        },
859
    .context_descriptor = &g_sk_buff,
860
};
861

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

882
static constexpr EbpfHelperPrototype bpf_skb_under_cgroup_proto = {
883
    .name = "skb_under_cgroup",
884
    .return_type = EBPF_RETURN_TYPE_INTEGER,
885
    .argument_type =
886
        {
887
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
888
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
889
            EBPF_ARGUMENT_TYPE_ANYTHING,
890
        },
891
    .context_descriptor = &g_sk_buff,
892
};
893

894
static constexpr EbpfHelperPrototype bpf_skb_cgroup_id_proto = {
895
    .name = "skb_cgroup_id",
896
    .return_type = EBPF_RETURN_TYPE_INTEGER,
897
    .argument_type =
898
        {
899
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
900
        },
901
    .context_descriptor = &g_sk_buff,
902
};
903

904
static constexpr EbpfHelperPrototype bpf_get_socket_cookie_proto = {
905
    .name = "get_socket_cookie",
906
    .return_type = EBPF_RETURN_TYPE_INTEGER,
907
    .argument_type =
908
        {
909
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
910
        },
911
    .context_descriptor = &g_sk_buff,
912
};
913

914
static constexpr EbpfHelperPrototype bpf_get_socket_uid_proto = {
915
    .name = "get_socket_uid",
916
    .return_type = EBPF_RETURN_TYPE_INTEGER,
917
    .argument_type =
918
        {
919
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
920
        },
921
    .context_descriptor = &g_sk_buff,
922
};
923

924
static constexpr EbpfHelperPrototype bpf_setsockopt_proto = {
925
    .name = "setsockopt",
926
    .return_type = EBPF_RETURN_TYPE_INTEGER,
927
    .argument_type =
928
        {
929
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
930
            EBPF_ARGUMENT_TYPE_ANYTHING,
931
            EBPF_ARGUMENT_TYPE_ANYTHING,
932
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
933
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
934
        },
935
};
936

937
static constexpr EbpfHelperPrototype bpf_getsockopt_proto = {
938
    .name = "getsockopt",
939
    .return_type = EBPF_RETURN_TYPE_INTEGER,
940
    .argument_type =
941
        {
942
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
943
            EBPF_ARGUMENT_TYPE_ANYTHING,
944
            EBPF_ARGUMENT_TYPE_ANYTHING,
945
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
946
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
947
        },
948
};
949

950
static constexpr EbpfHelperPrototype bpf_sock_ops_cb_flags_set_proto = {
951
    .name = "sock_ops_cb_flags_set",
952
    .return_type = EBPF_RETURN_TYPE_INTEGER,
953
    .argument_type =
954
        {
955
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
956
            EBPF_ARGUMENT_TYPE_ANYTHING,
957
        },
958
    .context_descriptor = &g_sock_ops_descr,
959
};
960

961
static constexpr EbpfHelperPrototype bpf_bind_proto = {
962
    .name = "bind",
963
    .return_type = EBPF_RETURN_TYPE_INTEGER,
964
    .argument_type =
965
        {
966
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
967
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
968
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
969
        },
970
};
971

972
static constexpr EbpfHelperPrototype bpf_skb_get_xfrm_state_proto = {
973
    .name = "skb_get_xfrm_state",
974
    .return_type = EBPF_RETURN_TYPE_INTEGER,
975
    .argument_type =
976
        {
977
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
978
            EBPF_ARGUMENT_TYPE_ANYTHING,
979
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
980
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
981
            EBPF_ARGUMENT_TYPE_ANYTHING,
982
        },
983
    .context_descriptor = &g_sk_buff,
984
};
985

986
static constexpr EbpfHelperPrototype bpf_fib_lookup_proto = {
987
    .name = "fib_lookup",
988
    .return_type = EBPF_RETURN_TYPE_INTEGER,
989
    .argument_type =
990
        {
991
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
992
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
993
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
994
            EBPF_ARGUMENT_TYPE_ANYTHING,
995
        },
996
};
997

998
static constexpr EbpfHelperPrototype bpf_lwt_push_encap_proto = {
999
    .name = "lwt_push_encap",
1000
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1001
    .argument_type =
1002
        {
1003
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1004
            EBPF_ARGUMENT_TYPE_ANYTHING,
1005
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1006
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1007
        },
1008
    .context_descriptor = &g_sk_buff,
1009
};
1010

1011
static constexpr EbpfHelperPrototype bpf_lwt_seg6_store_bytes_proto = {
1012
    .name = "lwt_seg6_store_bytes",
1013
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1014
    .argument_type =
1015
        {
1016
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1017
            EBPF_ARGUMENT_TYPE_ANYTHING,
1018
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1019
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1020
        },
1021
    .context_descriptor = &g_sk_buff,
1022
};
1023

1024
static constexpr EbpfHelperPrototype bpf_lwt_seg6_action_proto = {
1025
    .name = "lwt_seg6_action",
1026
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1027
    .argument_type =
1028
        {
1029
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1030
            EBPF_ARGUMENT_TYPE_ANYTHING,
1031
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1032
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1033
        },
1034
    .context_descriptor = &g_sk_buff,
1035
};
1036

1037
static constexpr EbpfHelperPrototype bpf_lwt_seg6_adjust_srh_proto = {
1038
    .name = "lwt_seg6_adjust_srh",
1039
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1040
    .argument_type =
1041
        {
1042
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1043
            EBPF_ARGUMENT_TYPE_ANYTHING,
1044
            EBPF_ARGUMENT_TYPE_ANYTHING,
1045
        },
1046
    .reallocate_packet = true,
1047
    .context_descriptor = &g_sk_buff,
1048
};
1049

1050
static constexpr EbpfHelperPrototype bpf_rc_repeat_proto = {
1051
    .name = "rc_repeat",
1052
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1053
    .argument_type =
1054
        {
1055
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1056
        },
1057
};
1058

1059
static constexpr EbpfHelperPrototype bpf_rc_keydown_proto = {
1060
    .name = "rc_keydown",
1061
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1062
    .argument_type =
1063
        {
1064
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1065
            EBPF_ARGUMENT_TYPE_ANYTHING,
1066
            EBPF_ARGUMENT_TYPE_ANYTHING,
1067
            EBPF_ARGUMENT_TYPE_ANYTHING,
1068
        },
1069
};
1070

1071
static constexpr EbpfHelperPrototype bpf_get_local_storage_proto = {
1072
    .name = "get_local_storage",
1073
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE,
1074
    .argument_type =
1075
        {
1076
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1077
            EBPF_ARGUMENT_TYPE_ANYTHING,
1078
        },
1079
};
1080

1081
static constexpr EbpfHelperPrototype bpf_redirect_map_proto = {
1082
    .name = "redirect_map",
1083
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1084
    .argument_type =
1085
        {
1086
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1087
            EBPF_ARGUMENT_TYPE_ANYTHING,
1088
            EBPF_ARGUMENT_TYPE_ANYTHING,
1089
        },
1090
};
1091

1092
static constexpr EbpfHelperPrototype bpf_sk_select_reuseport_proto = {
1093
    .name = "sk_select_reuseport",
1094
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1095
    .argument_type{
1096
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1097
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1098
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
1099
        EBPF_ARGUMENT_TYPE_ANYTHING,
1100
    },
1101
};
1102

1103
static constexpr EbpfHelperPrototype bpf_get_current_ancestor_cgroup_id_proto = {
1104
    .name = "get_current_ancestor_cgroup_id",
1105
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1106
    .argument_type{
1107
        EBPF_ARGUMENT_TYPE_ANYTHING,
1108
    },
1109
};
1110

1111
static constexpr EbpfHelperPrototype bpf_sk_lookup_tcp_proto = {
1112
    .name = "sk_lookup_tcp",
1113
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCK_COMMON_OR_NULL,
1114
    .argument_type =
1115
        {
1116
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1117
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1118
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1119
            EBPF_ARGUMENT_TYPE_ANYTHING,
1120
            EBPF_ARGUMENT_TYPE_ANYTHING,
1121
        },
1122
};
1123
static constexpr EbpfHelperPrototype bpf_sk_lookup_udp_proto = {
1124
    .name = "sk_lookup_udp",
1125
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCKET_OR_NULL,
1126
    .argument_type{
1127
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1128
        EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1129
        EBPF_ARGUMENT_TYPE_CONST_SIZE,
1130
        EBPF_ARGUMENT_TYPE_ANYTHING,
1131
        EBPF_ARGUMENT_TYPE_ANYTHING,
1132
    },
1133
};
1134

1135
static constexpr EbpfHelperPrototype bpf_sk_release_proto = {
1136
    .name = "sk_release",
1137
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1138
    .argument_type =
1139
        {
1140
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1141
        },
1142
};
1143

1144
static constexpr EbpfHelperPrototype bpf_map_push_elem_proto = {
1145
    .name = "map_push_elem",
1146
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1147
    .argument_type{
1148
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1149
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,
1150
        EBPF_ARGUMENT_TYPE_ANYTHING,
1151
    },
1152
};
1153

1154
static constexpr EbpfHelperPrototype bpf_map_pop_elem_proto = {
1155
    .name = "map_pop_elem",
1156
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1157
    .argument_type{
1158
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1159
        EBPF_ARGUMENT_TYPE_PTR_TO_UNINIT_MAP_VALUE,
1160
    },
1161
};
1162

1163
static constexpr EbpfHelperPrototype bpf_map_peek_elem_proto = {
1164
    .name = "map_peek_elem",
1165
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1166
    .argument_type{
1167
        EBPF_ARGUMENT_TYPE_CONST_PTR_TO_MAP,
1168
        EBPF_ARGUMENT_TYPE_PTR_TO_UNINIT_MAP_VALUE,
1169
    },
1170
};
1171

1172
static constexpr EbpfHelperPrototype bpf_msg_push_data_proto = {
1173
    .name = "msg_push_data",
1174
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1175
    .argument_type{
1176
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1177
        EBPF_ARGUMENT_TYPE_ANYTHING,
1178
        EBPF_ARGUMENT_TYPE_ANYTHING,
1179
        EBPF_ARGUMENT_TYPE_ANYTHING,
1180
    },
1181
    .context_descriptor = &g_sk_msg_md,
1182
};
1183

1184
static constexpr EbpfHelperPrototype bpf_msg_pop_data_proto = {
1185
    .name = "msg_pop_data",
1186
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1187
    .argument_type{
1188
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1189
        EBPF_ARGUMENT_TYPE_ANYTHING,
1190
        EBPF_ARGUMENT_TYPE_ANYTHING,
1191
        EBPF_ARGUMENT_TYPE_ANYTHING,
1192
    },
1193
    .context_descriptor = &g_sk_msg_md,
1194
};
1195

1196
static constexpr EbpfHelperPrototype bpf_rc_pointer_rel_proto = {
1197
    .name = "rc_pointer_rel",
1198
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1199
    .argument_type{
1200
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1201
        EBPF_ARGUMENT_TYPE_ANYTHING,
1202
        EBPF_ARGUMENT_TYPE_ANYTHING,
1203
    },
1204
};
1205

1206
static constexpr EbpfHelperPrototype bpf_spin_lock_proto = {
1207
    .name = "spin_lock",
1208
    .return_type = EBPF_RETURN_TYPE_INTEGER, // returns 0
1209
    .argument_type =
1210
        {
1211
            EBPF_ARGUMENT_TYPE_PTR_TO_SPIN_LOCK,
1212
        },
1213
};
1214

1215
static constexpr EbpfHelperPrototype bpf_spin_unlock_proto = {
1216
    .name = "spin_unlock",
1217
    .return_type = EBPF_RETURN_TYPE_INTEGER, // returns 0
1218
    .argument_type =
1219
        {
1220
            EBPF_ARGUMENT_TYPE_PTR_TO_SPIN_LOCK,
1221
        },
1222
};
1223

1224
static constexpr EbpfHelperPrototype bpf_jiffies64_proto = {
1225
    .name = "jiffies64",
1226
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1227
};
1228

1229
static constexpr EbpfHelperPrototype bpf_sk_fullsock_proto = {
1230
    .name = "sk_fullsock",
1231
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCKET_OR_NULL,
1232
    .argument_type =
1233
        {
1234
            EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON,
1235
        },
1236
};
1237

1238
static constexpr EbpfHelperPrototype bpf_tcp_sock_proto = {
1239
    .name = "tcp_sock",
1240
    .return_type = EBPF_RETURN_TYPE_PTR_TO_TCP_SOCKET_OR_NULL,
1241
    .argument_type =
1242
        {
1243
            EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON,
1244
        },
1245
};
1246

1247
static constexpr EbpfHelperPrototype bpf_skb_ecn_set_ce_proto = {
1248
    .name = "skb_ecn_set_ce",
1249
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1250
    .argument_type =
1251
        {
1252
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1253
        },
1254
};
1255

1256
static constexpr EbpfHelperPrototype bpf_tcp_check_syncookie_proto = {
1257
    .name = "tcp_check_syncookie",
1258
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1259
    .argument_type =
1260
        {
1261
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1262
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1263
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1264
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1265
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1266
        },
1267
};
1268

1269
static constexpr EbpfHelperPrototype bpf_get_listener_sock_proto = {
1270
    .name = "get_listener_sock",
1271
    .return_type = EBPF_RETURN_TYPE_PTR_TO_TCP_SOCKET_OR_NULL,
1272
    .argument_type =
1273
        {
1274
            EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON,
1275
        },
1276
};
1277

1278
static constexpr EbpfHelperPrototype bpf_skc_lookup_tcp_proto = {
1279
    .name = "skc_lookup_tcp",
1280
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCK_COMMON_OR_NULL,
1281
    .argument_type =
1282
        {
1283
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1284
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1285
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1286
            EBPF_ARGUMENT_TYPE_ANYTHING,
1287
            EBPF_ARGUMENT_TYPE_ANYTHING,
1288
        },
1289
};
1290

1291
static constexpr EbpfHelperPrototype bpf_sysctl_get_name_proto = {
1292
    .name = "sysctl_get_name",
1293
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1294
    .argument_type =
1295
        {
1296
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1297
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1298
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1299
            EBPF_ARGUMENT_TYPE_ANYTHING,
1300
        },
1301
};
1302

1303
static constexpr EbpfHelperPrototype bpf_sysctl_get_current_value_proto = {
1304
    .name = "sysctl_get_current_value",
1305
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1306
    .argument_type =
1307
        {
1308
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1309
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1310
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1311
        },
1312
};
1313

1314
static constexpr EbpfHelperPrototype bpf_sysctl_get_new_value_proto = {
1315
    .name = "sysctl_get_new_value",
1316
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1317
    .argument_type =
1318
        {
1319
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1320
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1321
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1322
        },
1323
};
1324

1325
static constexpr EbpfHelperPrototype bpf_sysctl_set_new_value_proto = {
1326
    .name = "sysctl_set_new_value",
1327
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1328
    .argument_type =
1329
        {
1330
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1331
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1332
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1333
        },
1334
};
1335

1336
static constexpr EbpfHelperPrototype bpf_strtol_proto = {
1337
    .name = "strtol",
1338
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1339
    .argument_type =
1340
        {
1341
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1342
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1343
            EBPF_ARGUMENT_TYPE_ANYTHING,
1344
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
1345
        },
1346
};
1347

1348
static constexpr EbpfHelperPrototype bpf_strtoul_proto = {
1349
    .name = "strtoul",
1350
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1351
    .argument_type =
1352
        {
1353
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1354
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1355
            EBPF_ARGUMENT_TYPE_ANYTHING,
1356
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
1357
        },
1358
};
1359

1360
static constexpr EbpfHelperPrototype bpf_strncmp_proto = {
1361
    .name = "strncmp",
1362
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1363
    .argument_type =
1364
        {
1365
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1366
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1367
            EBPF_ARGUMENT_TYPE_PTR_TO_CONST_STR,
1368
        },
1369
};
1370

1371
static constexpr EbpfHelperPrototype bpf_sk_storage_get_proto = {
1372
    .name = "sk_storage_get",
1373
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1374
    .argument_type =
1375
        {
1376
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1377
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1378
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1379
            EBPF_ARGUMENT_TYPE_ANYTHING,
1380
        },
1381
};
1382

1383
static constexpr EbpfHelperPrototype bpf_sk_storage_delete_proto = {
1384
    .name = "sk_storage_delete",
1385
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1386
    .argument_type =
1387
        {
1388
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1389
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1390
        },
1391
};
1392

1393
static constexpr EbpfHelperPrototype bpf_send_signal_proto = {
1394
    .name = "send_signal",
1395
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1396
    .argument_type =
1397
        {
1398
            EBPF_ARGUMENT_TYPE_ANYTHING,
1399
        },
1400
};
1401

1402
static constexpr EbpfHelperPrototype bpf_send_signal_thread_proto = {
1403
    .name = "send_signal_thread",
1404
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1405
    .argument_type =
1406
        {
1407
            EBPF_ARGUMENT_TYPE_ANYTHING,
1408
        },
1409
};
1410

1411
static constexpr EbpfHelperPrototype bpf_tcp_gen_syncookie_proto = {
1412
    .name = "tcp_gen_syncookie",
1413
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1414
    .argument_type =
1415
        {
1416
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1417
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1418
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1419
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1420
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1421
        },
1422
};
1423

1424
static constexpr EbpfHelperPrototype bpf_skb_output_proto = {
1425
    .name = "skb_event_output",
1426
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1427
    .argument_type =
1428
        {
1429
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1430
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP, // originally const
1431
            EBPF_ARGUMENT_TYPE_ANYTHING,
1432
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1433
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1434
        },
1435
    //.arg1_btf_id = &bpf_skb_output_btf_ids[0],
1436
};
1437

1438
static constexpr EbpfHelperPrototype bpf_probe_read_user_proto = {
1439
    .name = "probe_read_user",
1440
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1441
    .argument_type =
1442
        {
1443
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1444
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1445
            EBPF_ARGUMENT_TYPE_ANYTHING,
1446
        },
1447
};
1448

1449
static constexpr EbpfHelperPrototype bpf_probe_read_user_str_proto = {
1450
    .name = "probe_read_user_str",
1451
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1452
    .argument_type =
1453
        {
1454
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1455
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1456
            EBPF_ARGUMENT_TYPE_ANYTHING,
1457
        },
1458
};
1459

1460
static constexpr EbpfHelperPrototype bpf_probe_read_kernel_proto = {
1461
    .name = "probe_read_kernel",
1462
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1463
    .argument_type =
1464
        {
1465
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1466
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1467
            EBPF_ARGUMENT_TYPE_ANYTHING,
1468
        },
1469
};
1470

1471
static constexpr EbpfHelperPrototype bpf_probe_read_kernel_str_proto = {
1472
    .name = "probe_read_kernel_str",
1473
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1474
    .argument_type =
1475
        {
1476
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1477
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1478
            EBPF_ARGUMENT_TYPE_ANYTHING,
1479
        },
1480
};
1481

1482
static constexpr EbpfHelperPrototype bpf_tcp_send_ack_proto = {
1483
    .name = "tcp_send_ack",
1484
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1485
    .argument_type =
1486
        {
1487
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1488
            EBPF_ARGUMENT_TYPE_ANYTHING,
1489
        },
1490
    //.arg1_btf_id = &tcp_sock_id[0],
1491
};
1492

1493
static constexpr EbpfHelperPrototype bpf_read_branch_records_proto = {
1494
    .name = "read_branch_records",
1495
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1496
    .argument_type =
1497
        {
1498
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1499
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1500
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1501
            EBPF_ARGUMENT_TYPE_ANYTHING,
1502
        },
1503
};
1504

1505
static constexpr EbpfHelperPrototype bpf_get_ns_current_pid_tgid_proto = {
1506
    .name = "get_ns_current_pid_tgid",
1507
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1508
    .argument_type =
1509
        {
1510
            EBPF_ARGUMENT_TYPE_ANYTHING,
1511
            EBPF_ARGUMENT_TYPE_ANYTHING,
1512
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM_OR_NULL, // TODO: or null
1513
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1514
        },
1515
};
1516

1517
static constexpr EbpfHelperPrototype bpf_xdp_output_proto = {
1518
    .name = "xdp_event_output",
1519
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1520
    .argument_type =
1521
        {
1522
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1523
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1524
            EBPF_ARGUMENT_TYPE_ANYTHING,
1525
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1526
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1527
        },
1528
    // .arg1_btf_id = &bpf_xdp_output_btf_ids[0],
1529
};
1530

1531
static constexpr EbpfHelperPrototype bpf_sk_assign_proto = {
1532
    .name = "sk_assign",
1533
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1534
    .argument_type =
1535
        {
1536
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1537
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1538
            EBPF_ARGUMENT_TYPE_ANYTHING,
1539
        },
1540
};
1541

1542
static constexpr EbpfHelperPrototype bpf_ktime_get_boot_ns_proto = {
1543
    .name = "ktime_get_boot_ns",
1544
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1545
};
1546

1547
static constexpr EbpfHelperPrototype bpf_seq_printf_proto = {
1548
    .name = "seq_printf",
1549
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1550
    .argument_type =
1551
        {
1552
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1553
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1554
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1555
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1556
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1557
        },
1558
    // .arg1_btf_id = &btf_seq_file_ids[0],
1559
};
1560

1561
static constexpr EbpfHelperPrototype bpf_seq_write_proto = {
1562
    .name = "seq_write",
1563
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1564
    .argument_type =
1565
        {
1566
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1567
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1568
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1569
        },
1570
};
1571

1572
static constexpr EbpfHelperPrototype bpf_sk_cgroup_id_proto = {
1573
    .name = "sk_cgroup_id",
1574
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1575
    .argument_type =
1576
        {
1577
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1578
        },
1579
};
1580

1581
static constexpr EbpfHelperPrototype bpf_sk_ancestor_cgroup_id_proto = {
1582
    .name = "sk_ancestor_cgroup_id",
1583
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1584
    .argument_type =
1585
        {
1586
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1587
            EBPF_ARGUMENT_TYPE_ANYTHING,
1588
        },
1589
};
1590

1591
static constexpr EbpfHelperPrototype bpf_ringbuf_reserve_proto = {
1592
    .name = "ringbuf_reserve",
1593
    .return_type = EBPF_RETURN_TYPE_PTR_TO_ALLOC_MEM_OR_NULL,
1594
    .argument_type =
1595
        {
1596
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1597
            EBPF_ARGUMENT_TYPE_CONST_ALLOC_SIZE_OR_ZERO,
1598
            EBPF_ARGUMENT_TYPE_ANYTHING,
1599
        },
1600
};
1601

1602
static constexpr EbpfHelperPrototype bpf_ringbuf_submit_proto = {
1603
    .name = "ringbuf_submit",
1604
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1605
    .argument_type =
1606
        {
1607
            EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM,
1608
            EBPF_ARGUMENT_TYPE_ANYTHING,
1609
        },
1610
};
1611

1612
static constexpr EbpfHelperPrototype bpf_ringbuf_discard_proto = {
1613
    .name = "ringbuf_discard",
1614
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1615
    .argument_type =
1616
        {
1617
            EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM,
1618
            EBPF_ARGUMENT_TYPE_ANYTHING,
1619
        },
1620
};
1621

1622
static constexpr EbpfHelperPrototype bpf_ringbuf_output_proto = {
1623
    .name = "ringbuf_output",
1624
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1625
    .argument_type =
1626
        {
1627
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1628
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1629
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1630
            EBPF_ARGUMENT_TYPE_ANYTHING,
1631
        },
1632
};
1633

1634
constexpr EbpfHelperPrototype bpf_ringbuf_query_proto = {
1635
    .name = "ringbuf_query",
1636
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1637
    .argument_type =
1638
        {
1639
            EBPF_ARGUMENT_TYPE_CONST_PTR_TO_MAP,
1640
            EBPF_ARGUMENT_TYPE_ANYTHING,
1641
        },
1642
};
1643

1644
static constexpr EbpfHelperPrototype bpf_csum_level_proto = {
1645
    .name = "csum_level",
1646
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1647
    .argument_type =
1648
        {
1649
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1650
            EBPF_ARGUMENT_TYPE_ANYTHING,
1651
        },
1652
};
1653

1654
static constexpr EbpfHelperPrototype bpf_skc_to_tcp6_sock_proto = {
1655
    .name = "skc_to_tcp6_sock",
1656
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1657
    .argument_type =
1658
        {
1659
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1660
        },
1661
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP6],
1662
};
1663

1664
static constexpr EbpfHelperPrototype bpf_skc_to_tcp_sock_proto = {
1665
    .name = "skc_to_tcp_sock",
1666
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1667
    .argument_type =
1668
        {
1669
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1670
        },
1671
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP],
1672
};
1673

1674
static constexpr EbpfHelperPrototype bpf_skc_to_tcp_timewait_sock_proto = {
1675
    .name = "skc_to_tcp_timewait_sock",
1676
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1677
    .argument_type =
1678
        {
1679
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1680
        },
1681
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP_TW],
1682
};
1683

1684
static constexpr EbpfHelperPrototype bpf_skc_to_tcp_request_sock_proto = {
1685
    .name = "skc_to_tcp_request_sock",
1686
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1687
    .argument_type =
1688
        {
1689
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1690
        },
1691
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP_REQ],
1692
};
1693

1694
static constexpr EbpfHelperPrototype bpf_skc_to_udp6_sock_proto = {
1695
    .name = "skc_to_udp6_sock",
1696
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1697
    .argument_type =
1698
        {
1699
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1700
        },
1701
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_UDP6],
1702
};
1703

1704
static constexpr EbpfHelperPrototype bpf_sock_from_file_proto = {
1705
    .name = "sock_from_file",
1706
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1707
    .argument_type =
1708
        {
1709
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1710
        },
1711
    //.ret_btf_id = &bpf_sock_from_file_btf_ids[0],
1712
    //.arg1_btf_id = &bpf_sock_from_file_btf_ids[1],
1713
};
1714

1715
static constexpr EbpfHelperPrototype bpf_get_task_stack_proto = {
1716
    .name = "get_task_stack",
1717
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1718
    .argument_type =
1719
        {
1720
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1721
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1722
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1723
            EBPF_ARGUMENT_TYPE_ANYTHING,
1724
        },
1725
    // .arg1_btf_id = &bpf_get_task_stack_btf_ids[0],
1726
};
1727

1728
static constexpr EbpfHelperPrototype bpf_inode_storage_get_proto = {
1729
    .name = "inode_storage_get",
1730
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1731
    .argument_type =
1732
        {
1733
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1734
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1735
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1736
            EBPF_ARGUMENT_TYPE_ANYTHING,
1737
        },
1738
    //.arg2_btf_id = &bpf_inode_storage_btf_ids[0],
1739
};
1740

1741
static constexpr EbpfHelperPrototype bpf_inode_storage_delete_proto = {
1742
    .name = "inode_storage_delete",
1743
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1744
    .argument_type =
1745
        {
1746
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1747
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1748
        },
1749
    //.arg2_btf_id = &bpf_inode_storage_btf_ids[0],
1750
};
1751

1752
static constexpr EbpfHelperPrototype bpf_d_path_proto = {
1753
    .name = "d_path",
1754
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1755
    .argument_type =
1756
        {
1757
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1758
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1759
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1760
        },
1761
    // .allowed = bpf_d_path_allowed,
1762
    // .arg1_btf_id = &bpf_d_path_btf_ids[0],
1763
};
1764

1765
static constexpr EbpfHelperPrototype bpf_copy_from_user_proto = {
1766
    .name = "copy_from_user",
1767
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1768
    .argument_type =
1769
        {
1770
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1771
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1772
            EBPF_ARGUMENT_TYPE_ANYTHING,
1773
        },
1774
};
1775

1776
static constexpr EbpfHelperPrototype bpf_per_cpu_ptr_proto = {
1777
    .name = "per_cpu_ptr",
1778
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID_OR_NULL,
1779
    .argument_type =
1780
        {
1781
            EBPF_ARGUMENT_TYPE_PTR_TO_PERCPU_BTF_ID,
1782
            EBPF_ARGUMENT_TYPE_ANYTHING,
1783
        },
1784
};
1785

1786
static constexpr EbpfHelperPrototype bpf_this_cpu_ptr_proto = {
1787
    .name = "this_cpu_ptr",
1788
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID,
1789
    .argument_type =
1790
        {
1791
            EBPF_ARGUMENT_TYPE_PTR_TO_PERCPU_BTF_ID,
1792
        },
1793
};
1794

1795
static constexpr EbpfHelperPrototype bpf_snprintf_btf_proto = {
1796
    .name = "snprintf_btf",
1797
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1798
    .argument_type =
1799
        {
1800
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1801
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1802
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1803
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1804
            EBPF_ARGUMENT_TYPE_ANYTHING,
1805
        },
1806
};
1807

1808
static constexpr EbpfHelperPrototype bpf_seq_printf_btf_proto = {
1809
    .name = "seq_printf_btf",
1810
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1811
    .argument_type =
1812
        {
1813
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1814
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1815
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1816
            EBPF_ARGUMENT_TYPE_ANYTHING,
1817
        },
1818
    // .arg1_btf_id        = &btf_seq_file_ids[0],
1819
};
1820

1821
static constexpr EbpfHelperPrototype bpf_skb_cgroup_classid_proto = {
1822
    .name = "skb_cgroup_classid",
1823
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1824
    .argument_type =
1825
        {
1826
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1827
        },
1828
};
1829

1830
static constexpr EbpfHelperPrototype bpf_redirect_neigh_proto = {
1831
    .name = "redirect_neigh",
1832
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1833
    .argument_type =
1834
        {
1835
            EBPF_ARGUMENT_TYPE_ANYTHING,
1836
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1837
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1838
            EBPF_ARGUMENT_TYPE_ANYTHING,
1839
        },
1840
};
1841

1842
static constexpr EbpfHelperPrototype bpf_redirect_peer_proto = {
1843
    .name = "redirect_peer",
1844
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1845
    .argument_type =
1846
        {
1847
            EBPF_ARGUMENT_TYPE_ANYTHING,
1848
            EBPF_ARGUMENT_TYPE_ANYTHING,
1849
        },
1850
};
1851

1852
static constexpr EbpfHelperPrototype bpf_task_storage_get_proto = {
1853
    .name = "task_storage_get",
1854
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1855
    .argument_type =
1856
        {
1857
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1858
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1859
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1860
            EBPF_ARGUMENT_TYPE_ANYTHING,
1861
        },
1862
    // .arg2_btf_id = &bpf_task_storage_btf_ids[0],
1863
};
1864

1865
static constexpr EbpfHelperPrototype bpf_task_storage_delete_proto = {
1866
    .name = "task_storage_delete",
1867
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1868
    .argument_type =
1869
        {
1870
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1871
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1872
        },
1873
    // .arg2_btf_id = &bpf_task_storage_btf_ids[0],
1874
};
1875

1876
static constexpr EbpfHelperPrototype bpf_get_current_task_btf_proto = {
1877
    .name = "get_current_task_btf", .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID,
1878
    // .ret_btf_id = &bpf_get_current_btf_ids[0],
1879
};
1880

1881
static constexpr EbpfHelperPrototype bpf_bprm_opts_set_proto = {
1882
    .name = "bprm_opts_set",
1883
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1884
    .argument_type =
1885
        {
1886
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1887
            EBPF_ARGUMENT_TYPE_ANYTHING,
1888
        }
1889
    // .arg1_btf_id        = &bpf_bprm_opts_set_btf_ids[0],
1890
};
1891

1892
static constexpr EbpfHelperPrototype bpf_ima_inode_hash_proto = {
1893
    .name = "ima_inode_hash",
1894
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1895
    .argument_type =
1896
        {
1897
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1898
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1899
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1900
        },
1901
    //    .allowed        = bpf_ima_inode_hash_allowed,
1902
    //    .arg1_btf_id        = &bpf_ima_inode_hash_btf_ids[0],
1903
};
1904

1905
static constexpr EbpfHelperPrototype bpf_ktime_get_coarse_ns_proto = {
1906
    .name = "ktime_get_coarse_ns",
1907
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1908
};
1909

1910
// bpf_skb_check_mtu_proto/bpf_xdp_check_mtu_proto
1911
static constexpr EbpfHelperPrototype bpf_check_mtu_proto = {
1912
    .name = "check_mtu",
1913
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1914
    .argument_type =
1915
        {
1916
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1917
            EBPF_ARGUMENT_TYPE_ANYTHING,
1918
            EBPF_ARGUMENT_TYPE_PTR_TO_INT,
1919
            EBPF_ARGUMENT_TYPE_ANYTHING,
1920
            EBPF_ARGUMENT_TYPE_ANYTHING,
1921
        },
1922
};
1923

1924
static constexpr EbpfHelperPrototype bpf_for_each_map_elem_proto = {
1925
    .name = "for_each_map_elem",
1926
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1927
    .argument_type =
1928
        {
1929
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1930
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
1931
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
1932
            EBPF_ARGUMENT_TYPE_ANYTHING,
1933
        },
1934
};
1935

1936
static constexpr EbpfHelperPrototype bpf_snprintf_proto = {
1937
    .name = "snprintf",
1938
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1939
    .argument_type =
1940
        {
1941
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1942
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1943
            EBPF_ARGUMENT_TYPE_PTR_TO_CONST_STR,
1944
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM_OR_NULL,
1945
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1946
        },
1947
};
1948

1949
static constexpr EbpfHelperPrototype bpf_sys_bpf_proto = {
1950
    .name = "sys_bpf",
1951
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1952
    .argument_type =
1953
        {
1954
            EBPF_ARGUMENT_TYPE_ANYTHING,
1955
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1956
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1957
        },
1958
};
1959

1960
static constexpr EbpfHelperPrototype bpf_btf_find_by_name_kind_proto = {
1961
    .name = "btf_find_by_name_kind",
1962
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1963
    .argument_type =
1964
        {
1965
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
1966
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1967
            EBPF_ARGUMENT_TYPE_ANYTHING,
1968
            EBPF_ARGUMENT_TYPE_ANYTHING,
1969
        },
1970
};
1971

1972
static constexpr EbpfHelperPrototype bpf_sys_close_proto = {
1973
    .name = "sys_close",
1974
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1975
    .argument_type =
1976
        {
1977
            EBPF_ARGUMENT_TYPE_ANYTHING,
1978
        },
1979
};
1980

1981
static constexpr EbpfHelperPrototype bpf_kallsyms_lookup_name_proto = {
1982
    .name = "kallsyms_lookup_name",
1983
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1984
    .argument_type =
1985
        {
1986
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1987
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1988
            EBPF_ARGUMENT_TYPE_ANYTHING,
1989
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
1990
        },
1991
};
1992

1993
static constexpr EbpfHelperPrototype bpf_timer_init_proto = {
1994
    .name = "timer_init",
1995
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1996
    .argument_type =
1997
        {
1998
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
1999
            EBPF_ARGUMENT_TYPE_CONST_PTR_TO_MAP,
2000
            EBPF_ARGUMENT_TYPE_ANYTHING,
2001
        },
2002
};
2003

2004
static constexpr EbpfHelperPrototype bpf_timer_set_callback_proto = {
2005
    .name = "timer_set_callback",
2006
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2007
    .argument_type =
2008
        {
2009
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
2010
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2011
        },
2012
};
2013

2014
static constexpr EbpfHelperPrototype bpf_timer_start_proto = {
2015
    .name = "timer_start",
2016
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2017
    .argument_type =
2018
        {
2019
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
2020
            EBPF_ARGUMENT_TYPE_ANYTHING,
2021
            EBPF_ARGUMENT_TYPE_ANYTHING,
2022
        },
2023
};
2024

2025
static constexpr EbpfHelperPrototype bpf_timer_cancel_proto = {
2026
    .name = "timer_cancel",
2027
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2028
    .argument_type =
2029
        {
2030
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
2031
        },
2032
};
2033

2034
// same signature for bpf_get_func_ip_proto_kprobe/bpf_get_func_ip_proto_tracing
2035
static constexpr EbpfHelperPrototype bpf_get_func_ip_proto = {
2036
    .name = "get_func_ip",
2037
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2038
    .argument_type =
2039
        {
2040
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2041
        },
2042
};
2043

2044
static constexpr EbpfHelperPrototype bpf_get_attach_cookie_proto = {
2045
    .name = "get_attach_cookie",
2046
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2047
    .argument_type =
2048
        {
2049
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2050
        },
2051
};
2052

2053
static constexpr EbpfHelperPrototype bpf_task_pt_regs_proto = {
2054
    .name = "task_pt_regs",
2055
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID,
2056
    .argument_type =
2057
        {
2058
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2059
        },
2060
    //    .arg1_btf_id        = &btf_tracing_ids[BTF_TRACING_TYPE_TASK],
2061
    //    .ret_btf_id        = &bpf_task_pt_regs_ids[0],
2062
};
2063

2064
static constexpr EbpfHelperPrototype bpf_get_branch_snapshot_proto = {
2065
    .name = "get_branch_snapshot",
2066
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2067
    .argument_type =
2068
        {
2069
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
2070
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
2071
        },
2072
};
2073

2074
static constexpr EbpfHelperPrototype bpf_get_func_arg_proto = {
2075
    .name = "get_func_arg",
2076
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2077
    .argument_type =
2078
        {
2079
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2080
            EBPF_ARGUMENT_TYPE_ANYTHING,
2081
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
2082
        },
2083
};
2084

2085
static constexpr EbpfHelperPrototype bpf_get_func_ret_proto = {
2086
    .name = "get_func_ret",
2087
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2088
    .argument_type =
2089
        {
2090
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2091
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
2092
        },
2093
};
2094

2095
static constexpr EbpfHelperPrototype bpf_get_func_arg_cnt_proto = {
2096
    .name = "get_func_arg_cnt",
2097
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2098
    .argument_type =
2099
        {
2100
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2101
        },
2102
};
2103

2104
static constexpr EbpfHelperPrototype bpf_trace_vprintk_proto = {
2105
    .name = "trace_vprintk",
2106
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2107
    .argument_type =
2108
        {
2109
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM,
2110
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
2111
            EBPF_ARGUMENT_TYPE_PTR_TO_READONLY_MEM_OR_NULL,
2112
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
2113
        },
2114
};
2115

2116
constexpr EbpfHelperPrototype bpf_skc_to_unix_sock_proto = {
2117
    .name = "skc_to_unix_sock",
2118
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
2119
    .argument_type =
2120
        {
2121
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
2122
        }
2123
    //    .ret_btf_id                = &btf_sock_ids[BTF_SOCK_TYPE_UNIX],
2124
};
2125

2126
constexpr EbpfHelperPrototype bpf_find_vma_proto = {
2127
    .name = "find_vma",
2128
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2129
    .argument_type =
2130
        {
2131
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2132
            EBPF_ARGUMENT_TYPE_ANYTHING,
2133
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2134
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
2135
            EBPF_ARGUMENT_TYPE_ANYTHING,
2136
        },
2137
    // .arg1_btf_id = &btf_tracing_ids[BTF_TRACING_TYPE_TASK],
2138
};
2139

2140
constexpr EbpfHelperPrototype bpf_loop_proto = {
2141
    .name = "loop",
2142
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2143
    .argument_type =
2144
        {
2145
            EBPF_ARGUMENT_TYPE_ANYTHING,
2146
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2147
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
2148
            EBPF_ARGUMENT_TYPE_ANYTHING,
2149
        },
2150
};
2151
// Map operations
2152
static constexpr EbpfHelperPrototype bpf_map_lookup_percpu_elem_proto = {
2153
    .name = "map_lookup_percpu_elem",
2154
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
2155
    .argument_type =
2156
        {
2157
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2158
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
2159
            EBPF_ARGUMENT_TYPE_ANYTHING,
2160
            EBPF_ARGUMENT_TYPE_DONTCARE,
2161
            EBPF_ARGUMENT_TYPE_DONTCARE,
2162
        },
2163
};
2164

2165
// Time operations
2166
static constexpr EbpfHelperPrototype bpf_ktime_get_tai_ns_proto = {
2167
    .name = "ktime_get_tai_ns",
2168
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2169
};
2170

2171
// Dynptr ringbuf operations (UNSUPPORTED - dynptr not implemented)
2172
static constexpr EbpfHelperPrototype bpf_ringbuf_reserve_dynptr_proto = {
2173
    .name = "ringbuf_reserve_dynptr",
2174
    .return_type = EBPF_RETURN_TYPE_PTR_TO_ALLOC_MEM_OR_NULL,
2175
    .argument_type =
2176
        {
2177
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2178
            EBPF_ARGUMENT_TYPE_ANYTHING,
2179
            EBPF_ARGUMENT_TYPE_ANYTHING,
2180
            EBPF_ARGUMENT_TYPE_ANYTHING,
2181
        },
2182
    .unsupported = true,
2183
};
2184

2185
static constexpr EbpfHelperPrototype bpf_ringbuf_submit_dynptr_proto = {
2186
    .name = "ringbuf_submit_dynptr",
2187
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2188
    .argument_type =
2189
        {
2190
            EBPF_ARGUMENT_TYPE_ANYTHING,
2191
            EBPF_ARGUMENT_TYPE_ANYTHING,
2192
        },
2193
    .unsupported = true,
2194
};
2195

2196
// Helper 199 - ringbuf_discard_dynptr
2197
static constexpr EbpfHelperPrototype bpf_ringbuf_discard_dynptr_proto = {
2198
    .name = "ringbuf_discard_dynptr",
2199
    .return_type = EBPF_RETURN_TYPE_INTEGER, // Returns void (always succeeds) = 0
2200
    .argument_type =
2201
        {
2202
            EBPF_ARGUMENT_TYPE_ANYTHING, // ptr (dynptr)
2203
            EBPF_ARGUMENT_TYPE_ANYTHING, // flags
2204
        },
2205
    .unsupported = true,
2206
};
2207

2208
// Socket type conversions
2209
static constexpr EbpfHelperPrototype bpf_skc_to_mptcp_sock_proto = {
2210
    .name = "skc_to_mptcp_sock",
2211
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
2212
    .argument_type =
2213
        {
2214
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
2215
        },
2216
};
2217

2218
// Copy from user task
2219
static constexpr EbpfHelperPrototype bpf_copy_from_user_task_proto = {
2220
    .name = "copy_from_user_task",
2221
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2222
    .argument_type =
2223
        {
2224
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
2225
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
2226
            EBPF_ARGUMENT_TYPE_ANYTHING,
2227
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2228
            EBPF_ARGUMENT_TYPE_ANYTHING,
2229
        },
2230
};
2231

2232
// Return value operations
2233
static constexpr EbpfHelperPrototype bpf_set_retval_proto = {
2234
    .name = "set_retval",
2235
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2236
    .argument_type =
2237
        {
2238
            EBPF_ARGUMENT_TYPE_ANYTHING,
2239
        },
2240
};
2241

2242
static constexpr EbpfHelperPrototype bpf_get_retval_proto = {
2243
    .name = "get_retval",
2244
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2245
};
2246

2247
// User ringbuf (UNSUPPORTED - user ringbuf not implemented)
2248
static constexpr EbpfHelperPrototype bpf_user_ringbuf_drain_proto = {
2249
    .name = "user_ringbuf_drain",
2250
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2251
    .argument_type =
2252
        {
2253
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2254
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2255
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
2256
            EBPF_ARGUMENT_TYPE_ANYTHING,
2257
        },
2258
    .unsupported = true,
2259
};
2260

2261
// Cgroup storage
2262
static constexpr EbpfHelperPrototype bpf_cgrp_storage_get_proto = {
2263
    .name = "cgrp_storage_get",
2264
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
2265
    .argument_type =
2266
        {
2267
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2268
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2269
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,
2270
            EBPF_ARGUMENT_TYPE_ANYTHING,
2271
        },
2272
};
2273

2274
static constexpr EbpfHelperPrototype bpf_cgrp_storage_delete_proto = {
2275
    .name = "cgrp_storage_delete",
2276
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2277
    .argument_type =
2278
        {
2279
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
2280
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2281
        },
2282
};
2283
// Helper 83 - skb_ancestor_cgroup_id
2284
static constexpr EbpfHelperPrototype bpf_skb_ancestor_cgroup_id_proto = {
2285
    .name = "skb_ancestor_cgroup_id",
2286
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2287
    .argument_type =
2288
        {
2289
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2290
            EBPF_ARGUMENT_TYPE_ANYTHING, // ancestor_level
2291
        },
2292
    .context_descriptor = &g_sk_buff,
2293
};
2294

2295
// Helper 122 - get_netns_cookie
2296
static constexpr EbpfHelperPrototype bpf_get_netns_cookie_proto = {
2297
    .name = "get_netns_cookie",
2298
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2299
    .argument_type =
2300
        {
2301
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX_OR_NULL,
2302
        },
2303
};
2304

2305
// Helper 142 - load_hdr_opt (sock_ops_load_hdr_opt)
2306
static constexpr EbpfHelperPrototype bpf_load_hdr_opt_proto = {
2307
    .name = "load_hdr_opt",
2308
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2309
    .argument_type =
2310
        {
2311
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2312
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // searchby_res
2313
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2314
            EBPF_ARGUMENT_TYPE_ANYTHING,            // flags
2315
        },
2316
    .context_descriptor = &g_sock_ops_descr,
2317
};
2318

2319
// Helper 143 - store_hdr_opt (sock_ops_store_hdr_opt)
2320
static constexpr EbpfHelperPrototype bpf_store_hdr_opt_proto = {
2321
    .name = "store_hdr_opt",
2322
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2323
    .argument_type =
2324
        {
2325
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2326
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // from
2327
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2328
            EBPF_ARGUMENT_TYPE_ANYTHING,            // flags
2329
        },
2330
    .context_descriptor = &g_sock_ops_descr,
2331
};
2332

2333
// Helper 144 - reserve_hdr_opt (sock_ops_reserve_hdr_opt)
2334
static constexpr EbpfHelperPrototype bpf_reserve_hdr_opt_proto = {
2335
    .name = "reserve_hdr_opt",
2336
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2337
    .argument_type =
2338
        {
2339
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2340
            EBPF_ARGUMENT_TYPE_ANYTHING, // len
2341
            EBPF_ARGUMENT_TYPE_ANYTHING, // flags
2342
        },
2343
    .context_descriptor = &g_sock_ops_descr,
2344
};
2345

2346
// Helper 188 - xdp_get_buff_len
2347
static constexpr EbpfHelperPrototype bpf_xdp_get_buff_len_proto = {
2348
    .name = "xdp_get_buff_len",
2349
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2350
    .argument_type =
2351
        {
2352
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2353
        },
2354
    .context_descriptor = &g_xdp_md,
2355
};
2356

2357
// Helper 189 - xdp_load_bytes
2358
static constexpr EbpfHelperPrototype bpf_xdp_load_bytes_proto = {
2359
    .name = "xdp_load_bytes",
2360
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2361
    .argument_type =
2362
        {
2363
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2364
            EBPF_ARGUMENT_TYPE_ANYTHING,            // offset
2365
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // buf
2366
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2367
        },
2368
    .context_descriptor = &g_xdp_md,
2369
};
2370

2371
// Helper 190 - xdp_store_bytes
2372
static constexpr EbpfHelperPrototype bpf_xdp_store_bytes_proto = {
2373
    .name = "xdp_store_bytes",
2374
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2375
    .argument_type =
2376
        {
2377
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2378
            EBPF_ARGUMENT_TYPE_ANYTHING,            // offset
2379
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // buf
2380
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // len
2381
        },
2382
    .context_descriptor = &g_xdp_md,
2383
};
2384

2385
// Helper 192 - skb_set_tstamp
2386
static constexpr EbpfHelperPrototype bpf_skb_set_tstamp_proto = {
2387
    .name = "skb_set_tstamp",
2388
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2389
    .argument_type =
2390
        {
2391
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2392
            EBPF_ARGUMENT_TYPE_ANYTHING, // tstamp (u64)
2393
            EBPF_ARGUMENT_TYPE_ANYTHING, // tstamp_type (u32)
2394
        },
2395
    .context_descriptor = &g_sk_buff,
2396
};
2397

2398
// Helper 193 - ima_file_hash
2399
static constexpr EbpfHelperPrototype bpf_ima_file_hash_proto = {
2400
    .name = "ima_file_hash",
2401
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2402
    .argument_type =
2403
        {
2404
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,       // file
2405
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // dst
2406
            EBPF_ARGUMENT_TYPE_CONST_SIZE,          // size
2407
        },
2408
};
2409

2410
// Helper 194 - kptr_xchg
2411
static constexpr EbpfHelperPrototype bpf_kptr_xchg_proto = {
2412
    .name = "kptr_xchg",
2413
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
2414
    .argument_type =
2415
        {
2416
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE, // dst (kptr location)
2417
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,    // ptr (can be NULL)
2418
        },
2419
};
2420

2421
// Helper 197 - dynptr_from_mem (UNSUPPORTED - dynptr not implemented)
2422
static constexpr EbpfHelperPrototype bpf_dynptr_from_mem_proto = {
2423
    .name = "dynptr_from_mem",
2424
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2425
    .argument_type =
2426
        {
2427
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,    // data
2428
            EBPF_ARGUMENT_TYPE_ANYTHING,            // size
2429
            EBPF_ARGUMENT_TYPE_ANYTHING,            // flags
2430
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // ptr (dynptr out)
2431
        },
2432
    .unsupported = true,
2433
};
2434

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

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

2465
// Helper 203 - dynptr_data
2466
static constexpr EbpfHelperPrototype bpf_dynptr_data_proto = {
2467
    .name = "dynptr_data",
2468
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID_OR_NULL, // Pointer or NULL
2469
    .argument_type =
2470
        {
2471
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // ptr (dynptr)
2472
            EBPF_ARGUMENT_TYPE_ANYTHING,            // offset
2473
            EBPF_ARGUMENT_TYPE_ANYTHING,            // len
2474
        },
2475
    .unsupported = true,
2476
};
2477

2478
// Helper 204 - tcp_raw_gen_syncookie_ipv4
2479
static constexpr EbpfHelperPrototype bpf_tcp_raw_gen_syncookie_ipv4_proto = {
2480
    .name = "tcp_raw_gen_syncookie_ipv4",
2481
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2482
    .argument_type =
2483
        {
2484
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // iph
2485
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // th
2486
            EBPF_ARGUMENT_TYPE_ANYTHING,            // th_len
2487
        },
2488
};
2489

2490
// Helper 205 - tcp_raw_gen_syncookie_ipv6
2491
static constexpr EbpfHelperPrototype bpf_tcp_raw_gen_syncookie_ipv6_proto = {
2492
    .name = "tcp_raw_gen_syncookie_ipv6",
2493
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2494
    .argument_type =
2495
        {
2496
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // iph
2497
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // th
2498
            EBPF_ARGUMENT_TYPE_ANYTHING,            // th_len
2499
        },
2500
};
2501

2502
// Helper 206 - tcp_raw_check_syncookie_ipv4
2503
static constexpr EbpfHelperPrototype bpf_tcp_raw_check_syncookie_ipv4_proto = {
2504
    .name = "tcp_raw_check_syncookie_ipv4",
2505
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2506
    .argument_type =
2507
        {
2508
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // iph
2509
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // th
2510
        },
2511
};
2512

2513
// Helper 207 - tcp_raw_check_syncookie_ipv6
2514
static constexpr EbpfHelperPrototype bpf_tcp_raw_check_syncookie_ipv6_proto = {
2515
    .name = "tcp_raw_check_syncookie_ipv6",
2516
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2517
    .argument_type =
2518
        {
2519
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // iph
2520
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // th
2521
        },
2522
};
2523

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

2740
bool is_helper_usable_linux(const int32_t n) {
44,432✔
2741
    if (n >= static_cast<int>(std::size(prototypes)) || n < 0) {
44,432✔
2742
        return false;
2✔
2743
    }
2744

2745
    // Check if explicitly marked as unsupported
2746
    if (prototypes[n].unsupported) {
44,428✔
2747
        return false;
2748
    }
2749

2750
    // If the helper has a context_descriptor, it must match the hook's context_descriptor.
2751
    if (prototypes[n].context_descriptor &&
48,689✔
2752
        prototypes[n].context_descriptor != thread_local_program_info->type.context_descriptor) {
8,522✔
2753
        return false;
1✔
2754
    }
2755

2756
    return true;
22,213✔
2757
}
2758

2759
EbpfHelperPrototype get_helper_prototype_linux(const int32_t n) {
22,692✔
2760
    if (!is_helper_usable_linux(n)) {
22,692✔
2761
        throw std::exception();
×
2762
    }
2763
    return prototypes[n];
22,692✔
2764
}
2765
} // 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