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

Alan-Jowett / ebpf-verifier / 15194704016

22 May 2025 08:53AM UTC coverage: 88.11% (-0.07%) from 88.177%
15194704016

push

github

elazarg
uniform class names and explicit constructors for adapt_sgraph.hpp

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

27 of 30 new or added lines in 1 file covered. (90.0%)

481 existing lines in 33 files now uncovered.

8552 of 9706 relevant lines covered (88.11%)

9089054.61 hits per line

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

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

4
namespace prevail {
5
#define EBPF_RETURN_TYPE_PTR_TO_SOCK_COMMON_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
6
#define EBPF_RETURN_TYPE_PTR_TO_SOCKET_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
7
#define EBPF_RETURN_TYPE_PTR_TO_TCP_SOCKET_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
8
#define EBPF_RETURN_TYPE_PTR_TO_ALLOC_MEM_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
9
#define EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
10
#define EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID_OR_NULL EBPF_RETURN_TYPE_UNSUPPORTED
11
#define EBPF_RETURN_TYPE_PTR_TO_BTF_ID EBPF_RETURN_TYPE_UNSUPPORTED
12
#define EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID EBPF_RETURN_TYPE_UNSUPPORTED
13

14
#define EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON EBPF_ARGUMENT_TYPE_UNSUPPORTED
15
#define EBPF_ARGUMENT_TYPE_PTR_TO_SPIN_LOCK EBPF_ARGUMENT_TYPE_UNSUPPORTED
16
#define EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON EBPF_ARGUMENT_TYPE_UNSUPPORTED
17
#define EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID EBPF_ARGUMENT_TYPE_UNSUPPORTED
18
#define EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON EBPF_ARGUMENT_TYPE_UNSUPPORTED
19
#define EBPF_ARGUMENT_TYPE_PTR_TO_LONG EBPF_ARGUMENT_TYPE_UNSUPPORTED
20
#define EBPF_ARGUMENT_TYPE_PTR_TO_INT EBPF_ARGUMENT_TYPE_UNSUPPORTED
21
#define EBPF_ARGUMENT_TYPE_PTR_TO_CONST_STR EBPF_ARGUMENT_TYPE_UNSUPPORTED
22
#define EBPF_ARGUMENT_TYPE_PTR_TO_FUNC EBPF_ARGUMENT_TYPE_UNSUPPORTED
23
#define EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL EBPF_ARGUMENT_TYPE_UNSUPPORTED
24
#define EBPF_ARGUMENT_TYPE_CONST_ALLOC_SIZE_OR_ZERO EBPF_ARGUMENT_TYPE_UNSUPPORTED
25
#define EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM EBPF_ARGUMENT_TYPE_UNSUPPORTED
26
#define EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM EBPF_ARGUMENT_TYPE_UNSUPPORTED
27
#define EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL EBPF_ARGUMENT_TYPE_UNSUPPORTED
28
#define EBPF_ARGUMENT_TYPE_PTR_TO_TIMER EBPF_ARGUMENT_TYPE_UNSUPPORTED
29
#define EBPF_ARGUMENT_TYPE_PTR_TO_PERCPU_BTF_ID EBPF_ARGUMENT_TYPE_UNSUPPORTED
30

31
const ebpf_context_descriptor_t g_sk_buff = sk_buff;
32
const ebpf_context_descriptor_t g_xdp_md = xdp_md;
33
const ebpf_context_descriptor_t g_sk_msg_md = sk_msg_md;
34
const ebpf_context_descriptor_t g_unspec_descr = unspec_descr;
35
const ebpf_context_descriptor_t g_cgroup_dev_descr = cgroup_dev_descr;
36
const ebpf_context_descriptor_t g_kprobe_descr = kprobe_descr;
37
const ebpf_context_descriptor_t g_tracepoint_descr = tracepoint_descr;
38
const ebpf_context_descriptor_t g_perf_event_descr = perf_event_descr;
39
const ebpf_context_descriptor_t g_cgroup_sock_descr = cgroup_sock_descr;
40
const ebpf_context_descriptor_t g_sock_ops_descr = sock_ops_descr;
41

42
// eBPF helpers are documented at the following links:
43
// https://github.com/iovisor/bpf-docs/blob/master/bpf_helpers.rst
44
// https://www.man7.org/linux/man-pages/man7/bpf-helpers.7.html
45

46
static constexpr EbpfHelperPrototype bpf_unspec_proto = {
47
    .name = "unspec",
48
    .return_type = EBPF_RETURN_TYPE_UNSUPPORTED,
49
};
50

51
constexpr EbpfHelperPrototype bpf_tail_call_proto = {
52
    .name = "tail_call",
53
    .return_type = EBPF_RETURN_TYPE_INTEGER_OR_NO_RETURN_IF_SUCCEED,
54
    .argument_type =
55
        {
56
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
57
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_OF_PROGRAMS,
58
            EBPF_ARGUMENT_TYPE_ANYTHING,
59
        },
60
};
61

62
static constexpr EbpfHelperPrototype bpf_override_return_proto = {
63
    .name = "override_return",
64
    .return_type = EBPF_RETURN_TYPE_INTEGER,
65
    .argument_type =
66
        {
67
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
68
            EBPF_ARGUMENT_TYPE_ANYTHING,
69
        },
70
};
71

72
static constexpr EbpfHelperPrototype bpf_probe_read_proto = {
73
    .name = "probe_read",
74
    .return_type = EBPF_RETURN_TYPE_INTEGER,
75
    .argument_type =
76
        {
77
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
78
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
79
            EBPF_ARGUMENT_TYPE_ANYTHING,
80
        },
81
};
82

83
static constexpr EbpfHelperPrototype bpf_probe_read_str_proto = {
84
    .name = "probe_read_str",
85
    .return_type = EBPF_RETURN_TYPE_INTEGER,
86
    .argument_type =
87
        {
88
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
89
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
90
            EBPF_ARGUMENT_TYPE_ANYTHING,
91
        },
92
};
93

94
static constexpr EbpfHelperPrototype bpf_probe_write_user_proto = {
95
    .name = "probe_write_user",
96
    .return_type = EBPF_RETURN_TYPE_INTEGER,
97
    .argument_type =
98
        {
99
            EBPF_ARGUMENT_TYPE_ANYTHING,
100
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
101
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
102
        },
103
};
104

105
static constexpr EbpfHelperPrototype bpf_trace_printk_proto = {
106
    .name = "trace_printk",
107
    .return_type = EBPF_RETURN_TYPE_INTEGER,
108
    .argument_type =
109
        {
110
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
111
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
112
        },
113
};
114

115
static constexpr EbpfHelperPrototype bpf_perf_event_read_proto = {
116
    .name = "perf_event_read",
117
    .return_type = EBPF_RETURN_TYPE_INTEGER,
118
    .argument_type =
119
        {
120
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
121
            EBPF_ARGUMENT_TYPE_ANYTHING,
122
        },
123
};
124

125
static constexpr EbpfHelperPrototype bpf_perf_event_read_value_proto = {
126
    .name = "perf_event_read_value",
127
    .return_type = EBPF_RETURN_TYPE_INTEGER,
128
    .argument_type =
129
        {
130
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
131
            EBPF_ARGUMENT_TYPE_ANYTHING,
132
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
133
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
134
        },
135
};
136

137
static constexpr EbpfHelperPrototype bpf_perf_event_output_proto = {
138
    .name = "perf_event_output",
139
    .return_type = EBPF_RETURN_TYPE_INTEGER,
140
    .argument_type =
141
        {
142
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
143
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
144
            EBPF_ARGUMENT_TYPE_ANYTHING,
145
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
146
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
147
        },
148
};
149

150
static constexpr EbpfHelperPrototype bpf_get_current_task_proto = {
151
    .name = "get_current_task",
152
    .return_type = EBPF_RETURN_TYPE_INTEGER,
153
};
154

155
static constexpr EbpfHelperPrototype bpf_current_task_under_cgroup_proto = {
156
    .name = "current_task_under_cgroup",
157
    .return_type = EBPF_RETURN_TYPE_INTEGER,
158
    .argument_type =
159
        {
160
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
161
            EBPF_ARGUMENT_TYPE_ANYTHING,
162
        },
163
};
164

165
static constexpr EbpfHelperPrototype bpf_perf_prog_read_value_proto = {.name = "perf_prog_read_value",
166
                                                                       .return_type = EBPF_RETURN_TYPE_INTEGER,
167
                                                                       .argument_type =
168
                                                                           {
169
                                                                               EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
170
                                                                               EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
171
                                                                               EBPF_ARGUMENT_TYPE_CONST_SIZE,
172
                                                                           },
173
                                                                       .context_descriptor = &g_perf_event_descr};
174

175
static constexpr EbpfHelperPrototype bpf_map_lookup_elem_proto = {
176
    .name = "map_lookup_elem",
177
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
178
    .argument_type =
179
        {
180
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
181
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
182
            EBPF_ARGUMENT_TYPE_DONTCARE,
183
            EBPF_ARGUMENT_TYPE_DONTCARE,
184
            EBPF_ARGUMENT_TYPE_DONTCARE,
185
        },
186
};
187

188
static constexpr EbpfHelperPrototype bpf_map_update_elem_proto = {
189
    .name = "map_update_elem",
190
    .return_type = EBPF_RETURN_TYPE_INTEGER,
191
    .argument_type =
192
        {
193
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
194
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
195
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,
196
            EBPF_ARGUMENT_TYPE_ANYTHING,
197
            EBPF_ARGUMENT_TYPE_DONTCARE,
198
        },
199
};
200

201
static constexpr EbpfHelperPrototype bpf_map_delete_elem_proto = {
202
    .name = "map_delete_elem",
203
    .return_type = EBPF_RETURN_TYPE_INTEGER,
204
    .argument_type =
205
        {
206
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
207
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
208
            EBPF_ARGUMENT_TYPE_DONTCARE,
209
            EBPF_ARGUMENT_TYPE_DONTCARE,
210
            EBPF_ARGUMENT_TYPE_DONTCARE,
211
        },
212
};
213

214
static constexpr EbpfHelperPrototype bpf_get_prandom_u32_proto = {
215
    .name = "get_prandom_u32",
216
    .return_type = EBPF_RETURN_TYPE_INTEGER,
217
};
218

219
static constexpr EbpfHelperPrototype bpf_get_smp_processor_id_proto = {
220
    .name = "get_smp_processor_id",
221
    .return_type = EBPF_RETURN_TYPE_INTEGER,
222
};
223

224
static constexpr EbpfHelperPrototype bpf_get_numa_node_id_proto = {
225
    .name = "get_numa_node_id",
226
    .return_type = EBPF_RETURN_TYPE_INTEGER,
227
};
228

229
static constexpr EbpfHelperPrototype bpf_ktime_get_ns_proto = {
230
    .name = "ktime_get_ns",
231
    .return_type = EBPF_RETURN_TYPE_INTEGER,
232
};
233

234
static constexpr EbpfHelperPrototype bpf_get_current_pid_tgid_proto = {
235
    .name = "get_current_pid_tgid",
236
    .return_type = EBPF_RETURN_TYPE_INTEGER,
237
};
238

239
static constexpr EbpfHelperPrototype bpf_get_current_uid_gid_proto = {
240
    .name = "get_current_uid_gid",
241
    .return_type = EBPF_RETURN_TYPE_INTEGER,
242
};
243

244
static constexpr EbpfHelperPrototype bpf_get_current_comm_proto = {
245
    .name = "get_current_comm",
246
    .return_type = EBPF_RETURN_TYPE_INTEGER,
247
    .argument_type =
248
        {
249
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
250
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
251
        },
252
};
253

254
static constexpr EbpfHelperPrototype bpf_get_current_cgroup_id_proto = {
255
    .name = "get_current_cgroup_id",
256
    .return_type = EBPF_RETURN_TYPE_INTEGER,
257
};
258

259
static constexpr EbpfHelperPrototype bpf_sock_map_update_proto = {
260
    .name = "sock_map_update",
261
    .return_type = EBPF_RETURN_TYPE_INTEGER,
262
    .argument_type =
263
        {
264
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
265
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
266
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
267
            EBPF_ARGUMENT_TYPE_ANYTHING,
268
            EBPF_ARGUMENT_TYPE_DONTCARE,
269
        },
270
    .context_descriptor = &g_sock_ops_descr,
271
};
272

273
static constexpr EbpfHelperPrototype bpf_sock_hash_update_proto = {
274
    .name = "sock_hash_update",
275
    .return_type = EBPF_RETURN_TYPE_INTEGER,
276
    .argument_type =
277
        {
278
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
279
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
280
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
281
            EBPF_ARGUMENT_TYPE_ANYTHING,
282
            EBPF_ARGUMENT_TYPE_DONTCARE,
283
        },
284
    .context_descriptor = &g_sock_ops_descr,
285
};
286

287
static constexpr EbpfHelperPrototype bpf_get_stackid_proto = {
288
    .name = "get_stackid",
289
    .return_type = EBPF_RETURN_TYPE_INTEGER,
290
    .argument_type =
291
        {
292
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
293
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
294
            EBPF_ARGUMENT_TYPE_ANYTHING,
295
        },
296
};
297

298
static constexpr EbpfHelperPrototype bpf_get_stack_proto = {
299
    .name = "get_stack",
300
    .return_type = EBPF_RETURN_TYPE_INTEGER,
301
    .argument_type =
302
        {
303
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
304
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
305
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
306
            EBPF_ARGUMENT_TYPE_ANYTHING,
307
        },
308
};
309

310
static constexpr EbpfHelperPrototype bpf_skb_store_bytes_proto = {
311
    .name = "skb_store_bytes",
312
    .return_type = EBPF_RETURN_TYPE_INTEGER,
313
    .argument_type =
314
        {
315
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
316
            EBPF_ARGUMENT_TYPE_ANYTHING,
317
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
318
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
319
            EBPF_ARGUMENT_TYPE_ANYTHING,
320
        },
321
    .context_descriptor = &g_sk_buff,
322
};
323

324
static constexpr EbpfHelperPrototype bpf_skb_load_bytes_proto = {
325
    .name = "skb_load_bytes",
326
    .return_type = EBPF_RETURN_TYPE_INTEGER,
327
    .argument_type =
328
        {
329
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
330
            EBPF_ARGUMENT_TYPE_ANYTHING,
331
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
332
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
333
        },
334
    .context_descriptor = &g_sk_buff,
335
};
336

337
static constexpr EbpfHelperPrototype bpf_skb_load_bytes_relative_proto = {
338
    .name = "skb_load_bytes_relative",
339
    .return_type = EBPF_RETURN_TYPE_INTEGER,
340
    .argument_type =
341
        {
342
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
343
            EBPF_ARGUMENT_TYPE_ANYTHING,
344
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
345
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
346
            EBPF_ARGUMENT_TYPE_ANYTHING,
347
        },
348
    .context_descriptor = &g_sk_buff,
349
};
350

351
static constexpr EbpfHelperPrototype bpf_skb_pull_data_proto = {
352
    .name = "skb_pull_data",
353
    .return_type = EBPF_RETURN_TYPE_INTEGER,
354
    .argument_type =
355
        {
356
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
357
            EBPF_ARGUMENT_TYPE_ANYTHING,
358
        },
359
    .context_descriptor = &g_sk_buff,
360
};
361

362
static constexpr EbpfHelperPrototype bpf_l3_csum_replace_proto = {
363
    .name = "l3_csum_replace",
364
    .return_type = EBPF_RETURN_TYPE_INTEGER,
365
    .argument_type =
366
        {
367
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
368
            EBPF_ARGUMENT_TYPE_ANYTHING,
369
            EBPF_ARGUMENT_TYPE_ANYTHING,
370
            EBPF_ARGUMENT_TYPE_ANYTHING,
371
            EBPF_ARGUMENT_TYPE_ANYTHING,
372
        },
373
    .context_descriptor = &g_sk_buff,
374
};
375

376
static constexpr EbpfHelperPrototype bpf_l4_csum_replace_proto = {
377
    .name = "l4_csum_replace",
378
    .return_type = EBPF_RETURN_TYPE_INTEGER,
379
    .argument_type =
380
        {
381
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
382
            EBPF_ARGUMENT_TYPE_ANYTHING,
383
            EBPF_ARGUMENT_TYPE_ANYTHING,
384
            EBPF_ARGUMENT_TYPE_ANYTHING,
385
            EBPF_ARGUMENT_TYPE_ANYTHING,
386
        },
387
    .context_descriptor = &g_sk_buff,
388
};
389

390
static constexpr EbpfHelperPrototype bpf_csum_diff_proto = {
391
    .name = "csum_diff",
392
    .return_type = EBPF_RETURN_TYPE_INTEGER,
393
    .argument_type =
394
        {
395
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
396
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
397
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
398
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
399
            EBPF_ARGUMENT_TYPE_ANYTHING,
400
        },
401
};
402

403
static constexpr EbpfHelperPrototype bpf_csum_update_proto = {
404
    .name = "csum_update",
405
    .return_type = EBPF_RETURN_TYPE_INTEGER,
406
    .argument_type =
407
        {
408
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
409
            EBPF_ARGUMENT_TYPE_ANYTHING,
410
        },
411
    .context_descriptor = &g_sk_buff,
412
};
413

414
static constexpr EbpfHelperPrototype bpf_clone_redirect_proto = {
415
    .name = "clone_redirect",
416
    .return_type = EBPF_RETURN_TYPE_INTEGER,
417
    .argument_type =
418
        {
419
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
420
            EBPF_ARGUMENT_TYPE_ANYTHING,
421
            EBPF_ARGUMENT_TYPE_ANYTHING,
422
        },
423
    .context_descriptor = &g_sk_buff,
424
};
425

426
static constexpr EbpfHelperPrototype bpf_redirect_proto = {
427
    .name = "redirect",
428
    .return_type = EBPF_RETURN_TYPE_INTEGER,
429
    .argument_type =
430
        {
431
            EBPF_ARGUMENT_TYPE_ANYTHING,
432
            EBPF_ARGUMENT_TYPE_ANYTHING,
433
        },
434
};
435

436
static constexpr EbpfHelperPrototype bpf_sk_redirect_hash_proto = {
437
    .name = "sk_redirect_hash",
438
    .return_type = EBPF_RETURN_TYPE_INTEGER,
439
    .argument_type =
440
        {
441
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
442
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
443
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
444
            EBPF_ARGUMENT_TYPE_ANYTHING,
445
        },
446
    .context_descriptor = &g_sk_buff,
447
};
448

449
static constexpr EbpfHelperPrototype bpf_sk_redirect_map_proto = {
450
    .name = "sk_redirect_map",
451
    .return_type = EBPF_RETURN_TYPE_INTEGER,
452
    .argument_type =
453
        {
454
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
455
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
456
            EBPF_ARGUMENT_TYPE_ANYTHING,
457
            EBPF_ARGUMENT_TYPE_ANYTHING,
458
        },
459
    .context_descriptor = &g_sk_buff,
460
};
461

462
static constexpr EbpfHelperPrototype bpf_msg_redirect_hash_proto = {
463
    .name = "msg_redirect_hash",
464
    .return_type = EBPF_RETURN_TYPE_INTEGER,
465
    .argument_type =
466
        {
467
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
468
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
469
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
470
            EBPF_ARGUMENT_TYPE_ANYTHING,
471
        },
472
    .context_descriptor = &g_sk_msg_md,
473
};
474

475
static constexpr EbpfHelperPrototype bpf_msg_redirect_map_proto = {
476
    .name = "msg_redirect_map",
477
    .return_type = EBPF_RETURN_TYPE_INTEGER,
478
    .argument_type =
479
        {
480
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
481
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
482
            EBPF_ARGUMENT_TYPE_ANYTHING,
483
            EBPF_ARGUMENT_TYPE_ANYTHING,
484
        },
485
    .context_descriptor = &g_sk_msg_md,
486
};
487

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

499
static constexpr EbpfHelperPrototype bpf_msg_cork_bytes_proto = {
500
    .name = "msg_cork_bytes",
501
    .return_type = EBPF_RETURN_TYPE_INTEGER,
502
    .argument_type =
503
        {
504
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
505
            EBPF_ARGUMENT_TYPE_ANYTHING,
506
        },
507
    .context_descriptor = &g_sk_msg_md,
508
};
509

510
static constexpr EbpfHelperPrototype bpf_msg_pull_data_proto = {
511
    .name = "msg_pull_data",
512
    .return_type = EBPF_RETURN_TYPE_INTEGER,
513
    .argument_type =
514
        {
515
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
516
            EBPF_ARGUMENT_TYPE_ANYTHING,
517
            EBPF_ARGUMENT_TYPE_ANYTHING,
518
            EBPF_ARGUMENT_TYPE_ANYTHING,
519
        },
520
    .context_descriptor = &g_sk_msg_md,
521
};
522
static constexpr EbpfHelperPrototype bpf_get_cgroup_classid_proto = {
523
    .name = "get_cgroup_classid",
524
    .return_type = EBPF_RETURN_TYPE_INTEGER,
525
    .argument_type =
526
        {
527
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
528
        },
529
    .context_descriptor = &g_sk_buff,
530
};
531

532
static constexpr EbpfHelperPrototype bpf_get_route_realm_proto = {
533
    .name = "get_route_realm",
534
    .return_type = EBPF_RETURN_TYPE_INTEGER,
535
    .argument_type =
536
        {
537
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
538
        },
539
    .context_descriptor = &g_sk_buff,
540
};
541

542
static constexpr EbpfHelperPrototype bpf_get_hash_recalc_proto = {
543
    .name = "get_hash_recalc",
544
    .return_type = EBPF_RETURN_TYPE_INTEGER,
545
    .argument_type =
546
        {
547
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
548
        },
549
    .context_descriptor = &g_sk_buff,
550
};
551

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

562
static constexpr EbpfHelperPrototype bpf_set_hash_proto = {
563
    .name = "set_hash",
564
    .return_type = EBPF_RETURN_TYPE_INTEGER,
565
    .argument_type =
566
        {
567
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
568
            EBPF_ARGUMENT_TYPE_ANYTHING,
569
        },
570
    .context_descriptor = &g_sk_buff,
571
};
572

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

585
static constexpr EbpfHelperPrototype bpf_skb_vlan_pop_proto = {
586
    .name = "skb_vlan_pop",
587
    .return_type = EBPF_RETURN_TYPE_INTEGER,
588
    .argument_type =
589
        {
590
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
591
        },
592
    .context_descriptor = &g_sk_buff,
593
};
594

595
static constexpr EbpfHelperPrototype bpf_skb_change_proto_proto = {
596
    .name = "skb_change_proto",
597
    .return_type = EBPF_RETURN_TYPE_INTEGER,
598
    .argument_type =
599
        {
600
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
601
            EBPF_ARGUMENT_TYPE_ANYTHING,
602
            EBPF_ARGUMENT_TYPE_ANYTHING,
603
        },
604
    .context_descriptor = &g_sk_buff,
605
};
606

607
static constexpr EbpfHelperPrototype bpf_skb_change_type_proto = {
608
    .name = "skb_change_type",
609
    .return_type = EBPF_RETURN_TYPE_INTEGER,
610
    .argument_type =
611
        {
612
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
613
            EBPF_ARGUMENT_TYPE_ANYTHING,
614
        },
615
    .context_descriptor = &g_sk_buff,
616
};
617

618
static constexpr EbpfHelperPrototype bpf_skb_adjust_room_proto = {
619
    .name = "skb_adjust_room",
620
    .return_type = EBPF_RETURN_TYPE_INTEGER,
621
    .argument_type =
622
        {
623
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
624
            EBPF_ARGUMENT_TYPE_ANYTHING,
625
            EBPF_ARGUMENT_TYPE_ANYTHING,
626
            EBPF_ARGUMENT_TYPE_ANYTHING,
627
        },
628
    .reallocate_packet = true,
629
    .context_descriptor = &g_sk_buff,
630
};
631

632
static constexpr EbpfHelperPrototype bpf_skb_change_tail_proto = {
633
    .name = "skb_change_tail",
634
    .return_type = EBPF_RETURN_TYPE_INTEGER,
635
    .argument_type =
636
        {
637
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
638
            EBPF_ARGUMENT_TYPE_ANYTHING,
639
            EBPF_ARGUMENT_TYPE_ANYTHING,
640
        },
641
    .context_descriptor = &g_sk_buff,
642
};
643

644
static constexpr EbpfHelperPrototype bpf_skb_change_head_proto = {
645
    .name = "skb_change_head",
646
    .return_type = EBPF_RETURN_TYPE_INTEGER,
647
    .argument_type =
648
        {
649
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
650
            EBPF_ARGUMENT_TYPE_ANYTHING,
651
            EBPF_ARGUMENT_TYPE_ANYTHING,
652
        },
653
    .reallocate_packet = true,
654
    .context_descriptor = &g_sk_buff,
655
};
656

657
static constexpr EbpfHelperPrototype bpf_xdp_adjust_head_proto = {
658
    .name = "xdp_adjust_head",
659
    .return_type = EBPF_RETURN_TYPE_INTEGER,
660
    .argument_type =
661
        {
662
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
663
            EBPF_ARGUMENT_TYPE_ANYTHING,
664
        },
665
    .reallocate_packet = true,
666
    .context_descriptor = &g_xdp_descr,
667
};
668

669
static constexpr EbpfHelperPrototype bpf_xdp_adjust_tail_proto = {
670
    .name = "xdp_adjust_tail",
671
    .return_type = EBPF_RETURN_TYPE_INTEGER,
672
    .argument_type =
673
        {
674
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
675
            EBPF_ARGUMENT_TYPE_ANYTHING,
676
        },
677
    .reallocate_packet = true,
678
    .context_descriptor = &g_xdp_descr,
679
};
680

681
static constexpr EbpfHelperPrototype bpf_xdp_adjust_meta_proto = {
682
    .name = "xdp_adjust_meta",
683
    .return_type = EBPF_RETURN_TYPE_INTEGER,
684
    .argument_type =
685
        {
686
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
687
            EBPF_ARGUMENT_TYPE_ANYTHING,
688
        },
689
    .reallocate_packet = true,
690
    .context_descriptor = &g_xdp_descr,
691
};
692

693
static constexpr EbpfHelperPrototype bpf_skb_get_tunnel_key_proto = {
694
    .name = "skb_get_tunnel_key",
695
    .return_type = EBPF_RETURN_TYPE_INTEGER,
696
    .argument_type =
697
        {
698
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
699
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
700
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
701
            EBPF_ARGUMENT_TYPE_ANYTHING,
702
        },
703
    .context_descriptor = &g_sk_buff,
704
};
705

706
static constexpr EbpfHelperPrototype bpf_skb_get_tunnel_opt_proto = {
707
    .name = "skb_get_tunnel_opt",
708
    .return_type = EBPF_RETURN_TYPE_INTEGER,
709
    .argument_type =
710
        {
711
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
712
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
713
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
714
        },
715
    .context_descriptor = &g_sk_buff,
716
};
717

718
static constexpr EbpfHelperPrototype bpf_skb_set_tunnel_key_proto = {
719
    .name = "skb_set_tunnel_key",
720
    .return_type = EBPF_RETURN_TYPE_INTEGER,
721
    .argument_type =
722
        {
723
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
724
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
725
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
726
            EBPF_ARGUMENT_TYPE_ANYTHING,
727
        },
728
    .context_descriptor = &g_sk_buff,
729
};
730

731
/*
732
 * int bpf_skb_set_tunnel_opt(skb, opt, size)
733
 *     populate tunnel options metadata
734
 *     @skb: pointer to skb
735
 *     @opt: pointer to raw tunnel option data
736
 *     @size: size of @opt
737
 *     Return: 0 on success or negative error
738
 */
739
static constexpr EbpfHelperPrototype bpf_skb_set_tunnel_opt_proto = {
740
    .name = "skb_set_tunnel_opt",
741
    .return_type = EBPF_RETURN_TYPE_INTEGER,
742
    .argument_type =
743
        {
744
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
745
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
746
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
747
        },
748
    .context_descriptor = &g_sk_buff,
749
};
750

751
static constexpr EbpfHelperPrototype bpf_skb_under_cgroup_proto = {
752
    .name = "skb_under_cgroup",
753
    .return_type = EBPF_RETURN_TYPE_INTEGER,
754
    .argument_type =
755
        {
756
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
757
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
758
            EBPF_ARGUMENT_TYPE_ANYTHING,
759
        },
760
    .context_descriptor = &g_sk_buff,
761
};
762

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

773
static constexpr EbpfHelperPrototype bpf_get_socket_cookie_proto = {
774
    .name = "get_socket_cookie",
775
    .return_type = EBPF_RETURN_TYPE_INTEGER,
776
    .argument_type =
777
        {
778
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
779
        },
780
    .context_descriptor = &g_sk_buff,
781
};
782

783
static constexpr EbpfHelperPrototype bpf_get_socket_uid_proto = {
784
    .name = "get_socket_uid",
785
    .return_type = EBPF_RETURN_TYPE_INTEGER,
786
    .argument_type =
787
        {
788
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
789
        },
790
    .context_descriptor = &g_sk_buff,
791
};
792

793
static constexpr EbpfHelperPrototype bpf_setsockopt_proto = {
794
    .name = "setsockopt",
795
    .return_type = EBPF_RETURN_TYPE_INTEGER,
796
    .argument_type =
797
        {
798
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
799
            EBPF_ARGUMENT_TYPE_ANYTHING,
800
            EBPF_ARGUMENT_TYPE_ANYTHING,
801
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
802
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
803
        },
804
};
805

806
static constexpr EbpfHelperPrototype bpf_getsockopt_proto = {
807
    .name = "getsockopt",
808
    .return_type = EBPF_RETURN_TYPE_INTEGER,
809
    .argument_type =
810
        {
811
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
812
            EBPF_ARGUMENT_TYPE_ANYTHING,
813
            EBPF_ARGUMENT_TYPE_ANYTHING,
814
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
815
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
816
        },
817
};
818

819
static constexpr EbpfHelperPrototype bpf_sock_ops_cb_flags_set_proto = {
820
    .name = "sock_ops_cb_flags_set",
821
    .return_type = EBPF_RETURN_TYPE_INTEGER,
822
    .argument_type =
823
        {
824
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
825
            EBPF_ARGUMENT_TYPE_ANYTHING,
826
        },
827
    .context_descriptor = &g_sock_ops_descr,
828
};
829

830
static constexpr EbpfHelperPrototype bpf_bind_proto = {
831
    .name = "bind",
832
    .return_type = EBPF_RETURN_TYPE_INTEGER,
833
    .argument_type =
834
        {
835
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
836
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
837
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
838
        },
839
};
840

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

855
static constexpr EbpfHelperPrototype bpf_fib_lookup_proto = {
856
    .name = "fib_lookup",
857
    .return_type = EBPF_RETURN_TYPE_INTEGER,
858
    .argument_type =
859
        {
860
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
861
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
862
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
863
            EBPF_ARGUMENT_TYPE_ANYTHING,
864
        },
865
};
866

867
static constexpr EbpfHelperPrototype bpf_lwt_push_encap_proto = {
868
    .name = "lwt_push_encap",
869
    .return_type = EBPF_RETURN_TYPE_INTEGER,
870
    .argument_type =
871
        {
872
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
873
            EBPF_ARGUMENT_TYPE_ANYTHING,
874
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
875
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
876
        },
877
    .context_descriptor = &g_sk_buff,
878
};
879

880
static constexpr EbpfHelperPrototype bpf_lwt_seg6_store_bytes_proto = {
881
    .name = "lwt_seg6_store_bytes",
882
    .return_type = EBPF_RETURN_TYPE_INTEGER,
883
    .argument_type =
884
        {
885
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
886
            EBPF_ARGUMENT_TYPE_ANYTHING,
887
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
888
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
889
        },
890
    .context_descriptor = &g_sk_buff,
891
};
892

893
static constexpr EbpfHelperPrototype bpf_lwt_seg6_action_proto = {
894
    .name = "lwt_seg6_action",
895
    .return_type = EBPF_RETURN_TYPE_INTEGER,
896
    .argument_type =
897
        {
898
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
899
            EBPF_ARGUMENT_TYPE_ANYTHING,
900
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
901
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
902
        },
903
    .context_descriptor = &g_sk_buff,
904
};
905

906
static constexpr EbpfHelperPrototype bpf_lwt_seg6_adjust_srh_proto = {
907
    .name = "lwt_seg6_adjust_srh",
908
    .return_type = EBPF_RETURN_TYPE_INTEGER,
909
    .argument_type =
910
        {
911
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
912
            EBPF_ARGUMENT_TYPE_ANYTHING,
913
            EBPF_ARGUMENT_TYPE_ANYTHING,
914
        },
915
    .reallocate_packet = true,
916
    .context_descriptor = &g_sk_buff,
917
};
918

919
static constexpr EbpfHelperPrototype bpf_rc_repeat_proto = {
920
    .name = "rc_repeat",
921
    .return_type = EBPF_RETURN_TYPE_INTEGER,
922
    .argument_type =
923
        {
924
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
925
        },
926
};
927

928
static constexpr EbpfHelperPrototype bpf_rc_keydown_proto = {
929
    .name = "rc_keydown",
930
    .return_type = EBPF_RETURN_TYPE_INTEGER,
931
    .argument_type =
932
        {
933
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
934
            EBPF_ARGUMENT_TYPE_ANYTHING,
935
            EBPF_ARGUMENT_TYPE_ANYTHING,
936
            EBPF_ARGUMENT_TYPE_ANYTHING,
937
        },
938
};
939

940
static constexpr EbpfHelperPrototype bpf_get_local_storage_proto = {
941
    .name = "get_local_storage",
942
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL, // BUT never NULL. TODO: add type
943
    .argument_type =
944
        {
945
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
946
            EBPF_ARGUMENT_TYPE_ANYTHING,
947
        },
948
};
949

950
static constexpr EbpfHelperPrototype bpf_redirect_map_proto = {
951
    .name = "redirect_map",
952
    .return_type = EBPF_RETURN_TYPE_INTEGER,
953
    .argument_type =
954
        {
955
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
956
            EBPF_ARGUMENT_TYPE_ANYTHING,
957
            EBPF_ARGUMENT_TYPE_ANYTHING,
958
        },
959
};
960

961
static constexpr EbpfHelperPrototype bpf_sk_select_reuseport_proto = {
962
    .name = "sk_select_reuseport",
963
    .return_type = EBPF_RETURN_TYPE_INTEGER,
964
    .argument_type{
965
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
966
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
967
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY,
968
        EBPF_ARGUMENT_TYPE_ANYTHING,
969
    },
970
};
971

972
static constexpr EbpfHelperPrototype bpf_get_current_ancestor_cgroup_id_proto = {
973
    .name = "get_current_ancestor_cgroup_id",
974
    .return_type = EBPF_RETURN_TYPE_INTEGER,
975
    .argument_type{
976
        EBPF_ARGUMENT_TYPE_ANYTHING,
977
    },
978
};
979

980
static constexpr EbpfHelperPrototype bpf_sk_lookup_tcp_proto = {
981
    .name = "sk_lookup_tcp",
982
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCK_COMMON_OR_NULL,
983
    .argument_type =
984
        {
985
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
986
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
987
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
988
            EBPF_ARGUMENT_TYPE_ANYTHING,
989
            EBPF_ARGUMENT_TYPE_ANYTHING,
990
        },
991
};
992
static constexpr EbpfHelperPrototype bpf_sk_lookup_udp_proto = {
993
    .name = "sk_lookup_udp",
994
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCKET_OR_NULL,
995
    .argument_type{
996
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
997
        EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
998
        EBPF_ARGUMENT_TYPE_CONST_SIZE,
999
        EBPF_ARGUMENT_TYPE_ANYTHING,
1000
        EBPF_ARGUMENT_TYPE_ANYTHING,
1001
    },
1002
};
1003

1004
static constexpr EbpfHelperPrototype bpf_sk_release_proto = {
1005
    .name = "sk_release",
1006
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1007
    .argument_type =
1008
        {
1009
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1010
        },
1011
};
1012

1013
static constexpr EbpfHelperPrototype bpf_map_push_elem_proto = {
1014
    .name = "map_push_elem",
1015
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1016
    .argument_type{
1017
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1018
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE,
1019
        EBPF_ARGUMENT_TYPE_ANYTHING,
1020
    },
1021
};
1022

1023
static constexpr EbpfHelperPrototype bpf_map_pop_elem_proto = {
1024
    .name = "map_pop_elem",
1025
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1026
    .argument_type{
1027
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1028
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE, // TODO: uninit
1029
    },
1030
};
1031

1032
static constexpr EbpfHelperPrototype bpf_map_peek_elem_proto = {
1033
    .name = "map_peek_elem",
1034
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1035
    .argument_type{
1036
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP,       // TODO: const
1037
        EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE, // TODO: uninit
1038
    },
1039
};
1040

1041
static constexpr EbpfHelperPrototype bpf_msg_push_data_proto = {
1042
    .name = "msg_push_data",
1043
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1044
    .argument_type{
1045
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1046
        EBPF_ARGUMENT_TYPE_ANYTHING,
1047
        EBPF_ARGUMENT_TYPE_ANYTHING,
1048
        EBPF_ARGUMENT_TYPE_ANYTHING,
1049
    },
1050
    .context_descriptor = &g_sk_msg_md,
1051
};
1052

1053
static constexpr EbpfHelperPrototype bpf_msg_pop_data_proto = {
1054
    .name = "msg_pop_data",
1055
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1056
    .argument_type{
1057
        EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1058
        EBPF_ARGUMENT_TYPE_ANYTHING,
1059
        EBPF_ARGUMENT_TYPE_ANYTHING,
1060
        EBPF_ARGUMENT_TYPE_ANYTHING,
1061
    },
1062
    .context_descriptor = &g_sk_msg_md,
1063
};
1064

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

1075
static constexpr EbpfHelperPrototype bpf_spin_lock_proto = {
1076
    .name = "spin_lock",
1077
    .return_type = EBPF_RETURN_TYPE_INTEGER, // returns 0
1078
    .argument_type =
1079
        {
1080
            EBPF_ARGUMENT_TYPE_PTR_TO_SPIN_LOCK,
1081
        },
1082
};
1083

1084
static constexpr EbpfHelperPrototype bpf_spin_unlock_proto = {
1085
    .name = "spin_unlock",
1086
    .return_type = EBPF_RETURN_TYPE_INTEGER, // returns 0
1087
    .argument_type =
1088
        {
1089
            EBPF_ARGUMENT_TYPE_PTR_TO_SPIN_LOCK,
1090
        },
1091
};
1092

1093
static constexpr EbpfHelperPrototype bpf_jiffies64_proto = {
1094
    .name = "jiffies64",
1095
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1096
};
1097

1098
static constexpr EbpfHelperPrototype bpf_sk_fullsock_proto = {
1099
    .name = "sk_fullsock",
1100
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCKET_OR_NULL,
1101
    .argument_type =
1102
        {
1103
            EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON,
1104
        },
1105
};
1106

1107
static constexpr EbpfHelperPrototype bpf_tcp_sock_proto = {
1108
    .name = "tcp_sock",
1109
    .return_type = EBPF_RETURN_TYPE_PTR_TO_TCP_SOCKET_OR_NULL,
1110
    .argument_type =
1111
        {
1112
            EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON,
1113
        },
1114
};
1115

1116
static constexpr EbpfHelperPrototype bpf_skb_ecn_set_ce_proto = {
1117
    .name = "skb_ecn_set_ce",
1118
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1119
    .argument_type =
1120
        {
1121
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1122
        },
1123
};
1124

1125
static constexpr EbpfHelperPrototype bpf_tcp_check_syncookie_proto = {
1126
    .name = "tcp_check_syncookie",
1127
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1128
    .argument_type =
1129
        {
1130
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1131
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
1132
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1133
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
1134
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1135
        },
1136
};
1137

1138
static constexpr EbpfHelperPrototype bpf_get_listener_sock_proto = {
1139
    .name = "EbpfHelperPrototype",
1140
    .return_type = EBPF_RETURN_TYPE_PTR_TO_TCP_SOCKET_OR_NULL,
1141
    .argument_type =
1142
        {
1143
            EBPF_ARGUMENT_TYPE_PTR_TO_SOCK_COMMON,
1144
        },
1145
};
1146

1147
static constexpr EbpfHelperPrototype bpf_skc_lookup_tcp_proto = {
1148
    .name = "skc_lookup_tcp",
1149
    .return_type = EBPF_RETURN_TYPE_PTR_TO_SOCK_COMMON_OR_NULL,
1150
    .argument_type =
1151
        {
1152
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1153
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
1154
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1155
            EBPF_ARGUMENT_TYPE_ANYTHING,
1156
            EBPF_ARGUMENT_TYPE_ANYTHING,
1157
        },
1158
};
1159

1160
static constexpr EbpfHelperPrototype bpf_sysctl_get_name_proto = {
1161
    .name = "sysctl_get_name",
1162
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1163
    .argument_type =
1164
        {
1165
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1166
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1167
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1168
            EBPF_ARGUMENT_TYPE_ANYTHING,
1169
        },
1170
};
1171

1172
static constexpr EbpfHelperPrototype bpf_sysctl_get_current_value_proto = {
1173
    .name = "sysctl_get_current_value",
1174
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1175
    .argument_type =
1176
        {
1177
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1178
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1179
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1180
        },
1181
};
1182

1183
static constexpr EbpfHelperPrototype bpf_sysctl_get_new_value_proto = {
1184
    .name = "sysctl_get_new_value",
1185
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1186
    .argument_type =
1187
        {
1188
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1189
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1190
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1191
        },
1192
};
1193

1194
static constexpr EbpfHelperPrototype bpf_sysctl_set_new_value_proto = {
1195
    .name = "sysctl_set_new_value",
1196
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1197
    .argument_type =
1198
        {
1199
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1200
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
1201
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1202
        },
1203
};
1204

1205
static constexpr EbpfHelperPrototype bpf_strtol_proto = {
1206
    .name = "strtol",
1207
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1208
    .argument_type =
1209
        {
1210
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
1211
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1212
            EBPF_ARGUMENT_TYPE_ANYTHING,
1213
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
1214
        },
1215
};
1216

1217
static constexpr EbpfHelperPrototype bpf_strtoul_proto = {
1218
    .name = "strtoul",
1219
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1220
    .argument_type =
1221
        {
1222
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
1223
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1224
            EBPF_ARGUMENT_TYPE_ANYTHING,
1225
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
1226
        },
1227
};
1228

1229
static constexpr EbpfHelperPrototype bpf_strncmp_proto = {
1230
    .name = "strncmp",
1231
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1232
    .argument_type =
1233
        {
1234
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1235
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1236
            EBPF_ARGUMENT_TYPE_PTR_TO_CONST_STR,
1237
        },
1238
};
1239

1240
static constexpr EbpfHelperPrototype bpf_sk_storage_get_proto = {
1241
    .name = "sk_storage_get",
1242
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1243
    .argument_type =
1244
        {
1245
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1246
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1247
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE, // TODO: OR_NULL,
1248
            EBPF_ARGUMENT_TYPE_ANYTHING,
1249
        },
1250
};
1251

1252
static constexpr EbpfHelperPrototype bpf_sk_storage_get_cg_sock_proto = {
1253
    .name = "sk_storage_get",
1254
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1255
    .argument_type =
1256
        {
1257
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1258
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,       /* context is 'struct sock' */
1259
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE, // TODO: OR_NULL,
1260
            EBPF_ARGUMENT_TYPE_ANYTHING,
1261
        },
1262
};
1263

1264
static constexpr EbpfHelperPrototype bpf_sk_storage_delete_proto = {
1265
    .name = "sk_storage_delete",
1266
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1267
    .argument_type =
1268
        {
1269
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1270
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1271
        },
1272
};
1273

1274
static constexpr EbpfHelperPrototype bpf_send_signal_proto = {
1275
    .name = "send_signal",
1276
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1277
    .argument_type =
1278
        {
1279
            EBPF_ARGUMENT_TYPE_ANYTHING,
1280
        },
1281
};
1282

1283
static constexpr EbpfHelperPrototype bpf_send_signal_thread_proto = {
1284
    .name = "send_signal_thread",
1285
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1286
    .argument_type =
1287
        {
1288
            EBPF_ARGUMENT_TYPE_ANYTHING,
1289
        },
1290
};
1291

1292
static constexpr EbpfHelperPrototype bpf_tcp_gen_syncookie_proto = {
1293
    .name = "tcp_gen_syncookie",
1294
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1295
    .argument_type =
1296
        {
1297
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1298
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
1299
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1300
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
1301
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1302
        },
1303
};
1304

1305
static constexpr EbpfHelperPrototype bpf_skb_output_proto = {
1306
    .name = "skb_event_output",
1307
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1308
    .argument_type =
1309
        {
1310
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1311
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP, // originally const
1312
            EBPF_ARGUMENT_TYPE_ANYTHING,
1313
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO readonly
1314
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1315
        },
1316
    //.arg1_btf_id = &bpf_skb_output_btf_ids[0],
1317
};
1318

1319
static constexpr EbpfHelperPrototype bpf_probe_read_user_proto = {
1320
    .name = "probe_read_user",
1321
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1322
    .argument_type =
1323
        {
1324
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1325
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1326
            EBPF_ARGUMENT_TYPE_ANYTHING,
1327
        },
1328
};
1329

1330
static constexpr EbpfHelperPrototype bpf_probe_read_user_str_proto = {
1331
    .name = "probe_read_user_str",
1332
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1333
    .argument_type =
1334
        {
1335
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1336
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1337
            EBPF_ARGUMENT_TYPE_ANYTHING,
1338
        },
1339
};
1340

1341
static constexpr EbpfHelperPrototype bpf_probe_read_kernel_proto = {
1342
    .name = "probe_read_kernel",
1343
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1344
    .argument_type =
1345
        {
1346
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1347
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1348
            EBPF_ARGUMENT_TYPE_ANYTHING,
1349
        },
1350
};
1351

1352
static constexpr EbpfHelperPrototype bpf_probe_read_kernel_str_proto = {
1353
    .name = "probe_read_kernel_str",
1354
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1355
    .argument_type =
1356
        {
1357
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1358
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1359
            EBPF_ARGUMENT_TYPE_ANYTHING,
1360
        },
1361
};
1362

1363
static constexpr EbpfHelperPrototype bpf_tcp_send_ack_proto = {
1364
    .name = "tcp_send_ack",
1365
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1366
    .argument_type =
1367
        {
1368
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1369
            EBPF_ARGUMENT_TYPE_ANYTHING,
1370
        },
1371
    //.arg1_btf_id = &tcp_sock_id[0],
1372
};
1373

1374
static constexpr EbpfHelperPrototype bpf_read_branch_records_proto = {
1375
    .name = "read_branch_records",
1376
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1377
    .argument_type =
1378
        {
1379
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1380
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1381
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1382
            EBPF_ARGUMENT_TYPE_ANYTHING,
1383
        },
1384
};
1385

1386
static constexpr EbpfHelperPrototype bpf_get_ns_current_pid_tgid_proto = {
1387
    .name = "get_ns_current_pid_tgid",
1388
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1389
    .argument_type =
1390
        {
1391
            EBPF_ARGUMENT_TYPE_ANYTHING,
1392
            EBPF_ARGUMENT_TYPE_ANYTHING,
1393
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, // TODO: or null
1394
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1395
        },
1396
};
1397

1398
static constexpr EbpfHelperPrototype bpf_xdp_output_proto = {
1399
    .name = "xdp_event_output",
1400
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1401
    .argument_type =
1402
        {
1403
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1404
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1405
            EBPF_ARGUMENT_TYPE_ANYTHING,
1406
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO : readonly
1407
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1408
        },
1409
    // .arg1_btf_id = &bpf_xdp_output_btf_ids[0],
1410
};
1411

1412
static constexpr EbpfHelperPrototype bpf_get_netns_cookie_sock_proto = {
1413
    .name = "get_netns_cookie_sock",
1414
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1415
    .argument_type =
1416
        {
1417
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX, // TODO: or null
1418
        },
1419
};
1420

1421
static constexpr EbpfHelperPrototype bpf_get_netns_cookie_sock_addr_proto = {
1422
    .name = "get_netns_cookie_sock_addr",
1423
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1424
    .argument_type =
1425
        {
1426
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX, // TODO: or null
1427
        },
1428
};
1429

1430
static constexpr EbpfHelperPrototype bpf_sk_assign_proto = {
1431
    .name = "get_netns_cookie_sock",
1432
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1433
    .argument_type =
1434
        {
1435
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1436
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1437
            EBPF_ARGUMENT_TYPE_ANYTHING,
1438
        },
1439
};
1440

1441
static constexpr EbpfHelperPrototype bpf_ktime_get_boot_ns_proto = {
1442
    .name = "ktime_get_boot_ns",
1443
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1444
};
1445

1446
static constexpr EbpfHelperPrototype bpf_seq_printf_proto = {
1447
    .name = "seq_printf",
1448
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1449
    .argument_type =
1450
        {
1451
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1452
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1453
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1454
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1455
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1456
        },
1457
    // .arg1_btf_id = &btf_seq_file_ids[0],
1458
};
1459

1460
static constexpr EbpfHelperPrototype bpf_seq_write_proto = {
1461
    .name = "seq_write",
1462
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1463
    .argument_type =
1464
        {
1465
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1466
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1467
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1468
        },
1469
};
1470

1471
static constexpr EbpfHelperPrototype bpf_sk_cgroup_id_proto = {
1472
    .name = "sk_cgroup_id",
1473
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1474
    .argument_type =
1475
        {
1476
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1477
        },
1478
};
1479

1480
static constexpr EbpfHelperPrototype bpf_sk_ancestor_cgroup_id_proto = {
1481
    .name = "sk_ancestor_cgroup_id",
1482
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1483
    .argument_type =
1484
        {
1485
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1486
            EBPF_ARGUMENT_TYPE_ANYTHING,
1487
        },
1488
};
1489

1490
static constexpr EbpfHelperPrototype bpf_ringbuf_reserve_proto = {
1491
    .name = "ringbuf_reserve",
1492
    .return_type = EBPF_RETURN_TYPE_PTR_TO_ALLOC_MEM_OR_NULL,
1493
    .argument_type =
1494
        {
1495
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1496
            EBPF_ARGUMENT_TYPE_CONST_ALLOC_SIZE_OR_ZERO,
1497
            EBPF_ARGUMENT_TYPE_ANYTHING,
1498
        },
1499
};
1500

1501
static constexpr EbpfHelperPrototype bpf_ringbuf_submit_proto = {
1502
    .name = "ringbuf_submit",
1503
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1504
    .argument_type =
1505
        {
1506
            EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM,
1507
            EBPF_ARGUMENT_TYPE_ANYTHING,
1508
        },
1509
};
1510

1511
static constexpr EbpfHelperPrototype bpf_ringbuf_discard_proto = {
1512
    .name = "ringbuf_discard",
1513
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1514
    .argument_type =
1515
        {
1516
            EBPF_ARGUMENT_TYPE_PTR_TO_ALLOC_MEM,
1517
            EBPF_ARGUMENT_TYPE_ANYTHING,
1518
        },
1519
};
1520

1521
static constexpr EbpfHelperPrototype bpf_ringbuf_output_proto = {
1522
    .name = "ringbuf_output",
1523
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1524
    .argument_type =
1525
        {
1526
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1527
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1528
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1529
            EBPF_ARGUMENT_TYPE_ANYTHING,
1530
        },
1531
};
1532

1533
constexpr EbpfHelperPrototype bpf_ringbuf_query_proto = {
1534
    .name = "ringbuf_query",
1535
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1536
    .argument_type =
1537
        {
1538
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP, // TODO: const
1539
            EBPF_ARGUMENT_TYPE_ANYTHING,
1540
        },
1541
};
1542

1543
static constexpr EbpfHelperPrototype bpf_csum_level_proto = {
1544
    .name = "csum_level",
1545
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1546
    .argument_type =
1547
        {
1548
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1549
            EBPF_ARGUMENT_TYPE_ANYTHING,
1550
        },
1551
};
1552

1553
static constexpr EbpfHelperPrototype bpf_skc_to_tcp6_sock_proto = {
1554
    .name = "skc_to_tcp6_sock",
1555
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1556
    .argument_type =
1557
        {
1558
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1559
        },
1560
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP6],
1561
};
1562

