bpf_rs/
helper.rs

1use bpf_rs_macros::Display;
2#[cfg(feature = "serde")]
3use bpf_rs_macros::SerializeFromDisplay;
4
5use crate::StaticName;
6use libbpf_sys::__BPF_FUNC_MAX_ID;
7use num_enum::{IntoPrimitive, TryFromPrimitive};
8use std::fmt::Debug;
9
10/// eBPF helper functions. See [`bpf-helpers(7)`](https://man7.org/linux/man-pages/man7/bpf-helpers.7.html)
11///
12/// The enum value represents the unique id reserved by the kernel to represent the helper function. This
13/// unique id works almost as a counter with a max value:
14/// [`__BPF_FUNC_MAX_ID`](https://github.com/torvalds/linux/blob/672c0c5173427e6b3e2a9bbb7be51ceeec78093a/include/uapi/linux/bpf.h#L5350).
15/// This max limit changes between kernel versions due to the addition of eBPF helper functions.
16///
17/// For more information on eBPF helper functions, check out (although slightly outdated)
18/// [Marsden's Oracle blog post](https://blogs.oracle.com/linux/post/bpf-in-depth-bpf-helper-functions).
19#[non_exhaustive]
20#[repr(u32)]
21#[derive(Display, Debug, Copy, Clone, Hash, PartialEq, Eq, TryFromPrimitive, IntoPrimitive)]
22#[cfg_attr(feature = "serde", derive(SerializeFromDisplay))]
23pub enum BpfHelper {
24    Unspec = 0,
25    MapLookupElem = 1,
26    MapUpdateElem = 2,
27    MapDeleteElem = 3,
28    ProbeRead = 4,
29    KtimeGetNs = 5,
30    TracePrintk = 6,
31    GetPrandomU32 = 7,
32    GetSmpProcessorId = 8,
33    SkbStoreBytes = 9,
34    L3CsumReplace = 10,
35    L4CsumReplace = 11,
36    TailCall = 12,
37    CloneRedirect = 13,
38    GetCurrentPidTgid = 14,
39    GetCurrentUidGid = 15,
40    GetCurrentComm = 16,
41    GetCgroupClassid = 17,
42    SkbVlanPush = 18,
43    SkbVlanPop = 19,
44    SkbGetTunnelKey = 20,
45    SkbSetTunnelKey = 21,
46    PerfEventRead = 22,
47    Redirect = 23,
48    GetRouteRealm = 24,
49    PerfEventOutput = 25,
50    SkbLoadBytes = 26,
51    GetStackid = 27,
52    CsumDiff = 28,
53    SkbGetTunnelOpt = 29,
54    SkbSetTunnelOpt = 30,
55    SkbChangeProto = 31,
56    SkbChangeType = 32,
57    SkbUnderCgroup = 33,
58    GetHashRecalc = 34,
59    GetCurrentTask = 35,
60    ProbeWriteUser = 36,
61    CurrentTaskUnderCgroup = 37,
62    SkbChangeTail = 38,
63    SkbPullData = 39,
64    CsumUpdate = 40,
65    SetHashInvalid = 41,
66    GetNumaNodeId = 42,
67    SkbChangeHead = 43,
68    XdpAdjustHead = 44,
69    ProbeReadStr = 45,
70    GetSocketCookie = 46,
71    GetSocketUid = 47,
72    SetHash = 48,
73    Setsockopt = 49,
74    SkbAdjustRoom = 50,
75    RedirectMap = 51,
76    SkRedirectMap = 52,
77    SockMapUpdate = 53,
78    XdpAdjustMeta = 54,
79    PerfEventReadValue = 55,
80    PerfProgReadValue = 56,
81    Getsockopt = 57,
82    OverrideReturn = 58,
83    SockOpsCbFlagsSet = 59,
84    MsgRedirectMap = 60,
85    MsgApplyBytes = 61,
86    MsgCorkBytes = 62,
87    MsgPullData = 63,
88    Bind = 64,
89    XdpAdjustTail = 65,
90    SkbGetXfrmState = 66,
91    GetStack = 67,
92    SkbLoadBytesRelative = 68,
93    FibLookup = 69,
94    SockHashUpdate = 70,
95    MsgRedirectHash = 71,
96    SkRedirectHash = 72,
97    LwtPushEncap = 73,
98    LwtSeg6StoreBytes = 74,
99    LwtSeg6AdjustSrh = 75,
100    LwtSeg6Action = 76,
101    RcRepeat = 77,
102    RcKeydown = 78,
103    SkbCgroupId = 79,
104    GetCurrentCgroupId = 80,
105    GetLocalStorage = 81,
106    SkSelectReuseport = 82,
107    SkbAncestorCgroupId = 83,
108    SkLookupTcp = 84,
109    SkLookupUdp = 85,
110    SkRelease = 86,
111    MapPushElem = 87,
112    MapPopElem = 88,
113    MapPeekElem = 89,
114    MsgPushData = 90,
115    MsgPopData = 91,
116    RcPointerRel = 92,
117    SpinLock = 93,
118    SpinUnlock = 94,
119    SkFullsock = 95,
120    TcpSock = 96,
121    SkbEcnSetCe = 97,
122    GetListenerSock = 98,
123    SkcLookupTcp = 99,
124    TcpCheckSyncookie = 100,
125    SysctlGetName = 101,
126    SysctlGetCurrentValue = 102,
127    SysctlGetNewValue = 103,
128    SysctlSetNewValue = 104,
129    Strtol = 105,
130    Strtoul = 106,
131    SkStorageGet = 107,
132    SkStorageDelete = 108,
133    SendSignal = 109,
134    TcpGenSyncookie = 110,
135    SkbOutput = 111,
136    ProbeReadUser = 112,
137    ProbeReadKernel = 113,
138    ProbeReadUserStr = 114,
139    ProbeReadKernelStr = 115,
140    TcpSendAck = 116,
141    SendSignalThread = 117,
142    Jiffies64 = 118,
143    ReadBranchRecords = 119,
144    GetNsCurrentPidTgid = 120,
145    XdpOutput = 121,
146    GetNetnsCookie = 122,
147    GetCurrentAncestorCgroupId = 123,
148    SkAssign = 124,
149    KtimeGetBootNs = 125,
150    SeqPrintf = 126,
151    SeqWrite = 127,
152    SkCgroupId = 128,
153    SkAncestorCgroupId = 129,
154    RingbufOutput = 130,
155    RingbufReserve = 131,
156    RingbufSubmit = 132,
157    RingbufDiscard = 133,
158    RingbufQuery = 134,
159    CsumLevel = 135,
160    SkcToTcp6Sock = 136,
161    SkcToTcpSock = 137,
162    SkcToTcpTimewaitSock = 138,
163    SkcToTcpRequestSock = 139,
164    SkcToUdp6Sock = 140,
165    GetTaskStack = 141,
166    LoadHdrOpt = 142,
167    StoreHdrOpt = 143,
168    ReserveHdrOpt = 144,
169    InodeStorageGet = 145,
170    InodeStorageDelete = 146,
171    DPath = 147,
172    CopyFromUser = 148,
173    SnprintfBtf = 149,
174    SeqPrintfBtf = 150,
175    SkbCgroupClassid = 151,
176    RedirectNeigh = 152,
177    PerCpuPtr = 153,
178    ThisCpuPtr = 154,
179    RedirectPeer = 155,
180    TaskStorageGet = 156,
181    TaskStorageDelete = 157,
182    GetCurrentTaskBtf = 158,
183    BprmOptsSet = 159,
184    KtimeGetCoarseNs = 160,
185    ImaInodeHash = 161,
186    SockFromFile = 162,
187    CheckMtu = 163,
188    ForEachMapElem = 164,
189    Snprintf = 165,
190    SysBpf = 166,
191    BtfFindByNameKind = 167,
192    SysClose = 168,
193    TimerInit = 169,
194    TimerSetCallback = 170,
195    TimerStart = 171,
196    TimerCancel = 172,
197    GetFuncIp = 173,
198    GetAttachCookie = 174,
199    TaskPtRegs = 175,
200    GetBranchSnapshot = 176,
201    TraceVprintk = 177,
202    SkcToUnixSock = 178,
203    KallsymsLookupName = 179,
204    FindVma = 180,
205    Loop = 181,
206    Strncmp = 182,
207    GetFuncArg = 183,
208    GetFuncRet = 184,
209    GetFuncArgCnt = 185,
210    GetRetval = 186,
211    SetRetval = 187,
212    XdpGetBuffLen = 188,
213    XdpLoadBytes = 189,
214    XdpStoreBytes = 190,
215    CopyFromUserTask = 191,
216    SkbSetTstamp = 192,
217    ImaFileHash = 193,
218    KptrXchg = 194,
219    MapLookupPercpuElem = 195,
220    SkcToMptcpSock = 196,
221    DynptrFromMem = 197,
222    RingbufReserveDynptr = 198,
223    RingbufSubmitDynptr = 199,
224    RingbufDiscardDynptr = 200,
225    DynptrRead = 201,
226    DynptrWrite = 202,
227    DynptrData = 203,
228    TcpRawGenSyncookieIpv4 = 204,
229    TcpRawGenSyncookieIpv6 = 205,
230    TcpRawCheckSyncookieIpv4 = 206,
231    TcpRawCheckSyncookieIpv6 = 207,
232    KtimeGetTaiNs = 208,
233}
234
235impl BpfHelper {
236    pub fn iter() -> impl Iterator<Item = BpfHelper> {
237        BpfHelperIter::new()
238    }
239}
240
241impl StaticName for BpfHelper {
242    fn name(&self) -> &'static str {
243        match *self {
244            BpfHelper::Unspec => "bpf_unspec",
245            BpfHelper::MapLookupElem => "bpf_map_lookup_elem",
246            BpfHelper::MapUpdateElem => "bpf_map_update_elem",
247            BpfHelper::MapDeleteElem => "bpf_map_delete_elem",
248            BpfHelper::ProbeRead => "bpf_probe_read",
249            BpfHelper::KtimeGetNs => "bpf_ktime_get_ns",
250            BpfHelper::TracePrintk => "bpf_trace_printk",
251            BpfHelper::GetPrandomU32 => "bpf_get_prandom_u32",
252            BpfHelper::GetSmpProcessorId => "bpf_get_smp_processor_id",
253            BpfHelper::SkbStoreBytes => "bpf_skb_store_bytes",
254            BpfHelper::L3CsumReplace => "bpf_l3_csum_replace",
255            BpfHelper::L4CsumReplace => "bpf_l4_csum_replace",
256            BpfHelper::TailCall => "bpf_tail_call",
257            BpfHelper::CloneRedirect => "bpf_clone_redirect",
258            BpfHelper::GetCurrentPidTgid => "bpf_get_current_pid_tgid",
259            BpfHelper::GetCurrentUidGid => "bpf_get_current_uid_gid",
260            BpfHelper::GetCurrentComm => "bpf_get_current_comm",
261            BpfHelper::GetCgroupClassid => "bpf_get_cgroup_classid",
262            BpfHelper::SkbVlanPush => "bpf_skb_vlan_push",
263            BpfHelper::SkbVlanPop => "bpf_skb_vlan_pop",
264            BpfHelper::SkbGetTunnelKey => "bpf_skb_get_tunnel_key",
265            BpfHelper::SkbSetTunnelKey => "bpf_skb_set_tunnel_key",
266            BpfHelper::PerfEventRead => "bpf_perf_event_read",
267            BpfHelper::Redirect => "bpf_redirect",
268            BpfHelper::GetRouteRealm => "bpf_get_route_realm",
269            BpfHelper::PerfEventOutput => "bpf_perf_event_output",
270            BpfHelper::SkbLoadBytes => "bpf_skb_load_bytes",
271            BpfHelper::GetStackid => "bpf_get_stackid",
272            BpfHelper::CsumDiff => "bpf_csum_diff",
273            BpfHelper::SkbGetTunnelOpt => "bpf_skb_get_tunnel_opt",
274            BpfHelper::SkbSetTunnelOpt => "bpf_skb_set_tunnel_opt",
275            BpfHelper::SkbChangeProto => "bpf_skb_change_proto",
276            BpfHelper::SkbChangeType => "bpf_skb_change_type",
277            BpfHelper::SkbUnderCgroup => "bpf_skb_under_cgroup",
278            BpfHelper::GetHashRecalc => "bpf_get_hash_recalc",
279            BpfHelper::GetCurrentTask => "bpf_get_current_task",
280            BpfHelper::ProbeWriteUser => "bpf_probe_write_user",
281            BpfHelper::CurrentTaskUnderCgroup => "bpf_current_task_under_cgroup",
282            BpfHelper::SkbChangeTail => "bpf_skb_change_tail",
283            BpfHelper::SkbPullData => "bpf_skb_pull_data",
284            BpfHelper::CsumUpdate => "bpf_csum_update",
285            BpfHelper::SetHashInvalid => "bpf_set_hash_invalid",
286            BpfHelper::GetNumaNodeId => "bpf_get_numa_node_id",
287            BpfHelper::SkbChangeHead => "bpf_skb_change_head",
288            BpfHelper::XdpAdjustHead => "bpf_xdp_adjust_head",
289            BpfHelper::ProbeReadStr => "bpf_probe_read_str",
290            BpfHelper::GetSocketCookie => "bpf_get_socket_cookie",
291            BpfHelper::GetSocketUid => "bpf_get_socket_uid",
292            BpfHelper::SetHash => "bpf_set_hash",
293            BpfHelper::Setsockopt => "bpf_setsockopt",
294            BpfHelper::SkbAdjustRoom => "bpf_skb_adjust_room",
295            BpfHelper::RedirectMap => "bpf_redirect_map",
296            BpfHelper::SkRedirectMap => "bpf_sk_redirect_map",
297            BpfHelper::SockMapUpdate => "bpf_sock_map_update",
298            BpfHelper::XdpAdjustMeta => "bpf_xdp_adjust_meta",
299            BpfHelper::PerfEventReadValue => "bpf_perf_event_read_value",
300            BpfHelper::PerfProgReadValue => "bpf_perf_prog_read_value",
301            BpfHelper::Getsockopt => "bpf_getsockopt",
302            BpfHelper::OverrideReturn => "bpf_override_return",
303            BpfHelper::SockOpsCbFlagsSet => "bpf_sock_ops_cb_flags_set",
304            BpfHelper::MsgRedirectMap => "bpf_msg_redirect_map",
305            BpfHelper::MsgApplyBytes => "bpf_msg_apply_bytes",
306            BpfHelper::MsgCorkBytes => "bpf_msg_cork_bytes",
307            BpfHelper::MsgPullData => "bpf_msg_pull_data",
308            BpfHelper::Bind => "bpf_bind",
309            BpfHelper::XdpAdjustTail => "bpf_xdp_adjust_tail",
310            BpfHelper::SkbGetXfrmState => "bpf_skb_get_xfrm_state",
311            BpfHelper::GetStack => "bpf_get_stack",
312            BpfHelper::SkbLoadBytesRelative => "bpf_skb_load_bytes_relative",
313            BpfHelper::FibLookup => "bpf_fib_lookup",
314            BpfHelper::SockHashUpdate => "bpf_sock_hash_update",
315            BpfHelper::MsgRedirectHash => "bpf_msg_redirect_hash",
316            BpfHelper::SkRedirectHash => "bpf_sk_redirect_hash",
317            BpfHelper::LwtPushEncap => "bpf_lwt_push_encap",
318            BpfHelper::LwtSeg6StoreBytes => "bpf_lwt_seg6_store_bytes",
319            BpfHelper::LwtSeg6AdjustSrh => "bpf_lwt_seg6_adjust_srh",
320            BpfHelper::LwtSeg6Action => "bpf_lwt_seg6_action",
321            BpfHelper::RcRepeat => "bpf_rc_repeat",
322            BpfHelper::RcKeydown => "bpf_rc_keydown",
323            BpfHelper::SkbCgroupId => "bpf_skb_cgroup_id",
324            BpfHelper::GetCurrentCgroupId => "bpf_get_current_cgroup_id",
325            BpfHelper::GetLocalStorage => "bpf_get_local_storage",
326            BpfHelper::SkSelectReuseport => "bpf_sk_select_reuseport",
327            BpfHelper::SkbAncestorCgroupId => "bpf_skb_ancestor_cgroup_id",
328            BpfHelper::SkLookupTcp => "bpf_sk_lookup_tcp",
329            BpfHelper::SkLookupUdp => "bpf_sk_lookup_udp",
330            BpfHelper::SkRelease => "bpf_sk_release",
331            BpfHelper::MapPushElem => "bpf_map_push_elem",
332            BpfHelper::MapPopElem => "bpf_map_pop_elem",
333            BpfHelper::MapPeekElem => "bpf_map_peek_elem",
334            BpfHelper::MsgPushData => "bpf_msg_push_data",
335            BpfHelper::MsgPopData => "bpf_msg_pop_data",
336            BpfHelper::RcPointerRel => "bpf_rc_pointer_rel",
337            BpfHelper::SpinLock => "bpf_spin_lock",
338            BpfHelper::SpinUnlock => "bpf_spin_unlock",
339            BpfHelper::SkFullsock => "bpf_sk_fullsock",
340            BpfHelper::TcpSock => "bpf_tcp_sock",
341            BpfHelper::SkbEcnSetCe => "bpf_skb_ecn_set_ce",
342            BpfHelper::GetListenerSock => "bpf_get_listener_sock",
343            BpfHelper::SkcLookupTcp => "bpf_skc_lookup_tcp",
344            BpfHelper::TcpCheckSyncookie => "bpf_tcp_check_syncookie",
345            BpfHelper::SysctlGetName => "bpf_sysctl_get_name",
346            BpfHelper::SysctlGetCurrentValue => "bpf_sysctl_get_current_value",
347            BpfHelper::SysctlGetNewValue => "bpf_sysctl_get_new_value",
348            BpfHelper::SysctlSetNewValue => "bpf_sysctl_set_new_value",
349            BpfHelper::Strtol => "bpf_strtol",
350            BpfHelper::Strtoul => "bpf_strtoul",
351            BpfHelper::SkStorageGet => "bpf_sk_storage_get",
352            BpfHelper::SkStorageDelete => "bpf_sk_storage_delete",
353            BpfHelper::SendSignal => "bpf_send_signal",
354            BpfHelper::TcpGenSyncookie => "bpf_tcp_gen_syncookie",
355            BpfHelper::SkbOutput => "bpf_skb_output",
356            BpfHelper::ProbeReadUser => "bpf_probe_read_user",
357            BpfHelper::ProbeReadKernel => "bpf_probe_read_kernel",
358            BpfHelper::ProbeReadUserStr => "bpf_probe_read_user_str",
359            BpfHelper::ProbeReadKernelStr => "bpf_probe_read_kernel_str",
360            BpfHelper::TcpSendAck => "bpf_tcp_send_ack",
361            BpfHelper::SendSignalThread => "bpf_send_signal_thread",
362            BpfHelper::Jiffies64 => "bpf_jiffies64",
363            BpfHelper::ReadBranchRecords => "bpf_read_branch_records",
364            BpfHelper::GetNsCurrentPidTgid => "bpf_get_ns_current_pid_tgid",
365            BpfHelper::XdpOutput => "bpf_xdp_output",
366            BpfHelper::GetNetnsCookie => "bpf_get_netns_cookie",
367            BpfHelper::GetCurrentAncestorCgroupId => "bpf_get_current_ancestor_cgroup_id",
368            BpfHelper::SkAssign => "bpf_sk_assign",
369            BpfHelper::KtimeGetBootNs => "bpf_ktime_get_boot_ns",
370            BpfHelper::SeqPrintf => "bpf_seq_printf",
371            BpfHelper::SeqWrite => "bpf_seq_write",
372            BpfHelper::SkCgroupId => "bpf_sk_cgroup_id",
373            BpfHelper::SkAncestorCgroupId => "bpf_sk_ancestor_cgroup_id",
374            BpfHelper::RingbufOutput => "bpf_ringbuf_output",
375            BpfHelper::RingbufReserve => "bpf_ringbuf_reserve",
376            BpfHelper::RingbufSubmit => "bpf_ringbuf_submit",
377            BpfHelper::RingbufDiscard => "bpf_ringbuf_discard",
378            BpfHelper::RingbufQuery => "bpf_ringbuf_query",
379            BpfHelper::CsumLevel => "bpf_csum_level",
380            BpfHelper::SkcToTcp6Sock => "bpf_skc_to_tcp6_sock",
381            BpfHelper::SkcToTcpSock => "bpf_skc_to_tcp_sock",
382            BpfHelper::SkcToTcpTimewaitSock => "bpf_skc_to_tcp_timewait_sock",
383            BpfHelper::SkcToTcpRequestSock => "bpf_skc_to_tcp_request_sock",
384            BpfHelper::SkcToUdp6Sock => "bpf_skc_to_udp6_sock",
385            BpfHelper::GetTaskStack => "bpf_get_task_stack",
386            BpfHelper::LoadHdrOpt => "bpf_load_hdr_opt",
387            BpfHelper::StoreHdrOpt => "bpf_store_hdr_opt",
388            BpfHelper::ReserveHdrOpt => "bpf_reserve_hdr_opt",
389            BpfHelper::InodeStorageGet => "bpf_inode_storage_get",
390            BpfHelper::InodeStorageDelete => "bpf_inode_storage_delete",
391            BpfHelper::DPath => "bpf_d_path",
392            BpfHelper::CopyFromUser => "bpf_copy_from_user",
393            BpfHelper::SnprintfBtf => "bpf_snprintf_btf",
394            BpfHelper::SeqPrintfBtf => "bpf_seq_printf_btf",
395            BpfHelper::SkbCgroupClassid => "bpf_skb_cgroup_classid",
396            BpfHelper::RedirectNeigh => "bpf_redirect_neigh",
397            BpfHelper::PerCpuPtr => "bpf_per_cpu_ptr",
398            BpfHelper::ThisCpuPtr => "bpf_this_cpu_ptr",
399            BpfHelper::RedirectPeer => "bpf_redirect_peer",
400            BpfHelper::TaskStorageGet => "bpf_task_storage_get",
401            BpfHelper::TaskStorageDelete => "bpf_task_storage_delete",
402            BpfHelper::GetCurrentTaskBtf => "bpf_get_current_task_btf",
403            BpfHelper::BprmOptsSet => "bpf_bprm_opts_set",
404            BpfHelper::KtimeGetCoarseNs => "bpf_ktime_get_coarse_ns",
405            BpfHelper::ImaInodeHash => "bpf_ima_inode_hash",
406            BpfHelper::SockFromFile => "bpf_sock_from_file",
407            BpfHelper::CheckMtu => "bpf_check_mtu",
408            BpfHelper::ForEachMapElem => "bpf_for_each_map_elem",
409            BpfHelper::Snprintf => "bpf_snprintf",
410            BpfHelper::SysBpf => "bpf_sys_bpf",
411            BpfHelper::BtfFindByNameKind => "bpf_btf_find_by_name_kind",
412            BpfHelper::SysClose => "bpf_sys_close",
413            BpfHelper::TimerInit => "bpf_timer_init",
414            BpfHelper::TimerSetCallback => "bpf_timer_set_callback",
415            BpfHelper::TimerStart => "bpf_timer_start",
416            BpfHelper::TimerCancel => "bpf_timer_cancel",
417            BpfHelper::GetFuncIp => "bpf_get_func_ip",
418            BpfHelper::GetAttachCookie => "bpf_get_attach_cookie",
419            BpfHelper::TaskPtRegs => "bpf_task_pt_regs",
420            BpfHelper::GetBranchSnapshot => "bpf_get_branch_snapshot",
421            BpfHelper::TraceVprintk => "bpf_trace_vprintk",
422            BpfHelper::SkcToUnixSock => "bpf_skc_to_unix_sock",
423            BpfHelper::KallsymsLookupName => "bpf_kallsyms_lookup_name",
424            BpfHelper::FindVma => "bpf_find_vma",
425            BpfHelper::Loop => "bpf_loop",
426            BpfHelper::Strncmp => "bpf_strncmp",
427            BpfHelper::GetFuncArg => "bpf_get_func_arg",
428            BpfHelper::GetFuncRet => "bpf_get_func_ret",
429            BpfHelper::GetFuncArgCnt => "bpf_get_func_arg_cnt",
430            BpfHelper::GetRetval => "bpf_get_retval",
431            BpfHelper::SetRetval => "bpf_set_retval",
432            BpfHelper::XdpGetBuffLen => "bpf_xdp_get_buff_len",
433            BpfHelper::XdpLoadBytes => "bpf_xdp_load_bytes",
434            BpfHelper::XdpStoreBytes => "bpf_xdp_store_bytes",
435            BpfHelper::CopyFromUserTask => "bpf_copy_from_user_task",
436            BpfHelper::SkbSetTstamp => "bpf_skb_set_tstamp",
437            BpfHelper::ImaFileHash => "bpf_ima_file_hash",
438            BpfHelper::KptrXchg => "bpf_kptr_xchg",
439            BpfHelper::MapLookupPercpuElem => "bpf_map_lookup_percpu_elem",
440            BpfHelper::SkcToMptcpSock => "skc_to_mptcp_sock",
441            BpfHelper::DynptrFromMem => "dynptr_from_mem",
442            BpfHelper::RingbufReserveDynptr => "ringbuf_reserve_dynptr",
443            BpfHelper::RingbufSubmitDynptr => "ringbuf_submit_dynptr",
444            BpfHelper::RingbufDiscardDynptr => "ringbuf_discard_dynptr",
445            BpfHelper::DynptrRead => "dynptr_read",
446            BpfHelper::DynptrWrite => "dynptr_write",
447            BpfHelper::DynptrData => "dynptr_data",
448            BpfHelper::TcpRawGenSyncookieIpv4 => "tcp_raw_gen_syncookie_ipv4",
449            BpfHelper::TcpRawGenSyncookieIpv6 => "tcp_raw_gen_syncookie_ipv6",
450            BpfHelper::TcpRawCheckSyncookieIpv4 => "tcp_raw_check_syncookie_ipv4",
451            BpfHelper::TcpRawCheckSyncookieIpv6 => "tcp_raw_check_syncookie_ipv6",
452            BpfHelper::KtimeGetTaiNs => "ktime_get_tai_ns",
453        }
454    }
455}
456
457/// Iterator for the eBPF helper functions
458struct BpfHelperIter(u32);
459
460impl BpfHelperIter {
461    /// Creates an ordered iterator
462    ///
463    /// Order here is based on the ascending int ids used to represent the helper
464    /// functions within the kernel. For most cases, this ordering property isn't
465    /// needed.
466    ///
467    /// **Note**: Skips `unspec` helper since it's an invalid function
468    pub fn new() -> Self {
469        Self(1)
470    }
471}
472
473impl Iterator for BpfHelperIter {
474    type Item = BpfHelper;
475
476    fn next(&mut self) -> Option<Self::Item> {
477        let next = self.0;
478        if next >= __BPF_FUNC_MAX_ID {
479            None
480        } else {
481            self.0 += 1;
482            BpfHelper::try_from_primitive(next).ok()
483        }
484    }
485}