1563
static constexpr EbpfHelperPrototype bpf_skc_to_tcp_sock_proto = {
1564
    .name = "skc_to_tcp_sock",
1565
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1566
    .argument_type =
1567
        {
1568
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1569
        },
1570
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP],
1571
};
1572

1573
static constexpr EbpfHelperPrototype bpf_skc_to_tcp_timewait_sock_proto = {
1574
    .name = "skc_to_tcp_timewait_sock",
1575
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1576
    .argument_type =
1577
        {
1578
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1579
        },
1580
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP_TW],
1581
};
1582

1583
static constexpr EbpfHelperPrototype bpf_skc_to_tcp_request_sock_proto = {
1584
    .name = "skc_to_tcp_request_sock",
1585
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1586
    .argument_type =
1587
        {
1588
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1589
        },
1590
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_TCP_REQ],
1591
};
1592

1593
static constexpr EbpfHelperPrototype bpf_skc_to_udp6_sock_proto = {
1594
    .name = "skc_to_udp6_sock",
1595
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1596
    .argument_type =
1597
        {
1598
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
1599
        },
1600
    //.ret_btf_id  = &btf_sock_ids[BTF_SOCK_TYPE_UDP6],
1601
};
1602

1603
static constexpr EbpfHelperPrototype bpf_sock_from_file_proto = {
1604
    .name = "sock_from_file",
1605
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
1606
    .argument_type =
1607
        {
1608
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1609
        },
1610
    //.ret_btf_id = &bpf_sock_from_file_btf_ids[0],
1611
    //.arg1_btf_id = &bpf_sock_from_file_btf_ids[1],
1612
};
1613

1614
static constexpr EbpfHelperPrototype bpf_get_task_stack_proto = {
1615
    .name = "get_task_stack",
1616
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1617
    .argument_type =
1618
        {
1619
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1620
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1621
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1622
            EBPF_ARGUMENT_TYPE_ANYTHING,
1623
        },
1624
    // .arg1_btf_id = &bpf_get_task_stack_btf_ids[0],
1625
};
1626

1627
static constexpr EbpfHelperPrototype bpf_sock_ops_load_hdr_opt_proto = {
1628
    .name = "sock_ops_load_hdr_opt",
1629
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1630
    .argument_type =
1631
        {
1632
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1633
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1634
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1635
            EBPF_ARGUMENT_TYPE_ANYTHING,
1636
        },
1637
};
1638

1639
static constexpr EbpfHelperPrototype bpf_sock_ops_store_hdr_opt_proto = {
1640
    .name = "sock_ops_store_hdr_opt",
1641
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1642
    .argument_type =
1643
        {
1644
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1645
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1646
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1647
            EBPF_ARGUMENT_TYPE_ANYTHING,
1648
        },
1649
};
1650

1651
static constexpr EbpfHelperPrototype bpf_sock_ops_reserve_hdr_opt_proto = {
1652
    .name = "sock_ops_reserve_hdr_opt",
1653
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1654
    .argument_type =
1655
        {
1656
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1657
            EBPF_ARGUMENT_TYPE_ANYTHING,
1658
            EBPF_ARGUMENT_TYPE_ANYTHING,
1659
        },
1660
};
1661

1662
static constexpr EbpfHelperPrototype bpf_inode_storage_get_proto = {
1663
    .name = "inode_storage_get",
1664
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1665
    .argument_type =
1666
        {
1667
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1668
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1669
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE_OR_NULL, // TODO: as argument too
1670
            EBPF_ARGUMENT_TYPE_ANYTHING,
1671
        },
1672
    //.arg2_btf_id = &bpf_inode_storage_btf_ids[0],
1673
};
1674

1675
static constexpr EbpfHelperPrototype bpf_inode_storage_delete_proto = {
1676
    .name = "inode_storage_delete",
1677
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1678
    .argument_type =
1679
        {
1680
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1681
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1682
        },
1683
    //.arg2_btf_id = &bpf_inode_storage_btf_ids[0],
1684
};
1685

1686
static constexpr EbpfHelperPrototype bpf_d_path_proto = {
1687
    .name = "d_path",
1688
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1689
    .argument_type =
1690
        {
1691
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1692
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1693
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1694
        },
1695
    // .allowed = bpf_d_path_allowed,
1696
    // .arg1_btf_id = &bpf_d_path_btf_ids[0],
1697
};
1698

1699
static constexpr EbpfHelperPrototype bpf_copy_from_user_proto = {
1700
    .name = "copy_from_user",
1701
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1702
    .argument_type =
1703
        {
1704
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1705
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1706
            EBPF_ARGUMENT_TYPE_ANYTHING,
1707
        },
1708
};
1709

1710
static constexpr EbpfHelperPrototype bpf_per_cpu_ptr_proto = {
1711
    .name = "per_cpu_ptr",
1712
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID_OR_NULL,
1713
    .argument_type =
1714
        {
1715
            EBPF_ARGUMENT_TYPE_PTR_TO_PERCPU_BTF_ID,
1716
            EBPF_ARGUMENT_TYPE_ANYTHING,
1717
        },
1718
};
1719

1720
static constexpr EbpfHelperPrototype bpf_this_cpu_ptr_proto = {
1721
    .name = "this_cpu_ptr",
1722
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MEM_OR_BTF_ID,
1723
    .argument_type =
1724
        {
1725
            EBPF_ARGUMENT_TYPE_PTR_TO_PERCPU_BTF_ID,
1726
        },
1727
};
1728

1729
static constexpr EbpfHelperPrototype bpf_snprintf_btf_proto = {
1730
    .name = "snprintf_btf",
1731
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1732
    .argument_type =
1733
        {
1734
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1735
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1736
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1737
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1738
            EBPF_ARGUMENT_TYPE_ANYTHING,
1739
        },
1740
};
1741

1742
static constexpr EbpfHelperPrototype bpf_seq_printf_btf_proto = {
1743
    .name = "seq_printf_btf",
1744
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1745
    .argument_type =
1746
        {
1747
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1748
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1749
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1750
            EBPF_ARGUMENT_TYPE_ANYTHING,
1751
        },
1752
    // .arg1_btf_id        = &btf_seq_file_ids[0],
1753
};
1754

1755
static constexpr EbpfHelperPrototype bpf_skb_cgroup_classid_proto = {
1756
    .name = "skb_cgroup_classid",
1757
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1758
    .argument_type =
1759
        {
1760
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1761
        },
1762
};
1763

1764
static constexpr EbpfHelperPrototype bpf_redirect_neigh_proto = {
1765
    .name = "redirect_neigh",
1766
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1767
    .argument_type =
1768
        {
1769
            EBPF_ARGUMENT_TYPE_ANYTHING,
1770
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1771
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1772
            EBPF_ARGUMENT_TYPE_ANYTHING,
1773
        },
1774
};
1775

1776
static constexpr EbpfHelperPrototype bpf_redirect_peer_proto = {
1777
    .name = "redirect_peer",
1778
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1779
    .argument_type =
1780
        {
1781
            EBPF_ARGUMENT_TYPE_ANYTHING,
1782
            EBPF_ARGUMENT_TYPE_ANYTHING,
1783
        },
1784
};
1785

1786
static constexpr EbpfHelperPrototype bpf_task_storage_get_proto = {
1787
    .name = "task_storage_get",
1788
    .return_type = EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL,
1789
    .argument_type =
1790
        {
1791
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1792
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1793
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE, // TODO: or null
1794
            EBPF_ARGUMENT_TYPE_ANYTHING,
1795
        },
1796
    // .arg2_btf_id = &bpf_task_storage_btf_ids[0],
1797
};
1798

1799
static constexpr EbpfHelperPrototype bpf_task_storage_delete_proto = {
1800
    .name = "task_storage_delete",
1801
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1802
    .argument_type =
1803
        {
1804
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1805
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1806
        },
1807
    // .arg2_btf_id = &bpf_task_storage_btf_ids[0],
1808
};
1809

1810
static constexpr EbpfHelperPrototype bpf_get_current_task_btf_proto = {
1811
    .name = "get_current_task_btf", .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID,
1812
    // .ret_btf_id = &bpf_get_current_btf_ids[0],
1813
};
1814

1815
static constexpr EbpfHelperPrototype bpf_bprm_opts_set_proto = {
1816
    .name = "bprm_opts_set",
1817
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1818
    .argument_type =
1819
        {
1820
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1821
            EBPF_ARGUMENT_TYPE_ANYTHING,
1822
        }
1823
    // .arg1_btf_id        = &bpf_bprm_opts_set_btf_ids[0],
1824
};
1825

1826
static constexpr EbpfHelperPrototype bpf_ima_inode_hash_proto = {
1827
    .name = "ima_inode_hash",
1828
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1829
    .argument_type =
1830
        {
1831
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1832
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
1833
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1834
        },
1835
    //    .allowed        = bpf_ima_inode_hash_allowed,
1836
    //    .arg1_btf_id        = &bpf_ima_inode_hash_btf_ids[0],
1837
};
1838

1839
static constexpr EbpfHelperPrototype bpf_ktime_get_coarse_ns_proto = {
1840
    .name = "ktime_get_coarse_ns",
1841
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1842
};
1843

1844
// bpf_skb_check_mtu_proto/bpf_xdp_check_mtu_proto
1845
static constexpr EbpfHelperPrototype bpf_check_mtu_proto = {
1846
    .name = "check_mtu",
1847
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1848
    .argument_type =
1849
        {
1850
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1851
            EBPF_ARGUMENT_TYPE_ANYTHING,
1852
            EBPF_ARGUMENT_TYPE_PTR_TO_INT,
1853
            EBPF_ARGUMENT_TYPE_ANYTHING,
1854
            EBPF_ARGUMENT_TYPE_ANYTHING,
1855
        },
1856
};
1857

1858
static constexpr EbpfHelperPrototype bpf_for_each_map_elem_proto = {
1859
    .name = "for_each_map_elem",
1860
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1861
    .argument_type =
1862
        {
1863
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP,
1864
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
1865
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
1866
            EBPF_ARGUMENT_TYPE_ANYTHING,
1867
        },
1868
};
1869

1870
static constexpr EbpfHelperPrototype bpf_snprintf_proto = {
1871
    .name = "snprintf",
1872
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1873
    .argument_type =
1874
        {
1875
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL,
1876
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1877
            EBPF_ARGUMENT_TYPE_PTR_TO_CONST_STR,
1878
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL, //  TODO: readonly
1879
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1880
        },
1881
};
1882

1883
static constexpr EbpfHelperPrototype bpf_sys_bpf_proto = {
1884
    .name = "sys_bpf",
1885
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1886
    .argument_type =
1887
        {
1888
            EBPF_ARGUMENT_TYPE_ANYTHING,
1889
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, //  TODO: readonly
1890
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1891
        },
1892
};
1893

1894
static constexpr EbpfHelperPrototype bpf_btf_find_by_name_kind_proto = {
1895
    .name = "btf_find_by_name_kind",
1896
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1897
    .argument_type =
1898
        {
1899
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, //  TODO: readonly
1900
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
1901
            EBPF_ARGUMENT_TYPE_ANYTHING,
1902
            EBPF_ARGUMENT_TYPE_ANYTHING,
1903
        },
1904
};
1905

1906
static constexpr EbpfHelperPrototype bpf_sys_close_proto = {
1907
    .name = "sys_close",
1908
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1909
    .argument_type =
1910
        {
1911
            EBPF_ARGUMENT_TYPE_ANYTHING,
1912
        },
1913
};
1914

1915
static constexpr EbpfHelperPrototype bpf_kallsyms_lookup_name_proto = {
1916
    .name = "kallsyms_lookup_name",
1917
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1918
    .argument_type =
1919
        {
1920
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM,
1921
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
1922
            EBPF_ARGUMENT_TYPE_ANYTHING,
1923
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
1924
        },
1925
};
1926

1927
static constexpr EbpfHelperPrototype bpf_timer_init_proto = {
1928
    .name = "timer_init",
1929
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1930
    .argument_type =
1931
        {
1932
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
1933
            EBPF_ARGUMENT_TYPE_PTR_TO_MAP, // TODO: const
1934
            EBPF_ARGUMENT_TYPE_ANYTHING,
1935
        },
1936
};
1937

1938
static constexpr EbpfHelperPrototype bpf_timer_set_callback_proto = {
1939
    .name = "timer_set_callback",
1940
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1941
    .argument_type =
1942
        {
1943
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
1944
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
1945
        },
1946
};
1947

1948
static constexpr EbpfHelperPrototype bpf_timer_start_proto = {
1949
    .name = "timer_start",
1950
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1951
    .argument_type =
1952
        {
1953
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
1954
            EBPF_ARGUMENT_TYPE_ANYTHING,
1955
            EBPF_ARGUMENT_TYPE_ANYTHING,
1956
        },
1957
};
1958

1959
static constexpr EbpfHelperPrototype bpf_timer_cancel_proto = {
1960
    .name = "timer_cancel",
1961
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1962
    .argument_type =
1963
        {
1964
            EBPF_ARGUMENT_TYPE_PTR_TO_TIMER,
1965
        },
1966
};
1967

1968
// same signature for bpf_get_func_ip_proto_kprobe/bpf_get_func_ip_proto_tracing
1969
static constexpr EbpfHelperPrototype bpf_get_func_ip_proto = {
1970
    .name = "get_func_ip",
1971
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1972
    .argument_type =
1973
        {
1974
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1975
        },
1976
};
1977

1978
static constexpr EbpfHelperPrototype bpf_get_attach_cookie_proto = {
1979
    .name = "get_attach_cookie",
1980
    .return_type = EBPF_RETURN_TYPE_INTEGER,
1981
    .argument_type =
1982
        {
1983
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
1984
        },
1985
};
1986

1987
static constexpr EbpfHelperPrototype bpf_task_pt_regs_proto = {
1988
    .name = "task_pt_regs",
1989
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID,
1990
    .argument_type =
1991
        {
1992
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
1993
        },
1994
    //    .arg1_btf_id        = &btf_tracing_ids[BTF_TRACING_TYPE_TASK],
1995
    //    .ret_btf_id        = &bpf_task_pt_regs_ids[0],
1996
};
1997

1998
static constexpr EbpfHelperPrototype bpf_get_branch_snapshot_proto = {
1999
    .name = "get_branch_snapshot",
2000
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2001
    .argument_type =
2002
        {
2003
            EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM,
2004
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
2005
        },
2006
};
2007

2008
static constexpr EbpfHelperPrototype bpf_get_func_arg_proto = {
2009
    .name = "get_func_arg",
2010
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2011
    .argument_type =
2012
        {
2013
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2014
            EBPF_ARGUMENT_TYPE_ANYTHING,
2015
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
2016
        },
2017
};
2018

2019
static constexpr EbpfHelperPrototype bpf_get_func_ret_proto = {
2020
    .name = "get_func_ret",
2021
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2022
    .argument_type =
2023
        {
2024
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2025
            EBPF_ARGUMENT_TYPE_PTR_TO_LONG,
2026
        },
2027
};
2028

2029
static constexpr EbpfHelperPrototype bpf_get_func_arg_cnt_proto = {
2030
    .name = "get_func_arg_cnt",
2031
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2032
    .argument_type =
2033
        {
2034
            EBPF_ARGUMENT_TYPE_PTR_TO_CTX,
2035
        },
2036
};
2037

2038
static constexpr EbpfHelperPrototype bpf_trace_vprintk_proto = {
2039
    .name = "trace_vprintk",
2040
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2041
    .argument_type =
2042
        {
2043
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // TODO: readonly
2044
            EBPF_ARGUMENT_TYPE_CONST_SIZE,
2045
            EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL, // TODO: readonly
2046
            EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO,
2047
        },
2048
};
2049

2050
constexpr EbpfHelperPrototype bpf_skc_to_unix_sock_proto = {
2051
    .name = "skc_to_unix_sock",
2052
    .return_type = EBPF_RETURN_TYPE_PTR_TO_BTF_ID_OR_NULL,
2053
    .argument_type =
2054
        {
2055
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID_SOCK_COMMON,
2056
        }
2057
    //    .ret_btf_id                = &btf_sock_ids[BTF_SOCK_TYPE_UNIX],
2058
};
2059

2060
constexpr EbpfHelperPrototype bpf_find_vma_proto = {
2061
    .name = "find_vma",
2062
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2063
    .argument_type =
2064
        {
2065
            EBPF_ARGUMENT_TYPE_PTR_TO_BTF_ID,
2066
            EBPF_ARGUMENT_TYPE_ANYTHING,
2067
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2068
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
2069
            EBPF_ARGUMENT_TYPE_ANYTHING,
2070
        },
2071
    // .arg1_btf_id = &btf_tracing_ids[BTF_TRACING_TYPE_TASK],
2072
};
2073

2074
constexpr EbpfHelperPrototype bpf_loop_proto = {
2075
    .name = "loop",
2076
    .return_type = EBPF_RETURN_TYPE_INTEGER,
2077
    .argument_type =
2078
        {
2079
            EBPF_ARGUMENT_TYPE_ANYTHING,
2080
            EBPF_ARGUMENT_TYPE_PTR_TO_FUNC,
2081
            EBPF_ARGUMENT_TYPE_PTR_TO_STACK_OR_NULL,
2082
            EBPF_ARGUMENT_TYPE_ANYTHING,
2083
        },
2084
};
2085

2086
#define FN(x) bpf_##x##_proto
2087
// keep this on a round line
2088
constexpr EbpfHelperPrototype prototypes[] = {
2089
    FN(unspec),
2090
    FN(map_lookup_elem),
2091
    FN(map_update_elem),
2092
    FN(map_delete_elem),
2093
    FN(probe_read),
2094
    FN(ktime_get_ns),
2095
    FN(trace_printk),
2096
    FN(get_prandom_u32),
2097
    FN(get_smp_processor_id),
2098
    FN(skb_store_bytes),
2099
    FN(l3_csum_replace),
2100
    FN(l4_csum_replace),
2101
    FN(tail_call),
2102
    FN(clone_redirect),
2103
    FN(get_current_pid_tgid),
2104
    FN(get_current_uid_gid),
2105
    FN(get_current_comm),
2106
    FN(get_cgroup_classid),
2107
    FN(skb_vlan_push),
2108
    FN(skb_vlan_pop),
2109
    FN(skb_get_tunnel_key),
2110
    FN(skb_set_tunnel_key),
2111
    FN(perf_event_read),
2112
    FN(redirect),
2113
    FN(get_route_realm),
2114
    FN(perf_event_output),
2115
    FN(skb_load_bytes),
2116
    FN(get_stackid),
2117
    FN(csum_diff),
2118
    FN(skb_get_tunnel_opt),
2119
    FN(skb_set_tunnel_opt),
2120
    FN(skb_change_proto),
2121
    FN(skb_change_type),
2122
    FN(skb_under_cgroup),
2123
    FN(get_hash_recalc),
2124
    FN(get_current_task),
2125
    FN(probe_write_user),
2126
    FN(current_task_under_cgroup),
2127
    FN(skb_change_tail),
2128
    FN(skb_pull_data),
2129
    FN(csum_update),
2130
    FN(set_hash_invalid),
2131
    FN(get_numa_node_id),
2132
    FN(skb_change_head),
2133
    FN(xdp_adjust_head),
2134
    FN(probe_read_str),
2135
    FN(get_socket_cookie),
2136
    FN(get_socket_uid),
2137
    FN(set_hash),
2138
    FN(setsockopt),
2139
    FN(skb_adjust_room),
2140
    FN(redirect_map),
2141
    FN(sk_redirect_map),
2142
    FN(sock_map_update),
2143
    FN(xdp_adjust_meta),
2144
    FN(perf_event_read_value),
2145
    FN(perf_prog_read_value),
2146
    FN(getsockopt),
2147
    FN(override_return),
2148
    FN(sock_ops_cb_flags_set),
2149
    FN(msg_redirect_map),
2150
    FN(msg_apply_bytes),
2151
    FN(msg_cork_bytes),
2152
    FN(msg_pull_data),
2153
    FN(bind),
2154
    FN(xdp_adjust_tail),
2155
    FN(skb_get_xfrm_state),
2156
    FN(get_stack),
2157
    FN(skb_load_bytes_relative),
2158
    FN(fib_lookup),
2159
    FN(sock_hash_update),
2160
    FN(msg_redirect_hash),
2161
    FN(sk_redirect_hash),
2162
    FN(lwt_push_encap),
2163
    FN(lwt_seg6_store_bytes),
2164
    FN(lwt_seg6_adjust_srh),
2165
    FN(lwt_seg6_action),
2166
    FN(rc_repeat),
2167
    FN(rc_keydown),
2168
    FN(skb_cgroup_id),
2169
    FN(get_current_cgroup_id),
2170
    FN(get_local_storage),
2171
    FN(sk_select_reuseport),
2172
    FN(get_current_cgroup_id),
2173
    FN(sk_lookup_tcp),
2174
    FN(sk_lookup_udp),
2175
    FN(sk_release),
2176
    FN(map_push_elem),
2177
    FN(map_pop_elem),
2178
    FN(map_peek_elem),
2179
    FN(msg_push_data),
2180
    FN(msg_pop_data),
2181
    FN(rc_pointer_rel),
2182
    FN(spin_lock),
2183
    FN(spin_unlock),
2184
    FN(sk_fullsock),
2185
    FN(tcp_sock),
2186
    FN(skb_ecn_set_ce),
2187
    FN(get_listener_sock),
2188
    FN(skc_lookup_tcp),
2189
    FN(tcp_check_syncookie),
2190
    FN(sysctl_get_name),
2191
    FN(sysctl_get_current_value),
2192
    FN(sysctl_get_new_value),
2193
    FN(sysctl_set_new_value),
2194
    FN(strtol),
2195
    FN(strtoul),
2196
    FN(sk_storage_get),
2197
    FN(sk_storage_delete),
2198
    FN(send_signal),
2199
    FN(tcp_gen_syncookie),
2200
    FN(skb_output),
2201
    FN(probe_read_user),
2202
    FN(probe_read_kernel),
2203
    FN(probe_read_user_str),
2204
    FN(probe_read_kernel_str),
2205
    FN(tcp_send_ack),
2206
    FN(send_signal_thread),
2207
    FN(jiffies64),
2208
    FN(read_branch_records),
2209
    FN(get_ns_current_pid_tgid),
2210
    FN(xdp_output),
2211
    FN(get_netns_cookie_sock), // XXX: same signature for bpf_get_netns_cookie_sock_addr_proto  or
2212
                               // bpf_get_netns_cookie_sock_addr_proto
2213
    FN(get_current_ancestor_cgroup_id),
2214
    FN(sk_assign),
2215
    FN(ktime_get_boot_ns),
2216
    FN(seq_printf),
2217
    FN(seq_write),
2218
    FN(sk_cgroup_id),
2219
    FN(sk_ancestor_cgroup_id),
2220
    FN(ringbuf_output),
2221
    FN(ringbuf_reserve),
2222
    FN(ringbuf_submit),
2223
    FN(ringbuf_discard),
2224
    FN(ringbuf_query),
2225
    FN(csum_level),
2226
    FN(skc_to_tcp6_sock),
2227
    FN(skc_to_tcp_sock),
2228
    FN(skc_to_tcp_timewait_sock),
2229
    FN(skc_to_tcp_request_sock),
2230
    FN(skc_to_udp6_sock),
2231
    FN(get_task_stack),
2232
    FN(sock_ops_load_hdr_opt),
2233
    FN(sock_ops_store_hdr_opt),
2234
    FN(sock_ops_reserve_hdr_opt),
2235
    FN(inode_storage_get),
2236
    FN(inode_storage_delete),
2237
    FN(d_path),
2238
    FN(copy_from_user),
2239
    FN(snprintf_btf),
2240
    FN(seq_printf_btf),
2241
    FN(skb_cgroup_classid),
2242
    FN(redirect_neigh),
2243
    FN(per_cpu_ptr),
2244
    FN(this_cpu_ptr),
2245
    FN(redirect_peer),
2246
    FN(task_storage_get),
2247
    FN(task_storage_delete),
2248
    FN(get_current_task_btf),
2249
    FN(bprm_opts_set),
2250
    FN(ktime_get_coarse_ns),
2251
    FN(ima_inode_hash),
2252
    FN(sock_from_file),
2253
    FN(check_mtu),
2254
    FN(for_each_map_elem),
2255
    FN(snprintf),
2256
    FN(sys_bpf),
2257
    FN(btf_find_by_name_kind),
2258
    FN(sys_close),
2259
    FN(timer_init),
2260
    FN(timer_set_callback),
2261
    FN(timer_start),
2262
    FN(timer_cancel),
2263
    FN(get_func_ip),
2264
    FN(get_attach_cookie),
2265
    FN(task_pt_regs),
2266
    FN(get_branch_snapshot),
2267
    FN(trace_vprintk),
2268
    FN(skc_to_unix_sock),
2269
    FN(kallsyms_lookup_name),
2270
    FN(find_vma),
2271
    FN(loop),
2272
    FN(strncmp),
2273
    FN(get_func_arg),
2274
    FN(get_func_ret),
2275
    FN(get_func_arg_cnt),
2276
};
2277

2278
bool is_helper_usable_linux(const int32_t n) {
40,176✔
2279
    if (n >= static_cast<int>(std::size(prototypes)) || n < 0) {
40,176✔
2280
        return false;
4✔
2281
    }
2282

2283
    // If the helper has a context_descriptor, it must match the hook's context_descriptor.
2284
    if ((prototypes[n].context_descriptor != nullptr) &&
44,035✔
2285
        (prototypes[n].context_descriptor != thread_local_program_info->type.context_descriptor)) {
7,734✔
2286
        return false;
1✔
2287
    }
2288

2289
    return true;
20,083✔
2290
}
2291

2292
EbpfHelperPrototype get_helper_prototype_linux(const int32_t n) {
20,108✔
2293
    if (!is_helper_usable_linux(n)) {
20,108✔
UNCOV
2294
        throw std::exception();
×
2295
    }
2296
    return prototypes[n];
20,108✔
2297
}
2298
} // 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