From df4f0a7b7dc9ffc077821e6d99174db31ba39c78 Mon Sep 17 00:00:00 2001 From: Pengfei Ni Date: Sun, 29 Oct 2023 15:24:37 +0800 Subject: [PATCH] Add eBPF for Windows demo --- .gitignore | 3 + libbpf | 2 +- windows/.DS_Store | Bin 6148 -> 0 bytes windows/README.md | 3 + windows/connection_tracker/README.md | 29 + windows/connection_tracker/bpf/bpf.log | 78 + windows/connection_tracker/bpf/bpf.vcxproj | 64 + .../bpf/bpf.vcxproj.filters} | 52 +- .../bpf/bpf.vcxproj.user} | 0 .../bpf/conn_track.c} | 267 +- .../connection_tracker/bpf/packages.config | 4 + .../conn_track.sln | 18 +- .../conn_track/conn_track.vcxproj | 15 +- .../conn_track/conn_track.vcxproj.filters | 60 +- .../conn_track/conn_track.vcxproj.user} | 0 .../conn_track/conn_tracker.cpp | 381 +- .../conn_track/conn_tracker.h | 66 +- .../conn_track/packages.config | 4 + windows/conntrack/conn_track/.DS_Store | Bin 6148 -> 0 bytes windows/conntrack/conn_track/packages.config | 4 - windows/hello/.DS_Store | Bin 6148 -> 6148 bytes windows/hello/README.md | 9 + windows/hello/bpf.c | 2 +- windows/hello/out/.DS_Store | Bin 6148 -> 0 bytes windows/hello/out/bpf.cer | Bin 782 -> 0 bytes windows/hello/out/bpf.sys | Bin 10040 -> 0 bytes windows/hello/out/bpf.vcxproj | 1 - windows/hello/out/bpf_driver.c | 289 - windows/hello/out/bpf_km/bpf.sys | Bin 10040 -> 0 bytes .../eBPF-for-Windows.0.3.0/.signature.p7s | Bin 9462 -> 0 bytes .../packages/eBPF-for-Windows.0.3.0/README.md | 4 - .../build/native/bin/Convert-BpfToNative.ps1 | 61 - .../build/native/ebpf-for-windows.props | 29 - .../build/native/include/asm/errno.h | 3 - .../build/native/include/asm/posix_types.h | 3 - .../build/native/include/asm/types.h | 12 - .../build/native/include/bpf/bpf.h | 330 - .../build/native/include/bpf/bpf_legacy.h | 183 - .../build/native/include/bpf/hashmap.h | 6 - .../build/native/include/bpf/libbpf.h | 896 --- .../build/native/include/bpf/libbpf_legacy.h | 208 - .../build/native/include/bpf2c.h | 113 - .../build/native/include/bpf_endian.h | 37 - .../build/native/include/bpf_helper_defs.h | 311 - .../build/native/include/bpf_helpers.h | 30 - .../native/include/bpf_helpers_platform.h | 20 - .../build/native/include/ebpf_api.h | 418 - .../build/native/include/ebpf_base.h | 40 - .../build/native/include/ebpf_core_structs.h | 31 - .../native/include/ebpf_execution_type.h | 21 - .../native/include/ebpf_extension_uuids.h | 27 - .../build/native/include/ebpf_nethooks.h | 228 - .../include/ebpf_program_attach_type_guids.h | 142 - .../build/native/include/ebpf_program_types.h | 67 - .../build/native/include/ebpf_result.h | 115 - .../build/native/include/ebpf_store_helper.h | 350 - .../build/native/include/ebpf_structs.h | 377 - .../build/native/include/ebpf_utilities.h | 152 - .../build/native/include/ebpf_windows.h | 46 - .../build/native/include/elfio_wrapper.hpp | 14 - .../build/native/include/git_commit_id.h | Bin 136 -> 0 bytes .../include/kernel/ebpf_registry_helper.h | 136 - .../include/libbpf/include/asm/barrier.h | 7 - .../include/libbpf/include/linux/compiler.h | 70 - .../native/include/libbpf/include/linux/err.h | 38 - .../include/libbpf/include/linux/filter.h | 134 - .../include/libbpf/include/linux/kernel.h | 44 - .../include/libbpf/include/linux/list.h | 91 - .../include/libbpf/include/linux/overflow.h | 90 - .../libbpf/include/linux/ring_buffer.h | 18 - .../include/libbpf/include/linux/types.h | 33 - .../include/libbpf/include/uapi/linux/bpf.h | 6846 ----------------- .../libbpf/include/uapi/linux/bpf_common.h | 57 - .../include/libbpf/include/uapi/linux/btf.h | 200 - .../libbpf/include/uapi/linux/if_link.h | 1281 --- .../libbpf/include/uapi/linux/if_xdp.h | 111 - .../libbpf/include/uapi/linux/netlink.h | 252 - .../libbpf/include/uapi/linux/perf_event.h | 1395 ---- .../libbpf/include/uapi/linux/pkt_cls.h | 612 -- .../libbpf/include/uapi/linux/pkt_sched.h | 1164 --- .../build/native/include/libbpf/src/bpf.h | 427 - .../native/include/libbpf/src/bpf_core_read.h | 473 -- .../native/include/libbpf/src/bpf_endian.h | 99 - .../include/libbpf/src/bpf_gen_internal.h | 72 - .../include/libbpf/src/bpf_helper_defs.h | 4578 ----------- .../native/include/libbpf/src/bpf_helpers.h | 288 - .../native/include/libbpf/src/bpf_tracing.h | 531 -- .../build/native/include/libbpf/src/btf.h | 555 -- .../build/native/include/libbpf/src/hashmap.h | 204 - .../build/native/include/libbpf/src/libbpf.h | 1356 ---- .../native/include/libbpf/src/libbpf_common.h | 103 - .../include/libbpf/src/libbpf_internal.h | 576 -- .../native/include/libbpf/src/libbpf_legacy.h | 138 - .../include/libbpf/src/libbpf_version.h | 9 - .../build/native/include/libbpf/src/nlattr.h | 164 - .../native/include/libbpf/src/relo_core.h | 95 - .../native/include/libbpf/src/skel_internal.h | 349 - .../native/include/libbpf/src/str_error.h | 6 - .../build/native/include/libbpf/src/strset.h | 21 - .../native/include/libbpf/src/usdt.bpf.h | 259 - .../build/native/include/linux/bpf.h | 182 - .../build/native/include/linux/stddef.h | 3 - .../build/native/include/net/if_ether.h | 31 - .../build/native/include/net/ip.h | 94 - .../build/native/include/net/tcp.h | 31 - .../build/native/include/net/udp.h | 11 - .../build/native/include/uapi/linux/bpf.h | 4 - .../native/include/uapi/linux/if_ether.h | 5 - .../build/native/include/uapi/linux/in.h | 3 - .../build/native/include/uapi/linux/ip.h | 5 - .../build/native/include/uapi/linux/tcp.h | 5 - .../include/user/ebpf_registry_helper.h | 71 - .../eBPF-for-Windows.0.3.0.nupkg | Bin 829697 -> 0 bytes windows/xdpdrop/README.md | 24 + windows/xdpdrop/drop-win.c | 40 - windows/xdpdrop/drop.c | 10 +- windows/xdpdrop/drop1.c | 53 - windows/xdpdrop/packages.config | 4 - windows/xdpdrop/xdpdrop.sln | 31 - windows/xdpdrop/xdpdrop.vcxproj | 159 - windows/xdpdrop/xdpdrop.vcxproj.user | 4 - windows/xdpdrop/xdpdrop_user.cpp | 88 - 122 files changed, 652 insertions(+), 28713 deletions(-) delete mode 100644 windows/.DS_Store create mode 100644 windows/README.md create mode 100644 windows/connection_tracker/README.md create mode 100644 windows/connection_tracker/bpf/bpf.log create mode 100644 windows/connection_tracker/bpf/bpf.vcxproj rename windows/{xdpdrop/xdpdrop.filters => connection_tracker/bpf/bpf.vcxproj.filters} (87%) rename windows/{conntrack/conn_track/conn_track.vcxproj.user => connection_tracker/bpf/bpf.vcxproj.user} (100%) rename windows/{conntrack/conn_ebpf.c => connection_tracker/bpf/conn_track.c} (70%) create mode 100644 windows/connection_tracker/bpf/packages.config rename windows/{conntrack/conn_track => connection_tracker}/conn_track.sln (55%) rename windows/{conntrack => connection_tracker}/conn_track/conn_track.vcxproj (88%) rename windows/{conntrack => connection_tracker}/conn_track/conn_track.vcxproj.filters (97%) rename windows/{xdpdrop/xdpdrop.user => connection_tracker/conn_track/conn_track.vcxproj.user} (100%) rename windows/{conntrack => connection_tracker}/conn_track/conn_tracker.cpp (88%) rename windows/{conntrack => connection_tracker}/conn_track/conn_tracker.h (94%) create mode 100644 windows/connection_tracker/conn_track/packages.config delete mode 100644 windows/conntrack/conn_track/.DS_Store delete mode 100644 windows/conntrack/conn_track/packages.config create mode 100644 windows/hello/README.md delete mode 100644 windows/hello/out/.DS_Store delete mode 100644 windows/hello/out/bpf.cer delete mode 100644 windows/hello/out/bpf.sys delete mode 100644 windows/hello/out/bpf.vcxproj delete mode 100644 windows/hello/out/bpf_driver.c delete mode 100644 windows/hello/out/bpf_km/bpf.sys delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/.signature.p7s delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/README.md delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/bin/Convert-BpfToNative.ps1 delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/ebpf-for-windows.props delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/errno.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/posix_types.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/types.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/bpf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/bpf_legacy.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/hashmap.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/libbpf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/libbpf_legacy.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf2c.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_endian.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helper_defs.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helpers.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helpers_platform.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_api.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_base.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_core_structs.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_execution_type.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_extension_uuids.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_nethooks.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_program_attach_type_guids.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_program_types.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_result.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_store_helper.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_structs.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_utilities.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_windows.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/elfio_wrapper.hpp delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/git_commit_id.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/kernel/ebpf_registry_helper.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/asm/barrier.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/compiler.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/err.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/filter.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/kernel.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/list.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/overflow.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/ring_buffer.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/types.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/bpf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/bpf_common.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/btf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/if_link.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/if_xdp.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/netlink.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/perf_event.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/pkt_cls.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/pkt_sched.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_core_read.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_endian.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_gen_internal.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_helper_defs.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_helpers.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_tracing.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/btf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/hashmap.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_common.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_internal.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_legacy.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_version.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/nlattr.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/relo_core.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/skel_internal.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/str_error.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/strset.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/usdt.bpf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/linux/bpf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/linux/stddef.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/if_ether.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/ip.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/tcp.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/udp.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/bpf.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/if_ether.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/in.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/ip.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/tcp.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/build/native/include/user/ebpf_registry_helper.h delete mode 100644 windows/packages/eBPF-for-Windows.0.3.0/eBPF-for-Windows.0.3.0.nupkg create mode 100644 windows/xdpdrop/README.md delete mode 100644 windows/xdpdrop/drop-win.c delete mode 100644 windows/xdpdrop/drop1.c delete mode 100644 windows/xdpdrop/packages.config delete mode 100644 windows/xdpdrop/xdpdrop.sln delete mode 100644 windows/xdpdrop/xdpdrop.vcxproj delete mode 100644 windows/xdpdrop/xdpdrop.vcxproj.user delete mode 100644 windows/xdpdrop/xdpdrop_user.cpp diff --git a/.gitignore b/.gitignore index 1529e27..4502457 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,6 @@ dkms.conf # Rust target + +# Other +.DS_Store \ No newline at end of file diff --git a/libbpf b/libbpf index fbd60db..1728e3e 160000 --- a/libbpf +++ b/libbpf @@ -1 +1 @@ -Subproject commit fbd60dbff51c870f5e80a17c4f2fd639eb80af90 +Subproject commit 1728e3e4bef0e138ea95ffe62163eb9a6ac6fa32 diff --git a/windows/.DS_Store b/windows/.DS_Store deleted file mode 100644 index a80807edab206aa74e94d416d9e05eeb740bc7c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKu};H441EU?6j&-I#+#8Kv_fKys{Xrks+Q;6SzJXngIpd6PEtxMi(06mjWrtrf z{Kk(+#XdLN-EziecOk>>O#TxCJhMew2NBI01IB-I0LvgW`7)zaAFz1bY`bF6c=Xa`+XP=mqj#d z3>X8e3~a~8ww(W$-{1dNi|ol5Fb4h<11{+g`aOPb_Ou8tT=X!JM^ ejvU2D)F8}xafq2>9gz`={SgQ>m@x)6%D@|4vT C:\Users\aaz\connection_tracker\x64\Debug\conn_track.sys + Project "C:\Users\aaz\connection_tracker\x64\Debug\conn_track_km\conn_track.vcxproj" (1) is building "C:\Users\aaz\connection_tracker\x64\Debug\conn_track_km\conn_track.vcxproj" (1:2) on node 1 (TestSign target(s)). + TestSign: + The driver will be test-signed. Driver signing options can be changed from the project properties. + Sign Inputs: C:\Users\aaz\connection_tracker\x64\Debug\conn_track.sys + C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x86\signtool.exe sign /ph /fd "SHA256" /sha1 "15D232012D145C6B3CDE8715C099A372A74A7956" + Done Adding Additional Store + Successfully signed: C:\Users\aaz\connection_tracker\x64\Debug\conn_track.sys + + Certificate used for signing: issued to = WDKTestCert aaz,133430227648180584 and thumbprint = 15D232012D145C6B3CDE8715C099A372A74A7956 + Exported Certificate: C:\Users\aaz\connection_tracker\x64\Debug\conn_track.cer + Done Building Project "C:\Users\aaz\connection_tracker\x64\Debug\conn_track_km\conn_track.vcxproj" (TestSign target(s)). + DriverPackageTarget: + Packaging up the following projects for the following configurations: + + Configuration='' Platform='' + + + The following files will be packaged: + + File to package: C:\Users\aaz\connection_tracker\x64\Debug\conn_track.sys. + Location in Package: \conn_track.sys. + Requested by project: + + + Copying file from "C:\Users\aaz\connection_tracker\x64\Debug\conn_track.sys" to "C:\Users\aaz\connection_tracker\x64\Debug\conn_track_km\conn_track.sys". + Inf2Cat: + Inf2Cat task was skipped as there were no inf files to process + + Project "C:\Users\aaz\connection_tracker\x64\Debug\conn_track_km\conn_track.vcxproj" (1) is building "C:\Users\aaz\connection_tracker\x64\Debug\conn_track_km\conn_track.vcxproj" (1:3) on node 1 (TestSign target(s)). + TestSign: + The driver package will be test-signed. Driver signing options can be changed from the project properties. + No files to sign, skipping SignTask. + Done Building Project "C:\Users\aaz\connection_tracker\x64\Debug\conn_track_km\conn_track.vcxproj" (TestSign target(s)). + FinalizeBuildStatus: + Deleting file "x64\Debug\conn_track_km.tlog\unsuccessfulbuild". + Touching "x64\Debug\conn_track_km.tlog\conn_track_km.lastbuildstate". + Done Building Project "C:\Users\aaz\connection_tracker\x64\Debug\conn_track_km\conn_track.vcxproj" (default targets). + + Build succeeded. + 0 Warning(s) + 0 Error(s) + + Time Elapsed 00:00:02.20 + + diff --git a/windows/connection_tracker/bpf/bpf.vcxproj b/windows/connection_tracker/bpf/bpf.vcxproj new file mode 100644 index 0000000..4c6a3e4 --- /dev/null +++ b/windows/connection_tracker/bpf/bpf.vcxproj @@ -0,0 +1,64 @@ + + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {35EE4580-FE14-45AD-9015-153384E3DF73} + 10.0 + + + + stdcpp20 + + + + + stdc17 + + + + + CppCode + $(OutDir)conn_track.sys + + clang -g -target bpf -O2 -Werror $(ClangIncludes) -c %(Filename).c -o $(OutDir)%(Filename).o + pushd $(OutDir) + powershell -NonInteractive -ExecutionPolicy Unrestricted $(EbpfBinPath)\Convert-BpfToNative.ps1 -FileName %(Filename) -IncludeDir $(EbpfIncludePath) -Platform $(Platform) -Configuration $(Configuration) -KernelMode $true + popd + + + + + + + + Utility + v143 + Unicode + + + + + + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}. + + + + \ No newline at end of file diff --git a/windows/xdpdrop/xdpdrop.filters b/windows/connection_tracker/bpf/bpf.vcxproj.filters similarity index 87% rename from windows/xdpdrop/xdpdrop.filters rename to windows/connection_tracker/bpf/bpf.vcxproj.filters index e0e36d8..dc783a7 100644 --- a/windows/xdpdrop/xdpdrop.filters +++ b/windows/connection_tracker/bpf/bpf.vcxproj.filters @@ -1,29 +1,25 @@ - - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + \ No newline at end of file diff --git a/windows/conntrack/conn_track/conn_track.vcxproj.user b/windows/connection_tracker/bpf/bpf.vcxproj.user similarity index 100% rename from windows/conntrack/conn_track/conn_track.vcxproj.user rename to windows/connection_tracker/bpf/bpf.vcxproj.user diff --git a/windows/conntrack/conn_ebpf.c b/windows/connection_tracker/bpf/conn_track.c similarity index 70% rename from windows/conntrack/conn_ebpf.c rename to windows/connection_tracker/bpf/conn_track.c index 9b0f337..b877172 100644 --- a/windows/conntrack/conn_ebpf.c +++ b/windows/connection_tracker/bpf/conn_track.c @@ -1,140 +1,127 @@ -#include -#include -#include -#include "conn_track/conn_tracker.h" - -inline __attribute__((always_inline)) uint64_t -bpf_ntohll(uint64_t x) -{ - uint64_t upper = bpf_ntohl(x >> 32); - uint64_t lower = (uint64_t)bpf_ntohl(x & 0xFFFFFFFF) << 32; - return upper | lower; -} - -#define bpf_htonll(x) bpf_ntohll(x) - -#ifndef ntohll -#define ntohll bpf_ntohll -#endif -#ifndef htonll -#define htonll bpf_htonll -#endif - -// Key is the connection tuple, value is the connection start time. -SEC("maps") -struct bpf_map_def connection_map = { - .type = BPF_MAP_TYPE_LRU_HASH, - .key_size = sizeof(connection_tuple_t), - .value_size = sizeof(uint64_t), - .max_entries = 1024}; - -// Connection history map containing tuple and connection duration. -SEC("maps") -struct bpf_map_def history_map = {.type = BPF_MAP_TYPE_RINGBUF, .max_entries = 256 * 1024}; - -__attribute__((always_inline)) void -log_tuple(connection_tuple_t *tuple, bool ipv4, bool connect) -{ - if (ipv4) - { - if (connect) - { - bpf_printk("Connnection to %x:%d started on if %ld", ntohl(tuple->dst_ip.ipv4), ntohs(tuple->dst_port), tuple->interface_luid); - } - else - { - bpf_printk("Connnection to %x:%d stopped on if %ld", ntohl(tuple->dst_ip.ipv4), ntohs(tuple->dst_port), tuple->interface_luid); - } - } - else - { - uint64_t *ip = (uint64_t *)tuple->dst_ip.ipv6; - if (connect) - { - bpf_printk("Connnection to %llx %llx started on if %ld", ntohll(ip[0]), ntohll(ip[1]), tuple->interface_luid); - } - else - { - bpf_printk("Connnection to %llx %llx stopped on if %ld", ntohll(ip[0]), ntohll(ip[1]), tuple->interface_luid); - } - } -} - -__attribute__((always_inline)) void -sock_ops_to_connection_tuple(bpf_sock_ops_t *ctx, bool is_ipv4, connection_tuple_t *tuple) -{ - tuple->compartment_id = ctx->compartment_id; - tuple->interface_luid = ctx->interface_luid; - tuple->src_port = ctx->local_port; - tuple->dst_port = ctx->remote_port; - tuple->protocol = ctx->protocol; - - if (is_ipv4) - { - tuple->src_ip.ipv4 = ctx->local_ip4; - tuple->dst_ip.ipv4 = ctx->remote_ip4; - } - else - { - void *ip6 = NULL; - ip6 = ctx->local_ip6; - __builtin_memcpy(tuple->src_ip.ipv6, ip6, sizeof(tuple->src_ip.ipv6)); - ip6 = ctx->remote_ip6; - __builtin_memcpy(tuple->dst_ip.ipv6, ip6, sizeof(tuple->dst_ip.ipv6)); - } -} - -__attribute__((always_inline)) void -handle_connection(bpf_sock_ops_t *ctx, bool is_ipv4, bool connected) -{ - connection_tuple_t key = {0}; - sock_ops_to_connection_tuple(ctx, is_ipv4, &key); - uint64_t now = bpf_ktime_get_ns(); - - if (connected) - { - log_tuple(&key, is_ipv4, true); - bpf_map_update_elem(&connection_map, &key, &now, 0); - } - else - { - uint64_t *start_time = (uint64_t *)bpf_map_lookup_and_delete_elem(&connection_map, &key); - if (start_time) - { - log_tuple(&key, is_ipv4, false); - connection_history_t history; - // Memset is required due to padding within this struct. - __builtin_memset(&history, 0, sizeof(history)); - history.tuple = key; - history.is_ipv4 = is_ipv4; - history.start_time = *start_time; - history.end_time = now; - bpf_ringbuf_output(&history_map, &history, sizeof(history), 0); - } - } -} - -SEC("sockops") -int connection_tracker(bpf_sock_ops_t *ctx) -{ - int result = 0; - bool connected; - switch (ctx->op) - { - case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: - connected = true; - break; - case BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: - connected = true; - break; - case BPF_SOCK_OPS_CONNECTION_DELETED_CB: - connected = false; - break; - default: - result = -1; - } - if (result == 0) - handle_connection(ctx, (ctx->family == AF_INET), connected); - - return 0; -} +// Copyright (c) Microsoft Corporation +// SPDX-License-Identifier: MIT + +#include "bpf_endian.h" +#include "bpf_helpers.h" +#include "net/ip.h" +#include "..\conn_track\conn_tracker.h" + +inline __attribute__((always_inline)) uint64_t +bpf_ntohll(uint64_t x) +{ + uint64_t upper = bpf_ntohl(x >> 32); + uint64_t lower = (uint64_t)bpf_ntohl(x & 0xFFFFFFFF) << 32; + return upper | lower; +} + +#define bpf_htonll(x) bpf_ntohll(x) + +#ifndef ntohll +#define ntohll bpf_ntohll +#endif +#ifndef htonll +#define htonll bpf_htonll +#endif + +// Key is the connection tuple, value is the connection start time. +SEC("maps") +struct bpf_map_def connection_map = { + .type = BPF_MAP_TYPE_LRU_HASH, + .key_size = sizeof(connection_tuple_t), + .value_size = sizeof(uint64_t), + .max_entries = 1024}; + +// Connection history map containing tuple and connection duration. +SEC("maps") +struct bpf_map_def history_map = {.type = BPF_MAP_TYPE_RINGBUF, .max_entries = 256 * 1024}; + +__attribute__((always_inline)) void +log_tuple(connection_tuple_t* tuple, bool ipv4, bool connect) +{ + if (ipv4) { + if (connect) { + bpf_printk("Connnection to %x started on if %ld", ntohl(tuple->dst_ip.ipv4), tuple->interface_luid); + } else { + bpf_printk("Connnection to %x stopped on if %ld", ntohl(tuple->dst_ip.ipv4), tuple->interface_luid); + } + } else { + uint64_t* ip = (uint64_t*)tuple->dst_ip.ipv6; + if (connect) { + bpf_printk("Connnection to %llx %llx started on if %ld", ntohll(ip[0]), ntohll(ip[1]), tuple->interface_luid); + } else { + bpf_printk("Connnection to %llx %llx stopped on if %ld", ntohll(ip[0]), ntohll(ip[1]), tuple->interface_luid); + } + } +} + +__attribute__((always_inline)) void +sock_ops_to_connection_tuple(bpf_sock_ops_t* ctx, bool is_ipv4, connection_tuple_t* tuple) +{ + tuple->compartment_id = ctx->compartment_id; + tuple->interface_luid = ctx->interface_luid; + tuple->src_port = ctx->local_port; + tuple->dst_port = ctx->remote_port; + tuple->protocol = ctx->protocol; + + if (is_ipv4) { + tuple->src_ip.ipv4 = ctx->local_ip4; + tuple->dst_ip.ipv4 = ctx->remote_ip4; + } else { + void* ip6 = NULL; + ip6 = ctx->local_ip6; + __builtin_memcpy(tuple->src_ip.ipv6, ip6, sizeof(tuple->src_ip.ipv6)); + ip6 = ctx->remote_ip6; + __builtin_memcpy(tuple->dst_ip.ipv6, ip6, sizeof(tuple->dst_ip.ipv6)); + } +} + +__attribute__((always_inline)) void +handle_connection(bpf_sock_ops_t* ctx, bool is_ipv4, bool connected) +{ + connection_tuple_t key = {0}; + sock_ops_to_connection_tuple(ctx, is_ipv4, &key); + uint64_t now = bpf_ktime_get_ns(); + + if (connected) { + log_tuple(&key, is_ipv4, true); + bpf_map_update_elem(&connection_map, &key, &now, 0); + } else { + uint64_t* start_time = (uint64_t*)bpf_map_lookup_and_delete_elem(&connection_map, &key); + if (start_time) { + log_tuple(&key, is_ipv4, false); + connection_history_t history; + // Memset is required due to padding within this struct. + __builtin_memset(&history, 0, sizeof(history)); + history.tuple = key; + history.is_ipv4 = is_ipv4; + history.start_time = *start_time; + history.end_time = now; + bpf_ringbuf_output(&history_map, &history, sizeof(history), 0); + } + } +} + +SEC("sockops") +int +connection_tracker(bpf_sock_ops_t* ctx) +{ + int result = 0; + bool connected; + switch (ctx->op) { + case BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: + connected = true; + break; + case BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: + connected = true; + break; + case BPF_SOCK_OPS_CONNECTION_DELETED_CB: + connected = false; + break; + default: + result = -1; + } + if (result == 0) + handle_connection(ctx, (ctx->family == AF_INET), connected); + + return 0; +} diff --git a/windows/connection_tracker/bpf/packages.config b/windows/connection_tracker/bpf/packages.config new file mode 100644 index 0000000..c2bbbbe --- /dev/null +++ b/windows/connection_tracker/bpf/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/windows/conntrack/conn_track/conn_track.sln b/windows/connection_tracker/conn_track.sln similarity index 55% rename from windows/conntrack/conn_track/conn_track.sln rename to windows/connection_tracker/conn_track.sln index 93f0cb3..201d1e6 100644 --- a/windows/conntrack/conn_track/conn_track.sln +++ b/windows/connection_tracker/conn_track.sln @@ -1,9 +1,11 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.32630.194 +# Visual Studio Version 17 +VisualStudioVersion = 17.7.34221.43 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "conn_tracker", "conn_track.vcxproj", "{D293D511-3498-414C-AC48-4097B9D92759}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "conn_tracker", "conn_track\conn_track.vcxproj", "{D293D511-3498-414C-AC48-4097B9D92759}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "bpf", "bpf\bpf.vcxproj", "{35EE4580-FE14-45AD-9015-153384E3DF73}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,11 +23,19 @@ Global {D293D511-3498-414C-AC48-4097B9D92759}.Release|x64.Build.0 = Release|x64 {D293D511-3498-414C-AC48-4097B9D92759}.Release|x86.ActiveCfg = Release|Win32 {D293D511-3498-414C-AC48-4097B9D92759}.Release|x86.Build.0 = Release|Win32 + {35EE4580-FE14-45AD-9015-153384E3DF73}.Debug|x64.ActiveCfg = Debug|x64 + {35EE4580-FE14-45AD-9015-153384E3DF73}.Debug|x64.Build.0 = Debug|x64 + {35EE4580-FE14-45AD-9015-153384E3DF73}.Debug|x86.ActiveCfg = Debug|Win32 + {35EE4580-FE14-45AD-9015-153384E3DF73}.Debug|x86.Build.0 = Debug|Win32 + {35EE4580-FE14-45AD-9015-153384E3DF73}.Release|x64.ActiveCfg = Release|x64 + {35EE4580-FE14-45AD-9015-153384E3DF73}.Release|x64.Build.0 = Release|x64 + {35EE4580-FE14-45AD-9015-153384E3DF73}.Release|x86.ActiveCfg = Release|Win32 + {35EE4580-FE14-45AD-9015-153384E3DF73}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {C49B54D2-1DB5-496E-B984-4FBCF0043C96} + SolutionGuid = {BB9F9C41-79F0-4965-BC7F-E353616B8A17} EndGlobalSection EndGlobal diff --git a/windows/conntrack/conn_track/conn_track.vcxproj b/windows/connection_tracker/conn_track/conn_track.vcxproj similarity index 88% rename from windows/conntrack/conn_track/conn_track.vcxproj rename to windows/connection_tracker/conn_track/conn_track.vcxproj index 0ca007f..8e29eef 100644 --- a/windows/conntrack/conn_track/conn_track.vcxproj +++ b/windows/connection_tracker/conn_track/conn_track.vcxproj @@ -4,7 +4,7 @@ SPDX-License-Identifier: MIT --> - + Debug @@ -35,26 +35,26 @@ Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode Application true - v142 + v143 Unicode Application false - v142 + v143 true Unicode @@ -120,6 +120,7 @@ stdcpp20 Level4 true + stdc17 Console @@ -155,8 +156,8 @@ - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}. - + \ No newline at end of file diff --git a/windows/conntrack/conn_track/conn_track.vcxproj.filters b/windows/connection_tracker/conn_track/conn_track.vcxproj.filters similarity index 97% rename from windows/conntrack/conn_track/conn_track.vcxproj.filters rename to windows/connection_tracker/conn_track/conn_track.vcxproj.filters index 14eda85..3cc01cb 100644 --- a/windows/conntrack/conn_track/conn_track.vcxproj.filters +++ b/windows/connection_tracker/conn_track/conn_track.vcxproj.filters @@ -1,34 +1,34 @@ - + - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - - - Header Files - - - - - +--> + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + Header Files + + + + + \ No newline at end of file diff --git a/windows/xdpdrop/xdpdrop.user b/windows/connection_tracker/conn_track/conn_track.vcxproj.user similarity index 100% rename from windows/xdpdrop/xdpdrop.user rename to windows/connection_tracker/conn_track/conn_track.vcxproj.user diff --git a/windows/conntrack/conn_track/conn_tracker.cpp b/windows/connection_tracker/conn_track/conn_tracker.cpp similarity index 88% rename from windows/conntrack/conn_track/conn_tracker.cpp rename to windows/connection_tracker/conn_track/conn_tracker.cpp index 22a6e08..c5be8e9 100644 --- a/windows/conntrack/conn_track/conn_tracker.cpp +++ b/windows/connection_tracker/conn_track/conn_tracker.cpp @@ -1,190 +1,191 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -// Windows.h needs to be the first include to prevent failures in subsequent headers. -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "conn_tracker.h" - -#pragma comment(lib, "ebpfapi.lib") -#pragma comment(lib, "Iphlpapi.lib") -#pragma comment(lib, "ntdll.lib") -#pragma comment(lib, "ws2_32.lib") - -std::unordered_map _protocol = {{6, "TCP"}, {17, "UDP"}}; - -std::string interface_luid_to_name(uint64_t luid) -{ - std::string name(IF_MAX_STRING_SIZE + 1, ' '); - NET_LUID net_luid; - net_luid.Value = luid; - if (ConvertInterfaceLuidToNameA(&net_luid, name.data(), name.size()) != 0) { - name = "unknown"; - } - name = name.substr(0, name.find_first_of(' ')); - return name; -} - - -std::string -trim(const std::string& str) -{ - auto start = str.find_first_not_of(' '); - if (start == std::string::npos) - return ""; - auto end = str.find_first_of(' ', start); - if (end == std::string::npos) - return str.substr(start); - else { - return str.substr(start, end - start); - } -} - -#define MAX_IPV4_ADDRESS_LENGTH 16 -#define MAX_IPV6_ADDRESS_LENGTH 46 - -std::string ip_address_to_string(bool ipv4, const ip_address_t& ip_address, uint64_t interface_luid) -{ - std::string buffer; - if (ipv4) { - buffer.resize(MAX_IPV4_ADDRESS_LENGTH); - in_addr addr; - addr.S_un.S_addr = ip_address.ipv4; - auto end = RtlIpv4AddressToStringA(&addr, buffer.data()); - buffer.resize(end - buffer.data()); - } else { - buffer.resize(MAX_IPV6_ADDRESS_LENGTH); - in_addr6 addr; - memcpy(addr.u.Byte, ip_address.ipv6, sizeof(ip_address.ipv6)); - auto end = RtlIpv6AddressToStringA(&addr, buffer.data()); - buffer.resize(end - buffer.data()); - - } - buffer += "%" + interface_luid_to_name(interface_luid); - - return "[" + trim(buffer) + "]"; -} - -extern "C" -{ - int - conn_track_history_callback(void* ctx, void* data, size_t size); -} - -int -conn_track_history_callback(void* ctx, void* data, size_t size) -{ - UNREFERENCED_PARAMETER(ctx); - - if (size == sizeof(connection_history_t)) { - auto history = reinterpret_cast(data); - auto source = ip_address_to_string(history->is_ipv4, history->tuple.src_ip, history->tuple.interface_luid) + ":" + - std::to_string(htons(history->tuple.src_port)); - auto dest = ip_address_to_string(history->is_ipv4, history->tuple.dst_ip, history->tuple.interface_luid) + ":" + - std::to_string(htons(history->tuple.dst_port)); - double duration = static_cast(history->end_time); - duration -= static_cast(history->start_time); - duration /= 1e9; - std::cout << source << " -> " << dest << "\t" << _protocol[history->tuple.protocol] << "\t" << duration - << std::endl; - } - return 0; -} - -bool _shutdown = false; -std::condition_variable _wait_for_shutdown; -std::mutex _wait_for_shutdown_mutex; - -int -control_handler(unsigned long control_type) -{ - if (control_type != CTRL_C_EVENT) { - return false; - } - std::unique_lock lock(_wait_for_shutdown_mutex); - _shutdown = true; - _wait_for_shutdown.notify_all(); - return true; -} - -int -main(int argc, char** argv) -{ - UNREFERENCED_PARAMETER(argc); - UNREFERENCED_PARAMETER(argv); - if (!SetConsoleCtrlHandler(control_handler, true)) { - std::cerr << "SetConsoleCtrlHandler: " << GetLastError() << std::endl; - return 1; - } - - std::cerr << "Press Ctrl-C to shutdown" << std::endl; - - // Load eBPF program. - struct bpf_object* object = bpf_object__open("../conn_ebpf.o"); - if (!object) { - std::cerr << "bpf_object__open for conn_ebpf.o failed: " << errno << std::endl; - return 1; - } - - if (bpf_object__load(object) < 0) { - std::cerr << "bpf_object__load for conn_ebpf.o failed: " << errno << std::endl; - return 1; - } - - // Attach program to sock_ops attach point. - auto program = bpf_object__find_program_by_name(object, "connection_tracker"); - if (!program) { - std::cerr << "bpf_object__find_program_by_name for \"connection_tracker\" failed: " << errno << std::endl; - return 1; - } - - auto link = bpf_program__attach(program); - if (!link) { - std::cerr << "BPF program conn_track.sys failed to attach: " << errno << std::endl; - return 1; - } - - // Attach to ring buffer. - bpf_map* map = bpf_object__find_map_by_name(object, "history_map"); - if (!map) { - std::cerr << "Unable to locate history map: " << errno << std::endl; - return 1; - } - auto ring = ring_buffer__new(bpf_map__fd(map), conn_track_history_callback, nullptr, nullptr); - if (!ring) { - std::cerr << "Unable to create ring buffer: " << errno << std::endl; - return 1; - } - - // Wait for Ctrl-C. - { - std::unique_lock lock(_wait_for_shutdown_mutex); - _wait_for_shutdown.wait(lock, []() { return _shutdown; }); - } - - // Detach from the attach point. - int link_fd = bpf_link__fd(link); - bpf_link_detach(link_fd); - bpf_link__destroy(link); - - // Close ring buffer. - ring_buffer__free(ring); - - // Free the BPF object. - bpf_object__close(object); - return 0; -} +// Copyright (c) Microsoft Corporation +// SPDX-License-Identifier: MIT + +// Windows.h needs to be the first include to prevent failures in subsequent headers. +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "conn_tracker.h" + +#pragma comment(lib, "ebpfapi.lib") +#pragma comment(lib, "Iphlpapi.lib") +#pragma comment(lib, "ntdll.lib") +#pragma comment(lib, "ws2_32.lib") + +std::unordered_map _protocol = {{6, "TCP"}, {17, "UDP"}}; + +std::string interface_luid_to_name(uint64_t luid) +{ + std::string name(IF_MAX_STRING_SIZE + 1, ' '); + NET_LUID net_luid; + net_luid.Value = luid; + if (ConvertInterfaceLuidToNameA(&net_luid, name.data(), name.size()) != 0) { + name = "unknown"; + } + name = name.substr(0, name.find_first_of(' ')); + return name; +} + + +std::string +trim(const std::string& str) +{ + auto start = str.find_first_not_of(' '); + if (start == std::string::npos) + return ""; + auto end = str.find_first_of(' ', start); + if (end == std::string::npos) + return str.substr(start); + else { + return str.substr(start, end - start); + } +} + +#define MAX_IPV4_ADDRESS_LENGTH 16 +#define MAX_IPV6_ADDRESS_LENGTH 46 + +std::string +ip_address_to_string(bool ipv4, const ip_address_t& ip_address, const uint64_t interface_luid) +{ + std::string buffer; + if (ipv4) { + buffer.resize(MAX_IPV4_ADDRESS_LENGTH); + in_addr addr; + addr.S_un.S_addr = ip_address.ipv4; + auto end = RtlIpv4AddressToStringA(&addr, buffer.data()); + buffer.resize(end - buffer.data()); + } else { + buffer.resize(MAX_IPV6_ADDRESS_LENGTH); + in_addr6 addr; + memcpy(addr.u.Byte, ip_address.ipv6, sizeof(ip_address.ipv6)); + auto end = RtlIpv6AddressToStringA(&addr, buffer.data()); + buffer.resize(end - buffer.data()); + + } + buffer += "%" + interface_luid_to_name(interface_luid); + + return "[" + trim(buffer) + "]"; +} + +extern "C" +{ + int + conn_track_history_callback(void* ctx, void* data, size_t size); +} + +int +conn_track_history_callback(void* ctx, void* data, size_t size) +{ + UNREFERENCED_PARAMETER(ctx); + + if (size == sizeof(connection_history_t)) { + auto history = reinterpret_cast(data); + auto source = ip_address_to_string(history->is_ipv4, history->tuple.src_ip, history->tuple.interface_luid) + ":" + + std::to_string(htons(history->tuple.src_port)); + auto dest = ip_address_to_string(history->is_ipv4, history->tuple.dst_ip, history->tuple.interface_luid) + ":" + + std::to_string(htons(history->tuple.dst_port)); + double duration = static_cast(history->end_time); + duration -= static_cast(history->start_time); + duration /= 1e9; + std::cout << source << "==>" << dest << "\t" << _protocol[history->tuple.protocol] << "\t" << duration + << std::endl; + } + return 0; +} + +bool _shutdown = false; +std::condition_variable _wait_for_shutdown; +std::mutex _wait_for_shutdown_mutex; + +int +control_handler(unsigned long control_type) +{ + if (control_type != CTRL_C_EVENT) { + return false; + } + std::unique_lock lock(_wait_for_shutdown_mutex); + _shutdown = true; + _wait_for_shutdown.notify_all(); + return true; +} + +int +main(int argc, char** argv) +{ + UNREFERENCED_PARAMETER(argc); + UNREFERENCED_PARAMETER(argv); + if (!SetConsoleCtrlHandler(control_handler, true)) { + std::cerr << "SetConsoleCtrlHandler: " << GetLastError() << std::endl; + return 1; + } + + std::cerr << "Press Ctrl-C to shutdown" << std::endl; + + // Load conn_track.sys BPF program. + struct bpf_object* object = bpf_object__open("conn_track.o"); + if (!object) { + std::cerr << "bpf_object__open for conn_track.sys failed: " << errno << std::endl; + return 1; + } + + if (bpf_object__load(object) < 0) { + std::cerr << "bpf_object__load for conn_track.sys failed: " << errno << std::endl; + return 1; + } + + // Attach program to sock_ops attach point. + auto program = bpf_object__find_program_by_name(object, "connection_tracker"); + if (!program) { + std::cerr << "bpf_object__find_program_by_name for \"connection_tracker\" failed: " << errno << std::endl; + return 1; + } + + auto link = bpf_program__attach(program); + if (!link) { + std::cerr << "BPF program conn_track.sys failed to attach: " << errno << std::endl; + return 1; + } + + // Attach to ring buffer. + bpf_map* map = bpf_object__find_map_by_name(object, "history_map"); + if (!map) { + std::cerr << "Unable to locate history map: " << errno << std::endl; + return 1; + } + auto ring = ring_buffer__new(bpf_map__fd(map), conn_track_history_callback, nullptr, nullptr); + if (!ring) { + std::cerr << "Unable to create ring buffer: " << errno << std::endl; + return 1; + } + + // Wait for Ctrl-C. + { + std::unique_lock lock(_wait_for_shutdown_mutex); + _wait_for_shutdown.wait(lock, []() { return _shutdown; }); + } + + // Detach from the attach point. + int link_fd = bpf_link__fd(link); + bpf_link_detach(link_fd); + bpf_link__destroy(link); + + // Close ring buffer. + ring_buffer__free(ring); + + // Free the BPF object. + bpf_object__close(object); + return 0; +} diff --git a/windows/conntrack/conn_track/conn_tracker.h b/windows/connection_tracker/conn_track/conn_tracker.h similarity index 94% rename from windows/conntrack/conn_track/conn_tracker.h rename to windows/connection_tracker/conn_track/conn_tracker.h index 1a11fd8..226cf95 100644 --- a/windows/conntrack/conn_track/conn_tracker.h +++ b/windows/connection_tracker/conn_track/conn_tracker.h @@ -1,33 +1,33 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -#include "net/ip.h" - -typedef struct _ip_address -{ - union - { - uint32_t ipv4; - ipv6_address_t ipv6; - }; -} ip_address_t; - -typedef struct _connection_tuple -{ - ip_address_t src_ip; - uint16_t src_port; - ip_address_t dst_ip; - uint16_t dst_port; - uint32_t protocol; - uint32_t compartment_id; - uint64_t interface_luid; -} connection_tuple_t; - -typedef struct _connection_history -{ - connection_tuple_t tuple; - bool is_ipv4; - uint64_t start_time; - uint64_t end_time; -} connection_history_t; +// Copyright (c) Microsoft Corporation +// SPDX-License-Identifier: MIT +#pragma once + +#include "net/ip.h" + +typedef struct _ip_address +{ + union + { + uint32_t ipv4; + ipv6_address_t ipv6; + }; +} ip_address_t; + +typedef struct _connection_tuple +{ + ip_address_t src_ip; + uint16_t src_port; + ip_address_t dst_ip; + uint16_t dst_port; + uint32_t protocol; + uint32_t compartment_id; + uint64_t interface_luid; +} connection_tuple_t; + +typedef struct _connection_history +{ + connection_tuple_t tuple; + bool is_ipv4; + uint64_t start_time; + uint64_t end_time; +} connection_history_t; diff --git a/windows/connection_tracker/conn_track/packages.config b/windows/connection_tracker/conn_track/packages.config new file mode 100644 index 0000000..c2bbbbe --- /dev/null +++ b/windows/connection_tracker/conn_track/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/windows/conntrack/conn_track/.DS_Store b/windows/conntrack/conn_track/.DS_Store deleted file mode 100644 index dd9c7eb6b82e52e7e1ca21528a28210bfdad9ef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!A`?441IweDskD7V}1Ztd;!%|ZWEUYuCR@5LW6BuTOn@!be`=nRIO)JA$y9S zTjz0$gw-j@P!IB_w|7sPuSxf4Q=j|{gOE~TaHKeS2(J7P3w);mbp1TY431D--0Wx z=~;4?9e*|BZRKCzbI03X-9xJGtnwjJ>@_(9&VV!E3=E6`-q|AAm7!~Az!`7`P7KKT z5ZMHagsq_-9aQ=RAdcu(p)GF-$%zSzgsmY*D8W*RmKxF%BUn29F~t=LTSH4n(3Lq) zTKVVk5_EO?qlP0ChOV6fXQ0c#rFF-0|KIa3)BDKprg+a8a0dPv17TFo$_Y1>?$)#I y$z2=SUf4t=t`&nqyYmsij+`UcI%wljY{nG{TSJ*e{F+Ym4*?~_l{4@M415E74mMZ- diff --git a/windows/conntrack/conn_track/packages.config b/windows/conntrack/conn_track/packages.config deleted file mode 100644 index a802d15..0000000 --- a/windows/conntrack/conn_track/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/windows/hello/.DS_Store b/windows/hello/.DS_Store index da487f084c0bf69aba2080327b43351f88123641..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 100644 GIT binary patch delta 70 zcmZoMXfc=|#>AjHu~2NHo+1YW5HK<@2y9-+n8vnw1EUw?W_AvK4xj>{$am(+{342+ UKzW7)kiy9(Jj$D6L{=~Z04H+~3jhEB delta 228 zcmYk1Jr06E6ody*Lqeg6E43Uz!8=%37#pMgl0YPa5Po8;Y&d{~Ls%19?`7*iD9kqB z%)HH;S30HhGF3&dq*<-4g$h6cW^ngKmZww>j+J~ryFf#X0(p}Ehj<`E4i6D*oH-G4 zCZf)$w~)*v=|t@z?OmS~kgoh|<4(R|MbAY7pU#CG^2Ov~tLWDrhE79~Mh27G5u?`7 Y4V^bM@~hQTVU4@8%X%Z`?M{5O9|!+0SpWb4 diff --git a/windows/hello/README.md b/windows/hello/README.md new file mode 100644 index 0000000..30ca731 --- /dev/null +++ b/windows/hello/README.md @@ -0,0 +1,9 @@ +# Windows eBPF Hello World + +```powershell +# Build +clang -I 'C:\ebpf-for-windows\include' -target bpf -Werror -O2 -g -c bpf.c -o bpf.o + +# Load +netsh ebpf add program bpf.o +``` diff --git a/windows/hello/bpf.c b/windows/hello/bpf.c index 0b4699a..887d446 100644 --- a/windows/hello/bpf.c +++ b/windows/hello/bpf.c @@ -1,7 +1,7 @@ #include "bpf_helpers.h" SEC("bind") -int func(bind_md_t *ctx) +int hello(bind_md_t *ctx) { bpf_printk("Hello, world!"); return 0; diff --git a/windows/hello/out/.DS_Store b/windows/hello/out/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 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 g^5gh9AHJDEZ9c6%`?hat@?fn-(7jf Debug Win32 Release Win32 Debug x64 Release x64 Debug ARM Release ARM Debug ARM64 Release ARM64 {172DFDF9-3B0D-44AD-B780-92627EA469A2} {dd38f7fc-d7bd-488b-9242-7d8754cde80d} v4.5 12.0 Debug Win32 $(ProgramName) $(LatestTargetPlatformVersion) $(ProgramName)_km Windows10 true WindowsKernelModeDriver10.0 Driver WDM Spectre DbgengKernelDebugger $(ProgramName) $(BinDir)bpf2c --bpf $(ProgramName).o --sys $(AdditionalOptions) >$(ProgramName)_driver.c $(IncludeDir);%(AdditionalIncludeDirectories) 4189;4245;%(DisableSpecificWarnings) Netio.lib;%(AdditionalDependencies) SHA256 diff --git a/windows/hello/out/bpf_driver.c b/windows/hello/out/bpf_driver.c deleted file mode 100644 index 78cb3b6..0000000 --- a/windows/hello/out/bpf_driver.c +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -// Do not alter this generated file. -// This file was generated from bpf.o - -#include -#include -#include - -#define NO_CRT -#include "bpf2c.h" - -DRIVER_INITIALIZE DriverEntry; -DRIVER_UNLOAD DriverUnload; -RTL_QUERY_REGISTRY_ROUTINE static _bpf2c_query_registry_routine; - -#define metadata_table bpf##_metadata_table - -static GUID _bpf2c_npi_id = {/* c847aac8-a6f2-4b53-aea3-f4a94b9a80cb */ - 0xc847aac8, - 0xa6f2, - 0x4b53, - {0xae, 0xa3, 0xf4, 0xa9, 0x4b, 0x9a, 0x80, 0xcb}}; -static NPI_MODULEID _bpf2c_module_id = {sizeof(_bpf2c_module_id), MIT_GUID, {0}}; -static HANDLE _bpf2c_nmr_client_handle; -static HANDLE _bpf2c_nmr_provider_handle; -extern metadata_table_t metadata_table; - -static NTSTATUS -_bpf2c_npi_client_attach_provider( - _In_ HANDLE nmr_binding_handle, - _In_ void* client_context, - _In_ const NPI_REGISTRATION_INSTANCE* provider_registration_instance); - -static NTSTATUS -_bpf2c_npi_client_detach_provider(_In_ void* client_binding_context); - -static const NPI_CLIENT_CHARACTERISTICS _bpf2c_npi_client_characteristics = { - 0, // Version - sizeof(NPI_CLIENT_CHARACTERISTICS), // Length - _bpf2c_npi_client_attach_provider, - _bpf2c_npi_client_detach_provider, - NULL, - {0, // Version - sizeof(NPI_REGISTRATION_INSTANCE), // Length - &_bpf2c_npi_id, - &_bpf2c_module_id, - 0, - &metadata_table}}; - -static NTSTATUS -_bpf2c_query_npi_module_id( - _In_ const wchar_t* value_name, - unsigned long value_type, - _In_ const void* value_data, - unsigned long value_length, - _Inout_ void* context, - _Inout_ void* entry_context) -{ - UNREFERENCED_PARAMETER(value_name); - UNREFERENCED_PARAMETER(context); - UNREFERENCED_PARAMETER(entry_context); - - if (value_type != REG_BINARY) { - return STATUS_INVALID_PARAMETER; - } - if (value_length != sizeof(_bpf2c_module_id.Guid)) { - return STATUS_INVALID_PARAMETER; - } - - memcpy(&_bpf2c_module_id.Guid, value_data, value_length); - return STATUS_SUCCESS; -} - -NTSTATUS -DriverEntry(_In_ DRIVER_OBJECT* driver_object, _In_ UNICODE_STRING* registry_path) -{ - NTSTATUS status; - RTL_QUERY_REGISTRY_TABLE query_table[] = { - { - NULL, // Query routine - RTL_QUERY_REGISTRY_SUBKEY, // Flags - L"Parameters", // Name - NULL, // Entry contet - REG_NONE, // Default type - NULL, // Default data - 0, // Default length - }, - { - _bpf2c_query_npi_module_id, // Query routine - RTL_QUERY_REGISTRY_REQUIRED, // Flags - L"NpiModuleId", // Name - NULL, // Entry contet - REG_NONE, // Default type - NULL, // Default data - 0, // Default length - }, - {0}}; - - status = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, registry_path->Buffer, query_table, NULL, NULL); - if (!NT_SUCCESS(status)) { - goto Exit; - } - - status = NmrRegisterClient(&_bpf2c_npi_client_characteristics, NULL, &_bpf2c_nmr_client_handle); - -Exit: - if (NT_SUCCESS(status)) { - driver_object->DriverUnload = DriverUnload; - } - - return status; -} - -void -DriverUnload(_In_ DRIVER_OBJECT* driver_object) -{ - NTSTATUS status = NmrDeregisterClient(_bpf2c_nmr_client_handle); - if (status == STATUS_PENDING) { - NmrWaitForClientDeregisterComplete(_bpf2c_nmr_client_handle); - } - UNREFERENCED_PARAMETER(driver_object); -} - -static NTSTATUS -_bpf2c_npi_client_attach_provider( - _In_ HANDLE nmr_binding_handle, - _In_ void* client_context, - _In_ const NPI_REGISTRATION_INSTANCE* provider_registration_instance) -{ - NTSTATUS status = STATUS_SUCCESS; - void* provider_binding_context = NULL; - void* provider_dispatch_table = NULL; - - UNREFERENCED_PARAMETER(client_context); - UNREFERENCED_PARAMETER(provider_registration_instance); - - if (_bpf2c_nmr_provider_handle != NULL) { - return STATUS_INVALID_PARAMETER; - } - -#pragma warning(push) -#pragma warning( \ - disable : 6387) // Param 3 does not adhere to the specification for the function 'NmrClientAttachProvider' - // As per MSDN, client dispatch can be NULL, but SAL does not allow it. - // https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/netioddk/nf-netioddk-nmrclientattachprovider - status = NmrClientAttachProvider( - nmr_binding_handle, client_context, NULL, &provider_binding_context, &provider_dispatch_table); - if (status != STATUS_SUCCESS) { - goto Done; - } -#pragma warning(pop) - _bpf2c_nmr_provider_handle = nmr_binding_handle; - -Done: - return status; -} - -static NTSTATUS -_bpf2c_npi_client_detach_provider(_In_ void* client_binding_context) -{ - _bpf2c_nmr_provider_handle = NULL; - UNREFERENCED_PARAMETER(client_binding_context); - return STATUS_SUCCESS; -} - -void -division_by_zero(uint32_t address) -{ - UNREFERENCED_PARAMETER(address); -} - -#include "bpf2c.h" - -static void -_get_hash(_Outptr_result_buffer_maybenull_(*size) const uint8_t** hash, _Out_ size_t* size) -{ - const uint8_t hash_buffer[] = { - 182, 2, 231, 5, 204, 99, 174, 180, 60, 96, 119, 159, 59, 35, 212, 226, - 137, 137, 128, 188, 235, 127, 29, 62, 53, 106, 101, 228, 163, 78, 24, 215, - }; - *hash = hash_buffer; - *size = sizeof(hash_buffer); -} -static void -_get_maps(_Outptr_result_buffer_maybenull_(*count) map_entry_t** maps, _Out_ size_t* count) -{ - *maps = NULL; - *count = 0; -} - -static helper_function_entry_t func_helpers[] = { - {NULL, 12, "helper_id_12"}, -}; - -static GUID func_program_type_guid = {0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}}; -static GUID func_attach_type_guid = {0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}}; -#pragma code_seg(push, "bind") -static uint64_t -func(void* context) -#line 4 "c:\\demo/bpf.c" -{ -#line 4 "c:\\demo/bpf.c" - // Prologue -#line 4 "c:\\demo/bpf.c" - uint64_t stack[(UBPF_STACK_SIZE + 7) / 8]; -#line 4 "c:\\demo/bpf.c" - register uint64_t r0 = 0; -#line 4 "c:\\demo/bpf.c" - register uint64_t r1 = 0; -#line 4 "c:\\demo/bpf.c" - register uint64_t r2 = 0; -#line 4 "c:\\demo/bpf.c" - register uint64_t r3 = 0; -#line 4 "c:\\demo/bpf.c" - register uint64_t r4 = 0; -#line 4 "c:\\demo/bpf.c" - register uint64_t r5 = 0; -#line 4 "c:\\demo/bpf.c" - register uint64_t r10 = 0; - -#line 4 "c:\\demo/bpf.c" - r1 = (uintptr_t)context; -#line 4 "c:\\demo/bpf.c" - r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack)); - -#line 4 "c:\\demo/bpf.c" - r1 = IMMEDIATE(33); -#line 6 "c:\\demo/bpf.c" - *(uint16_t*)(uintptr_t)(r10 + OFFSET(-4)) = (uint16_t)r1; -#line 6 "c:\\demo/bpf.c" - r1 = IMMEDIATE(1684828783); -#line 6 "c:\\demo/bpf.c" - *(uint32_t*)(uintptr_t)(r10 + OFFSET(-8)) = (uint32_t)r1; -#line 6 "c:\\demo/bpf.c" - r1 = (uint64_t)8583909746840200520; -#line 6 "c:\\demo/bpf.c" - *(uint64_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint64_t)r1; -#line 6 "c:\\demo/bpf.c" - r1 = r10; -#line 6 "c:\\demo/bpf.c" - r1 += IMMEDIATE(-16); -#line 6 "c:\\demo/bpf.c" - r2 = IMMEDIATE(14); -#line 6 "c:\\demo/bpf.c" - r0 = func_helpers[0].address -#line 6 "c:\\demo/bpf.c" - (r1, r2, r3, r4, r5); -#line 6 "c:\\demo/bpf.c" - if ((func_helpers[0].tail_call) && (r0 == 0)) -#line 6 "c:\\demo/bpf.c" - return 0; -#line 7 "c:\\demo/bpf.c" - r0 = IMMEDIATE(0); -#line 7 "c:\\demo/bpf.c" - return r0; -#line 7 "c:\\demo/bpf.c" -} -#pragma code_seg(pop) -#line __LINE__ __FILE__ - -#pragma data_seg(push, "programs") -static program_entry_t _programs[] = { - { - 0, - func, - "bind", - "bind", - "func", - NULL, - 0, - func_helpers, - 1, - 13, - &func_program_type_guid, - &func_attach_type_guid, - }, -}; -#pragma data_seg(pop) - -static void -_get_programs(_Outptr_result_buffer_(*count) program_entry_t** programs, _Out_ size_t* count) -{ - *programs = _programs; - *count = 1; -} - -metadata_table_t bpf_metadata_table = {_get_programs, _get_maps, _get_hash}; diff --git a/windows/hello/out/bpf_km/bpf.sys b/windows/hello/out/bpf_km/bpf.sys deleted file mode 100644 index 6b7dc10ed44bd46bd6b33b12f766173c6b360699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10040 zcmeHM2~<;8w>}vOa|$9Ls8@`N6TJ)y*4BneE*c;P6trjvkVrH@8j=c1D*{C^VyU(+ zYaJ3Q*2=TBtpiqVMI5lj7KgUl;Yl4@R8%UqVjcMRx%UPV*Z;q_{949GF|7+3)YLB6xc%a?Rr-n6hWT%FuqDPqTJQg7*d1HGxhJ&y z0hDj@gv1X` zfgrUB^xC8q;N zQt)Tw-f*MLagr>mT0npg5J{@yXhw6ZV`6%7LeTRxZW*EQ!;TgXU5%p5f&*Ykg&(Cm zahxyNdpu6U;R50Q0)!_3!fyp4$N?gJABfX#Afji1IA;NISp>v&3lO)-K-`A|@i+&> z^AZqoHISz;@hSu2eGtfi8$f)P0vR|Mi0>32eiMNBF90$~4J6sTwy4RV~6YMV+9x93C!$3UBQg3XvEFCCcuR?VcBEh@b{exVD&;?Tle4pR})W zACwICOoO-z-XC^V`t8%HWt~_HV>&+s7#`C~Nf&O-wh(|*xIR@QcmsD8W>=1t8Gs?+ zS(sxW4-3HcG*BZrj{Sml@rg=F8DKaNfs;boNu^{3E`q8SI8Gq0XCxZ7urk2g?ciND zxu#Om2r^~v2|v7_1gU!m?gWAL@!=#tY_Iz7F6@#e(~EUMQh1lM%frEz`z z>5Cb&(xEAWXA25r=te4f#5Ta625Q{j8w<|N_bIbc5^Qei-Wq;bIj^~Q#F_v&d5kd9 z^d*`W19glF8ja`BN*Eq+FxmYi_%Vs8rY5oGUQ=(ciPKCqofKd50&Q#SkteF|$M1nt zqx;-JfD2ACN5cSoo@hSZ0bvX^!a(Au491g&_0eV|GoOqzpO=|WM^{|#+0Hk5N1LUh zq#QZ_-gz1CG?mjL8-6-5r#aco7gOdKv6+Gm9V7DGo5tb&e#Fx#G9RgE?~?IalEPaO z%_lpi_V)JLTEJcDf1cjrEh+*WmuDdr=&`m4#iL^S zne9EuL2rPZ4;Dt+N0Ea~GQ1qMCy&`h2>o=M-fcBB9@C;POzM0xs>I${>a%ftR-e-#Ec&pQ+k|j;{~I~ zh*Aa@v)rZ+X3H`1smi2ixiW3GJYG37IaMAXOPe_0RCFra8gjs+6^iKDj7JAtu1HBx zGD=50UJ)ywskC$F=ugh*?c6%*aYbbc-QiUBK^*+k6&(#6^fE7tHGcouij{UHGwLObNz0|bm*y(?#o+2?hA!g=OtT7c7>D4*#0j(;^!)2Ahpeg~5 zziXAY0xqi!IeL@QW@an*Szv{-P@~LO>G2Dl@nZ+*40e@4uhZu%jRvh6+rDU0n`i;! zU}xV}kx`Yi5O9OGV1BkqgXD?H%H)(}b~NDA9Lgy%)8b>(l*xE5a5+Ji5)&=!FUQVI zO-o5)%6gqjTL5->Y8^DA)aEKf!=Q+4_Y4|S0gMKdY>Ha`ie&bcoaGrTceNSB zvwQ9cjNx}?8*tWcBF4DBJj5A@guZofZ6y&PF34US0=a^17dY+0HqMNVGfWNFn~}Z2 zp6kO$Jh1oC56Bucn87{32G=8?-k>3T+P51gmBz}rP{&1xxI&)LB|?Z?!i0Lf25`ch z%LgAqu8Md!6PsJ2zIy z=zDK5KCu``OkxDf_;}F##w1p2jJQ#q}&_(7))v>j+TQnG#Vt++pr1 zQs%Ri`Kyk0D}1z?Gx1&GQ39?s;eH^g4IudJ4WRbhA~!X;3BH2wwZX-HBxsvk_Y1)V zzH-CwNL!kQzZXgPX<&!d0cQX0XS2op&-yNXg_E3bP^jl?i;QYRtWK*gFrpexi+VcFvO<3SZLZstqVPJ}ogNBz1NwS}IZ) zb%_O9mJENh-sZ!NZ#SyxzVt?RAZt-Gu();4Rq zRa8&Z2iKGJ@_Hm?&Sk+C(h>#j;By#0XNW9fi=Ty{u?!0Uf2Du<2+;qaxm-k+JB<@M zkEx=n?zwZExR!FK!2tPlIh;^W(p~7BRYh^sJU*8r08=g!x{MWa_?+@cE{AU^=X8~K#g*TWwUP;a)Db2jkB+xAp_z1u3$yf3Kp{cd&EH~ex=WoS943=B*AEAqI2 z=|D$+FULgAu88zn{d4ev7qS(3n(D^))`SLGJh%&PuFl;%_jVZmmDE}~(dpgi_MJoW z<>A@HM=n8|W5-0@&e7e!QUB(~z10QyW8?bOV*>-PZu?@yXK!b^5Uv~7ow&c}#;A-9 zKgRv&X>YFc zu5Vs__LZfNc2BP=Yxm!>f78H^Vn%m6Hy;U{?ssVtUfA2tE(_fGU0z9G?hjjDzh7F) zKep9-Y{UAJyhT4%HZ{8)$N#SfM;QHu2j0w`UQ$99U&-5l_mB4@@DdR-ow-5rl+ZkjInBik&vqkwBtgy!+BixmQ{G4!Q#^O_;N@Qqce?(}l?z8g zZhP(2xc>On<}(-G-?>4^pL=A1^zg6bN zzxSlB{_TV5bv}Zfi!K`{fA#Ex>mR;<``AZwF6P~PdFg23r88$w`Zu5ns<{c4Ug;3^ z!auG)xcnP$1{d}!=N$od0ak8dgHmGd zQK#aicgq$}33xRsw4q+{Zr!G_JFmXBdgaptF$gH`0s}{^|eLQrl?>9yH%>mD!>Iq7@Q2prI!^at#LoZ$1+*0Z}Vy#Qy zYj;AEn|9_F5nE>HdoR&>%kHml`**=jL;Mz1iazT>IdsD<1Mui|XIK{A$_q z4Not>9k9WEzG2@$Y(}eY&C2{%sBGA2eD1yS5T{1zTd&=7y<0yqecMw0qgjtMX*;K0 z{@&%y8K1l6&UqY~bFg$BYMo;(t(xZXwQR={k7m`K?@yg^dFr>hCjAwPDmTGGx1U4TR%U4PdRq0#(UzSbn5e4V|M@QgaqBUHoj8OvaBS% g^5gh9AHJDEZ9c6%`?hat@?fn-(7jf_w~N6>vIpF$$mnyD$&j8 zQyeg6_$8WbAE3#0!(j*v7vMm#y3);H9tb2Hwu%Y3|85Ao5Q`1m`E~%Ok$lkif+NQo%nm!?x0gg6??whx(8)KXdoegdGY_<%+ zle9N&Cga1mSvim`&Ft5+v0b8ZZUQt!3829*UP8cOa5y*n+cyJ(?Iv>x1Fqjh$AAuF zUJEmZt%By|fmsb$Q3!h^iVtpYhgk#o7!5W)b|W7zA43lk1#KSSh7ksWjLWO}xWmH2 z)ZC$4ZqO|?w?Kc4ERbg0Lhy+$^)MilLr5O(Xmca9ZD1e;ZD;@_1UY~f27>`V|C|Lm za8PTh`Jb8w4JN&O0iYLypuxD901d_lr@>%MH#yhT_Zvp<%s((u;yM$|o00QMKIvfA z=lU;b9R(*>_UY)(%r(haf?jdHLTr5etBY*xF@g~ZiP`aQ!|irrVwEPjQn6a0b+5bh zuBVUsewF%UOX$9cZjB+qti|E7@LIR{2QwRXIAD7;u#&#zF*k>a|Oce7J} z^ZFQbW2Y2NACc>(!wxm!H+b8Er2D>>vbdf-j> z126N!T_XjoN+a?g_LT3_SDq-5*YtNe1iNLv<05R;*&FNS9@O26dN>|PubFlC9-*ox zjch8JJtEPyd%S$BR|)an#JHp%yB4!Rl=j}t9sUvHye6(OZEKO`mh~y+m0n8TJl)Z6 z*>Ro~d>s4%6H$_G+!C`#Mdkd72^l2>Sbo!G`84j}^EZ1dXDUzIlqfT^)T<3{Ex0zz zW~`n*_6g8d0YF0vEx0a{RY=sOwahcb&agNzc`M8EoxA!!>be*l24JxmEW>#r*Tv$O zH38{=OAriDhc*jD5QQaz*qIq%(aSJm80hYSw)61{@Coo@;NWvI900i!urd4a^7x2w(gk21EJ-KOno<1~9siH-!?U ztF9jCMh;pL5rE;66`ZcUVC6<&1Pt;DL-obiz3`&VjTq6w&_Ka60{umVab<;^x1qwonWepLL_ITP!hKN9mrnK_TI`Fba}*yiC;*&NxL zM{AYR6ct2tgB9R4;%V4fn0KUgh@)!~hOR%2aa+$K zB2-8{yQStNH|iTRb@p)Q49$FMcR-rmEN_xfoZ5-w!`?(AY=LLmTcImw+-*i7W^RF) zslC8VSmBMx^=1x^aViyayV=N-zcTaRfEAScU?E^)w3c!otOn4;Xku}iI+{ApfO=#l zLHPg=wDFKEd~A+T3J4L85*UEtp7&TJGas|9hr54ZfIEh<2_Z8!J}K)EQxA$-Aju1D z>k$-4_Mrrl!qL0K(N;cgq(E|@CuPwV@egeOmaQM7?$Fb!l~yH}jCvXkqptElK!y|d z68&U2CuYMnSQEXd!4+qoSfYo#A_PC5jP=!dGeBewJ08&+V3$*#iyZ zog9SHwJ+iNA_dmJncwX0{hAz!^SaPvan194Q>*i4JcSp>{D&?`d+Z{E_zZCzq(6|_?KSNQCoI`!{)()8ABZ}nOl9e20j-F4y|G?p}pDYXl0YLK-?h=Ns{yPhQ;ThSRfK?^@Ou$v$ z$f{l#2&cq9cKZdP|4lc`p9C}ln}F8OdIlmO0tOVp+GPL~U6{?E@{a|D@}jcCkT5`v zUF-velRY5xABGd_#a;kT-?aGLe-%y`$-`1eVPp;qiNiu=a!7qPh2mNPkY=KiUa=ZfcsTeqUc zd|oEKjjCPSTXx5@Or&nCD-)a7!_UldjF`ip8|A_+;1aw+fZL>)KJt zb-Q1`z!ZK8L*kh&c-HyykjV9KPjB6hWeZM_4=hdQ@6GV5spgj3!D6p-O7@leb+kbC z=Z_^f%JY>yCN)^snO_jOC|Bc~8DIZ~-RXLYg9APCj5(foh9X;;>^muRqJAhc9gvLZ06mm174Ac|s#5(*@Yro9aggTWcBV`p}! zcoT>oBp|kA$+`-|1%VO^@IVJbB_6Bo3?xvi7iv{jZaDXRQT_V`6dcMM7i(EoBt{yE z?iM2+CItDY1%!D0 z1gUx`PTeQK-D8iMFF7y(P+ONzL>)t|2GoauS^=nc0rad(bv_d9tO$E?^Kv82wX~+Y zmrpOb&GN#i@0)>FxXrQK8cp|o2Gn>EdWG_DB+YQ{zY2~}DU77SnAm{Pk6m6N(RGn_ z8^86=y)C~hrNWDBpR0vm>%149fV#6)Wm|u{^s2}r%TmejK&{b=yI-y)t8*)>(+=)r zyC=vmC(>ax_*jjyP+qn(c}WrSMU}CK_nCfd&9{9wOt&wz;;xW|5w42GgrrKW%L{Dc zn`{eJOf)olbc6peZu3J85ma)}z1!TCyf0n3M6PJw^+egc*ACOhee^6=MHkBWUU9LBoWUl0#8zj=Er#48`% z%gbpO+$QZgYX4wz^OjTZJ#^(gwnz}Sy#5kEe_&TP7GO;JQn;7oT%JbblLRzA(dF-( z6GP);gD#?$b{j+M;hh3B-U)`*!?9uyKv4m=tTzk^xra2gv=Yz_5y$~htLM|fX=50( zAOc_*09x8V&^tg2e36cGrG^!wx^zm)z1olY4GYn8x>4;Kr@Jq3Q5AdP{2WTr4|;#l z4-GezO}Lgcxbj!kX$f&*p$cuucks>ts@f&sXw9ZiILYe$QC}jaWw96bA0*3#4 z4eLCQ*1ws7>bOLuU!leTYV^t!L>%(k`P_ovF5I6GK=E)x8wQes0!ai4BwAr4=QCMI z4iZ?py^Rz?rl74oC}DvlKSp4`XZGgxFCN)m5-07kK6p(p$&eHK?$GN#PC1^%$L>kg*8qa zsB03*aEnA8P${4MGPS99pyI&p zLoQ5~-PK+FAx2mOU5VfTpW4+SCM=Clo0OBEH+(JK=;waK(dru?Pk8Ky-?mL^Tx5Yw zaLb_tEjq`=BRu_5T|KXKj5ev!#>YlkhmD@B@$E$f;F_~9+A}?xWbsWZb$Rs$Hy-Oc zvtun!(KmrlWe&d4az}p_>C^&1&Hbaiwo-pX0sqA;2*!>i0GG5~mv(^dz!BIBu=@BD zygbysd^~{^kOa)ARmz+QxCoLzVW3%ro_+L~Uu8qIZ;P3bN~EwFScrH~wMq>13RHvk zsSg?Q6o!T#)NY0wt8S=m`)%n{S`>)a;J%!Fc-kLQQo%|26}-;a^1p(Z;x zbLKy6$-lZid)%$|_GaI{8f<7x6) zl;^n>`SL!Kne`v8yXd!bNlb5 z655Rqq$XC6&_Ru6#n_KZ`-3r-qpMD!fc7V(x8YH1*_A(>dYuyuU2j{|9(MSsLc2CioLx(BTEtUMOnARd=JutTv_ z?Y&!JPlNtyhs5dKqWed#GWWiY`pthMzU4UTt-;=KvD(_3q807Q$0x=<5~pvT(ou_g zu=e&Io$A<(4Y$UMLrh;HZ1+>l>4^Fn#Fq`kjY+@DAH#N^2*=laY( zmf3N(Xr<8iRHtb#N`qlgK0;nue!@_HDiwM{D-X$FE?^hfu`+wv3}hCu1nFRci>b7` z8adqGZTCD=+=9qJZpjD^ghl?;j1)uwYKvx2c_H^Z<4A9=-8Gm{Ovgt>hwNS<2>erah79MawrU9P#2U|W_Oxud zy5~V)+i=&bEfZ;vsRyU7C9E0TsCaX5*XQ&O2lv=upwuNn5cEVlpi+g8?h5`iopP7; zyV!BlC%x~EBEHros=r_(TI1foC_4FgbE2D>&PJ)Kt``A^QuT^cQ{H8wN?4yH*f|;` zs`p4(S-*P9y@$9dVC+`)G-0Rh7wbvCqf-_U^J?C zjXf2o554Ty;lJ0}-&{GY>|B`aWRKkU=*)W=#L+mVrXM+(1S-T%ONgDgMRv9f0Xt1Q|d%yfyz4C$}6z*+kX#P=WFcvL#8 z{Mu^KCgxju#Uio_)1oAs^^aK(%CqRs%o@ssmJO+~o!Bl@8~vKkYKHqs7Ml>!p5WLx4p*rvzVV4D({z!8OPF{wZnw{O>$nH;wwN0` z+MiHt`y7eV74}hqPf<7YElQ+AJ>I|9`gAIpDzEarEHw*;Z_bt5c$U>}OwlpU>9^rH zGXtpu1Fwskbek}bFagF0a*Wg1$L z=DZq$^#^gR9qHS-KTBB5dDOjb@$0iy3}LcR&Zw(B`!3UJsz`AA34_WKefr?!{U{?n zlbwRjeOK1C`pCCR?dys5+P^!y#9D35nSpaMxjT4#Wlb+!y$s>v60iO!5K6D3j-CeneK(6Y zX*as7M6#PO%@B7Me=q}MNMtIHfk?G(KR7Fxb0kUJyhm&7RsoY{rFdfMjG%dB$Tq=4 z-mN#&&f74()j5=twrbkOIZ*Mk#$}TJL3g0zrR(ic^;?3$o0H7k$cI zWJ5?Cm*0fuNwB}eEV4b*<&8+(nb$^Ji$}WHRD6P?U9J+9w`MT=T5r#cHt*O=40xMh zwLdtuBc3TJV{5vMou1vfObKwTHW5=Z=T`Sd_(jpqjbkY+fimNM5BvSX=CtO*Z|l4| zkJf*}m+MqNSC-rwBeRobSNjPOkDSYA@=Vr@SG=hk0%O<1pX|{nZ#~k;^$uT(J&Wbf XiZf+Gjp!Xs3(0a(vlI7E$&vmqnkP51 diff --git a/windows/packages/eBPF-for-Windows.0.3.0/README.md b/windows/packages/eBPF-for-Windows.0.3.0/README.md deleted file mode 100644 index 11f64ba..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# eBPF for Windows NuGet Package - -This NuGet package includes all the headers, libraries, and debugger files -needed to enable writing eBPF programs and applications for Windows. diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/bin/Convert-BpfToNative.ps1 b/windows/packages/eBPF-for-Windows.0.3.0/build/native/bin/Convert-BpfToNative.ps1 deleted file mode 100644 index 9e7fae6..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/bin/Convert-BpfToNative.ps1 +++ /dev/null @@ -1,61 +0,0 @@ -# Copyright (c) Microsoft Corporation -# SPDX-License-Identifier: MIT - -param([parameter(Mandatory = $true)] [string] $ProgramName, - [parameter(Mandatory = $false)] [string] $Type, - [parameter(Mandatory = $false)] [string] $IncludeDir = "$PSScriptRoot\..\include", - [parameter(Mandatory = $false)] [string] $BinDir = "$PSScriptRoot", - [parameter(Mandatory = $false)] [string] $OutDir = "$PWD", - [parameter(Mandatory = $false)] [string] $Platform = "x64", - [ValidateSet("Release", "Debug")][parameter(Mandatory = $false)] [string] $Configuration = "Release", - [parameter(Mandatory = $false)] [bool] $SkipVerification = $false, - [parameter(Mandatory = $false)] [bool] $KernelMode = $true) - -Push-Location $OutDir - -$KernelModeProject = ' Debug Win32 Release Win32 Debug x64 Release x64 Debug ARM Release ARM Debug ARM64 Release ARM64 {172DFDF9-3B0D-44AD-B780-92627EA469A2} {dd38f7fc-d7bd-488b-9242-7d8754cde80d} v4.5 12.0 Debug Win32 $(ProgramName) $(LatestTargetPlatformVersion) $(ProgramName)_km Windows10 true WindowsKernelModeDriver10.0 Driver WDM Spectre DbgengKernelDebugger $(ProgramName) $(BinDir)bpf2c --bpf $(ProgramName).o --sys $(AdditionalOptions) >$(ProgramName)_driver.c $(IncludeDir);%(AdditionalIncludeDirectories) 4189;4245;%(DisableSpecificWarnings) Netio.lib;%(AdditionalDependencies) SHA256 ' -$UserModeProject = ' Debug Win32 Release Win32 Debug x64 Release x64 16.0 Win32Proj {1baf5f74-b71f-4088-8677-f27070302b59} $(ProgramName)dll 10.0 $(ProgramName)_um DynamicLibrary true v142 Unicode false $(ProgramName)_um WIN32;_DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true NotUsing pch.h $(IncludeDir);%(AdditionalIncludeDirectories) 4189;4245;%(DisableSpecificWarnings) Windows true false $(BinDir)bpf2c.exe --bpf $(ProgramName).o --dll $(AdditionalOptions) >$(ProgramName)_dll.c WIN32;NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true NotUsing pch.h $(IncludeDir);%(AdditionalIncludeDirectories) 4189;4245;%(DisableSpecificWarnings) Windows true true true false $(BinDir)bpf2c.exe --bpf $(ProgramName).o --dll $(AdditionalOptions) >$(ProgramName)_dll.c _DEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true NotUsing pch.h $(IncludeDir);%(AdditionalIncludeDirectories) 4189;4245;%(DisableSpecificWarnings) Windows true false $(BinDir)bpf2c.exe --bpf $(ProgramName).o --dll $(AdditionalOptions) >$(ProgramName)_dll.c NDEBUG;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) true NotUsing pch.h $(IncludeDir);%(AdditionalIncludeDirectories) 4189;4245;%(DisableSpecificWarnings) Windows true true true false $(BinDir)bpf2c.exe --bpf $(ProgramName).o --dll $(AdditionalOptions) >$(ProgramName)_dll.c ' - -# If program name ends with .o, remove the suffix -if ($ProgramName.EndsWith(".o")) { - $ProgramName = $ProgramName.Substring(0, $ProgramName.Length - 2) -} - -# SkipVerification is only supported for Debug. -if ($Configuration -eq "Release" -and $SkipVerification) { - throw "Invalid parameter. SkipVerification is only supported for Debug builds" -} - -if ($null -eq (Get-Command 'msbuild.exe' -ErrorAction SilentlyContinue)) { - throw "Unable to locate msbuild.exe. This command needs to run within a 'Developer Command Prompt'" -} - -$fileExists = Test-Path -Path ("$ProgramName.o") -if (!$fileExists) { - $errorString = "Can't find program file: " + "$ProgramName.o" - throw $errorString -} - - -if ($KernelMode) { - $ProjectFile = "$ProgramName.vcxproj" - Set-Content -Path $ProjectFile -Value $KernelModeProject -} -else { - $ProjectFile = "$ProgramName_um.vcxproj" - Set-Content -Path $ProjectFile -Value $UserModeProject -} - -$AdditionalOptions = If ($SkipVerification) {"--no-verify"} Else {""} - -if ($PSBoundParameters.ContainsKey("Type")) { - $AdditionalOptions += " --type $Type" -} - -msbuild /p:BinDir="$BinDir\" /p:OutDir="$PWD\" /p:IncludeDir="$IncludeDir" /p:Configuration="$Configuration" /p:Platform="$Platform" /p:ProgramName="$ProgramName" /p:AdditionalOptions="$AdditionalOptions" $ProjectFile - -if ($LASTEXITCODE -ne 0) { - throw "Build failed for $ProgramName.o" -} - -Pop-Location diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/ebpf-for-windows.props b/windows/packages/eBPF-for-Windows.0.3.0/build/native/ebpf-for-windows.props deleted file mode 100644 index a12fc67..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/ebpf-for-windows.props +++ /dev/null @@ -1,29 +0,0 @@ - - - - - mdd - md - - - - - - @(EbpfLibs) - -I $(MSBuildThisFileDirectory)include -I $(MSBuildThisFileDirectory)include/uapi - $(MSBuildThisFileDirectory)bin - $(MSBuildThisFileDirectory)include - - - - %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)include;$(MSBuildThisFileDirectory)include/uapi - - - %(AdditionalLibraryDirectories);$(MSBuildThisFileDirectory)lib - $(EbpfLibraries);%(AdditionalDependencies) - - - diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/errno.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/errno.h deleted file mode 100644 index be96b11..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/errno.h +++ /dev/null @@ -1,3 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/posix_types.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/posix_types.h deleted file mode 100644 index be96b11..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/posix_types.h +++ /dev/null @@ -1,3 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/types.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/types.h deleted file mode 100644 index d28755a..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/asm/types.h +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once -#include -typedef uint16_t __u16; -typedef uint32_t __u32; -typedef uint64_t __u64; -typedef int16_t __s16; -typedef int32_t __s32; -typedef int64_t __s64; -#define __SIZEOF_LONG_LONG__ 8 /* only x64 is supported */ -#define __SIZEOF_LONG__ 4 /* only x64 is supported */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/bpf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/bpf.h deleted file mode 100644 index ba2e44d..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/bpf.h +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#ifdef __doxygen - -/** - * @name Link-related functions - * @{ - */ - -/** - * @brief Detach a link. - * - * @param[in] link_fd File descriptor of link to detach. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EBADF The file descriptor was not found. - * - * @sa bpf_link__destroy - * @sa bpf_link__disconnect - */ -int -bpf_link_detach(int link_fd); - -/** - * @brief Get a file descriptor referring to a link - * with a given ID. - * - * @param[in] id ID of link to find. - * - * @returns A new file descriptor that refers to the link. - * The caller should call _close() on the fd to close this when done. - * A negative value indicates an error occurred and errno was set. - * - * @exception ENOENT No link with the specified ID was found. - */ -int -bpf_link_get_fd_by_id(__u32 id); - -/** - * @brief Look for the next link ID greater than a given ID. - * - * @param[in] start_id ID to look for an ID after. The start_id need not exist. - * @param[out] next_id Pointer to where to write the next ID. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception ENOENT No more IDs found. - */ -int -bpf_link_get_next_id(__u32 start_id, __u32* next_id); - -/** @} */ - -/** - * @name Map-related functions - * @{ - */ - -/** - * @brief Create a new map. - * - * @param[in] map_type Type of outer map to create. - * @param[in] map_name Optionally, the name to use for the map. - * @param[in] key_size Size in bytes of keys. - * @param[in] value_size Size in bytes of values. - * @param[in] max_entries Maximum number of entries in the map. - * @param[in] opts Structure of options using which a map gets created. - * - * @returns A new file descriptor that refers to the map. - * The caller should call _close() on the fd to close this when done. - * A negative value indicates an error occurred and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - */ -int -bpf_map_create( - enum bpf_map_type map_type, - const char* map_name, - __u32 key_size, - __u32 value_size, - __u32 max_entries, - const struct bpf_map_create_opts* opts); - -/** - * @brief Look up and delete an element by key in a specified map. - * - * @param[in] fd File descriptor of map to update. - * @param[in] key Pointer to key to look up. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * @exception EBADF The file descriptor was not found. - * @exception ENOMEM Out of memory. - */ -int -bpf_map_delete_elem(int fd, const void* key); - -/** - * @brief Get a file descriptor referring to a map - * with a given ID. - * - * @param[in] id ID of map to find. - * - * @returns A new file descriptor that refers to the map. - * The caller should call _close() on the fd to close this when done. - * A negative value indicates an error occurred and errno was set. - * - * @exception ENOENT No map with the specified ID was found. - */ -int -bpf_map_get_fd_by_id(__u32 id); - -/** - * @brief Look for the next map ID greater than a given ID. - * - * @param[in] start_id ID to look for an ID after. The start_id need not exist. - * @param[out] next_id Pointer to where to write the next ID. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception ENOENT No more IDs found. - */ -int -bpf_map_get_next_id(__u32 start_id, __u32* next_id); - -/** - * @brief Look up an element by key in a map and get the next key. - * If the specific key is not found, the first key in the map is - * passed back. - * - * @param[in] fd File descriptor of map. - * @param[in] key Pointer to key to look up. - * @param[out] next_key Pointer to memory in which to write the - * next key. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * @exception EBADF The file descriptor was not found. - * @exception ENOMEM Out of memory. - */ -int -bpf_map_get_next_key(int fd, const void* key, void* next_key); - -/** - * @brief Look up an element by key in a specified map and - * return its value. - * - * @param[in] fd File descriptor of map. - * @param[in] key Pointer to key to look up. - * @param[out] value Pointer to memory in which to write the - * value. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * @exception EBADF The file descriptor was not found. - * @exception ENOMEM Out of memory. - */ -int -bpf_map_lookup_elem(int fd, const void* key, void* value); - -/** - * @brief Create or update an element (key/value pair) in a - * specified map. - * - * @param[in] fd File descriptor of map. - * @param[in] key Pointer to key. - * @param[in] value Pointer to value. - * @param[in] flags Flags (currently 0). - * - * @exception EINVAL An invalid argument was provided. - * @exception EBADF The file descriptor was not found. - * @exception ENOMEM Out of memory. - */ -int -bpf_map_update_elem(int fd, const void* key, const void* value, __u64 flags); - -/** @} */ - -/** - * @name Object-related functions - * @{ - */ - -/** - * @brief Get a file descriptor for a pinned object by pin path. - * @param[in] pathname Pin path for the object. - * - * @return A new file descriptor for the pinned object. - * The caller should call _close() on the fd to close this when done. - * A negative value indicates an error occurred and errno was set. - */ -int -bpf_obj_get(const char* pathname); - -/** - * @brief Obtain information about the eBPF object referred to by bpf_fd. - * This function populates up to info_len bytes of info, which will - * be in one of the following formats depending on the eBPF object type of - * bpf_fd: - * - * * struct bpf_link_info - * * struct bpf_map_info - * * struct bpf_prog_info - * - * - * @param[in] bpf_fd File descriptor referring to an eBPF object. - * @param[out] info Pointer to memory in which to write the info obtained. - * @param[in,out] info_len On input, contains the maximum number of bytes to - * write into the info. On output, contains the actual number of bytes written. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - */ -int -bpf_obj_get_info_by_fd(int bpf_fd, void* info, __u32* info_len); - -/** - * @brief Pin an eBPF program or map referred to by fd to the - * provided pathname. - * - * @param[in] fd File descriptor referring to the program or map to pin. - * @param[in] pathname Path name to pin the object to. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - */ -int -bpf_obj_pin(int fd, const char* pathname); - -/** @} */ - -/** - * @name Program-related functions - * @{ - */ - -/** - * @brief Bind a map to a program so that it holds a reference on the map. - * - * @param[in] prog_fd File descriptor of program to bind map to. - * @param[in] map_fd File descriptor of map to bind. - * @param[in] opts Optional set of options affecting the bind operation. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - */ -int -bpf_prog_bind_map(int prog_fd, int map_fd, const struct bpf_prog_bind_opts* opts); - -/** - * @brief Get a file descriptor referring to a program - * with a given ID. - * - * @param[in] id ID of program to find. - * - * @returns A new file descriptor that refers to the program. - * The caller should call _close() on the fd to close this when done. - * A negative value indicates an error occurred and errno was set. - * - * @exception ENOENT No program with the specified ID was found. - */ -int -bpf_prog_get_fd_by_id(__u32 id); - -/** - * @brief Look for the next program ID greater than a given ID. - * - * @param[in] start_id ID to look for an ID after. The start_id need not exist. - * @param[out] next_id Pointer to where to write the next ID. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception ENOENT No more IDs found. - */ -int -bpf_prog_get_next_id(__u32 start_id, __u32* next_id); - -/** - * @brief Load (but do not attach) an eBPF programs. - * - * @param[in] prog_type Program type to use for loading eBPF programs. - * @param[in] prog_name Program name. - * @param[in] license License string (unused). - * @param[in] insns Array of eBPF instructions. - * @param[in] insn_cnt Count of instructions in the array. - * @param[in] opts Additional options. - * - * @returns A new file descriptor that refers to the program. - * The caller should call _close() on the fd to close this when done. - * A negative value indicates an error occurred and errno was set. - * - * @exception EACCES The program failed verification. - * @exception EINVAL One or more parameters are incorrect. - * @exception ENOMEM Out of memory. - * - * @sa bpf_load_program - * @sa bpf_load_program_xattr - * @sa bpf_object__close - * @sa bpf_program__attach - */ -int -bpf_prog_load( - enum bpf_prog_type prog_type, - const char* prog_name, - const char* license, - const struct bpf_insn* insns, - size_t insn_cnt, - const struct bpf_prog_load_opts* opts); - -/** @} */ - -#else -#pragma warning(push) -#include "libbpf/src/bpf.h" -#include "bpf_legacy.h" -#pragma warning(pop) -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/bpf_legacy.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/bpf_legacy.h deleted file mode 100644 index f3bfe5d..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/bpf_legacy.h +++ /dev/null @@ -1,183 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -/** - * @name Map-related functions - * @{ - */ - -struct bpf_create_map_attr -{ - const char* name; - enum bpf_map_type map_type; - __u32 map_flags; - __u32 key_size; - __u32 value_size; - __u32 max_entries; - __u32 numa_node; - __u32 btf_fd; - __u32 btf_key_type_id; - __u32 btf_value_type_id; - __u32 map_ifindex; - union - { - __u32 inner_map_fd; - __u32 btf_vmlinux_value_type_id; - }; -}; - -/** - * @brief Create a new map. - * - * @param[in] map_type Type of map to create. - * @param[in] key_size Size in bytes of keys. - * @param[in] value_size Size in bytes of values. - * @param[in] max_entries Maximum number of entries in the map. - * @param[in] map_flags Flags (currently 0). - * - * @returns A new file descriptor that refers to the map. - * The caller should call _close() on the fd to close this when done. - * A negative value indicates an error occurred and errno was set. - * - * @deprecated Use bpf_map_create() instead. - * - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - */ -__declspec(deprecated("Use bpf_map_create() instead.")) int bpf_create_map( - enum bpf_map_type map_type, int key_size, int value_size, int max_entries, __u32 map_flags); - -/** - * @brief Create a new map-in-map. - * - * @param[in] map_type Type of outer map to create. - * @param[in] name Optionally, the name to use for the map. - * @param[in] key_size Size in bytes of keys. - * @param[in] inner_map_fd File descriptor of the inner map template. - * @param[in] max_entries Maximum number of entries in the map. - * @param[in] map_flags Flags (currently 0). - * - * @returns A new file descriptor that refers to the map. - * The caller should call _close() on the fd to close this when done. - * A negative value indicates an error occurred and errno was set. - * - * @deprecated Use bpf_map_create() instead. - * - * @exception EBADF The file descriptor was not found. - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - */ -__declspec(deprecated("Use bpf_map_create() instead.")) int bpf_create_map_in_map( - enum bpf_map_type map_type, const char* name, int key_size, int inner_map_fd, int max_entries, __u32 map_flags); - -/** - * @brief Create a new map. - * - * @param[in] create_attr Structure of attributes using which a map gets created. - * - * @returns A new file descriptor that refers to the map. - * The caller should call _close() on the fd to close this when done. - * A negative value indicates an error occurred and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - * - * @deprecated Use bpf_map_create() instead. - */ -__declspec(deprecated("Use bpf_map_create() instead.")) int bpf_create_map_xattr( - const struct bpf_create_map_attr* create_attr); - -/** @} */ - -/** - * @name Program-related functions - * @{ - */ - -struct bpf_load_program_attr -{ - enum bpf_prog_type prog_type; - enum bpf_attach_type expected_attach_type; - const char* name; - const struct bpf_insn* insns; - size_t insns_cnt; - const char* license; - union - { - __u32 kern_version; - __u32 attach_prog_fd; - }; - union - { - __u32 prog_ifindex; - __u32 attach_btf_id; - }; - __u32 prog_btf_fd; - __u32 func_info_rec_size; - const void* func_info; - __u32 func_info_cnt; - __u32 line_info_rec_size; - const void* line_info; - __u32 line_info_cnt; - __u32 log_level; - __u32 prog_flags; -}; - -/** - * @brief Load (but do not attach) an eBPF program from eBPF instructions - * supplied by the caller. - * - * @param[in] type Program type to use. - * @param[in] insns Array of eBPF instructions. - * @param[in] insns_cnt Number of eBPF instructions in the array. - * @param[in] license License. - * @param[in] kern_version Kernel version. - * @param[out] log_buf Buffer in which to write any log messages. - * @param[in] log_buf_size Size in bytes of the log buffer. - * - * @returns File descriptor that refers to the program, or <0 on error. - * The caller should call _close() on the fd to close this when done. - * - * @deprecated Use bpf_prog_load() instead. - * - * @exception EACCES The program failed verification. - * @exception EINVAL One or more parameters are incorrect. - * @exception ENOMEM Out of memory. - * - * @sa bpf_prog_load - * @sa bpf_load_program_xattr - */ -__declspec(deprecated("Use bpf_prog_load() instead.")) int bpf_load_program( - enum bpf_prog_type type, - const struct bpf_insn* insns, - size_t insns_cnt, - const char* license, - __u32 kern_version, - char* log_buf, - size_t log_buf_sz); - -/** - * @brief Load (but do not attach) an eBPF program from eBPF instructions - * supplied by the caller. - * - * @param[in] load_attr Parameters to use to load the eBPF program. - * @param[out] log_buf Buffer in which to write any log messages. - * @param[in] log_buf_size Size in bytes of the log buffer. - * - * @returns File descriptor that refers to the program, or <0 on error. - * The caller should call _close() on the fd to close this when done. - * - * @exception EACCES The program failed verification. - * @exception EINVAL One or more parameters are incorrect. - * @exception ENOMEM Out of memory. - * - * @deprecated Use bpf_prog_load() instead. - * - * @sa bpf_prog_load - * @sa bpf_load_program - */ -__declspec(deprecated("Use bpf_prog_load() instead.")) int bpf_load_program_xattr( - const struct bpf_load_program_attr* load_attr, char* log_buf, size_t log_buf_sz); - -/** @} */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/hashmap.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/hashmap.h deleted file mode 100644 index 1906e1e..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/hashmap.h +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once -#pragma warning(push) -#include "../external/bpftool/libbpf/src/hashmap.h" -#pragma warning(pop) diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/libbpf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/libbpf.h deleted file mode 100644 index 088079a..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/libbpf.h +++ /dev/null @@ -1,896 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#ifdef __doxygen - -/** - * @name Link-related functions - * @{ - */ - -/** @brief Clean up a link. - * - * @details Unless bpf_link__disconnect was called first, - * this API detaches the link. Either way, it then closes - * the link fd and frees the memory for the link. - * - * @param[in] link Link to destroy. - * - * @sa bpf_link_detach - * @sa ebpf_link_close - */ -int -bpf_link__destroy(struct bpf_link* link); - -/** @brief Release ownership of a link so that it is - * not detached when destroyed. - * - * @param[in] link Link to disconnect. - * - * @sa bpf_link__destroy - */ -void -bpf_link__disconnect(struct bpf_link* link); - -/** - * @brief Get a file descriptor that refers to a link. - * - * @param[in] link Link to get a file descriptor for. - * - * @returns File descriptor that refers to the link. - * The caller should not call _close() on the fd. - */ -int -bpf_link__fd(const struct bpf_link* link); - -/** - * @brief Pin a link to a specified path. - * - * @param[in] link Link to pin. - * @param[in] path Path to pin the link to. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EBUSY A pin path was previously specified. - * @exception EEXIST Something is already pinned to the specified path. - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - * - * @sa bpf_link__unpin - */ -int -bpf_link__pin(struct bpf_link* link, const char* path); - -/** - * @brief Unpin a link. - * - * @param[in] link Link to unpin. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * @exception ENOENT The link was not pinned. - * - * @sa bpf_link__pin - */ -int -bpf_link__unpin(struct bpf_link* link); - -/** - * @brief **libbpf_bpf_link_type_str()** converts the provided link type value - * into a textual representation. - * - * @param[in] t The link type. - * - * @return Pointer to a static string identifying the link type. NULL is - * returned for unknown **bpf_link_type** values. - */ -const char* -libbpf_bpf_link_type_str(enum bpf_link_type t); - -/** @} */ - -/** - * @name Map-related functions - * @{ - */ - -/** - * @brief Get a file descriptor that refers to a map. - * - * @param[in] map Map to get a file descriptor for. - * - * @returns File descriptor that refers to the map. - * The caller should not call _close() on the fd. - */ -int -bpf_map__fd(const struct bpf_map* map); - -/** - * @brief Determine whether a map is pinned. - * - * @param[in] map Map to check. - * - * @retval true The map is pinned. - * @retval false The map is not pinned. - * - * @sa bpf_map__pin - * @sa bpf_object__pin - * @sa bpf_object__pin_maps - */ -bool -bpf_map__is_pinned(const struct bpf_map* map); - -/** - * @brief Get the size of keys in a given map. - * - * @param[in] map Map to check. - * - * @returns The size in bytes of keys in the map. - */ -__u32 -bpf_map__key_size(const struct bpf_map* map); - -/** - * @brief Get the maximum number of entries allowed in a given map. - * - * @param[in] map Map to check. - * - * @returns The maximum number of entries allowed. - */ -__u32 -bpf_map__max_entries(const struct bpf_map* map); - -/** - * @brief Get the name of an eBPF map. - * - * @param[in] map The map to check. - * - * @returns The name of the map, or NULL if none. - */ -const char* -bpf_map__name(const struct bpf_map* map); - -/** - * @brief Pin a map to a specified path. - * - * @param[in] map Map to pin. - * @param[in] path Path to pin the map to. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EBUSY A pin path was previously specified. - * @exception EEXIST Something is already pinned to the specified path. - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - * - * @sa bpf_map_unpin - * @sa bpf_object__pin_maps - */ -int -bpf_map__pin(struct bpf_map* map, const char* path); - -/** - * @brief Get the type of a map. - * - * @param[in] map Map to check. - * - * @returns The map type. - */ -enum bpf_map_type -bpf_map__type(const struct bpf_map* map); - -/** - * @brief Unpin a map. - * - * @param[in] map Map to unpin. - * @param[in] path Path from which to unpin the map. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * @exception ENOENT The map was not pinned. - * - * @sa bpf_map_pin - * @sa bpf_object__unpin_maps - */ -int -bpf_map__unpin(struct bpf_map* map, const char* path); - -/** - * @brief Get the size of values in a given map. - * - * @param[in] map Map to check. - * - * @returns The size in bytes of values in the map. - */ -__u32 -bpf_map__value_size(const struct bpf_map* map); - -/** - * @brief **libbpf_bpf_map_type_str()** converts the provided map type value - * into a textual representation. - * - * @param[in] t The map type. - * - * @return Pointer to a static string identifying the map type. NULL is - * returned for unknown **bpf_map_type** values. - */ -const char* -libbpf_bpf_map_type_str(enum bpf_map_type t); - -/** @} */ - -/** - * @name Object-related functions - * @{ - */ - -/** - * @brief Close an eBPF object. - * - * @param[in] object The object to close. - * - * @sa bpf_prog_load - */ -void -bpf_object__close(struct bpf_object* object); - -/** - * @brief Find a map with a given name among maps associated with an eBPF object. - * - * @param[in] obj The object to check. - * @param[in] name The name to look for. - * - * @returns The map found, or NULL if none. - */ -struct bpf_map* -bpf_object__find_map_by_name(const struct bpf_object* obj, const char* name); - -/** - * @brief Find a map with a given name among maps associated with an eBPF object. - * - * @param[in] obj The object to check. - * @param[in] name The name to look for. - * - * @returns A file descriptor referring to the map found, or a negative value if none. - * The caller should not call _close() on the fd. - * - * @sa bpf_map__fd - */ -int -bpf_object__find_map_fd_by_name(const struct bpf_object* obj, const char* name); - -/** - * @brief Find a program with a given name among programs associated with an eBPF object. - * - * @param[in] obj The object to check. - * @param[in] name The name to look for. - * - * @returns The program found, or NULL if none. - * - * @sa bpf_program__name - */ -struct bpf_program* -bpf_object__find_program_by_name(const struct bpf_object* obj, const char* name); - -/** - * @brief Load all the programs in a given object. - * - * @param[in] obj Object from which to load programs. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - * - * @sa bpf_object__load_xattr - * @sa bpf_object__open - * @sa bpf_object__unload - * @sa bpf_prog_load - */ -int -bpf_object__load(struct bpf_object* obj); - -/** - * @brief Get the name of an eBPF object. - * - * @param[in] obj The object to check. - * - * @returns The name of the object, or NULL if none. - */ -const char* -bpf_object__name(const struct bpf_object* obj); - -/** - * @brief Get the next map for a given eBPF object. - * - * @param[in] obj Object with maps. - * @param[in] map Previous map. - * - * @returns Next map, or NULL if none. - * - * @sa bpf_object__prev_map - */ -struct bpf_map* -bpf_object__next_map(const struct bpf_object* obj, const struct bpf_map* map); - -/** - * @brief Get the next program for a given eBPF object. - * - * @param[in] obj Object with programs. - * @param[in] prog Previous program, or NULL to get the first program. - * - * @returns Next program, or NULL if none. - * - * @sa bpf_object__prev_program - */ -struct bpf_program* -bpf_object__next_program(const struct bpf_object* obj, struct bpf_program* prog); - -/** - * @brief Open a file without loading the programs. - * - * @param[in] path File name to open. - * - * @returns Pointer to an eBPF object, or NULL on failure. - */ -struct bpf_object* -bpf_object__open(const char* path); - -/** - * @brief Open a file without loading the programs. - * - * @param[in] path File name to open. - * @param[opts] opts Options to use when opening the object. - * - * @returns Pointer to an eBPF object, or NULL on failure. - */ -struct bpf_object* -bpf_object__open_file(const char* path, const struct bpf_object_open_opts* opts); - -/** - * @brief Pin an eBPF object to a specified path. - * - * @param[in] object Object to pin. - * @param[in] path Path to pin the object to. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EBUSY Something is already pinned to the specified path. - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - * - * @sa bpf_object__pin_maps - * @sa bpf_object__pin_programs - * @sa bpf_object__unpin_maps - * @sa bpf_object__unpin_programs - */ -int -bpf_object__pin(struct bpf_object* object, const char* path); - -/** - * @brief Pin all maps associated with an eBPF object to a specified path. - * - * @param[in] obj Object to pin maps of. - * @param[in] path Path to pin the maps to. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EBUSY Something is already pinned to the specified path. - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - * - * @sa bpf_map__pin - * @sa bpf_object__pin - * @sa bpf_object__unpin_maps - */ -int -bpf_object__pin_maps(struct bpf_object* obj, const char* path); - -/** - * @brief Pin all programs associated with an eBPF object to a specified path. - * - * @param[in] obj Object to pin programs of. - * @param[in] path Path to pin the programs to. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EBUSY Something is already pinned to the specified path. - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - * - * @sa bpf_program__pin - * @sa bpf_object__pin - * @sa bpf_object__unpin_programs - */ -int -bpf_object__pin_programs(struct bpf_object* obj, const char* path); - -/** - * @brief Get the previous map for a given eBPF object. - * - * @param[in] obj Object with maps. - * @param[in] map Next map. - * - * @returns Previous map, or NULL if none. - * - * @sa bpf_object__next_map - */ -struct bpf_map* -bpf_object__prev_map(const struct bpf_object* obj, const struct bpf_map* map); - -/** - * @brief Get the previous eBPF program for a given eBPF object. - * - * @param[in] obj Object with programs. - * @param[in] prog Next program. - * - * @returns Previous eBPF program, or NULL if none. - * - * @sa bpf_object__next_program - */ -struct bpf_program* -bpf_object__prev_program(const struct bpf_object* obj, struct bpf_program* prog); - -/** - * @brief Unpin all maps associated with an eBPF object from a specified path. - * - * @param[in] obj Object to unpin maps of. - * @param[in] path Path from which to unpin the maps. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * - * @sa bpf_map__upnin - * @sa bpf_object__pin_maps - * @sa bpf_object__unpin - */ -int -bpf_object__unpin_maps(struct bpf_object* obj, const char* path); - -/** - * @brief Unpin all programs associated with an eBPF object from a specified path. - * - * @param[in] obj Object to unpin programs of. - * @param[in] path Path from which to unpin the programs. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * - * @sa bpf_program__unpin - * @sa bpf_object__pin_mprograms - * @sa bpf_object__unpin - */ -int -bpf_object__unpin_programs(struct bpf_object* obj, const char* path); - -/** @} */ - -/** - * @name Program-related functions - * @{ - */ - -/** - * @brief Attach an eBPF program to a hook associated with the program's expected attach type. - * - * @param[in] prog The program to attach. - * - * @returns The link created. On error, returns NULL and sets errno. - * - * @sa bpf_link__destroy - * @sa bpf_program__get_expected_attach_type - * @sa bpf_program__set_expected_attach_type - * @sa ebpf_link_close - */ -struct bpf_link* -bpf_program__attach(const struct bpf_program* prog); - -/** - * @brief Attach an eBPF program to an XDP hook. - * - * @param[in] prog The program to attach. - * @param[in] ifindex The interface index to attach to. - * - * @returns The link created. On error, returns NULL and sets errno. - * - * @sa bpf_link__destroy - * @sa bpf_program__attach - * @sa ebpf_link_close - */ -struct bpf_link* -bpf_program__attach_xdp(struct bpf_program* prog, int ifindex); - -/** - * @brief Attach an eBPF program to an attach point. - * - * @param[in] prog_fd File descriptor of the program to attach. - * @param[in] attachable_fd File descriptor corresponding to the attach point. - * @param[in] type Attach type. - * @param[in] flags Flags (currently 0). - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - */ -int -bpf_prog_attach(int prog_fd, int attachable_fd, enum bpf_attach_type type, unsigned int flags); - -/** - * @brief Detach eBPF program(s) from an attach point. - * - * @param[in] attachable_fd File descriptor corresponding to the attach point. - * @param[in] type Attach type. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - */ -int -bpf_prog_detach(int attachable_fd, enum bpf_attach_type type); - -/** - * @brief Detach an eBPF program from an attach point. - * - * @param[in] prog_fd File descriptor of the program to detach. - * @param[in] attachable_fd File descriptor corresponding to the attach point. - * @param[in] type Attach type. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - */ -int -bpf_prog_detach2(int prog_fd, int attachable_fd, enum bpf_attach_type type); - -/** - * @brief Get a file descriptor that refers to a program. - * - * @param[in] prog Program to get a file descriptor for. - * - * @returns File descriptor that refers to the program. - * The caller should not call _close() on the fd. - */ -int -bpf_program__fd(const struct bpf_program* prog); - -/** - * @brief Get the expected attach type for an eBPF program. - * - * @param[in] prog Program to check. - * - * @returns Expected attach type. - * - * @sa bpf_program__attach - * @sa bpf_program__set_expected_attach_type - */ -enum bpf_attach_type -bpf_program__get_expected_attach_type(const struct bpf_program* prog); - -/** - * @brief Get the program type for an eBPF program. - * - * @param[in] prog Program to check. - * - * @returns Program type. - * - * @deprecated Use bpf_program__type() instead. - * - * @sa bpf_program__get_expected_attach_type - * @sa bpf_program__type - */ -enum bpf_prog_type -bpf_program__get_type(const struct bpf_program* prog); - -/** - * @brief **bpf_program__insn_cnt()** returns number of `struct bpf_insn`'s - * that form specified BPF program. - * - * @param[in] prog BPF program for which to return number of BPF instructions - * - * @returns Number of instructions. - */ -size_t -bpf_program__insn_cnt(const struct bpf_program* prog); - -/** - * @brief Get the function name of an eBPF program. - * - * @param[in] prog Program to check. - * - * @returns The name of the program, which is the name of the main - * function called when invoked. - * - * @sa bpf_object__find_program_by_name - */ -const char* -bpf_program__name(const struct bpf_program* prog); - -/** - * @brief Pin a program to a specified path. - * - * @param[in] prog Program to pin. - * @param[in] path Path to pin the program to. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EBUSY A pin path was previously specified. - * @exception EEXIST Something is already pinned to the specified path. - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - * - * @sa bpf_object__pin - * @sa bpf_object__pin_programs - * @sa bpf_program__unpin - */ -int -bpf_program__pin(struct bpf_program* prog, const char* path); - -/** - * @brief Gets the ELF section name of an eBPF program, if any. - * - * @param[in] prog An eBPF program. - * - * @returns The ELF section name of an eBPF program, or NULL if none. - */ -const char* -bpf_program__section_name(const struct bpf_program* prog); - -/** - * @brief Set the expected attach type for an eBPF program. - * - * @param[in] prog Program to update. - * @param[in] type Attach type to set. - * - * @sa bpf_program__attach - * @sa bpf_program__get_expected_attach_type - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - */ -int -bpf_program__set_expected_attach_type(struct bpf_program* prog, enum bpf_attach_type type); - -/** - * @brief Set the program type for an eBPF program. - * - * @param[in] prog Program to update. - * @param[in] type Program type to set. - * - * @sa bpf_program__set_expected_attach_type - * @sa bpf_program__type - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - */ -int -bpf_program__set_type(struct bpf_program* prog, enum bpf_prog_type type); - -/** - * @brief Get the program type for an eBPF program. - * - * @param[in] prog Program to check. - * - * @returns Program type. - * - * @sa bpf_program__get_expected_attach_type - */ -enum bpf_prog_type -bpf_program__type(const struct bpf_program* prog); - -/** - * @brief Unload a program. - * - * @param[in] prog Program to unload. - * - * @sa bpf_object__unload - * @sa bpf_prog_load - */ -void -bpf_program__unload(struct bpf_program* prog); - -/** - * @brief Unpin a program. - * - * @param[in] prog Program to unpin. - * @param[in] path Path from which to unpin the program. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @exception EINVAL An invalid argument was provided. - * @exception ENOENT The program was not pinned. - * - * @sa bpf_object__unpin_programs - * @sa bpf_program__pin - */ -int -bpf_program__unpin(struct bpf_program* prog, const char* path); - -/** - * @brief Attach an XDP program to a given interface. - * - * @param[in] ifindex The interface index to attach to, or -1 to detach. - * @param[in] prog_fd File descriptor of program to attach. - * @param[in] flags Flags. Use XDP_FLAGS_REPLACE to replace any program previously attached to - * the specified interface index. - * @param[in] opts Options (currently unused). - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @sa bpf_program__attach_xdp - * @sa bpf_xdp_detach - */ -int -bpf_xdp_attach(int ifindex, int prog_fd, __u32 flags, const struct bpf_xdp_attach_opts* opts); - -/** - * @brief Detach an XDP program from a given interface. - * - * @param[in] ifindex The interface index to detach from. - * @param[in] prog_fd File descriptor of program to detach. - * @param[in] flags Flags. Use XDP_FLAGS_REPLACE to detach any program previously attached to - * the specified interface index. - * @param[in] opts Options (currently unused). - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @sa bpf_link_detach - * @sa bpf_program__attach_xdp - * @sa bpf_xdp_attach - */ -int -bpf_xdp_detach(int ifindex, __u32 flags, const struct bpf_xdp_attach_opts* opts); - -/** - * @brief Get the XDP program id attached to a given interface index. - * - * @param[in] ifindex The interface index to query. - * @param[in] flags Flags (currently 0). - * @param[out] prog_id The ID of the program attached. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @sa bpf_xdp_attach - */ -int -bpf_xdp_query_id(int ifindex, int flags, __u32* prog_id); - -/** - * @brief **libbpf_attach_type_by_name()** converts the provided textual - * representation into an attach type value. - * - * @param[in] name The textual representation of an attach type. - * @param[out] attach_type Returns the attach type. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - */ -int -libbpf_attach_type_by_name(const char* name, enum bpf_attach_type* attach_type); - -/** - * @brief **libbpf_bpf_attach_type_str()** converts the provided attach type - * value into a textual representation. - * - * @param[in] t The attach type. - * - * @return Pointer to a static string identifying the attach type. NULL is - * returned for unknown **bpf_attach_type** values. - */ -const char* -libbpf_bpf_attach_type_str(enum bpf_attach_type t); - -/** - * @brief **libbpf_bpf_prog_type_str()** converts the provided program type - * value into a textual representation. - * - * @param[in] t The program type. - * - * @return Pointer to a static string identifying the program type. NULL is - * returned for unknown **bpf_prog_type** values. - */ -const char* -libbpf_bpf_prog_type_str(enum bpf_prog_type t); - -/** - * @brief Get a program type and expected attach type by name. - * - * @param[in] name Name, as if it were a section name in an ELF file. - * @param[out] prog_type Program type. - * @param[out] expected_attach_type Expected attach type. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - */ -int -libbpf_prog_type_by_name(const char* name, enum bpf_prog_type* prog_type, enum bpf_attach_type* expected_attach_type); - -/** @} */ - -/** - * @name System-related functions - * @{ - */ - -/** - * @brief Get a negative error code based on errno and a possibly null pointer. - * - * @param[in] ptr Pointer that may be NULL. - * - * @returns Negative error code. - */ -long -libbpf_get_error(const void* ptr); - -/** - * @brief Get an error message. - * - * @param[in] err Error number. - * @param[out] buf Pointer to buffer to write message into. - * @param[in] size Size of output buffer. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - */ -int -libbpf_strerror(int err, char* buf, size_t size); - -/** - * @brief Get the number of processors on the current system. - * - * @returns Number of processors. - */ -int -libbpf_num_possible_cpus(void); - -/* Ring buffer APIs */ - -/** - * @brief Creates a new ring buffer manager. - * - * @param[in] map_fd File descriptor to ring buffer map. - * @param[in] sample_cb Pointer to ring buffer notification callback function. - * @param[in] ctx Pointer to sample_cb callback function. - * @param[in] opts Ring buffer options. - * - * @returns Pointer to ring buffer manager. - */ -struct ring_buffer* -ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void* ctx, const struct ring_buffer_opts* opts); - -/** - * @brief Frees a new ring buffer manager. - * - * @param[in] rb Pointer to ring buffer to be freed. - * - */ -void -ring_buffer__free(struct ring_buffer* rb); -/** @} */ - -#else -#pragma warning(push) -#pragma warning(disable : 4200) // Zero-sized array in struct/union -#pragma warning(disable : 4201) // Zero-sized array in struct/union -#include "libbpf/src/libbpf.h" -#pragma warning(pop) -#endif -#include "libbpf_legacy.h" diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/libbpf_legacy.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/libbpf_legacy.h deleted file mode 100644 index e318b31..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf/libbpf_legacy.h +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -/** - * @name Link-related functions - * @{ - */ - -/** - * @brief Attach an XDP program to a given interface. - * - * @param[in] ifindex The interface index to attach to, or -1 to detach. - * @param[in] fd File descriptor of program to attach. - * @param[in] flags Flags. Use XDP_FLAGS_REPLACE to replace any program previously attached to - * the specified interface index. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @deprecated Use bpf_xdp_attach() instead. - * - * @sa bpf_program__attach_xdp - * @sa bpf_xdp_attach - * @sa bpf_xdp_detach - */ -__declspec(deprecated("Use bpf_xdp_attach() instead.")) int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags); - -/** @} */ - -/** - * @name Map-related functions - * @{ - */ - -/** - * @brief Get the next map for a given eBPF object. - * - * @param[in] map Previous map. - * @param[in] obj Object with maps. - * - * @returns Next map, or NULL if none. - * - * @deprecated Use bpf_object__next_map() instead. - * - * @sa bpf_map__prev - */ -__declspec(deprecated("Use bpf_object__next_map() instead.")) struct bpf_map* bpf_map__next( - const struct bpf_map* map, const struct bpf_object* obj); - -/** - * @brief Get the previous map for a given eBPF object. - * - * @param[in] map Next map. - * @param[in] obj Object with maps. - * - * @returns Previous map, or NULL if none. - * - * @deprecated Use bpf_object__prev_map() instead. - * - * @sa bpf_map__next - */ -__declspec(deprecated("Use bpf_object__prev_map() instead.")) struct bpf_map* bpf_map__prev( - const struct bpf_map* map, const struct bpf_object* obj); - -/** @} */ - -/** - * @name Object-related functions - * @{ - */ - -struct bpf_object_load_attr -{ - struct bpf_object* obj; - int log_level; - const char* target_btf_path; -}; - -/** - * @brief Load all the programs in a given object. - * - * @param[in] attr Structure with load attributes. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @deprecated Use bpf_object__load() instead. - * - * @exception EINVAL An invalid argument was provided. - * @exception ENOMEM Out of memory. - * - * @sa bpf_object__open - * @sa bpf_object__load_xattr - * @sa bpf_prog_load - */ -__declspec(deprecated("Use bpf_object__load() instead.")) int bpf_object__load_xattr(struct bpf_object_load_attr* attr); - -/** - * @brief Get the next eBPF object opened by the calling process. - * - * @param[in] prev Previous object, or NULL to get the first object. - * - * @returns Next object, or NULL if none. - * - * @deprecated Track bpf_objects in application code instead. - */ -__declspec(deprecated("Track bpf_objects in application code instead.")) struct bpf_object* bpf_object__next( - struct bpf_object* prev); - -#define bpf_object__for_each_safe(pos, tmp) \ - for ((pos) = bpf_object__next(NULL), (tmp) = bpf_object__next(pos); (pos) != NULL; \ - (pos) = (tmp), (tmp) = bpf_object__next(tmp)) - -/** - * @brief Unload all the programs in a given object. - * - * @param[in] obj Object with programs to be unloaded. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @deprecated Use bpf_object__close() instead. - * - * @sa bpf_object__load - * @sa bpf_object__load_xattr - * @sa bpf_prog_load - */ -__declspec(deprecated("Use bpf_object__close() instead.")) int bpf_object__unload(struct bpf_object* obj); - -/** @} */ - -/** - * @name Program-related functions - * @{ - */ - -/** - * @brief Load (but do not attach) eBPF maps and programs from an ELF file. - * - * @param[in] file Path name to an ELF file. - * @param[in] type Program type to use for loading eBPF programs. If BPF_PROG_TYPE_UNKNOWN, - * the program type is derived from the section prefix in the ELF file. - * @param[out] pobj Pointer to where to store the eBPF object loaded. The caller - * is expected to call bpf_object__close() to free the object. - * @param[out] prog_fd Returns a file descriptor for the first program. - * The caller should not call _close() on the fd, but should instead use - * bpf_object__close() on the object returned. - * - * @retval 0 The operation was successful. - * @retval <0 An error occured, and errno was set. - * - * @deprecated Use bpf_object__open() and bpf_object__load() instead. - * - * @exception EACCES The program failed verification. - * @exception EINVAL One or more parameters are incorrect. - * @exception ENOMEM Out of memory. - * - * @sa bpf_load_program - * @sa bpf_load_program_xattr - * @sa bpf_object__close - * @sa bpf_program__attach - */ -int -bpf_prog_load_deprecated(const char* file, enum bpf_prog_type type, struct bpf_object** pobj, int* prog_fd); - -/** - * @brief Get the next program for a given eBPF object. - * - * @param[in] prog Previous program, or NULL to get the first program. - * @param[in] obj Object with programs. - * - * @returns Next program, or NULL if none. - * - * @deprecated Use bpf_object__next_program() instead. - * - * @sa bpf_program__prev - */ -__declspec(deprecated("Use bpf_object__next_program() instead.")) struct bpf_program* bpf_program__next( - struct bpf_program* prog, const struct bpf_object* obj); - -/** - * @brief Get the previous eBPF program for a given eBPF object. - * - * @param[in] prog Next program. - * @param[in] obj Object with programs. - * - * @returns Previous eBPF program, or NULL if none. - * - * @deprecated Use bpf_object__prev_program() instead. - * - * @sa bpf_program__next - */ -__declspec(deprecated("Use bpf_object__prev_program() instead.")) struct bpf_program* bpf_program__prev( - struct bpf_program* prog, const struct bpf_object* obj); - -/** - * @brief Get the eBPF program size in bytes. - * - * @param[in] prog Program. - * - * @returns Program size in bytes. - * - * @deprecated Use bpf_program__insn_cnt() instead. - */ -__declspec(deprecated("Use bpf_program__insn_cnt() instead.")) size_t bpf_program__size(const struct bpf_program* prog); - -/** @} */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf2c.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf2c.h deleted file mode 100644 index 7c75548..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf2c.h +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#pragma once -#if defined(NO_CRT) -typedef signed char int8_t; -typedef short int16_t; -typedef int int32_t; -typedef long long int64_t; -typedef unsigned char uint8_t; -typedef unsigned short uint16_t; -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; -#define bool _Bool -#define false 0 -#define true 1 -#define UINT32_MAX ((uint32_t)0xFFFFFFFF) - -#else -#include -#include -#include -#endif - -#include "ebpf_structs.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define UBPF_STACK_SIZE 512 - -#define IMMEDIATE(X) (int32_t) X -#define OFFSET(X) (int16_t) X -#define POINTER(X) (uint64_t)(X) - -#if !defined(htobe16) -#define htobe16(X) swap16(X) -#define htobe32(X) swap32(X) -#define htobe64(X) swap64(X) - -#define htole16(X) (X) -#define htole32(X) (X) -#define htole64(X) (X) -#endif - - typedef struct _helper_function_entry - { - uint64_t (*address)(uint64_t r1, uint64_t r2, uint64_t r3, uint64_t r4, uint64_t r5); - uint32_t helper_id; - const char* name; - bool tail_call; - } helper_function_entry_t; - - typedef struct _map_entry - { - void* address; - ebpf_map_definition_in_file_t definition; - const char* name; - } map_entry_t; - - typedef struct _program_entry - { - // DLLs put the strings into the same section, so add a marker - // at the start of a program entry to make it easy to find - // entries in the programs section. - uint64_t zero; - - uint64_t (*function)(void*); - const char* pe_section_name; - const char* section_name; - const char* program_name; - uint16_t* referenced_map_indices; - uint16_t referenced_map_count; - helper_function_entry_t* helpers; - uint16_t helper_count; - size_t bpf_instruction_count; - ebpf_program_type_t* program_type; - ebpf_attach_type_t* expected_attach_type; - } program_entry_t; - - typedef struct _metadata_table - { - void (*programs)(_Outptr_result_buffer_maybenull_(*count) program_entry_t** programs, _Out_ size_t* count); - void (*maps)(_Outptr_result_buffer_maybenull_(*count) map_entry_t** maps, _Out_ size_t* count); - void (*hash)(_Outptr_result_buffer_maybenull_(*size) uint8_t** hash, _Out_ size_t* size); - } metadata_table_t; - - inline uint16_t - swap16(uint16_t value) - { - return value << 8 | value >> 8; - } - - inline uint32_t - swap32(uint32_t value) - { - return swap16(value >> 16) | ((uint32_t)swap16(value & ((1 << 16) - 1))) << 16; - } - - inline uint64_t - swap64(uint64_t value) - { - return swap32(value >> 32) | ((uint64_t)swap32(value & ((1ull << 32ull) - 1))) << 32; - } - - void - division_by_zero(uint32_t address); - -#ifdef __cplusplus -} -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_endian.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_endian.h deleted file mode 100644 index e692c2a..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_endian.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -#include - -inline __attribute__((always_inline)) uint16_t -bpf_ntohs(uint16_t us) -{ - return us << 8 | us >> 8; -} - -#define bpf_htons(x) bpf_ntohs(x) - -#ifndef ntohs -#define ntohs bpf_ntohs -#endif -#ifndef htons -#define htons bpf_htons -#endif - -inline __attribute__((always_inline)) uint32_t -bpf_ntohl(uint32_t x) -{ - return ( - (((x) >> 24) & 0x000000FFL) | (((x) >> 8) & 0x0000FF00L) | (((x) << 8) & 0x00FF0000L) | - (((x) << 24) & 0xFF000000L)); -} - -#define bpf_htonl(x) bpf_ntohl(x) - -#ifndef ntohl -#define ntohl bpf_ntohl -#endif -#ifndef htonl -#define htonl bpf_htonl -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helper_defs.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helper_defs.h deleted file mode 100644 index 07c9d57..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helper_defs.h +++ /dev/null @@ -1,311 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -// This file contains APIs for global helpers that are exposed for -// use by all eBPF programs. Libbpf has bpf_helper_defs.h which is -// auto-generated but it's not platform-agnostic currently as it -// hard-codes the actual helper IDs. - -/** - * @brief Get a pointer to an entry in the map. - * - * @param[in] map Map to search. - * @param[in] key Key to use when searching map. - * @return Pointer to the value if found or NULL. - */ -EBPF_HELPER(void*, bpf_map_lookup_elem, (struct bpf_map * map, void* key)); -#ifndef __doxygen -#define bpf_map_lookup_elem ((bpf_map_lookup_elem_t)BPF_FUNC_map_lookup_elem) -#endif - -/** - * @brief Insert or update an entry in the map. - * - * @param[in] map Map to update. - * @param[in] key Key to use when searching and updating the map. - * @param[in] value Value to insert into the map. - * @param[in] flags Map flags. - * @retval EBPF_SUCCESS The operation was successful. - * @retval -EBPF_NO_MEMORY Unable to allocate resources for this - * entry. - */ -EBPF_HELPER(int64_t, bpf_map_update_elem, (struct bpf_map * map, void* key, void* value, uint64_t flags)); -#ifndef __doxygen -#define bpf_map_update_elem ((bpf_map_update_elem_t)BPF_FUNC_map_update_elem) -#endif - -/** - * @brief Remove an entry from the map. - * - * @param[in] map Map to update. - * @param[in] key Key to use when searching and updating the map. - * @retval EBPF_SUCCESS The operation was successful. - * @retval -EBPF_INVALID_ARGUMENT One or more parameters are invalid. - */ -EBPF_HELPER(int64_t, bpf_map_delete_elem, (struct bpf_map * map, void* key)); -#ifndef __doxygen -#define bpf_map_delete_elem ((bpf_map_delete_elem_t)BPF_FUNC_map_delete_elem) -#endif - -/** - * @brief Get a pointer to an entry in the map and erase that element. - * - * @param[in] map Map to search. - * @param[in] key Key to use when searching map. - * @return Pointer to the value if found or NULL. - */ -EBPF_HELPER(void*, bpf_map_lookup_and_delete_elem, (struct bpf_map * map, void* key)); -#ifndef __doxygen -#define bpf_map_lookup_and_delete_elem ((bpf_map_lookup_and_delete_elem_t)BPF_FUNC_map_lookup_and_delete_elem) -#endif - -/** - * @brief Perform a tail call into another eBPF program. - * - * @param[in] ctx Context to pass to the called program. - * @param[in] prog_array_map Map of program fds. - * @param[in] index Index in map of program to call. - * @retval EBPF_SUCCESS The operation was successful. - * @retval -EBPF_INVALID_ARGUMENT One or more parameters are invalid. - */ -EBPF_HELPER(int64_t, bpf_tail_call, (void* ctx, struct bpf_map* prog_array_map, uint32_t index)); -#ifndef __doxygen -#define bpf_tail_call ((bpf_tail_call_t)BPF_FUNC_tail_call) -#endif - -/** - * @brief Get a pseudo-random number. - * - * @return A random 32-bit unsigned value. - */ -EBPF_HELPER(uint32_t, bpf_get_prandom_u32, ()); -#ifndef __doxygen -#define bpf_get_prandom_u32 ((bpf_get_prandom_u32_t)BPF_FUNC_get_prandom_u32) -#endif - -/** - * @brief Return time elapsed since boot in nanoseconds including time while suspended. - * - * @return Time elapsed since boot in nanosecond units. - */ -EBPF_HELPER(uint64_t, bpf_ktime_get_boot_ns, ()); -#ifndef __doxygen -#define bpf_ktime_get_boot_ns ((bpf_ktime_get_boot_ns_t)BPF_FUNC_ktime_get_boot_ns) -#endif - -/** - * @brief Return SMP id of the processor running the program. - * - * @return SMP id of the processor running the program. - */ -EBPF_HELPER(uint64_t, bpf_get_smp_processor_id, ()); -#ifndef __doxygen -#define bpf_get_smp_processor_id ((bpf_get_smp_processor_id_t)BPF_FUNC_get_smp_processor_id) -#endif - -/** - * @brief Return time elapsed since boot in nanoseconds excluding time while suspended. - * - * @return Time elapsed since boot in nanosecond units. - */ -EBPF_HELPER(uint64_t, bpf_ktime_get_ns, ()); -#ifndef __doxygen -#define bpf_ktime_get_ns ((bpf_ktime_get_ns_t)BPF_FUNC_ktime_get_ns) -#endif - -/** - * @brief Computes difference of checksum values for two input raw buffers using 1's complement arithmetic. - * - * @param[in] from Pointer to first raw buffer. - * @param[in] from_size Length of the "from" buffer. Must be a multiple of 4. - * @param[in] to Pointer to the second raw buffer, whose checksum will be subtracted from that of the "from" buffer. - * @param[in] to_size Length of the "to" buffer. Must be a multiple of 4. - * @param[in] seed An optional integer that can be added to the value, which can be used to carry result of a previous - * csum_diff operation. - * - * @returns The checksum delta on success, or <0 on failure. - */ -EBPF_HELPER(int, bpf_csum_diff, (void* from, int from_size, void* to, int to_size, int seed)); -#ifndef __doxygen -#define bpf_csum_diff ((bpf_csum_diff_t)BPF_FUNC_csum_diff) -#endif - -/** - * @brief Copy data into the ring buffer map. - * - * @param[in,out] map Pointer to ring buffer map. - * @param[in] data Data to copy into ring buffer map. - * @param[in] size Length of data. - * @param[in] flags Flags indicating if notification for new data availability should be sent. - * @returns 0 on success and a negative value on error. - */ -EBPF_HELPER(int, bpf_ringbuf_output, (struct bpf_map * ring_buffer, void* data, uint64_t size, uint64_t flags)); -#ifndef __doxygen -#define bpf_ringbuf_output ((bpf_ringbuf_output_t)BPF_FUNC_ringbuf_output) -#endif - -/** - * @brief Print debug output. - * - * @param[in] fmt Printf-style format string. - * @param[in] fmt_size Size in bytes of *fmt*. - * - * @returns The number of bytes written, or a negative error in case of failure. - */ -EBPF_HELPER(long, bpf_trace_printk2, (const char* fmt, uint32_t fmt_size)); -#ifndef __doxygen -#define bpf_trace_printk2 ((bpf_trace_printk2_t)BPF_FUNC_trace_printk2) -#endif - -/** - * @brief Print debug output. - * - * @param[in] fmt Printf-style format string. - * @param[in] fmt_size Size in bytes of *fmt*. - * @param[in] arg3 Numeric argument to be used by the format string. - * - * @returns The number of bytes written, or a negative error in case of failure. - */ -EBPF_HELPER(long, bpf_trace_printk3, (const char* fmt, uint32_t fmt_size, uint64_t arg3)); -#ifndef __doxygen -#define bpf_trace_printk3 ((bpf_trace_printk3_t)BPF_FUNC_trace_printk3) -#endif - -/** - * @brief Print debug output. - * - * @param[in] fmt Printf-style format string. - * @param[in] fmt_size Size in bytes of *fmt*. - * @param[in] arg3 Numeric argument to be used by the format string. - * @param[in] arg4 Numeric argument to be used by the format string. - * - * @returns The number of bytes written, or a negative error in case of failure. - */ -EBPF_HELPER(long, bpf_trace_printk4, (const char* fmt, uint32_t fmt_size, uint64_t arg3, uint64_t arg4)); -#ifndef __doxygen -#define bpf_trace_printk4 ((bpf_trace_printk4_t)BPF_FUNC_trace_printk4) -#endif - -/** - * @brief Print debug output. - * - * @param[in] fmt Printf-style format string. - * @param[in] fmt_size Size in bytes of *fmt*. - * @param[in] arg3 Numeric argument to be used by the format string. - * @param[in] arg4 Numeric argument to be used by the format string. - * @param[in] arg5 Numeric argument to be used by the format string. - * - * @returns The number of bytes written, or a negative error in case of failure. - */ -EBPF_HELPER(long, bpf_trace_printk5, (const char* fmt, uint32_t fmt_size, uint64_t arg3, uint64_t arg4, uint64_t arg5)); -#ifndef __doxygen -#define bpf_trace_printk5 ((bpf_trace_printk5_t)BPF_FUNC_trace_printk5) -#endif - -#ifndef __doxygen -// The following macros allow bpf_printk to accept a variable number of arguments -// while mapping to separate helper functions that each have a strict prototype -// that can be understood by the verifier. -#define EBPF_CONCATENATE(X, Y) X##Y -#define EBPF_MAKE_HELPER_NAME(PREFIX, ARG_COUNT) EBPF_CONCATENATE(PREFIX, ARG_COUNT) -#define EBPF_GET_NTH_ARG(_1, _2, _3, _4, _5, N, ...) N -#define EBPF_COUNT_VA_ARGS(...) EBPF_GET_NTH_ARG(__VA_ARGS__, 5, 4, 3, 2, 1) -#define EBPF_VA_ARGS_HELPER(PREFIX, ...) EBPF_MAKE_HELPER_NAME(PREFIX, EBPF_COUNT_VA_ARGS(__VA_ARGS__))(__VA_ARGS__) - -#undef bpf_trace_printk -#define bpf_trace_printk(fmt, size, ...) ({ EBPF_VA_ARGS_HELPER(bpf_trace_printk, fmt, size, ##__VA_ARGS__); }) -#else -/** - * @brief Print debug output. For instructions on viewing the output, see the - * Using - * tracing section of the Getting Started Guide for eBPF for Windows. - * - * @param[in] fmt Printf-style format string. - * @param[in] size Size in bytes of the format string. - * @param[in] ... Numeric arguments to be used by the format string. - * - * @returns The number of bytes written, or a negative error in case of failure. - */ -long -bpf_trace_printk(const char* fmt, uint32_t size, ...); -#endif - -#ifndef __doxygen -#undef bpf_printk -#define bpf_printk(fmt, ...) \ - ({ \ - char ____fmt[] = fmt; \ - bpf_trace_printk(____fmt, sizeof(____fmt), ##__VA_ARGS__); \ - }) -#else -/** - * @brief Print debug output. For instructions on viewing the output, see the - * Using - * tracing section of the Getting Started Guide for eBPF for Windows. - * - * @param[in] fmt Printf-style format string. - * @param[in] ... Numeric arguments to be used by the format string. - * - * @returns The number of bytes written, or a negative error in case of failure. - */ -long -bpf_printk(const char* fmt, ...); -#endif - -/** - * @brief Insert an element at the end of the map (only valid for stack and queue). - * - * @param[in] map Map to update. - * @param[in] value Value to insert into the map. - * @param[in] flags Map flags - BPF_EXIST: If the map is full, the entry at the start of the map is discarded. - * @retval EBPF_SUCCESS The operation was successful. - * @retval -EBPF_NO_MEMORY Unable to allocate resources for this - * entry. - * @retval -EBPF_OUT_OF_SPACE Map is full and BPF_EXIST was not supplied. - */ -EBPF_HELPER(int64_t, bpf_map_push_elem, (struct bpf_map * map, void* value, uint64_t flags)); -#ifndef __doxygen -#define bpf_map_push_elem ((bpf_map_push_elem_t)BPF_FUNC_map_push_elem) -#endif - -/** - * @brief Copy an entry from the map and remove it from the map (only valid for stack and queue). - * Queue pops from the beginning of the map. - * Stack pops from the end of the map. - * - * @param[in] map Map to search. - * @param[out] value Value buffer to copy value from map into. - * @retval EBPF_SUCCESS The operation was successful. - * @retval -EBPF_OBJECT_NOT_FOUND The map is empty. - */ -EBPF_HELPER(int64_t, bpf_map_pop_elem, (struct bpf_map * map, void* value)); -#ifndef __doxygen -#define bpf_map_pop_elem ((bpf_map_pop_elem_t)BPF_FUNC_map_pop_elem) -#endif - -/** - * @brief Copy an entry from the map (only valid for stack and queue). - * Queue peeks at the beginning of the map. - * Stack peeks at the end of the map. - * - * @param[in] map Map to search. - * @param[out] value Value buffer to copy value from map into. - * @retval EBPF_SUCCESS The operation was successful. - * @retval -EBPF_OBJECT_NOT_FOUND The map is empty. - */ -EBPF_HELPER(int64_t, bpf_map_peek_elem, (struct bpf_map * map, void* value)); -#ifndef __doxygen -#define bpf_map_peek_elem ((bpf_map_pop_elem_t)BPF_FUNC_map_peek_elem) -#endif - -/** - * @brief Get the current thread ID (PID) and process ID (TGID). - * - * @returns A 64-bit integer containing the current process ID and - * thread ID, and created as such: (process ID << 32) | (thread ID). - */ -EBPF_HELPER(uint64_t, bpf_get_current_pid_tgid, ()); -#ifndef __doxygen -#define bpf_get_current_pid_tgid ((bpf_get_current_pid_tgid_t)BPF_FUNC_get_current_pid_tgid) -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helpers.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helpers.h deleted file mode 100644 index 8e00cd1..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helpers.h +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -// On Linux, including the bpf_helpers.h in libbpf must be done after including -// a platform-specific include file such as vmlinux.h or linux/types.h which makes -// it not quite platform-agnostic today. We hope this to change in the future -// once libbpf itself becomes cross-platform (issue #351). In the meantime, -// this version of bpf_helpers.h is already cross-platform. - -// Include platform-specific definitions. -#include "ebpf_structs.h" -#include "bpf_helpers_platform.h" - -// If we're compiling an actual eBPF program, then include -// libbpf's bpf_helpers.h for the rest of the platform-agnostic -// defines. -#ifndef _MSC_VER -#include "libbpf/src/bpf_helpers.h" -#define bpf_map_def _ebpf_map_definition_in_file -#include "ebpf_nethooks.h" -#endif - -#ifndef __doxygen -#define EBPF_HELPER(return_type, name, args) typedef return_type(*name##_t) args -#endif - -#include "bpf_helper_defs.h" - -#define MAX_TAIL_CALL_CNT 32 diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helpers_platform.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helpers_platform.h deleted file mode 100644 index 2f369e8..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/bpf_helpers_platform.h +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -// This file contains platform-specific defines used by eBPF programs. - -// For eBPF programs, struct bpf_map means struct _ebpf_map_definition_in_file, -// since they use inner_map_idx and pass pointers to such structures to the various -// map APIs. -#define bpf_map _ebpf_map_definition_in_file - -// Type aliases used by libbpf headers. -typedef int32_t __s32; -typedef int64_t __s64; -typedef uint16_t __be16; -typedef uint16_t __u16; -typedef uint32_t __be32; -typedef uint32_t __u32; -typedef uint32_t __wsum; -typedef uint64_t __u64; diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_api.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_api.h deleted file mode 100644 index 125ece3..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_api.h +++ /dev/null @@ -1,418 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#include -#include "ebpf_core_structs.h" -#include "ebpf_execution_type.h" -#include "ebpf_program_attach_type_guids.h" -#include "ebpf_result.h" - -#ifdef __cplusplus -#include -#define EBPF_NO_EXCEPT noexcept -extern "C" -{ -#else -#define EBPF_NO_EXCEPT -#endif - - typedef int32_t fd_t; - extern __declspec(selectany) const fd_t ebpf_fd_invalid = -1; - typedef intptr_t ebpf_handle_t; - - struct bpf_object; - struct bpf_program; - struct bpf_map; - struct bpf_link; - - /** - * @brief Query info about an eBPF program. - * @param[in] fd File descriptor of an eBPF program. - * @param[out] execution_type On success, contains the execution type. - * @param[out] file_name On success, contains the file name. - * @param[out] section_name On success, contains the section name. - * @retval EBPF_SUCCESS The operation was successful. - */ - ebpf_result_t - ebpf_program_query_info( - fd_t fd, - _Out_ ebpf_execution_type_t* execution_type, - _Outptr_result_z_ const char** file_name, - _Outptr_result_z_ const char** section_name); - - typedef struct _ebpf_stat - { - struct _ebpf_stat* next; - _Field_z_ const char* key; - int value; - } ebpf_stat_t; - - typedef struct _ebpf_section_info - { - struct _ebpf_section_info* next; - _Field_z_ const char* section_name; - _Field_z_ const char* program_type_name; - _Field_z_ const char* program_name; - ebpf_program_type_t program_type; - ebpf_attach_type_t expected_attach_type; - size_t raw_data_size; - _Field_size_(raw_data_size) char* raw_data; - ebpf_stat_t* stats; - } ebpf_section_info_t; - - /** -- * @brief Get list of programs and stats in an eBPF file. -- * @param[in] file Name of file containing eBPF programs. -- * @param[in] verbose Obtain additional info about the programs. -- * @param[out] infos On success points to a list of eBPF programs. - * The caller is responsible for freeing the list via ebpf_free_sections(). -- * @param[out] error_message On failure points to a text description of -- * the error. - */ - ebpf_result_t - ebpf_enumerate_sections( - _In_z_ const char* file, - bool verbose, - _Outptr_result_maybenull_ ebpf_section_info_t** infos, - _Outptr_result_maybenull_z_ const char** error_message); - - /** - * @brief Free memory returned from \ref ebpf_enumerate_sections. - * @param[in] data Memory to free. - */ - void - ebpf_free_sections(_In_opt_ ebpf_section_info_t* infos); - - /** - * @brief Convert an eBPF program to human readable byte code. - * @param[in] file Name of ELF file containing eBPF program. - * @param[in] section The name of the section to query. - * @param[out] disassembly On success points text version of the program. - * @param[out] error_message On failure points to a text description of - * the error. - */ - uint32_t - ebpf_api_elf_disassemble_section( - _In_z_ const char* file, - _In_z_ const char* section, - _Outptr_result_maybenull_z_ const char** disassembly, - _Outptr_result_maybenull_z_ const char** error_message); - - typedef struct - { - int total_unreachable; - int total_warnings; - int max_instruction_count; - } ebpf_api_verifier_stats_t; - - /** - * @brief Verify that the program is safe to execute. - * @param[in] file Name of ELF file containing eBPF program. - * @param[in] section The name of the section to query. - * @param[in] program_type Optional program type. - * If NULL, the program type is derived from the section name. - * @param[in] verbose Obtain additional info about the programs. - * @param[out] report Points to a text section describing why the program - * failed verification. - * @param[out] error_message On failure points to a text description of - * the error. - * @param[out] stats If non-NULL, returns verification statistics. - * @retval 0 Verification succeeded. - * @retval 1 Verification failed. - */ - _Success_(return == 0) uint32_t ebpf_api_elf_verify_section_from_file( - _In_z_ const char* file, - _In_z_ const char* section, - _In_opt_ const ebpf_program_type_t* program_type, - bool verbose, - _Outptr_result_maybenull_z_ const char** report, - _Outptr_result_maybenull_z_ const char** error_message, - _Out_opt_ ebpf_api_verifier_stats_t* stats); - - /** - * @brief Verify that the program is safe to execute. - * @param[in] data Memory containing the ELF file containing eBPF program. - * @param[in] data_length Length of data. - * @param[in] section The name of the section to query. - * @param[in] program_type Optional program type. - * If NULL, the program type is derived from the section name. - * @param[in] verbose Obtain additional info about the programs. - * @param[out] report Points to a text section describing why the program - * failed verification. - * @param[out] error_message On failure points to a text description of - * the error. - * @param[out] stats If non-NULL, returns verification statistics. - * @retval 0 Verification succeeded. - * @retval 1 Verification failed. - */ - _Success_(return == 0) uint32_t ebpf_api_elf_verify_section_from_memory( - _In_reads_(data_length) const char* data, - size_t data_length, - _In_z_ const char* section, - _In_opt_ const ebpf_program_type_t* program_type, - bool verbose, - _Outptr_result_maybenull_z_ const char** report, - _Outptr_result_maybenull_z_ const char** error_message, - _Out_opt_ ebpf_api_verifier_stats_t* stats); - - /** - * @brief Free memory for a string returned from an eBPF API. - * @param[in] string Memory to free. - */ - void - ebpf_free_string(_In_opt_ _Post_invalid_ const char* string); - - /** - * @brief Dissociate a name with an object handle. - * @param[in] name Name to dissociate. - * @param[in] name_length Length in bytes of the name. - */ - uint32_t - ebpf_api_unpin_object(const uint8_t* name, uint32_t name_length); - - /** - * @brief Unpin the object from the specified path. - * @param[in] path Path from which to unpin. - * - * @retval EBPF_SUCCESS The operation was successful. - */ - ebpf_result_t - ebpf_object_unpin(_In_z_ const char* path); - - /** - * @brief Find a map given its associated name. - * @param[in] name Name to find. - * @param[in] name_length Length in bytes of name to find. - * @param[out] handle Pointer to memory that contains the map handle on success. - */ - uint32_t - ebpf_api_get_pinned_map(const uint8_t* name, uint32_t name_length, ebpf_handle_t* handle); - - /** - * @brief Detach the eBPF program from the link. - * - * @param[in] link_handle Handle to the link. - * - * @retval EBPF_SUCCESS The operations succeeded. - * @retval EBPF_INVALID_ARGUMENT The link handle is invalid. - */ - ebpf_result_t - ebpf_api_unlink_program(ebpf_handle_t link_handle); - - /** - * @brief Close an eBPF handle. - * - * @param[in] handle Handle to close. - * @retval EBPF_SUCCESS Handle was closed. - * @retval EBPF_INVALID_OBJECT Handle is not valid. - */ - ebpf_result_t - ebpf_api_close_handle(ebpf_handle_t handle); - - /** - * @brief Returns an array of \ref ebpf_map_info_t for all pinned maps. - * - * @param[out] map_count Number of pinned maps. - * @param[out] map_info Array of ebpf_map_info_t for pinned maps. - * - * @retval EBPF_SUCCESS The API suceeded. - * @retval EBPF_NO_MEMORY Out of memory. - * @retval EBPF_INVALID_ARGUMENT One or more parameters are wrong. - */ - ebpf_result_t - ebpf_api_get_pinned_map_info( - _Out_ uint16_t* map_count, _Outptr_result_buffer_maybenull_(*map_count) ebpf_map_info_t** map_info); - - /** - * @brief Helper Function to free array of \ref ebpf_map_info_t allocated by - * \ref ebpf_api_get_pinned_map_info function. - * - * @param[in] map_count Length of array to be freed. - * @param[in] map_info Map to be freed. - */ - void - ebpf_api_map_info_free( - uint16_t map_count, _In_opt_count_(map_count) _Post_ptr_invalid_ const ebpf_map_info_t* map_info); - - /** - * @brief Get the execution type for an eBPF object file. - * - * @param[in] object The eBPF object file. - * - * @returns Execution type. - */ - ebpf_execution_type_t - ebpf_object_get_execution_type(_In_ struct bpf_object* object); - - /** - * @brief Set the execution type for an eBPF object file. - * - * @param[in] object The eBPF object file. - * @param[in] execution_type Execution type to set. - * - * @retval EBPF_SUCCESS The operation was successful. - * @retval EBPF_INVALID_ARGUMENT One or more parameters are incorrect. - */ - ebpf_result_t - ebpf_object_set_execution_type(_In_ struct bpf_object* object, ebpf_execution_type_t execution_type); - - /** - * @brief Attach an eBPF program. - * - * @param[in] program Pointer to the eBPF program. - * @param[in] attach_type Optionally, the attach type for attaching the program. - * If attach type is not specified, then the earlier provided attach type - * or attach type derived from section prefix will be used to attach the - * program. - * @param[in] attach_params_size Size of the attach parameters. - * @param[in] attach_parameters Optionally, attach parameters. This is an - * opaque flat buffer containing the attach parameters which is interpreted - * by the extension provider. - * @param[out] link Pointer to ebpf_link structure. - * - * @retval EBPF_SUCCESS The operation was successful. - */ - ebpf_result_t - ebpf_program_attach( - _In_ const struct bpf_program* program, - _In_opt_ const ebpf_attach_type_t* attach_type, - _In_reads_bytes_opt_(attach_params_size) void* attach_parameters, - _In_ size_t attach_params_size, - _Outptr_ struct bpf_link** link); - - /** - * @brief Attach an eBPF program by program file descriptor. - * - * @param[in] program_fd An eBPF program file descriptor. - * @param[in] attach_type Optionally, the attach type for attaching the program. - * If attach type is not specified, then the earlier provided attach type - * or attach type derived from section prefix will be used to attach the - * program. - * @param[in] attach_parameters_size Size of the attach parameters. - * @param[in] attach_parameters Optionally, attach parameters. This is an - * opaque flat buffer containing the attach parameters which is interpreted - * by the extension provider. - * @param[out] link Pointer to ebpf_link structure. - * - * @retval EBPF_SUCCESS The operation was successful. - */ - ebpf_result_t - ebpf_program_attach_by_fd( - fd_t program_fd, - _In_opt_ const ebpf_attach_type_t* attach_type, - _In_reads_bytes_opt_(attach_parameters_size) void* attach_parameters, - _In_ size_t attach_parameters_size, - _Outptr_ struct bpf_link** link); - - /** - * @brief Detach an eBPF program from an attach point represented by - * the bpf_link structure. - * - * @param[in] link Pointer to bpf_link structure. - * - * @retval EBPF_SUCCESS The operation was successful. - * @retval EBPF_INVALID_OBJECT Invalid object was passed. - */ - ebpf_result_t - ebpf_link_detach(_In_ struct bpf_link* link); - - /** - * @brief Detach an eBPF program. - * - * @param[in] program_fd File descriptor of program to detach. If set to -1, - * this parameter is ignored. - * @param[in] attach_type The attach type for attaching the program. - * @param[in] attach_parameter_size Size of the attach parameter. - * @param[in] attach_parameter Pointer to attach parameter. This is an - * opaque flat buffer containing the attach parameters which is interpreted - * by the extension provider. - * @retval EBPF_SUCCESS The operation was successful. - * @retval EBPF_INVALID_OBJECT Invalid object was passed. - */ - ebpf_result_t - ebpf_program_detach( - fd_t program_fd, - _In_ const ebpf_attach_type_t* attach_type, - _In_reads_bytes_(attach_parameter_size) void* attach_parameter, - size_t attach_parameter_size) EBPF_NO_EXCEPT; - - /** - * Clean up and free bpf_link structure. Also close the - * underlying link fd. - * - * @param[in] link Pointer to the bpf_link structure. - * - * @retval EBPF_SUCCESS The operation was successful. - * @retval EBPF_INVALID_ARGUMENT Invalid argument was provided. - * - * @sa bpf_link__destroy - * @sa bpf_link_detach - */ - ebpf_result_t - ebpf_link_close(_In_ _Post_invalid_ struct bpf_link* link); - - /** - * @brief Close a file descriptor. Also close the underlying handle. - * @param [in] fd File descriptor to be closed. - * - * @retval EBPF_SUCCESS The operation was successful. - * @retval EBPF_INVALID_FD Invalid fd was provided. - */ - ebpf_result_t - ebpf_close_fd(fd_t fd); - - /** - * @brief Get eBPF program type and expected attach type by name. - * - * @param[in] name Name, as if it were a section name in an ELF file. - * @param[out] program_type eBPF program type. - * @param[out] expected_attach_type Expected eBPF attach type. - * - * @retval EBPF_SUCCESS The operation was successful. - * @retval EBPF_KEY_NOT_FOUND No program type was found. - */ - ebpf_result_t - ebpf_get_program_type_by_name( - _In_z_ const char* name, - _Out_ ebpf_program_type_t* program_type, - _Out_ ebpf_attach_type_t* expected_attach_type); - - /** - * @brief Get the name of a given program type. - * - * @param[in] program_type Program type. - * - * @returns Name of the program type, or NULL if not found. - */ - _Ret_maybenull_z_ const char* - ebpf_get_program_type_name(_In_ const ebpf_program_type_t* program_type); - - /** - * @brief Get the name of a given attach type. - * - * @param[in] attach_type Attach type. - * - * @returns Name of the attach type, or NULL if not found. - */ - _Ret_maybenull_z_ const char* - ebpf_get_attach_type_name(_In_ const ebpf_attach_type_t* attach_type); - - /** - * @brief Gets the next pinned program after a given path. - * - * @param[in] start_path Path to look for an entry greater than. - * @param[out] next_path Returns the next path, if one exists. - * - * @retval EBPF_SUCCESS The operation was successful. - * @retval EBPF_NO_MORE_KEYS No more entries found. - */ - ebpf_result_t - ebpf_get_next_pinned_program_path( - _In_z_ const char* start_path, _Out_writes_z_(EBPF_MAX_PIN_PATH_LENGTH) char* next_path); - -#ifdef __cplusplus -} -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_base.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_base.h deleted file mode 100644 index 8436a1d..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_base.h +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) Prevail Verifier contributors. -// SPDX-License-Identifier: MIT -#pragma once - -// This file contains type definitions that can be used in C or C++ -// that would typically be shared between the verifier and other -// eBPF components. - -typedef enum _ebpf_return_type { - EBPF_RETURN_TYPE_INTEGER = 0, - EBPF_RETURN_TYPE_PTR_TO_MAP_VALUE_OR_NULL, - EBPF_RETURN_TYPE_INTEGER_OR_NO_RETURN_IF_SUCCEED, - EBPF_RETURN_TYPE_UNSUPPORTED, -} ebpf_return_type_t; - -typedef enum _ebpf_argument_type { - EBPF_ARGUMENT_TYPE_DONTCARE = 0, - EBPF_ARGUMENT_TYPE_ANYTHING, // All values are valid, e.g., 64-bit flags. - EBPF_ARGUMENT_TYPE_CONST_SIZE, - EBPF_ARGUMENT_TYPE_CONST_SIZE_OR_ZERO, - EBPF_ARGUMENT_TYPE_PTR_TO_CTX, - EBPF_ARGUMENT_TYPE_PTR_TO_MAP, - EBPF_ARGUMENT_TYPE_PTR_TO_MAP_OF_PROGRAMS, - EBPF_ARGUMENT_TYPE_PTR_TO_MAP_KEY, - EBPF_ARGUMENT_TYPE_PTR_TO_MAP_VALUE, - EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM, // Memory must have been initialized. - EBPF_ARGUMENT_TYPE_PTR_TO_READABLE_MEM_OR_NULL, - EBPF_ARGUMENT_TYPE_PTR_TO_WRITABLE_MEM, - EBPF_ARGUMENT_TYPE_UNSUPPORTED, -} ebpf_argument_type_t; - - -// The following struct describes how to access the layout in -// memory of the data (e.g., the actual packet). -typedef struct _ebpf_context_descriptor { - int size; // Size of ctx struct. - int data; // Offset into ctx struct of pointer to data. - int end; // Offset into ctx struct of pointer to end of data. - int meta; // Offset into ctx struct of pointer to metadata. -} ebpf_context_descriptor_t; diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_core_structs.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_core_structs.h deleted file mode 100644 index db57d00..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_core_structs.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -// This file contains eBPF definitions common to eBPF core libraries as well as -// the eBPF API library. - -#pragma once - -#include -#include -#include "ebpf_structs.h" - -#define EBPF_MAX_PIN_PATH_LENGTH 256 - -/** - * @brief eBPF Map Information - */ -typedef struct _ebpf_map_info -{ - ebpf_map_definition_in_memory_t definition; - _Field_z_ char* pin_path; -} ebpf_map_info_t; - -typedef intptr_t ebpf_handle_t; -extern __declspec(selectany) const ebpf_handle_t ebpf_handle_invalid = (ebpf_handle_t)-1; - -typedef struct _ebpf_ring_buffer_map_async_query_result -{ - size_t producer; - size_t consumer; -} ebpf_ring_buffer_map_async_query_result_t; diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_execution_type.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_execution_type.h deleted file mode 100644 index 0a943d5..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_execution_type.h +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#pragma once - -#ifdef __cplusplus -extern "C" -{ -#endif - - typedef enum _ebpf_execution_type - { - EBPF_EXECUTION_ANY, ///< Execute in JIT-compiled or interpreted mode, per system policy. - EBPF_EXECUTION_JIT, ///< Execute in JIT-compiled mode. - EBPF_EXECUTION_INTERPRET, ///< Execute in interpreted mode. - EBPF_EXECUTION_NATIVE ///< Execute from native driver. - } ebpf_execution_type_t; - -#ifdef __cplusplus -} -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_extension_uuids.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_extension_uuids.h deleted file mode 100644 index 310b7b7..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_extension_uuids.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#include "ebpf_windows.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - /** @brief NPI ID for eBPF program information extension. - */ - /* 2934ad50-2154-44b6-9622-6c528c068411 */ - __declspec(selectany) GUID EBPF_PROGRAM_INFO_EXTENSION_IID = { - 0x2934ad50, 0x2154, 0x44b6, {0x96, 0x22, 0x6c, 0x52, 0x8c, 0x06, 0x84, 0x11}}; - - /** @brief NPI ID for eBPF hook extension. - */ - /* 5d564054-2736-406d-8b22-12bcffaf0a9f */ - __declspec(selectany) GUID EBPF_HOOK_EXTENSION_IID = { - 0x5d564054, 0x2736, 0x406d, {0x8b, 0x22, 0x12, 0xbc, 0xff, 0xaf, 0x0a, 0x9f}}; - -#ifdef __cplusplus -} -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_nethooks.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_nethooks.h deleted file mode 100644 index f3a3445..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_nethooks.h +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once -#include - -// This file contains APIs for hooks and helpers that are -// exposed by netebpfext.sys for use by eBPF programs. - -// XDP hook. We use "struct xdp_md" for cross-platform compatibility. -typedef struct xdp_md -{ - void* data; ///< Pointer to start of packet data. - void* data_end; ///< Pointer to end of packet data. - uint64_t data_meta; ///< Packet metadata. - uint32_t ingress_ifindex; ///< Ingress interface index. - - /* size: 26, cachelines: 1, members: 4 */ - /* last cacheline: 26 bytes */ -} xdp_md_t; - -typedef enum _xdp_action -{ - XDP_PASS = 1, ///< Allow the packet to pass. - XDP_DROP, ///< Drop the packet. - XDP_TX ///< Bounce the received packet back out the same NIC it arrived on. -} xdp_action_t; - -/** - * @brief Handle an incoming packet as early as possible. - * - * Program type: \ref EBPF_PROGRAM_TYPE_XDP - * - * @param[in] context Packet metadata. - * @retval XDP_PASS Allow the packet to pass. - * @retval XDP_DROP Drop the packet. - * @retval XDP_TX Bounce the received packet back out the same NIC it arrived on. - */ -typedef xdp_action_t -xdp_hook_t(xdp_md_t* context); - -// XDP helper functions. -#define XDP_EXT_HELPER_FN_BASE 0xFFFF - -#ifndef __doxygen -#define EBPF_HELPER(return_type, name, args) typedef return_type(*name##_t) args -#endif - -typedef enum -{ - BPF_FUNC_xdp_adjust_head = XDP_EXT_HELPER_FN_BASE + 1, -} ebpf_nethook_helper_id_t; - -/** - * @brief Adjust XDP context data pointer. - * - * @param[in] ctx XDP context. - * @param[in] delta Number of bytes to move the data pointer by. - * - * @retval 0 The operation was successful. - * @retval <0 A failure occurred. - */ -EBPF_HELPER(int, bpf_xdp_adjust_head, (xdp_md_t * ctx, int delta)); -#ifndef __doxygen -#define bpf_xdp_adjust_head ((bpf_xdp_adjust_head_t)BPF_FUNC_xdp_adjust_head) -#endif - -// BIND hook - -typedef enum _bind_operation -{ - BIND_OPERATION_BIND, ///< Entry to bind. - BIND_OPERATION_POST_BIND, ///< After port allocation. - BIND_OPERATION_UNBIND, ///< Release port. -} bind_operation_t; - -typedef struct _bind_md -{ - uint8_t* app_id_start; ///< Pointer to start of App ID. - uint8_t* app_id_end; ///< Pointer to end of App ID. - uint64_t process_id; ///< Process ID. - uint8_t socket_address[16]; ///< Socket address to bind to. - uint8_t socket_address_length; ///< Length in bytes of the socket address. - bind_operation_t operation; ///< Operation to do. - uint8_t protocol; ///< Protocol number (e.g., IPPROTO_TCP). -} bind_md_t; - -typedef enum _bind_action -{ - BIND_PERMIT, ///< Permit the bind operation. - BIND_DENY, ///< Deny the bind operation. - BIND_REDIRECT, ///< Change the bind endpoint. -} bind_action_t; - -/** - * @brief Handle an AF_INET socket bind() request. - * - * Program type: \ref EBPF_PROGRAM_TYPE_BIND - * - * @param[in] context Socket metadata. - * @retval BIND_PERMIT Permit the bind operation. - * @retval BIND_DENY Deny the bind operation. - * @retval BIND_REDIRECT Change the bind endpoint. - */ -typedef bind_action_t -bind_hook_t(bind_md_t* context); - -// -// CGROUP_SOCK_ADDR. -// - -#define BPF_SOCK_ADDR_VERDICT_REJECT 0 -#define BPF_SOCK_ADDR_VERDICT_PROCEED 1 - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4201) -#endif -/** - * @brief Data structure used as context for BPF_PROG_TYPE_CGROUP_SOCK_ADDR program type. - */ -typedef struct bpf_sock_addr -{ - uint32_t family; ///< IP address family. - struct - { - /** - * @brief Source IP address in network byte order. - * Local for ingress, remote for egress. - */ - union - { - uint32_t msg_src_ip4; - uint32_t msg_src_ip6[4]; - }; - uint16_t msg_src_port; ///< Source port in network byte order. - }; - struct - { - /* @brief Destination IP address in network byte order. - * Local for egress, remote for ingress. - */ - union - { - uint32_t user_ip4; - uint32_t user_ip6[4]; - }; - uint16_t user_port; ///< Destination port in network byte order. - }; - uint32_t protocol; ///< IP protocol. - uint32_t compartment_id; ///< Network compartment Id. - uint64_t interface_luid; ///< Interface LUID. -} bpf_sock_addr_t; - -/** - * @brief Handle socket operation. Currently supports ingress/egress connection initialization. - * - * Program type: \ref EBPF_PROGRAM_TYPE_BIND - * - * Attach type(s): - * \ref EBPF_ATTACH_TYPE_CGROUP_INET4_CONNECT - * \ref EBPF_ATTACH_TYPE_CGROUP_INET6_CONNECT - * \ref EBPF_ATTACH_TYPE_CGROUP_INET4_RECV_ACCEPT - * \ref EBPF_ATTACH_TYPE_CGROUP_INET6_RECV_ACCEPT - * - * @param[in] context \ref bpf_sock_addr_t - * @retval BPF_SOCK_ADDR_VERDICT_PROCEED Block the socket operation. - * @retval BPF_SOCK_ADDR_VERDICT_REJECT Allow the socket operation. - * - * Any other return value other than the two mentioned above is treated as BPF_SOCK_ADDR_VERDICT_REJECT. - */ -typedef int -sock_addr_hook_t(bpf_sock_addr_t* context); - -typedef enum _bpf_sock_op_type -{ - /** @brief Indicates when an active (outbound) connection is established. **/ - BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, - /** @brief Indicates when a passive (inbound) connection is established. **/ - BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, - /** @brief Indicates when a connection is deleted. **/ - BPF_SOCK_OPS_CONNECTION_DELETED_CB -} bpf_sock_op_type_t; - -typedef struct _bpf_sock_ops -{ - bpf_sock_op_type_t op; - uint32_t family; ///< IP address family. - struct - { - union - { - uint32_t local_ip4; - uint32_t local_ip6[4]; - }; ///< Local IP address. - uint32_t local_port; - }; ///< Local IP address and port stored in network byte order. - struct - { - union - { - uint32_t remote_ip4; - uint32_t remote_ip6[4]; - }; ///< Remote IP address. - uint32_t remote_port; - }; ///< Remote IP address and port stored in network byte order. - uint8_t protocol; ///< IP protocol. - uint32_t compartment_id; ///< Network compartment Id. - uint64_t interface_luid; ///< Interface LUID. -} bpf_sock_ops_t; - -/** - * @brief Handle socket event notification. Currently notifies ingress/egress connection establishment and tear down. - * - * Program type: \ref EBPF_PROGRAM_TYPE_SOCK_OPS - * - * Attach type(s): - * \ref EBPF_ATTACH_TYPE_CGROUP_SOCK_OPS - * - * @param[in] context \ref bpf_sock_ops_t - * @return 0 on success, or error value in case of failure. - * - */ -typedef int -sock_ops_hook_t(bpf_sock_ops_t* context); - -#ifdef _MSC_VER -#pragma warning(pop) -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_program_attach_type_guids.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_program_attach_type_guids.h deleted file mode 100644 index 5c61d8f..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_program_attach_type_guids.h +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#include -#include "ebpf_windows.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - // - // Attach Types. - // - - __declspec(selectany) ebpf_attach_type_t EBPF_ATTACH_TYPE_UNSPECIFIED = {0}; - - /** @brief Attach type for handling incoming packets as early as possible. - * - * Program type: \ref EBPF_PROGRAM_TYPE_XDP - */ - __declspec(selectany) ebpf_attach_type_t EBPF_ATTACH_TYPE_XDP = { - 0x85e0d8ef, 0x579e, 0x4931, {0xb0, 0x72, 0x8e, 0xe2, 0x26, 0xbb, 0x2e, 0x9d}}; - - /** @brief Attach type for handling socket bind() requests. - * - * Program type: \ref EBPF_PROGRAM_TYPE_BIND - */ - __declspec(selectany) ebpf_attach_type_t EBPF_ATTACH_TYPE_BIND = { - 0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}}; - - /** @brief The programs attached to the INET4_CONNECT hook will be invoked for - * connect() calls on TCP or UDP sockets or when a UDP socket sends a packet to - * a unique remote address/port tuple. - * - * Program type: \ref EBPF_PROGRAM_TYPE_CGROUP_SOCK_ADDR - */ - __declspec(selectany) ebpf_attach_type_t EBPF_ATTACH_TYPE_CGROUP_INET4_CONNECT = { - 0xa82e37b1, 0xaee7, 0x11ec, {0x9a, 0x30, 0x18, 0x60, 0x24, 0x89, 0xbe, 0xee}}; - - /** @brief The programs attached to the INET6_CONNECT hook will be invoked for - * connect() calls on TCP or UDP sockets or when a UDP socket sends a packet to - * a unique remote address/port tuple. - * - * Program type: \ref EBPF_PROGRAM_TYPE_CGROUP_SOCK_ADDR - */ - __declspec(selectany) ebpf_attach_type_t EBPF_ATTACH_TYPE_CGROUP_INET6_CONNECT = { - 0xa82e37b2, 0xaee7, 0x11ec, {0x9a, 0x30, 0x18, 0x60, 0x24, 0x89, 0xbe, 0xee}}; - - /** @brief The programs attached to the INET4_RECV_ACCEPT hook will get invoked for - * TCP accept() calls or for the first unicast UDP packet from a unique remote - * address/port tuple. - * - * Program type: \ref EBPF_PROGRAM_TYPE_CGROUP_SOCK_ADDR - */ - __declspec(selectany) ebpf_attach_type_t EBPF_ATTACH_TYPE_CGROUP_INET4_RECV_ACCEPT = { - 0xa82e37b3, 0xaee7, 0x11ec, {0x9a, 0x30, 0x18, 0x60, 0x24, 0x89, 0xbe, 0xee}}; - - /** @brief The programs attached to the INET6_RECV_ACCEPT hook will get invoked for - * TCP accept() calls or for the first unicast UDP packet from a unique remote - * address/port tuple. - * - * Program type: \ref EBPF_PROGRAM_TYPE_CGROUP_SOCK_ADDR - */ - __declspec(selectany) ebpf_attach_type_t EBPF_ATTACH_TYPE_CGROUP_INET6_RECV_ACCEPT = { - 0xa82e37b4, 0xaee7, 0x11ec, {0x9a, 0x30, 0x18, 0x60, 0x24, 0x89, 0xbe, 0xee}}; - - /** @brief Attach type for handling socket event notifications. - * - * Program type: \ref EBPF_PROGRAM_TYPE_SOCK_OPS - */ - __declspec(selectany) ebpf_attach_type_t EBPF_ATTACH_TYPE_CGROUP_SOCK_OPS = { - 0x837d02cd, 0x3251, 0x4632, {0x8d, 0x94, 0x60, 0xd3, 0xb4, 0x57, 0x69, 0xf2}}; - - /** @brief Attach type implemented by eBPF Sample Extension driver, used for testing. - * - * Program type: \ref EBPF_PROGRAM_TYPE_SAMPLE - */ - __declspec(selectany) ebpf_attach_type_t EBPF_ATTACH_TYPE_SAMPLE = { - 0xf788ef4b, 0x207d, 0x4dc3, {0x85, 0xcf, 0x0f, 0x2e, 0xa1, 0x07, 0x21, 0x3c}}; - - // - // Program Types. - // - - __declspec(selectany) ebpf_program_type_t EBPF_PROGRAM_TYPE_UNSPECIFIED = {0}; - - /** @brief Program type for handling incoming packets as early as possible. - * - * eBPF program prototype: \ref xdp_hook_t - * - * Attach type(s): \ref EBPF_ATTACH_TYPE_XDP - * - * Helpers available: see bpf_helpers.h - */ - __declspec(selectany) ebpf_program_type_t EBPF_PROGRAM_TYPE_XDP = { - 0xf1832a85, 0x85d5, 0x45b0, {0x98, 0xa0, 0x70, 0x69, 0xd6, 0x30, 0x13, 0xb0}}; - - /** @brief Program type for handling socket bind() requests. - * - * eBPF program prototype: \ref bind_hook_t - * - * Attach type(s): \ref EBPF_ATTACH_TYPE_BIND - * - * Helpers available: see bpf_helpers.h - */ - __declspec(selectany) ebpf_program_type_t EBPF_PROGRAM_TYPE_BIND = { - 0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}}; - - /** @brief Program type for handling various socket operations such as connect(), accept() etc. - * - * eBPF program prototype: \ref sock_addr_hook_t - * - * Attach type(s): - * \ref EBPF_ATTACH_TYPE_CGROUP_INET4_CONNECT - * \ref EBPF_ATTACH_TYPE_CGROUP_INET6_CONNECT - * \ref EBPF_ATTACH_TYPE_CGROUP_INET4_RECV_ACCEPT - * \ref EBPF_ATTACH_TYPE_CGROUP_INET6_RECV_ACCEPT - */ - __declspec(selectany) ebpf_program_type_t EBPF_PROGRAM_TYPE_CGROUP_SOCK_ADDR = { - 0x92ec8e39, 0xaeec, 0x11ec, {0x9a, 0x30, 0x18, 0x60, 0x24, 0x89, 0xbe, 0xee}}; - - /** @brief Program type for handling socket event notifications. - * - * Attach type(s): \ref EBPF_ATTACH_TYPE_CGROUP_SOCK_OPS - */ - __declspec(selectany) ebpf_program_type_t EBPF_PROGRAM_TYPE_SOCK_OPS = { - 0x43fb224d, 0x68f8, 0x46d6, {0xaa, 0x3f, 0xc8, 0x56, 0x51, 0x8c, 0xbb, 0x32}}; - - /** @brief Program type for handling calls from the eBPF sample extension. Used for - * testing. - * - * Attach type(s): \ref EBPF_ATTACH_TYPE_SAMPLE - */ - __declspec(selectany) ebpf_program_type_t EBPF_PROGRAM_TYPE_SAMPLE = { - 0xf788ef4a, 0x207d, 0x4dc3, {0x85, 0xcf, 0x0f, 0x2e, 0xa1, 0x07, 0x21, 0x3c}}; - -#ifdef __cplusplus -} -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_program_types.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_program_types.h deleted file mode 100644 index 07d9a83..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_program_types.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#ifdef __midl -#define MIDL(x) x -typedef unsigned int uint32_t; -typedef unsigned long long uint64_t; -#else -#define MIDL(x) -#include -#include -#endif -#include "ebpf_base.h" - -#define EBPF_MAX_PROGRAM_DESCRIPTOR_NAME_LENGTH 256 -#define EBPF_MAX_HELPER_FUNCTION_NAME_LENGTH 256 - -typedef struct _ebpf_program_type_descriptor -{ - MIDL([string]) - const char* name; - ebpf_context_descriptor_t* context_descriptor; - GUID program_type; - uint32_t bpf_prog_type; - char is_privileged; -} ebpf_program_type_descriptor_t; - -typedef struct _ebpf_helper_function_prototype -{ - uint32_t helper_id; - MIDL([string]) - const char* name; - ebpf_return_type_t return_type; - ebpf_argument_type_t arguments[5]; -} ebpf_helper_function_prototype_t; - -typedef struct _ebpf_program_info -{ - ebpf_program_type_descriptor_t program_type_descriptor; - uint32_t count_of_helpers; - MIDL([size_is(count_of_helpers)]) ebpf_helper_function_prototype_t* helper_prototype; -} ebpf_program_info_t; - -typedef struct _ebpf_helper_function_addresses -{ - uint32_t helper_function_count; - MIDL([size_is(helper_function_count)]) uint64_t* helper_function_address; -} ebpf_helper_function_addresses_t; - -typedef struct _ebpf_program_data -{ - ebpf_program_info_t* program_info; - ebpf_helper_function_addresses_t* helper_function_addresses; -} ebpf_program_data_t; - -typedef struct _ebpf_program_section_info -{ - const wchar_t* section_name; - GUID* program_type; - GUID* attach_type; - uint32_t bpf_program_type; - uint32_t bpf_attach_type; -} ebpf_program_section_info_t; \ No newline at end of file diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_result.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_result.h deleted file mode 100644 index be16e0e..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_result.h +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (c) Microsoft Corporation - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include - -#ifdef __cplusplus -extern "C" -{ -#endif - -#pragma warning(disable : 26812) // Prefer enum class - typedef _Return_type_success_(return == EBPF_SUCCESS) enum ebpf_result { - /// The operation was successful. - EBPF_SUCCESS, // = 0 - - /// Program verification failed. - EBPF_VERIFICATION_FAILED, - - /// JIT compilation failed. - EBPF_JIT_COMPILATION_FAILED, - - /// Program load failed. - EBPF_PROGRAM_LOAD_FAILED, - - /// Invalid FD provided. - EBPF_INVALID_FD, - - /// Invalid object provided (ebpf_object, ebpf_map, ebpf_program). - EBPF_INVALID_OBJECT, // = 5 - - /// An invalid argument was supplied. - EBPF_INVALID_ARGUMENT, - - /// No pinned map or program exists for the path provided. - EBPF_OBJECT_NOT_FOUND, - - /// A program or map is already pinned with the same path. - EBPF_OBJECT_ALREADY_EXISTS, - - /// Invalid ELF file path. - EBPF_FILE_NOT_FOUND, - - /// The program or map already pinned to a different path. - EBPF_ALREADY_PINNED, // = 10 - - /// The program or map is not pinned. - EBPF_NOT_PINNED, - - /// Low memory. - EBPF_NO_MEMORY, - - /// The program is too large. - EBPF_PROGRAM_TOO_LARGE, - - /// An RPC exception occurred. - EBPF_RPC_EXCEPTION, - - /// The handle was already initialized. - EBPF_ALREADY_INITIALIZED, // = 15 - - /// A failure occurred in parsing the ELF file. - EBPF_ELF_PARSING_FAILED, - - /// Generic failure code for all other errors. - EBPF_FAILED, - - /// Operation is not supported. - EBPF_OPERATION_NOT_SUPPORTED, - - /// The requested key was not found. - EBPF_KEY_NOT_FOUND, - - /// Access was denied for the requested operation. - EBPF_ACCESS_DENIED, // = 20 - - /// The operation was blocked for all requesters by policy. - EBPF_BLOCKED_BY_POLICY, - - /// Arithmetic overflow occurred. - EBPF_ARITHMETIC_OVERFLOW, - - /// The eBPF extension failed to load. - EBPF_EXTENSION_FAILED_TO_LOAD, - - /// A buffer of insufficient size was supplied. - EBPF_INSUFFICIENT_BUFFER, - - /// The enumeration found no more keys. - EBPF_NO_MORE_KEYS, // = 25 - - /// The requested key is already present. - EBPF_KEY_ALREADY_EXISTS, - - /// Caller has reached tail call limit. - EBPF_NO_MORE_TAIL_CALLS, - - /// Requested action is still pending. - EBPF_PENDING, - - /// The container can not hold additional elements. - EBPF_OUT_OF_SPACE, - - /// Operation was canceled. - EBPF_CANCELED, // = 30 - } ebpf_result_t; - -#define EBPF_RESULT_COUNT (EBPF_CANCELED + 1) - -#ifdef __cplusplus -} -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_store_helper.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_store_helper.h deleted file mode 100644 index b68401a..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_store_helper.h +++ /dev/null @@ -1,350 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#pragma once - -#include "ebpf_program_types.h" -#include "ebpf_registry_helper.h" -#include "ebpf_windows.h" - -#ifdef USER_MODE -extern ebpf_registry_key_t ebpf_root_registry_key; -#endif - -static uint32_t -_open_or_create_provider_registry_key(_Out_ ebpf_registry_key_t* provider_key) -{ - __return_type status = _SUCCESS; - ebpf_registry_key_t root_key = NULL; - *provider_key = NULL; - - // Open (or create) root eBPF registry path. -#ifndef USER_MODE - status = create_registry_key(NULL, EBPF_ROOT_REGISTRY_PATH, REG_CREATE_FLAGS, &root_key); -#else - status = create_registry_key(ebpf_root_registry_key, EBPF_ROOT_RELATIVE_PATH, REG_CREATE_FLAGS, &root_key); -#endif - if (!IS_SUCCESS(status)) { - goto Exit; - } - - // Open (or create) program data registry path. - status = create_registry_key(root_key, EBPF_PROVIDERS_REGISTRY_PATH, REG_CREATE_FLAGS, provider_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - -Exit: - if (root_key) { - close_registry_key(root_key); - } - return status; -} - -static __return_type -_update_helper_prototype(ebpf_registry_key_t helper_info_key, _In_ const ebpf_helper_function_prototype_t* helper_info) -{ - __return_type status = _SUCCESS; - uint32_t offset; - ebpf_registry_key_t helper_function_key = NULL; - char serialized_data[sizeof(ebpf_helper_function_prototype_t)] = {0}; - - status = create_registry_key_ansi(helper_info_key, helper_info->name, REG_CREATE_FLAGS, &helper_function_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - - // Serialize the helper prototype. - offset = 0; - memcpy(serialized_data, &helper_info->helper_id, sizeof(helper_info->helper_id)); - offset += sizeof(helper_info->helper_id); - - memcpy(serialized_data + offset, &helper_info->return_type, sizeof(helper_info->return_type)); - offset += sizeof(helper_info->return_type); - - memcpy(serialized_data + offset, helper_info->arguments, sizeof(helper_info->arguments)); - offset += sizeof(helper_info->arguments); - - // Save the helper prototype data. - status = write_registry_value_binary( - helper_function_key, EBPF_HELPER_DATA_PROTOTYPE, (uint8_t*)&serialized_data[0], offset); - if (!IS_SUCCESS(status)) { - goto Exit; - } - -Exit: - if (helper_function_key) { - close_registry_key(helper_function_key); - } - - return status; -} - -/** - * @brief Update section information in eBPF store. - * - * @param[in] section_info Pointer to an array of section information. - * @param[in] section_info_count Count of section information entries. - * - * @returns Status of the operation. - */ -static __return_type -ebpf_store_update_section_information( - _In_reads_(section_info_count) ebpf_program_section_info_t* section_info, uint32_t section_info_count) -{ - __return_type status = _SUCCESS; - ebpf_registry_key_t provider_key = NULL; - ebpf_registry_key_t section_info_key = NULL; - - if (section_info_count == 0) { - return status; - } - - // Open (or create) provider registry path. - status = _open_or_create_provider_registry_key(&provider_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - - // Open (or create) section data key. - status = create_registry_key(provider_key, EBPF_SECTIONS_REGISTRY_PATH, REG_CREATE_FLAGS, §ion_info_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - - for (uint32_t i = 0; i < section_info_count; i++) { - ebpf_registry_key_t section_key = NULL; - - // Open or create the registry path. - status = create_registry_key(section_info_key, section_info[i].section_name, REG_CREATE_FLAGS, §ion_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - - // Save program type. - status = write_registry_value_binary( - section_key, - EBPF_SECTION_DATA_PROGRAM_TYPE, - (uint8_t*)section_info[i].program_type, - sizeof(ebpf_program_type_t)); - if (!IS_SUCCESS(status)) { - close_registry_key(section_key); - goto Exit; - } - - // Save attach type. - status = write_registry_value_binary( - section_key, - EBPF_SECTION_DATA_ATTACH_TYPE, - (uint8_t*)section_info[i].attach_type, - sizeof(ebpf_attach_type_t)); - if (!IS_SUCCESS(status)) { - close_registry_key(section_key); - goto Exit; - } - - // Save bpf_prog_type. - status = write_registry_value_dword(section_key, EBPF_DATA_BPF_PROG_TYPE, section_info[i].bpf_program_type); - if (!IS_SUCCESS(status)) { - close_registry_key(section_key); - goto Exit; - } - - // Save bpf_attach_type. - status = write_registry_value_dword(section_key, EBPF_DATA_BPF_ATTACH_TYPE, section_info[i].bpf_attach_type); - if (!IS_SUCCESS(status)) { - close_registry_key(section_key); - goto Exit; - } - - close_registry_key(section_key); - } - -Exit: - if (section_info_key) { - close_registry_key(section_info_key); - } - if (provider_key) { - close_registry_key(provider_key); - } - - return status; -} - -/** - * @brief Update program information in eBPF store. - * - * @param[in] program_info Pointer to an array of program information. - * @param[in] program_info_count Count of program information entries. - * - * @returns Status of the operation. - */ -static __return_type -ebpf_store_update_program_information( - _In_reads_(program_info_count) ebpf_program_info_t* program_info, uint32_t program_info_count) -{ - __return_type status = _SUCCESS; - ebpf_registry_key_t provider_key = NULL; - ebpf_registry_key_t program_info_key = NULL; - - if (program_info_count == 0) { - return status; - } - - // Open (or create) provider registry path. - status = _open_or_create_provider_registry_key(&provider_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - - // Open (or create) program data registry path. - status = create_registry_key(provider_key, EBPF_PROGRAM_DATA_REGISTRY_PATH, REG_CREATE_FLAGS, &program_info_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - - for (uint32_t i = 0; i < program_info_count; i++) { - ebpf_registry_key_t program_key = {0}; - ebpf_registry_key_t helper_info_key = {0}; - - // Convert program type GUID to string. - wchar_t guid_string[GUID_STRING_LENGTH + 1]; - status = convert_guid_to_string( - &program_info[i].program_type_descriptor.program_type, guid_string, GUID_STRING_LENGTH + 1); - if (status != _SUCCESS) { - return status; - } - - status = create_registry_key(program_info_key, guid_string, REG_CREATE_FLAGS, &program_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - - // Save the friendly program type name. - status = write_registry_value_ansi_string( - program_key, EBPF_PROGRAM_DATA_NAME, program_info[i].program_type_descriptor.name); - if (!IS_SUCCESS(status)) { - close_registry_key(program_key); - goto Exit; - } - - // Save context descriptor. - status = write_registry_value_binary( - program_key, - EBPF_PROGRAM_DATA_CONTEXT_DESCRIPTOR, - (uint8_t*)program_info[i].program_type_descriptor.context_descriptor, - sizeof(ebpf_context_descriptor_t)); - if (!IS_SUCCESS(status)) { - close_registry_key(program_key); - goto Exit; - } - - // Save bpf_prog_type. - status = write_registry_value_dword( - program_key, EBPF_DATA_BPF_PROG_TYPE, program_info[i].program_type_descriptor.bpf_prog_type); - if (!IS_SUCCESS(status)) { - close_registry_key(program_key); - goto Exit; - } - - // Save "is_privileged". - status = write_registry_value_dword( - program_key, EBPF_PROGRAM_DATA_PRIVELEGED, program_info[i].program_type_descriptor.is_privileged); - if (!IS_SUCCESS(status)) { - close_registry_key(program_key); - goto Exit; - } - - // Save helper count. - status = - write_registry_value_dword(program_key, EBPF_PROGRAM_DATA_HELPER_COUNT, program_info[i].count_of_helpers); - if (!IS_SUCCESS(status)) { - close_registry_key(program_key); - goto Exit; - } - - if (program_info[i].count_of_helpers != 0) { - // Create (or open) helper registry path. - status = create_registry_key( - program_key, EBPF_PROGRAM_DATA_HELPERS_REGISTRY_PATH, REG_CREATE_FLAGS, &helper_info_key); - if (!IS_SUCCESS(status)) { - close_registry_key(program_key); - goto Exit; - } - - // Iterate over all the helper prototypes and save in registry. - for (uint32_t count = 0; count < program_info[i].count_of_helpers; count++) { - status = _update_helper_prototype(helper_info_key, &(program_info[i].helper_prototype[count])); - if (!IS_SUCCESS(status)) { - close_registry_key(program_key); - close_registry_key(helper_info_key); - goto Exit; - } - } - - close_registry_key(helper_info_key); - } - close_registry_key(program_key); - } - -Exit: - if (program_info_key) { - close_registry_key(program_info_key); - } - if (provider_key) { - close_registry_key(provider_key); - } - - return status; -} - -/** - * @brief Update global helper information in eBPF store. - * - * @param[in] helper_info Pointer to an array of helper function prototypes. - * @param[in] helper_info_count Count of helper function prototypes. - * - * @returns Status of the operation. - */ -static __return_type -ebpf_store_update_global_helper_information( - _In_reads_(helper_info_count) ebpf_helper_function_prototype_t* helper_info, uint32_t helper_info_count) -{ - __return_type status = _SUCCESS; - ebpf_registry_key_t provider_key = NULL; - ebpf_registry_key_t helper_info_key = NULL; - - if (helper_info_count == 0) { - return status; - } - - // Open (or create) provider registry path. - status = _open_or_create_provider_registry_key(&provider_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - - // Open (or create) global helpers registry path. - status = create_registry_key(provider_key, EBPF_GLOBAL_HELPERS_REGISTRY_PATH, REG_CREATE_FLAGS, &helper_info_key); - if (!IS_SUCCESS(status)) { - goto Exit; - } - - for (uint32_t i = 0; i < helper_info_count; i++) { - - status = _update_helper_prototype(helper_info_key, &helper_info[i]); - if (!IS_SUCCESS(status)) { - goto Exit; - } - } - -Exit: - if (helper_info_key) { - close_registry_key(helper_info_key); - } - if (provider_key) { - close_registry_key(provider_key); - } - - return status; -} diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_structs.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_structs.h deleted file mode 100644 index f4dece0..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_structs.h +++ /dev/null @@ -1,377 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -// This file contains eBPF definitions common to eBPF programs, core execution engine -// as well as eBPF API library. - -#pragma once - -#if !defined(NO_CRT) -#include -#include -#endif -#include "ebpf_windows.h" - -#define BPF_ENUM_TO_STRING(X) #X - -typedef enum bpf_map_type -{ - BPF_MAP_TYPE_UNSPEC = 0, ///< Unspecified map type. - BPF_MAP_TYPE_HASH = 1, ///< Hash table. - BPF_MAP_TYPE_ARRAY = 2, ///< Array, where the map key is the array index. - BPF_MAP_TYPE_PROG_ARRAY = - 3, ///< Array of program fds usable with bpf_tail_call, where the map key is the array index. - BPF_MAP_TYPE_PERCPU_HASH = 4, ///< Per-CPU hash table. - BPF_MAP_TYPE_PERCPU_ARRAY = 5, ///< Per-CPU array. - BPF_MAP_TYPE_HASH_OF_MAPS = 6, ///< Hash table, where the map value is another map. - BPF_MAP_TYPE_ARRAY_OF_MAPS = 7, ///< Array, where the map value is another map. - BPF_MAP_TYPE_LRU_HASH = 8, ///< Least-recently-used hash table. - BPF_MAP_TYPE_LPM_TRIE = 9, ///< Longest prefix match trie. - BPF_MAP_TYPE_QUEUE = 10, ///< Queue. - BPF_MAP_TYPE_LRU_PERCPU_HASH = 11, ///< Per-CPU least-recently-used hash table. - BPF_MAP_TYPE_STACK = 12, ///< Stack. - BPF_MAP_TYPE_RINGBUF = 13 ///< Ring buffer. -} ebpf_map_type_t; - -static const char* const _ebpf_map_type_names[] = { - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_UNSPEC), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_HASH), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_ARRAY), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_PROG_ARRAY), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_PERCPU_HASH), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_PERCPU_ARRAY), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_HASH_OF_MAPS), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_ARRAY_OF_MAPS), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_LRU_HASH), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_LPM_TRIE), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_QUEUE), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_LRU_PERCPU_HASH), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_STACK), - BPF_ENUM_TO_STRING(BPF_MAP_TYPE_RINGBUF), -}; - -static const char* const _ebpf_map_display_names[] = { - "unspec", - "hash", - "array", - "prog_array", - "percpu_hash", - "percpu_array", - "hash_of_maps", - "array_of_maps", - "lru_hash", - "lpm_trie", - "queue", - "lru_percpu_hash", - "stack", - "ringbuf", -}; - -typedef enum ebpf_map_option -{ - EBPF_ANY, ///< Create a new element or update an existing element. - EBPF_NOEXIST, ///< Create a new element only when it does not exist. - EBPF_EXIST ///< Update an existing element. -} ebpf_map_option_t; - -typedef enum ebpf_pin_type -{ - PIN_NONE, ///< Object is not pinned. - PIN_OBJECT_NS, ///< Pinning that is local to an object. - PIN_GLOBAL_NS, ///< Pinning with a global namespace. - PIN_CUSTOM_NS ///< Pinning with a custom path given as section parameter. -} ebpf_pin_type_t; - -static const char* const _ebpf_pin_type_names[] = { - BPF_ENUM_TO_STRING(PIN_NONE), - BPF_ENUM_TO_STRING(PIN_OBJECT_NS), - BPF_ENUM_TO_STRING(PIN_GLOBAL_NS), - BPF_ENUM_TO_STRING(PIN_CUSTOM_NS), -}; - -typedef uint32_t ebpf_id_t; -#define EBPF_ID_NONE UINT32_MAX - -/** - * @brief eBPF Map Definition as it is stored in memory. - */ -typedef struct _ebpf_map_definition_in_memory -{ - ebpf_map_type_t type; ///< Type of map. - uint32_t key_size; ///< Size in bytes of a map key. - uint32_t value_size; ///< Size in bytes of a map value. - uint32_t max_entries; ///< Maximum number of entries allowed in the map. - ebpf_id_t inner_map_id; - ebpf_pin_type_t pinning; -} ebpf_map_definition_in_memory_t; - -/** - * @brief eBPF Map Definition as it appears in the maps section of an ELF file. - */ -typedef struct _ebpf_map_definition_in_file -{ - ebpf_map_type_t type; ///< Type of map. - uint32_t key_size; ///< Size in bytes of a map key. - uint32_t value_size; ///< Size in bytes of a map value. - uint32_t max_entries; ///< Maximum number of entries allowed in the map. - - /** When a map definition is hard coded in an eBPF program, inner_map_idx - * indicates the 0-based index of which map in the maps section of the ELF - * file is the inner map template. - */ - uint32_t inner_map_idx; - ebpf_pin_type_t pinning; - - /** id is the identifier for a map template. - */ - uint32_t id; - /** For a map of map, inner_id is the id of the inner map template. - */ - uint32_t inner_id; -} ebpf_map_definition_in_file_t; - -typedef enum -{ - BPF_FUNC_map_lookup_elem = 1, ///< \ref bpf_map_lookup_elem - BPF_FUNC_map_update_elem = 2, ///< \ref bpf_map_update_elem - BPF_FUNC_map_delete_elem = 3, ///< \ref bpf_map_delete_elem - BPF_FUNC_map_lookup_and_delete_elem = 4, ///< \ref bpf_map_lookup_and_delete_elem - BPF_FUNC_tail_call = 5, ///< \ref bpf_tail_call - BPF_FUNC_get_prandom_u32 = 6, ///< \ref bpf_get_prandom_u32 - BPF_FUNC_ktime_get_boot_ns = 7, ///< \ref bpf_ktime_get_boot_ns - BPF_FUNC_get_smp_processor_id = 8, ///< \ref bpf_get_smp_processor_id - BPF_FUNC_ktime_get_ns = 9, ///< \ref bpf_ktime_get_ns - BPF_FUNC_csum_diff = 10, ///< \ref bpf_csum_diff - BPF_FUNC_ringbuf_output = 11, ///< \ref bpf_ringbuf_output - BPF_FUNC_trace_printk2 = 12, ///< \ref bpf_trace_printk2 (but use \ref bpf_printk instead) - BPF_FUNC_trace_printk3 = 13, ///< \ref bpf_trace_printk3 (but use \ref bpf_printk instead) - BPF_FUNC_trace_printk4 = 14, ///< \ref bpf_trace_printk4 (but use \ref bpf_printk instead) - BPF_FUNC_trace_printk5 = 15, ///< \ref bpf_trace_printk5 (but use \ref bpf_printk instead) - BPF_FUNC_map_push_elem = 16, ///< \ref bpf_map_push_elem - BPF_FUNC_map_pop_elem = 17, ///< \ref bpf_map_pop_elem - BPF_FUNC_map_peek_elem = 18, ///< \ref bpf_map_peek_elem - BPF_FUNC_get_current_pid_tgid = 19, ///< \ref bpf_get_current_pid_tgid -} ebpf_helper_id_t; - -// Cross-platform BPF program types. -enum bpf_prog_type -{ - BPF_PROG_TYPE_UNSPEC, ///< Unspecified program type. - - /** @brief Program type for handling incoming packets as early as possible. - * - * **eBPF program prototype:** \ref xdp_hook_t - * - * **Attach type(s):** \ref BPF_XDP - * - * **Helpers available:** all helpers defined in bpf_helpers.h - */ - BPF_PROG_TYPE_XDP, - - /** @brief Program type for handling socket bind() requests. - * - * **eBPF program prototype:** \ref bind_hook_t - * - * **Attach type(s):** \ref BPF_ATTACH_TYPE_BIND - * - * **Helpers available:** all helpers defined in bpf_helpers.h - */ - BPF_PROG_TYPE_BIND, // TODO(#333): replace with cross-platform program type - - /** @brief Program type for handling various socket operations such as connect(), accept() etc. - * - * **eBPF program prototype:** \ref sock_addr_hook_t - * - * **Attach type(s):** - * \ref BPF_CGROUP_INET4_CONNECT - * \ref BPF_CGROUP_INET6_CONNECT - * \ref BPF_CGROUP_INET4_RECV_ACCEPT - * \ref BPF_CGROUP_INET6_RECV_ACCEPT - * - * **Helpers available:** all helpers defined in bpf_helpers.h - */ - BPF_PROG_TYPE_CGROUP_SOCK_ADDR, - - /** @brief Program type for handling various socket event notifications such as connection established etc. - * - * **eBPF program prototype:** \ref sock_ops_hook_t - * - * **Attach type(s):** - * \ref BPF_CGROUP_SOCK_OPS - * - * **Helpers available:** all helpers defined in bpf_helpers.h - */ - BPF_PROG_TYPE_SOCK_OPS, - - /** @brief Program type for handling calls from the eBPF sample extension. Used for - * testing. - * - * **eBPF program prototype:** see the eBPF sample extension. - * - * **Attach type(s):** \ref BPF_ATTACH_TYPE_SAMPLE - */ - BPF_PROG_TYPE_SAMPLE = 999 -}; - -typedef enum bpf_prog_type bpf_prog_type_t; - -#define XDP_FLAGS_REPLACE 0x01 - -// The link type is used to tell which union member is present -// in the bpf_link_info struct. There is exactly one non-zero value -// per union member. -enum bpf_link_type -{ - BPF_LINK_TYPE_UNSPEC, ///< Unspecified link type. - BPF_LINK_TYPE_PLAIN, ///< No union members are used in bpf_link_info. - BPF_LINK_TYPE_CGROUP, ///< cgroup struct is present in bpf_link_info. - BPF_LINK_TYPE_XDP, ///< xdp struct is present in bpf_link_info. -}; - -static const char* const _ebpf_link_display_names[] = { - "unspec", - "plain", -}; - -enum bpf_attach_type -{ - BPF_ATTACH_TYPE_UNSPEC, ///< Unspecified attach type. - - /** @brief Attach type for handling incoming packets as early as possible. - * - * **Program type:** \ref BPF_PROG_TYPE_XDP - */ - BPF_XDP, - - /** @brief Attach type for handling socket bind() requests. - * - * **Program type:** \ref BPF_PROG_TYPE_BIND - */ - BPF_ATTACH_TYPE_BIND, - - /** @brief Attach type for handling IPv4 TCP connect() or UDP send - * to a unique remote address/port tuple. - * - * **Program type:** \ref BPF_PROG_TYPE_CGROUP_SOCK_ADDR - */ - BPF_CGROUP_INET4_CONNECT, - - /** @brief Attach type for handling IPv6 TCP connect() or UDP send - * to a unique remote address/port tuple. - * - * **Program type:** \ref BPF_PROG_TYPE_CGROUP_SOCK_ADDR - */ - BPF_CGROUP_INET6_CONNECT, - - /** @brief Attach type for handling IPv4 TCP accept() or on receiving - * the first unicast UDP packet from a unique remote address/port tuple. - * - * **Program type:** \ref BPF_PROG_TYPE_CGROUP_SOCK_ADDR - */ - BPF_CGROUP_INET4_RECV_ACCEPT, - - /** @brief Attach type for handling IPv6 TCP accept() or on receiving - * the first unicast UDP packet from a unique remote address/port tuple. - * - * **Program type:** \ref BPF_PROG_TYPE_CGROUP_SOCK_ADDR - */ - BPF_CGROUP_INET6_RECV_ACCEPT, - - /** @brief Attach type for handling various socket event notifications. - * - * **Program type:** \ref BPF_PROG_TYPE_SOCK_OPS - */ - BPF_CGROUP_SOCK_OPS, - - /** @brief Attach type implemented by eBPF Sample Extension driver, used for testing. - * - * **Program type:** \ref BPF_PROG_TYPE_SAMPLE - */ - BPF_ATTACH_TYPE_SAMPLE, - - __MAX_BPF_ATTACH_TYPE, -}; - -typedef enum bpf_attach_type bpf_attach_type_t; - -// Libbpf itself requires the following structs to be defined, but doesn't -// care what fields they have. Applications such as bpftool on the other -// hand depend on fields of specific names and types. - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4201) /* nameless struct/union */ -#endif -/** - * @brief eBPF link information. This structure can be retrieved by calling - * \ref bpf_obj_get_info_by_fd on a link fd. - */ -struct bpf_link_info -{ - ebpf_id_t id; ///< Link ID. - ebpf_id_t prog_id; ///< Program ID. - enum bpf_link_type type; ///< Link type. - enum bpf_attach_type attach_type; ///< Attach type. - ebpf_attach_type_t attach_type_uuid; ///< Attach type UUID. - ebpf_program_type_t program_type_uuid; ///< Program type UUID. - union - { - struct - { - uint32_t ifindex; - } xdp; - struct - { - uint64_t cgroup_id; - } cgroup; - uint8_t attach_data; - }; -}; -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#define BPF_OBJ_NAME_LEN 64 - -/** - * @brief eBPF map information. This structure can be retrieved by calling - * \ref bpf_obj_get_info_by_fd on a map fd. - */ -struct bpf_map_info -{ - // Cross-platform fields. - ebpf_id_t id; ///< Map ID. - ebpf_map_type_t type; ///< Type of map. - uint32_t key_size; ///< Size in bytes of a map key. - uint32_t value_size; ///< Size in bytes of a map value. - uint32_t max_entries; ///< Maximum number of entries allowed in the map. - char name[BPF_OBJ_NAME_LEN]; ///< Null-terminated map name. - uint32_t map_flags; ///< Map flags. - - // Windows-specific fields. - ebpf_id_t inner_map_id; ///< ID of inner map template. - uint32_t pinned_path_count; ///< Number of pinned paths. -}; - -#define BPF_ANY 0x0 -#define BPF_NOEXIST 0x1 -#define BPF_EXIST 0x2 - -/** - * @brief eBPF program information. This structure can be retrieved by calling - * \ref bpf_obj_get_info_by_fd on a program fd. - */ -struct bpf_prog_info -{ - // Cross-platform fields. - ebpf_id_t id; ///< Program ID. - enum bpf_prog_type type; ///< Program type, if a cross-platform type. - uint32_t nr_map_ids; ///< Number of maps associated with this program. - char name[BPF_OBJ_NAME_LEN]; ///< Null-terminated program name. - - // Windows-specific fields. - ebpf_program_type_t type_uuid; ///< Program type UUID. - ebpf_attach_type_t attach_type_uuid; ///< Attach type UUID. - uint32_t pinned_path_count; ///< Number of pinned paths. - uint32_t link_count; ///< Number of attached links. -}; diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_utilities.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_utilities.h deleted file mode 100644 index 52871f4..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_utilities.h +++ /dev/null @@ -1,152 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files -#include - -#include "ebpf_result.h" - -// This should be consistent with _ebpf_result_mapping[] -// in ebpf_error.c -__forceinline ebpf_result_t -win32_error_code_to_ebpf_result(uint32_t error) -{ - ebpf_result_t result; - - switch (error) { - case ERROR_SUCCESS: - result = EBPF_SUCCESS; - break; - - case ERROR_OUTOFMEMORY: - case ERROR_NOT_ENOUGH_MEMORY: - result = EBPF_NO_MEMORY; - break; - - case ERROR_PATH_NOT_FOUND: - result = EBPF_OBJECT_NOT_FOUND; - break; - - case ERROR_NOT_FOUND: - result = EBPF_KEY_NOT_FOUND; - break; - - case ERROR_INVALID_PARAMETER: - result = EBPF_INVALID_ARGUMENT; - break; - - case ERROR_NO_MORE_ITEMS: - case ERROR_NO_MORE_MATCHES: - result = EBPF_NO_MORE_KEYS; - break; - - case ERROR_INVALID_HANDLE: - result = EBPF_INVALID_FD; - break; - - case ERROR_NOT_SUPPORTED: - result = EBPF_OPERATION_NOT_SUPPORTED; - break; - - case ERROR_MORE_DATA: - result = EBPF_INSUFFICIENT_BUFFER; - break; - - case ERROR_FILE_NOT_FOUND: - result = EBPF_FILE_NOT_FOUND; - break; - - case ERROR_ALREADY_INITIALIZED: - result = EBPF_ALREADY_INITIALIZED; - break; - - case ERROR_OBJECT_ALREADY_EXISTS: - result = EBPF_OBJECT_ALREADY_EXISTS; - break; - - case ERROR_IO_PENDING: - result = EBPF_PENDING; - break; - - case ERROR_VERIFIER_STOP: - result = EBPF_VERIFICATION_FAILED; - break; - - case ERROR_NONE_MAPPED: - result = EBPF_JIT_COMPILATION_FAILED; - break; - - case ERROR_BAD_DRIVER: - result = EBPF_EXTENSION_FAILED_TO_LOAD; - break; - - case ERROR_INVALID_FUNCTION: - result = EBPF_INVALID_OBJECT; - break; - - case ERROR_OBJECT_NAME_EXISTS: - result = EBPF_ALREADY_PINNED; - break; - - case ERROR_TOO_MANY_CMDS: - result = EBPF_PROGRAM_TOO_LARGE; - break; - - case RPC_S_CALL_FAILED: - result = EBPF_RPC_EXCEPTION; - break; - - case ERROR_BAD_EXE_FORMAT: - result = EBPF_ELF_PARSING_FAILED; - break; - - case ERROR_ACCESS_DENIED: - result = EBPF_ACCESS_DENIED; - break; - - case ERROR_NOT_OWNER: - result = EBPF_NOT_PINNED; - break; - - case ERROR_CONTENT_BLOCKED: - result = EBPF_BLOCKED_BY_POLICY; - break; - - case ERROR_ARITHMETIC_OVERFLOW: - result = EBPF_ARITHMETIC_OVERFLOW; - break; - - case ERROR_GENERIC_COMMAND_FAILED: - result = EBPF_PROGRAM_LOAD_FAILED; - break; - - case ERROR_ALREADY_REGISTERED: - // Currently STATUS_ALREADY_REGISTERED is mapped to - // ERROR_INTERNAL_ERROR instead of ERROR_ALREADY_REGISTERED. - case ERROR_INTERNAL_ERROR: - result = EBPF_KEY_ALREADY_EXISTS; - break; - - case ERROR_TOO_MANY_NAMES: - result = EBPF_NO_MORE_TAIL_CALLS; - break; - - case ERROR_NO_SYSTEM_RESOURCES: - result = EBPF_OUT_OF_SPACE; - break; - - case ERROR_OPERATION_ABORTED: - result = EBPF_CANCELED; - break; - - default: - result = EBPF_FAILED; - break; - } - - return result; -} diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_windows.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_windows.h deleted file mode 100644 index 6761458..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/ebpf_windows.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -#ifdef _MSC_VER -#include -#else -typedef uint8_t GUID[16]; -#endif - -// This file contains eBPF definitions needed by eBPF programs as well as -// the verifier and execution context. - -#define EBPF_ROOT_REGISTRY_PATH L"\\Registry\\Machine\\Software\\eBPF" -#define EBPF_ROOT_RELATIVE_PATH L"Software\\eBPF" -#define EBPF_STORE_REGISTRY_PATH L"Software\\eBPF\\Providers" - -#define EBPF_PROVIDERS_REGISTRY_PATH L"Providers" -#define EBPF_SECTIONS_REGISTRY_PATH L"SectionData" -#define EBPF_PROGRAM_DATA_REGISTRY_PATH L"ProgramData" -#define EBPF_PROGRAM_DATA_HELPERS_REGISTRY_PATH L"Helpers" -#define EBPF_GLOBAL_HELPERS_REGISTRY_PATH L"GlobalHelpers" - -#define EBPF_SECTION_DATA_PROGRAM_TYPE L"ProgramType" -#define EBPF_SECTION_DATA_ATTACH_TYPE L"AttachType" - -#define EBPF_PROGRAM_DATA_NAME L"Name" -#define EBPF_PROGRAM_DATA_CONTEXT_DESCRIPTOR L"ContextDescriptor" -#define EBPF_PROGRAM_DATA_PLATFORM_SPECIFIC_DATA L"PlatformSpecificData" -#define EBPF_PROGRAM_DATA_PRIVELEGED L"IsPrivileged" -#define EBPF_PROGRAM_DATA_HELPER_COUNT L"HelperCount" - -#define EBPF_HELPER_DATA_PROTOTYPE L"Prototype" - -#define EBPF_DATA_BPF_PROG_TYPE L"BpfProgType" -#define EBPF_DATA_BPF_ATTACH_TYPE L"BpfAttachType" - -typedef GUID ebpf_program_type_t; -typedef GUID ebpf_attach_type_t; - -typedef enum _ebpf_helper_function -{ - EBPF_LOOKUP_ELEMENT = 1, ///< Look up a map element. - EBPF_UPDATE_ELEMENT = 2, ///< Update map element. - EBPF_DELETE_ELEMENT = 3, ///< Delete a map element. -} ebpf_helper_function_t; diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/elfio_wrapper.hpp b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/elfio_wrapper.hpp deleted file mode 100644 index 8addd13..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/elfio_wrapper.hpp +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#pragma warning(push) -#pragma warning(disable : 4244) // conversion from 'int' to 'ELFIO::Elf_Half', possible loss of data -#pragma warning(disable : 4389) // signed/unsigned mismatch -#pragma warning(disable : 4456) // declaration hides previous local declaration -#pragma warning(disable : 4458) // declaration of 'name' hides class member -#pragma warning(disable : 6011) // 'Dereferencing NULL pointer - https://github.com/vbpf/ebpf-verifier/issues/239 -#pragma warning(disable : 26451) // Arithmetic overflow -#pragma warning(disable : 26450) // Arithmetic overflow -#pragma warning(disable : 26495) // Always initialize a member variable -#include "elfio/elfio.hpp" -#pragma warning(pop) diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/git_commit_id.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/git_commit_id.h deleted file mode 100644 index b1fa9fae232320b1131d6b5030ebb19683660f33..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 136 zcmXAhI|_qP6hu!Q$R5OOK%aR&trf&VY|;lw6l~mo6+IA!VLo@b=kLLnm5rT4%@`PY z@up*D68|*Pd&?<^l7zb - -#define __return_type NTSTATUS -#define IS_SUCCESS(x) (NT_SUCCESS(x)) -#define _SUCCESS STATUS_SUCCESS - -#define REG_CREATE_FLAGS 0 -#define GUID_STRING_LENGTH 38 // not including the null terminator. - -typedef HANDLE ebpf_registry_key_t; - -static void -close_registry_key(ebpf_registry_key_t key) -{ - ZwClose(key); -} - -_Success_(return == 0) static NTSTATUS - convert_guid_to_string(_In_ const GUID* guid, _Out_writes_all_(string_size) wchar_t* string, size_t string_size) -{ - UNICODE_STRING unicode_string; - NTSTATUS status = RtlStringFromGUID(guid, &unicode_string); - if (status != STATUS_SUCCESS) { - goto Exit; - } - - if (string_size < GUID_STRING_LENGTH + 1) { - status = STATUS_BUFFER_TOO_SMALL; - goto Exit; - } - - __analysis_assume(unicode_string.MaximumLength >= GUID_STRING_LENGTH * 2); - __analysis_assume(unicode_string.Buffer != NULL); - // Copy the buffer to the output string. - memcpy(string, unicode_string.Buffer, GUID_STRING_LENGTH * 2); - string[GUID_STRING_LENGTH] = L'\0'; - -Exit: - return status; -} - -static uint32_t -write_registry_value_binary( - ebpf_registry_key_t key, - _In_z_ const wchar_t* value_name, - _In_reads_(value_size) uint8_t* value, - _In_ size_t value_size) -{ - UNICODE_STRING unicode_value_name; - - RtlInitUnicodeString(&unicode_value_name, value_name); - return ZwSetValueKey(key, &unicode_value_name, 0, REG_BINARY, value, (ULONG)value_size); -} - -static uint32_t -write_registry_value_ansi_string(ebpf_registry_key_t key, _In_z_ const wchar_t* value_name, _In_z_ const char* value) -{ - NTSTATUS status; - UNICODE_STRING unicode_value; - UNICODE_STRING unicode_value_name; - - ANSI_STRING ansi_string; - RtlInitAnsiString(&ansi_string, value); - - status = RtlAnsiStringToUnicodeString(&unicode_value, &ansi_string, TRUE); - if (!NT_SUCCESS(status)) { - goto Exit; - } - RtlInitUnicodeString(&unicode_value_name, value_name); - - status = ZwSetValueKey(key, &unicode_value_name, 0, REG_SZ, unicode_value.Buffer, unicode_value.Length); - RtlFreeUnicodeString(&unicode_value); - -Exit: - return status; -} - -static uint32_t -write_registry_value_dword(ebpf_registry_key_t key, _In_z_ const wchar_t* value_name, uint32_t value) -{ - UNICODE_STRING unicode_name; - RtlInitUnicodeString(&unicode_name, value_name); - return ZwSetValueKey(key, &unicode_name, 0, REG_DWORD, &value, sizeof(uint32_t)); -} - -static uint32_t -create_registry_key( - ebpf_registry_key_t root_key, _In_z_ const wchar_t* sub_key, uint32_t flags, _Out_ ebpf_registry_key_t* key) -{ - NTSTATUS status = STATUS_SUCCESS; - UNICODE_STRING registry_path; - OBJECT_ATTRIBUTES object_attributes = {0}; - - UNREFERENCED_PARAMETER(flags); - - RtlInitUnicodeString(®istry_path, sub_key); - InitializeObjectAttributes( - &object_attributes, ®istry_path, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, root_key, NULL); - - status = ZwCreateKey(key, KEY_WRITE, &object_attributes, 0, NULL, REG_OPTION_NON_VOLATILE, NULL); - - return status; -} - -static uint32_t -create_registry_key_ansi( - ebpf_registry_key_t root_key, _In_z_ const char* sub_key, uint32_t flags, _Out_ ebpf_registry_key_t* key) -{ - NTSTATUS status = STATUS_SUCCESS; - UNICODE_STRING registry_path; - OBJECT_ATTRIBUTES object_attributes = {0}; - ANSI_STRING ansi_string; - RtlInitAnsiString(&ansi_string, sub_key); - - UNREFERENCED_PARAMETER(flags); - *key = NULL; - - status = RtlAnsiStringToUnicodeString(®istry_path, &ansi_string, TRUE); - if (!NT_SUCCESS(status)) { - goto Exit; - } - - InitializeObjectAttributes( - &object_attributes, ®istry_path, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, root_key, NULL); - - status = ZwCreateKey(key, KEY_WRITE, &object_attributes, 0, NULL, REG_OPTION_NON_VOLATILE, NULL); - RtlFreeUnicodeString(®istry_path); - -Exit: - return status; -} diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/asm/barrier.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/asm/barrier.h deleted file mode 100644 index 097180c..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/asm/barrier.h +++ /dev/null @@ -1,7 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#ifndef __ASM_BARRIER_H -#define __ASM_BARRIER_H - -#include - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/compiler.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/compiler.h deleted file mode 100644 index 94f8e69..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/compiler.h +++ /dev/null @@ -1,70 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -#ifndef __LINUX_COMPILER_H -#define __LINUX_COMPILER_H - -#define likely(x) __builtin_expect(!!(x), 1) -#define unlikely(x) __builtin_expect(!!(x), 0) - -#define READ_ONCE(x) (*(volatile typeof(x) *)&x) -#define WRITE_ONCE(x, v) (*(volatile typeof(x) *)&x) = (v) - -#define barrier() asm volatile("" ::: "memory") - -#if defined(__x86_64__) - -# define smp_rmb() barrier() -# define smp_wmb() barrier() -# define smp_mb() asm volatile("lock; addl $0,-132(%%rsp)" ::: "memory", "cc") - -# define smp_store_release(p, v) \ -do { \ - barrier(); \ - WRITE_ONCE(*p, v); \ -} while (0) - -# define smp_load_acquire(p) \ -({ \ - typeof(*p) ___p = READ_ONCE(*p); \ - barrier(); \ - ___p; \ -}) - -#elif defined(__aarch64__) - -# define smp_rmb() asm volatile("dmb ishld" ::: "memory") -# define smp_wmb() asm volatile("dmb ishst" ::: "memory") -# define smp_mb() asm volatile("dmb ish" ::: "memory") - -#endif - -#ifndef smp_mb -# define smp_mb() __sync_synchronize() -#endif - -#ifndef smp_rmb -# define smp_rmb() smp_mb() -#endif - -#ifndef smp_wmb -# define smp_wmb() smp_mb() -#endif - -#ifndef smp_store_release -# define smp_store_release(p, v) \ -do { \ - smp_mb(); \ - WRITE_ONCE(*p, v); \ -} while (0) -#endif - -#ifndef smp_load_acquire -# define smp_load_acquire(p) \ -({ \ - typeof(*p) ___p = READ_ONCE(*p); \ - smp_mb(); \ - ___p; \ -}) -#endif - -#endif /* __LINUX_COMPILER_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/err.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/err.h deleted file mode 100644 index 8899e3a..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/err.h +++ /dev/null @@ -1,38 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -#ifndef __LINUX_ERR_H -#define __LINUX_ERR_H - -#include -#include - -#define MAX_ERRNO 4095 - -#define IS_ERR_VALUE(x) ((x) >= (unsigned long)-MAX_ERRNO) - -static inline void * ERR_PTR(long error_) -{ - return (void *) error_; -} - -static inline long PTR_ERR(const void *ptr) -{ - return (long) ptr; -} - -static inline bool IS_ERR(const void *ptr) -{ - return IS_ERR_VALUE((unsigned long)ptr); -} - -static inline bool IS_ERR_OR_NULL(const void *ptr) -{ - return (!ptr) || IS_ERR_VALUE((unsigned long)ptr); -} - -static inline long PTR_ERR_OR_ZERO(const void *ptr) -{ - return IS_ERR(ptr) ? PTR_ERR(ptr) : 0; -} - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/filter.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/filter.h deleted file mode 100644 index 5d61854..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/filter.h +++ /dev/null @@ -1,134 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -#ifndef __LINUX_FILTER_H -#define __LINUX_FILTER_H - -#include - -#define BPF_RAW_INSN(CODE, DST, SRC, OFF, IMM) \ - ((struct bpf_insn) { \ - .code = CODE, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = IMM }) - -#define BPF_ALU32_IMM(OP, DST, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ALU | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -#define BPF_ALU64_IMM(OP, DST, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ALU64 | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -#define BPF_MOV64_IMM(DST, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ALU64 | BPF_MOV | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -#define BPF_EXIT_INSN() \ - ((struct bpf_insn) { \ - .code = BPF_JMP | BPF_EXIT, \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = 0, \ - .imm = 0 }) - -#define BPF_EMIT_CALL(FUNC) \ - ((struct bpf_insn) { \ - .code = BPF_JMP | BPF_CALL, \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = 0, \ - .imm = ((FUNC) - BPF_FUNC_unspec) }) - -#define BPF_LDX_MEM(SIZE, DST, SRC, OFF) \ - ((struct bpf_insn) { \ - .code = BPF_LDX | BPF_SIZE(SIZE) | BPF_MEM, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = 0 }) - -#define BPF_STX_MEM(SIZE, DST, SRC, OFF) \ - ((struct bpf_insn) { \ - .code = BPF_STX | BPF_SIZE(SIZE) | BPF_MEM, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF, \ - .imm = 0 }) - -#define BPF_ST_MEM(SIZE, DST, OFF, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ST | BPF_SIZE(SIZE) | BPF_MEM, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = OFF, \ - .imm = IMM }) - -#define BPF_MOV64_REG(DST, SRC) \ - ((struct bpf_insn) { \ - .code = BPF_ALU64 | BPF_MOV | BPF_X, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = 0, \ - .imm = 0 }) - -#define BPF_MOV32_IMM(DST, IMM) \ - ((struct bpf_insn) { \ - .code = BPF_ALU | BPF_MOV | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = 0, \ - .imm = IMM }) - -#define BPF_LD_IMM64_RAW_FULL(DST, SRC, OFF1, OFF2, IMM1, IMM2) \ - ((struct bpf_insn) { \ - .code = BPF_LD | BPF_DW | BPF_IMM, \ - .dst_reg = DST, \ - .src_reg = SRC, \ - .off = OFF1, \ - .imm = IMM1 }), \ - ((struct bpf_insn) { \ - .code = 0, \ - .dst_reg = 0, \ - .src_reg = 0, \ - .off = OFF2, \ - .imm = IMM2 }) - -#define BPF_LD_MAP_FD(DST, MAP_FD) \ - BPF_LD_IMM64_RAW_FULL(DST, BPF_PSEUDO_MAP_FD, 0, 0, \ - MAP_FD, 0) - -#define BPF_LD_MAP_VALUE(DST, MAP_FD, VALUE_OFF) \ - BPF_LD_IMM64_RAW_FULL(DST, BPF_PSEUDO_MAP_VALUE, 0, 0, \ - MAP_FD, VALUE_OFF) - -#define BPF_JMP_IMM(OP, DST, IMM, OFF) \ - ((struct bpf_insn) { \ - .code = BPF_JMP | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = OFF, \ - .imm = IMM }) - -#define BPF_JMP32_IMM(OP, DST, IMM, OFF) \ - ((struct bpf_insn) { \ - .code = BPF_JMP32 | BPF_OP(OP) | BPF_K, \ - .dst_reg = DST, \ - .src_reg = 0, \ - .off = OFF, \ - .imm = IMM }) - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/kernel.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/kernel.h deleted file mode 100644 index 83403be..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/kernel.h +++ /dev/null @@ -1,44 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -#ifndef __LINUX_KERNEL_H -#define __LINUX_KERNEL_H - -#ifndef offsetof -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) -#endif - -#ifndef container_of -#define container_of(ptr, type, member) ({ \ - const typeof(((type *)0)->member) * __mptr = (ptr); \ - (type *)((char *)__mptr - offsetof(type, member)); }) -#endif - -#ifndef max -#define max(x, y) ({ \ - typeof(x) _max1 = (x); \ - typeof(y) _max2 = (y); \ - (void) (&_max1 == &_max2); \ - _max1 > _max2 ? _max1 : _max2; }) -#endif - -#ifndef min -#define min(x, y) ({ \ - typeof(x) _min1 = (x); \ - typeof(y) _min2 = (y); \ - (void) (&_min1 == &_min2); \ - _min1 < _min2 ? _min1 : _min2; }) -#endif - -#ifndef roundup -#define roundup(x, y) ( \ -{ \ - const typeof(y) __y = y; \ - (((x) + (__y - 1)) / __y) * __y; \ -} \ -) -#endif - -#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) -#define __KERNEL_DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d)) - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/list.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/list.h deleted file mode 100644 index 5d1c1e5..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/list.h +++ /dev/null @@ -1,91 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -#ifndef __LINUX_LIST_H -#define __LINUX_LIST_H - -#define LIST_HEAD_INIT(name) { &(name), &(name) } -#define LIST_HEAD(name) \ - struct list_head name = LIST_HEAD_INIT(name) - -#define POISON_POINTER_DELTA 0 -#define LIST_POISON1 ((void *)((char *) 0x100 + POISON_POINTER_DELTA)) -#define LIST_POISON2 ((void *)((char *) 0x200 + POISON_POINTER_DELTA)) - - -static inline void INIT_LIST_HEAD(struct list_head *list) -{ - list->next = list; - list->prev = list; -} - -static inline void __list_add(struct list_head *new, - struct list_head *prev, - struct list_head *next) -{ - next->prev = new; - new->next = next; - new->prev = prev; - prev->next = new; -} - -/** - * list_add - add a new entry - * @new: new entry to be added - * @head: list head to add it after - * - * Insert a new entry after the specified head. - * This is good for implementing stacks. - */ -static inline void list_add(struct list_head *new, struct list_head *head) -{ - __list_add(new, head, head->next); -} - -/* - * Delete a list entry by making the prev/next entries - * point to each other. - * - * This is only for internal list manipulation where we know - * the prev/next entries already! - */ -static inline void __list_del(struct list_head * prev, struct list_head * next) -{ - next->prev = prev; - prev->next = next; -} - -/** - * list_del - deletes entry from list. - * @entry: the element to delete from the list. - * Note: list_empty() on entry does not return true after this, the entry is - * in an undefined state. - */ -static inline void __list_del_entry(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); -} - -static inline void list_del(struct list_head *entry) -{ - __list_del(entry->prev, entry->next); - entry->next = LIST_POISON1; - entry->prev = LIST_POISON2; -} - -static inline int list_empty(const struct list_head *head) -{ - return head->next == head; -} - -#define list_entry(ptr, type, member) \ - container_of(ptr, type, member) -#define list_first_entry(ptr, type, member) \ - list_entry((ptr)->next, type, member) -#define list_next_entry(pos, member) \ - list_entry((pos)->member.next, typeof(*(pos)), member) -#define list_for_each_entry(pos, head, member) \ - for (pos = list_first_entry(head, typeof(*pos), member); \ - &pos->member != (head); \ - pos = list_next_entry(pos, member)) - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/overflow.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/overflow.h deleted file mode 100644 index 6998be2..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/overflow.h +++ /dev/null @@ -1,90 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -#ifndef __LINUX_OVERFLOW_H -#define __LINUX_OVERFLOW_H - -#define is_signed_type(type) (((type)(-1)) < (type)1) -#define __type_half_max(type) ((type)1 << (8*sizeof(type) - 1 - is_signed_type(type))) -#define type_max(T) ((T)((__type_half_max(T) - 1) + __type_half_max(T))) -#define type_min(T) ((T)((T)-type_max(T)-(T)1)) - -#ifndef unlikely -#define unlikely(x) __builtin_expect(!!(x), 0) -#endif - -#ifdef __GNUC__ -#define GCC_VERSION (__GNUC__ * 10000 \ - + __GNUC_MINOR__ * 100 \ - + __GNUC_PATCHLEVEL__) -#if GCC_VERSION >= 50100 -#define COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW 1 -#endif -#endif - -#ifdef COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW - -#define check_mul_overflow(a, b, d) ({ \ - typeof(a) __a = (a); \ - typeof(b) __b = (b); \ - typeof(d) __d = (d); \ - (void) (&__a == &__b); \ - (void) (&__a == __d); \ - __builtin_mul_overflow(__a, __b, __d); \ -}) - -#else - -/* - * If one of a or b is a compile-time constant, this avoids a division. - */ -#define __unsigned_mul_overflow(a, b, d) ({ \ - typeof(a) __a = (a); \ - typeof(b) __b = (b); \ - typeof(d) __d = (d); \ - (void) (&__a == &__b); \ - (void) (&__a == __d); \ - *__d = __a * __b; \ - __builtin_constant_p(__b) ? \ - __b > 0 && __a > type_max(typeof(__a)) / __b : \ - __a > 0 && __b > type_max(typeof(__b)) / __a; \ -}) - -/* - * Signed multiplication is rather hard. gcc always follows C99, so - * division is truncated towards 0. This means that we can write the - * overflow check like this: - * - * (a > 0 && (b > MAX/a || b < MIN/a)) || - * (a < -1 && (b > MIN/a || b < MAX/a) || - * (a == -1 && b == MIN) - * - * The redundant casts of -1 are to silence an annoying -Wtype-limits - * (included in -Wextra) warning: When the type is u8 or u16, the - * __b_c_e in check_mul_overflow obviously selects - * __unsigned_mul_overflow, but unfortunately gcc still parses this - * code and warns about the limited range of __b. - */ - -#define __signed_mul_overflow(a, b, d) ({ \ - typeof(a) __a = (a); \ - typeof(b) __b = (b); \ - typeof(d) __d = (d); \ - typeof(a) __tmax = type_max(typeof(a)); \ - typeof(a) __tmin = type_min(typeof(a)); \ - (void) (&__a == &__b); \ - (void) (&__a == __d); \ - *__d = (__u64)__a * (__u64)__b; \ - (__b > 0 && (__a > __tmax/__b || __a < __tmin/__b)) || \ - (__b < (typeof(__b))-1 && (__a > __tmin/__b || __a < __tmax/__b)) || \ - (__b == (typeof(__b))-1 && __a == __tmin); \ -}) - -#define check_mul_overflow(a, b, d) \ - __builtin_choose_expr(is_signed_type(typeof(a)), \ - __signed_mul_overflow(a, b, d), \ - __unsigned_mul_overflow(a, b, d)) - - -#endif /* COMPILER_HAS_GENERIC_BUILTIN_OVERFLOW */ - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/ring_buffer.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/ring_buffer.h deleted file mode 100644 index 4adf182..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/ring_buffer.h +++ /dev/null @@ -1,18 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#ifndef _TOOLS_LINUX_RING_BUFFER_H_ -#define _TOOLS_LINUX_RING_BUFFER_H_ - -#include - -static inline __u64 ring_buffer_read_head(struct perf_event_mmap_page *base) -{ - return smp_load_acquire(&base->data_head); -} - -static inline void ring_buffer_write_tail(struct perf_event_mmap_page *base, - __u64 tail) -{ - smp_store_release(&base->data_tail, tail); -} - -#endif /* _TOOLS_LINUX_RING_BUFFER_H_ */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/types.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/types.h deleted file mode 100644 index 7ba4ae3..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/linux/types.h +++ /dev/null @@ -1,33 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -#ifndef __LINUX_TYPES_H -#define __LINUX_TYPES_H - -#include -#include -#include - -#include - -#include -#include - -#define __bitwise__ -#define __bitwise __bitwise__ - -typedef __u16 __bitwise __le16; -typedef __u16 __bitwise __be16; -typedef __u32 __bitwise __le32; -typedef __u32 __bitwise __be32; -typedef __u64 __bitwise __le64; -typedef __u64 __bitwise __be64; - -#ifndef __aligned_u64 -# define __aligned_u64 __u64 __attribute__((aligned(8))) -#endif - -struct list_head { - struct list_head *next, *prev; -}; - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/bpf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/bpf.h deleted file mode 100644 index aab6c70..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/bpf.h +++ /dev/null @@ -1,6846 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -/* Copyright (c) 2011-2014 PLUMgrid, http://plumgrid.com - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of version 2 of the GNU General Public - * License as published by the Free Software Foundation. - */ -#ifndef _UAPI__LINUX_BPF_H__ -#define _UAPI__LINUX_BPF_H__ - -#include -#include - -/* Extended instruction set based on top of classic BPF */ - -/* instruction classes */ -#define BPF_JMP32 0x06 /* jmp mode in word width */ -#define BPF_ALU64 0x07 /* alu mode in double word width */ - -/* ld/ldx fields */ -#define BPF_DW 0x18 /* double word (64-bit) */ -#define BPF_ATOMIC 0xc0 /* atomic memory ops - op type in immediate */ -#define BPF_XADD 0xc0 /* exclusive add - legacy name */ - -/* alu/jmp fields */ -#define BPF_MOV 0xb0 /* mov reg to reg */ -#define BPF_ARSH 0xc0 /* sign extending arithmetic shift right */ - -/* change endianness of a register */ -#define BPF_END 0xd0 /* flags for endianness conversion: */ -#define BPF_TO_LE 0x00 /* convert to little-endian */ -#define BPF_TO_BE 0x08 /* convert to big-endian */ -#define BPF_FROM_LE BPF_TO_LE -#define BPF_FROM_BE BPF_TO_BE - -/* jmp encodings */ -#define BPF_JNE 0x50 /* jump != */ -#define BPF_JLT 0xa0 /* LT is unsigned, '<' */ -#define BPF_JLE 0xb0 /* LE is unsigned, '<=' */ -#define BPF_JSGT 0x60 /* SGT is signed '>', GT in x86 */ -#define BPF_JSGE 0x70 /* SGE is signed '>=', GE in x86 */ -#define BPF_JSLT 0xc0 /* SLT is signed, '<' */ -#define BPF_JSLE 0xd0 /* SLE is signed, '<=' */ -#define BPF_CALL 0x80 /* function call */ -#define BPF_EXIT 0x90 /* function return */ - -/* atomic op type fields (stored in immediate) */ -#define BPF_FETCH 0x01 /* not an opcode on its own, used to build others */ -#define BPF_XCHG (0xe0 | BPF_FETCH) /* atomic exchange */ -#define BPF_CMPXCHG (0xf0 | BPF_FETCH) /* atomic compare-and-write */ - -/* Register numbers */ -enum { - BPF_REG_0 = 0, - BPF_REG_1, - BPF_REG_2, - BPF_REG_3, - BPF_REG_4, - BPF_REG_5, - BPF_REG_6, - BPF_REG_7, - BPF_REG_8, - BPF_REG_9, - BPF_REG_10, - __MAX_BPF_REG, -}; - -/* BPF has 10 general purpose 64-bit registers and stack frame. */ -#define MAX_BPF_REG __MAX_BPF_REG - -struct bpf_insn { - __u8 code; /* opcode */ - __u8 dst_reg:4; /* dest register */ - __u8 src_reg:4; /* source register */ - __s16 off; /* signed offset */ - __s32 imm; /* signed immediate constant */ -}; - -/* Key of an a BPF_MAP_TYPE_LPM_TRIE entry */ -struct bpf_lpm_trie_key { - __u32 prefixlen; /* up to 32 for AF_INET, 128 for AF_INET6 */ - __u8 data[0]; /* Arbitrary size */ -}; - -struct bpf_cgroup_storage_key { - __u64 cgroup_inode_id; /* cgroup inode id */ - __u32 attach_type; /* program attach type (enum bpf_attach_type) */ -}; - -union bpf_iter_link_info { - struct { - __u32 map_fd; - } map; -}; - -/* BPF syscall commands, see bpf(2) man-page for more details. */ -/** - * DOC: eBPF Syscall Preamble - * - * The operation to be performed by the **bpf**\ () system call is determined - * by the *cmd* argument. Each operation takes an accompanying argument, - * provided via *attr*, which is a pointer to a union of type *bpf_attr* (see - * below). The size argument is the size of the union pointed to by *attr*. - */ -/** - * DOC: eBPF Syscall Commands - * - * BPF_MAP_CREATE - * Description - * Create a map and return a file descriptor that refers to the - * map. The close-on-exec file descriptor flag (see **fcntl**\ (2)) - * is automatically enabled for the new file descriptor. - * - * Applying **close**\ (2) to the file descriptor returned by - * **BPF_MAP_CREATE** will delete the map (but see NOTES). - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_MAP_LOOKUP_ELEM - * Description - * Look up an element with a given *key* in the map referred to - * by the file descriptor *map_fd*. - * - * The *flags* argument may be specified as one of the - * following: - * - * **BPF_F_LOCK** - * Look up the value of a spin-locked map without - * returning the lock. This must be specified if the - * elements contain a spinlock. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_MAP_UPDATE_ELEM - * Description - * Create or update an element (key/value pair) in a specified map. - * - * The *flags* argument should be specified as one of the - * following: - * - * **BPF_ANY** - * Create a new element or update an existing element. - * **BPF_NOEXIST** - * Create a new element only if it did not exist. - * **BPF_EXIST** - * Update an existing element. - * **BPF_F_LOCK** - * Update a spin_lock-ed map element. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * May set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, - * **E2BIG**, **EEXIST**, or **ENOENT**. - * - * **E2BIG** - * The number of elements in the map reached the - * *max_entries* limit specified at map creation time. - * **EEXIST** - * If *flags* specifies **BPF_NOEXIST** and the element - * with *key* already exists in the map. - * **ENOENT** - * If *flags* specifies **BPF_EXIST** and the element with - * *key* does not exist in the map. - * - * BPF_MAP_DELETE_ELEM - * Description - * Look up and delete an element by key in a specified map. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_MAP_GET_NEXT_KEY - * Description - * Look up an element by key in a specified map and return the key - * of the next element. Can be used to iterate over all elements - * in the map. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * The following cases can be used to iterate over all elements of - * the map: - * - * * If *key* is not found, the operation returns zero and sets - * the *next_key* pointer to the key of the first element. - * * If *key* is found, the operation returns zero and sets the - * *next_key* pointer to the key of the next element. - * * If *key* is the last element, returns -1 and *errno* is set - * to **ENOENT**. - * - * May set *errno* to **ENOMEM**, **EFAULT**, **EPERM**, or - * **EINVAL** on error. - * - * BPF_PROG_LOAD - * Description - * Verify and load an eBPF program, returning a new file - * descriptor associated with the program. - * - * Applying **close**\ (2) to the file descriptor returned by - * **BPF_PROG_LOAD** will unload the eBPF program (but see NOTES). - * - * The close-on-exec file descriptor flag (see **fcntl**\ (2)) is - * automatically enabled for the new file descriptor. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_OBJ_PIN - * Description - * Pin an eBPF program or map referred by the specified *bpf_fd* - * to the provided *pathname* on the filesystem. - * - * The *pathname* argument must not contain a dot ("."). - * - * On success, *pathname* retains a reference to the eBPF object, - * preventing deallocation of the object when the original - * *bpf_fd* is closed. This allow the eBPF object to live beyond - * **close**\ (\ *bpf_fd*\ ), and hence the lifetime of the parent - * process. - * - * Applying **unlink**\ (2) or similar calls to the *pathname* - * unpins the object from the filesystem, removing the reference. - * If no other file descriptors or filesystem nodes refer to the - * same object, it will be deallocated (see NOTES). - * - * The filesystem type for the parent directory of *pathname* must - * be **BPF_FS_MAGIC**. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_OBJ_GET - * Description - * Open a file descriptor for the eBPF object pinned to the - * specified *pathname*. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_PROG_ATTACH - * Description - * Attach an eBPF program to a *target_fd* at the specified - * *attach_type* hook. - * - * The *attach_type* specifies the eBPF attachment point to - * attach the program to, and must be one of *bpf_attach_type* - * (see below). - * - * The *attach_bpf_fd* must be a valid file descriptor for a - * loaded eBPF program of a cgroup, flow dissector, LIRC, sockmap - * or sock_ops type corresponding to the specified *attach_type*. - * - * The *target_fd* must be a valid file descriptor for a kernel - * object which depends on the attach type of *attach_bpf_fd*: - * - * **BPF_PROG_TYPE_CGROUP_DEVICE**, - * **BPF_PROG_TYPE_CGROUP_SKB**, - * **BPF_PROG_TYPE_CGROUP_SOCK**, - * **BPF_PROG_TYPE_CGROUP_SOCK_ADDR**, - * **BPF_PROG_TYPE_CGROUP_SOCKOPT**, - * **BPF_PROG_TYPE_CGROUP_SYSCTL**, - * **BPF_PROG_TYPE_SOCK_OPS** - * - * Control Group v2 hierarchy with the eBPF controller - * enabled. Requires the kernel to be compiled with - * **CONFIG_CGROUP_BPF**. - * - * **BPF_PROG_TYPE_FLOW_DISSECTOR** - * - * Network namespace (eg /proc/self/ns/net). - * - * **BPF_PROG_TYPE_LIRC_MODE2** - * - * LIRC device path (eg /dev/lircN). Requires the kernel - * to be compiled with **CONFIG_BPF_LIRC_MODE2**. - * - * **BPF_PROG_TYPE_SK_SKB**, - * **BPF_PROG_TYPE_SK_MSG** - * - * eBPF map of socket type (eg **BPF_MAP_TYPE_SOCKHASH**). - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_PROG_DETACH - * Description - * Detach the eBPF program associated with the *target_fd* at the - * hook specified by *attach_type*. The program must have been - * previously attached using **BPF_PROG_ATTACH**. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_PROG_TEST_RUN - * Description - * Run the eBPF program associated with the *prog_fd* a *repeat* - * number of times against a provided program context *ctx_in* and - * data *data_in*, and return the modified program context - * *ctx_out*, *data_out* (for example, packet data), result of the - * execution *retval*, and *duration* of the test run. - * - * The sizes of the buffers provided as input and output - * parameters *ctx_in*, *ctx_out*, *data_in*, and *data_out* must - * be provided in the corresponding variables *ctx_size_in*, - * *ctx_size_out*, *data_size_in*, and/or *data_size_out*. If any - * of these parameters are not provided (ie set to NULL), the - * corresponding size field must be zero. - * - * Some program types have particular requirements: - * - * **BPF_PROG_TYPE_SK_LOOKUP** - * *data_in* and *data_out* must be NULL. - * - * **BPF_PROG_TYPE_RAW_TRACEPOINT**, - * **BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE** - * - * *ctx_out*, *data_in* and *data_out* must be NULL. - * *repeat* must be zero. - * - * BPF_PROG_RUN is an alias for BPF_PROG_TEST_RUN. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * **ENOSPC** - * Either *data_size_out* or *ctx_size_out* is too small. - * **ENOTSUPP** - * This command is not supported by the program type of - * the program referred to by *prog_fd*. - * - * BPF_PROG_GET_NEXT_ID - * Description - * Fetch the next eBPF program currently loaded into the kernel. - * - * Looks for the eBPF program with an id greater than *start_id* - * and updates *next_id* on success. If no other eBPF programs - * remain with ids higher than *start_id*, returns -1 and sets - * *errno* to **ENOENT**. - * - * Return - * Returns zero on success. On error, or when no id remains, -1 - * is returned and *errno* is set appropriately. - * - * BPF_MAP_GET_NEXT_ID - * Description - * Fetch the next eBPF map currently loaded into the kernel. - * - * Looks for the eBPF map with an id greater than *start_id* - * and updates *next_id* on success. If no other eBPF maps - * remain with ids higher than *start_id*, returns -1 and sets - * *errno* to **ENOENT**. - * - * Return - * Returns zero on success. On error, or when no id remains, -1 - * is returned and *errno* is set appropriately. - * - * BPF_PROG_GET_FD_BY_ID - * Description - * Open a file descriptor for the eBPF program corresponding to - * *prog_id*. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_MAP_GET_FD_BY_ID - * Description - * Open a file descriptor for the eBPF map corresponding to - * *map_id*. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_OBJ_GET_INFO_BY_FD - * Description - * Obtain information about the eBPF object corresponding to - * *bpf_fd*. - * - * Populates up to *info_len* bytes of *info*, which will be in - * one of the following formats depending on the eBPF object type - * of *bpf_fd*: - * - * * **struct bpf_prog_info** - * * **struct bpf_map_info** - * * **struct bpf_btf_info** - * * **struct bpf_link_info** - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_PROG_QUERY - * Description - * Obtain information about eBPF programs associated with the - * specified *attach_type* hook. - * - * The *target_fd* must be a valid file descriptor for a kernel - * object which depends on the attach type of *attach_bpf_fd*: - * - * **BPF_PROG_TYPE_CGROUP_DEVICE**, - * **BPF_PROG_TYPE_CGROUP_SKB**, - * **BPF_PROG_TYPE_CGROUP_SOCK**, - * **BPF_PROG_TYPE_CGROUP_SOCK_ADDR**, - * **BPF_PROG_TYPE_CGROUP_SOCKOPT**, - * **BPF_PROG_TYPE_CGROUP_SYSCTL**, - * **BPF_PROG_TYPE_SOCK_OPS** - * - * Control Group v2 hierarchy with the eBPF controller - * enabled. Requires the kernel to be compiled with - * **CONFIG_CGROUP_BPF**. - * - * **BPF_PROG_TYPE_FLOW_DISSECTOR** - * - * Network namespace (eg /proc/self/ns/net). - * - * **BPF_PROG_TYPE_LIRC_MODE2** - * - * LIRC device path (eg /dev/lircN). Requires the kernel - * to be compiled with **CONFIG_BPF_LIRC_MODE2**. - * - * **BPF_PROG_QUERY** always fetches the number of programs - * attached and the *attach_flags* which were used to attach those - * programs. Additionally, if *prog_ids* is nonzero and the number - * of attached programs is less than *prog_cnt*, populates - * *prog_ids* with the eBPF program ids of the programs attached - * at *target_fd*. - * - * The following flags may alter the result: - * - * **BPF_F_QUERY_EFFECTIVE** - * Only return information regarding programs which are - * currently effective at the specified *target_fd*. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_RAW_TRACEPOINT_OPEN - * Description - * Attach an eBPF program to a tracepoint *name* to access kernel - * internal arguments of the tracepoint in their raw form. - * - * The *prog_fd* must be a valid file descriptor associated with - * a loaded eBPF program of type **BPF_PROG_TYPE_RAW_TRACEPOINT**. - * - * No ABI guarantees are made about the content of tracepoint - * arguments exposed to the corresponding eBPF program. - * - * Applying **close**\ (2) to the file descriptor returned by - * **BPF_RAW_TRACEPOINT_OPEN** will delete the map (but see NOTES). - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_BTF_LOAD - * Description - * Verify and load BPF Type Format (BTF) metadata into the kernel, - * returning a new file descriptor associated with the metadata. - * BTF is described in more detail at - * https://www.kernel.org/doc/html/latest/bpf/btf.html. - * - * The *btf* parameter must point to valid memory providing - * *btf_size* bytes of BTF binary metadata. - * - * The returned file descriptor can be passed to other **bpf**\ () - * subcommands such as **BPF_PROG_LOAD** or **BPF_MAP_CREATE** to - * associate the BTF with those objects. - * - * Similar to **BPF_PROG_LOAD**, **BPF_BTF_LOAD** has optional - * parameters to specify a *btf_log_buf*, *btf_log_size* and - * *btf_log_level* which allow the kernel to return freeform log - * output regarding the BTF verification process. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_BTF_GET_FD_BY_ID - * Description - * Open a file descriptor for the BPF Type Format (BTF) - * corresponding to *btf_id*. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_TASK_FD_QUERY - * Description - * Obtain information about eBPF programs associated with the - * target process identified by *pid* and *fd*. - * - * If the *pid* and *fd* are associated with a tracepoint, kprobe - * or uprobe perf event, then the *prog_id* and *fd_type* will - * be populated with the eBPF program id and file descriptor type - * of type **bpf_task_fd_type**. If associated with a kprobe or - * uprobe, the *probe_offset* and *probe_addr* will also be - * populated. Optionally, if *buf* is provided, then up to - * *buf_len* bytes of *buf* will be populated with the name of - * the tracepoint, kprobe or uprobe. - * - * The resulting *prog_id* may be introspected in deeper detail - * using **BPF_PROG_GET_FD_BY_ID** and **BPF_OBJ_GET_INFO_BY_FD**. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_MAP_LOOKUP_AND_DELETE_ELEM - * Description - * Look up an element with the given *key* in the map referred to - * by the file descriptor *fd*, and if found, delete the element. - * - * For **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map - * types, the *flags* argument needs to be set to 0, but for other - * map types, it may be specified as: - * - * **BPF_F_LOCK** - * Look up and delete the value of a spin-locked map - * without returning the lock. This must be specified if - * the elements contain a spinlock. - * - * The **BPF_MAP_TYPE_QUEUE** and **BPF_MAP_TYPE_STACK** map types - * implement this command as a "pop" operation, deleting the top - * element rather than one corresponding to *key*. - * The *key* and *key_len* parameters should be zeroed when - * issuing this operation for these map types. - * - * This command is only valid for the following map types: - * * **BPF_MAP_TYPE_QUEUE** - * * **BPF_MAP_TYPE_STACK** - * * **BPF_MAP_TYPE_HASH** - * * **BPF_MAP_TYPE_PERCPU_HASH** - * * **BPF_MAP_TYPE_LRU_HASH** - * * **BPF_MAP_TYPE_LRU_PERCPU_HASH** - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_MAP_FREEZE - * Description - * Freeze the permissions of the specified map. - * - * Write permissions may be frozen by passing zero *flags*. - * Upon success, no future syscall invocations may alter the - * map state of *map_fd*. Write operations from eBPF programs - * are still possible for a frozen map. - * - * Not supported for maps of type **BPF_MAP_TYPE_STRUCT_OPS**. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_BTF_GET_NEXT_ID - * Description - * Fetch the next BPF Type Format (BTF) object currently loaded - * into the kernel. - * - * Looks for the BTF object with an id greater than *start_id* - * and updates *next_id* on success. If no other BTF objects - * remain with ids higher than *start_id*, returns -1 and sets - * *errno* to **ENOENT**. - * - * Return - * Returns zero on success. On error, or when no id remains, -1 - * is returned and *errno* is set appropriately. - * - * BPF_MAP_LOOKUP_BATCH - * Description - * Iterate and fetch multiple elements in a map. - * - * Two opaque values are used to manage batch operations, - * *in_batch* and *out_batch*. Initially, *in_batch* must be set - * to NULL to begin the batched operation. After each subsequent - * **BPF_MAP_LOOKUP_BATCH**, the caller should pass the resultant - * *out_batch* as the *in_batch* for the next operation to - * continue iteration from the current point. - * - * The *keys* and *values* are output parameters which must point - * to memory large enough to hold *count* items based on the key - * and value size of the map *map_fd*. The *keys* buffer must be - * of *key_size* * *count*. The *values* buffer must be of - * *value_size* * *count*. - * - * The *elem_flags* argument may be specified as one of the - * following: - * - * **BPF_F_LOCK** - * Look up the value of a spin-locked map without - * returning the lock. This must be specified if the - * elements contain a spinlock. - * - * On success, *count* elements from the map are copied into the - * user buffer, with the keys copied into *keys* and the values - * copied into the corresponding indices in *values*. - * - * If an error is returned and *errno* is not **EFAULT**, *count* - * is set to the number of successfully processed elements. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * May set *errno* to **ENOSPC** to indicate that *keys* or - * *values* is too small to dump an entire bucket during - * iteration of a hash-based map type. - * - * BPF_MAP_LOOKUP_AND_DELETE_BATCH - * Description - * Iterate and delete all elements in a map. - * - * This operation has the same behavior as - * **BPF_MAP_LOOKUP_BATCH** with two exceptions: - * - * * Every element that is successfully returned is also deleted - * from the map. This is at least *count* elements. Note that - * *count* is both an input and an output parameter. - * * Upon returning with *errno* set to **EFAULT**, up to - * *count* elements may be deleted without returning the keys - * and values of the deleted elements. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_MAP_UPDATE_BATCH - * Description - * Update multiple elements in a map by *key*. - * - * The *keys* and *values* are input parameters which must point - * to memory large enough to hold *count* items based on the key - * and value size of the map *map_fd*. The *keys* buffer must be - * of *key_size* * *count*. The *values* buffer must be of - * *value_size* * *count*. - * - * Each element specified in *keys* is sequentially updated to the - * value in the corresponding index in *values*. The *in_batch* - * and *out_batch* parameters are ignored and should be zeroed. - * - * The *elem_flags* argument should be specified as one of the - * following: - * - * **BPF_ANY** - * Create new elements or update a existing elements. - * **BPF_NOEXIST** - * Create new elements only if they do not exist. - * **BPF_EXIST** - * Update existing elements. - * **BPF_F_LOCK** - * Update spin_lock-ed map elements. This must be - * specified if the map value contains a spinlock. - * - * On success, *count* elements from the map are updated. - * - * If an error is returned and *errno* is not **EFAULT**, *count* - * is set to the number of successfully processed elements. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * May set *errno* to **EINVAL**, **EPERM**, **ENOMEM**, or - * **E2BIG**. **E2BIG** indicates that the number of elements in - * the map reached the *max_entries* limit specified at map - * creation time. - * - * May set *errno* to one of the following error codes under - * specific circumstances: - * - * **EEXIST** - * If *flags* specifies **BPF_NOEXIST** and the element - * with *key* already exists in the map. - * **ENOENT** - * If *flags* specifies **BPF_EXIST** and the element with - * *key* does not exist in the map. - * - * BPF_MAP_DELETE_BATCH - * Description - * Delete multiple elements in a map by *key*. - * - * The *keys* parameter is an input parameter which must point - * to memory large enough to hold *count* items based on the key - * size of the map *map_fd*, that is, *key_size* * *count*. - * - * Each element specified in *keys* is sequentially deleted. The - * *in_batch*, *out_batch*, and *values* parameters are ignored - * and should be zeroed. - * - * The *elem_flags* argument may be specified as one of the - * following: - * - * **BPF_F_LOCK** - * Look up the value of a spin-locked map without - * returning the lock. This must be specified if the - * elements contain a spinlock. - * - * On success, *count* elements from the map are updated. - * - * If an error is returned and *errno* is not **EFAULT**, *count* - * is set to the number of successfully processed elements. If - * *errno* is **EFAULT**, up to *count* elements may be been - * deleted. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_LINK_CREATE - * Description - * Attach an eBPF program to a *target_fd* at the specified - * *attach_type* hook and return a file descriptor handle for - * managing the link. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_LINK_UPDATE - * Description - * Update the eBPF program in the specified *link_fd* to - * *new_prog_fd*. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_LINK_GET_FD_BY_ID - * Description - * Open a file descriptor for the eBPF Link corresponding to - * *link_id*. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_LINK_GET_NEXT_ID - * Description - * Fetch the next eBPF link currently loaded into the kernel. - * - * Looks for the eBPF link with an id greater than *start_id* - * and updates *next_id* on success. If no other eBPF links - * remain with ids higher than *start_id*, returns -1 and sets - * *errno* to **ENOENT**. - * - * Return - * Returns zero on success. On error, or when no id remains, -1 - * is returned and *errno* is set appropriately. - * - * BPF_ENABLE_STATS - * Description - * Enable eBPF runtime statistics gathering. - * - * Runtime statistics gathering for the eBPF runtime is disabled - * by default to minimize the corresponding performance overhead. - * This command enables statistics globally. - * - * Multiple programs may independently enable statistics. - * After gathering the desired statistics, eBPF runtime statistics - * may be disabled again by calling **close**\ (2) for the file - * descriptor returned by this function. Statistics will only be - * disabled system-wide when all outstanding file descriptors - * returned by prior calls for this subcommand are closed. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_ITER_CREATE - * Description - * Create an iterator on top of the specified *link_fd* (as - * previously created using **BPF_LINK_CREATE**) and return a - * file descriptor that can be used to trigger the iteration. - * - * If the resulting file descriptor is pinned to the filesystem - * using **BPF_OBJ_PIN**, then subsequent **read**\ (2) syscalls - * for that path will trigger the iterator to read kernel state - * using the eBPF program attached to *link_fd*. - * - * Return - * A new file descriptor (a nonnegative integer), or -1 if an - * error occurred (in which case, *errno* is set appropriately). - * - * BPF_LINK_DETACH - * Description - * Forcefully detach the specified *link_fd* from its - * corresponding attachment point. - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * BPF_PROG_BIND_MAP - * Description - * Bind a map to the lifetime of an eBPF program. - * - * The map identified by *map_fd* is bound to the program - * identified by *prog_fd* and only released when *prog_fd* is - * released. This may be used in cases where metadata should be - * associated with a program which otherwise does not contain any - * references to the map (for example, embedded in the eBPF - * program instructions). - * - * Return - * Returns zero on success. On error, -1 is returned and *errno* - * is set appropriately. - * - * NOTES - * eBPF objects (maps and programs) can be shared between processes. - * - * * After **fork**\ (2), the child inherits file descriptors - * referring to the same eBPF objects. - * * File descriptors referring to eBPF objects can be transferred over - * **unix**\ (7) domain sockets. - * * File descriptors referring to eBPF objects can be duplicated in the - * usual way, using **dup**\ (2) and similar calls. - * * File descriptors referring to eBPF objects can be pinned to the - * filesystem using the **BPF_OBJ_PIN** command of **bpf**\ (2). - * - * An eBPF object is deallocated only after all file descriptors referring - * to the object have been closed and no references remain pinned to the - * filesystem or attached (for example, bound to a program or device). - */ -enum bpf_cmd { - BPF_MAP_CREATE, - BPF_MAP_LOOKUP_ELEM, - BPF_MAP_UPDATE_ELEM, - BPF_MAP_DELETE_ELEM, - BPF_MAP_GET_NEXT_KEY, - BPF_PROG_LOAD, - BPF_OBJ_PIN, - BPF_OBJ_GET, - BPF_PROG_ATTACH, - BPF_PROG_DETACH, - BPF_PROG_TEST_RUN, - BPF_PROG_RUN = BPF_PROG_TEST_RUN, - BPF_PROG_GET_NEXT_ID, - BPF_MAP_GET_NEXT_ID, - BPF_PROG_GET_FD_BY_ID, - BPF_MAP_GET_FD_BY_ID, - BPF_OBJ_GET_INFO_BY_FD, - BPF_PROG_QUERY, - BPF_RAW_TRACEPOINT_OPEN, - BPF_BTF_LOAD, - BPF_BTF_GET_FD_BY_ID, - BPF_TASK_FD_QUERY, - BPF_MAP_LOOKUP_AND_DELETE_ELEM, - BPF_MAP_FREEZE, - BPF_BTF_GET_NEXT_ID, - BPF_MAP_LOOKUP_BATCH, - BPF_MAP_LOOKUP_AND_DELETE_BATCH, - BPF_MAP_UPDATE_BATCH, - BPF_MAP_DELETE_BATCH, - BPF_LINK_CREATE, - BPF_LINK_UPDATE, - BPF_LINK_GET_FD_BY_ID, - BPF_LINK_GET_NEXT_ID, - BPF_ENABLE_STATS, - BPF_ITER_CREATE, - BPF_LINK_DETACH, - BPF_PROG_BIND_MAP, -}; - -enum bpf_map_type { - BPF_MAP_TYPE_UNSPEC, - BPF_MAP_TYPE_HASH, - BPF_MAP_TYPE_ARRAY, - BPF_MAP_TYPE_PROG_ARRAY, - BPF_MAP_TYPE_PERF_EVENT_ARRAY, - BPF_MAP_TYPE_PERCPU_HASH, - BPF_MAP_TYPE_PERCPU_ARRAY, - BPF_MAP_TYPE_STACK_TRACE, - BPF_MAP_TYPE_CGROUP_ARRAY, - BPF_MAP_TYPE_LRU_HASH, - BPF_MAP_TYPE_LRU_PERCPU_HASH, - BPF_MAP_TYPE_LPM_TRIE, - BPF_MAP_TYPE_ARRAY_OF_MAPS, - BPF_MAP_TYPE_HASH_OF_MAPS, - BPF_MAP_TYPE_DEVMAP, - BPF_MAP_TYPE_SOCKMAP, - BPF_MAP_TYPE_CPUMAP, - BPF_MAP_TYPE_XSKMAP, - BPF_MAP_TYPE_SOCKHASH, - BPF_MAP_TYPE_CGROUP_STORAGE, - BPF_MAP_TYPE_REUSEPORT_SOCKARRAY, - BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE, - BPF_MAP_TYPE_QUEUE, - BPF_MAP_TYPE_STACK, - BPF_MAP_TYPE_SK_STORAGE, - BPF_MAP_TYPE_DEVMAP_HASH, - BPF_MAP_TYPE_STRUCT_OPS, - BPF_MAP_TYPE_RINGBUF, - BPF_MAP_TYPE_INODE_STORAGE, - BPF_MAP_TYPE_TASK_STORAGE, - BPF_MAP_TYPE_BLOOM_FILTER, -}; - -/* Note that tracing related programs such as - * BPF_PROG_TYPE_{KPROBE,TRACEPOINT,PERF_EVENT,RAW_TRACEPOINT} - * are not subject to a stable API since kernel internal data - * structures can change from release to release and may - * therefore break existing tracing BPF programs. Tracing BPF - * programs correspond to /a/ specific kernel which is to be - * analyzed, and not /a/ specific kernel /and/ all future ones. - */ -enum bpf_prog_type { - BPF_PROG_TYPE_UNSPEC, - BPF_PROG_TYPE_SOCKET_FILTER, - BPF_PROG_TYPE_KPROBE, - BPF_PROG_TYPE_SCHED_CLS, - BPF_PROG_TYPE_SCHED_ACT, - BPF_PROG_TYPE_TRACEPOINT, - BPF_PROG_TYPE_XDP, - BPF_PROG_TYPE_PERF_EVENT, - BPF_PROG_TYPE_CGROUP_SKB, - BPF_PROG_TYPE_CGROUP_SOCK, - BPF_PROG_TYPE_LWT_IN, - BPF_PROG_TYPE_LWT_OUT, - BPF_PROG_TYPE_LWT_XMIT, - BPF_PROG_TYPE_SOCK_OPS, - BPF_PROG_TYPE_SK_SKB, - BPF_PROG_TYPE_CGROUP_DEVICE, - BPF_PROG_TYPE_SK_MSG, - BPF_PROG_TYPE_RAW_TRACEPOINT, - BPF_PROG_TYPE_CGROUP_SOCK_ADDR, - BPF_PROG_TYPE_LWT_SEG6LOCAL, - BPF_PROG_TYPE_LIRC_MODE2, - BPF_PROG_TYPE_SK_REUSEPORT, - BPF_PROG_TYPE_FLOW_DISSECTOR, - BPF_PROG_TYPE_CGROUP_SYSCTL, - BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, - BPF_PROG_TYPE_CGROUP_SOCKOPT, - BPF_PROG_TYPE_TRACING, - BPF_PROG_TYPE_STRUCT_OPS, - BPF_PROG_TYPE_EXT, - BPF_PROG_TYPE_LSM, - BPF_PROG_TYPE_SK_LOOKUP, - BPF_PROG_TYPE_SYSCALL, /* a program that can execute syscalls */ -}; - -enum bpf_attach_type { - BPF_CGROUP_INET_INGRESS, - BPF_CGROUP_INET_EGRESS, - BPF_CGROUP_INET_SOCK_CREATE, - BPF_CGROUP_SOCK_OPS, - BPF_SK_SKB_STREAM_PARSER, - BPF_SK_SKB_STREAM_VERDICT, - BPF_CGROUP_DEVICE, - BPF_SK_MSG_VERDICT, - BPF_CGROUP_INET4_BIND, - BPF_CGROUP_INET6_BIND, - BPF_CGROUP_INET4_CONNECT, - BPF_CGROUP_INET6_CONNECT, - BPF_CGROUP_INET4_POST_BIND, - BPF_CGROUP_INET6_POST_BIND, - BPF_CGROUP_UDP4_SENDMSG, - BPF_CGROUP_UDP6_SENDMSG, - BPF_LIRC_MODE2, - BPF_FLOW_DISSECTOR, - BPF_CGROUP_SYSCTL, - BPF_CGROUP_UDP4_RECVMSG, - BPF_CGROUP_UDP6_RECVMSG, - BPF_CGROUP_GETSOCKOPT, - BPF_CGROUP_SETSOCKOPT, - BPF_TRACE_RAW_TP, - BPF_TRACE_FENTRY, - BPF_TRACE_FEXIT, - BPF_MODIFY_RETURN, - BPF_LSM_MAC, - BPF_TRACE_ITER, - BPF_CGROUP_INET4_GETPEERNAME, - BPF_CGROUP_INET6_GETPEERNAME, - BPF_CGROUP_INET4_GETSOCKNAME, - BPF_CGROUP_INET6_GETSOCKNAME, - BPF_XDP_DEVMAP, - BPF_CGROUP_INET_SOCK_RELEASE, - BPF_XDP_CPUMAP, - BPF_SK_LOOKUP, - BPF_XDP, - BPF_SK_SKB_VERDICT, - BPF_SK_REUSEPORT_SELECT, - BPF_SK_REUSEPORT_SELECT_OR_MIGRATE, - BPF_PERF_EVENT, - BPF_TRACE_KPROBE_MULTI, - BPF_LSM_CGROUP, - __MAX_BPF_ATTACH_TYPE -}; - -#define MAX_BPF_ATTACH_TYPE __MAX_BPF_ATTACH_TYPE - -enum bpf_link_type { - BPF_LINK_TYPE_UNSPEC = 0, - BPF_LINK_TYPE_RAW_TRACEPOINT = 1, - BPF_LINK_TYPE_TRACING = 2, - BPF_LINK_TYPE_CGROUP = 3, - BPF_LINK_TYPE_ITER = 4, - BPF_LINK_TYPE_NETNS = 5, - BPF_LINK_TYPE_XDP = 6, - BPF_LINK_TYPE_PERF_EVENT = 7, - BPF_LINK_TYPE_KPROBE_MULTI = 8, - BPF_LINK_TYPE_STRUCT_OPS = 9, - - MAX_BPF_LINK_TYPE, -}; - -/* cgroup-bpf attach flags used in BPF_PROG_ATTACH command - * - * NONE(default): No further bpf programs allowed in the subtree. - * - * BPF_F_ALLOW_OVERRIDE: If a sub-cgroup installs some bpf program, - * the program in this cgroup yields to sub-cgroup program. - * - * BPF_F_ALLOW_MULTI: If a sub-cgroup installs some bpf program, - * that cgroup program gets run in addition to the program in this cgroup. - * - * Only one program is allowed to be attached to a cgroup with - * NONE or BPF_F_ALLOW_OVERRIDE flag. - * Attaching another program on top of NONE or BPF_F_ALLOW_OVERRIDE will - * release old program and attach the new one. Attach flags has to match. - * - * Multiple programs are allowed to be attached to a cgroup with - * BPF_F_ALLOW_MULTI flag. They are executed in FIFO order - * (those that were attached first, run first) - * The programs of sub-cgroup are executed first, then programs of - * this cgroup and then programs of parent cgroup. - * When children program makes decision (like picking TCP CA or sock bind) - * parent program has a chance to override it. - * - * With BPF_F_ALLOW_MULTI a new program is added to the end of the list of - * programs for a cgroup. Though it's possible to replace an old program at - * any position by also specifying BPF_F_REPLACE flag and position itself in - * replace_bpf_fd attribute. Old program at this position will be released. - * - * A cgroup with MULTI or OVERRIDE flag allows any attach flags in sub-cgroups. - * A cgroup with NONE doesn't allow any programs in sub-cgroups. - * Ex1: - * cgrp1 (MULTI progs A, B) -> - * cgrp2 (OVERRIDE prog C) -> - * cgrp3 (MULTI prog D) -> - * cgrp4 (OVERRIDE prog E) -> - * cgrp5 (NONE prog F) - * the event in cgrp5 triggers execution of F,D,A,B in that order. - * if prog F is detached, the execution is E,D,A,B - * if prog F and D are detached, the execution is E,A,B - * if prog F, E and D are detached, the execution is C,A,B - * - * All eligible programs are executed regardless of return code from - * earlier programs. - */ -#define BPF_F_ALLOW_OVERRIDE (1U << 0) -#define BPF_F_ALLOW_MULTI (1U << 1) -#define BPF_F_REPLACE (1U << 2) - -/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the - * verifier will perform strict alignment checking as if the kernel - * has been built with CONFIG_EFFICIENT_UNALIGNED_ACCESS not set, - * and NET_IP_ALIGN defined to 2. - */ -#define BPF_F_STRICT_ALIGNMENT (1U << 0) - -/* If BPF_F_ANY_ALIGNMENT is used in BPF_PROF_LOAD command, the - * verifier will allow any alignment whatsoever. On platforms - * with strict alignment requirements for loads ands stores (such - * as sparc and mips) the verifier validates that all loads and - * stores provably follow this requirement. This flag turns that - * checking and enforcement off. - * - * It is mostly used for testing when we want to validate the - * context and memory access aspects of the verifier, but because - * of an unaligned access the alignment check would trigger before - * the one we are interested in. - */ -#define BPF_F_ANY_ALIGNMENT (1U << 1) - -/* BPF_F_TEST_RND_HI32 is used in BPF_PROG_LOAD command for testing purpose. - * Verifier does sub-register def/use analysis and identifies instructions whose - * def only matters for low 32-bit, high 32-bit is never referenced later - * through implicit zero extension. Therefore verifier notifies JIT back-ends - * that it is safe to ignore clearing high 32-bit for these instructions. This - * saves some back-ends a lot of code-gen. However such optimization is not - * necessary on some arches, for example x86_64, arm64 etc, whose JIT back-ends - * hence hasn't used verifier's analysis result. But, we really want to have a - * way to be able to verify the correctness of the described optimization on - * x86_64 on which testsuites are frequently exercised. - * - * So, this flag is introduced. Once it is set, verifier will randomize high - * 32-bit for those instructions who has been identified as safe to ignore them. - * Then, if verifier is not doing correct analysis, such randomization will - * regress tests to expose bugs. - */ -#define BPF_F_TEST_RND_HI32 (1U << 2) - -/* The verifier internal test flag. Behavior is undefined */ -#define BPF_F_TEST_STATE_FREQ (1U << 3) - -/* If BPF_F_SLEEPABLE is used in BPF_PROG_LOAD command, the verifier will - * restrict map and helper usage for such programs. Sleepable BPF programs can - * only be attached to hooks where kernel execution context allows sleeping. - * Such programs are allowed to use helpers that may sleep like - * bpf_copy_from_user(). - */ -#define BPF_F_SLEEPABLE (1U << 4) - -/* If BPF_F_XDP_HAS_FRAGS is used in BPF_PROG_LOAD command, the loaded program - * fully support xdp frags. - */ -#define BPF_F_XDP_HAS_FRAGS (1U << 5) - -/* link_create.kprobe_multi.flags used in LINK_CREATE command for - * BPF_TRACE_KPROBE_MULTI attach type to create return probe. - */ -#define BPF_F_KPROBE_MULTI_RETURN (1U << 0) - -/* When BPF ldimm64's insn[0].src_reg != 0 then this can have - * the following extensions: - * - * insn[0].src_reg: BPF_PSEUDO_MAP_[FD|IDX] - * insn[0].imm: map fd or fd_idx - * insn[1].imm: 0 - * insn[0].off: 0 - * insn[1].off: 0 - * ldimm64 rewrite: address of map - * verifier type: CONST_PTR_TO_MAP - */ -#define BPF_PSEUDO_MAP_FD 1 -#define BPF_PSEUDO_MAP_IDX 5 - -/* insn[0].src_reg: BPF_PSEUDO_MAP_[IDX_]VALUE - * insn[0].imm: map fd or fd_idx - * insn[1].imm: offset into value - * insn[0].off: 0 - * insn[1].off: 0 - * ldimm64 rewrite: address of map[0]+offset - * verifier type: PTR_TO_MAP_VALUE - */ -#define BPF_PSEUDO_MAP_VALUE 2 -#define BPF_PSEUDO_MAP_IDX_VALUE 6 - -/* insn[0].src_reg: BPF_PSEUDO_BTF_ID - * insn[0].imm: kernel btd id of VAR - * insn[1].imm: 0 - * insn[0].off: 0 - * insn[1].off: 0 - * ldimm64 rewrite: address of the kernel variable - * verifier type: PTR_TO_BTF_ID or PTR_TO_MEM, depending on whether the var - * is struct/union. - */ -#define BPF_PSEUDO_BTF_ID 3 -/* insn[0].src_reg: BPF_PSEUDO_FUNC - * insn[0].imm: insn offset to the func - * insn[1].imm: 0 - * insn[0].off: 0 - * insn[1].off: 0 - * ldimm64 rewrite: address of the function - * verifier type: PTR_TO_FUNC. - */ -#define BPF_PSEUDO_FUNC 4 - -/* when bpf_call->src_reg == BPF_PSEUDO_CALL, bpf_call->imm == pc-relative - * offset to another bpf function - */ -#define BPF_PSEUDO_CALL 1 -/* when bpf_call->src_reg == BPF_PSEUDO_KFUNC_CALL, - * bpf_call->imm == btf_id of a BTF_KIND_FUNC in the running kernel - */ -#define BPF_PSEUDO_KFUNC_CALL 2 - -/* flags for BPF_MAP_UPDATE_ELEM command */ -enum { - BPF_ANY = 0, /* create new element or update existing */ - BPF_NOEXIST = 1, /* create new element if it didn't exist */ - BPF_EXIST = 2, /* update existing element */ - BPF_F_LOCK = 4, /* spin_lock-ed map_lookup/map_update */ -}; - -/* flags for BPF_MAP_CREATE command */ -enum { - BPF_F_NO_PREALLOC = (1U << 0), -/* Instead of having one common LRU list in the - * BPF_MAP_TYPE_LRU_[PERCPU_]HASH map, use a percpu LRU list - * which can scale and perform better. - * Note, the LRU nodes (including free nodes) cannot be moved - * across different LRU lists. - */ - BPF_F_NO_COMMON_LRU = (1U << 1), -/* Specify numa node during map creation */ - BPF_F_NUMA_NODE = (1U << 2), - -/* Flags for accessing BPF object from syscall side. */ - BPF_F_RDONLY = (1U << 3), - BPF_F_WRONLY = (1U << 4), - -/* Flag for stack_map, store build_id+offset instead of pointer */ - BPF_F_STACK_BUILD_ID = (1U << 5), - -/* Zero-initialize hash function seed. This should only be used for testing. */ - BPF_F_ZERO_SEED = (1U << 6), - -/* Flags for accessing BPF object from program side. */ - BPF_F_RDONLY_PROG = (1U << 7), - BPF_F_WRONLY_PROG = (1U << 8), - -/* Clone map from listener for newly accepted socket */ - BPF_F_CLONE = (1U << 9), - -/* Enable memory-mapping BPF map */ - BPF_F_MMAPABLE = (1U << 10), - -/* Share perf_event among processes */ - BPF_F_PRESERVE_ELEMS = (1U << 11), - -/* Create a map that is suitable to be an inner map with dynamic max entries */ - BPF_F_INNER_MAP = (1U << 12), -}; - -/* Flags for BPF_PROG_QUERY. */ - -/* Query effective (directly attached + inherited from ancestor cgroups) - * programs that will be executed for events within a cgroup. - * attach_flags with this flag are returned only for directly attached programs. - */ -#define BPF_F_QUERY_EFFECTIVE (1U << 0) - -/* Flags for BPF_PROG_TEST_RUN */ - -/* If set, run the test on the cpu specified by bpf_attr.test.cpu */ -#define BPF_F_TEST_RUN_ON_CPU (1U << 0) -/* If set, XDP frames will be transmitted after processing */ -#define BPF_F_TEST_XDP_LIVE_FRAMES (1U << 1) - -/* type for BPF_ENABLE_STATS */ -enum bpf_stats_type { - /* enabled run_time_ns and run_cnt */ - BPF_STATS_RUN_TIME = 0, -}; - -enum bpf_stack_build_id_status { - /* user space need an empty entry to identify end of a trace */ - BPF_STACK_BUILD_ID_EMPTY = 0, - /* with valid build_id and offset */ - BPF_STACK_BUILD_ID_VALID = 1, - /* couldn't get build_id, fallback to ip */ - BPF_STACK_BUILD_ID_IP = 2, -}; - -#define BPF_BUILD_ID_SIZE 20 -struct bpf_stack_build_id { - __s32 status; - unsigned char build_id[BPF_BUILD_ID_SIZE]; - union { - __u64 offset; - __u64 ip; - }; -}; - -#define BPF_OBJ_NAME_LEN 16U - -union bpf_attr { - struct { /* anonymous struct used by BPF_MAP_CREATE command */ - __u32 map_type; /* one of enum bpf_map_type */ - __u32 key_size; /* size of key in bytes */ - __u32 value_size; /* size of value in bytes */ - __u32 max_entries; /* max number of entries in a map */ - __u32 map_flags; /* BPF_MAP_CREATE related - * flags defined above. - */ - __u32 inner_map_fd; /* fd pointing to the inner map */ - __u32 numa_node; /* numa node (effective only if - * BPF_F_NUMA_NODE is set). - */ - char map_name[BPF_OBJ_NAME_LEN]; - __u32 map_ifindex; /* ifindex of netdev to create on */ - __u32 btf_fd; /* fd pointing to a BTF type data */ - __u32 btf_key_type_id; /* BTF type_id of the key */ - __u32 btf_value_type_id; /* BTF type_id of the value */ - __u32 btf_vmlinux_value_type_id;/* BTF type_id of a kernel- - * struct stored as the - * map value - */ - /* Any per-map-type extra fields - * - * BPF_MAP_TYPE_BLOOM_FILTER - the lowest 4 bits indicate the - * number of hash functions (if 0, the bloom filter will default - * to using 5 hash functions). - */ - __u64 map_extra; - }; - - struct { /* anonymous struct used by BPF_MAP_*_ELEM commands */ - __u32 map_fd; - __aligned_u64 key; - union { - __aligned_u64 value; - __aligned_u64 next_key; - }; - __u64 flags; - }; - - struct { /* struct used by BPF_MAP_*_BATCH commands */ - __aligned_u64 in_batch; /* start batch, - * NULL to start from beginning - */ - __aligned_u64 out_batch; /* output: next start batch */ - __aligned_u64 keys; - __aligned_u64 values; - __u32 count; /* input/output: - * input: # of key/value - * elements - * output: # of filled elements - */ - __u32 map_fd; - __u64 elem_flags; - __u64 flags; - } batch; - - struct { /* anonymous struct used by BPF_PROG_LOAD command */ - __u32 prog_type; /* one of enum bpf_prog_type */ - __u32 insn_cnt; - __aligned_u64 insns; - __aligned_u64 license; - __u32 log_level; /* verbosity level of verifier */ - __u32 log_size; /* size of user buffer */ - __aligned_u64 log_buf; /* user supplied buffer */ - __u32 kern_version; /* not used */ - __u32 prog_flags; - char prog_name[BPF_OBJ_NAME_LEN]; - __u32 prog_ifindex; /* ifindex of netdev to prep for */ - /* For some prog types expected attach type must be known at - * load time to verify attach type specific parts of prog - * (context accesses, allowed helpers, etc). - */ - __u32 expected_attach_type; - __u32 prog_btf_fd; /* fd pointing to BTF type data */ - __u32 func_info_rec_size; /* userspace bpf_func_info size */ - __aligned_u64 func_info; /* func info */ - __u32 func_info_cnt; /* number of bpf_func_info records */ - __u32 line_info_rec_size; /* userspace bpf_line_info size */ - __aligned_u64 line_info; /* line info */ - __u32 line_info_cnt; /* number of bpf_line_info records */ - __u32 attach_btf_id; /* in-kernel BTF type id to attach to */ - union { - /* valid prog_fd to attach to bpf prog */ - __u32 attach_prog_fd; - /* or valid module BTF object fd or 0 to attach to vmlinux */ - __u32 attach_btf_obj_fd; - }; - __u32 core_relo_cnt; /* number of bpf_core_relo */ - __aligned_u64 fd_array; /* array of FDs */ - __aligned_u64 core_relos; - __u32 core_relo_rec_size; /* sizeof(struct bpf_core_relo) */ - }; - - struct { /* anonymous struct used by BPF_OBJ_* commands */ - __aligned_u64 pathname; - __u32 bpf_fd; - __u32 file_flags; - }; - - struct { /* anonymous struct used by BPF_PROG_ATTACH/DETACH commands */ - __u32 target_fd; /* container object to attach to */ - __u32 attach_bpf_fd; /* eBPF program to attach */ - __u32 attach_type; - __u32 attach_flags; - __u32 replace_bpf_fd; /* previously attached eBPF - * program to replace if - * BPF_F_REPLACE is used - */ - }; - - struct { /* anonymous struct used by BPF_PROG_TEST_RUN command */ - __u32 prog_fd; - __u32 retval; - __u32 data_size_in; /* input: len of data_in */ - __u32 data_size_out; /* input/output: len of data_out - * returns ENOSPC if data_out - * is too small. - */ - __aligned_u64 data_in; - __aligned_u64 data_out; - __u32 repeat; - __u32 duration; - __u32 ctx_size_in; /* input: len of ctx_in */ - __u32 ctx_size_out; /* input/output: len of ctx_out - * returns ENOSPC if ctx_out - * is too small. - */ - __aligned_u64 ctx_in; - __aligned_u64 ctx_out; - __u32 flags; - __u32 cpu; - __u32 batch_size; - } test; - - struct { /* anonymous struct used by BPF_*_GET_*_ID */ - union { - __u32 start_id; - __u32 prog_id; - __u32 map_id; - __u32 btf_id; - __u32 link_id; - }; - __u32 next_id; - __u32 open_flags; - }; - - struct { /* anonymous struct used by BPF_OBJ_GET_INFO_BY_FD */ - __u32 bpf_fd; - __u32 info_len; - __aligned_u64 info; - } info; - - struct { /* anonymous struct used by BPF_PROG_QUERY command */ - __u32 target_fd; /* container object to query */ - __u32 attach_type; - __u32 query_flags; - __u32 attach_flags; - __aligned_u64 prog_ids; - __u32 prog_cnt; - __aligned_u64 prog_attach_flags; /* output: per-program attach_flags */ - } query; - - struct { /* anonymous struct used by BPF_RAW_TRACEPOINT_OPEN command */ - __u64 name; - __u32 prog_fd; - } raw_tracepoint; - - struct { /* anonymous struct for BPF_BTF_LOAD */ - __aligned_u64 btf; - __aligned_u64 btf_log_buf; - __u32 btf_size; - __u32 btf_log_size; - __u32 btf_log_level; - }; - - struct { - __u32 pid; /* input: pid */ - __u32 fd; /* input: fd */ - __u32 flags; /* input: flags */ - __u32 buf_len; /* input/output: buf len */ - __aligned_u64 buf; /* input/output: - * tp_name for tracepoint - * symbol for kprobe - * filename for uprobe - */ - __u32 prog_id; /* output: prod_id */ - __u32 fd_type; /* output: BPF_FD_TYPE_* */ - __u64 probe_offset; /* output: probe_offset */ - __u64 probe_addr; /* output: probe_addr */ - } task_fd_query; - - struct { /* struct used by BPF_LINK_CREATE command */ - __u32 prog_fd; /* eBPF program to attach */ - union { - __u32 target_fd; /* object to attach to */ - __u32 target_ifindex; /* target ifindex */ - }; - __u32 attach_type; /* attach type */ - __u32 flags; /* extra flags */ - union { - __u32 target_btf_id; /* btf_id of target to attach to */ - struct { - __aligned_u64 iter_info; /* extra bpf_iter_link_info */ - __u32 iter_info_len; /* iter_info length */ - }; - struct { - /* black box user-provided value passed through - * to BPF program at the execution time and - * accessible through bpf_get_attach_cookie() BPF helper - */ - __u64 bpf_cookie; - } perf_event; - struct { - __u32 flags; - __u32 cnt; - __aligned_u64 syms; - __aligned_u64 addrs; - __aligned_u64 cookies; - } kprobe_multi; - struct { - /* this is overlaid with the target_btf_id above. */ - __u32 target_btf_id; - /* black box user-provided value passed through - * to BPF program at the execution time and - * accessible through bpf_get_attach_cookie() BPF helper - */ - __u64 cookie; - } tracing; - }; - } link_create; - - struct { /* struct used by BPF_LINK_UPDATE command */ - __u32 link_fd; /* link fd */ - /* new program fd to update link with */ - __u32 new_prog_fd; - __u32 flags; /* extra flags */ - /* expected link's program fd; is specified only if - * BPF_F_REPLACE flag is set in flags */ - __u32 old_prog_fd; - } link_update; - - struct { - __u32 link_fd; - } link_detach; - - struct { /* struct used by BPF_ENABLE_STATS command */ - __u32 type; - } enable_stats; - - struct { /* struct used by BPF_ITER_CREATE command */ - __u32 link_fd; - __u32 flags; - } iter_create; - - struct { /* struct used by BPF_PROG_BIND_MAP command */ - __u32 prog_fd; - __u32 map_fd; - __u32 flags; /* extra flags */ - } prog_bind_map; - -} __attribute__((aligned(8))); - -/* The description below is an attempt at providing documentation to eBPF - * developers about the multiple available eBPF helper functions. It can be - * parsed and used to produce a manual page. The workflow is the following, - * and requires the rst2man utility: - * - * $ ./scripts/bpf_doc.py \ - * --filename include/uapi/linux/bpf.h > /tmp/bpf-helpers.rst - * $ rst2man /tmp/bpf-helpers.rst > /tmp/bpf-helpers.7 - * $ man /tmp/bpf-helpers.7 - * - * Note that in order to produce this external documentation, some RST - * formatting is used in the descriptions to get "bold" and "italics" in - * manual pages. Also note that the few trailing white spaces are - * intentional, removing them would break paragraphs for rst2man. - * - * Start of BPF helper function descriptions: - * - * void *bpf_map_lookup_elem(struct bpf_map *map, const void *key) - * Description - * Perform a lookup in *map* for an entry associated to *key*. - * Return - * Map value associated to *key*, or **NULL** if no entry was - * found. - * - * long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags) - * Description - * Add or update the value of the entry associated to *key* in - * *map* with *value*. *flags* is one of: - * - * **BPF_NOEXIST** - * The entry for *key* must not exist in the map. - * **BPF_EXIST** - * The entry for *key* must already exist in the map. - * **BPF_ANY** - * No condition on the existence of the entry for *key*. - * - * Flag value **BPF_NOEXIST** cannot be used for maps of types - * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all - * elements always exist), the helper would return an error. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_map_delete_elem(struct bpf_map *map, const void *key) - * Description - * Delete entry with *key* from *map*. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_probe_read(void *dst, u32 size, const void *unsafe_ptr) - * Description - * For tracing programs, safely attempt to read *size* bytes from - * kernel space address *unsafe_ptr* and store the data in *dst*. - * - * Generally, use **bpf_probe_read_user**\ () or - * **bpf_probe_read_kernel**\ () instead. - * Return - * 0 on success, or a negative error in case of failure. - * - * u64 bpf_ktime_get_ns(void) - * Description - * Return the time elapsed since system boot, in nanoseconds. - * Does not include time the system was suspended. - * See: **clock_gettime**\ (**CLOCK_MONOTONIC**) - * Return - * Current *ktime*. - * - * long bpf_trace_printk(const char *fmt, u32 fmt_size, ...) - * Description - * This helper is a "printk()-like" facility for debugging. It - * prints a message defined by format *fmt* (of size *fmt_size*) - * to file *\/sys/kernel/debug/tracing/trace* from DebugFS, if - * available. It can take up to three additional **u64** - * arguments (as an eBPF helpers, the total number of arguments is - * limited to five). - * - * Each time the helper is called, it appends a line to the trace. - * Lines are discarded while *\/sys/kernel/debug/tracing/trace* is - * open, use *\/sys/kernel/debug/tracing/trace_pipe* to avoid this. - * The format of the trace is customizable, and the exact output - * one will get depends on the options set in - * *\/sys/kernel/debug/tracing/trace_options* (see also the - * *README* file under the same directory). However, it usually - * defaults to something like: - * - * :: - * - * telnet-470 [001] .N.. 419421.045894: 0x00000001: - * - * In the above: - * - * * ``telnet`` is the name of the current task. - * * ``470`` is the PID of the current task. - * * ``001`` is the CPU number on which the task is - * running. - * * In ``.N..``, each character refers to a set of - * options (whether irqs are enabled, scheduling - * options, whether hard/softirqs are running, level of - * preempt_disabled respectively). **N** means that - * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** - * are set. - * * ``419421.045894`` is a timestamp. - * * ``0x00000001`` is a fake value used by BPF for the - * instruction pointer register. - * * ```` is the message formatted with - * *fmt*. - * - * The conversion specifiers supported by *fmt* are similar, but - * more limited than for printk(). They are **%d**, **%i**, - * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, - * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size - * of field, padding with zeroes, etc.) is available, and the - * helper will return **-EINVAL** (but print nothing) if it - * encounters an unknown specifier. - * - * Also, note that **bpf_trace_printk**\ () is slow, and should - * only be used for debugging purposes. For this reason, a notice - * block (spanning several lines) is printed to kernel logs and - * states that the helper should not be used "for production use" - * the first time this helper is used (or more precisely, when - * **trace_printk**\ () buffers are allocated). For passing values - * to user space, perf events should be preferred. - * Return - * The number of bytes written to the buffer, or a negative error - * in case of failure. - * - * u32 bpf_get_prandom_u32(void) - * Description - * Get a pseudo-random number. - * - * From a security point of view, this helper uses its own - * pseudo-random internal state, and cannot be used to infer the - * seed of other random functions in the kernel. However, it is - * essential to note that the generator used by the helper is not - * cryptographically secure. - * Return - * A random 32-bit unsigned value. - * - * u32 bpf_get_smp_processor_id(void) - * Description - * Get the SMP (symmetric multiprocessing) processor id. Note that - * all programs run with migration disabled, which means that the - * SMP processor id is stable during all the execution of the - * program. - * Return - * The SMP id of the processor running the program. - * - * long bpf_skb_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len, u64 flags) - * Description - * Store *len* bytes from address *from* into the packet - * associated to *skb*, at *offset*. *flags* are a combination of - * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the - * checksum for the packet after storing the bytes) and - * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ - * **->swhash** and *skb*\ **->l4hash** to 0). - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_l3_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 size) - * Description - * Recompute the layer 3 (e.g. IP) checksum for the packet - * associated to *skb*. Computation is incremental, so the helper - * must know the former value of the header field that was - * modified (*from*), the new value of this field (*to*), and the - * number of bytes (2 or 4) for this field, stored in *size*. - * Alternatively, it is possible to store the difference between - * the previous and the new values of the header field in *to*, by - * setting *from* and *size* to 0. For both methods, *offset* - * indicates the location of the IP checksum within the packet. - * - * This helper works in combination with **bpf_csum_diff**\ (), - * which does not update the checksum in-place, but offers more - * flexibility and can handle sizes larger than 2 or 4 for the - * checksum to update. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_l4_csum_replace(struct sk_buff *skb, u32 offset, u64 from, u64 to, u64 flags) - * Description - * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the - * packet associated to *skb*. Computation is incremental, so the - * helper must know the former value of the header field that was - * modified (*from*), the new value of this field (*to*), and the - * number of bytes (2 or 4) for this field, stored on the lowest - * four bits of *flags*. Alternatively, it is possible to store - * the difference between the previous and the new values of the - * header field in *to*, by setting *from* and the four lowest - * bits of *flags* to 0. For both methods, *offset* indicates the - * location of the IP checksum within the packet. In addition to - * the size of the field, *flags* can be added (bitwise OR) actual - * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left - * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and - * for updates resulting in a null checksum the value is set to - * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates - * the checksum is to be computed against a pseudo-header. - * - * This helper works in combination with **bpf_csum_diff**\ (), - * which does not update the checksum in-place, but offers more - * flexibility and can handle sizes larger than 2 or 4 for the - * checksum to update. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_tail_call(void *ctx, struct bpf_map *prog_array_map, u32 index) - * Description - * This special helper is used to trigger a "tail call", or in - * other words, to jump into another eBPF program. The same stack - * frame is used (but values on stack and in registers for the - * caller are not accessible to the callee). This mechanism allows - * for program chaining, either for raising the maximum number of - * available eBPF instructions, or to execute given programs in - * conditional blocks. For security reasons, there is an upper - * limit to the number of successive tail calls that can be - * performed. - * - * Upon call of this helper, the program attempts to jump into a - * program referenced at index *index* in *prog_array_map*, a - * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes - * *ctx*, a pointer to the context. - * - * If the call succeeds, the kernel immediately runs the first - * instruction of the new program. This is not a function call, - * and it never returns to the previous program. If the call - * fails, then the helper has no effect, and the caller continues - * to run its subsequent instructions. A call can fail if the - * destination program for the jump does not exist (i.e. *index* - * is superior to the number of entries in *prog_array_map*), or - * if the maximum number of tail calls has been reached for this - * chain of programs. This limit is defined in the kernel by the - * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), - * which is currently set to 33. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_clone_redirect(struct sk_buff *skb, u32 ifindex, u64 flags) - * Description - * Clone and redirect the packet associated to *skb* to another - * net device of index *ifindex*. Both ingress and egress - * interfaces can be used for redirection. The **BPF_F_INGRESS** - * value in *flags* is used to make the distinction (ingress path - * is selected if the flag is present, egress path otherwise). - * This is the only flag supported for now. - * - * In comparison with **bpf_redirect**\ () helper, - * **bpf_clone_redirect**\ () has the associated cost of - * duplicating the packet buffer, but this can be executed out of - * the eBPF program. Conversely, **bpf_redirect**\ () is more - * efficient, but it is handled through an action code where the - * redirection happens only after the eBPF program has returned. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * u64 bpf_get_current_pid_tgid(void) - * Description - * Get the current pid and tgid. - * Return - * A 64-bit integer containing the current tgid and pid, and - * created as such: - * *current_task*\ **->tgid << 32 \|** - * *current_task*\ **->pid**. - * - * u64 bpf_get_current_uid_gid(void) - * Description - * Get the current uid and gid. - * Return - * A 64-bit integer containing the current GID and UID, and - * created as such: *current_gid* **<< 32 \|** *current_uid*. - * - * long bpf_get_current_comm(void *buf, u32 size_of_buf) - * Description - * Copy the **comm** attribute of the current task into *buf* of - * *size_of_buf*. The **comm** attribute contains the name of - * the executable (excluding the path) for the current task. The - * *size_of_buf* must be strictly positive. On success, the - * helper makes sure that the *buf* is NUL-terminated. On failure, - * it is filled with zeroes. - * Return - * 0 on success, or a negative error in case of failure. - * - * u32 bpf_get_cgroup_classid(struct sk_buff *skb) - * Description - * Retrieve the classid for the current task, i.e. for the net_cls - * cgroup to which *skb* belongs. - * - * This helper can be used on TC egress path, but not on ingress. - * - * The net_cls cgroup provides an interface to tag network packets - * based on a user-provided identifier for all traffic coming from - * the tasks belonging to the related cgroup. See also the related - * kernel documentation, available from the Linux sources in file - * *Documentation/admin-guide/cgroup-v1/net_cls.rst*. - * - * The Linux kernel has two versions for cgroups: there are - * cgroups v1 and cgroups v2. Both are available to users, who can - * use a mixture of them, but note that the net_cls cgroup is for - * cgroup v1 only. This makes it incompatible with BPF programs - * run on cgroups, which is a cgroup-v2-only feature (a socket can - * only hold data for one version of cgroups at a time). - * - * This helper is only available is the kernel was compiled with - * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to - * "**y**" or to "**m**". - * Return - * The classid, or 0 for the default unconfigured classid. - * - * long bpf_skb_vlan_push(struct sk_buff *skb, __be16 vlan_proto, u16 vlan_tci) - * Description - * Push a *vlan_tci* (VLAN tag control information) of protocol - * *vlan_proto* to the packet associated to *skb*, then update - * the checksum. Note that if *vlan_proto* is different from - * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to - * be **ETH_P_8021Q**. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_vlan_pop(struct sk_buff *skb) - * Description - * Pop a VLAN header from the packet associated to *skb*. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_get_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) - * Description - * Get tunnel metadata. This helper takes a pointer *key* to an - * empty **struct bpf_tunnel_key** of **size**, that will be - * filled with tunnel metadata for the packet associated to *skb*. - * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which - * indicates that the tunnel is based on IPv6 protocol instead of - * IPv4. - * - * The **struct bpf_tunnel_key** is an object that generalizes the - * principal parameters used by various tunneling protocols into a - * single struct. This way, it can be used to easily make a - * decision based on the contents of the encapsulation header, - * "summarized" in this struct. In particular, it holds the IP - * address of the remote end (IPv4 or IPv6, depending on the case) - * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, - * this struct exposes the *key*\ **->tunnel_id**, which is - * generally mapped to a VNI (Virtual Network Identifier), making - * it programmable together with the **bpf_skb_set_tunnel_key**\ - * () helper. - * - * Let's imagine that the following code is part of a program - * attached to the TC ingress interface, on one end of a GRE - * tunnel, and is supposed to filter out all messages coming from - * remote ends with IPv4 address other than 10.0.0.1: - * - * :: - * - * int ret; - * struct bpf_tunnel_key key = {}; - * - * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); - * if (ret < 0) - * return TC_ACT_SHOT; // drop packet - * - * if (key.remote_ipv4 != 0x0a000001) - * return TC_ACT_SHOT; // drop packet - * - * return TC_ACT_OK; // accept packet - * - * This interface can also be used with all encapsulation devices - * that can operate in "collect metadata" mode: instead of having - * one network device per specific configuration, the "collect - * metadata" mode only requires a single device where the - * configuration can be extracted from this helper. - * - * This can be used together with various tunnels such as VXLan, - * Geneve, GRE or IP in IP (IPIP). - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_set_tunnel_key(struct sk_buff *skb, struct bpf_tunnel_key *key, u32 size, u64 flags) - * Description - * Populate tunnel metadata for packet associated to *skb.* The - * tunnel metadata is set to the contents of *key*, of *size*. The - * *flags* can be set to a combination of the following values: - * - * **BPF_F_TUNINFO_IPV6** - * Indicate that the tunnel is based on IPv6 protocol - * instead of IPv4. - * **BPF_F_ZERO_CSUM_TX** - * For IPv4 packets, add a flag to tunnel metadata - * indicating that checksum computation should be skipped - * and checksum set to zeroes. - * **BPF_F_DONT_FRAGMENT** - * Add a flag to tunnel metadata indicating that the - * packet should not be fragmented. - * **BPF_F_SEQ_NUMBER** - * Add a flag to tunnel metadata indicating that a - * sequence number should be added to tunnel header before - * sending the packet. This flag was added for GRE - * encapsulation, but might be used with other protocols - * as well in the future. - * - * Here is a typical usage on the transmit path: - * - * :: - * - * struct bpf_tunnel_key key; - * populate key ... - * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); - * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); - * - * See also the description of the **bpf_skb_get_tunnel_key**\ () - * helper for additional information. - * Return - * 0 on success, or a negative error in case of failure. - * - * u64 bpf_perf_event_read(struct bpf_map *map, u64 flags) - * Description - * Read the value of a perf event counter. This helper relies on a - * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of - * the perf event counter is selected when *map* is updated with - * perf event file descriptors. The *map* is an array whose size - * is the number of available CPUs, and each cell contains a value - * relative to one CPU. The value to retrieve is indicated by - * *flags*, that contains the index of the CPU to look up, masked - * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to - * **BPF_F_CURRENT_CPU** to indicate that the value for the - * current CPU should be retrieved. - * - * Note that before Linux 4.13, only hardware perf event can be - * retrieved. - * - * Also, be aware that the newer helper - * **bpf_perf_event_read_value**\ () is recommended over - * **bpf_perf_event_read**\ () in general. The latter has some ABI - * quirks where error and counter value are used as a return code - * (which is wrong to do since ranges may overlap). This issue is - * fixed with **bpf_perf_event_read_value**\ (), which at the same - * time provides more features over the **bpf_perf_event_read**\ - * () interface. Please refer to the description of - * **bpf_perf_event_read_value**\ () for details. - * Return - * The value of the perf event counter read from the map, or a - * negative error code in case of failure. - * - * long bpf_redirect(u32 ifindex, u64 flags) - * Description - * Redirect the packet to another net device of index *ifindex*. - * This helper is somewhat similar to **bpf_clone_redirect**\ - * (), except that the packet is not cloned, which provides - * increased performance. - * - * Except for XDP, both ingress and egress interfaces can be used - * for redirection. The **BPF_F_INGRESS** value in *flags* is used - * to make the distinction (ingress path is selected if the flag - * is present, egress path otherwise). Currently, XDP only - * supports redirection to the egress interface, and accepts no - * flag at all. - * - * The same effect can also be attained with the more generic - * **bpf_redirect_map**\ (), which uses a BPF map to store the - * redirect target instead of providing it directly to the helper. - * Return - * For XDP, the helper returns **XDP_REDIRECT** on success or - * **XDP_ABORTED** on error. For other program types, the values - * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on - * error. - * - * u32 bpf_get_route_realm(struct sk_buff *skb) - * Description - * Retrieve the realm or the route, that is to say the - * **tclassid** field of the destination for the *skb*. The - * identifier retrieved is a user-provided tag, similar to the - * one used with the net_cls cgroup (see description for - * **bpf_get_cgroup_classid**\ () helper), but here this tag is - * held by a route (a destination entry), not by a task. - * - * Retrieving this identifier works with the clsact TC egress hook - * (see also **tc-bpf(8)**), or alternatively on conventional - * classful egress qdiscs, but not on TC ingress path. In case of - * clsact TC egress hook, this has the advantage that, internally, - * the destination entry has not been dropped yet in the transmit - * path. Therefore, the destination entry does not need to be - * artificially held via **netif_keep_dst**\ () for a classful - * qdisc until the *skb* is freed. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_IP_ROUTE_CLASSID** configuration option. - * Return - * The realm of the route for the packet associated to *skb*, or 0 - * if none was found. - * - * long bpf_perf_event_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) - * Description - * Write raw *data* blob into a special BPF perf event held by - * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf - * event must have the following attributes: **PERF_SAMPLE_RAW** - * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and - * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. - * - * The *flags* are used to indicate the index in *map* for which - * the value must be put, masked with **BPF_F_INDEX_MASK**. - * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** - * to indicate that the index of the current CPU core should be - * used. - * - * The value to write, of *size*, is passed through eBPF stack and - * pointed by *data*. - * - * The context of the program *ctx* needs also be passed to the - * helper. - * - * On user space, a program willing to read the values needs to - * call **perf_event_open**\ () on the perf event (either for - * one or for all CPUs) and to store the file descriptor into the - * *map*. This must be done before the eBPF program can send data - * into it. An example is available in file - * *samples/bpf/trace_output_user.c* in the Linux kernel source - * tree (the eBPF program counterpart is in - * *samples/bpf/trace_output_kern.c*). - * - * **bpf_perf_event_output**\ () achieves better performance - * than **bpf_trace_printk**\ () for sharing data with user - * space, and is much better suitable for streaming data from eBPF - * programs. - * - * Note that this helper is not restricted to tracing use cases - * and can be used with programs attached to TC or XDP as well, - * where it allows for passing data to user space listeners. Data - * can be: - * - * * Only custom structs, - * * Only the packet payload, or - * * A combination of both. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_load_bytes(const void *skb, u32 offset, void *to, u32 len) - * Description - * This helper was provided as an easy way to load data from a - * packet. It can be used to load *len* bytes from *offset* from - * the packet associated to *skb*, into the buffer pointed by - * *to*. - * - * Since Linux 4.7, usage of this helper has mostly been replaced - * by "direct packet access", enabling packet data to be - * manipulated with *skb*\ **->data** and *skb*\ **->data_end** - * pointing respectively to the first byte of packet data and to - * the byte after the last byte of packet data. However, it - * remains useful if one wishes to read large quantities of data - * at once from a packet into the eBPF stack. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_get_stackid(void *ctx, struct bpf_map *map, u64 flags) - * Description - * Walk a user or a kernel stack and return its id. To achieve - * this, the helper needs *ctx*, which is a pointer to the context - * on which the tracing program is executed, and a pointer to a - * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. - * - * The last argument, *flags*, holds the number of stack frames to - * skip (from 0 to 255), masked with - * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set - * a combination of the following flags: - * - * **BPF_F_USER_STACK** - * Collect a user space stack instead of a kernel stack. - * **BPF_F_FAST_STACK_CMP** - * Compare stacks by hash only. - * **BPF_F_REUSE_STACKID** - * If two different stacks hash into the same *stackid*, - * discard the old one. - * - * The stack id retrieved is a 32 bit long integer handle which - * can be further combined with other data (including other stack - * ids) and used as a key into maps. This can be useful for - * generating a variety of graphs (such as flame graphs or off-cpu - * graphs). - * - * For walking a stack, this helper is an improvement over - * **bpf_probe_read**\ (), which can be used with unrolled loops - * but is not efficient and consumes a lot of eBPF instructions. - * Instead, **bpf_get_stackid**\ () can collect up to - * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that - * this limit can be controlled with the **sysctl** program, and - * that it should be manually increased in order to profile long - * user stacks (such as stacks for Java programs). To do so, use: - * - * :: - * - * # sysctl kernel.perf_event_max_stack= - * Return - * The positive or null stack id on success, or a negative error - * in case of failure. - * - * s64 bpf_csum_diff(__be32 *from, u32 from_size, __be32 *to, u32 to_size, __wsum seed) - * Description - * Compute a checksum difference, from the raw buffer pointed by - * *from*, of length *from_size* (that must be a multiple of 4), - * towards the raw buffer pointed by *to*, of size *to_size* - * (same remark). An optional *seed* can be added to the value - * (this can be cascaded, the seed may come from a previous call - * to the helper). - * - * This is flexible enough to be used in several ways: - * - * * With *from_size* == 0, *to_size* > 0 and *seed* set to - * checksum, it can be used when pushing new data. - * * With *from_size* > 0, *to_size* == 0 and *seed* set to - * checksum, it can be used when removing data from a packet. - * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it - * can be used to compute a diff. Note that *from_size* and - * *to_size* do not need to be equal. - * - * This helper can be used in combination with - * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to - * which one can feed in the difference computed with - * **bpf_csum_diff**\ (). - * Return - * The checksum result, or a negative error code in case of - * failure. - * - * long bpf_skb_get_tunnel_opt(struct sk_buff *skb, void *opt, u32 size) - * Description - * Retrieve tunnel options metadata for the packet associated to - * *skb*, and store the raw tunnel option data to the buffer *opt* - * of *size*. - * - * This helper can be used with encapsulation devices that can - * operate in "collect metadata" mode (please refer to the related - * note in the description of **bpf_skb_get_tunnel_key**\ () for - * more details). A particular example where this can be used is - * in combination with the Geneve encapsulation protocol, where it - * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) - * and retrieving arbitrary TLVs (Type-Length-Value headers) from - * the eBPF program. This allows for full customization of these - * headers. - * Return - * The size of the option data retrieved. - * - * long bpf_skb_set_tunnel_opt(struct sk_buff *skb, void *opt, u32 size) - * Description - * Set tunnel options metadata for the packet associated to *skb* - * to the option data contained in the raw buffer *opt* of *size*. - * - * See also the description of the **bpf_skb_get_tunnel_opt**\ () - * helper for additional information. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_change_proto(struct sk_buff *skb, __be16 proto, u64 flags) - * Description - * Change the protocol of the *skb* to *proto*. Currently - * supported are transition from IPv4 to IPv6, and from IPv6 to - * IPv4. The helper takes care of the groundwork for the - * transition, including resizing the socket buffer. The eBPF - * program is expected to fill the new headers, if any, via - * **skb_store_bytes**\ () and to recompute the checksums with - * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ - * (). The main case for this helper is to perform NAT64 - * operations out of an eBPF program. - * - * Internally, the GSO type is marked as dodgy so that headers are - * checked and segments are recalculated by the GSO/GRO engine. - * The size for GSO target is adapted as well. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_change_type(struct sk_buff *skb, u32 type) - * Description - * Change the packet type for the packet associated to *skb*. This - * comes down to setting *skb*\ **->pkt_type** to *type*, except - * the eBPF program does not have a write access to *skb*\ - * **->pkt_type** beside this helper. Using a helper here allows - * for graceful handling of errors. - * - * The major use case is to change incoming *skb*s to - * **PACKET_HOST** in a programmatic way instead of having to - * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for - * example. - * - * Note that *type* only allows certain values. At this time, they - * are: - * - * **PACKET_HOST** - * Packet is for us. - * **PACKET_BROADCAST** - * Send packet to all. - * **PACKET_MULTICAST** - * Send packet to group. - * **PACKET_OTHERHOST** - * Send packet to someone else. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_under_cgroup(struct sk_buff *skb, struct bpf_map *map, u32 index) - * Description - * Check whether *skb* is a descendant of the cgroup2 held by - * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. - * Return - * The return value depends on the result of the test, and can be: - * - * * 0, if the *skb* failed the cgroup2 descendant test. - * * 1, if the *skb* succeeded the cgroup2 descendant test. - * * A negative error code, if an error occurred. - * - * u32 bpf_get_hash_recalc(struct sk_buff *skb) - * Description - * Retrieve the hash of the packet, *skb*\ **->hash**. If it is - * not set, in particular if the hash was cleared due to mangling, - * recompute this hash. Later accesses to the hash can be done - * directly with *skb*\ **->hash**. - * - * Calling **bpf_set_hash_invalid**\ (), changing a packet - * prototype with **bpf_skb_change_proto**\ (), or calling - * **bpf_skb_store_bytes**\ () with the - * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear - * the hash and to trigger a new computation for the next call to - * **bpf_get_hash_recalc**\ (). - * Return - * The 32-bit hash. - * - * u64 bpf_get_current_task(void) - * Description - * Get the current task. - * Return - * A pointer to the current task struct. - * - * long bpf_probe_write_user(void *dst, const void *src, u32 len) - * Description - * Attempt in a safe way to write *len* bytes from the buffer - * *src* to *dst* in memory. It only works for threads that are in - * user context, and *dst* must be a valid user space address. - * - * This helper should not be used to implement any kind of - * security mechanism because of TOC-TOU attacks, but rather to - * debug, divert, and manipulate execution of semi-cooperative - * processes. - * - * Keep in mind that this feature is meant for experiments, and it - * has a risk of crashing the system and running programs. - * Therefore, when an eBPF program using this helper is attached, - * a warning including PID and process name is printed to kernel - * logs. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_current_task_under_cgroup(struct bpf_map *map, u32 index) - * Description - * Check whether the probe is being run is the context of a given - * subset of the cgroup2 hierarchy. The cgroup2 to test is held by - * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. - * Return - * The return value depends on the result of the test, and can be: - * - * * 1, if current task belongs to the cgroup2. - * * 0, if current task does not belong to the cgroup2. - * * A negative error code, if an error occurred. - * - * long bpf_skb_change_tail(struct sk_buff *skb, u32 len, u64 flags) - * Description - * Resize (trim or grow) the packet associated to *skb* to the - * new *len*. The *flags* are reserved for future usage, and must - * be left at zero. - * - * The basic idea is that the helper performs the needed work to - * change the size of the packet, then the eBPF program rewrites - * the rest via helpers like **bpf_skb_store_bytes**\ (), - * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () - * and others. This helper is a slow path utility intended for - * replies with control messages. And because it is targeted for - * slow path, the helper itself can afford to be slow: it - * implicitly linearizes, unclones and drops offloads from the - * *skb*. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_pull_data(struct sk_buff *skb, u32 len) - * Description - * Pull in non-linear data in case the *skb* is non-linear and not - * all of *len* are part of the linear section. Make *len* bytes - * from *skb* readable and writable. If a zero value is passed for - * *len*, then the whole length of the *skb* is pulled. - * - * This helper is only needed for reading and writing with direct - * packet access. - * - * For direct packet access, testing that offsets to access - * are within packet boundaries (test on *skb*\ **->data_end**) is - * susceptible to fail if offsets are invalid, or if the requested - * data is in non-linear parts of the *skb*. On failure the - * program can just bail out, or in the case of a non-linear - * buffer, use a helper to make the data available. The - * **bpf_skb_load_bytes**\ () helper is a first solution to access - * the data. Another one consists in using **bpf_skb_pull_data** - * to pull in once the non-linear parts, then retesting and - * eventually access the data. - * - * At the same time, this also makes sure the *skb* is uncloned, - * which is a necessary condition for direct write. As this needs - * to be an invariant for the write part only, the verifier - * detects writes and adds a prologue that is calling - * **bpf_skb_pull_data()** to effectively unclone the *skb* from - * the very beginning in case it is indeed cloned. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * s64 bpf_csum_update(struct sk_buff *skb, __wsum csum) - * Description - * Add the checksum *csum* into *skb*\ **->csum** in case the - * driver has supplied a checksum for the entire packet into that - * field. Return an error otherwise. This helper is intended to be - * used in combination with **bpf_csum_diff**\ (), in particular - * when the checksum needs to be updated after data has been - * written into the packet through direct packet access. - * Return - * The checksum on success, or a negative error code in case of - * failure. - * - * void bpf_set_hash_invalid(struct sk_buff *skb) - * Description - * Invalidate the current *skb*\ **->hash**. It can be used after - * mangling on headers through direct packet access, in order to - * indicate that the hash is outdated and to trigger a - * recalculation the next time the kernel tries to access this - * hash or when the **bpf_get_hash_recalc**\ () helper is called. - * Return - * void. - * - * long bpf_get_numa_node_id(void) - * Description - * Return the id of the current NUMA node. The primary use case - * for this helper is the selection of sockets for the local NUMA - * node, when the program is attached to sockets using the - * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), - * but the helper is also available to other eBPF program types, - * similarly to **bpf_get_smp_processor_id**\ (). - * Return - * The id of current NUMA node. - * - * long bpf_skb_change_head(struct sk_buff *skb, u32 len, u64 flags) - * Description - * Grows headroom of packet associated to *skb* and adjusts the - * offset of the MAC header accordingly, adding *len* bytes of - * space. It automatically extends and reallocates memory as - * required. - * - * This helper can be used on a layer 3 *skb* to push a MAC header - * for redirection into a layer 2 device. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_xdp_adjust_head(struct xdp_buff *xdp_md, int delta) - * Description - * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that - * it is possible to use a negative value for *delta*. This helper - * can be used to prepare the packet for pushing or popping - * headers. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_probe_read_str(void *dst, u32 size, const void *unsafe_ptr) - * Description - * Copy a NUL terminated string from an unsafe kernel address - * *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for - * more details. - * - * Generally, use **bpf_probe_read_user_str**\ () or - * **bpf_probe_read_kernel_str**\ () instead. - * Return - * On success, the strictly positive length of the string, - * including the trailing NUL character. On error, a negative - * value. - * - * u64 bpf_get_socket_cookie(struct sk_buff *skb) - * Description - * If the **struct sk_buff** pointed by *skb* has a known socket, - * retrieve the cookie (generated by the kernel) of this socket. - * If no cookie has been set yet, generate a new cookie. Once - * generated, the socket cookie remains stable for the life of the - * socket. This helper can be useful for monitoring per socket - * networking traffic statistics as it provides a global socket - * identifier that can be assumed unique. - * Return - * A 8-byte long unique number on success, or 0 if the socket - * field is missing inside *skb*. - * - * u64 bpf_get_socket_cookie(struct bpf_sock_addr *ctx) - * Description - * Equivalent to bpf_get_socket_cookie() helper that accepts - * *skb*, but gets socket from **struct bpf_sock_addr** context. - * Return - * A 8-byte long unique number. - * - * u64 bpf_get_socket_cookie(struct bpf_sock_ops *ctx) - * Description - * Equivalent to **bpf_get_socket_cookie**\ () helper that accepts - * *skb*, but gets socket from **struct bpf_sock_ops** context. - * Return - * A 8-byte long unique number. - * - * u64 bpf_get_socket_cookie(struct sock *sk) - * Description - * Equivalent to **bpf_get_socket_cookie**\ () helper that accepts - * *sk*, but gets socket from a BTF **struct sock**. This helper - * also works for sleepable programs. - * Return - * A 8-byte long unique number or 0 if *sk* is NULL. - * - * u32 bpf_get_socket_uid(struct sk_buff *skb) - * Description - * Get the owner UID of the socked associated to *skb*. - * Return - * The owner UID of the socket associated to *skb*. If the socket - * is **NULL**, or if it is not a full socket (i.e. if it is a - * time-wait or a request socket instead), **overflowuid** value - * is returned (note that **overflowuid** might also be the actual - * UID value for the socket). - * - * long bpf_set_hash(struct sk_buff *skb, u32 hash) - * Description - * Set the full hash for *skb* (set the field *skb*\ **->hash**) - * to value *hash*. - * Return - * 0 - * - * long bpf_setsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen) - * Description - * Emulate a call to **setsockopt()** on the socket associated to - * *bpf_socket*, which must be a full socket. The *level* at - * which the option resides and the name *optname* of the option - * must be specified, see **setsockopt(2)** for more information. - * The option value of length *optlen* is pointed by *optval*. - * - * *bpf_socket* should be one of the following: - * - * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. - * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** - * and **BPF_CGROUP_INET6_CONNECT**. - * - * This helper actually implements a subset of **setsockopt()**. - * It supports the following *level*\ s: - * - * * **SOL_SOCKET**, which supports the following *optname*\ s: - * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, - * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**, - * **SO_BINDTODEVICE**, **SO_KEEPALIVE**. - * * **IPPROTO_TCP**, which supports the following *optname*\ s: - * **TCP_CONGESTION**, **TCP_BPF_IW**, - * **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, - * **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, - * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**. - * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. - * * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_adjust_room(struct sk_buff *skb, s32 len_diff, u32 mode, u64 flags) - * Description - * Grow or shrink the room for data in the packet associated to - * *skb* by *len_diff*, and according to the selected *mode*. - * - * By default, the helper will reset any offloaded checksum - * indicator of the skb to CHECKSUM_NONE. This can be avoided - * by the following flag: - * - * * **BPF_F_ADJ_ROOM_NO_CSUM_RESET**: Do not reset offloaded - * checksum data of the skb to CHECKSUM_NONE. - * - * There are two supported modes at this time: - * - * * **BPF_ADJ_ROOM_MAC**: Adjust room at the mac layer - * (room space is added or removed below the layer 2 header). - * - * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer - * (room space is added or removed below the layer 3 header). - * - * The following flags are supported at this time: - * - * * **BPF_F_ADJ_ROOM_FIXED_GSO**: Do not adjust gso_size. - * Adjusting mss in this way is not allowed for datagrams. - * - * * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV4**, - * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV6**: - * Any new space is reserved to hold a tunnel header. - * Configure skb offsets and other fields accordingly. - * - * * **BPF_F_ADJ_ROOM_ENCAP_L4_GRE**, - * **BPF_F_ADJ_ROOM_ENCAP_L4_UDP**: - * Use with ENCAP_L3 flags to further specify the tunnel type. - * - * * **BPF_F_ADJ_ROOM_ENCAP_L2**\ (*len*): - * Use with ENCAP_L3/L4 flags to further specify the tunnel - * type; *len* is the length of the inner MAC header. - * - * * **BPF_F_ADJ_ROOM_ENCAP_L2_ETH**: - * Use with BPF_F_ADJ_ROOM_ENCAP_L2 flag to further specify the - * L2 type as Ethernet. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_redirect_map(struct bpf_map *map, u32 key, u64 flags) - * Description - * Redirect the packet to the endpoint referenced by *map* at - * index *key*. Depending on its type, this *map* can contain - * references to net devices (for forwarding packets through other - * ports), or to CPUs (for redirecting XDP frames to another CPU; - * but this is only implemented for native XDP (with driver - * support) as of this writing). - * - * The lower two bits of *flags* are used as the return code if - * the map lookup fails. This is so that the return value can be - * one of the XDP program return codes up to **XDP_TX**, as chosen - * by the caller. The higher bits of *flags* can be set to - * BPF_F_BROADCAST or BPF_F_EXCLUDE_INGRESS as defined below. - * - * With BPF_F_BROADCAST the packet will be broadcasted to all the - * interfaces in the map, with BPF_F_EXCLUDE_INGRESS the ingress - * interface will be excluded when do broadcasting. - * - * See also **bpf_redirect**\ (), which only supports redirecting - * to an ifindex, but doesn't require a map to do so. - * Return - * **XDP_REDIRECT** on success, or the value of the two lower bits - * of the *flags* argument on error. - * - * long bpf_sk_redirect_map(struct sk_buff *skb, struct bpf_map *map, u32 key, u64 flags) - * Description - * Redirect the packet to the socket referenced by *map* (of type - * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and - * egress interfaces can be used for redirection. The - * **BPF_F_INGRESS** value in *flags* is used to make the - * distinction (ingress path is selected if the flag is present, - * egress path otherwise). This is the only flag supported for now. - * Return - * **SK_PASS** on success, or **SK_DROP** on error. - * - * long bpf_sock_map_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) - * Description - * Add an entry to, or update a *map* referencing sockets. The - * *skops* is used as a new value for the entry associated to - * *key*. *flags* is one of: - * - * **BPF_NOEXIST** - * The entry for *key* must not exist in the map. - * **BPF_EXIST** - * The entry for *key* must already exist in the map. - * **BPF_ANY** - * No condition on the existence of the entry for *key*. - * - * If the *map* has eBPF programs (parser and verdict), those will - * be inherited by the socket being added. If the socket is - * already attached to eBPF programs, this results in an error. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_xdp_adjust_meta(struct xdp_buff *xdp_md, int delta) - * Description - * Adjust the address pointed by *xdp_md*\ **->data_meta** by - * *delta* (which can be positive or negative). Note that this - * operation modifies the address stored in *xdp_md*\ **->data**, - * so the latter must be loaded only after the helper has been - * called. - * - * The use of *xdp_md*\ **->data_meta** is optional and programs - * are not required to use it. The rationale is that when the - * packet is processed with XDP (e.g. as DoS filter), it is - * possible to push further meta data along with it before passing - * to the stack, and to give the guarantee that an ingress eBPF - * program attached as a TC classifier on the same device can pick - * this up for further post-processing. Since TC works with socket - * buffers, it remains possible to set from XDP the **mark** or - * **priority** pointers, or other pointers for the socket buffer. - * Having this scratch space generic and programmable allows for - * more flexibility as the user is free to store whatever meta - * data they need. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_perf_event_read_value(struct bpf_map *map, u64 flags, struct bpf_perf_event_value *buf, u32 buf_size) - * Description - * Read the value of a perf event counter, and store it into *buf* - * of size *buf_size*. This helper relies on a *map* of type - * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event - * counter is selected when *map* is updated with perf event file - * descriptors. The *map* is an array whose size is the number of - * available CPUs, and each cell contains a value relative to one - * CPU. The value to retrieve is indicated by *flags*, that - * contains the index of the CPU to look up, masked with - * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to - * **BPF_F_CURRENT_CPU** to indicate that the value for the - * current CPU should be retrieved. - * - * This helper behaves in a way close to - * **bpf_perf_event_read**\ () helper, save that instead of - * just returning the value observed, it fills the *buf* - * structure. This allows for additional data to be retrieved: in - * particular, the enabled and running times (in *buf*\ - * **->enabled** and *buf*\ **->running**, respectively) are - * copied. In general, **bpf_perf_event_read_value**\ () is - * recommended over **bpf_perf_event_read**\ (), which has some - * ABI issues and provides fewer functionalities. - * - * These values are interesting, because hardware PMU (Performance - * Monitoring Unit) counters are limited resources. When there are - * more PMU based perf events opened than available counters, - * kernel will multiplex these events so each event gets certain - * percentage (but not all) of the PMU time. In case that - * multiplexing happens, the number of samples or counter value - * will not reflect the case compared to when no multiplexing - * occurs. This makes comparison between different runs difficult. - * Typically, the counter value should be normalized before - * comparing to other experiments. The usual normalization is done - * as follows. - * - * :: - * - * normalized_counter = counter * t_enabled / t_running - * - * Where t_enabled is the time enabled for event and t_running is - * the time running for event since last normalization. The - * enabled and running times are accumulated since the perf event - * open. To achieve scaling factor between two invocations of an - * eBPF program, users can use CPU id as the key (which is - * typical for perf array usage model) to remember the previous - * value and do the calculation inside the eBPF program. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_perf_prog_read_value(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, u32 buf_size) - * Description - * For en eBPF program attached to a perf event, retrieve the - * value of the event counter associated to *ctx* and store it in - * the structure pointed by *buf* and of size *buf_size*. Enabled - * and running times are also stored in the structure (see - * description of helper **bpf_perf_event_read_value**\ () for - * more details). - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_getsockopt(void *bpf_socket, int level, int optname, void *optval, int optlen) - * Description - * Emulate a call to **getsockopt()** on the socket associated to - * *bpf_socket*, which must be a full socket. The *level* at - * which the option resides and the name *optname* of the option - * must be specified, see **getsockopt(2)** for more information. - * The retrieved value is stored in the structure pointed by - * *opval* and of length *optlen*. - * - * *bpf_socket* should be one of the following: - * - * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. - * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** - * and **BPF_CGROUP_INET6_CONNECT**. - * - * This helper actually implements a subset of **getsockopt()**. - * It supports the following *level*\ s: - * - * * **IPPROTO_TCP**, which supports *optname* - * **TCP_CONGESTION**. - * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. - * * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_override_return(struct pt_regs *regs, u64 rc) - * Description - * Used for error injection, this helper uses kprobes to override - * the return value of the probed function, and to set it to *rc*. - * The first argument is the context *regs* on which the kprobe - * works. - * - * This helper works by setting the PC (program counter) - * to an override function which is run in place of the original - * probed function. This means the probed function is not run at - * all. The replacement function just returns with the required - * value. - * - * This helper has security implications, and thus is subject to - * restrictions. It is only available if the kernel was compiled - * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration - * option, and in this case it only works on functions tagged with - * **ALLOW_ERROR_INJECTION** in the kernel code. - * - * Also, the helper is only available for the architectures having - * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, - * x86 architecture is the only one to support this feature. - * Return - * 0 - * - * long bpf_sock_ops_cb_flags_set(struct bpf_sock_ops *bpf_sock, int argval) - * Description - * Attempt to set the value of the **bpf_sock_ops_cb_flags** field - * for the full TCP socket associated to *bpf_sock_ops* to - * *argval*. - * - * The primary use of this field is to determine if there should - * be calls to eBPF programs of type - * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP - * code. A program of the same type can change its value, per - * connection and as necessary, when the connection is - * established. This field is directly accessible for reading, but - * this helper must be used for updates in order to return an - * error if an eBPF program tries to set a callback that is not - * supported in the current kernel. - * - * *argval* is a flag array which can combine these flags: - * - * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) - * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) - * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) - * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) - * - * Therefore, this function can be used to clear a callback flag by - * setting the appropriate bit to zero. e.g. to disable the RTO - * callback: - * - * **bpf_sock_ops_cb_flags_set(bpf_sock,** - * **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)** - * - * Here are some examples of where one could call such eBPF - * program: - * - * * When RTO fires. - * * When a packet is retransmitted. - * * When the connection terminates. - * * When a packet is sent. - * * When a packet is received. - * Return - * Code **-EINVAL** if the socket is not a full TCP socket; - * otherwise, a positive number containing the bits that could not - * be set is returned (which comes down to 0 if all bits were set - * as required). - * - * long bpf_msg_redirect_map(struct sk_msg_buff *msg, struct bpf_map *map, u32 key, u64 flags) - * Description - * This helper is used in programs implementing policies at the - * socket level. If the message *msg* is allowed to pass (i.e. if - * the verdict eBPF program returns **SK_PASS**), redirect it to - * the socket referenced by *map* (of type - * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and - * egress interfaces can be used for redirection. The - * **BPF_F_INGRESS** value in *flags* is used to make the - * distinction (ingress path is selected if the flag is present, - * egress path otherwise). This is the only flag supported for now. - * Return - * **SK_PASS** on success, or **SK_DROP** on error. - * - * long bpf_msg_apply_bytes(struct sk_msg_buff *msg, u32 bytes) - * Description - * For socket policies, apply the verdict of the eBPF program to - * the next *bytes* (number of bytes) of message *msg*. - * - * For example, this helper can be used in the following cases: - * - * * A single **sendmsg**\ () or **sendfile**\ () system call - * contains multiple logical messages that the eBPF program is - * supposed to read and for which it should apply a verdict. - * * An eBPF program only cares to read the first *bytes* of a - * *msg*. If the message has a large payload, then setting up - * and calling the eBPF program repeatedly for all bytes, even - * though the verdict is already known, would create unnecessary - * overhead. - * - * When called from within an eBPF program, the helper sets a - * counter internal to the BPF infrastructure, that is used to - * apply the last verdict to the next *bytes*. If *bytes* is - * smaller than the current data being processed from a - * **sendmsg**\ () or **sendfile**\ () system call, the first - * *bytes* will be sent and the eBPF program will be re-run with - * the pointer for start of data pointing to byte number *bytes* - * **+ 1**. If *bytes* is larger than the current data being - * processed, then the eBPF verdict will be applied to multiple - * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are - * consumed. - * - * Note that if a socket closes with the internal counter holding - * a non-zero value, this is not a problem because data is not - * being buffered for *bytes* and is sent as it is received. - * Return - * 0 - * - * long bpf_msg_cork_bytes(struct sk_msg_buff *msg, u32 bytes) - * Description - * For socket policies, prevent the execution of the verdict eBPF - * program for message *msg* until *bytes* (byte number) have been - * accumulated. - * - * This can be used when one needs a specific number of bytes - * before a verdict can be assigned, even if the data spans - * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme - * case would be a user calling **sendmsg**\ () repeatedly with - * 1-byte long message segments. Obviously, this is bad for - * performance, but it is still valid. If the eBPF program needs - * *bytes* bytes to validate a header, this helper can be used to - * prevent the eBPF program to be called again until *bytes* have - * been accumulated. - * Return - * 0 - * - * long bpf_msg_pull_data(struct sk_msg_buff *msg, u32 start, u32 end, u64 flags) - * Description - * For socket policies, pull in non-linear data from user space - * for *msg* and set pointers *msg*\ **->data** and *msg*\ - * **->data_end** to *start* and *end* bytes offsets into *msg*, - * respectively. - * - * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a - * *msg* it can only parse data that the (**data**, **data_end**) - * pointers have already consumed. For **sendmsg**\ () hooks this - * is likely the first scatterlist element. But for calls relying - * on the **sendpage** handler (e.g. **sendfile**\ ()) this will - * be the range (**0**, **0**) because the data is shared with - * user space and by default the objective is to avoid allowing - * user space to modify data while (or after) eBPF verdict is - * being decided. This helper can be used to pull in data and to - * set the start and end pointer to given values. Data will be - * copied if necessary (i.e. if data was not linear and if start - * and end pointers do not point to the same chunk). - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_bind(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) - * Description - * Bind the socket associated to *ctx* to the address pointed by - * *addr*, of length *addr_len*. This allows for making outgoing - * connection from the desired IP address, which can be useful for - * example when all processes inside a cgroup should use one - * single IP address on a host that has multiple IP configured. - * - * This helper works for IPv4 and IPv6, TCP and UDP sockets. The - * domain (*addr*\ **->sa_family**) must be **AF_INET** (or - * **AF_INET6**). It's advised to pass zero port (**sin_port** - * or **sin6_port**) which triggers IP_BIND_ADDRESS_NO_PORT-like - * behavior and lets the kernel efficiently pick up an unused - * port as long as 4-tuple is unique. Passing non-zero port might - * lead to degraded performance. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_xdp_adjust_tail(struct xdp_buff *xdp_md, int delta) - * Description - * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is - * possible to both shrink and grow the packet tail. - * Shrink done via *delta* being a negative integer. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_skb_get_xfrm_state(struct sk_buff *skb, u32 index, struct bpf_xfrm_state *xfrm_state, u32 size, u64 flags) - * Description - * Retrieve the XFRM state (IP transform framework, see also - * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. - * - * The retrieved value is stored in the **struct bpf_xfrm_state** - * pointed by *xfrm_state* and of length *size*. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_XFRM** configuration option. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_get_stack(void *ctx, void *buf, u32 size, u64 flags) - * Description - * Return a user or a kernel stack in bpf program provided buffer. - * To achieve this, the helper needs *ctx*, which is a pointer - * to the context on which the tracing program is executed. - * To store the stacktrace, the bpf program provides *buf* with - * a nonnegative *size*. - * - * The last argument, *flags*, holds the number of stack frames to - * skip (from 0 to 255), masked with - * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set - * the following flags: - * - * **BPF_F_USER_STACK** - * Collect a user space stack instead of a kernel stack. - * **BPF_F_USER_BUILD_ID** - * Collect buildid+offset instead of ips for user stack, - * only valid if **BPF_F_USER_STACK** is also specified. - * - * **bpf_get_stack**\ () can collect up to - * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject - * to sufficient large buffer size. Note that - * this limit can be controlled with the **sysctl** program, and - * that it should be manually increased in order to profile long - * user stacks (such as stacks for Java programs). To do so, use: - * - * :: - * - * # sysctl kernel.perf_event_max_stack= - * Return - * The non-negative copied *buf* length equal to or less than - * *size* on success, or a negative error in case of failure. - * - * long bpf_skb_load_bytes_relative(const void *skb, u32 offset, void *to, u32 len, u32 start_header) - * Description - * This helper is similar to **bpf_skb_load_bytes**\ () in that - * it provides an easy way to load *len* bytes from *offset* - * from the packet associated to *skb*, into the buffer pointed - * by *to*. The difference to **bpf_skb_load_bytes**\ () is that - * a fifth argument *start_header* exists in order to select a - * base offset to start from. *start_header* can be one of: - * - * **BPF_HDR_START_MAC** - * Base offset to load data from is *skb*'s mac header. - * **BPF_HDR_START_NET** - * Base offset to load data from is *skb*'s network header. - * - * In general, "direct packet access" is the preferred method to - * access packet data, however, this helper is in particular useful - * in socket filters where *skb*\ **->data** does not always point - * to the start of the mac header and where "direct packet access" - * is not available. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_fib_lookup(void *ctx, struct bpf_fib_lookup *params, int plen, u32 flags) - * Description - * Do FIB lookup in kernel tables using parameters in *params*. - * If lookup is successful and result shows packet is to be - * forwarded, the neighbor tables are searched for the nexthop. - * If successful (ie., FIB lookup shows forwarding and nexthop - * is resolved), the nexthop address is returned in ipv4_dst - * or ipv6_dst based on family, smac is set to mac address of - * egress device, dmac is set to nexthop mac address, rt_metric - * is set to metric from route (IPv4/IPv6 only), and ifindex - * is set to the device index of the nexthop from the FIB lookup. - * - * *plen* argument is the size of the passed in struct. - * *flags* argument can be a combination of one or more of the - * following values: - * - * **BPF_FIB_LOOKUP_DIRECT** - * Do a direct table lookup vs full lookup using FIB - * rules. - * **BPF_FIB_LOOKUP_OUTPUT** - * Perform lookup from an egress perspective (default is - * ingress). - * - * *ctx* is either **struct xdp_md** for XDP programs or - * **struct sk_buff** tc cls_act programs. - * Return - * * < 0 if any input argument is invalid - * * 0 on success (packet is forwarded, nexthop neighbor exists) - * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the - * packet is not forwarded or needs assist from full stack - * - * If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU - * was exceeded and output params->mtu_result contains the MTU. - * - * long bpf_sock_hash_update(struct bpf_sock_ops *skops, struct bpf_map *map, void *key, u64 flags) - * Description - * Add an entry to, or update a sockhash *map* referencing sockets. - * The *skops* is used as a new value for the entry associated to - * *key*. *flags* is one of: - * - * **BPF_NOEXIST** - * The entry for *key* must not exist in the map. - * **BPF_EXIST** - * The entry for *key* must already exist in the map. - * **BPF_ANY** - * No condition on the existence of the entry for *key*. - * - * If the *map* has eBPF programs (parser and verdict), those will - * be inherited by the socket being added. If the socket is - * already attached to eBPF programs, this results in an error. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_msg_redirect_hash(struct sk_msg_buff *msg, struct bpf_map *map, void *key, u64 flags) - * Description - * This helper is used in programs implementing policies at the - * socket level. If the message *msg* is allowed to pass (i.e. if - * the verdict eBPF program returns **SK_PASS**), redirect it to - * the socket referenced by *map* (of type - * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and - * egress interfaces can be used for redirection. The - * **BPF_F_INGRESS** value in *flags* is used to make the - * distinction (ingress path is selected if the flag is present, - * egress path otherwise). This is the only flag supported for now. - * Return - * **SK_PASS** on success, or **SK_DROP** on error. - * - * long bpf_sk_redirect_hash(struct sk_buff *skb, struct bpf_map *map, void *key, u64 flags) - * Description - * This helper is used in programs implementing policies at the - * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. - * if the verdict eBPF program returns **SK_PASS**), redirect it - * to the socket referenced by *map* (of type - * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and - * egress interfaces can be used for redirection. The - * **BPF_F_INGRESS** value in *flags* is used to make the - * distinction (ingress path is selected if the flag is present, - * egress otherwise). This is the only flag supported for now. - * Return - * **SK_PASS** on success, or **SK_DROP** on error. - * - * long bpf_lwt_push_encap(struct sk_buff *skb, u32 type, void *hdr, u32 len) - * Description - * Encapsulate the packet associated to *skb* within a Layer 3 - * protocol header. This header is provided in the buffer at - * address *hdr*, with *len* its size in bytes. *type* indicates - * the protocol of the header and can be one of: - * - * **BPF_LWT_ENCAP_SEG6** - * IPv6 encapsulation with Segment Routing Header - * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, - * the IPv6 header is computed by the kernel. - * **BPF_LWT_ENCAP_SEG6_INLINE** - * Only works if *skb* contains an IPv6 packet. Insert a - * Segment Routing Header (**struct ipv6_sr_hdr**) inside - * the IPv6 header. - * **BPF_LWT_ENCAP_IP** - * IP encapsulation (GRE/GUE/IPIP/etc). The outer header - * must be IPv4 or IPv6, followed by zero or more - * additional headers, up to **LWT_BPF_MAX_HEADROOM** - * total bytes in all prepended headers. Please note that - * if **skb_is_gso**\ (*skb*) is true, no more than two - * headers can be prepended, and the inner header, if - * present, should be either GRE or UDP/GUE. - * - * **BPF_LWT_ENCAP_SEG6**\ \* types can be called by BPF programs - * of type **BPF_PROG_TYPE_LWT_IN**; **BPF_LWT_ENCAP_IP** type can - * be called by bpf programs of types **BPF_PROG_TYPE_LWT_IN** and - * **BPF_PROG_TYPE_LWT_XMIT**. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_lwt_seg6_store_bytes(struct sk_buff *skb, u32 offset, const void *from, u32 len) - * Description - * Store *len* bytes from address *from* into the packet - * associated to *skb*, at *offset*. Only the flags, tag and TLVs - * inside the outermost IPv6 Segment Routing Header can be - * modified through this helper. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_lwt_seg6_adjust_srh(struct sk_buff *skb, u32 offset, s32 delta) - * Description - * Adjust the size allocated to TLVs in the outermost IPv6 - * Segment Routing Header contained in the packet associated to - * *skb*, at position *offset* by *delta* bytes. Only offsets - * after the segments are accepted. *delta* can be as well - * positive (growing) as negative (shrinking). - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_lwt_seg6_action(struct sk_buff *skb, u32 action, void *param, u32 param_len) - * Description - * Apply an IPv6 Segment Routing action of type *action* to the - * packet associated to *skb*. Each action takes a parameter - * contained at address *param*, and of length *param_len* bytes. - * *action* can be one of: - * - * **SEG6_LOCAL_ACTION_END_X** - * End.X action: Endpoint with Layer-3 cross-connect. - * Type of *param*: **struct in6_addr**. - * **SEG6_LOCAL_ACTION_END_T** - * End.T action: Endpoint with specific IPv6 table lookup. - * Type of *param*: **int**. - * **SEG6_LOCAL_ACTION_END_B6** - * End.B6 action: Endpoint bound to an SRv6 policy. - * Type of *param*: **struct ipv6_sr_hdr**. - * **SEG6_LOCAL_ACTION_END_B6_ENCAP** - * End.B6.Encap action: Endpoint bound to an SRv6 - * encapsulation policy. - * Type of *param*: **struct ipv6_sr_hdr**. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_rc_repeat(void *ctx) - * Description - * This helper is used in programs implementing IR decoding, to - * report a successfully decoded repeat key message. This delays - * the generation of a key up event for previously generated - * key down event. - * - * Some IR protocols like NEC have a special IR message for - * repeating last button, for when a button is held down. - * - * The *ctx* should point to the lirc sample as passed into - * the program. - * - * This helper is only available is the kernel was compiled with - * the **CONFIG_BPF_LIRC_MODE2** configuration option set to - * "**y**". - * Return - * 0 - * - * long bpf_rc_keydown(void *ctx, u32 protocol, u64 scancode, u32 toggle) - * Description - * This helper is used in programs implementing IR decoding, to - * report a successfully decoded key press with *scancode*, - * *toggle* value in the given *protocol*. The scancode will be - * translated to a keycode using the rc keymap, and reported as - * an input key down event. After a period a key up event is - * generated. This period can be extended by calling either - * **bpf_rc_keydown**\ () again with the same values, or calling - * **bpf_rc_repeat**\ (). - * - * Some protocols include a toggle bit, in case the button was - * released and pressed again between consecutive scancodes. - * - * The *ctx* should point to the lirc sample as passed into - * the program. - * - * The *protocol* is the decoded protocol number (see - * **enum rc_proto** for some predefined values). - * - * This helper is only available is the kernel was compiled with - * the **CONFIG_BPF_LIRC_MODE2** configuration option set to - * "**y**". - * Return - * 0 - * - * u64 bpf_skb_cgroup_id(struct sk_buff *skb) - * Description - * Return the cgroup v2 id of the socket associated with the *skb*. - * This is roughly similar to the **bpf_get_cgroup_classid**\ () - * helper for cgroup v1 by providing a tag resp. identifier that - * can be matched on or used for map lookups e.g. to implement - * policy. The cgroup v2 id of a given path in the hierarchy is - * exposed in user space through the f_handle API in order to get - * to the same 64-bit id. - * - * This helper can be used on TC egress path, but not on ingress, - * and is available only if the kernel was compiled with the - * **CONFIG_SOCK_CGROUP_DATA** configuration option. - * Return - * The id is returned or 0 in case the id could not be retrieved. - * - * u64 bpf_get_current_cgroup_id(void) - * Description - * Get the current cgroup id based on the cgroup within which - * the current task is running. - * Return - * A 64-bit integer containing the current cgroup id based - * on the cgroup within which the current task is running. - * - * void *bpf_get_local_storage(void *map, u64 flags) - * Description - * Get the pointer to the local storage area. - * The type and the size of the local storage is defined - * by the *map* argument. - * The *flags* meaning is specific for each map type, - * and has to be 0 for cgroup local storage. - * - * Depending on the BPF program type, a local storage area - * can be shared between multiple instances of the BPF program, - * running simultaneously. - * - * A user should care about the synchronization by himself. - * For example, by using the **BPF_ATOMIC** instructions to alter - * the shared data. - * Return - * A pointer to the local storage area. - * - * long bpf_sk_select_reuseport(struct sk_reuseport_md *reuse, struct bpf_map *map, void *key, u64 flags) - * Description - * Select a **SO_REUSEPORT** socket from a - * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*. - * It checks the selected socket is matching the incoming - * request in the socket buffer. - * Return - * 0 on success, or a negative error in case of failure. - * - * u64 bpf_skb_ancestor_cgroup_id(struct sk_buff *skb, int ancestor_level) - * Description - * Return id of cgroup v2 that is ancestor of cgroup associated - * with the *skb* at the *ancestor_level*. The root cgroup is at - * *ancestor_level* zero and each step down the hierarchy - * increments the level. If *ancestor_level* == level of cgroup - * associated with *skb*, then return value will be same as that - * of **bpf_skb_cgroup_id**\ (). - * - * The helper is useful to implement policies based on cgroups - * that are upper in hierarchy than immediate cgroup associated - * with *skb*. - * - * The format of returned id and helper limitations are same as in - * **bpf_skb_cgroup_id**\ (). - * Return - * The id is returned or 0 in case the id could not be retrieved. - * - * struct bpf_sock *bpf_sk_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) - * Description - * Look for TCP socket matching *tuple*, optionally in a child - * network namespace *netns*. The return value must be checked, - * and if non-**NULL**, released via **bpf_sk_release**\ (). - * - * The *ctx* should point to the context of the program, such as - * the skb or socket (depending on the hook in use). This is used - * to determine the base network namespace for the lookup. - * - * *tuple_size* must be one of: - * - * **sizeof**\ (*tuple*\ **->ipv4**) - * Look for an IPv4 socket. - * **sizeof**\ (*tuple*\ **->ipv6**) - * Look for an IPv6 socket. - * - * If the *netns* is a negative signed 32-bit integer, then the - * socket lookup table in the netns associated with the *ctx* - * will be used. For the TC hooks, this is the netns of the device - * in the skb. For socket hooks, this is the netns of the socket. - * If *netns* is any other signed 32-bit value greater than or - * equal to zero then it specifies the ID of the netns relative to - * the netns associated with the *ctx*. *netns* values beyond the - * range of 32-bit integers are reserved for future use. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_NET** configuration option. - * Return - * Pointer to **struct bpf_sock**, or **NULL** in case of failure. - * For sockets with reuseport option, the **struct bpf_sock** - * result is from *reuse*\ **->socks**\ [] using the hash of the - * tuple. - * - * struct bpf_sock *bpf_sk_lookup_udp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) - * Description - * Look for UDP socket matching *tuple*, optionally in a child - * network namespace *netns*. The return value must be checked, - * and if non-**NULL**, released via **bpf_sk_release**\ (). - * - * The *ctx* should point to the context of the program, such as - * the skb or socket (depending on the hook in use). This is used - * to determine the base network namespace for the lookup. - * - * *tuple_size* must be one of: - * - * **sizeof**\ (*tuple*\ **->ipv4**) - * Look for an IPv4 socket. - * **sizeof**\ (*tuple*\ **->ipv6**) - * Look for an IPv6 socket. - * - * If the *netns* is a negative signed 32-bit integer, then the - * socket lookup table in the netns associated with the *ctx* - * will be used. For the TC hooks, this is the netns of the device - * in the skb. For socket hooks, this is the netns of the socket. - * If *netns* is any other signed 32-bit value greater than or - * equal to zero then it specifies the ID of the netns relative to - * the netns associated with the *ctx*. *netns* values beyond the - * range of 32-bit integers are reserved for future use. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_NET** configuration option. - * Return - * Pointer to **struct bpf_sock**, or **NULL** in case of failure. - * For sockets with reuseport option, the **struct bpf_sock** - * result is from *reuse*\ **->socks**\ [] using the hash of the - * tuple. - * - * long bpf_sk_release(void *sock) - * Description - * Release the reference held by *sock*. *sock* must be a - * non-**NULL** pointer that was returned from - * **bpf_sk_lookup_xxx**\ (). - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags) - * Description - * Push an element *value* in *map*. *flags* is one of: - * - * **BPF_EXIST** - * If the queue/stack is full, the oldest element is - * removed to make room for this. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_map_pop_elem(struct bpf_map *map, void *value) - * Description - * Pop an element from *map*. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_map_peek_elem(struct bpf_map *map, void *value) - * Description - * Get an element from *map* without removing it. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_msg_push_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags) - * Description - * For socket policies, insert *len* bytes into *msg* at offset - * *start*. - * - * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a - * *msg* it may want to insert metadata or options into the *msg*. - * This can later be read and used by any of the lower layer BPF - * hooks. - * - * This helper may fail if under memory pressure (a malloc - * fails) in these cases BPF programs will get an appropriate - * error and BPF programs will need to handle them. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_msg_pop_data(struct sk_msg_buff *msg, u32 start, u32 len, u64 flags) - * Description - * Will remove *len* bytes from a *msg* starting at byte *start*. - * This may result in **ENOMEM** errors under certain situations if - * an allocation and copy are required due to a full ring buffer. - * However, the helper will try to avoid doing the allocation - * if possible. Other errors can occur if input parameters are - * invalid either due to *start* byte not being valid part of *msg* - * payload and/or *pop* value being to large. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_rc_pointer_rel(void *ctx, s32 rel_x, s32 rel_y) - * Description - * This helper is used in programs implementing IR decoding, to - * report a successfully decoded pointer movement. - * - * The *ctx* should point to the lirc sample as passed into - * the program. - * - * This helper is only available is the kernel was compiled with - * the **CONFIG_BPF_LIRC_MODE2** configuration option set to - * "**y**". - * Return - * 0 - * - * long bpf_spin_lock(struct bpf_spin_lock *lock) - * Description - * Acquire a spinlock represented by the pointer *lock*, which is - * stored as part of a value of a map. Taking the lock allows to - * safely update the rest of the fields in that value. The - * spinlock can (and must) later be released with a call to - * **bpf_spin_unlock**\ (\ *lock*\ ). - * - * Spinlocks in BPF programs come with a number of restrictions - * and constraints: - * - * * **bpf_spin_lock** objects are only allowed inside maps of - * types **BPF_MAP_TYPE_HASH** and **BPF_MAP_TYPE_ARRAY** (this - * list could be extended in the future). - * * BTF description of the map is mandatory. - * * The BPF program can take ONE lock at a time, since taking two - * or more could cause dead locks. - * * Only one **struct bpf_spin_lock** is allowed per map element. - * * When the lock is taken, calls (either BPF to BPF or helpers) - * are not allowed. - * * The **BPF_LD_ABS** and **BPF_LD_IND** instructions are not - * allowed inside a spinlock-ed region. - * * The BPF program MUST call **bpf_spin_unlock**\ () to release - * the lock, on all execution paths, before it returns. - * * The BPF program can access **struct bpf_spin_lock** only via - * the **bpf_spin_lock**\ () and **bpf_spin_unlock**\ () - * helpers. Loading or storing data into the **struct - * bpf_spin_lock** *lock*\ **;** field of a map is not allowed. - * * To use the **bpf_spin_lock**\ () helper, the BTF description - * of the map value must be a struct and have **struct - * bpf_spin_lock** *anyname*\ **;** field at the top level. - * Nested lock inside another struct is not allowed. - * * The **struct bpf_spin_lock** *lock* field in a map value must - * be aligned on a multiple of 4 bytes in that value. - * * Syscall with command **BPF_MAP_LOOKUP_ELEM** does not copy - * the **bpf_spin_lock** field to user space. - * * Syscall with command **BPF_MAP_UPDATE_ELEM**, or update from - * a BPF program, do not update the **bpf_spin_lock** field. - * * **bpf_spin_lock** cannot be on the stack or inside a - * networking packet (it can only be inside of a map values). - * * **bpf_spin_lock** is available to root only. - * * Tracing programs and socket filter programs cannot use - * **bpf_spin_lock**\ () due to insufficient preemption checks - * (but this may change in the future). - * * **bpf_spin_lock** is not allowed in inner maps of map-in-map. - * Return - * 0 - * - * long bpf_spin_unlock(struct bpf_spin_lock *lock) - * Description - * Release the *lock* previously locked by a call to - * **bpf_spin_lock**\ (\ *lock*\ ). - * Return - * 0 - * - * struct bpf_sock *bpf_sk_fullsock(struct bpf_sock *sk) - * Description - * This helper gets a **struct bpf_sock** pointer such - * that all the fields in this **bpf_sock** can be accessed. - * Return - * A **struct bpf_sock** pointer on success, or **NULL** in - * case of failure. - * - * struct bpf_tcp_sock *bpf_tcp_sock(struct bpf_sock *sk) - * Description - * This helper gets a **struct bpf_tcp_sock** pointer from a - * **struct bpf_sock** pointer. - * Return - * A **struct bpf_tcp_sock** pointer on success, or **NULL** in - * case of failure. - * - * long bpf_skb_ecn_set_ce(struct sk_buff *skb) - * Description - * Set ECN (Explicit Congestion Notification) field of IP header - * to **CE** (Congestion Encountered) if current value is **ECT** - * (ECN Capable Transport). Otherwise, do nothing. Works with IPv6 - * and IPv4. - * Return - * 1 if the **CE** flag is set (either by the current helper call - * or because it was already present), 0 if it is not set. - * - * struct bpf_sock *bpf_get_listener_sock(struct bpf_sock *sk) - * Description - * Return a **struct bpf_sock** pointer in **TCP_LISTEN** state. - * **bpf_sk_release**\ () is unnecessary and not allowed. - * Return - * A **struct bpf_sock** pointer on success, or **NULL** in - * case of failure. - * - * struct bpf_sock *bpf_skc_lookup_tcp(void *ctx, struct bpf_sock_tuple *tuple, u32 tuple_size, u64 netns, u64 flags) - * Description - * Look for TCP socket matching *tuple*, optionally in a child - * network namespace *netns*. The return value must be checked, - * and if non-**NULL**, released via **bpf_sk_release**\ (). - * - * This function is identical to **bpf_sk_lookup_tcp**\ (), except - * that it also returns timewait or request sockets. Use - * **bpf_sk_fullsock**\ () or **bpf_tcp_sock**\ () to access the - * full structure. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_NET** configuration option. - * Return - * Pointer to **struct bpf_sock**, or **NULL** in case of failure. - * For sockets with reuseport option, the **struct bpf_sock** - * result is from *reuse*\ **->socks**\ [] using the hash of the - * tuple. - * - * long bpf_tcp_check_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len) - * Description - * Check whether *iph* and *th* contain a valid SYN cookie ACK for - * the listening socket in *sk*. - * - * *iph* points to the start of the IPv4 or IPv6 header, while - * *iph_len* contains **sizeof**\ (**struct iphdr**) or - * **sizeof**\ (**struct ipv6hdr**). - * - * *th* points to the start of the TCP header, while *th_len* - * contains the length of the TCP header (at least - * **sizeof**\ (**struct tcphdr**)). - * Return - * 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative - * error otherwise. - * - * long bpf_sysctl_get_name(struct bpf_sysctl *ctx, char *buf, size_t buf_len, u64 flags) - * Description - * Get name of sysctl in /proc/sys/ and copy it into provided by - * program buffer *buf* of size *buf_len*. - * - * The buffer is always NUL terminated, unless it's zero-sized. - * - * If *flags* is zero, full name (e.g. "net/ipv4/tcp_mem") is - * copied. Use **BPF_F_SYSCTL_BASE_NAME** flag to copy base name - * only (e.g. "tcp_mem"). - * Return - * Number of character copied (not including the trailing NUL). - * - * **-E2BIG** if the buffer wasn't big enough (*buf* will contain - * truncated name in this case). - * - * long bpf_sysctl_get_current_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len) - * Description - * Get current value of sysctl as it is presented in /proc/sys - * (incl. newline, etc), and copy it as a string into provided - * by program buffer *buf* of size *buf_len*. - * - * The whole value is copied, no matter what file position user - * space issued e.g. sys_read at. - * - * The buffer is always NUL terminated, unless it's zero-sized. - * Return - * Number of character copied (not including the trailing NUL). - * - * **-E2BIG** if the buffer wasn't big enough (*buf* will contain - * truncated name in this case). - * - * **-EINVAL** if current value was unavailable, e.g. because - * sysctl is uninitialized and read returns -EIO for it. - * - * long bpf_sysctl_get_new_value(struct bpf_sysctl *ctx, char *buf, size_t buf_len) - * Description - * Get new value being written by user space to sysctl (before - * the actual write happens) and copy it as a string into - * provided by program buffer *buf* of size *buf_len*. - * - * User space may write new value at file position > 0. - * - * The buffer is always NUL terminated, unless it's zero-sized. - * Return - * Number of character copied (not including the trailing NUL). - * - * **-E2BIG** if the buffer wasn't big enough (*buf* will contain - * truncated name in this case). - * - * **-EINVAL** if sysctl is being read. - * - * long bpf_sysctl_set_new_value(struct bpf_sysctl *ctx, const char *buf, size_t buf_len) - * Description - * Override new value being written by user space to sysctl with - * value provided by program in buffer *buf* of size *buf_len*. - * - * *buf* should contain a string in same form as provided by user - * space on sysctl write. - * - * User space may write new value at file position > 0. To override - * the whole sysctl value file position should be set to zero. - * Return - * 0 on success. - * - * **-E2BIG** if the *buf_len* is too big. - * - * **-EINVAL** if sysctl is being read. - * - * long bpf_strtol(const char *buf, size_t buf_len, u64 flags, long *res) - * Description - * Convert the initial part of the string from buffer *buf* of - * size *buf_len* to a long integer according to the given base - * and save the result in *res*. - * - * The string may begin with an arbitrary amount of white space - * (as determined by **isspace**\ (3)) followed by a single - * optional '**-**' sign. - * - * Five least significant bits of *flags* encode base, other bits - * are currently unused. - * - * Base must be either 8, 10, 16 or 0 to detect it automatically - * similar to user space **strtol**\ (3). - * Return - * Number of characters consumed on success. Must be positive but - * no more than *buf_len*. - * - * **-EINVAL** if no valid digits were found or unsupported base - * was provided. - * - * **-ERANGE** if resulting value was out of range. - * - * long bpf_strtoul(const char *buf, size_t buf_len, u64 flags, unsigned long *res) - * Description - * Convert the initial part of the string from buffer *buf* of - * size *buf_len* to an unsigned long integer according to the - * given base and save the result in *res*. - * - * The string may begin with an arbitrary amount of white space - * (as determined by **isspace**\ (3)). - * - * Five least significant bits of *flags* encode base, other bits - * are currently unused. - * - * Base must be either 8, 10, 16 or 0 to detect it automatically - * similar to user space **strtoul**\ (3). - * Return - * Number of characters consumed on success. Must be positive but - * no more than *buf_len*. - * - * **-EINVAL** if no valid digits were found or unsupported base - * was provided. - * - * **-ERANGE** if resulting value was out of range. - * - * void *bpf_sk_storage_get(struct bpf_map *map, void *sk, void *value, u64 flags) - * Description - * Get a bpf-local-storage from a *sk*. - * - * Logically, it could be thought of getting the value from - * a *map* with *sk* as the **key**. From this - * perspective, the usage is not much different from - * **bpf_map_lookup_elem**\ (*map*, **&**\ *sk*) except this - * helper enforces the key must be a full socket and the map must - * be a **BPF_MAP_TYPE_SK_STORAGE** also. - * - * Underneath, the value is stored locally at *sk* instead of - * the *map*. The *map* is used as the bpf-local-storage - * "type". The bpf-local-storage "type" (i.e. the *map*) is - * searched against all bpf-local-storages residing at *sk*. - * - * *sk* is a kernel **struct sock** pointer for LSM program. - * *sk* is a **struct bpf_sock** pointer for other program types. - * - * An optional *flags* (**BPF_SK_STORAGE_GET_F_CREATE**) can be - * used such that a new bpf-local-storage will be - * created if one does not exist. *value* can be used - * together with **BPF_SK_STORAGE_GET_F_CREATE** to specify - * the initial value of a bpf-local-storage. If *value* is - * **NULL**, the new bpf-local-storage will be zero initialized. - * Return - * A bpf-local-storage pointer is returned on success. - * - * **NULL** if not found or there was an error in adding - * a new bpf-local-storage. - * - * long bpf_sk_storage_delete(struct bpf_map *map, void *sk) - * Description - * Delete a bpf-local-storage from a *sk*. - * Return - * 0 on success. - * - * **-ENOENT** if the bpf-local-storage cannot be found. - * **-EINVAL** if sk is not a fullsock (e.g. a request_sock). - * - * long bpf_send_signal(u32 sig) - * Description - * Send signal *sig* to the process of the current task. - * The signal may be delivered to any of this process's threads. - * Return - * 0 on success or successfully queued. - * - * **-EBUSY** if work queue under nmi is full. - * - * **-EINVAL** if *sig* is invalid. - * - * **-EPERM** if no permission to send the *sig*. - * - * **-EAGAIN** if bpf program can try again. - * - * s64 bpf_tcp_gen_syncookie(void *sk, void *iph, u32 iph_len, struct tcphdr *th, u32 th_len) - * Description - * Try to issue a SYN cookie for the packet with corresponding - * IP/TCP headers, *iph* and *th*, on the listening socket in *sk*. - * - * *iph* points to the start of the IPv4 or IPv6 header, while - * *iph_len* contains **sizeof**\ (**struct iphdr**) or - * **sizeof**\ (**struct ipv6hdr**). - * - * *th* points to the start of the TCP header, while *th_len* - * contains the length of the TCP header with options (at least - * **sizeof**\ (**struct tcphdr**)). - * Return - * On success, lower 32 bits hold the generated SYN cookie in - * followed by 16 bits which hold the MSS value for that cookie, - * and the top 16 bits are unused. - * - * On failure, the returned value is one of the following: - * - * **-EINVAL** SYN cookie cannot be issued due to error - * - * **-ENOENT** SYN cookie should not be issued (no SYN flood) - * - * **-EOPNOTSUPP** kernel configuration does not enable SYN cookies - * - * **-EPROTONOSUPPORT** IP packet version is not 4 or 6 - * - * long bpf_skb_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) - * Description - * Write raw *data* blob into a special BPF perf event held by - * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf - * event must have the following attributes: **PERF_SAMPLE_RAW** - * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and - * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. - * - * The *flags* are used to indicate the index in *map* for which - * the value must be put, masked with **BPF_F_INDEX_MASK**. - * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** - * to indicate that the index of the current CPU core should be - * used. - * - * The value to write, of *size*, is passed through eBPF stack and - * pointed by *data*. - * - * *ctx* is a pointer to in-kernel struct sk_buff. - * - * This helper is similar to **bpf_perf_event_output**\ () but - * restricted to raw_tracepoint bpf programs. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_probe_read_user(void *dst, u32 size, const void *unsafe_ptr) - * Description - * Safely attempt to read *size* bytes from user space address - * *unsafe_ptr* and store the data in *dst*. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_probe_read_kernel(void *dst, u32 size, const void *unsafe_ptr) - * Description - * Safely attempt to read *size* bytes from kernel space address - * *unsafe_ptr* and store the data in *dst*. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_probe_read_user_str(void *dst, u32 size, const void *unsafe_ptr) - * Description - * Copy a NUL terminated string from an unsafe user address - * *unsafe_ptr* to *dst*. The *size* should include the - * terminating NUL byte. In case the string length is smaller than - * *size*, the target is not padded with further NUL bytes. If the - * string length is larger than *size*, just *size*-1 bytes are - * copied and the last byte is set to NUL. - * - * On success, returns the number of bytes that were written, - * including the terminal NUL. This makes this helper useful in - * tracing programs for reading strings, and more importantly to - * get its length at runtime. See the following snippet: - * - * :: - * - * SEC("kprobe/sys_open") - * void bpf_sys_open(struct pt_regs *ctx) - * { - * char buf[PATHLEN]; // PATHLEN is defined to 256 - * int res = bpf_probe_read_user_str(buf, sizeof(buf), - * ctx->di); - * - * // Consume buf, for example push it to - * // userspace via bpf_perf_event_output(); we - * // can use res (the string length) as event - * // size, after checking its boundaries. - * } - * - * In comparison, using **bpf_probe_read_user**\ () helper here - * instead to read the string would require to estimate the length - * at compile time, and would often result in copying more memory - * than necessary. - * - * Another useful use case is when parsing individual process - * arguments or individual environment variables navigating - * *current*\ **->mm->arg_start** and *current*\ - * **->mm->env_start**: using this helper and the return value, - * one can quickly iterate at the right offset of the memory area. - * Return - * On success, the strictly positive length of the output string, - * including the trailing NUL character. On error, a negative - * value. - * - * long bpf_probe_read_kernel_str(void *dst, u32 size, const void *unsafe_ptr) - * Description - * Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr* - * to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply. - * Return - * On success, the strictly positive length of the string, including - * the trailing NUL character. On error, a negative value. - * - * long bpf_tcp_send_ack(void *tp, u32 rcv_nxt) - * Description - * Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**. - * *rcv_nxt* is the ack_seq to be sent out. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_send_signal_thread(u32 sig) - * Description - * Send signal *sig* to the thread corresponding to the current task. - * Return - * 0 on success or successfully queued. - * - * **-EBUSY** if work queue under nmi is full. - * - * **-EINVAL** if *sig* is invalid. - * - * **-EPERM** if no permission to send the *sig*. - * - * **-EAGAIN** if bpf program can try again. - * - * u64 bpf_jiffies64(void) - * Description - * Obtain the 64bit jiffies - * Return - * The 64 bit jiffies - * - * long bpf_read_branch_records(struct bpf_perf_event_data *ctx, void *buf, u32 size, u64 flags) - * Description - * For an eBPF program attached to a perf event, retrieve the - * branch records (**struct perf_branch_entry**) associated to *ctx* - * and store it in the buffer pointed by *buf* up to size - * *size* bytes. - * Return - * On success, number of bytes written to *buf*. On error, a - * negative value. - * - * The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to - * instead return the number of bytes required to store all the - * branch entries. If this flag is set, *buf* may be NULL. - * - * **-EINVAL** if arguments invalid or **size** not a multiple - * of **sizeof**\ (**struct perf_branch_entry**\ ). - * - * **-ENOENT** if architecture does not support branch records. - * - * long bpf_get_ns_current_pid_tgid(u64 dev, u64 ino, struct bpf_pidns_info *nsdata, u32 size) - * Description - * Returns 0 on success, values for *pid* and *tgid* as seen from the current - * *namespace* will be returned in *nsdata*. - * Return - * 0 on success, or one of the following in case of failure: - * - * **-EINVAL** if dev and inum supplied don't match dev_t and inode number - * with nsfs of current task, or if dev conversion to dev_t lost high bits. - * - * **-ENOENT** if pidns does not exists for the current task. - * - * long bpf_xdp_output(void *ctx, struct bpf_map *map, u64 flags, void *data, u64 size) - * Description - * Write raw *data* blob into a special BPF perf event held by - * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf - * event must have the following attributes: **PERF_SAMPLE_RAW** - * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and - * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. - * - * The *flags* are used to indicate the index in *map* for which - * the value must be put, masked with **BPF_F_INDEX_MASK**. - * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** - * to indicate that the index of the current CPU core should be - * used. - * - * The value to write, of *size*, is passed through eBPF stack and - * pointed by *data*. - * - * *ctx* is a pointer to in-kernel struct xdp_buff. - * - * This helper is similar to **bpf_perf_eventoutput**\ () but - * restricted to raw_tracepoint bpf programs. - * Return - * 0 on success, or a negative error in case of failure. - * - * u64 bpf_get_netns_cookie(void *ctx) - * Description - * Retrieve the cookie (generated by the kernel) of the network - * namespace the input *ctx* is associated with. The network - * namespace cookie remains stable for its lifetime and provides - * a global identifier that can be assumed unique. If *ctx* is - * NULL, then the helper returns the cookie for the initial - * network namespace. The cookie itself is very similar to that - * of **bpf_get_socket_cookie**\ () helper, but for network - * namespaces instead of sockets. - * Return - * A 8-byte long opaque number. - * - * u64 bpf_get_current_ancestor_cgroup_id(int ancestor_level) - * Description - * Return id of cgroup v2 that is ancestor of the cgroup associated - * with the current task at the *ancestor_level*. The root cgroup - * is at *ancestor_level* zero and each step down the hierarchy - * increments the level. If *ancestor_level* == level of cgroup - * associated with the current task, then return value will be the - * same as that of **bpf_get_current_cgroup_id**\ (). - * - * The helper is useful to implement policies based on cgroups - * that are upper in hierarchy than immediate cgroup associated - * with the current task. - * - * The format of returned id and helper limitations are same as in - * **bpf_get_current_cgroup_id**\ (). - * Return - * The id is returned or 0 in case the id could not be retrieved. - * - * long bpf_sk_assign(struct sk_buff *skb, void *sk, u64 flags) - * Description - * Helper is overloaded depending on BPF program type. This - * description applies to **BPF_PROG_TYPE_SCHED_CLS** and - * **BPF_PROG_TYPE_SCHED_ACT** programs. - * - * Assign the *sk* to the *skb*. When combined with appropriate - * routing configuration to receive the packet towards the socket, - * will cause *skb* to be delivered to the specified socket. - * Subsequent redirection of *skb* via **bpf_redirect**\ (), - * **bpf_clone_redirect**\ () or other methods outside of BPF may - * interfere with successful delivery to the socket. - * - * This operation is only valid from TC ingress path. - * - * The *flags* argument must be zero. - * Return - * 0 on success, or a negative error in case of failure: - * - * **-EINVAL** if specified *flags* are not supported. - * - * **-ENOENT** if the socket is unavailable for assignment. - * - * **-ENETUNREACH** if the socket is unreachable (wrong netns). - * - * **-EOPNOTSUPP** if the operation is not supported, for example - * a call from outside of TC ingress. - * - * **-ESOCKTNOSUPPORT** if the socket type is not supported - * (reuseport). - * - * long bpf_sk_assign(struct bpf_sk_lookup *ctx, struct bpf_sock *sk, u64 flags) - * Description - * Helper is overloaded depending on BPF program type. This - * description applies to **BPF_PROG_TYPE_SK_LOOKUP** programs. - * - * Select the *sk* as a result of a socket lookup. - * - * For the operation to succeed passed socket must be compatible - * with the packet description provided by the *ctx* object. - * - * L4 protocol (**IPPROTO_TCP** or **IPPROTO_UDP**) must - * be an exact match. While IP family (**AF_INET** or - * **AF_INET6**) must be compatible, that is IPv6 sockets - * that are not v6-only can be selected for IPv4 packets. - * - * Only TCP listeners and UDP unconnected sockets can be - * selected. *sk* can also be NULL to reset any previous - * selection. - * - * *flags* argument can combination of following values: - * - * * **BPF_SK_LOOKUP_F_REPLACE** to override the previous - * socket selection, potentially done by a BPF program - * that ran before us. - * - * * **BPF_SK_LOOKUP_F_NO_REUSEPORT** to skip - * load-balancing within reuseport group for the socket - * being selected. - * - * On success *ctx->sk* will point to the selected socket. - * - * Return - * 0 on success, or a negative errno in case of failure. - * - * * **-EAFNOSUPPORT** if socket family (*sk->family*) is - * not compatible with packet family (*ctx->family*). - * - * * **-EEXIST** if socket has been already selected, - * potentially by another program, and - * **BPF_SK_LOOKUP_F_REPLACE** flag was not specified. - * - * * **-EINVAL** if unsupported flags were specified. - * - * * **-EPROTOTYPE** if socket L4 protocol - * (*sk->protocol*) doesn't match packet protocol - * (*ctx->protocol*). - * - * * **-ESOCKTNOSUPPORT** if socket is not in allowed - * state (TCP listening or UDP unconnected). - * - * u64 bpf_ktime_get_boot_ns(void) - * Description - * Return the time elapsed since system boot, in nanoseconds. - * Does include the time the system was suspended. - * See: **clock_gettime**\ (**CLOCK_BOOTTIME**) - * Return - * Current *ktime*. - * - * long bpf_seq_printf(struct seq_file *m, const char *fmt, u32 fmt_size, const void *data, u32 data_len) - * Description - * **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print - * out the format string. - * The *m* represents the seq_file. The *fmt* and *fmt_size* are for - * the format string itself. The *data* and *data_len* are format string - * arguments. The *data* are a **u64** array and corresponding format string - * values are stored in the array. For strings and pointers where pointees - * are accessed, only the pointer values are stored in the *data* array. - * The *data_len* is the size of *data* in bytes - must be a multiple of 8. - * - * Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory. - * Reading kernel memory may fail due to either invalid address or - * valid address but requiring a major memory fault. If reading kernel memory - * fails, the string for **%s** will be an empty string, and the ip - * address for **%p{i,I}{4,6}** will be 0. Not returning error to - * bpf program is consistent with what **bpf_trace_printk**\ () does for now. - * Return - * 0 on success, or a negative error in case of failure: - * - * **-EBUSY** if per-CPU memory copy buffer is busy, can try again - * by returning 1 from bpf program. - * - * **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported. - * - * **-E2BIG** if *fmt* contains too many format specifiers. - * - * **-EOVERFLOW** if an overflow happened: The same object will be tried again. - * - * long bpf_seq_write(struct seq_file *m, const void *data, u32 len) - * Description - * **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data. - * The *m* represents the seq_file. The *data* and *len* represent the - * data to write in bytes. - * Return - * 0 on success, or a negative error in case of failure: - * - * **-EOVERFLOW** if an overflow happened: The same object will be tried again. - * - * u64 bpf_sk_cgroup_id(void *sk) - * Description - * Return the cgroup v2 id of the socket *sk*. - * - * *sk* must be a non-**NULL** pointer to a socket, e.g. one - * returned from **bpf_sk_lookup_xxx**\ (), - * **bpf_sk_fullsock**\ (), etc. The format of returned id is - * same as in **bpf_skb_cgroup_id**\ (). - * - * This helper is available only if the kernel was compiled with - * the **CONFIG_SOCK_CGROUP_DATA** configuration option. - * Return - * The id is returned or 0 in case the id could not be retrieved. - * - * u64 bpf_sk_ancestor_cgroup_id(void *sk, int ancestor_level) - * Description - * Return id of cgroup v2 that is ancestor of cgroup associated - * with the *sk* at the *ancestor_level*. The root cgroup is at - * *ancestor_level* zero and each step down the hierarchy - * increments the level. If *ancestor_level* == level of cgroup - * associated with *sk*, then return value will be same as that - * of **bpf_sk_cgroup_id**\ (). - * - * The helper is useful to implement policies based on cgroups - * that are upper in hierarchy than immediate cgroup associated - * with *sk*. - * - * The format of returned id and helper limitations are same as in - * **bpf_sk_cgroup_id**\ (). - * Return - * The id is returned or 0 in case the id could not be retrieved. - * - * long bpf_ringbuf_output(void *ringbuf, void *data, u64 size, u64 flags) - * Description - * Copy *size* bytes from *data* into a ring buffer *ringbuf*. - * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification - * of new data availability is sent. - * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification - * of new data availability is sent unconditionally. - * If **0** is specified in *flags*, an adaptive notification - * of new data availability is sent. - * - * An adaptive notification is a notification sent whenever the user-space - * process has caught up and consumed all available payloads. In case the user-space - * process is still processing a previous payload, then no notification is needed - * as it will process the newly added payload automatically. - * Return - * 0 on success, or a negative error in case of failure. - * - * void *bpf_ringbuf_reserve(void *ringbuf, u64 size, u64 flags) - * Description - * Reserve *size* bytes of payload in a ring buffer *ringbuf*. - * *flags* must be 0. - * Return - * Valid pointer with *size* bytes of memory available; NULL, - * otherwise. - * - * void bpf_ringbuf_submit(void *data, u64 flags) - * Description - * Submit reserved ring buffer sample, pointed to by *data*. - * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification - * of new data availability is sent. - * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification - * of new data availability is sent unconditionally. - * If **0** is specified in *flags*, an adaptive notification - * of new data availability is sent. - * - * See 'bpf_ringbuf_output()' for the definition of adaptive notification. - * Return - * Nothing. Always succeeds. - * - * void bpf_ringbuf_discard(void *data, u64 flags) - * Description - * Discard reserved ring buffer sample, pointed to by *data*. - * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification - * of new data availability is sent. - * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification - * of new data availability is sent unconditionally. - * If **0** is specified in *flags*, an adaptive notification - * of new data availability is sent. - * - * See 'bpf_ringbuf_output()' for the definition of adaptive notification. - * Return - * Nothing. Always succeeds. - * - * u64 bpf_ringbuf_query(void *ringbuf, u64 flags) - * Description - * Query various characteristics of provided ring buffer. What - * exactly is queries is determined by *flags*: - * - * * **BPF_RB_AVAIL_DATA**: Amount of data not yet consumed. - * * **BPF_RB_RING_SIZE**: The size of ring buffer. - * * **BPF_RB_CONS_POS**: Consumer position (can wrap around). - * * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around). - * - * Data returned is just a momentary snapshot of actual values - * and could be inaccurate, so this facility should be used to - * power heuristics and for reporting, not to make 100% correct - * calculation. - * Return - * Requested value, or 0, if *flags* are not recognized. - * - * long bpf_csum_level(struct sk_buff *skb, u64 level) - * Description - * Change the skbs checksum level by one layer up or down, or - * reset it entirely to none in order to have the stack perform - * checksum validation. The level is applicable to the following - * protocols: TCP, UDP, GRE, SCTP, FCOE. For example, a decap of - * | ETH | IP | UDP | GUE | IP | TCP | into | ETH | IP | TCP | - * through **bpf_skb_adjust_room**\ () helper with passing in - * **BPF_F_ADJ_ROOM_NO_CSUM_RESET** flag would require one call - * to **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_DEC** since - * the UDP header is removed. Similarly, an encap of the latter - * into the former could be accompanied by a helper call to - * **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_INC** if the - * skb is still intended to be processed in higher layers of the - * stack instead of just egressing at tc. - * - * There are three supported level settings at this time: - * - * * **BPF_CSUM_LEVEL_INC**: Increases skb->csum_level for skbs - * with CHECKSUM_UNNECESSARY. - * * **BPF_CSUM_LEVEL_DEC**: Decreases skb->csum_level for skbs - * with CHECKSUM_UNNECESSARY. - * * **BPF_CSUM_LEVEL_RESET**: Resets skb->csum_level to 0 and - * sets CHECKSUM_NONE to force checksum validation by the stack. - * * **BPF_CSUM_LEVEL_QUERY**: No-op, returns the current - * skb->csum_level. - * Return - * 0 on success, or a negative error in case of failure. In the - * case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level - * is returned or the error code -EACCES in case the skb is not - * subject to CHECKSUM_UNNECESSARY. - * - * struct tcp6_sock *bpf_skc_to_tcp6_sock(void *sk) - * Description - * Dynamically cast a *sk* pointer to a *tcp6_sock* pointer. - * Return - * *sk* if casting is valid, or **NULL** otherwise. - * - * struct tcp_sock *bpf_skc_to_tcp_sock(void *sk) - * Description - * Dynamically cast a *sk* pointer to a *tcp_sock* pointer. - * Return - * *sk* if casting is valid, or **NULL** otherwise. - * - * struct tcp_timewait_sock *bpf_skc_to_tcp_timewait_sock(void *sk) - * Description - * Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer. - * Return - * *sk* if casting is valid, or **NULL** otherwise. - * - * struct tcp_request_sock *bpf_skc_to_tcp_request_sock(void *sk) - * Description - * Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer. - * Return - * *sk* if casting is valid, or **NULL** otherwise. - * - * struct udp6_sock *bpf_skc_to_udp6_sock(void *sk) - * Description - * Dynamically cast a *sk* pointer to a *udp6_sock* pointer. - * Return - * *sk* if casting is valid, or **NULL** otherwise. - * - * long bpf_get_task_stack(struct task_struct *task, void *buf, u32 size, u64 flags) - * Description - * Return a user or a kernel stack in bpf program provided buffer. - * To achieve this, the helper needs *task*, which is a valid - * pointer to **struct task_struct**. To store the stacktrace, the - * bpf program provides *buf* with a nonnegative *size*. - * - * The last argument, *flags*, holds the number of stack frames to - * skip (from 0 to 255), masked with - * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set - * the following flags: - * - * **BPF_F_USER_STACK** - * Collect a user space stack instead of a kernel stack. - * **BPF_F_USER_BUILD_ID** - * Collect buildid+offset instead of ips for user stack, - * only valid if **BPF_F_USER_STACK** is also specified. - * - * **bpf_get_task_stack**\ () can collect up to - * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject - * to sufficient large buffer size. Note that - * this limit can be controlled with the **sysctl** program, and - * that it should be manually increased in order to profile long - * user stacks (such as stacks for Java programs). To do so, use: - * - * :: - * - * # sysctl kernel.perf_event_max_stack= - * Return - * The non-negative copied *buf* length equal to or less than - * *size* on success, or a negative error in case of failure. - * - * long bpf_load_hdr_opt(struct bpf_sock_ops *skops, void *searchby_res, u32 len, u64 flags) - * Description - * Load header option. Support reading a particular TCP header - * option for bpf program (**BPF_PROG_TYPE_SOCK_OPS**). - * - * If *flags* is 0, it will search the option from the - * *skops*\ **->skb_data**. The comment in **struct bpf_sock_ops** - * has details on what skb_data contains under different - * *skops*\ **->op**. - * - * The first byte of the *searchby_res* specifies the - * kind that it wants to search. - * - * If the searching kind is an experimental kind - * (i.e. 253 or 254 according to RFC6994). It also - * needs to specify the "magic" which is either - * 2 bytes or 4 bytes. It then also needs to - * specify the size of the magic by using - * the 2nd byte which is "kind-length" of a TCP - * header option and the "kind-length" also - * includes the first 2 bytes "kind" and "kind-length" - * itself as a normal TCP header option also does. - * - * For example, to search experimental kind 254 with - * 2 byte magic 0xeB9F, the searchby_res should be - * [ 254, 4, 0xeB, 0x9F, 0, 0, .... 0 ]. - * - * To search for the standard window scale option (3), - * the *searchby_res* should be [ 3, 0, 0, .... 0 ]. - * Note, kind-length must be 0 for regular option. - * - * Searching for No-Op (0) and End-of-Option-List (1) are - * not supported. - * - * *len* must be at least 2 bytes which is the minimal size - * of a header option. - * - * Supported flags: - * - * * **BPF_LOAD_HDR_OPT_TCP_SYN** to search from the - * saved_syn packet or the just-received syn packet. - * - * Return - * > 0 when found, the header option is copied to *searchby_res*. - * The return value is the total length copied. On failure, a - * negative error code is returned: - * - * **-EINVAL** if a parameter is invalid. - * - * **-ENOMSG** if the option is not found. - * - * **-ENOENT** if no syn packet is available when - * **BPF_LOAD_HDR_OPT_TCP_SYN** is used. - * - * **-ENOSPC** if there is not enough space. Only *len* number of - * bytes are copied. - * - * **-EFAULT** on failure to parse the header options in the - * packet. - * - * **-EPERM** if the helper cannot be used under the current - * *skops*\ **->op**. - * - * long bpf_store_hdr_opt(struct bpf_sock_ops *skops, const void *from, u32 len, u64 flags) - * Description - * Store header option. The data will be copied - * from buffer *from* with length *len* to the TCP header. - * - * The buffer *from* should have the whole option that - * includes the kind, kind-length, and the actual - * option data. The *len* must be at least kind-length - * long. The kind-length does not have to be 4 byte - * aligned. The kernel will take care of the padding - * and setting the 4 bytes aligned value to th->doff. - * - * This helper will check for duplicated option - * by searching the same option in the outgoing skb. - * - * This helper can only be called during - * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. - * - * Return - * 0 on success, or negative error in case of failure: - * - * **-EINVAL** If param is invalid. - * - * **-ENOSPC** if there is not enough space in the header. - * Nothing has been written - * - * **-EEXIST** if the option already exists. - * - * **-EFAULT** on failrue to parse the existing header options. - * - * **-EPERM** if the helper cannot be used under the current - * *skops*\ **->op**. - * - * long bpf_reserve_hdr_opt(struct bpf_sock_ops *skops, u32 len, u64 flags) - * Description - * Reserve *len* bytes for the bpf header option. The - * space will be used by **bpf_store_hdr_opt**\ () later in - * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. - * - * If **bpf_reserve_hdr_opt**\ () is called multiple times, - * the total number of bytes will be reserved. - * - * This helper can only be called during - * **BPF_SOCK_OPS_HDR_OPT_LEN_CB**. - * - * Return - * 0 on success, or negative error in case of failure: - * - * **-EINVAL** if a parameter is invalid. - * - * **-ENOSPC** if there is not enough space in the header. - * - * **-EPERM** if the helper cannot be used under the current - * *skops*\ **->op**. - * - * void *bpf_inode_storage_get(struct bpf_map *map, void *inode, void *value, u64 flags) - * Description - * Get a bpf_local_storage from an *inode*. - * - * Logically, it could be thought of as getting the value from - * a *map* with *inode* as the **key**. From this - * perspective, the usage is not much different from - * **bpf_map_lookup_elem**\ (*map*, **&**\ *inode*) except this - * helper enforces the key must be an inode and the map must also - * be a **BPF_MAP_TYPE_INODE_STORAGE**. - * - * Underneath, the value is stored locally at *inode* instead of - * the *map*. The *map* is used as the bpf-local-storage - * "type". The bpf-local-storage "type" (i.e. the *map*) is - * searched against all bpf_local_storage residing at *inode*. - * - * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be - * used such that a new bpf_local_storage will be - * created if one does not exist. *value* can be used - * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify - * the initial value of a bpf_local_storage. If *value* is - * **NULL**, the new bpf_local_storage will be zero initialized. - * Return - * A bpf_local_storage pointer is returned on success. - * - * **NULL** if not found or there was an error in adding - * a new bpf_local_storage. - * - * int bpf_inode_storage_delete(struct bpf_map *map, void *inode) - * Description - * Delete a bpf_local_storage from an *inode*. - * Return - * 0 on success. - * - * **-ENOENT** if the bpf_local_storage cannot be found. - * - * long bpf_d_path(struct path *path, char *buf, u32 sz) - * Description - * Return full path for given **struct path** object, which - * needs to be the kernel BTF *path* object. The path is - * returned in the provided buffer *buf* of size *sz* and - * is zero terminated. - * - * Return - * On success, the strictly positive length of the string, - * including the trailing NUL character. On error, a negative - * value. - * - * long bpf_copy_from_user(void *dst, u32 size, const void *user_ptr) - * Description - * Read *size* bytes from user space address *user_ptr* and store - * the data in *dst*. This is a wrapper of **copy_from_user**\ (). - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_snprintf_btf(char *str, u32 str_size, struct btf_ptr *ptr, u32 btf_ptr_size, u64 flags) - * Description - * Use BTF to store a string representation of *ptr*->ptr in *str*, - * using *ptr*->type_id. This value should specify the type - * that *ptr*->ptr points to. LLVM __builtin_btf_type_id(type, 1) - * can be used to look up vmlinux BTF type ids. Traversing the - * data structure using BTF, the type information and values are - * stored in the first *str_size* - 1 bytes of *str*. Safe copy of - * the pointer data is carried out to avoid kernel crashes during - * operation. Smaller types can use string space on the stack; - * larger programs can use map data to store the string - * representation. - * - * The string can be subsequently shared with userspace via - * bpf_perf_event_output() or ring buffer interfaces. - * bpf_trace_printk() is to be avoided as it places too small - * a limit on string size to be useful. - * - * *flags* is a combination of - * - * **BTF_F_COMPACT** - * no formatting around type information - * **BTF_F_NONAME** - * no struct/union member names/types - * **BTF_F_PTR_RAW** - * show raw (unobfuscated) pointer values; - * equivalent to printk specifier %px. - * **BTF_F_ZERO** - * show zero-valued struct/union members; they - * are not displayed by default - * - * Return - * The number of bytes that were written (or would have been - * written if output had to be truncated due to string size), - * or a negative error in cases of failure. - * - * long bpf_seq_printf_btf(struct seq_file *m, struct btf_ptr *ptr, u32 ptr_size, u64 flags) - * Description - * Use BTF to write to seq_write a string representation of - * *ptr*->ptr, using *ptr*->type_id as per bpf_snprintf_btf(). - * *flags* are identical to those used for bpf_snprintf_btf. - * Return - * 0 on success or a negative error in case of failure. - * - * u64 bpf_skb_cgroup_classid(struct sk_buff *skb) - * Description - * See **bpf_get_cgroup_classid**\ () for the main description. - * This helper differs from **bpf_get_cgroup_classid**\ () in that - * the cgroup v1 net_cls class is retrieved only from the *skb*'s - * associated socket instead of the current process. - * Return - * The id is returned or 0 in case the id could not be retrieved. - * - * long bpf_redirect_neigh(u32 ifindex, struct bpf_redir_neigh *params, int plen, u64 flags) - * Description - * Redirect the packet to another net device of index *ifindex* - * and fill in L2 addresses from neighboring subsystem. This helper - * is somewhat similar to **bpf_redirect**\ (), except that it - * populates L2 addresses as well, meaning, internally, the helper - * relies on the neighbor lookup for the L2 address of the nexthop. - * - * The helper will perform a FIB lookup based on the skb's - * networking header to get the address of the next hop, unless - * this is supplied by the caller in the *params* argument. The - * *plen* argument indicates the len of *params* and should be set - * to 0 if *params* is NULL. - * - * The *flags* argument is reserved and must be 0. The helper is - * currently only supported for tc BPF program types, and enabled - * for IPv4 and IPv6 protocols. - * Return - * The helper returns **TC_ACT_REDIRECT** on success or - * **TC_ACT_SHOT** on error. - * - * void *bpf_per_cpu_ptr(const void *percpu_ptr, u32 cpu) - * Description - * Take a pointer to a percpu ksym, *percpu_ptr*, and return a - * pointer to the percpu kernel variable on *cpu*. A ksym is an - * extern variable decorated with '__ksym'. For ksym, there is a - * global var (either static or global) defined of the same name - * in the kernel. The ksym is percpu if the global var is percpu. - * The returned pointer points to the global percpu var on *cpu*. - * - * bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the - * kernel, except that bpf_per_cpu_ptr() may return NULL. This - * happens if *cpu* is larger than nr_cpu_ids. The caller of - * bpf_per_cpu_ptr() must check the returned value. - * Return - * A pointer pointing to the kernel percpu variable on *cpu*, or - * NULL, if *cpu* is invalid. - * - * void *bpf_this_cpu_ptr(const void *percpu_ptr) - * Description - * Take a pointer to a percpu ksym, *percpu_ptr*, and return a - * pointer to the percpu kernel variable on this cpu. See the - * description of 'ksym' in **bpf_per_cpu_ptr**\ (). - * - * bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in - * the kernel. Different from **bpf_per_cpu_ptr**\ (), it would - * never return NULL. - * Return - * A pointer pointing to the kernel percpu variable on this cpu. - * - * long bpf_redirect_peer(u32 ifindex, u64 flags) - * Description - * Redirect the packet to another net device of index *ifindex*. - * This helper is somewhat similar to **bpf_redirect**\ (), except - * that the redirection happens to the *ifindex*' peer device and - * the netns switch takes place from ingress to ingress without - * going through the CPU's backlog queue. - * - * The *flags* argument is reserved and must be 0. The helper is - * currently only supported for tc BPF program types at the ingress - * hook and for veth device types. The peer device must reside in a - * different network namespace. - * Return - * The helper returns **TC_ACT_REDIRECT** on success or - * **TC_ACT_SHOT** on error. - * - * void *bpf_task_storage_get(struct bpf_map *map, struct task_struct *task, void *value, u64 flags) - * Description - * Get a bpf_local_storage from the *task*. - * - * Logically, it could be thought of as getting the value from - * a *map* with *task* as the **key**. From this - * perspective, the usage is not much different from - * **bpf_map_lookup_elem**\ (*map*, **&**\ *task*) except this - * helper enforces the key must be an task_struct and the map must also - * be a **BPF_MAP_TYPE_TASK_STORAGE**. - * - * Underneath, the value is stored locally at *task* instead of - * the *map*. The *map* is used as the bpf-local-storage - * "type". The bpf-local-storage "type" (i.e. the *map*) is - * searched against all bpf_local_storage residing at *task*. - * - * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be - * used such that a new bpf_local_storage will be - * created if one does not exist. *value* can be used - * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify - * the initial value of a bpf_local_storage. If *value* is - * **NULL**, the new bpf_local_storage will be zero initialized. - * Return - * A bpf_local_storage pointer is returned on success. - * - * **NULL** if not found or there was an error in adding - * a new bpf_local_storage. - * - * long bpf_task_storage_delete(struct bpf_map *map, struct task_struct *task) - * Description - * Delete a bpf_local_storage from a *task*. - * Return - * 0 on success. - * - * **-ENOENT** if the bpf_local_storage cannot be found. - * - * struct task_struct *bpf_get_current_task_btf(void) - * Description - * Return a BTF pointer to the "current" task. - * This pointer can also be used in helpers that accept an - * *ARG_PTR_TO_BTF_ID* of type *task_struct*. - * Return - * Pointer to the current task. - * - * long bpf_bprm_opts_set(struct linux_binprm *bprm, u64 flags) - * Description - * Set or clear certain options on *bprm*: - * - * **BPF_F_BPRM_SECUREEXEC** Set the secureexec bit - * which sets the **AT_SECURE** auxv for glibc. The bit - * is cleared if the flag is not specified. - * Return - * **-EINVAL** if invalid *flags* are passed, zero otherwise. - * - * u64 bpf_ktime_get_coarse_ns(void) - * Description - * Return a coarse-grained version of the time elapsed since - * system boot, in nanoseconds. Does not include time the system - * was suspended. - * - * See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**) - * Return - * Current *ktime*. - * - * long bpf_ima_inode_hash(struct inode *inode, void *dst, u32 size) - * Description - * Returns the stored IMA hash of the *inode* (if it's avaialable). - * If the hash is larger than *size*, then only *size* - * bytes will be copied to *dst* - * Return - * The **hash_algo** is returned on success, - * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if - * invalid arguments are passed. - * - * struct socket *bpf_sock_from_file(struct file *file) - * Description - * If the given file represents a socket, returns the associated - * socket. - * Return - * A pointer to a struct socket on success or NULL if the file is - * not a socket. - * - * long bpf_check_mtu(void *ctx, u32 ifindex, u32 *mtu_len, s32 len_diff, u64 flags) - * Description - * Check packet size against exceeding MTU of net device (based - * on *ifindex*). This helper will likely be used in combination - * with helpers that adjust/change the packet size. - * - * The argument *len_diff* can be used for querying with a planned - * size change. This allows to check MTU prior to changing packet - * ctx. Providing an *len_diff* adjustment that is larger than the - * actual packet size (resulting in negative packet size) will in - * principle not exceed the MTU, why it is not considered a - * failure. Other BPF-helpers are needed for performing the - * planned size change, why the responsability for catch a negative - * packet size belong in those helpers. - * - * Specifying *ifindex* zero means the MTU check is performed - * against the current net device. This is practical if this isn't - * used prior to redirect. - * - * On input *mtu_len* must be a valid pointer, else verifier will - * reject BPF program. If the value *mtu_len* is initialized to - * zero then the ctx packet size is use. When value *mtu_len* is - * provided as input this specify the L3 length that the MTU check - * is done against. Remember XDP and TC length operate at L2, but - * this value is L3 as this correlate to MTU and IP-header tot_len - * values which are L3 (similar behavior as bpf_fib_lookup). - * - * The Linux kernel route table can configure MTUs on a more - * specific per route level, which is not provided by this helper. - * For route level MTU checks use the **bpf_fib_lookup**\ () - * helper. - * - * *ctx* is either **struct xdp_md** for XDP programs or - * **struct sk_buff** for tc cls_act programs. - * - * The *flags* argument can be a combination of one or more of the - * following values: - * - * **BPF_MTU_CHK_SEGS** - * This flag will only works for *ctx* **struct sk_buff**. - * If packet context contains extra packet segment buffers - * (often knows as GSO skb), then MTU check is harder to - * check at this point, because in transmit path it is - * possible for the skb packet to get re-segmented - * (depending on net device features). This could still be - * a MTU violation, so this flag enables performing MTU - * check against segments, with a different violation - * return code to tell it apart. Check cannot use len_diff. - * - * On return *mtu_len* pointer contains the MTU value of the net - * device. Remember the net device configured MTU is the L3 size, - * which is returned here and XDP and TC length operate at L2. - * Helper take this into account for you, but remember when using - * MTU value in your BPF-code. - * - * Return - * * 0 on success, and populate MTU value in *mtu_len* pointer. - * - * * < 0 if any input argument is invalid (*mtu_len* not updated) - * - * MTU violations return positive values, but also populate MTU - * value in *mtu_len* pointer, as this can be needed for - * implementing PMTU handing: - * - * * **BPF_MTU_CHK_RET_FRAG_NEEDED** - * * **BPF_MTU_CHK_RET_SEGS_TOOBIG** - * - * long bpf_for_each_map_elem(struct bpf_map *map, void *callback_fn, void *callback_ctx, u64 flags) - * Description - * For each element in **map**, call **callback_fn** function with - * **map**, **callback_ctx** and other map-specific parameters. - * The **callback_fn** should be a static function and - * the **callback_ctx** should be a pointer to the stack. - * The **flags** is used to control certain aspects of the helper. - * Currently, the **flags** must be 0. - * - * The following are a list of supported map types and their - * respective expected callback signatures: - * - * BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_PERCPU_HASH, - * BPF_MAP_TYPE_LRU_HASH, BPF_MAP_TYPE_LRU_PERCPU_HASH, - * BPF_MAP_TYPE_ARRAY, BPF_MAP_TYPE_PERCPU_ARRAY - * - * long (\*callback_fn)(struct bpf_map \*map, const void \*key, void \*value, void \*ctx); - * - * For per_cpu maps, the map_value is the value on the cpu where the - * bpf_prog is running. - * - * If **callback_fn** return 0, the helper will continue to the next - * element. If return value is 1, the helper will skip the rest of - * elements and return. Other return values are not used now. - * - * Return - * The number of traversed map elements for success, **-EINVAL** for - * invalid **flags**. - * - * long bpf_snprintf(char *str, u32 str_size, const char *fmt, u64 *data, u32 data_len) - * Description - * Outputs a string into the **str** buffer of size **str_size** - * based on a format string stored in a read-only map pointed by - * **fmt**. - * - * Each format specifier in **fmt** corresponds to one u64 element - * in the **data** array. For strings and pointers where pointees - * are accessed, only the pointer values are stored in the *data* - * array. The *data_len* is the size of *data* in bytes - must be - * a multiple of 8. - * - * Formats **%s** and **%p{i,I}{4,6}** require to read kernel - * memory. Reading kernel memory may fail due to either invalid - * address or valid address but requiring a major memory fault. If - * reading kernel memory fails, the string for **%s** will be an - * empty string, and the ip address for **%p{i,I}{4,6}** will be 0. - * Not returning error to bpf program is consistent with what - * **bpf_trace_printk**\ () does for now. - * - * Return - * The strictly positive length of the formatted string, including - * the trailing zero character. If the return value is greater than - * **str_size**, **str** contains a truncated string, guaranteed to - * be zero-terminated except when **str_size** is 0. - * - * Or **-EBUSY** if the per-CPU memory copy buffer is busy. - * - * long bpf_sys_bpf(u32 cmd, void *attr, u32 attr_size) - * Description - * Execute bpf syscall with given arguments. - * Return - * A syscall result. - * - * long bpf_btf_find_by_name_kind(char *name, int name_sz, u32 kind, int flags) - * Description - * Find BTF type with given name and kind in vmlinux BTF or in module's BTFs. - * Return - * Returns btf_id and btf_obj_fd in lower and upper 32 bits. - * - * long bpf_sys_close(u32 fd) - * Description - * Execute close syscall for given FD. - * Return - * A syscall result. - * - * long bpf_timer_init(struct bpf_timer *timer, struct bpf_map *map, u64 flags) - * Description - * Initialize the timer. - * First 4 bits of *flags* specify clockid. - * Only CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME are allowed. - * All other bits of *flags* are reserved. - * The verifier will reject the program if *timer* is not from - * the same *map*. - * Return - * 0 on success. - * **-EBUSY** if *timer* is already initialized. - * **-EINVAL** if invalid *flags* are passed. - * **-EPERM** if *timer* is in a map that doesn't have any user references. - * The user space should either hold a file descriptor to a map with timers - * or pin such map in bpffs. When map is unpinned or file descriptor is - * closed all timers in the map will be cancelled and freed. - * - * long bpf_timer_set_callback(struct bpf_timer *timer, void *callback_fn) - * Description - * Configure the timer to call *callback_fn* static function. - * Return - * 0 on success. - * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. - * **-EPERM** if *timer* is in a map that doesn't have any user references. - * The user space should either hold a file descriptor to a map with timers - * or pin such map in bpffs. When map is unpinned or file descriptor is - * closed all timers in the map will be cancelled and freed. - * - * long bpf_timer_start(struct bpf_timer *timer, u64 nsecs, u64 flags) - * Description - * Set timer expiration N nanoseconds from the current time. The - * configured callback will be invoked in soft irq context on some cpu - * and will not repeat unless another bpf_timer_start() is made. - * In such case the next invocation can migrate to a different cpu. - * Since struct bpf_timer is a field inside map element the map - * owns the timer. The bpf_timer_set_callback() will increment refcnt - * of BPF program to make sure that callback_fn code stays valid. - * When user space reference to a map reaches zero all timers - * in a map are cancelled and corresponding program's refcnts are - * decremented. This is done to make sure that Ctrl-C of a user - * process doesn't leave any timers running. If map is pinned in - * bpffs the callback_fn can re-arm itself indefinitely. - * bpf_map_update/delete_elem() helpers and user space sys_bpf commands - * cancel and free the timer in the given map element. - * The map can contain timers that invoke callback_fn-s from different - * programs. The same callback_fn can serve different timers from - * different maps if key/value layout matches across maps. - * Every bpf_timer_set_callback() can have different callback_fn. - * - * Return - * 0 on success. - * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier - * or invalid *flags* are passed. - * - * long bpf_timer_cancel(struct bpf_timer *timer) - * Description - * Cancel the timer and wait for callback_fn to finish if it was running. - * Return - * 0 if the timer was not active. - * 1 if the timer was active. - * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. - * **-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its - * own timer which would have led to a deadlock otherwise. - * - * u64 bpf_get_func_ip(void *ctx) - * Description - * Get address of the traced function (for tracing and kprobe programs). - * Return - * Address of the traced function. - * - * u64 bpf_get_attach_cookie(void *ctx) - * Description - * Get bpf_cookie value provided (optionally) during the program - * attachment. It might be different for each individual - * attachment, even if BPF program itself is the same. - * Expects BPF program context *ctx* as a first argument. - * - * Supported for the following program types: - * - kprobe/uprobe; - * - tracepoint; - * - perf_event. - * Return - * Value specified by user at BPF link creation/attachment time - * or 0, if it was not specified. - * - * long bpf_task_pt_regs(struct task_struct *task) - * Description - * Get the struct pt_regs associated with **task**. - * Return - * A pointer to struct pt_regs. - * - * long bpf_get_branch_snapshot(void *entries, u32 size, u64 flags) - * Description - * Get branch trace from hardware engines like Intel LBR. The - * hardware engine is stopped shortly after the helper is - * called. Therefore, the user need to filter branch entries - * based on the actual use case. To capture branch trace - * before the trigger point of the BPF program, the helper - * should be called at the beginning of the BPF program. - * - * The data is stored as struct perf_branch_entry into output - * buffer *entries*. *size* is the size of *entries* in bytes. - * *flags* is reserved for now and must be zero. - * - * Return - * On success, number of bytes written to *buf*. On error, a - * negative value. - * - * **-EINVAL** if *flags* is not zero. - * - * **-ENOENT** if architecture does not support branch records. - * - * long bpf_trace_vprintk(const char *fmt, u32 fmt_size, const void *data, u32 data_len) - * Description - * Behaves like **bpf_trace_printk**\ () helper, but takes an array of u64 - * to format and can handle more format args as a result. - * - * Arguments are to be used as in **bpf_seq_printf**\ () helper. - * Return - * The number of bytes written to the buffer, or a negative error - * in case of failure. - * - * struct unix_sock *bpf_skc_to_unix_sock(void *sk) - * Description - * Dynamically cast a *sk* pointer to a *unix_sock* pointer. - * Return - * *sk* if casting is valid, or **NULL** otherwise. - * - * long bpf_kallsyms_lookup_name(const char *name, int name_sz, int flags, u64 *res) - * Description - * Get the address of a kernel symbol, returned in *res*. *res* is - * set to 0 if the symbol is not found. - * Return - * On success, zero. On error, a negative value. - * - * **-EINVAL** if *flags* is not zero. - * - * **-EINVAL** if string *name* is not the same size as *name_sz*. - * - * **-ENOENT** if symbol is not found. - * - * **-EPERM** if caller does not have permission to obtain kernel address. - * - * long bpf_find_vma(struct task_struct *task, u64 addr, void *callback_fn, void *callback_ctx, u64 flags) - * Description - * Find vma of *task* that contains *addr*, call *callback_fn* - * function with *task*, *vma*, and *callback_ctx*. - * The *callback_fn* should be a static function and - * the *callback_ctx* should be a pointer to the stack. - * The *flags* is used to control certain aspects of the helper. - * Currently, the *flags* must be 0. - * - * The expected callback signature is - * - * long (\*callback_fn)(struct task_struct \*task, struct vm_area_struct \*vma, void \*callback_ctx); - * - * Return - * 0 on success. - * **-ENOENT** if *task->mm* is NULL, or no vma contains *addr*. - * **-EBUSY** if failed to try lock mmap_lock. - * **-EINVAL** for invalid **flags**. - * - * long bpf_loop(u32 nr_loops, void *callback_fn, void *callback_ctx, u64 flags) - * Description - * For **nr_loops**, call **callback_fn** function - * with **callback_ctx** as the context parameter. - * The **callback_fn** should be a static function and - * the **callback_ctx** should be a pointer to the stack. - * The **flags** is used to control certain aspects of the helper. - * Currently, the **flags** must be 0. Currently, nr_loops is - * limited to 1 << 23 (~8 million) loops. - * - * long (\*callback_fn)(u32 index, void \*ctx); - * - * where **index** is the current index in the loop. The index - * is zero-indexed. - * - * If **callback_fn** returns 0, the helper will continue to the next - * loop. If return value is 1, the helper will skip the rest of - * the loops and return. Other return values are not used now, - * and will be rejected by the verifier. - * - * Return - * The number of loops performed, **-EINVAL** for invalid **flags**, - * **-E2BIG** if **nr_loops** exceeds the maximum number of loops. - * - * long bpf_strncmp(const char *s1, u32 s1_sz, const char *s2) - * Description - * Do strncmp() between **s1** and **s2**. **s1** doesn't need - * to be null-terminated and **s1_sz** is the maximum storage - * size of **s1**. **s2** must be a read-only string. - * Return - * An integer less than, equal to, or greater than zero - * if the first **s1_sz** bytes of **s1** is found to be - * less than, to match, or be greater than **s2**. - * - * long bpf_get_func_arg(void *ctx, u32 n, u64 *value) - * Description - * Get **n**-th argument (zero based) of the traced function (for tracing programs) - * returned in **value**. - * - * Return - * 0 on success. - * **-EINVAL** if n >= arguments count of traced function. - * - * long bpf_get_func_ret(void *ctx, u64 *value) - * Description - * Get return value of the traced function (for tracing programs) - * in **value**. - * - * Return - * 0 on success. - * **-EOPNOTSUPP** for tracing programs other than BPF_TRACE_FEXIT or BPF_MODIFY_RETURN. - * - * long bpf_get_func_arg_cnt(void *ctx) - * Description - * Get number of arguments of the traced function (for tracing programs). - * - * Return - * The number of arguments of the traced function. - * - * int bpf_get_retval(void) - * Description - * Get the syscall's return value that will be returned to userspace. - * - * This helper is currently supported by cgroup programs only. - * Return - * The syscall's return value. - * - * int bpf_set_retval(int retval) - * Description - * Set the syscall's return value that will be returned to userspace. - * - * This helper is currently supported by cgroup programs only. - * Return - * 0 on success, or a negative error in case of failure. - * - * u64 bpf_xdp_get_buff_len(struct xdp_buff *xdp_md) - * Description - * Get the total size of a given xdp buff (linear and paged area) - * Return - * The total size of a given xdp buffer. - * - * long bpf_xdp_load_bytes(struct xdp_buff *xdp_md, u32 offset, void *buf, u32 len) - * Description - * This helper is provided as an easy way to load data from a - * xdp buffer. It can be used to load *len* bytes from *offset* from - * the frame associated to *xdp_md*, into the buffer pointed by - * *buf*. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_xdp_store_bytes(struct xdp_buff *xdp_md, u32 offset, void *buf, u32 len) - * Description - * Store *len* bytes from buffer *buf* into the frame - * associated to *xdp_md*, at *offset*. - * Return - * 0 on success, or a negative error in case of failure. - * - * long bpf_copy_from_user_task(void *dst, u32 size, const void *user_ptr, struct task_struct *tsk, u64 flags) - * Description - * Read *size* bytes from user space address *user_ptr* in *tsk*'s - * address space, and stores the data in *dst*. *flags* is not - * used yet and is provided for future extensibility. This helper - * can only be used by sleepable programs. - * Return - * 0 on success, or a negative error in case of failure. On error - * *dst* buffer is zeroed out. - * - * long bpf_skb_set_tstamp(struct sk_buff *skb, u64 tstamp, u32 tstamp_type) - * Description - * Change the __sk_buff->tstamp_type to *tstamp_type* - * and set *tstamp* to the __sk_buff->tstamp together. - * - * If there is no need to change the __sk_buff->tstamp_type, - * the tstamp value can be directly written to __sk_buff->tstamp - * instead. - * - * BPF_SKB_TSTAMP_DELIVERY_MONO is the only tstamp that - * will be kept during bpf_redirect_*(). A non zero - * *tstamp* must be used with the BPF_SKB_TSTAMP_DELIVERY_MONO - * *tstamp_type*. - * - * A BPF_SKB_TSTAMP_UNSPEC *tstamp_type* can only be used - * with a zero *tstamp*. - * - * Only IPv4 and IPv6 skb->protocol are supported. - * - * This function is most useful when it needs to set a - * mono delivery time to __sk_buff->tstamp and then - * bpf_redirect_*() to the egress of an iface. For example, - * changing the (rcv) timestamp in __sk_buff->tstamp at - * ingress to a mono delivery time and then bpf_redirect_*() - * to sch_fq@phy-dev. - * Return - * 0 on success. - * **-EINVAL** for invalid input - * **-EOPNOTSUPP** for unsupported protocol - * - * long bpf_ima_file_hash(struct file *file, void *dst, u32 size) - * Description - * Returns a calculated IMA hash of the *file*. - * If the hash is larger than *size*, then only *size* - * bytes will be copied to *dst* - * Return - * The **hash_algo** is returned on success, - * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if - * invalid arguments are passed. - * - * void *bpf_kptr_xchg(void *map_value, void *ptr) - * Description - * Exchange kptr at pointer *map_value* with *ptr*, and return the - * old value. *ptr* can be NULL, otherwise it must be a referenced - * pointer which will be released when this helper is called. - * Return - * The old value of kptr (which can be NULL). The returned pointer - * if not NULL, is a reference which must be released using its - * corresponding release function, or moved into a BPF map before - * program exit. - * - * void *bpf_map_lookup_percpu_elem(struct bpf_map *map, const void *key, u32 cpu) - * Description - * Perform a lookup in *percpu map* for an entry associated to - * *key* on *cpu*. - * Return - * Map value associated to *key* on *cpu*, or **NULL** if no entry - * was found or *cpu* is invalid. - * - * struct mptcp_sock *bpf_skc_to_mptcp_sock(void *sk) - * Description - * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. - * Return - * *sk* if casting is valid, or **NULL** otherwise. - * - * long bpf_dynptr_from_mem(void *data, u32 size, u64 flags, struct bpf_dynptr *ptr) - * Description - * Get a dynptr to local memory *data*. - * - * *data* must be a ptr to a map value. - * The maximum *size* supported is DYNPTR_MAX_SIZE. - * *flags* is currently unused. - * Return - * 0 on success, -E2BIG if the size exceeds DYNPTR_MAX_SIZE, - * -EINVAL if flags is not 0. - * - * long bpf_ringbuf_reserve_dynptr(void *ringbuf, u32 size, u64 flags, struct bpf_dynptr *ptr) - * Description - * Reserve *size* bytes of payload in a ring buffer *ringbuf* - * through the dynptr interface. *flags* must be 0. - * - * Please note that a corresponding bpf_ringbuf_submit_dynptr or - * bpf_ringbuf_discard_dynptr must be called on *ptr*, even if the - * reservation fails. This is enforced by the verifier. - * Return - * 0 on success, or a negative error in case of failure. - * - * void bpf_ringbuf_submit_dynptr(struct bpf_dynptr *ptr, u64 flags) - * Description - * Submit reserved ring buffer sample, pointed to by *data*, - * through the dynptr interface. This is a no-op if the dynptr is - * invalid/null. - * - * For more information on *flags*, please see - * 'bpf_ringbuf_submit'. - * Return - * Nothing. Always succeeds. - * - * void bpf_ringbuf_discard_dynptr(struct bpf_dynptr *ptr, u64 flags) - * Description - * Discard reserved ring buffer sample through the dynptr - * interface. This is a no-op if the dynptr is invalid/null. - * - * For more information on *flags*, please see - * 'bpf_ringbuf_discard'. - * Return - * Nothing. Always succeeds. - * - * long bpf_dynptr_read(void *dst, u32 len, struct bpf_dynptr *src, u32 offset) - * Description - * Read *len* bytes from *src* into *dst*, starting from *offset* - * into *src*. - * Return - * 0 on success, -E2BIG if *offset* + *len* exceeds the length - * of *src*'s data, -EINVAL if *src* is an invalid dynptr. - * - * long bpf_dynptr_write(struct bpf_dynptr *dst, u32 offset, void *src, u32 len) - * Description - * Write *len* bytes from *src* into *dst*, starting from *offset* - * into *dst*. - * Return - * 0 on success, -E2BIG if *offset* + *len* exceeds the length - * of *dst*'s data, -EINVAL if *dst* is an invalid dynptr or if *dst* - * is a read-only dynptr. - * - * void *bpf_dynptr_data(struct bpf_dynptr *ptr, u32 offset, u32 len) - * Description - * Get a pointer to the underlying dynptr data. - * - * *len* must be a statically known value. The returned data slice - * is invalidated whenever the dynptr is invalidated. - * Return - * Pointer to the underlying dynptr data, NULL if the dynptr is - * read-only, if the dynptr is invalid, or if the offset and length - * is out of bounds. - * - * s64 bpf_tcp_raw_gen_syncookie_ipv4(struct iphdr *iph, struct tcphdr *th, u32 th_len) - * Description - * Try to issue a SYN cookie for the packet with corresponding - * IPv4/TCP headers, *iph* and *th*, without depending on a - * listening socket. - * - * *iph* points to the IPv4 header. - * - * *th* points to the start of the TCP header, while *th_len* - * contains the length of the TCP header (at least - * **sizeof**\ (**struct tcphdr**)). - * Return - * On success, lower 32 bits hold the generated SYN cookie in - * followed by 16 bits which hold the MSS value for that cookie, - * and the top 16 bits are unused. - * - * On failure, the returned value is one of the following: - * - * **-EINVAL** if *th_len* is invalid. - * - * s64 bpf_tcp_raw_gen_syncookie_ipv6(struct ipv6hdr *iph, struct tcphdr *th, u32 th_len) - * Description - * Try to issue a SYN cookie for the packet with corresponding - * IPv6/TCP headers, *iph* and *th*, without depending on a - * listening socket. - * - * *iph* points to the IPv6 header. - * - * *th* points to the start of the TCP header, while *th_len* - * contains the length of the TCP header (at least - * **sizeof**\ (**struct tcphdr**)). - * Return - * On success, lower 32 bits hold the generated SYN cookie in - * followed by 16 bits which hold the MSS value for that cookie, - * and the top 16 bits are unused. - * - * On failure, the returned value is one of the following: - * - * **-EINVAL** if *th_len* is invalid. - * - * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. - * - * long bpf_tcp_raw_check_syncookie_ipv4(struct iphdr *iph, struct tcphdr *th) - * Description - * Check whether *iph* and *th* contain a valid SYN cookie ACK - * without depending on a listening socket. - * - * *iph* points to the IPv4 header. - * - * *th* points to the TCP header. - * Return - * 0 if *iph* and *th* are a valid SYN cookie ACK. - * - * On failure, the returned value is one of the following: - * - * **-EACCES** if the SYN cookie is not valid. - * - * long bpf_tcp_raw_check_syncookie_ipv6(struct ipv6hdr *iph, struct tcphdr *th) - * Description - * Check whether *iph* and *th* contain a valid SYN cookie ACK - * without depending on a listening socket. - * - * *iph* points to the IPv6 header. - * - * *th* points to the TCP header. - * Return - * 0 if *iph* and *th* are a valid SYN cookie ACK. - * - * On failure, the returned value is one of the following: - * - * **-EACCES** if the SYN cookie is not valid. - * - * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. - */ -#define __BPF_FUNC_MAPPER(FN) \ - FN(unspec), \ - FN(map_lookup_elem), \ - FN(map_update_elem), \ - FN(map_delete_elem), \ - FN(probe_read), \ - FN(ktime_get_ns), \ - FN(trace_printk), \ - FN(get_prandom_u32), \ - FN(get_smp_processor_id), \ - FN(skb_store_bytes), \ - FN(l3_csum_replace), \ - FN(l4_csum_replace), \ - FN(tail_call), \ - FN(clone_redirect), \ - FN(get_current_pid_tgid), \ - FN(get_current_uid_gid), \ - FN(get_current_comm), \ - FN(get_cgroup_classid), \ - FN(skb_vlan_push), \ - FN(skb_vlan_pop), \ - FN(skb_get_tunnel_key), \ - FN(skb_set_tunnel_key), \ - FN(perf_event_read), \ - FN(redirect), \ - FN(get_route_realm), \ - FN(perf_event_output), \ - FN(skb_load_bytes), \ - FN(get_stackid), \ - FN(csum_diff), \ - FN(skb_get_tunnel_opt), \ - FN(skb_set_tunnel_opt), \ - FN(skb_change_proto), \ - FN(skb_change_type), \ - FN(skb_under_cgroup), \ - FN(get_hash_recalc), \ - FN(get_current_task), \ - FN(probe_write_user), \ - FN(current_task_under_cgroup), \ - FN(skb_change_tail), \ - FN(skb_pull_data), \ - FN(csum_update), \ - FN(set_hash_invalid), \ - FN(get_numa_node_id), \ - FN(skb_change_head), \ - FN(xdp_adjust_head), \ - FN(probe_read_str), \ - FN(get_socket_cookie), \ - FN(get_socket_uid), \ - FN(set_hash), \ - FN(setsockopt), \ - FN(skb_adjust_room), \ - FN(redirect_map), \ - FN(sk_redirect_map), \ - FN(sock_map_update), \ - FN(xdp_adjust_meta), \ - FN(perf_event_read_value), \ - FN(perf_prog_read_value), \ - FN(getsockopt), \ - FN(override_return), \ - FN(sock_ops_cb_flags_set), \ - FN(msg_redirect_map), \ - FN(msg_apply_bytes), \ - FN(msg_cork_bytes), \ - FN(msg_pull_data), \ - FN(bind), \ - FN(xdp_adjust_tail), \ - FN(skb_get_xfrm_state), \ - FN(get_stack), \ - FN(skb_load_bytes_relative), \ - FN(fib_lookup), \ - FN(sock_hash_update), \ - FN(msg_redirect_hash), \ - FN(sk_redirect_hash), \ - FN(lwt_push_encap), \ - FN(lwt_seg6_store_bytes), \ - FN(lwt_seg6_adjust_srh), \ - FN(lwt_seg6_action), \ - FN(rc_repeat), \ - FN(rc_keydown), \ - FN(skb_cgroup_id), \ - FN(get_current_cgroup_id), \ - FN(get_local_storage), \ - FN(sk_select_reuseport), \ - FN(skb_ancestor_cgroup_id), \ - FN(sk_lookup_tcp), \ - FN(sk_lookup_udp), \ - FN(sk_release), \ - FN(map_push_elem), \ - FN(map_pop_elem), \ - FN(map_peek_elem), \ - FN(msg_push_data), \ - FN(msg_pop_data), \ - FN(rc_pointer_rel), \ - FN(spin_lock), \ - FN(spin_unlock), \ - FN(sk_fullsock), \ - FN(tcp_sock), \ - FN(skb_ecn_set_ce), \ - FN(get_listener_sock), \ - FN(skc_lookup_tcp), \ - FN(tcp_check_syncookie), \ - FN(sysctl_get_name), \ - FN(sysctl_get_current_value), \ - FN(sysctl_get_new_value), \ - FN(sysctl_set_new_value), \ - FN(strtol), \ - FN(strtoul), \ - FN(sk_storage_get), \ - FN(sk_storage_delete), \ - FN(send_signal), \ - FN(tcp_gen_syncookie), \ - FN(skb_output), \ - FN(probe_read_user), \ - FN(probe_read_kernel), \ - FN(probe_read_user_str), \ - FN(probe_read_kernel_str), \ - FN(tcp_send_ack), \ - FN(send_signal_thread), \ - FN(jiffies64), \ - FN(read_branch_records), \ - FN(get_ns_current_pid_tgid), \ - FN(xdp_output), \ - FN(get_netns_cookie), \ - FN(get_current_ancestor_cgroup_id), \ - FN(sk_assign), \ - FN(ktime_get_boot_ns), \ - FN(seq_printf), \ - FN(seq_write), \ - FN(sk_cgroup_id), \ - FN(sk_ancestor_cgroup_id), \ - FN(ringbuf_output), \ - FN(ringbuf_reserve), \ - FN(ringbuf_submit), \ - FN(ringbuf_discard), \ - FN(ringbuf_query), \ - FN(csum_level), \ - FN(skc_to_tcp6_sock), \ - FN(skc_to_tcp_sock), \ - FN(skc_to_tcp_timewait_sock), \ - FN(skc_to_tcp_request_sock), \ - FN(skc_to_udp6_sock), \ - FN(get_task_stack), \ - FN(load_hdr_opt), \ - FN(store_hdr_opt), \ - FN(reserve_hdr_opt), \ - FN(inode_storage_get), \ - FN(inode_storage_delete), \ - FN(d_path), \ - FN(copy_from_user), \ - FN(snprintf_btf), \ - FN(seq_printf_btf), \ - FN(skb_cgroup_classid), \ - FN(redirect_neigh), \ - FN(per_cpu_ptr), \ - FN(this_cpu_ptr), \ - FN(redirect_peer), \ - FN(task_storage_get), \ - FN(task_storage_delete), \ - FN(get_current_task_btf), \ - FN(bprm_opts_set), \ - FN(ktime_get_coarse_ns), \ - FN(ima_inode_hash), \ - FN(sock_from_file), \ - FN(check_mtu), \ - FN(for_each_map_elem), \ - FN(snprintf), \ - FN(sys_bpf), \ - FN(btf_find_by_name_kind), \ - FN(sys_close), \ - FN(timer_init), \ - FN(timer_set_callback), \ - FN(timer_start), \ - FN(timer_cancel), \ - FN(get_func_ip), \ - FN(get_attach_cookie), \ - FN(task_pt_regs), \ - FN(get_branch_snapshot), \ - FN(trace_vprintk), \ - FN(skc_to_unix_sock), \ - FN(kallsyms_lookup_name), \ - FN(find_vma), \ - FN(loop), \ - FN(strncmp), \ - FN(get_func_arg), \ - FN(get_func_ret), \ - FN(get_func_arg_cnt), \ - FN(get_retval), \ - FN(set_retval), \ - FN(xdp_get_buff_len), \ - FN(xdp_load_bytes), \ - FN(xdp_store_bytes), \ - FN(copy_from_user_task), \ - FN(skb_set_tstamp), \ - FN(ima_file_hash), \ - FN(kptr_xchg), \ - FN(map_lookup_percpu_elem), \ - FN(skc_to_mptcp_sock), \ - FN(dynptr_from_mem), \ - FN(ringbuf_reserve_dynptr), \ - FN(ringbuf_submit_dynptr), \ - FN(ringbuf_discard_dynptr), \ - FN(dynptr_read), \ - FN(dynptr_write), \ - FN(dynptr_data), \ - FN(tcp_raw_gen_syncookie_ipv4), \ - FN(tcp_raw_gen_syncookie_ipv6), \ - FN(tcp_raw_check_syncookie_ipv4), \ - FN(tcp_raw_check_syncookie_ipv6), \ - /* */ - -/* integer value in 'imm' field of BPF_CALL instruction selects which helper - * function eBPF program intends to call - */ -#define __BPF_ENUM_FN(x) BPF_FUNC_ ## x -enum bpf_func_id { - __BPF_FUNC_MAPPER(__BPF_ENUM_FN) - __BPF_FUNC_MAX_ID, -}; -#undef __BPF_ENUM_FN - -/* All flags used by eBPF helper functions, placed here. */ - -/* BPF_FUNC_skb_store_bytes flags. */ -enum { - BPF_F_RECOMPUTE_CSUM = (1ULL << 0), - BPF_F_INVALIDATE_HASH = (1ULL << 1), -}; - -/* BPF_FUNC_l3_csum_replace and BPF_FUNC_l4_csum_replace flags. - * First 4 bits are for passing the header field size. - */ -enum { - BPF_F_HDR_FIELD_MASK = 0xfULL, -}; - -/* BPF_FUNC_l4_csum_replace flags. */ -enum { - BPF_F_PSEUDO_HDR = (1ULL << 4), - BPF_F_MARK_MANGLED_0 = (1ULL << 5), - BPF_F_MARK_ENFORCE = (1ULL << 6), -}; - -/* BPF_FUNC_clone_redirect and BPF_FUNC_redirect flags. */ -enum { - BPF_F_INGRESS = (1ULL << 0), -}; - -/* BPF_FUNC_skb_set_tunnel_key and BPF_FUNC_skb_get_tunnel_key flags. */ -enum { - BPF_F_TUNINFO_IPV6 = (1ULL << 0), -}; - -/* flags for both BPF_FUNC_get_stackid and BPF_FUNC_get_stack. */ -enum { - BPF_F_SKIP_FIELD_MASK = 0xffULL, - BPF_F_USER_STACK = (1ULL << 8), -/* flags used by BPF_FUNC_get_stackid only. */ - BPF_F_FAST_STACK_CMP = (1ULL << 9), - BPF_F_REUSE_STACKID = (1ULL << 10), -/* flags used by BPF_FUNC_get_stack only. */ - BPF_F_USER_BUILD_ID = (1ULL << 11), -}; - -/* BPF_FUNC_skb_set_tunnel_key flags. */ -enum { - BPF_F_ZERO_CSUM_TX = (1ULL << 1), - BPF_F_DONT_FRAGMENT = (1ULL << 2), - BPF_F_SEQ_NUMBER = (1ULL << 3), -}; - -/* BPF_FUNC_perf_event_output, BPF_FUNC_perf_event_read and - * BPF_FUNC_perf_event_read_value flags. - */ -enum { - BPF_F_INDEX_MASK = 0xffffffffULL, - BPF_F_CURRENT_CPU = BPF_F_INDEX_MASK, -/* BPF_FUNC_perf_event_output for sk_buff input context. */ - BPF_F_CTXLEN_MASK = (0xfffffULL << 32), -}; - -/* Current network namespace */ -enum { - BPF_F_CURRENT_NETNS = (-1L), -}; - -/* BPF_FUNC_csum_level level values. */ -enum { - BPF_CSUM_LEVEL_QUERY, - BPF_CSUM_LEVEL_INC, - BPF_CSUM_LEVEL_DEC, - BPF_CSUM_LEVEL_RESET, -}; - -/* BPF_FUNC_skb_adjust_room flags. */ -enum { - BPF_F_ADJ_ROOM_FIXED_GSO = (1ULL << 0), - BPF_F_ADJ_ROOM_ENCAP_L3_IPV4 = (1ULL << 1), - BPF_F_ADJ_ROOM_ENCAP_L3_IPV6 = (1ULL << 2), - BPF_F_ADJ_ROOM_ENCAP_L4_GRE = (1ULL << 3), - BPF_F_ADJ_ROOM_ENCAP_L4_UDP = (1ULL << 4), - BPF_F_ADJ_ROOM_NO_CSUM_RESET = (1ULL << 5), - BPF_F_ADJ_ROOM_ENCAP_L2_ETH = (1ULL << 6), -}; - -enum { - BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff, - BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 56, -}; - -#define BPF_F_ADJ_ROOM_ENCAP_L2(len) (((__u64)len & \ - BPF_ADJ_ROOM_ENCAP_L2_MASK) \ - << BPF_ADJ_ROOM_ENCAP_L2_SHIFT) - -/* BPF_FUNC_sysctl_get_name flags. */ -enum { - BPF_F_SYSCTL_BASE_NAME = (1ULL << 0), -}; - -/* BPF_FUNC__storage_get flags */ -enum { - BPF_LOCAL_STORAGE_GET_F_CREATE = (1ULL << 0), - /* BPF_SK_STORAGE_GET_F_CREATE is only kept for backward compatibility - * and BPF_LOCAL_STORAGE_GET_F_CREATE must be used instead. - */ - BPF_SK_STORAGE_GET_F_CREATE = BPF_LOCAL_STORAGE_GET_F_CREATE, -}; - -/* BPF_FUNC_read_branch_records flags. */ -enum { - BPF_F_GET_BRANCH_RECORDS_SIZE = (1ULL << 0), -}; - -/* BPF_FUNC_bpf_ringbuf_commit, BPF_FUNC_bpf_ringbuf_discard, and - * BPF_FUNC_bpf_ringbuf_output flags. - */ -enum { - BPF_RB_NO_WAKEUP = (1ULL << 0), - BPF_RB_FORCE_WAKEUP = (1ULL << 1), -}; - -/* BPF_FUNC_bpf_ringbuf_query flags */ -enum { - BPF_RB_AVAIL_DATA = 0, - BPF_RB_RING_SIZE = 1, - BPF_RB_CONS_POS = 2, - BPF_RB_PROD_POS = 3, -}; - -/* BPF ring buffer constants */ -enum { - BPF_RINGBUF_BUSY_BIT = (1U << 31), - BPF_RINGBUF_DISCARD_BIT = (1U << 30), - BPF_RINGBUF_HDR_SZ = 8, -}; - -/* BPF_FUNC_sk_assign flags in bpf_sk_lookup context. */ -enum { - BPF_SK_LOOKUP_F_REPLACE = (1ULL << 0), - BPF_SK_LOOKUP_F_NO_REUSEPORT = (1ULL << 1), -}; - -/* Mode for BPF_FUNC_skb_adjust_room helper. */ -enum bpf_adj_room_mode { - BPF_ADJ_ROOM_NET, - BPF_ADJ_ROOM_MAC, -}; - -/* Mode for BPF_FUNC_skb_load_bytes_relative helper. */ -enum bpf_hdr_start_off { - BPF_HDR_START_MAC, - BPF_HDR_START_NET, -}; - -/* Encapsulation type for BPF_FUNC_lwt_push_encap helper. */ -enum bpf_lwt_encap_mode { - BPF_LWT_ENCAP_SEG6, - BPF_LWT_ENCAP_SEG6_INLINE, - BPF_LWT_ENCAP_IP, -}; - -/* Flags for bpf_bprm_opts_set helper */ -enum { - BPF_F_BPRM_SECUREEXEC = (1ULL << 0), -}; - -/* Flags for bpf_redirect_map helper */ -enum { - BPF_F_BROADCAST = (1ULL << 3), - BPF_F_EXCLUDE_INGRESS = (1ULL << 4), -}; - -#define __bpf_md_ptr(type, name) \ -union { \ - type name; \ - __u64 :64; \ -} __attribute__((aligned(8))) - -enum { - BPF_SKB_TSTAMP_UNSPEC, - BPF_SKB_TSTAMP_DELIVERY_MONO, /* tstamp has mono delivery time */ - /* For any BPF_SKB_TSTAMP_* that the bpf prog cannot handle, - * the bpf prog should handle it like BPF_SKB_TSTAMP_UNSPEC - * and try to deduce it by ingress, egress or skb->sk->sk_clockid. - */ -}; - -/* user accessible mirror of in-kernel sk_buff. - * new fields can only be added to the end of this structure - */ -struct __sk_buff { - __u32 len; - __u32 pkt_type; - __u32 mark; - __u32 queue_mapping; - __u32 protocol; - __u32 vlan_present; - __u32 vlan_tci; - __u32 vlan_proto; - __u32 priority; - __u32 ingress_ifindex; - __u32 ifindex; - __u32 tc_index; - __u32 cb[5]; - __u32 hash; - __u32 tc_classid; - __u32 data; - __u32 data_end; - __u32 napi_id; - - /* Accessed by BPF_PROG_TYPE_sk_skb types from here to ... */ - __u32 family; - __u32 remote_ip4; /* Stored in network byte order */ - __u32 local_ip4; /* Stored in network byte order */ - __u32 remote_ip6[4]; /* Stored in network byte order */ - __u32 local_ip6[4]; /* Stored in network byte order */ - __u32 remote_port; /* Stored in network byte order */ - __u32 local_port; /* stored in host byte order */ - /* ... here. */ - - __u32 data_meta; - __bpf_md_ptr(struct bpf_flow_keys *, flow_keys); - __u64 tstamp; - __u32 wire_len; - __u32 gso_segs; - __bpf_md_ptr(struct bpf_sock *, sk); - __u32 gso_size; - __u8 tstamp_type; - __u32 :24; /* Padding, future use. */ - __u64 hwtstamp; -}; - -struct bpf_tunnel_key { - __u32 tunnel_id; - union { - __u32 remote_ipv4; - __u32 remote_ipv6[4]; - }; - __u8 tunnel_tos; - __u8 tunnel_ttl; - __u16 tunnel_ext; /* Padding, future use. */ - __u32 tunnel_label; - union { - __u32 local_ipv4; - __u32 local_ipv6[4]; - }; -}; - -/* user accessible mirror of in-kernel xfrm_state. - * new fields can only be added to the end of this structure - */ -struct bpf_xfrm_state { - __u32 reqid; - __u32 spi; /* Stored in network byte order */ - __u16 family; - __u16 ext; /* Padding, future use. */ - union { - __u32 remote_ipv4; /* Stored in network byte order */ - __u32 remote_ipv6[4]; /* Stored in network byte order */ - }; -}; - -/* Generic BPF return codes which all BPF program types may support. - * The values are binary compatible with their TC_ACT_* counter-part to - * provide backwards compatibility with existing SCHED_CLS and SCHED_ACT - * programs. - * - * XDP is handled seprately, see XDP_*. - */ -enum bpf_ret_code { - BPF_OK = 0, - /* 1 reserved */ - BPF_DROP = 2, - /* 3-6 reserved */ - BPF_REDIRECT = 7, - /* >127 are reserved for prog type specific return codes. - * - * BPF_LWT_REROUTE: used by BPF_PROG_TYPE_LWT_IN and - * BPF_PROG_TYPE_LWT_XMIT to indicate that skb had been - * changed and should be routed based on its new L3 header. - * (This is an L3 redirect, as opposed to L2 redirect - * represented by BPF_REDIRECT above). - */ - BPF_LWT_REROUTE = 128, -}; - -struct bpf_sock { - __u32 bound_dev_if; - __u32 family; - __u32 type; - __u32 protocol; - __u32 mark; - __u32 priority; - /* IP address also allows 1 and 2 bytes access */ - __u32 src_ip4; - __u32 src_ip6[4]; - __u32 src_port; /* host byte order */ - __be16 dst_port; /* network byte order */ - __u16 :16; /* zero padding */ - __u32 dst_ip4; - __u32 dst_ip6[4]; - __u32 state; - __s32 rx_queue_mapping; -}; - -struct bpf_tcp_sock { - __u32 snd_cwnd; /* Sending congestion window */ - __u32 srtt_us; /* smoothed round trip time << 3 in usecs */ - __u32 rtt_min; - __u32 snd_ssthresh; /* Slow start size threshold */ - __u32 rcv_nxt; /* What we want to receive next */ - __u32 snd_nxt; /* Next sequence we send */ - __u32 snd_una; /* First byte we want an ack for */ - __u32 mss_cache; /* Cached effective mss, not including SACKS */ - __u32 ecn_flags; /* ECN status bits. */ - __u32 rate_delivered; /* saved rate sample: packets delivered */ - __u32 rate_interval_us; /* saved rate sample: time elapsed */ - __u32 packets_out; /* Packets which are "in flight" */ - __u32 retrans_out; /* Retransmitted packets out */ - __u32 total_retrans; /* Total retransmits for entire connection */ - __u32 segs_in; /* RFC4898 tcpEStatsPerfSegsIn - * total number of segments in. - */ - __u32 data_segs_in; /* RFC4898 tcpEStatsPerfDataSegsIn - * total number of data segments in. - */ - __u32 segs_out; /* RFC4898 tcpEStatsPerfSegsOut - * The total number of segments sent. - */ - __u32 data_segs_out; /* RFC4898 tcpEStatsPerfDataSegsOut - * total number of data segments sent. - */ - __u32 lost_out; /* Lost packets */ - __u32 sacked_out; /* SACK'd packets */ - __u64 bytes_received; /* RFC4898 tcpEStatsAppHCThruOctetsReceived - * sum(delta(rcv_nxt)), or how many bytes - * were acked. - */ - __u64 bytes_acked; /* RFC4898 tcpEStatsAppHCThruOctetsAcked - * sum(delta(snd_una)), or how many bytes - * were acked. - */ - __u32 dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups - * total number of DSACK blocks received - */ - __u32 delivered; /* Total data packets delivered incl. rexmits */ - __u32 delivered_ce; /* Like the above but only ECE marked packets */ - __u32 icsk_retransmits; /* Number of unrecovered [RTO] timeouts */ -}; - -struct bpf_sock_tuple { - union { - struct { - __be32 saddr; - __be32 daddr; - __be16 sport; - __be16 dport; - } ipv4; - struct { - __be32 saddr[4]; - __be32 daddr[4]; - __be16 sport; - __be16 dport; - } ipv6; - }; -}; - -struct bpf_xdp_sock { - __u32 queue_id; -}; - -#define XDP_PACKET_HEADROOM 256 - -/* User return codes for XDP prog type. - * A valid XDP program must return one of these defined values. All other - * return codes are reserved for future use. Unknown return codes will - * result in packet drops and a warning via bpf_warn_invalid_xdp_action(). - */ -enum xdp_action { - XDP_ABORTED = 0, - XDP_DROP, - XDP_PASS, - XDP_TX, - XDP_REDIRECT, -}; - -/* user accessible metadata for XDP packet hook - * new fields must be added to the end of this structure - */ -struct xdp_md { - __u32 data; - __u32 data_end; - __u32 data_meta; - /* Below access go through struct xdp_rxq_info */ - __u32 ingress_ifindex; /* rxq->dev->ifindex */ - __u32 rx_queue_index; /* rxq->queue_index */ - - __u32 egress_ifindex; /* txq->dev->ifindex */ -}; - -/* DEVMAP map-value layout - * - * The struct data-layout of map-value is a configuration interface. - * New members can only be added to the end of this structure. - */ -struct bpf_devmap_val { - __u32 ifindex; /* device index */ - union { - int fd; /* prog fd on map write */ - __u32 id; /* prog id on map read */ - } bpf_prog; -}; - -/* CPUMAP map-value layout - * - * The struct data-layout of map-value is a configuration interface. - * New members can only be added to the end of this structure. - */ -struct bpf_cpumap_val { - __u32 qsize; /* queue size to remote target CPU */ - union { - int fd; /* prog fd on map write */ - __u32 id; /* prog id on map read */ - } bpf_prog; -}; - -enum sk_action { - SK_DROP = 0, - SK_PASS, -}; - -/* user accessible metadata for SK_MSG packet hook, new fields must - * be added to the end of this structure - */ -struct sk_msg_md { - __bpf_md_ptr(void *, data); - __bpf_md_ptr(void *, data_end); - - __u32 family; - __u32 remote_ip4; /* Stored in network byte order */ - __u32 local_ip4; /* Stored in network byte order */ - __u32 remote_ip6[4]; /* Stored in network byte order */ - __u32 local_ip6[4]; /* Stored in network byte order */ - __u32 remote_port; /* Stored in network byte order */ - __u32 local_port; /* stored in host byte order */ - __u32 size; /* Total size of sk_msg */ - - __bpf_md_ptr(struct bpf_sock *, sk); /* current socket */ -}; - -struct sk_reuseport_md { - /* - * Start of directly accessible data. It begins from - * the tcp/udp header. - */ - __bpf_md_ptr(void *, data); - /* End of directly accessible data */ - __bpf_md_ptr(void *, data_end); - /* - * Total length of packet (starting from the tcp/udp header). - * Note that the directly accessible bytes (data_end - data) - * could be less than this "len". Those bytes could be - * indirectly read by a helper "bpf_skb_load_bytes()". - */ - __u32 len; - /* - * Eth protocol in the mac header (network byte order). e.g. - * ETH_P_IP(0x0800) and ETH_P_IPV6(0x86DD) - */ - __u32 eth_protocol; - __u32 ip_protocol; /* IP protocol. e.g. IPPROTO_TCP, IPPROTO_UDP */ - __u32 bind_inany; /* Is sock bound to an INANY address? */ - __u32 hash; /* A hash of the packet 4 tuples */ - /* When reuse->migrating_sk is NULL, it is selecting a sk for the - * new incoming connection request (e.g. selecting a listen sk for - * the received SYN in the TCP case). reuse->sk is one of the sk - * in the reuseport group. The bpf prog can use reuse->sk to learn - * the local listening ip/port without looking into the skb. - * - * When reuse->migrating_sk is not NULL, reuse->sk is closed and - * reuse->migrating_sk is the socket that needs to be migrated - * to another listening socket. migrating_sk could be a fullsock - * sk that is fully established or a reqsk that is in-the-middle - * of 3-way handshake. - */ - __bpf_md_ptr(struct bpf_sock *, sk); - __bpf_md_ptr(struct bpf_sock *, migrating_sk); -}; - -#define BPF_TAG_SIZE 8 - -struct bpf_prog_info { - __u32 type; - __u32 id; - __u8 tag[BPF_TAG_SIZE]; - __u32 jited_prog_len; - __u32 xlated_prog_len; - __aligned_u64 jited_prog_insns; - __aligned_u64 xlated_prog_insns; - __u64 load_time; /* ns since boottime */ - __u32 created_by_uid; - __u32 nr_map_ids; - __aligned_u64 map_ids; - char name[BPF_OBJ_NAME_LEN]; - __u32 ifindex; - __u32 gpl_compatible:1; - __u32 :31; /* alignment pad */ - __u64 netns_dev; - __u64 netns_ino; - __u32 nr_jited_ksyms; - __u32 nr_jited_func_lens; - __aligned_u64 jited_ksyms; - __aligned_u64 jited_func_lens; - __u32 btf_id; - __u32 func_info_rec_size; - __aligned_u64 func_info; - __u32 nr_func_info; - __u32 nr_line_info; - __aligned_u64 line_info; - __aligned_u64 jited_line_info; - __u32 nr_jited_line_info; - __u32 line_info_rec_size; - __u32 jited_line_info_rec_size; - __u32 nr_prog_tags; - __aligned_u64 prog_tags; - __u64 run_time_ns; - __u64 run_cnt; - __u64 recursion_misses; - __u32 verified_insns; - __u32 attach_btf_obj_id; - __u32 attach_btf_id; -} __attribute__((aligned(8))); - -struct bpf_map_info { - __u32 type; - __u32 id; - __u32 key_size; - __u32 value_size; - __u32 max_entries; - __u32 map_flags; - char name[BPF_OBJ_NAME_LEN]; - __u32 ifindex; - __u32 btf_vmlinux_value_type_id; - __u64 netns_dev; - __u64 netns_ino; - __u32 btf_id; - __u32 btf_key_type_id; - __u32 btf_value_type_id; - __u32 :32; /* alignment pad */ - __u64 map_extra; -} __attribute__((aligned(8))); - -struct bpf_btf_info { - __aligned_u64 btf; - __u32 btf_size; - __u32 id; - __aligned_u64 name; - __u32 name_len; - __u32 kernel_btf; -} __attribute__((aligned(8))); - -struct bpf_link_info { - __u32 type; - __u32 id; - __u32 prog_id; - union { - struct { - __aligned_u64 tp_name; /* in/out: tp_name buffer ptr */ - __u32 tp_name_len; /* in/out: tp_name buffer len */ - } raw_tracepoint; - struct { - __u32 attach_type; - __u32 target_obj_id; /* prog_id for PROG_EXT, otherwise btf object id */ - __u32 target_btf_id; /* BTF type id inside the object */ - } tracing; - struct { - __u64 cgroup_id; - __u32 attach_type; - } cgroup; - struct { - __aligned_u64 target_name; /* in/out: target_name buffer ptr */ - __u32 target_name_len; /* in/out: target_name buffer len */ - union { - struct { - __u32 map_id; - } map; - }; - } iter; - struct { - __u32 netns_ino; - __u32 attach_type; - } netns; - struct { - __u32 ifindex; - } xdp; - }; -} __attribute__((aligned(8))); - -/* User bpf_sock_addr struct to access socket fields and sockaddr struct passed - * by user and intended to be used by socket (e.g. to bind to, depends on - * attach type). - */ -struct bpf_sock_addr { - __u32 user_family; /* Allows 4-byte read, but no write. */ - __u32 user_ip4; /* Allows 1,2,4-byte read and 4-byte write. - * Stored in network byte order. - */ - __u32 user_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. - * Stored in network byte order. - */ - __u32 user_port; /* Allows 1,2,4-byte read and 4-byte write. - * Stored in network byte order - */ - __u32 family; /* Allows 4-byte read, but no write */ - __u32 type; /* Allows 4-byte read, but no write */ - __u32 protocol; /* Allows 4-byte read, but no write */ - __u32 msg_src_ip4; /* Allows 1,2,4-byte read and 4-byte write. - * Stored in network byte order. - */ - __u32 msg_src_ip6[4]; /* Allows 1,2,4,8-byte read and 4,8-byte write. - * Stored in network byte order. - */ - __bpf_md_ptr(struct bpf_sock *, sk); -}; - -/* User bpf_sock_ops struct to access socket values and specify request ops - * and their replies. - * Some of this fields are in network (bigendian) byte order and may need - * to be converted before use (bpf_ntohl() defined in samples/bpf/bpf_endian.h). - * New fields can only be added at the end of this structure - */ -struct bpf_sock_ops { - __u32 op; - union { - __u32 args[4]; /* Optionally passed to bpf program */ - __u32 reply; /* Returned by bpf program */ - __u32 replylong[4]; /* Optionally returned by bpf prog */ - }; - __u32 family; - __u32 remote_ip4; /* Stored in network byte order */ - __u32 local_ip4; /* Stored in network byte order */ - __u32 remote_ip6[4]; /* Stored in network byte order */ - __u32 local_ip6[4]; /* Stored in network byte order */ - __u32 remote_port; /* Stored in network byte order */ - __u32 local_port; /* stored in host byte order */ - __u32 is_fullsock; /* Some TCP fields are only valid if - * there is a full socket. If not, the - * fields read as zero. - */ - __u32 snd_cwnd; - __u32 srtt_us; /* Averaged RTT << 3 in usecs */ - __u32 bpf_sock_ops_cb_flags; /* flags defined in uapi/linux/tcp.h */ - __u32 state; - __u32 rtt_min; - __u32 snd_ssthresh; - __u32 rcv_nxt; - __u32 snd_nxt; - __u32 snd_una; - __u32 mss_cache; - __u32 ecn_flags; - __u32 rate_delivered; - __u32 rate_interval_us; - __u32 packets_out; - __u32 retrans_out; - __u32 total_retrans; - __u32 segs_in; - __u32 data_segs_in; - __u32 segs_out; - __u32 data_segs_out; - __u32 lost_out; - __u32 sacked_out; - __u32 sk_txhash; - __u64 bytes_received; - __u64 bytes_acked; - __bpf_md_ptr(struct bpf_sock *, sk); - /* [skb_data, skb_data_end) covers the whole TCP header. - * - * BPF_SOCK_OPS_PARSE_HDR_OPT_CB: The packet received - * BPF_SOCK_OPS_HDR_OPT_LEN_CB: Not useful because the - * header has not been written. - * BPF_SOCK_OPS_WRITE_HDR_OPT_CB: The header and options have - * been written so far. - * BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB: The SYNACK that concludes - * the 3WHS. - * BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB: The ACK that concludes - * the 3WHS. - * - * bpf_load_hdr_opt() can also be used to read a particular option. - */ - __bpf_md_ptr(void *, skb_data); - __bpf_md_ptr(void *, skb_data_end); - __u32 skb_len; /* The total length of a packet. - * It includes the header, options, - * and payload. - */ - __u32 skb_tcp_flags; /* tcp_flags of the header. It provides - * an easy way to check for tcp_flags - * without parsing skb_data. - * - * In particular, the skb_tcp_flags - * will still be available in - * BPF_SOCK_OPS_HDR_OPT_LEN even though - * the outgoing header has not - * been written yet. - */ -}; - -/* Definitions for bpf_sock_ops_cb_flags */ -enum { - BPF_SOCK_OPS_RTO_CB_FLAG = (1<<0), - BPF_SOCK_OPS_RETRANS_CB_FLAG = (1<<1), - BPF_SOCK_OPS_STATE_CB_FLAG = (1<<2), - BPF_SOCK_OPS_RTT_CB_FLAG = (1<<3), - /* Call bpf for all received TCP headers. The bpf prog will be - * called under sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB - * - * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB - * for the header option related helpers that will be useful - * to the bpf programs. - * - * It could be used at the client/active side (i.e. connect() side) - * when the server told it that the server was in syncookie - * mode and required the active side to resend the bpf-written - * options. The active side can keep writing the bpf-options until - * it received a valid packet from the server side to confirm - * the earlier packet (and options) has been received. The later - * example patch is using it like this at the active side when the - * server is in syncookie mode. - * - * The bpf prog will usually turn this off in the common cases. - */ - BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG = (1<<4), - /* Call bpf when kernel has received a header option that - * the kernel cannot handle. The bpf prog will be called under - * sock_ops->op == BPF_SOCK_OPS_PARSE_HDR_OPT_CB. - * - * Please refer to the comment in BPF_SOCK_OPS_PARSE_HDR_OPT_CB - * for the header option related helpers that will be useful - * to the bpf programs. - */ - BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG = (1<<5), - /* Call bpf when the kernel is writing header options for the - * outgoing packet. The bpf prog will first be called - * to reserve space in a skb under - * sock_ops->op == BPF_SOCK_OPS_HDR_OPT_LEN_CB. Then - * the bpf prog will be called to write the header option(s) - * under sock_ops->op == BPF_SOCK_OPS_WRITE_HDR_OPT_CB. - * - * Please refer to the comment in BPF_SOCK_OPS_HDR_OPT_LEN_CB - * and BPF_SOCK_OPS_WRITE_HDR_OPT_CB for the header option - * related helpers that will be useful to the bpf programs. - * - * The kernel gets its chance to reserve space and write - * options first before the BPF program does. - */ - BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG = (1<<6), -/* Mask of all currently supported cb flags */ - BPF_SOCK_OPS_ALL_CB_FLAGS = 0x7F, -}; - -/* List of known BPF sock_ops operators. - * New entries can only be added at the end - */ -enum { - BPF_SOCK_OPS_VOID, - BPF_SOCK_OPS_TIMEOUT_INIT, /* Should return SYN-RTO value to use or - * -1 if default value should be used - */ - BPF_SOCK_OPS_RWND_INIT, /* Should return initial advertized - * window (in packets) or -1 if default - * value should be used - */ - BPF_SOCK_OPS_TCP_CONNECT_CB, /* Calls BPF program right before an - * active connection is initialized - */ - BPF_SOCK_OPS_ACTIVE_ESTABLISHED_CB, /* Calls BPF program when an - * active connection is - * established - */ - BPF_SOCK_OPS_PASSIVE_ESTABLISHED_CB, /* Calls BPF program when a - * passive connection is - * established - */ - BPF_SOCK_OPS_NEEDS_ECN, /* If connection's congestion control - * needs ECN - */ - BPF_SOCK_OPS_BASE_RTT, /* Get base RTT. The correct value is - * based on the path and may be - * dependent on the congestion control - * algorithm. In general it indicates - * a congestion threshold. RTTs above - * this indicate congestion - */ - BPF_SOCK_OPS_RTO_CB, /* Called when an RTO has triggered. - * Arg1: value of icsk_retransmits - * Arg2: value of icsk_rto - * Arg3: whether RTO has expired - */ - BPF_SOCK_OPS_RETRANS_CB, /* Called when skb is retransmitted. - * Arg1: sequence number of 1st byte - * Arg2: # segments - * Arg3: return value of - * tcp_transmit_skb (0 => success) - */ - BPF_SOCK_OPS_STATE_CB, /* Called when TCP changes state. - * Arg1: old_state - * Arg2: new_state - */ - BPF_SOCK_OPS_TCP_LISTEN_CB, /* Called on listen(2), right after - * socket transition to LISTEN state. - */ - BPF_SOCK_OPS_RTT_CB, /* Called on every RTT. - */ - BPF_SOCK_OPS_PARSE_HDR_OPT_CB, /* Parse the header option. - * It will be called to handle - * the packets received at - * an already established - * connection. - * - * sock_ops->skb_data: - * Referring to the received skb. - * It covers the TCP header only. - * - * bpf_load_hdr_opt() can also - * be used to search for a - * particular option. - */ - BPF_SOCK_OPS_HDR_OPT_LEN_CB, /* Reserve space for writing the - * header option later in - * BPF_SOCK_OPS_WRITE_HDR_OPT_CB. - * Arg1: bool want_cookie. (in - * writing SYNACK only) - * - * sock_ops->skb_data: - * Not available because no header has - * been written yet. - * - * sock_ops->skb_tcp_flags: - * The tcp_flags of the - * outgoing skb. (e.g. SYN, ACK, FIN). - * - * bpf_reserve_hdr_opt() should - * be used to reserve space. - */ - BPF_SOCK_OPS_WRITE_HDR_OPT_CB, /* Write the header options - * Arg1: bool want_cookie. (in - * writing SYNACK only) - * - * sock_ops->skb_data: - * Referring to the outgoing skb. - * It covers the TCP header - * that has already been written - * by the kernel and the - * earlier bpf-progs. - * - * sock_ops->skb_tcp_flags: - * The tcp_flags of the outgoing - * skb. (e.g. SYN, ACK, FIN). - * - * bpf_store_hdr_opt() should - * be used to write the - * option. - * - * bpf_load_hdr_opt() can also - * be used to search for a - * particular option that - * has already been written - * by the kernel or the - * earlier bpf-progs. - */ -}; - -/* List of TCP states. There is a build check in net/ipv4/tcp.c to detect - * changes between the TCP and BPF versions. Ideally this should never happen. - * If it does, we need to add code to convert them before calling - * the BPF sock_ops function. - */ -enum { - BPF_TCP_ESTABLISHED = 1, - BPF_TCP_SYN_SENT, - BPF_TCP_SYN_RECV, - BPF_TCP_FIN_WAIT1, - BPF_TCP_FIN_WAIT2, - BPF_TCP_TIME_WAIT, - BPF_TCP_CLOSE, - BPF_TCP_CLOSE_WAIT, - BPF_TCP_LAST_ACK, - BPF_TCP_LISTEN, - BPF_TCP_CLOSING, /* Now a valid state */ - BPF_TCP_NEW_SYN_RECV, - - BPF_TCP_MAX_STATES /* Leave at the end! */ -}; - -enum { - TCP_BPF_IW = 1001, /* Set TCP initial congestion window */ - TCP_BPF_SNDCWND_CLAMP = 1002, /* Set sndcwnd_clamp */ - TCP_BPF_DELACK_MAX = 1003, /* Max delay ack in usecs */ - TCP_BPF_RTO_MIN = 1004, /* Min delay ack in usecs */ - /* Copy the SYN pkt to optval - * - * BPF_PROG_TYPE_SOCK_OPS only. It is similar to the - * bpf_getsockopt(TCP_SAVED_SYN) but it does not limit - * to only getting from the saved_syn. It can either get the - * syn packet from: - * - * 1. the just-received SYN packet (only available when writing the - * SYNACK). It will be useful when it is not necessary to - * save the SYN packet for latter use. It is also the only way - * to get the SYN during syncookie mode because the syn - * packet cannot be saved during syncookie. - * - * OR - * - * 2. the earlier saved syn which was done by - * bpf_setsockopt(TCP_SAVE_SYN). - * - * The bpf_getsockopt(TCP_BPF_SYN*) option will hide where the - * SYN packet is obtained. - * - * If the bpf-prog does not need the IP[46] header, the - * bpf-prog can avoid parsing the IP header by using - * TCP_BPF_SYN. Otherwise, the bpf-prog can get both - * IP[46] and TCP header by using TCP_BPF_SYN_IP. - * - * >0: Total number of bytes copied - * -ENOSPC: Not enough space in optval. Only optlen number of - * bytes is copied. - * -ENOENT: The SYN skb is not available now and the earlier SYN pkt - * is not saved by setsockopt(TCP_SAVE_SYN). - */ - TCP_BPF_SYN = 1005, /* Copy the TCP header */ - TCP_BPF_SYN_IP = 1006, /* Copy the IP[46] and TCP header */ - TCP_BPF_SYN_MAC = 1007, /* Copy the MAC, IP[46], and TCP header */ -}; - -enum { - BPF_LOAD_HDR_OPT_TCP_SYN = (1ULL << 0), -}; - -/* args[0] value during BPF_SOCK_OPS_HDR_OPT_LEN_CB and - * BPF_SOCK_OPS_WRITE_HDR_OPT_CB. - */ -enum { - BPF_WRITE_HDR_TCP_CURRENT_MSS = 1, /* Kernel is finding the - * total option spaces - * required for an established - * sk in order to calculate the - * MSS. No skb is actually - * sent. - */ - BPF_WRITE_HDR_TCP_SYNACK_COOKIE = 2, /* Kernel is in syncookie mode - * when sending a SYN. - */ -}; - -struct bpf_perf_event_value { - __u64 counter; - __u64 enabled; - __u64 running; -}; - -enum { - BPF_DEVCG_ACC_MKNOD = (1ULL << 0), - BPF_DEVCG_ACC_READ = (1ULL << 1), - BPF_DEVCG_ACC_WRITE = (1ULL << 2), -}; - -enum { - BPF_DEVCG_DEV_BLOCK = (1ULL << 0), - BPF_DEVCG_DEV_CHAR = (1ULL << 1), -}; - -struct bpf_cgroup_dev_ctx { - /* access_type encoded as (BPF_DEVCG_ACC_* << 16) | BPF_DEVCG_DEV_* */ - __u32 access_type; - __u32 major; - __u32 minor; -}; - -struct bpf_raw_tracepoint_args { - __u64 args[0]; -}; - -/* DIRECT: Skip the FIB rules and go to FIB table associated with device - * OUTPUT: Do lookup from egress perspective; default is ingress - */ -enum { - BPF_FIB_LOOKUP_DIRECT = (1U << 0), - BPF_FIB_LOOKUP_OUTPUT = (1U << 1), -}; - -enum { - BPF_FIB_LKUP_RET_SUCCESS, /* lookup successful */ - BPF_FIB_LKUP_RET_BLACKHOLE, /* dest is blackholed; can be dropped */ - BPF_FIB_LKUP_RET_UNREACHABLE, /* dest is unreachable; can be dropped */ - BPF_FIB_LKUP_RET_PROHIBIT, /* dest not allowed; can be dropped */ - BPF_FIB_LKUP_RET_NOT_FWDED, /* packet is not forwarded */ - BPF_FIB_LKUP_RET_FWD_DISABLED, /* fwding is not enabled on ingress */ - BPF_FIB_LKUP_RET_UNSUPP_LWT, /* fwd requires encapsulation */ - BPF_FIB_LKUP_RET_NO_NEIGH, /* no neighbor entry for nh */ - BPF_FIB_LKUP_RET_FRAG_NEEDED, /* fragmentation required to fwd */ -}; - -struct bpf_fib_lookup { - /* input: network family for lookup (AF_INET, AF_INET6) - * output: network family of egress nexthop - */ - __u8 family; - - /* set if lookup is to consider L4 data - e.g., FIB rules */ - __u8 l4_protocol; - __be16 sport; - __be16 dport; - - union { /* used for MTU check */ - /* input to lookup */ - __u16 tot_len; /* L3 length from network hdr (iph->tot_len) */ - - /* output: MTU value */ - __u16 mtu_result; - }; - /* input: L3 device index for lookup - * output: device index from FIB lookup - */ - __u32 ifindex; - - union { - /* inputs to lookup */ - __u8 tos; /* AF_INET */ - __be32 flowinfo; /* AF_INET6, flow_label + priority */ - - /* output: metric of fib result (IPv4/IPv6 only) */ - __u32 rt_metric; - }; - - union { - __be32 ipv4_src; - __u32 ipv6_src[4]; /* in6_addr; network order */ - }; - - /* input to bpf_fib_lookup, ipv{4,6}_dst is destination address in - * network header. output: bpf_fib_lookup sets to gateway address - * if FIB lookup returns gateway route - */ - union { - __be32 ipv4_dst; - __u32 ipv6_dst[4]; /* in6_addr; network order */ - }; - - /* output */ - __be16 h_vlan_proto; - __be16 h_vlan_TCI; - __u8 smac[6]; /* ETH_ALEN */ - __u8 dmac[6]; /* ETH_ALEN */ -}; - -struct bpf_redir_neigh { - /* network family for lookup (AF_INET, AF_INET6) */ - __u32 nh_family; - /* network address of nexthop; skips fib lookup to find gateway */ - union { - __be32 ipv4_nh; - __u32 ipv6_nh[4]; /* in6_addr; network order */ - }; -}; - -/* bpf_check_mtu flags*/ -enum bpf_check_mtu_flags { - BPF_MTU_CHK_SEGS = (1U << 0), -}; - -enum bpf_check_mtu_ret { - BPF_MTU_CHK_RET_SUCCESS, /* check and lookup successful */ - BPF_MTU_CHK_RET_FRAG_NEEDED, /* fragmentation required to fwd */ - BPF_MTU_CHK_RET_SEGS_TOOBIG, /* GSO re-segmentation needed to fwd */ -}; - -enum bpf_task_fd_type { - BPF_FD_TYPE_RAW_TRACEPOINT, /* tp name */ - BPF_FD_TYPE_TRACEPOINT, /* tp name */ - BPF_FD_TYPE_KPROBE, /* (symbol + offset) or addr */ - BPF_FD_TYPE_KRETPROBE, /* (symbol + offset) or addr */ - BPF_FD_TYPE_UPROBE, /* filename + offset */ - BPF_FD_TYPE_URETPROBE, /* filename + offset */ -}; - -enum { - BPF_FLOW_DISSECTOR_F_PARSE_1ST_FRAG = (1U << 0), - BPF_FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL = (1U << 1), - BPF_FLOW_DISSECTOR_F_STOP_AT_ENCAP = (1U << 2), -}; - -struct bpf_flow_keys { - __u16 nhoff; - __u16 thoff; - __u16 addr_proto; /* ETH_P_* of valid addrs */ - __u8 is_frag; - __u8 is_first_frag; - __u8 is_encap; - __u8 ip_proto; - __be16 n_proto; - __be16 sport; - __be16 dport; - union { - struct { - __be32 ipv4_src; - __be32 ipv4_dst; - }; - struct { - __u32 ipv6_src[4]; /* in6_addr; network order */ - __u32 ipv6_dst[4]; /* in6_addr; network order */ - }; - }; - __u32 flags; - __be32 flow_label; -}; - -struct bpf_func_info { - __u32 insn_off; - __u32 type_id; -}; - -#define BPF_LINE_INFO_LINE_NUM(line_col) ((line_col) >> 10) -#define BPF_LINE_INFO_LINE_COL(line_col) ((line_col) & 0x3ff) - -struct bpf_line_info { - __u32 insn_off; - __u32 file_name_off; - __u32 line_off; - __u32 line_col; -}; - -struct bpf_spin_lock { - __u32 val; -}; - -struct bpf_timer { - __u64 :64; - __u64 :64; -} __attribute__((aligned(8))); - -struct bpf_dynptr { - __u64 :64; - __u64 :64; -} __attribute__((aligned(8))); - -struct bpf_sysctl { - __u32 write; /* Sysctl is being read (= 0) or written (= 1). - * Allows 1,2,4-byte read, but no write. - */ - __u32 file_pos; /* Sysctl file position to read from, write to. - * Allows 1,2,4-byte read an 4-byte write. - */ -}; - -struct bpf_sockopt { - __bpf_md_ptr(struct bpf_sock *, sk); - __bpf_md_ptr(void *, optval); - __bpf_md_ptr(void *, optval_end); - - __s32 level; - __s32 optname; - __s32 optlen; - __s32 retval; -}; - -struct bpf_pidns_info { - __u32 pid; - __u32 tgid; -}; - -/* User accessible data for SK_LOOKUP programs. Add new fields at the end. */ -struct bpf_sk_lookup { - union { - __bpf_md_ptr(struct bpf_sock *, sk); /* Selected socket */ - __u64 cookie; /* Non-zero if socket was selected in PROG_TEST_RUN */ - }; - - __u32 family; /* Protocol family (AF_INET, AF_INET6) */ - __u32 protocol; /* IP protocol (IPPROTO_TCP, IPPROTO_UDP) */ - __u32 remote_ip4; /* Network byte order */ - __u32 remote_ip6[4]; /* Network byte order */ - __be16 remote_port; /* Network byte order */ - __u16 :16; /* Zero padding */ - __u32 local_ip4; /* Network byte order */ - __u32 local_ip6[4]; /* Network byte order */ - __u32 local_port; /* Host byte order */ - __u32 ingress_ifindex; /* The arriving interface. Determined by inet_iif. */ -}; - -/* - * struct btf_ptr is used for typed pointer representation; the - * type id is used to render the pointer data as the appropriate type - * via the bpf_snprintf_btf() helper described above. A flags field - - * potentially to specify additional details about the BTF pointer - * (rather than its mode of display) - is included for future use. - * Display flags - BTF_F_* - are passed to bpf_snprintf_btf separately. - */ -struct btf_ptr { - void *ptr; - __u32 type_id; - __u32 flags; /* BTF ptr flags; unused at present. */ -}; - -/* - * Flags to control bpf_snprintf_btf() behaviour. - * - BTF_F_COMPACT: no formatting around type information - * - BTF_F_NONAME: no struct/union member names/types - * - BTF_F_PTR_RAW: show raw (unobfuscated) pointer values; - * equivalent to %px. - * - BTF_F_ZERO: show zero-valued struct/union members; they - * are not displayed by default - */ -enum { - BTF_F_COMPACT = (1ULL << 0), - BTF_F_NONAME = (1ULL << 1), - BTF_F_PTR_RAW = (1ULL << 2), - BTF_F_ZERO = (1ULL << 3), -}; - -/* bpf_core_relo_kind encodes which aspect of captured field/type/enum value - * has to be adjusted by relocations. It is emitted by llvm and passed to - * libbpf and later to the kernel. - */ -enum bpf_core_relo_kind { - BPF_CORE_FIELD_BYTE_OFFSET = 0, /* field byte offset */ - BPF_CORE_FIELD_BYTE_SIZE = 1, /* field size in bytes */ - BPF_CORE_FIELD_EXISTS = 2, /* field existence in target kernel */ - BPF_CORE_FIELD_SIGNED = 3, /* field signedness (0 - unsigned, 1 - signed) */ - BPF_CORE_FIELD_LSHIFT_U64 = 4, /* bitfield-specific left bitshift */ - BPF_CORE_FIELD_RSHIFT_U64 = 5, /* bitfield-specific right bitshift */ - BPF_CORE_TYPE_ID_LOCAL = 6, /* type ID in local BPF object */ - BPF_CORE_TYPE_ID_TARGET = 7, /* type ID in target kernel */ - BPF_CORE_TYPE_EXISTS = 8, /* type existence in target kernel */ - BPF_CORE_TYPE_SIZE = 9, /* type size in bytes */ - BPF_CORE_ENUMVAL_EXISTS = 10, /* enum value existence in target kernel */ - BPF_CORE_ENUMVAL_VALUE = 11, /* enum value integer value */ -}; - -/* - * "struct bpf_core_relo" is used to pass relocation data form LLVM to libbpf - * and from libbpf to the kernel. - * - * CO-RE relocation captures the following data: - * - insn_off - instruction offset (in bytes) within a BPF program that needs - * its insn->imm field to be relocated with actual field info; - * - type_id - BTF type ID of the "root" (containing) entity of a relocatable - * type or field; - * - access_str_off - offset into corresponding .BTF string section. String - * interpretation depends on specific relocation kind: - * - for field-based relocations, string encodes an accessed field using - * a sequence of field and array indices, separated by colon (:). It's - * conceptually very close to LLVM's getelementptr ([0]) instruction's - * arguments for identifying offset to a field. - * - for type-based relocations, strings is expected to be just "0"; - * - for enum value-based relocations, string contains an index of enum - * value within its enum type; - * - kind - one of enum bpf_core_relo_kind; - * - * Example: - * struct sample { - * int a; - * struct { - * int b[10]; - * }; - * }; - * - * struct sample *s = ...; - * int *x = &s->a; // encoded as "0:0" (a is field #0) - * int *y = &s->b[5]; // encoded as "0:1:0:5" (anon struct is field #1, - * // b is field #0 inside anon struct, accessing elem #5) - * int *z = &s[10]->b; // encoded as "10:1" (ptr is used as an array) - * - * type_id for all relocs in this example will capture BTF type id of - * `struct sample`. - * - * Such relocation is emitted when using __builtin_preserve_access_index() - * Clang built-in, passing expression that captures field address, e.g.: - * - * bpf_probe_read(&dst, sizeof(dst), - * __builtin_preserve_access_index(&src->a.b.c)); - * - * In this case Clang will emit field relocation recording necessary data to - * be able to find offset of embedded `a.b.c` field within `src` struct. - * - * [0] https://llvm.org/docs/LangRef.html#getelementptr-instruction - */ -struct bpf_core_relo { - __u32 insn_off; - __u32 type_id; - __u32 access_str_off; - enum bpf_core_relo_kind kind; -}; - -#endif /* _UAPI__LINUX_BPF_H__ */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/bpf_common.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/bpf_common.h deleted file mode 100644 index 9276d33..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/bpf_common.h +++ /dev/null @@ -1,57 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _UAPI__LINUX_BPF_COMMON_H__ -#define _UAPI__LINUX_BPF_COMMON_H__ - -/* Instruction classes */ -#define BPF_CLASS(code) ((code) & 0x07) -#define BPF_LD 0x00 -#define BPF_LDX 0x01 -#define BPF_ST 0x02 -#define BPF_STX 0x03 -#define BPF_ALU 0x04 -#define BPF_JMP 0x05 -#define BPF_RET 0x06 -#define BPF_MISC 0x07 - -/* ld/ldx fields */ -#define BPF_SIZE(code) ((code) & 0x18) -#define BPF_W 0x00 /* 32-bit */ -#define BPF_H 0x08 /* 16-bit */ -#define BPF_B 0x10 /* 8-bit */ -/* eBPF BPF_DW 0x18 64-bit */ -#define BPF_MODE(code) ((code) & 0xe0) -#define BPF_IMM 0x00 -#define BPF_ABS 0x20 -#define BPF_IND 0x40 -#define BPF_MEM 0x60 -#define BPF_LEN 0x80 -#define BPF_MSH 0xa0 - -/* alu/jmp fields */ -#define BPF_OP(code) ((code) & 0xf0) -#define BPF_ADD 0x00 -#define BPF_SUB 0x10 -#define BPF_MUL 0x20 -#define BPF_DIV 0x30 -#define BPF_OR 0x40 -#define BPF_AND 0x50 -#define BPF_LSH 0x60 -#define BPF_RSH 0x70 -#define BPF_NEG 0x80 -#define BPF_MOD 0x90 -#define BPF_XOR 0xa0 - -#define BPF_JA 0x00 -#define BPF_JEQ 0x10 -#define BPF_JGT 0x20 -#define BPF_JGE 0x30 -#define BPF_JSET 0x40 -#define BPF_SRC(code) ((code) & 0x08) -#define BPF_K 0x00 -#define BPF_X 0x08 - -#ifndef BPF_MAXINSNS -#define BPF_MAXINSNS 4096 -#endif - -#endif /* _UAPI__LINUX_BPF_COMMON_H__ */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/btf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/btf.h deleted file mode 100644 index 1a66ecd..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/btf.h +++ /dev/null @@ -1,200 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -/* Copyright (c) 2018 Facebook */ -#ifndef _UAPI__LINUX_BTF_H__ -#define _UAPI__LINUX_BTF_H__ - -#include - -#define BTF_MAGIC 0xeB9F -#define BTF_VERSION 1 - -struct btf_header { - __u16 magic; - __u8 version; - __u8 flags; - __u32 hdr_len; - - /* All offsets are in bytes relative to the end of this header */ - __u32 type_off; /* offset of type section */ - __u32 type_len; /* length of type section */ - __u32 str_off; /* offset of string section */ - __u32 str_len; /* length of string section */ -}; - -/* Max # of type identifier */ -#define BTF_MAX_TYPE 0x000fffff -/* Max offset into the string section */ -#define BTF_MAX_NAME_OFFSET 0x00ffffff -/* Max # of struct/union/enum members or func args */ -#define BTF_MAX_VLEN 0xffff - -struct btf_type { - __u32 name_off; - /* "info" bits arrangement - * bits 0-15: vlen (e.g. # of struct's members) - * bits 16-23: unused - * bits 24-28: kind (e.g. int, ptr, array...etc) - * bits 29-30: unused - * bit 31: kind_flag, currently used by - * struct, union, enum, fwd and enum64 - */ - __u32 info; - /* "size" is used by INT, ENUM, STRUCT, UNION, DATASEC and ENUM64. - * "size" tells the size of the type it is describing. - * - * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT, - * FUNC, FUNC_PROTO, VAR, DECL_TAG and TYPE_TAG. - * "type" is a type_id referring to another type. - */ - union { - __u32 size; - __u32 type; - }; -}; - -#define BTF_INFO_KIND(info) (((info) >> 24) & 0x1f) -#define BTF_INFO_VLEN(info) ((info) & 0xffff) -#define BTF_INFO_KFLAG(info) ((info) >> 31) - -enum { - BTF_KIND_UNKN = 0, /* Unknown */ - BTF_KIND_INT = 1, /* Integer */ - BTF_KIND_PTR = 2, /* Pointer */ - BTF_KIND_ARRAY = 3, /* Array */ - BTF_KIND_STRUCT = 4, /* Struct */ - BTF_KIND_UNION = 5, /* Union */ - BTF_KIND_ENUM = 6, /* Enumeration up to 32-bit values */ - BTF_KIND_FWD = 7, /* Forward */ - BTF_KIND_TYPEDEF = 8, /* Typedef */ - BTF_KIND_VOLATILE = 9, /* Volatile */ - BTF_KIND_CONST = 10, /* Const */ - BTF_KIND_RESTRICT = 11, /* Restrict */ - BTF_KIND_FUNC = 12, /* Function */ - BTF_KIND_FUNC_PROTO = 13, /* Function Proto */ - BTF_KIND_VAR = 14, /* Variable */ - BTF_KIND_DATASEC = 15, /* Section */ - BTF_KIND_FLOAT = 16, /* Floating point */ - BTF_KIND_DECL_TAG = 17, /* Decl Tag */ - BTF_KIND_TYPE_TAG = 18, /* Type Tag */ - BTF_KIND_ENUM64 = 19, /* Enumeration up to 64-bit values */ - - NR_BTF_KINDS, - BTF_KIND_MAX = NR_BTF_KINDS - 1, -}; - -/* For some specific BTF_KIND, "struct btf_type" is immediately - * followed by extra data. - */ - -/* BTF_KIND_INT is followed by a u32 and the following - * is the 32 bits arrangement: - */ -#define BTF_INT_ENCODING(VAL) (((VAL) & 0x0f000000) >> 24) -#define BTF_INT_OFFSET(VAL) (((VAL) & 0x00ff0000) >> 16) -#define BTF_INT_BITS(VAL) ((VAL) & 0x000000ff) - -/* Attributes stored in the BTF_INT_ENCODING */ -#define BTF_INT_SIGNED (1 << 0) -#define BTF_INT_CHAR (1 << 1) -#define BTF_INT_BOOL (1 << 2) - -/* BTF_KIND_ENUM is followed by multiple "struct btf_enum". - * The exact number of btf_enum is stored in the vlen (of the - * info in "struct btf_type"). - */ -struct btf_enum { - __u32 name_off; - __s32 val; -}; - -/* BTF_KIND_ARRAY is followed by one "struct btf_array" */ -struct btf_array { - __u32 type; - __u32 index_type; - __u32 nelems; -}; - -/* BTF_KIND_STRUCT and BTF_KIND_UNION are followed - * by multiple "struct btf_member". The exact number - * of btf_member is stored in the vlen (of the info in - * "struct btf_type"). - */ -struct btf_member { - __u32 name_off; - __u32 type; - /* If the type info kind_flag is set, the btf_member offset - * contains both member bitfield size and bit offset. The - * bitfield size is set for bitfield members. If the type - * info kind_flag is not set, the offset contains only bit - * offset. - */ - __u32 offset; -}; - -/* If the struct/union type info kind_flag is set, the - * following two macros are used to access bitfield_size - * and bit_offset from btf_member.offset. - */ -#define BTF_MEMBER_BITFIELD_SIZE(val) ((val) >> 24) -#define BTF_MEMBER_BIT_OFFSET(val) ((val) & 0xffffff) - -/* BTF_KIND_FUNC_PROTO is followed by multiple "struct btf_param". - * The exact number of btf_param is stored in the vlen (of the - * info in "struct btf_type"). - */ -struct btf_param { - __u32 name_off; - __u32 type; -}; - -enum { - BTF_VAR_STATIC = 0, - BTF_VAR_GLOBAL_ALLOCATED = 1, - BTF_VAR_GLOBAL_EXTERN = 2, -}; - -enum btf_func_linkage { - BTF_FUNC_STATIC = 0, - BTF_FUNC_GLOBAL = 1, - BTF_FUNC_EXTERN = 2, -}; - -/* BTF_KIND_VAR is followed by a single "struct btf_var" to describe - * additional information related to the variable such as its linkage. - */ -struct btf_var { - __u32 linkage; -}; - -/* BTF_KIND_DATASEC is followed by multiple "struct btf_var_secinfo" - * to describe all BTF_KIND_VAR types it contains along with it's - * in-section offset as well as size. - */ -struct btf_var_secinfo { - __u32 type; - __u32 offset; - __u32 size; -}; - -/* BTF_KIND_DECL_TAG is followed by a single "struct btf_decl_tag" to describe - * additional information related to the tag applied location. - * If component_idx == -1, the tag is applied to a struct, union, - * variable or function. Otherwise, it is applied to a struct/union - * member or a func argument, and component_idx indicates which member - * or argument (0 ... vlen-1). - */ -struct btf_decl_tag { - __s32 component_idx; -}; - -/* BTF_KIND_ENUM64 is followed by multiple "struct btf_enum64". - * The exact number of btf_enum64 is stored in the vlen (of the - * info in "struct btf_type"). - */ -struct btf_enum64 { - __u32 name_off; - __u32 val_lo32; - __u32 val_hi32; -}; - -#endif /* _UAPI__LINUX_BTF_H__ */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/if_link.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/if_link.h deleted file mode 100644 index 3dc81f3..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/if_link.h +++ /dev/null @@ -1,1281 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _UAPI_LINUX_IF_LINK_H -#define _UAPI_LINUX_IF_LINK_H - -#include -#include - -/* This struct should be in sync with struct rtnl_link_stats64 */ -struct rtnl_link_stats { - __u32 rx_packets; - __u32 tx_packets; - __u32 rx_bytes; - __u32 tx_bytes; - __u32 rx_errors; - __u32 tx_errors; - __u32 rx_dropped; - __u32 tx_dropped; - __u32 multicast; - __u32 collisions; - /* detailed rx_errors: */ - __u32 rx_length_errors; - __u32 rx_over_errors; - __u32 rx_crc_errors; - __u32 rx_frame_errors; - __u32 rx_fifo_errors; - __u32 rx_missed_errors; - - /* detailed tx_errors */ - __u32 tx_aborted_errors; - __u32 tx_carrier_errors; - __u32 tx_fifo_errors; - __u32 tx_heartbeat_errors; - __u32 tx_window_errors; - - /* for cslip etc */ - __u32 rx_compressed; - __u32 tx_compressed; - - __u32 rx_nohandler; -}; - -/** - * struct rtnl_link_stats64 - The main device statistics structure. - * - * @rx_packets: Number of good packets received by the interface. - * For hardware interfaces counts all good packets received from the device - * by the host, including packets which host had to drop at various stages - * of processing (even in the driver). - * - * @tx_packets: Number of packets successfully transmitted. - * For hardware interfaces counts packets which host was able to successfully - * hand over to the device, which does not necessarily mean that packets - * had been successfully transmitted out of the device, only that device - * acknowledged it copied them out of host memory. - * - * @rx_bytes: Number of good received bytes, corresponding to @rx_packets. - * - * For IEEE 802.3 devices should count the length of Ethernet Frames - * excluding the FCS. - * - * @tx_bytes: Number of good transmitted bytes, corresponding to @tx_packets. - * - * For IEEE 802.3 devices should count the length of Ethernet Frames - * excluding the FCS. - * - * @rx_errors: Total number of bad packets received on this network device. - * This counter must include events counted by @rx_length_errors, - * @rx_crc_errors, @rx_frame_errors and other errors not otherwise - * counted. - * - * @tx_errors: Total number of transmit problems. - * This counter must include events counter by @tx_aborted_errors, - * @tx_carrier_errors, @tx_fifo_errors, @tx_heartbeat_errors, - * @tx_window_errors and other errors not otherwise counted. - * - * @rx_dropped: Number of packets received but not processed, - * e.g. due to lack of resources or unsupported protocol. - * For hardware interfaces this counter may include packets discarded - * due to L2 address filtering but should not include packets dropped - * by the device due to buffer exhaustion which are counted separately in - * @rx_missed_errors (since procfs folds those two counters together). - * - * @tx_dropped: Number of packets dropped on their way to transmission, - * e.g. due to lack of resources. - * - * @multicast: Multicast packets received. - * For hardware interfaces this statistic is commonly calculated - * at the device level (unlike @rx_packets) and therefore may include - * packets which did not reach the host. - * - * For IEEE 802.3 devices this counter may be equivalent to: - * - * - 30.3.1.1.21 aMulticastFramesReceivedOK - * - * @collisions: Number of collisions during packet transmissions. - * - * @rx_length_errors: Number of packets dropped due to invalid length. - * Part of aggregate "frame" errors in `/proc/net/dev`. - * - * For IEEE 802.3 devices this counter should be equivalent to a sum - * of the following attributes: - * - * - 30.3.1.1.23 aInRangeLengthErrors - * - 30.3.1.1.24 aOutOfRangeLengthField - * - 30.3.1.1.25 aFrameTooLongErrors - * - * @rx_over_errors: Receiver FIFO overflow event counter. - * - * Historically the count of overflow events. Such events may be - * reported in the receive descriptors or via interrupts, and may - * not correspond one-to-one with dropped packets. - * - * The recommended interpretation for high speed interfaces is - - * number of packets dropped because they did not fit into buffers - * provided by the host, e.g. packets larger than MTU or next buffer - * in the ring was not available for a scatter transfer. - * - * Part of aggregate "frame" errors in `/proc/net/dev`. - * - * This statistics was historically used interchangeably with - * @rx_fifo_errors. - * - * This statistic corresponds to hardware events and is not commonly used - * on software devices. - * - * @rx_crc_errors: Number of packets received with a CRC error. - * Part of aggregate "frame" errors in `/proc/net/dev`. - * - * For IEEE 802.3 devices this counter must be equivalent to: - * - * - 30.3.1.1.6 aFrameCheckSequenceErrors - * - * @rx_frame_errors: Receiver frame alignment errors. - * Part of aggregate "frame" errors in `/proc/net/dev`. - * - * For IEEE 802.3 devices this counter should be equivalent to: - * - * - 30.3.1.1.7 aAlignmentErrors - * - * @rx_fifo_errors: Receiver FIFO error counter. - * - * Historically the count of overflow events. Those events may be - * reported in the receive descriptors or via interrupts, and may - * not correspond one-to-one with dropped packets. - * - * This statistics was used interchangeably with @rx_over_errors. - * Not recommended for use in drivers for high speed interfaces. - * - * This statistic is used on software devices, e.g. to count software - * packet queue overflow (can) or sequencing errors (GRE). - * - * @rx_missed_errors: Count of packets missed by the host. - * Folded into the "drop" counter in `/proc/net/dev`. - * - * Counts number of packets dropped by the device due to lack - * of buffer space. This usually indicates that the host interface - * is slower than the network interface, or host is not keeping up - * with the receive packet rate. - * - * This statistic corresponds to hardware events and is not used - * on software devices. - * - * @tx_aborted_errors: - * Part of aggregate "carrier" errors in `/proc/net/dev`. - * For IEEE 802.3 devices capable of half-duplex operation this counter - * must be equivalent to: - * - * - 30.3.1.1.11 aFramesAbortedDueToXSColls - * - * High speed interfaces may use this counter as a general device - * discard counter. - * - * @tx_carrier_errors: Number of frame transmission errors due to loss - * of carrier during transmission. - * Part of aggregate "carrier" errors in `/proc/net/dev`. - * - * For IEEE 802.3 devices this counter must be equivalent to: - * - * - 30.3.1.1.13 aCarrierSenseErrors - * - * @tx_fifo_errors: Number of frame transmission errors due to device - * FIFO underrun / underflow. This condition occurs when the device - * begins transmission of a frame but is unable to deliver the - * entire frame to the transmitter in time for transmission. - * Part of aggregate "carrier" errors in `/proc/net/dev`. - * - * @tx_heartbeat_errors: Number of Heartbeat / SQE Test errors for - * old half-duplex Ethernet. - * Part of aggregate "carrier" errors in `/proc/net/dev`. - * - * For IEEE 802.3 devices possibly equivalent to: - * - * - 30.3.2.1.4 aSQETestErrors - * - * @tx_window_errors: Number of frame transmission errors due - * to late collisions (for Ethernet - after the first 64B of transmission). - * Part of aggregate "carrier" errors in `/proc/net/dev`. - * - * For IEEE 802.3 devices this counter must be equivalent to: - * - * - 30.3.1.1.10 aLateCollisions - * - * @rx_compressed: Number of correctly received compressed packets. - * This counters is only meaningful for interfaces which support - * packet compression (e.g. CSLIP, PPP). - * - * @tx_compressed: Number of transmitted compressed packets. - * This counters is only meaningful for interfaces which support - * packet compression (e.g. CSLIP, PPP). - * - * @rx_nohandler: Number of packets received on the interface - * but dropped by the networking stack because the device is - * not designated to receive packets (e.g. backup link in a bond). - */ -struct rtnl_link_stats64 { - __u64 rx_packets; - __u64 tx_packets; - __u64 rx_bytes; - __u64 tx_bytes; - __u64 rx_errors; - __u64 tx_errors; - __u64 rx_dropped; - __u64 tx_dropped; - __u64 multicast; - __u64 collisions; - - /* detailed rx_errors: */ - __u64 rx_length_errors; - __u64 rx_over_errors; - __u64 rx_crc_errors; - __u64 rx_frame_errors; - __u64 rx_fifo_errors; - __u64 rx_missed_errors; - - /* detailed tx_errors */ - __u64 tx_aborted_errors; - __u64 tx_carrier_errors; - __u64 tx_fifo_errors; - __u64 tx_heartbeat_errors; - __u64 tx_window_errors; - - /* for cslip etc */ - __u64 rx_compressed; - __u64 tx_compressed; - __u64 rx_nohandler; -}; - -/* The struct should be in sync with struct ifmap */ -struct rtnl_link_ifmap { - __u64 mem_start; - __u64 mem_end; - __u64 base_addr; - __u16 irq; - __u8 dma; - __u8 port; -}; - -/* - * IFLA_AF_SPEC - * Contains nested attributes for address family specific attributes. - * Each address family may create a attribute with the address family - * number as type and create its own attribute structure in it. - * - * Example: - * [IFLA_AF_SPEC] = { - * [AF_INET] = { - * [IFLA_INET_CONF] = ..., - * }, - * [AF_INET6] = { - * [IFLA_INET6_FLAGS] = ..., - * [IFLA_INET6_CONF] = ..., - * } - * } - */ - -enum { - IFLA_UNSPEC, - IFLA_ADDRESS, - IFLA_BROADCAST, - IFLA_IFNAME, - IFLA_MTU, - IFLA_LINK, - IFLA_QDISC, - IFLA_STATS, - IFLA_COST, -#define IFLA_COST IFLA_COST - IFLA_PRIORITY, -#define IFLA_PRIORITY IFLA_PRIORITY - IFLA_MASTER, -#define IFLA_MASTER IFLA_MASTER - IFLA_WIRELESS, /* Wireless Extension event - see wireless.h */ -#define IFLA_WIRELESS IFLA_WIRELESS - IFLA_PROTINFO, /* Protocol specific information for a link */ -#define IFLA_PROTINFO IFLA_PROTINFO - IFLA_TXQLEN, -#define IFLA_TXQLEN IFLA_TXQLEN - IFLA_MAP, -#define IFLA_MAP IFLA_MAP - IFLA_WEIGHT, -#define IFLA_WEIGHT IFLA_WEIGHT - IFLA_OPERSTATE, - IFLA_LINKMODE, - IFLA_LINKINFO, -#define IFLA_LINKINFO IFLA_LINKINFO - IFLA_NET_NS_PID, - IFLA_IFALIAS, - IFLA_NUM_VF, /* Number of VFs if device is SR-IOV PF */ - IFLA_VFINFO_LIST, - IFLA_STATS64, - IFLA_VF_PORTS, - IFLA_PORT_SELF, - IFLA_AF_SPEC, - IFLA_GROUP, /* Group the device belongs to */ - IFLA_NET_NS_FD, - IFLA_EXT_MASK, /* Extended info mask, VFs, etc */ - IFLA_PROMISCUITY, /* Promiscuity count: > 0 means acts PROMISC */ -#define IFLA_PROMISCUITY IFLA_PROMISCUITY - IFLA_NUM_TX_QUEUES, - IFLA_NUM_RX_QUEUES, - IFLA_CARRIER, - IFLA_PHYS_PORT_ID, - IFLA_CARRIER_CHANGES, - IFLA_PHYS_SWITCH_ID, - IFLA_LINK_NETNSID, - IFLA_PHYS_PORT_NAME, - IFLA_PROTO_DOWN, - IFLA_GSO_MAX_SEGS, - IFLA_GSO_MAX_SIZE, - IFLA_PAD, - IFLA_XDP, - IFLA_EVENT, - IFLA_NEW_NETNSID, - IFLA_IF_NETNSID, - IFLA_TARGET_NETNSID = IFLA_IF_NETNSID, /* new alias */ - IFLA_CARRIER_UP_COUNT, - IFLA_CARRIER_DOWN_COUNT, - IFLA_NEW_IFINDEX, - IFLA_MIN_MTU, - IFLA_MAX_MTU, - IFLA_PROP_LIST, - IFLA_ALT_IFNAME, /* Alternative ifname */ - IFLA_PERM_ADDRESS, - IFLA_PROTO_DOWN_REASON, - - /* device (sysfs) name as parent, used instead - * of IFLA_LINK where there's no parent netdev - */ - IFLA_PARENT_DEV_NAME, - IFLA_PARENT_DEV_BUS_NAME, - IFLA_GRO_MAX_SIZE, - IFLA_TSO_MAX_SIZE, - IFLA_TSO_MAX_SEGS, - - __IFLA_MAX -}; - - -#define IFLA_MAX (__IFLA_MAX - 1) - -enum { - IFLA_PROTO_DOWN_REASON_UNSPEC, - IFLA_PROTO_DOWN_REASON_MASK, /* u32, mask for reason bits */ - IFLA_PROTO_DOWN_REASON_VALUE, /* u32, reason bit value */ - - __IFLA_PROTO_DOWN_REASON_CNT, - IFLA_PROTO_DOWN_REASON_MAX = __IFLA_PROTO_DOWN_REASON_CNT - 1 -}; - -/* backwards compatibility for userspace */ -#ifndef __KERNEL__ -#define IFLA_RTA(r) ((struct rtattr*)(((char*)(r)) + NLMSG_ALIGN(sizeof(struct ifinfomsg)))) -#define IFLA_PAYLOAD(n) NLMSG_PAYLOAD(n,sizeof(struct ifinfomsg)) -#endif - -enum { - IFLA_INET_UNSPEC, - IFLA_INET_CONF, - __IFLA_INET_MAX, -}; - -#define IFLA_INET_MAX (__IFLA_INET_MAX - 1) - -/* ifi_flags. - - IFF_* flags. - - The only change is: - IFF_LOOPBACK, IFF_BROADCAST and IFF_POINTOPOINT are - more not changeable by user. They describe link media - characteristics and set by device driver. - - Comments: - - Combination IFF_BROADCAST|IFF_POINTOPOINT is invalid - - If neither of these three flags are set; - the interface is NBMA. - - - IFF_MULTICAST does not mean anything special: - multicasts can be used on all not-NBMA links. - IFF_MULTICAST means that this media uses special encapsulation - for multicast frames. Apparently, all IFF_POINTOPOINT and - IFF_BROADCAST devices are able to use multicasts too. - */ - -/* IFLA_LINK. - For usual devices it is equal ifi_index. - If it is a "virtual interface" (f.e. tunnel), ifi_link - can point to real physical interface (f.e. for bandwidth calculations), - or maybe 0, what means, that real media is unknown (usual - for IPIP tunnels, when route to endpoint is allowed to change) - */ - -/* Subtype attributes for IFLA_PROTINFO */ -enum { - IFLA_INET6_UNSPEC, - IFLA_INET6_FLAGS, /* link flags */ - IFLA_INET6_CONF, /* sysctl parameters */ - IFLA_INET6_STATS, /* statistics */ - IFLA_INET6_MCAST, /* MC things. What of them? */ - IFLA_INET6_CACHEINFO, /* time values and max reasm size */ - IFLA_INET6_ICMP6STATS, /* statistics (icmpv6) */ - IFLA_INET6_TOKEN, /* device token */ - IFLA_INET6_ADDR_GEN_MODE, /* implicit address generator mode */ - IFLA_INET6_RA_MTU, /* mtu carried in the RA message */ - __IFLA_INET6_MAX -}; - -#define IFLA_INET6_MAX (__IFLA_INET6_MAX - 1) - -enum in6_addr_gen_mode { - IN6_ADDR_GEN_MODE_EUI64, - IN6_ADDR_GEN_MODE_NONE, - IN6_ADDR_GEN_MODE_STABLE_PRIVACY, - IN6_ADDR_GEN_MODE_RANDOM, -}; - -/* Bridge section */ - -enum { - IFLA_BR_UNSPEC, - IFLA_BR_FORWARD_DELAY, - IFLA_BR_HELLO_TIME, - IFLA_BR_MAX_AGE, - IFLA_BR_AGEING_TIME, - IFLA_BR_STP_STATE, - IFLA_BR_PRIORITY, - IFLA_BR_VLAN_FILTERING, - IFLA_BR_VLAN_PROTOCOL, - IFLA_BR_GROUP_FWD_MASK, - IFLA_BR_ROOT_ID, - IFLA_BR_BRIDGE_ID, - IFLA_BR_ROOT_PORT, - IFLA_BR_ROOT_PATH_COST, - IFLA_BR_TOPOLOGY_CHANGE, - IFLA_BR_TOPOLOGY_CHANGE_DETECTED, - IFLA_BR_HELLO_TIMER, - IFLA_BR_TCN_TIMER, - IFLA_BR_TOPOLOGY_CHANGE_TIMER, - IFLA_BR_GC_TIMER, - IFLA_BR_GROUP_ADDR, - IFLA_BR_FDB_FLUSH, - IFLA_BR_MCAST_ROUTER, - IFLA_BR_MCAST_SNOOPING, - IFLA_BR_MCAST_QUERY_USE_IFADDR, - IFLA_BR_MCAST_QUERIER, - IFLA_BR_MCAST_HASH_ELASTICITY, - IFLA_BR_MCAST_HASH_MAX, - IFLA_BR_MCAST_LAST_MEMBER_CNT, - IFLA_BR_MCAST_STARTUP_QUERY_CNT, - IFLA_BR_MCAST_LAST_MEMBER_INTVL, - IFLA_BR_MCAST_MEMBERSHIP_INTVL, - IFLA_BR_MCAST_QUERIER_INTVL, - IFLA_BR_MCAST_QUERY_INTVL, - IFLA_BR_MCAST_QUERY_RESPONSE_INTVL, - IFLA_BR_MCAST_STARTUP_QUERY_INTVL, - IFLA_BR_NF_CALL_IPTABLES, - IFLA_BR_NF_CALL_IP6TABLES, - IFLA_BR_NF_CALL_ARPTABLES, - IFLA_BR_VLAN_DEFAULT_PVID, - IFLA_BR_PAD, - IFLA_BR_VLAN_STATS_ENABLED, - IFLA_BR_MCAST_STATS_ENABLED, - IFLA_BR_MCAST_IGMP_VERSION, - IFLA_BR_MCAST_MLD_VERSION, - IFLA_BR_VLAN_STATS_PER_PORT, - IFLA_BR_MULTI_BOOLOPT, - IFLA_BR_MCAST_QUERIER_STATE, - __IFLA_BR_MAX, -}; - -#define IFLA_BR_MAX (__IFLA_BR_MAX - 1) - -struct ifla_bridge_id { - __u8 prio[2]; - __u8 addr[6]; /* ETH_ALEN */ -}; - -enum { - BRIDGE_MODE_UNSPEC, - BRIDGE_MODE_HAIRPIN, -}; - -enum { - IFLA_BRPORT_UNSPEC, - IFLA_BRPORT_STATE, /* Spanning tree state */ - IFLA_BRPORT_PRIORITY, /* " priority */ - IFLA_BRPORT_COST, /* " cost */ - IFLA_BRPORT_MODE, /* mode (hairpin) */ - IFLA_BRPORT_GUARD, /* bpdu guard */ - IFLA_BRPORT_PROTECT, /* root port protection */ - IFLA_BRPORT_FAST_LEAVE, /* multicast fast leave */ - IFLA_BRPORT_LEARNING, /* mac learning */ - IFLA_BRPORT_UNICAST_FLOOD, /* flood unicast traffic */ - IFLA_BRPORT_PROXYARP, /* proxy ARP */ - IFLA_BRPORT_LEARNING_SYNC, /* mac learning sync from device */ - IFLA_BRPORT_PROXYARP_WIFI, /* proxy ARP for Wi-Fi */ - IFLA_BRPORT_ROOT_ID, /* designated root */ - IFLA_BRPORT_BRIDGE_ID, /* designated bridge */ - IFLA_BRPORT_DESIGNATED_PORT, - IFLA_BRPORT_DESIGNATED_COST, - IFLA_BRPORT_ID, - IFLA_BRPORT_NO, - IFLA_BRPORT_TOPOLOGY_CHANGE_ACK, - IFLA_BRPORT_CONFIG_PENDING, - IFLA_BRPORT_MESSAGE_AGE_TIMER, - IFLA_BRPORT_FORWARD_DELAY_TIMER, - IFLA_BRPORT_HOLD_TIMER, - IFLA_BRPORT_FLUSH, - IFLA_BRPORT_MULTICAST_ROUTER, - IFLA_BRPORT_PAD, - IFLA_BRPORT_MCAST_FLOOD, - IFLA_BRPORT_MCAST_TO_UCAST, - IFLA_BRPORT_VLAN_TUNNEL, - IFLA_BRPORT_BCAST_FLOOD, - IFLA_BRPORT_GROUP_FWD_MASK, - IFLA_BRPORT_NEIGH_SUPPRESS, - IFLA_BRPORT_ISOLATED, - IFLA_BRPORT_BACKUP_PORT, - IFLA_BRPORT_MRP_RING_OPEN, - IFLA_BRPORT_MRP_IN_OPEN, - IFLA_BRPORT_MCAST_EHT_HOSTS_LIMIT, - IFLA_BRPORT_MCAST_EHT_HOSTS_CNT, - __IFLA_BRPORT_MAX -}; -#define IFLA_BRPORT_MAX (__IFLA_BRPORT_MAX - 1) - -struct ifla_cacheinfo { - __u32 max_reasm_len; - __u32 tstamp; /* ipv6InterfaceTable updated timestamp */ - __u32 reachable_time; - __u32 retrans_time; -}; - -enum { - IFLA_INFO_UNSPEC, - IFLA_INFO_KIND, - IFLA_INFO_DATA, - IFLA_INFO_XSTATS, - IFLA_INFO_SLAVE_KIND, - IFLA_INFO_SLAVE_DATA, - __IFLA_INFO_MAX, -}; - -#define IFLA_INFO_MAX (__IFLA_INFO_MAX - 1) - -/* VLAN section */ - -enum { - IFLA_VLAN_UNSPEC, - IFLA_VLAN_ID, - IFLA_VLAN_FLAGS, - IFLA_VLAN_EGRESS_QOS, - IFLA_VLAN_INGRESS_QOS, - IFLA_VLAN_PROTOCOL, - __IFLA_VLAN_MAX, -}; - -#define IFLA_VLAN_MAX (__IFLA_VLAN_MAX - 1) - -struct ifla_vlan_flags { - __u32 flags; - __u32 mask; -}; - -enum { - IFLA_VLAN_QOS_UNSPEC, - IFLA_VLAN_QOS_MAPPING, - __IFLA_VLAN_QOS_MAX -}; - -#define IFLA_VLAN_QOS_MAX (__IFLA_VLAN_QOS_MAX - 1) - -struct ifla_vlan_qos_mapping { - __u32 from; - __u32 to; -}; - -/* MACVLAN section */ -enum { - IFLA_MACVLAN_UNSPEC, - IFLA_MACVLAN_MODE, - IFLA_MACVLAN_FLAGS, - IFLA_MACVLAN_MACADDR_MODE, - IFLA_MACVLAN_MACADDR, - IFLA_MACVLAN_MACADDR_DATA, - IFLA_MACVLAN_MACADDR_COUNT, - IFLA_MACVLAN_BC_QUEUE_LEN, - IFLA_MACVLAN_BC_QUEUE_LEN_USED, - __IFLA_MACVLAN_MAX, -}; - -#define IFLA_MACVLAN_MAX (__IFLA_MACVLAN_MAX - 1) - -enum macvlan_mode { - MACVLAN_MODE_PRIVATE = 1, /* don't talk to other macvlans */ - MACVLAN_MODE_VEPA = 2, /* talk to other ports through ext bridge */ - MACVLAN_MODE_BRIDGE = 4, /* talk to bridge ports directly */ - MACVLAN_MODE_PASSTHRU = 8,/* take over the underlying device */ - MACVLAN_MODE_SOURCE = 16,/* use source MAC address list to assign */ -}; - -enum macvlan_macaddr_mode { - MACVLAN_MACADDR_ADD, - MACVLAN_MACADDR_DEL, - MACVLAN_MACADDR_FLUSH, - MACVLAN_MACADDR_SET, -}; - -#define MACVLAN_FLAG_NOPROMISC 1 -#define MACVLAN_FLAG_NODST 2 /* skip dst macvlan if matching src macvlan */ - -/* VRF section */ -enum { - IFLA_VRF_UNSPEC, - IFLA_VRF_TABLE, - __IFLA_VRF_MAX -}; - -#define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1) - -enum { - IFLA_VRF_PORT_UNSPEC, - IFLA_VRF_PORT_TABLE, - __IFLA_VRF_PORT_MAX -}; - -#define IFLA_VRF_PORT_MAX (__IFLA_VRF_PORT_MAX - 1) - -/* MACSEC section */ -enum { - IFLA_MACSEC_UNSPEC, - IFLA_MACSEC_SCI, - IFLA_MACSEC_PORT, - IFLA_MACSEC_ICV_LEN, - IFLA_MACSEC_CIPHER_SUITE, - IFLA_MACSEC_WINDOW, - IFLA_MACSEC_ENCODING_SA, - IFLA_MACSEC_ENCRYPT, - IFLA_MACSEC_PROTECT, - IFLA_MACSEC_INC_SCI, - IFLA_MACSEC_ES, - IFLA_MACSEC_SCB, - IFLA_MACSEC_REPLAY_PROTECT, - IFLA_MACSEC_VALIDATION, - IFLA_MACSEC_PAD, - IFLA_MACSEC_OFFLOAD, - __IFLA_MACSEC_MAX, -}; - -#define IFLA_MACSEC_MAX (__IFLA_MACSEC_MAX - 1) - -/* XFRM section */ -enum { - IFLA_XFRM_UNSPEC, - IFLA_XFRM_LINK, - IFLA_XFRM_IF_ID, - __IFLA_XFRM_MAX -}; - -#define IFLA_XFRM_MAX (__IFLA_XFRM_MAX - 1) - -enum macsec_validation_type { - MACSEC_VALIDATE_DISABLED = 0, - MACSEC_VALIDATE_CHECK = 1, - MACSEC_VALIDATE_STRICT = 2, - __MACSEC_VALIDATE_END, - MACSEC_VALIDATE_MAX = __MACSEC_VALIDATE_END - 1, -}; - -enum macsec_offload { - MACSEC_OFFLOAD_OFF = 0, - MACSEC_OFFLOAD_PHY = 1, - MACSEC_OFFLOAD_MAC = 2, - __MACSEC_OFFLOAD_END, - MACSEC_OFFLOAD_MAX = __MACSEC_OFFLOAD_END - 1, -}; - -/* IPVLAN section */ -enum { - IFLA_IPVLAN_UNSPEC, - IFLA_IPVLAN_MODE, - IFLA_IPVLAN_FLAGS, - __IFLA_IPVLAN_MAX -}; - -#define IFLA_IPVLAN_MAX (__IFLA_IPVLAN_MAX - 1) - -enum ipvlan_mode { - IPVLAN_MODE_L2 = 0, - IPVLAN_MODE_L3, - IPVLAN_MODE_L3S, - IPVLAN_MODE_MAX -}; - -#define IPVLAN_F_PRIVATE 0x01 -#define IPVLAN_F_VEPA 0x02 - -/* VXLAN section */ -enum { - IFLA_VXLAN_UNSPEC, - IFLA_VXLAN_ID, - IFLA_VXLAN_GROUP, /* group or remote address */ - IFLA_VXLAN_LINK, - IFLA_VXLAN_LOCAL, - IFLA_VXLAN_TTL, - IFLA_VXLAN_TOS, - IFLA_VXLAN_LEARNING, - IFLA_VXLAN_AGEING, - IFLA_VXLAN_LIMIT, - IFLA_VXLAN_PORT_RANGE, /* source port */ - IFLA_VXLAN_PROXY, - IFLA_VXLAN_RSC, - IFLA_VXLAN_L2MISS, - IFLA_VXLAN_L3MISS, - IFLA_VXLAN_PORT, /* destination port */ - IFLA_VXLAN_GROUP6, - IFLA_VXLAN_LOCAL6, - IFLA_VXLAN_UDP_CSUM, - IFLA_VXLAN_UDP_ZERO_CSUM6_TX, - IFLA_VXLAN_UDP_ZERO_CSUM6_RX, - IFLA_VXLAN_REMCSUM_TX, - IFLA_VXLAN_REMCSUM_RX, - IFLA_VXLAN_GBP, - IFLA_VXLAN_REMCSUM_NOPARTIAL, - IFLA_VXLAN_COLLECT_METADATA, - IFLA_VXLAN_LABEL, - IFLA_VXLAN_GPE, - IFLA_VXLAN_TTL_INHERIT, - IFLA_VXLAN_DF, - __IFLA_VXLAN_MAX -}; -#define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) - -struct ifla_vxlan_port_range { - __be16 low; - __be16 high; -}; - -enum ifla_vxlan_df { - VXLAN_DF_UNSET = 0, - VXLAN_DF_SET, - VXLAN_DF_INHERIT, - __VXLAN_DF_END, - VXLAN_DF_MAX = __VXLAN_DF_END - 1, -}; - -/* GENEVE section */ -enum { - IFLA_GENEVE_UNSPEC, - IFLA_GENEVE_ID, - IFLA_GENEVE_REMOTE, - IFLA_GENEVE_TTL, - IFLA_GENEVE_TOS, - IFLA_GENEVE_PORT, /* destination port */ - IFLA_GENEVE_COLLECT_METADATA, - IFLA_GENEVE_REMOTE6, - IFLA_GENEVE_UDP_CSUM, - IFLA_GENEVE_UDP_ZERO_CSUM6_TX, - IFLA_GENEVE_UDP_ZERO_CSUM6_RX, - IFLA_GENEVE_LABEL, - IFLA_GENEVE_TTL_INHERIT, - IFLA_GENEVE_DF, - __IFLA_GENEVE_MAX -}; -#define IFLA_GENEVE_MAX (__IFLA_GENEVE_MAX - 1) - -enum ifla_geneve_df { - GENEVE_DF_UNSET = 0, - GENEVE_DF_SET, - GENEVE_DF_INHERIT, - __GENEVE_DF_END, - GENEVE_DF_MAX = __GENEVE_DF_END - 1, -}; - -/* Bareudp section */ -enum { - IFLA_BAREUDP_UNSPEC, - IFLA_BAREUDP_PORT, - IFLA_BAREUDP_ETHERTYPE, - IFLA_BAREUDP_SRCPORT_MIN, - IFLA_BAREUDP_MULTIPROTO_MODE, - __IFLA_BAREUDP_MAX -}; - -#define IFLA_BAREUDP_MAX (__IFLA_BAREUDP_MAX - 1) - -/* PPP section */ -enum { - IFLA_PPP_UNSPEC, - IFLA_PPP_DEV_FD, - __IFLA_PPP_MAX -}; -#define IFLA_PPP_MAX (__IFLA_PPP_MAX - 1) - -/* GTP section */ - -enum ifla_gtp_role { - GTP_ROLE_GGSN = 0, - GTP_ROLE_SGSN, -}; - -enum { - IFLA_GTP_UNSPEC, - IFLA_GTP_FD0, - IFLA_GTP_FD1, - IFLA_GTP_PDP_HASHSIZE, - IFLA_GTP_ROLE, - __IFLA_GTP_MAX, -}; -#define IFLA_GTP_MAX (__IFLA_GTP_MAX - 1) - -/* Bonding section */ - -enum { - IFLA_BOND_UNSPEC, - IFLA_BOND_MODE, - IFLA_BOND_ACTIVE_SLAVE, - IFLA_BOND_MIIMON, - IFLA_BOND_UPDELAY, - IFLA_BOND_DOWNDELAY, - IFLA_BOND_USE_CARRIER, - IFLA_BOND_ARP_INTERVAL, - IFLA_BOND_ARP_IP_TARGET, - IFLA_BOND_ARP_VALIDATE, - IFLA_BOND_ARP_ALL_TARGETS, - IFLA_BOND_PRIMARY, - IFLA_BOND_PRIMARY_RESELECT, - IFLA_BOND_FAIL_OVER_MAC, - IFLA_BOND_XMIT_HASH_POLICY, - IFLA_BOND_RESEND_IGMP, - IFLA_BOND_NUM_PEER_NOTIF, - IFLA_BOND_ALL_SLAVES_ACTIVE, - IFLA_BOND_MIN_LINKS, - IFLA_BOND_LP_INTERVAL, - IFLA_BOND_PACKETS_PER_SLAVE, - IFLA_BOND_AD_LACP_RATE, - IFLA_BOND_AD_SELECT, - IFLA_BOND_AD_INFO, - IFLA_BOND_AD_ACTOR_SYS_PRIO, - IFLA_BOND_AD_USER_PORT_KEY, - IFLA_BOND_AD_ACTOR_SYSTEM, - IFLA_BOND_TLB_DYNAMIC_LB, - IFLA_BOND_PEER_NOTIF_DELAY, - IFLA_BOND_AD_LACP_ACTIVE, - IFLA_BOND_MISSED_MAX, - IFLA_BOND_NS_IP6_TARGET, - __IFLA_BOND_MAX, -}; - -#define IFLA_BOND_MAX (__IFLA_BOND_MAX - 1) - -enum { - IFLA_BOND_AD_INFO_UNSPEC, - IFLA_BOND_AD_INFO_AGGREGATOR, - IFLA_BOND_AD_INFO_NUM_PORTS, - IFLA_BOND_AD_INFO_ACTOR_KEY, - IFLA_BOND_AD_INFO_PARTNER_KEY, - IFLA_BOND_AD_INFO_PARTNER_MAC, - __IFLA_BOND_AD_INFO_MAX, -}; - -#define IFLA_BOND_AD_INFO_MAX (__IFLA_BOND_AD_INFO_MAX - 1) - -enum { - IFLA_BOND_SLAVE_UNSPEC, - IFLA_BOND_SLAVE_STATE, - IFLA_BOND_SLAVE_MII_STATUS, - IFLA_BOND_SLAVE_LINK_FAILURE_COUNT, - IFLA_BOND_SLAVE_PERM_HWADDR, - IFLA_BOND_SLAVE_QUEUE_ID, - IFLA_BOND_SLAVE_AD_AGGREGATOR_ID, - IFLA_BOND_SLAVE_AD_ACTOR_OPER_PORT_STATE, - IFLA_BOND_SLAVE_AD_PARTNER_OPER_PORT_STATE, - __IFLA_BOND_SLAVE_MAX, -}; - -#define IFLA_BOND_SLAVE_MAX (__IFLA_BOND_SLAVE_MAX - 1) - -/* SR-IOV virtual function management section */ - -enum { - IFLA_VF_INFO_UNSPEC, - IFLA_VF_INFO, - __IFLA_VF_INFO_MAX, -}; - -#define IFLA_VF_INFO_MAX (__IFLA_VF_INFO_MAX - 1) - -enum { - IFLA_VF_UNSPEC, - IFLA_VF_MAC, /* Hardware queue specific attributes */ - IFLA_VF_VLAN, /* VLAN ID and QoS */ - IFLA_VF_TX_RATE, /* Max TX Bandwidth Allocation */ - IFLA_VF_SPOOFCHK, /* Spoof Checking on/off switch */ - IFLA_VF_LINK_STATE, /* link state enable/disable/auto switch */ - IFLA_VF_RATE, /* Min and Max TX Bandwidth Allocation */ - IFLA_VF_RSS_QUERY_EN, /* RSS Redirection Table and Hash Key query - * on/off switch - */ - IFLA_VF_STATS, /* network device statistics */ - IFLA_VF_TRUST, /* Trust VF */ - IFLA_VF_IB_NODE_GUID, /* VF Infiniband node GUID */ - IFLA_VF_IB_PORT_GUID, /* VF Infiniband port GUID */ - IFLA_VF_VLAN_LIST, /* nested list of vlans, option for QinQ */ - IFLA_VF_BROADCAST, /* VF broadcast */ - __IFLA_VF_MAX, -}; - -#define IFLA_VF_MAX (__IFLA_VF_MAX - 1) - -struct ifla_vf_mac { - __u32 vf; - __u8 mac[32]; /* MAX_ADDR_LEN */ -}; - -struct ifla_vf_broadcast { - __u8 broadcast[32]; -}; - -struct ifla_vf_vlan { - __u32 vf; - __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ - __u32 qos; -}; - -enum { - IFLA_VF_VLAN_INFO_UNSPEC, - IFLA_VF_VLAN_INFO, /* VLAN ID, QoS and VLAN protocol */ - __IFLA_VF_VLAN_INFO_MAX, -}; - -#define IFLA_VF_VLAN_INFO_MAX (__IFLA_VF_VLAN_INFO_MAX - 1) -#define MAX_VLAN_LIST_LEN 1 - -struct ifla_vf_vlan_info { - __u32 vf; - __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ - __u32 qos; - __be16 vlan_proto; /* VLAN protocol either 802.1Q or 802.1ad */ -}; - -struct ifla_vf_tx_rate { - __u32 vf; - __u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ -}; - -struct ifla_vf_rate { - __u32 vf; - __u32 min_tx_rate; /* Min Bandwidth in Mbps */ - __u32 max_tx_rate; /* Max Bandwidth in Mbps */ -}; - -struct ifla_vf_spoofchk { - __u32 vf; - __u32 setting; -}; - -struct ifla_vf_guid { - __u32 vf; - __u64 guid; -}; - -enum { - IFLA_VF_LINK_STATE_AUTO, /* link state of the uplink */ - IFLA_VF_LINK_STATE_ENABLE, /* link always up */ - IFLA_VF_LINK_STATE_DISABLE, /* link always down */ - __IFLA_VF_LINK_STATE_MAX, -}; - -struct ifla_vf_link_state { - __u32 vf; - __u32 link_state; -}; - -struct ifla_vf_rss_query_en { - __u32 vf; - __u32 setting; -}; - -enum { - IFLA_VF_STATS_RX_PACKETS, - IFLA_VF_STATS_TX_PACKETS, - IFLA_VF_STATS_RX_BYTES, - IFLA_VF_STATS_TX_BYTES, - IFLA_VF_STATS_BROADCAST, - IFLA_VF_STATS_MULTICAST, - IFLA_VF_STATS_PAD, - IFLA_VF_STATS_RX_DROPPED, - IFLA_VF_STATS_TX_DROPPED, - __IFLA_VF_STATS_MAX, -}; - -#define IFLA_VF_STATS_MAX (__IFLA_VF_STATS_MAX - 1) - -struct ifla_vf_trust { - __u32 vf; - __u32 setting; -}; - -/* VF ports management section - * - * Nested layout of set/get msg is: - * - * [IFLA_NUM_VF] - * [IFLA_VF_PORTS] - * [IFLA_VF_PORT] - * [IFLA_PORT_*], ... - * [IFLA_VF_PORT] - * [IFLA_PORT_*], ... - * ... - * [IFLA_PORT_SELF] - * [IFLA_PORT_*], ... - */ - -enum { - IFLA_VF_PORT_UNSPEC, - IFLA_VF_PORT, /* nest */ - __IFLA_VF_PORT_MAX, -}; - -#define IFLA_VF_PORT_MAX (__IFLA_VF_PORT_MAX - 1) - -enum { - IFLA_PORT_UNSPEC, - IFLA_PORT_VF, /* __u32 */ - IFLA_PORT_PROFILE, /* string */ - IFLA_PORT_VSI_TYPE, /* 802.1Qbg (pre-)standard VDP */ - IFLA_PORT_INSTANCE_UUID, /* binary UUID */ - IFLA_PORT_HOST_UUID, /* binary UUID */ - IFLA_PORT_REQUEST, /* __u8 */ - IFLA_PORT_RESPONSE, /* __u16, output only */ - __IFLA_PORT_MAX, -}; - -#define IFLA_PORT_MAX (__IFLA_PORT_MAX - 1) - -#define PORT_PROFILE_MAX 40 -#define PORT_UUID_MAX 16 -#define PORT_SELF_VF -1 - -enum { - PORT_REQUEST_PREASSOCIATE = 0, - PORT_REQUEST_PREASSOCIATE_RR, - PORT_REQUEST_ASSOCIATE, - PORT_REQUEST_DISASSOCIATE, -}; - -enum { - PORT_VDP_RESPONSE_SUCCESS = 0, - PORT_VDP_RESPONSE_INVALID_FORMAT, - PORT_VDP_RESPONSE_INSUFFICIENT_RESOURCES, - PORT_VDP_RESPONSE_UNUSED_VTID, - PORT_VDP_RESPONSE_VTID_VIOLATION, - PORT_VDP_RESPONSE_VTID_VERSION_VIOALTION, - PORT_VDP_RESPONSE_OUT_OF_SYNC, - /* 0x08-0xFF reserved for future VDP use */ - PORT_PROFILE_RESPONSE_SUCCESS = 0x100, - PORT_PROFILE_RESPONSE_INPROGRESS, - PORT_PROFILE_RESPONSE_INVALID, - PORT_PROFILE_RESPONSE_BADSTATE, - PORT_PROFILE_RESPONSE_INSUFFICIENT_RESOURCES, - PORT_PROFILE_RESPONSE_ERROR, -}; - -struct ifla_port_vsi { - __u8 vsi_mgr_id; - __u8 vsi_type_id[3]; - __u8 vsi_type_version; - __u8 pad[3]; -}; - - -/* IPoIB section */ - -enum { - IFLA_IPOIB_UNSPEC, - IFLA_IPOIB_PKEY, - IFLA_IPOIB_MODE, - IFLA_IPOIB_UMCAST, - __IFLA_IPOIB_MAX -}; - -enum { - IPOIB_MODE_DATAGRAM = 0, /* using unreliable datagram QPs */ - IPOIB_MODE_CONNECTED = 1, /* using connected QPs */ -}; - -#define IFLA_IPOIB_MAX (__IFLA_IPOIB_MAX - 1) - - -/* HSR/PRP section, both uses same interface */ - -/* Different redundancy protocols for hsr device */ -enum { - HSR_PROTOCOL_HSR, - HSR_PROTOCOL_PRP, - HSR_PROTOCOL_MAX, -}; - -enum { - IFLA_HSR_UNSPEC, - IFLA_HSR_SLAVE1, - IFLA_HSR_SLAVE2, - IFLA_HSR_MULTICAST_SPEC, /* Last byte of supervision addr */ - IFLA_HSR_SUPERVISION_ADDR, /* Supervision frame multicast addr */ - IFLA_HSR_SEQ_NR, - IFLA_HSR_VERSION, /* HSR version */ - IFLA_HSR_PROTOCOL, /* Indicate different protocol than - * HSR. For example PRP. - */ - __IFLA_HSR_MAX, -}; - -#define IFLA_HSR_MAX (__IFLA_HSR_MAX - 1) - -/* STATS section */ - -struct if_stats_msg { - __u8 family; - __u8 pad1; - __u16 pad2; - __u32 ifindex; - __u32 filter_mask; -}; - -/* A stats attribute can be netdev specific or a global stat. - * For netdev stats, lets use the prefix IFLA_STATS_LINK_* - */ -enum { - IFLA_STATS_UNSPEC, /* also used as 64bit pad attribute */ - IFLA_STATS_LINK_64, - IFLA_STATS_LINK_XSTATS, - IFLA_STATS_LINK_XSTATS_SLAVE, - IFLA_STATS_LINK_OFFLOAD_XSTATS, - IFLA_STATS_AF_SPEC, - __IFLA_STATS_MAX, -}; - -#define IFLA_STATS_MAX (__IFLA_STATS_MAX - 1) - -#define IFLA_STATS_FILTER_BIT(ATTR) (1 << (ATTR - 1)) - -/* These are embedded into IFLA_STATS_LINK_XSTATS: - * [IFLA_STATS_LINK_XSTATS] - * -> [LINK_XSTATS_TYPE_xxx] - * -> [rtnl link type specific attributes] - */ -enum { - LINK_XSTATS_TYPE_UNSPEC, - LINK_XSTATS_TYPE_BRIDGE, - LINK_XSTATS_TYPE_BOND, - __LINK_XSTATS_TYPE_MAX -}; -#define LINK_XSTATS_TYPE_MAX (__LINK_XSTATS_TYPE_MAX - 1) - -/* These are stats embedded into IFLA_STATS_LINK_OFFLOAD_XSTATS */ -enum { - IFLA_OFFLOAD_XSTATS_UNSPEC, - IFLA_OFFLOAD_XSTATS_CPU_HIT, /* struct rtnl_link_stats64 */ - __IFLA_OFFLOAD_XSTATS_MAX -}; -#define IFLA_OFFLOAD_XSTATS_MAX (__IFLA_OFFLOAD_XSTATS_MAX - 1) - -/* XDP section */ - -#define XDP_FLAGS_UPDATE_IF_NOEXIST (1U << 0) -#define XDP_FLAGS_SKB_MODE (1U << 1) -#define XDP_FLAGS_DRV_MODE (1U << 2) -#define XDP_FLAGS_HW_MODE (1U << 3) -#define XDP_FLAGS_REPLACE (1U << 4) -#define XDP_FLAGS_MODES (XDP_FLAGS_SKB_MODE | \ - XDP_FLAGS_DRV_MODE | \ - XDP_FLAGS_HW_MODE) -#define XDP_FLAGS_MASK (XDP_FLAGS_UPDATE_IF_NOEXIST | \ - XDP_FLAGS_MODES | XDP_FLAGS_REPLACE) - -/* These are stored into IFLA_XDP_ATTACHED on dump. */ -enum { - XDP_ATTACHED_NONE = 0, - XDP_ATTACHED_DRV, - XDP_ATTACHED_SKB, - XDP_ATTACHED_HW, - XDP_ATTACHED_MULTI, -}; - -enum { - IFLA_XDP_UNSPEC, - IFLA_XDP_FD, - IFLA_XDP_ATTACHED, - IFLA_XDP_FLAGS, - IFLA_XDP_PROG_ID, - IFLA_XDP_DRV_PROG_ID, - IFLA_XDP_SKB_PROG_ID, - IFLA_XDP_HW_PROG_ID, - IFLA_XDP_EXPECTED_FD, - __IFLA_XDP_MAX, -}; - -#define IFLA_XDP_MAX (__IFLA_XDP_MAX - 1) - -enum { - IFLA_EVENT_NONE, - IFLA_EVENT_REBOOT, /* internal reset / reboot */ - IFLA_EVENT_FEATURES, /* change in offload features */ - IFLA_EVENT_BONDING_FAILOVER, /* change in active slave */ - IFLA_EVENT_NOTIFY_PEERS, /* re-sent grat. arp/ndisc */ - IFLA_EVENT_IGMP_RESEND, /* re-sent IGMP JOIN */ - IFLA_EVENT_BONDING_OPTIONS, /* change in bonding options */ -}; - -/* tun section */ - -enum { - IFLA_TUN_UNSPEC, - IFLA_TUN_OWNER, - IFLA_TUN_GROUP, - IFLA_TUN_TYPE, - IFLA_TUN_PI, - IFLA_TUN_VNET_HDR, - IFLA_TUN_PERSIST, - IFLA_TUN_MULTI_QUEUE, - IFLA_TUN_NUM_QUEUES, - IFLA_TUN_NUM_DISABLED_QUEUES, - __IFLA_TUN_MAX, -}; - -#define IFLA_TUN_MAX (__IFLA_TUN_MAX - 1) - -/* rmnet section */ - -#define RMNET_FLAGS_INGRESS_DEAGGREGATION (1U << 0) -#define RMNET_FLAGS_INGRESS_MAP_COMMANDS (1U << 1) -#define RMNET_FLAGS_INGRESS_MAP_CKSUMV4 (1U << 2) -#define RMNET_FLAGS_EGRESS_MAP_CKSUMV4 (1U << 3) -#define RMNET_FLAGS_INGRESS_MAP_CKSUMV5 (1U << 4) -#define RMNET_FLAGS_EGRESS_MAP_CKSUMV5 (1U << 5) - -enum { - IFLA_RMNET_UNSPEC, - IFLA_RMNET_MUX_ID, - IFLA_RMNET_FLAGS, - __IFLA_RMNET_MAX, -}; - -#define IFLA_RMNET_MAX (__IFLA_RMNET_MAX - 1) - -struct ifla_rmnet_flags { - __u32 flags; - __u32 mask; -}; - -/* MCTP section */ - -enum { - IFLA_MCTP_UNSPEC, - IFLA_MCTP_NET, - __IFLA_MCTP_MAX, -}; - -#define IFLA_MCTP_MAX (__IFLA_MCTP_MAX - 1) - -#endif /* _UAPI_LINUX_IF_LINK_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/if_xdp.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/if_xdp.h deleted file mode 100644 index 9c0e7a7..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/if_xdp.h +++ /dev/null @@ -1,111 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -/* - * if_xdp: XDP socket user-space interface - * Copyright(c) 2018 Intel Corporation. - * - * Author(s): Björn Töpel - * Magnus Karlsson - */ - -#ifndef _LINUX_IF_XDP_H -#define _LINUX_IF_XDP_H - -#include - -/* Options for the sxdp_flags field */ -#define XDP_SHARED_UMEM (1 << 0) -#define XDP_COPY (1 << 1) /* Force copy-mode */ -#define XDP_ZEROCOPY (1 << 2) /* Force zero-copy mode */ -/* If this option is set, the driver might go sleep and in that case - * the XDP_RING_NEED_WAKEUP flag in the fill and/or Tx rings will be - * set. If it is set, the application need to explicitly wake up the - * driver with a poll() (Rx and Tx) or sendto() (Tx only). If you are - * running the driver and the application on the same core, you should - * use this option so that the kernel will yield to the user space - * application. - */ -#define XDP_USE_NEED_WAKEUP (1 << 3) - -/* Flags for xsk_umem_config flags */ -#define XDP_UMEM_UNALIGNED_CHUNK_FLAG (1 << 0) - -struct sockaddr_xdp { - __u16 sxdp_family; - __u16 sxdp_flags; - __u32 sxdp_ifindex; - __u32 sxdp_queue_id; - __u32 sxdp_shared_umem_fd; -}; - -/* XDP_RING flags */ -#define XDP_RING_NEED_WAKEUP (1 << 0) - -struct xdp_ring_offset { - __u64 producer; - __u64 consumer; - __u64 desc; - __u64 flags; -}; - -struct xdp_mmap_offsets { - struct xdp_ring_offset rx; - struct xdp_ring_offset tx; - struct xdp_ring_offset fr; /* Fill */ - struct xdp_ring_offset cr; /* Completion */ -}; - -/* XDP socket options */ -#define XDP_MMAP_OFFSETS 1 -#define XDP_RX_RING 2 -#define XDP_TX_RING 3 -#define XDP_UMEM_REG 4 -#define XDP_UMEM_FILL_RING 5 -#define XDP_UMEM_COMPLETION_RING 6 -#define XDP_STATISTICS 7 -#define XDP_OPTIONS 8 - -struct xdp_umem_reg { - __u64 addr; /* Start of packet data area */ - __u64 len; /* Length of packet data area */ - __u32 chunk_size; - __u32 headroom; - __u32 flags; -}; - -struct xdp_statistics { - __u64 rx_dropped; /* Dropped for other reasons */ - __u64 rx_invalid_descs; /* Dropped due to invalid descriptor */ - __u64 tx_invalid_descs; /* Dropped due to invalid descriptor */ - __u64 rx_ring_full; /* Dropped due to rx ring being full */ - __u64 rx_fill_ring_empty_descs; /* Failed to retrieve item from fill ring */ - __u64 tx_ring_empty_descs; /* Failed to retrieve item from tx ring */ -}; - -struct xdp_options { - __u32 flags; -}; - -/* Flags for the flags field of struct xdp_options */ -#define XDP_OPTIONS_ZEROCOPY (1 << 0) - -/* Pgoff for mmaping the rings */ -#define XDP_PGOFF_RX_RING 0 -#define XDP_PGOFF_TX_RING 0x80000000 -#define XDP_UMEM_PGOFF_FILL_RING 0x100000000ULL -#define XDP_UMEM_PGOFF_COMPLETION_RING 0x180000000ULL - -/* Masks for unaligned chunks mode */ -#define XSK_UNALIGNED_BUF_OFFSET_SHIFT 48 -#define XSK_UNALIGNED_BUF_ADDR_MASK \ - ((1ULL << XSK_UNALIGNED_BUF_OFFSET_SHIFT) - 1) - -/* Rx/Tx descriptor */ -struct xdp_desc { - __u64 addr; - __u32 len; - __u32 options; -}; - -/* UMEM descriptor is __u64 */ - -#endif /* _LINUX_IF_XDP_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/netlink.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/netlink.h deleted file mode 100644 index 22e037c..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/netlink.h +++ /dev/null @@ -1,252 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef _UAPI__LINUX_NETLINK_H -#define _UAPI__LINUX_NETLINK_H - -#include -#include /* for __kernel_sa_family_t */ -#include - -#define NETLINK_ROUTE 0 /* Routing/device hook */ -#define NETLINK_UNUSED 1 /* Unused number */ -#define NETLINK_USERSOCK 2 /* Reserved for user mode socket protocols */ -#define NETLINK_FIREWALL 3 /* Unused number, formerly ip_queue */ -#define NETLINK_SOCK_DIAG 4 /* socket monitoring */ -#define NETLINK_NFLOG 5 /* netfilter/iptables ULOG */ -#define NETLINK_XFRM 6 /* ipsec */ -#define NETLINK_SELINUX 7 /* SELinux event notifications */ -#define NETLINK_ISCSI 8 /* Open-iSCSI */ -#define NETLINK_AUDIT 9 /* auditing */ -#define NETLINK_FIB_LOOKUP 10 -#define NETLINK_CONNECTOR 11 -#define NETLINK_NETFILTER 12 /* netfilter subsystem */ -#define NETLINK_IP6_FW 13 -#define NETLINK_DNRTMSG 14 /* DECnet routing messages */ -#define NETLINK_KOBJECT_UEVENT 15 /* Kernel messages to userspace */ -#define NETLINK_GENERIC 16 -/* leave room for NETLINK_DM (DM Events) */ -#define NETLINK_SCSITRANSPORT 18 /* SCSI Transports */ -#define NETLINK_ECRYPTFS 19 -#define NETLINK_RDMA 20 -#define NETLINK_CRYPTO 21 /* Crypto layer */ -#define NETLINK_SMC 22 /* SMC monitoring */ - -#define NETLINK_INET_DIAG NETLINK_SOCK_DIAG - -#define MAX_LINKS 32 - -struct sockaddr_nl { - __kernel_sa_family_t nl_family; /* AF_NETLINK */ - unsigned short nl_pad; /* zero */ - __u32 nl_pid; /* port ID */ - __u32 nl_groups; /* multicast groups mask */ -}; - -struct nlmsghdr { - __u32 nlmsg_len; /* Length of message including header */ - __u16 nlmsg_type; /* Message content */ - __u16 nlmsg_flags; /* Additional flags */ - __u32 nlmsg_seq; /* Sequence number */ - __u32 nlmsg_pid; /* Sending process port ID */ -}; - -/* Flags values */ - -#define NLM_F_REQUEST 0x01 /* It is request message. */ -#define NLM_F_MULTI 0x02 /* Multipart message, terminated by NLMSG_DONE */ -#define NLM_F_ACK 0x04 /* Reply with ack, with zero or error code */ -#define NLM_F_ECHO 0x08 /* Echo this request */ -#define NLM_F_DUMP_INTR 0x10 /* Dump was inconsistent due to sequence change */ -#define NLM_F_DUMP_FILTERED 0x20 /* Dump was filtered as requested */ - -/* Modifiers to GET request */ -#define NLM_F_ROOT 0x100 /* specify tree root */ -#define NLM_F_MATCH 0x200 /* return all matching */ -#define NLM_F_ATOMIC 0x400 /* atomic GET */ -#define NLM_F_DUMP (NLM_F_ROOT|NLM_F_MATCH) - -/* Modifiers to NEW request */ -#define NLM_F_REPLACE 0x100 /* Override existing */ -#define NLM_F_EXCL 0x200 /* Do not touch, if it exists */ -#define NLM_F_CREATE 0x400 /* Create, if it does not exist */ -#define NLM_F_APPEND 0x800 /* Add to end of list */ - -/* Modifiers to DELETE request */ -#define NLM_F_NONREC 0x100 /* Do not delete recursively */ - -/* Flags for ACK message */ -#define NLM_F_CAPPED 0x100 /* request was capped */ -#define NLM_F_ACK_TLVS 0x200 /* extended ACK TVLs were included */ - -/* - 4.4BSD ADD NLM_F_CREATE|NLM_F_EXCL - 4.4BSD CHANGE NLM_F_REPLACE - - True CHANGE NLM_F_CREATE|NLM_F_REPLACE - Append NLM_F_CREATE - Check NLM_F_EXCL - */ - -#define NLMSG_ALIGNTO 4U -#define NLMSG_ALIGN(len) ( ((len)+NLMSG_ALIGNTO-1) & ~(NLMSG_ALIGNTO-1) ) -#define NLMSG_HDRLEN ((int) NLMSG_ALIGN(sizeof(struct nlmsghdr))) -#define NLMSG_LENGTH(len) ((len) + NLMSG_HDRLEN) -#define NLMSG_SPACE(len) NLMSG_ALIGN(NLMSG_LENGTH(len)) -#define NLMSG_DATA(nlh) ((void*)(((char*)nlh) + NLMSG_LENGTH(0))) -#define NLMSG_NEXT(nlh,len) ((len) -= NLMSG_ALIGN((nlh)->nlmsg_len), \ - (struct nlmsghdr*)(((char*)(nlh)) + NLMSG_ALIGN((nlh)->nlmsg_len))) -#define NLMSG_OK(nlh,len) ((len) >= (int)sizeof(struct nlmsghdr) && \ - (nlh)->nlmsg_len >= sizeof(struct nlmsghdr) && \ - (nlh)->nlmsg_len <= (len)) -#define NLMSG_PAYLOAD(nlh,len) ((nlh)->nlmsg_len - NLMSG_SPACE((len))) - -#define NLMSG_NOOP 0x1 /* Nothing. */ -#define NLMSG_ERROR 0x2 /* Error */ -#define NLMSG_DONE 0x3 /* End of a dump */ -#define NLMSG_OVERRUN 0x4 /* Data lost */ - -#define NLMSG_MIN_TYPE 0x10 /* < 0x10: reserved control messages */ - -struct nlmsgerr { - int error; - struct nlmsghdr msg; - /* - * followed by the message contents unless NETLINK_CAP_ACK was set - * or the ACK indicates success (error == 0) - * message length is aligned with NLMSG_ALIGN() - */ - /* - * followed by TLVs defined in enum nlmsgerr_attrs - * if NETLINK_EXT_ACK was set - */ -}; - -/** - * enum nlmsgerr_attrs - nlmsgerr attributes - * @NLMSGERR_ATTR_UNUSED: unused - * @NLMSGERR_ATTR_MSG: error message string (string) - * @NLMSGERR_ATTR_OFFS: offset of the invalid attribute in the original - * message, counting from the beginning of the header (u32) - * @NLMSGERR_ATTR_COOKIE: arbitrary subsystem specific cookie to - * be used - in the success case - to identify a created - * object or operation or similar (binary) - * @__NLMSGERR_ATTR_MAX: number of attributes - * @NLMSGERR_ATTR_MAX: highest attribute number - */ -enum nlmsgerr_attrs { - NLMSGERR_ATTR_UNUSED, - NLMSGERR_ATTR_MSG, - NLMSGERR_ATTR_OFFS, - NLMSGERR_ATTR_COOKIE, - - __NLMSGERR_ATTR_MAX, - NLMSGERR_ATTR_MAX = __NLMSGERR_ATTR_MAX - 1 -}; - -#define NETLINK_ADD_MEMBERSHIP 1 -#define NETLINK_DROP_MEMBERSHIP 2 -#define NETLINK_PKTINFO 3 -#define NETLINK_BROADCAST_ERROR 4 -#define NETLINK_NO_ENOBUFS 5 -#ifndef __KERNEL__ -#define NETLINK_RX_RING 6 -#define NETLINK_TX_RING 7 -#endif -#define NETLINK_LISTEN_ALL_NSID 8 -#define NETLINK_LIST_MEMBERSHIPS 9 -#define NETLINK_CAP_ACK 10 -#define NETLINK_EXT_ACK 11 -#define NETLINK_GET_STRICT_CHK 12 - -struct nl_pktinfo { - __u32 group; -}; - -struct nl_mmap_req { - unsigned int nm_block_size; - unsigned int nm_block_nr; - unsigned int nm_frame_size; - unsigned int nm_frame_nr; -}; - -struct nl_mmap_hdr { - unsigned int nm_status; - unsigned int nm_len; - __u32 nm_group; - /* credentials */ - __u32 nm_pid; - __u32 nm_uid; - __u32 nm_gid; -}; - -#ifndef __KERNEL__ -enum nl_mmap_status { - NL_MMAP_STATUS_UNUSED, - NL_MMAP_STATUS_RESERVED, - NL_MMAP_STATUS_VALID, - NL_MMAP_STATUS_COPY, - NL_MMAP_STATUS_SKIP, -}; - -#define NL_MMAP_MSG_ALIGNMENT NLMSG_ALIGNTO -#define NL_MMAP_MSG_ALIGN(sz) __ALIGN_KERNEL(sz, NL_MMAP_MSG_ALIGNMENT) -#define NL_MMAP_HDRLEN NL_MMAP_MSG_ALIGN(sizeof(struct nl_mmap_hdr)) -#endif - -#define NET_MAJOR 36 /* Major 36 is reserved for networking */ - -enum { - NETLINK_UNCONNECTED = 0, - NETLINK_CONNECTED, -}; - -/* - * <------- NLA_HDRLEN ------> <-- NLA_ALIGN(payload)--> - * +---------------------+- - -+- - - - - - - - - -+- - -+ - * | Header | Pad | Payload | Pad | - * | (struct nlattr) | ing | | ing | - * +---------------------+- - -+- - - - - - - - - -+- - -+ - * <-------------- nlattr->nla_len --------------> - */ - -struct nlattr { - __u16 nla_len; - __u16 nla_type; -}; - -/* - * nla_type (16 bits) - * +---+---+-------------------------------+ - * | N | O | Attribute Type | - * +---+---+-------------------------------+ - * N := Carries nested attributes - * O := Payload stored in network byte order - * - * Note: The N and O flag are mutually exclusive. - */ -#define NLA_F_NESTED (1 << 15) -#define NLA_F_NET_BYTEORDER (1 << 14) -#define NLA_TYPE_MASK ~(NLA_F_NESTED | NLA_F_NET_BYTEORDER) - -#define NLA_ALIGNTO 4 -#define NLA_ALIGN(len) (((len) + NLA_ALIGNTO - 1) & ~(NLA_ALIGNTO - 1)) -#define NLA_HDRLEN ((int) NLA_ALIGN(sizeof(struct nlattr))) - -/* Generic 32 bitflags attribute content sent to the kernel. - * - * The value is a bitmap that defines the values being set - * The selector is a bitmask that defines which value is legit - * - * Examples: - * value = 0x0, and selector = 0x1 - * implies we are selecting bit 1 and we want to set its value to 0. - * - * value = 0x2, and selector = 0x2 - * implies we are selecting bit 2 and we want to set its value to 1. - * - */ -struct nla_bitfield32 { - __u32 value; - __u32 selector; -}; - -#endif /* _UAPI__LINUX_NETLINK_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/perf_event.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/perf_event.h deleted file mode 100644 index 38c5c41..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/perf_event.h +++ /dev/null @@ -1,1395 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -/* - * Performance events: - * - * Copyright (C) 2008-2009, Thomas Gleixner - * Copyright (C) 2008-2011, Red Hat, Inc., Ingo Molnar - * Copyright (C) 2008-2011, Red Hat, Inc., Peter Zijlstra - * - * Data type definitions, declarations, prototypes. - * - * Started by: Thomas Gleixner and Ingo Molnar - * - * For licencing details see kernel-base/COPYING - */ -#ifndef _UAPI_LINUX_PERF_EVENT_H -#define _UAPI_LINUX_PERF_EVENT_H - -#include -#include -#include - -/* - * User-space ABI bits: - */ - -/* - * attr.type - */ -enum perf_type_id { - PERF_TYPE_HARDWARE = 0, - PERF_TYPE_SOFTWARE = 1, - PERF_TYPE_TRACEPOINT = 2, - PERF_TYPE_HW_CACHE = 3, - PERF_TYPE_RAW = 4, - PERF_TYPE_BREAKPOINT = 5, - - PERF_TYPE_MAX, /* non-ABI */ -}; - -/* - * attr.config layout for type PERF_TYPE_HARDWARE and PERF_TYPE_HW_CACHE - * PERF_TYPE_HARDWARE: 0xEEEEEEEE000000AA - * AA: hardware event ID - * EEEEEEEE: PMU type ID - * PERF_TYPE_HW_CACHE: 0xEEEEEEEE00DDCCBB - * BB: hardware cache ID - * CC: hardware cache op ID - * DD: hardware cache op result ID - * EEEEEEEE: PMU type ID - * If the PMU type ID is 0, the PERF_TYPE_RAW will be applied. - */ -#define PERF_PMU_TYPE_SHIFT 32 -#define PERF_HW_EVENT_MASK 0xffffffff - -/* - * Generalized performance event event_id types, used by the - * attr.event_id parameter of the sys_perf_event_open() - * syscall: - */ -enum perf_hw_id { - /* - * Common hardware events, generalized by the kernel: - */ - PERF_COUNT_HW_CPU_CYCLES = 0, - PERF_COUNT_HW_INSTRUCTIONS = 1, - PERF_COUNT_HW_CACHE_REFERENCES = 2, - PERF_COUNT_HW_CACHE_MISSES = 3, - PERF_COUNT_HW_BRANCH_INSTRUCTIONS = 4, - PERF_COUNT_HW_BRANCH_MISSES = 5, - PERF_COUNT_HW_BUS_CYCLES = 6, - PERF_COUNT_HW_STALLED_CYCLES_FRONTEND = 7, - PERF_COUNT_HW_STALLED_CYCLES_BACKEND = 8, - PERF_COUNT_HW_REF_CPU_CYCLES = 9, - - PERF_COUNT_HW_MAX, /* non-ABI */ -}; - -/* - * Generalized hardware cache events: - * - * { L1-D, L1-I, LLC, ITLB, DTLB, BPU, NODE } x - * { read, write, prefetch } x - * { accesses, misses } - */ -enum perf_hw_cache_id { - PERF_COUNT_HW_CACHE_L1D = 0, - PERF_COUNT_HW_CACHE_L1I = 1, - PERF_COUNT_HW_CACHE_LL = 2, - PERF_COUNT_HW_CACHE_DTLB = 3, - PERF_COUNT_HW_CACHE_ITLB = 4, - PERF_COUNT_HW_CACHE_BPU = 5, - PERF_COUNT_HW_CACHE_NODE = 6, - - PERF_COUNT_HW_CACHE_MAX, /* non-ABI */ -}; - -enum perf_hw_cache_op_id { - PERF_COUNT_HW_CACHE_OP_READ = 0, - PERF_COUNT_HW_CACHE_OP_WRITE = 1, - PERF_COUNT_HW_CACHE_OP_PREFETCH = 2, - - PERF_COUNT_HW_CACHE_OP_MAX, /* non-ABI */ -}; - -enum perf_hw_cache_op_result_id { - PERF_COUNT_HW_CACHE_RESULT_ACCESS = 0, - PERF_COUNT_HW_CACHE_RESULT_MISS = 1, - - PERF_COUNT_HW_CACHE_RESULT_MAX, /* non-ABI */ -}; - -/* - * Special "software" events provided by the kernel, even if the hardware - * does not support performance events. These events measure various - * physical and sw events of the kernel (and allow the profiling of them as - * well): - */ -enum perf_sw_ids { - PERF_COUNT_SW_CPU_CLOCK = 0, - PERF_COUNT_SW_TASK_CLOCK = 1, - PERF_COUNT_SW_PAGE_FAULTS = 2, - PERF_COUNT_SW_CONTEXT_SWITCHES = 3, - PERF_COUNT_SW_CPU_MIGRATIONS = 4, - PERF_COUNT_SW_PAGE_FAULTS_MIN = 5, - PERF_COUNT_SW_PAGE_FAULTS_MAJ = 6, - PERF_COUNT_SW_ALIGNMENT_FAULTS = 7, - PERF_COUNT_SW_EMULATION_FAULTS = 8, - PERF_COUNT_SW_DUMMY = 9, - PERF_COUNT_SW_BPF_OUTPUT = 10, - PERF_COUNT_SW_CGROUP_SWITCHES = 11, - - PERF_COUNT_SW_MAX, /* non-ABI */ -}; - -/* - * Bits that can be set in attr.sample_type to request information - * in the overflow packets. - */ -enum perf_event_sample_format { - PERF_SAMPLE_IP = 1U << 0, - PERF_SAMPLE_TID = 1U << 1, - PERF_SAMPLE_TIME = 1U << 2, - PERF_SAMPLE_ADDR = 1U << 3, - PERF_SAMPLE_READ = 1U << 4, - PERF_SAMPLE_CALLCHAIN = 1U << 5, - PERF_SAMPLE_ID = 1U << 6, - PERF_SAMPLE_CPU = 1U << 7, - PERF_SAMPLE_PERIOD = 1U << 8, - PERF_SAMPLE_STREAM_ID = 1U << 9, - PERF_SAMPLE_RAW = 1U << 10, - PERF_SAMPLE_BRANCH_STACK = 1U << 11, - PERF_SAMPLE_REGS_USER = 1U << 12, - PERF_SAMPLE_STACK_USER = 1U << 13, - PERF_SAMPLE_WEIGHT = 1U << 14, - PERF_SAMPLE_DATA_SRC = 1U << 15, - PERF_SAMPLE_IDENTIFIER = 1U << 16, - PERF_SAMPLE_TRANSACTION = 1U << 17, - PERF_SAMPLE_REGS_INTR = 1U << 18, - PERF_SAMPLE_PHYS_ADDR = 1U << 19, - PERF_SAMPLE_AUX = 1U << 20, - PERF_SAMPLE_CGROUP = 1U << 21, - PERF_SAMPLE_DATA_PAGE_SIZE = 1U << 22, - PERF_SAMPLE_CODE_PAGE_SIZE = 1U << 23, - PERF_SAMPLE_WEIGHT_STRUCT = 1U << 24, - - PERF_SAMPLE_MAX = 1U << 25, /* non-ABI */ - - __PERF_SAMPLE_CALLCHAIN_EARLY = 1ULL << 63, /* non-ABI; internal use */ -}; - -#define PERF_SAMPLE_WEIGHT_TYPE (PERF_SAMPLE_WEIGHT | PERF_SAMPLE_WEIGHT_STRUCT) -/* - * values to program into branch_sample_type when PERF_SAMPLE_BRANCH is set - * - * If the user does not pass priv level information via branch_sample_type, - * the kernel uses the event's priv level. Branch and event priv levels do - * not have to match. Branch priv level is checked for permissions. - * - * The branch types can be combined, however BRANCH_ANY covers all types - * of branches and therefore it supersedes all the other types. - */ -enum perf_branch_sample_type_shift { - PERF_SAMPLE_BRANCH_USER_SHIFT = 0, /* user branches */ - PERF_SAMPLE_BRANCH_KERNEL_SHIFT = 1, /* kernel branches */ - PERF_SAMPLE_BRANCH_HV_SHIFT = 2, /* hypervisor branches */ - - PERF_SAMPLE_BRANCH_ANY_SHIFT = 3, /* any branch types */ - PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT = 4, /* any call branch */ - PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT = 5, /* any return branch */ - PERF_SAMPLE_BRANCH_IND_CALL_SHIFT = 6, /* indirect calls */ - PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT = 7, /* transaction aborts */ - PERF_SAMPLE_BRANCH_IN_TX_SHIFT = 8, /* in transaction */ - PERF_SAMPLE_BRANCH_NO_TX_SHIFT = 9, /* not in transaction */ - PERF_SAMPLE_BRANCH_COND_SHIFT = 10, /* conditional branches */ - - PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT = 11, /* call/ret stack */ - PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT = 12, /* indirect jumps */ - PERF_SAMPLE_BRANCH_CALL_SHIFT = 13, /* direct call */ - - PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT = 14, /* no flags */ - PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT = 15, /* no cycles */ - - PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT = 16, /* save branch type */ - - PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT = 17, /* save low level index of raw branch records */ - - PERF_SAMPLE_BRANCH_MAX_SHIFT /* non-ABI */ -}; - -enum perf_branch_sample_type { - PERF_SAMPLE_BRANCH_USER = 1U << PERF_SAMPLE_BRANCH_USER_SHIFT, - PERF_SAMPLE_BRANCH_KERNEL = 1U << PERF_SAMPLE_BRANCH_KERNEL_SHIFT, - PERF_SAMPLE_BRANCH_HV = 1U << PERF_SAMPLE_BRANCH_HV_SHIFT, - - PERF_SAMPLE_BRANCH_ANY = 1U << PERF_SAMPLE_BRANCH_ANY_SHIFT, - PERF_SAMPLE_BRANCH_ANY_CALL = 1U << PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT, - PERF_SAMPLE_BRANCH_ANY_RETURN = 1U << PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT, - PERF_SAMPLE_BRANCH_IND_CALL = 1U << PERF_SAMPLE_BRANCH_IND_CALL_SHIFT, - PERF_SAMPLE_BRANCH_ABORT_TX = 1U << PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT, - PERF_SAMPLE_BRANCH_IN_TX = 1U << PERF_SAMPLE_BRANCH_IN_TX_SHIFT, - PERF_SAMPLE_BRANCH_NO_TX = 1U << PERF_SAMPLE_BRANCH_NO_TX_SHIFT, - PERF_SAMPLE_BRANCH_COND = 1U << PERF_SAMPLE_BRANCH_COND_SHIFT, - - PERF_SAMPLE_BRANCH_CALL_STACK = 1U << PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT, - PERF_SAMPLE_BRANCH_IND_JUMP = 1U << PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT, - PERF_SAMPLE_BRANCH_CALL = 1U << PERF_SAMPLE_BRANCH_CALL_SHIFT, - - PERF_SAMPLE_BRANCH_NO_FLAGS = 1U << PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT, - PERF_SAMPLE_BRANCH_NO_CYCLES = 1U << PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT, - - PERF_SAMPLE_BRANCH_TYPE_SAVE = - 1U << PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT, - - PERF_SAMPLE_BRANCH_HW_INDEX = 1U << PERF_SAMPLE_BRANCH_HW_INDEX_SHIFT, - - PERF_SAMPLE_BRANCH_MAX = 1U << PERF_SAMPLE_BRANCH_MAX_SHIFT, -}; - -/* - * Common flow change classification - */ -enum { - PERF_BR_UNKNOWN = 0, /* unknown */ - PERF_BR_COND = 1, /* conditional */ - PERF_BR_UNCOND = 2, /* unconditional */ - PERF_BR_IND = 3, /* indirect */ - PERF_BR_CALL = 4, /* function call */ - PERF_BR_IND_CALL = 5, /* indirect function call */ - PERF_BR_RET = 6, /* function return */ - PERF_BR_SYSCALL = 7, /* syscall */ - PERF_BR_SYSRET = 8, /* syscall return */ - PERF_BR_COND_CALL = 9, /* conditional function call */ - PERF_BR_COND_RET = 10, /* conditional function return */ - PERF_BR_ERET = 11, /* exception return */ - PERF_BR_IRQ = 12, /* irq */ - PERF_BR_MAX, -}; - -#define PERF_SAMPLE_BRANCH_PLM_ALL \ - (PERF_SAMPLE_BRANCH_USER|\ - PERF_SAMPLE_BRANCH_KERNEL|\ - PERF_SAMPLE_BRANCH_HV) - -/* - * Values to determine ABI of the registers dump. - */ -enum perf_sample_regs_abi { - PERF_SAMPLE_REGS_ABI_NONE = 0, - PERF_SAMPLE_REGS_ABI_32 = 1, - PERF_SAMPLE_REGS_ABI_64 = 2, -}; - -/* - * Values for the memory transaction event qualifier, mostly for - * abort events. Multiple bits can be set. - */ -enum { - PERF_TXN_ELISION = (1 << 0), /* From elision */ - PERF_TXN_TRANSACTION = (1 << 1), /* From transaction */ - PERF_TXN_SYNC = (1 << 2), /* Instruction is related */ - PERF_TXN_ASYNC = (1 << 3), /* Instruction not related */ - PERF_TXN_RETRY = (1 << 4), /* Retry possible */ - PERF_TXN_CONFLICT = (1 << 5), /* Conflict abort */ - PERF_TXN_CAPACITY_WRITE = (1 << 6), /* Capacity write abort */ - PERF_TXN_CAPACITY_READ = (1 << 7), /* Capacity read abort */ - - PERF_TXN_MAX = (1 << 8), /* non-ABI */ - - /* bits 32..63 are reserved for the abort code */ - - PERF_TXN_ABORT_MASK = (0xffffffffULL << 32), - PERF_TXN_ABORT_SHIFT = 32, -}; - -/* - * The format of the data returned by read() on a perf event fd, - * as specified by attr.read_format: - * - * struct read_format { - * { u64 value; - * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED - * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING - * { u64 id; } && PERF_FORMAT_ID - * } && !PERF_FORMAT_GROUP - * - * { u64 nr; - * { u64 time_enabled; } && PERF_FORMAT_TOTAL_TIME_ENABLED - * { u64 time_running; } && PERF_FORMAT_TOTAL_TIME_RUNNING - * { u64 value; - * { u64 id; } && PERF_FORMAT_ID - * } cntr[nr]; - * } && PERF_FORMAT_GROUP - * }; - */ -enum perf_event_read_format { - PERF_FORMAT_TOTAL_TIME_ENABLED = 1U << 0, - PERF_FORMAT_TOTAL_TIME_RUNNING = 1U << 1, - PERF_FORMAT_ID = 1U << 2, - PERF_FORMAT_GROUP = 1U << 3, - - PERF_FORMAT_MAX = 1U << 4, /* non-ABI */ -}; - -#define PERF_ATTR_SIZE_VER0 64 /* sizeof first published struct */ -#define PERF_ATTR_SIZE_VER1 72 /* add: config2 */ -#define PERF_ATTR_SIZE_VER2 80 /* add: branch_sample_type */ -#define PERF_ATTR_SIZE_VER3 96 /* add: sample_regs_user */ - /* add: sample_stack_user */ -#define PERF_ATTR_SIZE_VER4 104 /* add: sample_regs_intr */ -#define PERF_ATTR_SIZE_VER5 112 /* add: aux_watermark */ -#define PERF_ATTR_SIZE_VER6 120 /* add: aux_sample_size */ -#define PERF_ATTR_SIZE_VER7 128 /* add: sig_data */ - -/* - * Hardware event_id to monitor via a performance monitoring event: - * - * @sample_max_stack: Max number of frame pointers in a callchain, - * should be < /proc/sys/kernel/perf_event_max_stack - */ -struct perf_event_attr { - - /* - * Major type: hardware/software/tracepoint/etc. - */ - __u32 type; - - /* - * Size of the attr structure, for fwd/bwd compat. - */ - __u32 size; - - /* - * Type specific configuration information. - */ - __u64 config; - - union { - __u64 sample_period; - __u64 sample_freq; - }; - - __u64 sample_type; - __u64 read_format; - - __u64 disabled : 1, /* off by default */ - inherit : 1, /* children inherit it */ - pinned : 1, /* must always be on PMU */ - exclusive : 1, /* only group on PMU */ - exclude_user : 1, /* don't count user */ - exclude_kernel : 1, /* ditto kernel */ - exclude_hv : 1, /* ditto hypervisor */ - exclude_idle : 1, /* don't count when idle */ - mmap : 1, /* include mmap data */ - comm : 1, /* include comm data */ - freq : 1, /* use freq, not period */ - inherit_stat : 1, /* per task counts */ - enable_on_exec : 1, /* next exec enables */ - task : 1, /* trace fork/exit */ - watermark : 1, /* wakeup_watermark */ - /* - * precise_ip: - * - * 0 - SAMPLE_IP can have arbitrary skid - * 1 - SAMPLE_IP must have constant skid - * 2 - SAMPLE_IP requested to have 0 skid - * 3 - SAMPLE_IP must have 0 skid - * - * See also PERF_RECORD_MISC_EXACT_IP - */ - precise_ip : 2, /* skid constraint */ - mmap_data : 1, /* non-exec mmap data */ - sample_id_all : 1, /* sample_type all events */ - - exclude_host : 1, /* don't count in host */ - exclude_guest : 1, /* don't count in guest */ - - exclude_callchain_kernel : 1, /* exclude kernel callchains */ - exclude_callchain_user : 1, /* exclude user callchains */ - mmap2 : 1, /* include mmap with inode data */ - comm_exec : 1, /* flag comm events that are due to an exec */ - use_clockid : 1, /* use @clockid for time fields */ - context_switch : 1, /* context switch data */ - write_backward : 1, /* Write ring buffer from end to beginning */ - namespaces : 1, /* include namespaces data */ - ksymbol : 1, /* include ksymbol events */ - bpf_event : 1, /* include bpf events */ - aux_output : 1, /* generate AUX records instead of events */ - cgroup : 1, /* include cgroup events */ - text_poke : 1, /* include text poke events */ - build_id : 1, /* use build id in mmap2 events */ - inherit_thread : 1, /* children only inherit if cloned with CLONE_THREAD */ - remove_on_exec : 1, /* event is removed from task on exec */ - sigtrap : 1, /* send synchronous SIGTRAP on event */ - __reserved_1 : 26; - - union { - __u32 wakeup_events; /* wakeup every n events */ - __u32 wakeup_watermark; /* bytes before wakeup */ - }; - - __u32 bp_type; - union { - __u64 bp_addr; - __u64 kprobe_func; /* for perf_kprobe */ - __u64 uprobe_path; /* for perf_uprobe */ - __u64 config1; /* extension of config */ - }; - union { - __u64 bp_len; - __u64 kprobe_addr; /* when kprobe_func == NULL */ - __u64 probe_offset; /* for perf_[k,u]probe */ - __u64 config2; /* extension of config1 */ - }; - __u64 branch_sample_type; /* enum perf_branch_sample_type */ - - /* - * Defines set of user regs to dump on samples. - * See asm/perf_regs.h for details. - */ - __u64 sample_regs_user; - - /* - * Defines size of the user stack to dump on samples. - */ - __u32 sample_stack_user; - - __s32 clockid; - /* - * Defines set of regs to dump for each sample - * state captured on: - * - precise = 0: PMU interrupt - * - precise > 0: sampled instruction - * - * See asm/perf_regs.h for details. - */ - __u64 sample_regs_intr; - - /* - * Wakeup watermark for AUX area - */ - __u32 aux_watermark; - __u16 sample_max_stack; - __u16 __reserved_2; - __u32 aux_sample_size; - __u32 __reserved_3; - - /* - * User provided data if sigtrap=1, passed back to user via - * siginfo_t::si_perf_data, e.g. to permit user to identify the event. - * Note, siginfo_t::si_perf_data is long-sized, and sig_data will be - * truncated accordingly on 32 bit architectures. - */ - __u64 sig_data; -}; - -/* - * Structure used by below PERF_EVENT_IOC_QUERY_BPF command - * to query bpf programs attached to the same perf tracepoint - * as the given perf event. - */ -struct perf_event_query_bpf { - /* - * The below ids array length - */ - __u32 ids_len; - /* - * Set by the kernel to indicate the number of - * available programs - */ - __u32 prog_cnt; - /* - * User provided buffer to store program ids - */ - __u32 ids[0]; -}; - -/* - * Ioctls that can be done on a perf event fd: - */ -#define PERF_EVENT_IOC_ENABLE _IO ('$', 0) -#define PERF_EVENT_IOC_DISABLE _IO ('$', 1) -#define PERF_EVENT_IOC_REFRESH _IO ('$', 2) -#define PERF_EVENT_IOC_RESET _IO ('$', 3) -#define PERF_EVENT_IOC_PERIOD _IOW('$', 4, __u64) -#define PERF_EVENT_IOC_SET_OUTPUT _IO ('$', 5) -#define PERF_EVENT_IOC_SET_FILTER _IOW('$', 6, char *) -#define PERF_EVENT_IOC_ID _IOR('$', 7, __u64 *) -#define PERF_EVENT_IOC_SET_BPF _IOW('$', 8, __u32) -#define PERF_EVENT_IOC_PAUSE_OUTPUT _IOW('$', 9, __u32) -#define PERF_EVENT_IOC_QUERY_BPF _IOWR('$', 10, struct perf_event_query_bpf *) -#define PERF_EVENT_IOC_MODIFY_ATTRIBUTES _IOW('$', 11, struct perf_event_attr *) - -enum perf_event_ioc_flags { - PERF_IOC_FLAG_GROUP = 1U << 0, -}; - -/* - * Structure of the page that can be mapped via mmap - */ -struct perf_event_mmap_page { - __u32 version; /* version number of this structure */ - __u32 compat_version; /* lowest version this is compat with */ - - /* - * Bits needed to read the hw events in user-space. - * - * u32 seq, time_mult, time_shift, index, width; - * u64 count, enabled, running; - * u64 cyc, time_offset; - * s64 pmc = 0; - * - * do { - * seq = pc->lock; - * barrier() - * - * enabled = pc->time_enabled; - * running = pc->time_running; - * - * if (pc->cap_usr_time && enabled != running) { - * cyc = rdtsc(); - * time_offset = pc->time_offset; - * time_mult = pc->time_mult; - * time_shift = pc->time_shift; - * } - * - * index = pc->index; - * count = pc->offset; - * if (pc->cap_user_rdpmc && index) { - * width = pc->pmc_width; - * pmc = rdpmc(index - 1); - * } - * - * barrier(); - * } while (pc->lock != seq); - * - * NOTE: for obvious reason this only works on self-monitoring - * processes. - */ - __u32 lock; /* seqlock for synchronization */ - __u32 index; /* hardware event identifier */ - __s64 offset; /* add to hardware event value */ - __u64 time_enabled; /* time event active */ - __u64 time_running; /* time event on cpu */ - union { - __u64 capabilities; - struct { - __u64 cap_bit0 : 1, /* Always 0, deprecated, see commit 860f085b74e9 */ - cap_bit0_is_deprecated : 1, /* Always 1, signals that bit 0 is zero */ - - cap_user_rdpmc : 1, /* The RDPMC instruction can be used to read counts */ - cap_user_time : 1, /* The time_{shift,mult,offset} fields are used */ - cap_user_time_zero : 1, /* The time_zero field is used */ - cap_user_time_short : 1, /* the time_{cycle,mask} fields are used */ - cap_____res : 58; - }; - }; - - /* - * If cap_user_rdpmc this field provides the bit-width of the value - * read using the rdpmc() or equivalent instruction. This can be used - * to sign extend the result like: - * - * pmc <<= 64 - width; - * pmc >>= 64 - width; // signed shift right - * count += pmc; - */ - __u16 pmc_width; - - /* - * If cap_usr_time the below fields can be used to compute the time - * delta since time_enabled (in ns) using rdtsc or similar. - * - * u64 quot, rem; - * u64 delta; - * - * quot = (cyc >> time_shift); - * rem = cyc & (((u64)1 << time_shift) - 1); - * delta = time_offset + quot * time_mult + - * ((rem * time_mult) >> time_shift); - * - * Where time_offset,time_mult,time_shift and cyc are read in the - * seqcount loop described above. This delta can then be added to - * enabled and possible running (if index), improving the scaling: - * - * enabled += delta; - * if (index) - * running += delta; - * - * quot = count / running; - * rem = count % running; - * count = quot * enabled + (rem * enabled) / running; - */ - __u16 time_shift; - __u32 time_mult; - __u64 time_offset; - /* - * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated - * from sample timestamps. - * - * time = timestamp - time_zero; - * quot = time / time_mult; - * rem = time % time_mult; - * cyc = (quot << time_shift) + (rem << time_shift) / time_mult; - * - * And vice versa: - * - * quot = cyc >> time_shift; - * rem = cyc & (((u64)1 << time_shift) - 1); - * timestamp = time_zero + quot * time_mult + - * ((rem * time_mult) >> time_shift); - */ - __u64 time_zero; - - __u32 size; /* Header size up to __reserved[] fields. */ - __u32 __reserved_1; - - /* - * If cap_usr_time_short, the hardware clock is less than 64bit wide - * and we must compute the 'cyc' value, as used by cap_usr_time, as: - * - * cyc = time_cycles + ((cyc - time_cycles) & time_mask) - * - * NOTE: this form is explicitly chosen such that cap_usr_time_short - * is a correction on top of cap_usr_time, and code that doesn't - * know about cap_usr_time_short still works under the assumption - * the counter doesn't wrap. - */ - __u64 time_cycles; - __u64 time_mask; - - /* - * Hole for extension of the self monitor capabilities - */ - - __u8 __reserved[116*8]; /* align to 1k. */ - - /* - * Control data for the mmap() data buffer. - * - * User-space reading the @data_head value should issue an smp_rmb(), - * after reading this value. - * - * When the mapping is PROT_WRITE the @data_tail value should be - * written by userspace to reflect the last read data, after issueing - * an smp_mb() to separate the data read from the ->data_tail store. - * In this case the kernel will not over-write unread data. - * - * See perf_output_put_handle() for the data ordering. - * - * data_{offset,size} indicate the location and size of the perf record - * buffer within the mmapped area. - */ - __u64 data_head; /* head in the data section */ - __u64 data_tail; /* user-space written tail */ - __u64 data_offset; /* where the buffer starts */ - __u64 data_size; /* data buffer size */ - - /* - * AUX area is defined by aux_{offset,size} fields that should be set - * by the userspace, so that - * - * aux_offset >= data_offset + data_size - * - * prior to mmap()ing it. Size of the mmap()ed area should be aux_size. - * - * Ring buffer pointers aux_{head,tail} have the same semantics as - * data_{head,tail} and same ordering rules apply. - */ - __u64 aux_head; - __u64 aux_tail; - __u64 aux_offset; - __u64 aux_size; -}; - -/* - * The current state of perf_event_header::misc bits usage: - * ('|' used bit, '-' unused bit) - * - * 012 CDEF - * |||---------|||| - * - * Where: - * 0-2 CPUMODE_MASK - * - * C PROC_MAP_PARSE_TIMEOUT - * D MMAP_DATA / COMM_EXEC / FORK_EXEC / SWITCH_OUT - * E MMAP_BUILD_ID / EXACT_IP / SCHED_OUT_PREEMPT - * F (reserved) - */ - -#define PERF_RECORD_MISC_CPUMODE_MASK (7 << 0) -#define PERF_RECORD_MISC_CPUMODE_UNKNOWN (0 << 0) -#define PERF_RECORD_MISC_KERNEL (1 << 0) -#define PERF_RECORD_MISC_USER (2 << 0) -#define PERF_RECORD_MISC_HYPERVISOR (3 << 0) -#define PERF_RECORD_MISC_GUEST_KERNEL (4 << 0) -#define PERF_RECORD_MISC_GUEST_USER (5 << 0) - -/* - * Indicates that /proc/PID/maps parsing are truncated by time out. - */ -#define PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT (1 << 12) -/* - * Following PERF_RECORD_MISC_* are used on different - * events, so can reuse the same bit position: - * - * PERF_RECORD_MISC_MMAP_DATA - PERF_RECORD_MMAP* events - * PERF_RECORD_MISC_COMM_EXEC - PERF_RECORD_COMM event - * PERF_RECORD_MISC_FORK_EXEC - PERF_RECORD_FORK event (perf internal) - * PERF_RECORD_MISC_SWITCH_OUT - PERF_RECORD_SWITCH* events - */ -#define PERF_RECORD_MISC_MMAP_DATA (1 << 13) -#define PERF_RECORD_MISC_COMM_EXEC (1 << 13) -#define PERF_RECORD_MISC_FORK_EXEC (1 << 13) -#define PERF_RECORD_MISC_SWITCH_OUT (1 << 13) -/* - * These PERF_RECORD_MISC_* flags below are safely reused - * for the following events: - * - * PERF_RECORD_MISC_EXACT_IP - PERF_RECORD_SAMPLE of precise events - * PERF_RECORD_MISC_SWITCH_OUT_PREEMPT - PERF_RECORD_SWITCH* events - * PERF_RECORD_MISC_MMAP_BUILD_ID - PERF_RECORD_MMAP2 event - * - * - * PERF_RECORD_MISC_EXACT_IP: - * Indicates that the content of PERF_SAMPLE_IP points to - * the actual instruction that triggered the event. See also - * perf_event_attr::precise_ip. - * - * PERF_RECORD_MISC_SWITCH_OUT_PREEMPT: - * Indicates that thread was preempted in TASK_RUNNING state. - * - * PERF_RECORD_MISC_MMAP_BUILD_ID: - * Indicates that mmap2 event carries build id data. - */ -#define PERF_RECORD_MISC_EXACT_IP (1 << 14) -#define PERF_RECORD_MISC_SWITCH_OUT_PREEMPT (1 << 14) -#define PERF_RECORD_MISC_MMAP_BUILD_ID (1 << 14) -/* - * Reserve the last bit to indicate some extended misc field - */ -#define PERF_RECORD_MISC_EXT_RESERVED (1 << 15) - -struct perf_event_header { - __u32 type; - __u16 misc; - __u16 size; -}; - -struct perf_ns_link_info { - __u64 dev; - __u64 ino; -}; - -enum { - NET_NS_INDEX = 0, - UTS_NS_INDEX = 1, - IPC_NS_INDEX = 2, - PID_NS_INDEX = 3, - USER_NS_INDEX = 4, - MNT_NS_INDEX = 5, - CGROUP_NS_INDEX = 6, - - NR_NAMESPACES, /* number of available namespaces */ -}; - -enum perf_event_type { - - /* - * If perf_event_attr.sample_id_all is set then all event types will - * have the sample_type selected fields related to where/when - * (identity) an event took place (TID, TIME, ID, STREAM_ID, CPU, - * IDENTIFIER) described in PERF_RECORD_SAMPLE below, it will be stashed - * just after the perf_event_header and the fields already present for - * the existing fields, i.e. at the end of the payload. That way a newer - * perf.data file will be supported by older perf tools, with these new - * optional fields being ignored. - * - * struct sample_id { - * { u32 pid, tid; } && PERF_SAMPLE_TID - * { u64 time; } && PERF_SAMPLE_TIME - * { u64 id; } && PERF_SAMPLE_ID - * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID - * { u32 cpu, res; } && PERF_SAMPLE_CPU - * { u64 id; } && PERF_SAMPLE_IDENTIFIER - * } && perf_event_attr::sample_id_all - * - * Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. The - * advantage of PERF_SAMPLE_IDENTIFIER is that its position is fixed - * relative to header.size. - */ - - /* - * The MMAP events record the PROT_EXEC mappings so that we can - * correlate userspace IPs to code. They have the following structure: - * - * struct { - * struct perf_event_header header; - * - * u32 pid, tid; - * u64 addr; - * u64 len; - * u64 pgoff; - * char filename[]; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_MMAP = 1, - - /* - * struct { - * struct perf_event_header header; - * u64 id; - * u64 lost; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_LOST = 2, - - /* - * struct { - * struct perf_event_header header; - * - * u32 pid, tid; - * char comm[]; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_COMM = 3, - - /* - * struct { - * struct perf_event_header header; - * u32 pid, ppid; - * u32 tid, ptid; - * u64 time; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_EXIT = 4, - - /* - * struct { - * struct perf_event_header header; - * u64 time; - * u64 id; - * u64 stream_id; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_THROTTLE = 5, - PERF_RECORD_UNTHROTTLE = 6, - - /* - * struct { - * struct perf_event_header header; - * u32 pid, ppid; - * u32 tid, ptid; - * u64 time; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_FORK = 7, - - /* - * struct { - * struct perf_event_header header; - * u32 pid, tid; - * - * struct read_format values; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_READ = 8, - - /* - * struct { - * struct perf_event_header header; - * - * # - * # Note that PERF_SAMPLE_IDENTIFIER duplicates PERF_SAMPLE_ID. - * # The advantage of PERF_SAMPLE_IDENTIFIER is that its position - * # is fixed relative to header. - * # - * - * { u64 id; } && PERF_SAMPLE_IDENTIFIER - * { u64 ip; } && PERF_SAMPLE_IP - * { u32 pid, tid; } && PERF_SAMPLE_TID - * { u64 time; } && PERF_SAMPLE_TIME - * { u64 addr; } && PERF_SAMPLE_ADDR - * { u64 id; } && PERF_SAMPLE_ID - * { u64 stream_id;} && PERF_SAMPLE_STREAM_ID - * { u32 cpu, res; } && PERF_SAMPLE_CPU - * { u64 period; } && PERF_SAMPLE_PERIOD - * - * { struct read_format values; } && PERF_SAMPLE_READ - * - * { u64 nr, - * u64 ips[nr]; } && PERF_SAMPLE_CALLCHAIN - * - * # - * # The RAW record below is opaque data wrt the ABI - * # - * # That is, the ABI doesn't make any promises wrt to - * # the stability of its content, it may vary depending - * # on event, hardware, kernel version and phase of - * # the moon. - * # - * # In other words, PERF_SAMPLE_RAW contents are not an ABI. - * # - * - * { u32 size; - * char data[size];}&& PERF_SAMPLE_RAW - * - * { u64 nr; - * { u64 hw_idx; } && PERF_SAMPLE_BRANCH_HW_INDEX - * { u64 from, to, flags } lbr[nr]; - * } && PERF_SAMPLE_BRANCH_STACK - * - * { u64 abi; # enum perf_sample_regs_abi - * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_USER - * - * { u64 size; - * char data[size]; - * u64 dyn_size; } && PERF_SAMPLE_STACK_USER - * - * { union perf_sample_weight - * { - * u64 full; && PERF_SAMPLE_WEIGHT - * #if defined(__LITTLE_ENDIAN_BITFIELD) - * struct { - * u32 var1_dw; - * u16 var2_w; - * u16 var3_w; - * } && PERF_SAMPLE_WEIGHT_STRUCT - * #elif defined(__BIG_ENDIAN_BITFIELD) - * struct { - * u16 var3_w; - * u16 var2_w; - * u32 var1_dw; - * } && PERF_SAMPLE_WEIGHT_STRUCT - * #endif - * } - * } - * { u64 data_src; } && PERF_SAMPLE_DATA_SRC - * { u64 transaction; } && PERF_SAMPLE_TRANSACTION - * { u64 abi; # enum perf_sample_regs_abi - * u64 regs[weight(mask)]; } && PERF_SAMPLE_REGS_INTR - * { u64 phys_addr;} && PERF_SAMPLE_PHYS_ADDR - * { u64 size; - * char data[size]; } && PERF_SAMPLE_AUX - * { u64 data_page_size;} && PERF_SAMPLE_DATA_PAGE_SIZE - * { u64 code_page_size;} && PERF_SAMPLE_CODE_PAGE_SIZE - * }; - */ - PERF_RECORD_SAMPLE = 9, - - /* - * The MMAP2 records are an augmented version of MMAP, they add - * maj, min, ino numbers to be used to uniquely identify each mapping - * - * struct { - * struct perf_event_header header; - * - * u32 pid, tid; - * u64 addr; - * u64 len; - * u64 pgoff; - * union { - * struct { - * u32 maj; - * u32 min; - * u64 ino; - * u64 ino_generation; - * }; - * struct { - * u8 build_id_size; - * u8 __reserved_1; - * u16 __reserved_2; - * u8 build_id[20]; - * }; - * }; - * u32 prot, flags; - * char filename[]; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_MMAP2 = 10, - - /* - * Records that new data landed in the AUX buffer part. - * - * struct { - * struct perf_event_header header; - * - * u64 aux_offset; - * u64 aux_size; - * u64 flags; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_AUX = 11, - - /* - * Indicates that instruction trace has started - * - * struct { - * struct perf_event_header header; - * u32 pid; - * u32 tid; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_ITRACE_START = 12, - - /* - * Records the dropped/lost sample number. - * - * struct { - * struct perf_event_header header; - * - * u64 lost; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_LOST_SAMPLES = 13, - - /* - * Records a context switch in or out (flagged by - * PERF_RECORD_MISC_SWITCH_OUT). See also - * PERF_RECORD_SWITCH_CPU_WIDE. - * - * struct { - * struct perf_event_header header; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_SWITCH = 14, - - /* - * CPU-wide version of PERF_RECORD_SWITCH with next_prev_pid and - * next_prev_tid that are the next (switching out) or previous - * (switching in) pid/tid. - * - * struct { - * struct perf_event_header header; - * u32 next_prev_pid; - * u32 next_prev_tid; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_SWITCH_CPU_WIDE = 15, - - /* - * struct { - * struct perf_event_header header; - * u32 pid; - * u32 tid; - * u64 nr_namespaces; - * { u64 dev, inode; } [nr_namespaces]; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_NAMESPACES = 16, - - /* - * Record ksymbol register/unregister events: - * - * struct { - * struct perf_event_header header; - * u64 addr; - * u32 len; - * u16 ksym_type; - * u16 flags; - * char name[]; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_KSYMBOL = 17, - - /* - * Record bpf events: - * enum perf_bpf_event_type { - * PERF_BPF_EVENT_UNKNOWN = 0, - * PERF_BPF_EVENT_PROG_LOAD = 1, - * PERF_BPF_EVENT_PROG_UNLOAD = 2, - * }; - * - * struct { - * struct perf_event_header header; - * u16 type; - * u16 flags; - * u32 id; - * u8 tag[BPF_TAG_SIZE]; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_BPF_EVENT = 18, - - /* - * struct { - * struct perf_event_header header; - * u64 id; - * char path[]; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_CGROUP = 19, - - /* - * Records changes to kernel text i.e. self-modified code. 'old_len' is - * the number of old bytes, 'new_len' is the number of new bytes. Either - * 'old_len' or 'new_len' may be zero to indicate, for example, the - * addition or removal of a trampoline. 'bytes' contains the old bytes - * followed immediately by the new bytes. - * - * struct { - * struct perf_event_header header; - * u64 addr; - * u16 old_len; - * u16 new_len; - * u8 bytes[]; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_TEXT_POKE = 20, - - /* - * Data written to the AUX area by hardware due to aux_output, may need - * to be matched to the event by an architecture-specific hardware ID. - * This records the hardware ID, but requires sample_id to provide the - * event ID. e.g. Intel PT uses this record to disambiguate PEBS-via-PT - * records from multiple events. - * - * struct { - * struct perf_event_header header; - * u64 hw_id; - * struct sample_id sample_id; - * }; - */ - PERF_RECORD_AUX_OUTPUT_HW_ID = 21, - - PERF_RECORD_MAX, /* non-ABI */ -}; - -enum perf_record_ksymbol_type { - PERF_RECORD_KSYMBOL_TYPE_UNKNOWN = 0, - PERF_RECORD_KSYMBOL_TYPE_BPF = 1, - /* - * Out of line code such as kprobe-replaced instructions or optimized - * kprobes or ftrace trampolines. - */ - PERF_RECORD_KSYMBOL_TYPE_OOL = 2, - PERF_RECORD_KSYMBOL_TYPE_MAX /* non-ABI */ -}; - -#define PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER (1 << 0) - -enum perf_bpf_event_type { - PERF_BPF_EVENT_UNKNOWN = 0, - PERF_BPF_EVENT_PROG_LOAD = 1, - PERF_BPF_EVENT_PROG_UNLOAD = 2, - PERF_BPF_EVENT_MAX, /* non-ABI */ -}; - -#define PERF_MAX_STACK_DEPTH 127 -#define PERF_MAX_CONTEXTS_PER_STACK 8 - -enum perf_callchain_context { - PERF_CONTEXT_HV = (__u64)-32, - PERF_CONTEXT_KERNEL = (__u64)-128, - PERF_CONTEXT_USER = (__u64)-512, - - PERF_CONTEXT_GUEST = (__u64)-2048, - PERF_CONTEXT_GUEST_KERNEL = (__u64)-2176, - PERF_CONTEXT_GUEST_USER = (__u64)-2560, - - PERF_CONTEXT_MAX = (__u64)-4095, -}; - -/** - * PERF_RECORD_AUX::flags bits - */ -#define PERF_AUX_FLAG_TRUNCATED 0x01 /* record was truncated to fit */ -#define PERF_AUX_FLAG_OVERWRITE 0x02 /* snapshot from overwrite mode */ -#define PERF_AUX_FLAG_PARTIAL 0x04 /* record contains gaps */ -#define PERF_AUX_FLAG_COLLISION 0x08 /* sample collided with another */ -#define PERF_AUX_FLAG_PMU_FORMAT_TYPE_MASK 0xff00 /* PMU specific trace format type */ - -/* CoreSight PMU AUX buffer formats */ -#define PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT 0x0000 /* Default for backward compatibility */ -#define PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW 0x0100 /* Raw format of the source */ - -#define PERF_FLAG_FD_NO_GROUP (1UL << 0) -#define PERF_FLAG_FD_OUTPUT (1UL << 1) -#define PERF_FLAG_PID_CGROUP (1UL << 2) /* pid=cgroup id, per-cpu mode only */ -#define PERF_FLAG_FD_CLOEXEC (1UL << 3) /* O_CLOEXEC */ - -#if defined(__LITTLE_ENDIAN_BITFIELD) -union perf_mem_data_src { - __u64 val; - struct { - __u64 mem_op:5, /* type of opcode */ - mem_lvl:14, /* memory hierarchy level */ - mem_snoop:5, /* snoop mode */ - mem_lock:2, /* lock instr */ - mem_dtlb:7, /* tlb access */ - mem_lvl_num:4, /* memory hierarchy level number */ - mem_remote:1, /* remote */ - mem_snoopx:2, /* snoop mode, ext */ - mem_blk:3, /* access blocked */ - mem_hops:3, /* hop level */ - mem_rsvd:18; - }; -}; -#elif defined(__BIG_ENDIAN_BITFIELD) -union perf_mem_data_src { - __u64 val; - struct { - __u64 mem_rsvd:18, - mem_hops:3, /* hop level */ - mem_blk:3, /* access blocked */ - mem_snoopx:2, /* snoop mode, ext */ - mem_remote:1, /* remote */ - mem_lvl_num:4, /* memory hierarchy level number */ - mem_dtlb:7, /* tlb access */ - mem_lock:2, /* lock instr */ - mem_snoop:5, /* snoop mode */ - mem_lvl:14, /* memory hierarchy level */ - mem_op:5; /* type of opcode */ - }; -}; -#else -#error "Unknown endianness" -#endif - -/* type of opcode (load/store/prefetch,code) */ -#define PERF_MEM_OP_NA 0x01 /* not available */ -#define PERF_MEM_OP_LOAD 0x02 /* load instruction */ -#define PERF_MEM_OP_STORE 0x04 /* store instruction */ -#define PERF_MEM_OP_PFETCH 0x08 /* prefetch */ -#define PERF_MEM_OP_EXEC 0x10 /* code (execution) */ -#define PERF_MEM_OP_SHIFT 0 - -/* - * PERF_MEM_LVL_* namespace being depricated to some extent in the - * favour of newer composite PERF_MEM_{LVLNUM_,REMOTE_,SNOOPX_} fields. - * Supporting this namespace inorder to not break defined ABIs. - * - * memory hierarchy (memory level, hit or miss) - */ -#define PERF_MEM_LVL_NA 0x01 /* not available */ -#define PERF_MEM_LVL_HIT 0x02 /* hit level */ -#define PERF_MEM_LVL_MISS 0x04 /* miss level */ -#define PERF_MEM_LVL_L1 0x08 /* L1 */ -#define PERF_MEM_LVL_LFB 0x10 /* Line Fill Buffer */ -#define PERF_MEM_LVL_L2 0x20 /* L2 */ -#define PERF_MEM_LVL_L3 0x40 /* L3 */ -#define PERF_MEM_LVL_LOC_RAM 0x80 /* Local DRAM */ -#define PERF_MEM_LVL_REM_RAM1 0x100 /* Remote DRAM (1 hop) */ -#define PERF_MEM_LVL_REM_RAM2 0x200 /* Remote DRAM (2 hops) */ -#define PERF_MEM_LVL_REM_CCE1 0x400 /* Remote Cache (1 hop) */ -#define PERF_MEM_LVL_REM_CCE2 0x800 /* Remote Cache (2 hops) */ -#define PERF_MEM_LVL_IO 0x1000 /* I/O memory */ -#define PERF_MEM_LVL_UNC 0x2000 /* Uncached memory */ -#define PERF_MEM_LVL_SHIFT 5 - -#define PERF_MEM_REMOTE_REMOTE 0x01 /* Remote */ -#define PERF_MEM_REMOTE_SHIFT 37 - -#define PERF_MEM_LVLNUM_L1 0x01 /* L1 */ -#define PERF_MEM_LVLNUM_L2 0x02 /* L2 */ -#define PERF_MEM_LVLNUM_L3 0x03 /* L3 */ -#define PERF_MEM_LVLNUM_L4 0x04 /* L4 */ -/* 5-0xa available */ -#define PERF_MEM_LVLNUM_ANY_CACHE 0x0b /* Any cache */ -#define PERF_MEM_LVLNUM_LFB 0x0c /* LFB */ -#define PERF_MEM_LVLNUM_RAM 0x0d /* RAM */ -#define PERF_MEM_LVLNUM_PMEM 0x0e /* PMEM */ -#define PERF_MEM_LVLNUM_NA 0x0f /* N/A */ - -#define PERF_MEM_LVLNUM_SHIFT 33 - -/* snoop mode */ -#define PERF_MEM_SNOOP_NA 0x01 /* not available */ -#define PERF_MEM_SNOOP_NONE 0x02 /* no snoop */ -#define PERF_MEM_SNOOP_HIT 0x04 /* snoop hit */ -#define PERF_MEM_SNOOP_MISS 0x08 /* snoop miss */ -#define PERF_MEM_SNOOP_HITM 0x10 /* snoop hit modified */ -#define PERF_MEM_SNOOP_SHIFT 19 - -#define PERF_MEM_SNOOPX_FWD 0x01 /* forward */ -/* 1 free */ -#define PERF_MEM_SNOOPX_SHIFT 38 - -/* locked instruction */ -#define PERF_MEM_LOCK_NA 0x01 /* not available */ -#define PERF_MEM_LOCK_LOCKED 0x02 /* locked transaction */ -#define PERF_MEM_LOCK_SHIFT 24 - -/* TLB access */ -#define PERF_MEM_TLB_NA 0x01 /* not available */ -#define PERF_MEM_TLB_HIT 0x02 /* hit level */ -#define PERF_MEM_TLB_MISS 0x04 /* miss level */ -#define PERF_MEM_TLB_L1 0x08 /* L1 */ -#define PERF_MEM_TLB_L2 0x10 /* L2 */ -#define PERF_MEM_TLB_WK 0x20 /* Hardware Walker*/ -#define PERF_MEM_TLB_OS 0x40 /* OS fault handler */ -#define PERF_MEM_TLB_SHIFT 26 - -/* Access blocked */ -#define PERF_MEM_BLK_NA 0x01 /* not available */ -#define PERF_MEM_BLK_DATA 0x02 /* data could not be forwarded */ -#define PERF_MEM_BLK_ADDR 0x04 /* address conflict */ -#define PERF_MEM_BLK_SHIFT 40 - -/* hop level */ -#define PERF_MEM_HOPS_0 0x01 /* remote core, same node */ -#define PERF_MEM_HOPS_1 0x02 /* remote node, same socket */ -#define PERF_MEM_HOPS_2 0x03 /* remote socket, same board */ -#define PERF_MEM_HOPS_3 0x04 /* remote board */ -/* 5-7 available */ -#define PERF_MEM_HOPS_SHIFT 43 - -#define PERF_MEM_S(a, s) \ - (((__u64)PERF_MEM_##a##_##s) << PERF_MEM_##a##_SHIFT) - -/* - * single taken branch record layout: - * - * from: source instruction (may not always be a branch insn) - * to: branch target - * mispred: branch target was mispredicted - * predicted: branch target was predicted - * - * support for mispred, predicted is optional. In case it - * is not supported mispred = predicted = 0. - * - * in_tx: running in a hardware transaction - * abort: aborting a hardware transaction - * cycles: cycles from last branch (or 0 if not supported) - * type: branch type - */ -struct perf_branch_entry { - __u64 from; - __u64 to; - __u64 mispred:1, /* target mispredicted */ - predicted:1,/* target predicted */ - in_tx:1, /* in transaction */ - abort:1, /* transaction abort */ - cycles:16, /* cycle count to last branch */ - type:4, /* branch type */ - reserved:40; -}; - -union perf_sample_weight { - __u64 full; -#if defined(__LITTLE_ENDIAN_BITFIELD) - struct { - __u32 var1_dw; - __u16 var2_w; - __u16 var3_w; - }; -#elif defined(__BIG_ENDIAN_BITFIELD) - struct { - __u16 var3_w; - __u16 var2_w; - __u32 var1_dw; - }; -#else -#error "Unknown endianness" -#endif -}; - -#endif /* _UAPI_LINUX_PERF_EVENT_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/pkt_cls.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/pkt_cls.h deleted file mode 100644 index ca9d6f3..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/pkt_cls.h +++ /dev/null @@ -1,612 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef __LINUX_PKT_CLS_H -#define __LINUX_PKT_CLS_H - -#include -#include - -#define TC_COOKIE_MAX_SIZE 16 - -/* Action attributes */ -enum { - TCA_ACT_UNSPEC, - TCA_ACT_KIND, - TCA_ACT_OPTIONS, - TCA_ACT_INDEX, - TCA_ACT_STATS, - TCA_ACT_PAD, - TCA_ACT_COOKIE, - __TCA_ACT_MAX -}; - -#define TCA_ACT_MAX __TCA_ACT_MAX -#define TCA_OLD_COMPAT (TCA_ACT_MAX+1) -#define TCA_ACT_MAX_PRIO 32 -#define TCA_ACT_BIND 1 -#define TCA_ACT_NOBIND 0 -#define TCA_ACT_UNBIND 1 -#define TCA_ACT_NOUNBIND 0 -#define TCA_ACT_REPLACE 1 -#define TCA_ACT_NOREPLACE 0 - -#define TC_ACT_UNSPEC (-1) -#define TC_ACT_OK 0 -#define TC_ACT_RECLASSIFY 1 -#define TC_ACT_SHOT 2 -#define TC_ACT_PIPE 3 -#define TC_ACT_STOLEN 4 -#define TC_ACT_QUEUED 5 -#define TC_ACT_REPEAT 6 -#define TC_ACT_REDIRECT 7 -#define TC_ACT_TRAP 8 /* For hw path, this means "trap to cpu" - * and don't further process the frame - * in hardware. For sw path, this is - * equivalent of TC_ACT_STOLEN - drop - * the skb and act like everything - * is alright. - */ -#define TC_ACT_VALUE_MAX TC_ACT_TRAP - -/* There is a special kind of actions called "extended actions", - * which need a value parameter. These have a local opcode located in - * the highest nibble, starting from 1. The rest of the bits - * are used to carry the value. These two parts together make - * a combined opcode. - */ -#define __TC_ACT_EXT_SHIFT 28 -#define __TC_ACT_EXT(local) ((local) << __TC_ACT_EXT_SHIFT) -#define TC_ACT_EXT_VAL_MASK ((1 << __TC_ACT_EXT_SHIFT) - 1) -#define TC_ACT_EXT_OPCODE(combined) ((combined) & (~TC_ACT_EXT_VAL_MASK)) -#define TC_ACT_EXT_CMP(combined, opcode) (TC_ACT_EXT_OPCODE(combined) == opcode) - -#define TC_ACT_JUMP __TC_ACT_EXT(1) -#define TC_ACT_GOTO_CHAIN __TC_ACT_EXT(2) -#define TC_ACT_EXT_OPCODE_MAX TC_ACT_GOTO_CHAIN - -/* Action type identifiers*/ -enum { - TCA_ID_UNSPEC=0, - TCA_ID_POLICE=1, - /* other actions go here */ - __TCA_ID_MAX=255 -}; - -#define TCA_ID_MAX __TCA_ID_MAX - -struct tc_police { - __u32 index; - int action; -#define TC_POLICE_UNSPEC TC_ACT_UNSPEC -#define TC_POLICE_OK TC_ACT_OK -#define TC_POLICE_RECLASSIFY TC_ACT_RECLASSIFY -#define TC_POLICE_SHOT TC_ACT_SHOT -#define TC_POLICE_PIPE TC_ACT_PIPE - - __u32 limit; - __u32 burst; - __u32 mtu; - struct tc_ratespec rate; - struct tc_ratespec peakrate; - int refcnt; - int bindcnt; - __u32 capab; -}; - -struct tcf_t { - __u64 install; - __u64 lastuse; - __u64 expires; - __u64 firstuse; -}; - -struct tc_cnt { - int refcnt; - int bindcnt; -}; - -#define tc_gen \ - __u32 index; \ - __u32 capab; \ - int action; \ - int refcnt; \ - int bindcnt - -enum { - TCA_POLICE_UNSPEC, - TCA_POLICE_TBF, - TCA_POLICE_RATE, - TCA_POLICE_PEAKRATE, - TCA_POLICE_AVRATE, - TCA_POLICE_RESULT, - TCA_POLICE_TM, - TCA_POLICE_PAD, - __TCA_POLICE_MAX -#define TCA_POLICE_RESULT TCA_POLICE_RESULT -}; - -#define TCA_POLICE_MAX (__TCA_POLICE_MAX - 1) - -/* tca flags definitions */ -#define TCA_CLS_FLAGS_SKIP_HW (1 << 0) /* don't offload filter to HW */ -#define TCA_CLS_FLAGS_SKIP_SW (1 << 1) /* don't use filter in SW */ -#define TCA_CLS_FLAGS_IN_HW (1 << 2) /* filter is offloaded to HW */ -#define TCA_CLS_FLAGS_NOT_IN_HW (1 << 3) /* filter isn't offloaded to HW */ -#define TCA_CLS_FLAGS_VERBOSE (1 << 4) /* verbose logging */ - -/* U32 filters */ - -#define TC_U32_HTID(h) ((h)&0xFFF00000) -#define TC_U32_USERHTID(h) (TC_U32_HTID(h)>>20) -#define TC_U32_HASH(h) (((h)>>12)&0xFF) -#define TC_U32_NODE(h) ((h)&0xFFF) -#define TC_U32_KEY(h) ((h)&0xFFFFF) -#define TC_U32_UNSPEC 0 -#define TC_U32_ROOT (0xFFF00000) - -enum { - TCA_U32_UNSPEC, - TCA_U32_CLASSID, - TCA_U32_HASH, - TCA_U32_LINK, - TCA_U32_DIVISOR, - TCA_U32_SEL, - TCA_U32_POLICE, - TCA_U32_ACT, - TCA_U32_INDEV, - TCA_U32_PCNT, - TCA_U32_MARK, - TCA_U32_FLAGS, - TCA_U32_PAD, - __TCA_U32_MAX -}; - -#define TCA_U32_MAX (__TCA_U32_MAX - 1) - -struct tc_u32_key { - __be32 mask; - __be32 val; - int off; - int offmask; -}; - -struct tc_u32_sel { - unsigned char flags; - unsigned char offshift; - unsigned char nkeys; - - __be16 offmask; - __u16 off; - short offoff; - - short hoff; - __be32 hmask; - struct tc_u32_key keys[0]; -}; - -struct tc_u32_mark { - __u32 val; - __u32 mask; - __u32 success; -}; - -struct tc_u32_pcnt { - __u64 rcnt; - __u64 rhit; - __u64 kcnts[0]; -}; - -/* Flags */ - -#define TC_U32_TERMINAL 1 -#define TC_U32_OFFSET 2 -#define TC_U32_VAROFFSET 4 -#define TC_U32_EAT 8 - -#define TC_U32_MAXDEPTH 8 - - -/* RSVP filter */ - -enum { - TCA_RSVP_UNSPEC, - TCA_RSVP_CLASSID, - TCA_RSVP_DST, - TCA_RSVP_SRC, - TCA_RSVP_PINFO, - TCA_RSVP_POLICE, - TCA_RSVP_ACT, - __TCA_RSVP_MAX -}; - -#define TCA_RSVP_MAX (__TCA_RSVP_MAX - 1 ) - -struct tc_rsvp_gpi { - __u32 key; - __u32 mask; - int offset; -}; - -struct tc_rsvp_pinfo { - struct tc_rsvp_gpi dpi; - struct tc_rsvp_gpi spi; - __u8 protocol; - __u8 tunnelid; - __u8 tunnelhdr; - __u8 pad; -}; - -/* ROUTE filter */ - -enum { - TCA_ROUTE4_UNSPEC, - TCA_ROUTE4_CLASSID, - TCA_ROUTE4_TO, - TCA_ROUTE4_FROM, - TCA_ROUTE4_IIF, - TCA_ROUTE4_POLICE, - TCA_ROUTE4_ACT, - __TCA_ROUTE4_MAX -}; - -#define TCA_ROUTE4_MAX (__TCA_ROUTE4_MAX - 1) - - -/* FW filter */ - -enum { - TCA_FW_UNSPEC, - TCA_FW_CLASSID, - TCA_FW_POLICE, - TCA_FW_INDEV, - TCA_FW_ACT, /* used by CONFIG_NET_CLS_ACT */ - TCA_FW_MASK, - __TCA_FW_MAX -}; - -#define TCA_FW_MAX (__TCA_FW_MAX - 1) - -/* TC index filter */ - -enum { - TCA_TCINDEX_UNSPEC, - TCA_TCINDEX_HASH, - TCA_TCINDEX_MASK, - TCA_TCINDEX_SHIFT, - TCA_TCINDEX_FALL_THROUGH, - TCA_TCINDEX_CLASSID, - TCA_TCINDEX_POLICE, - TCA_TCINDEX_ACT, - __TCA_TCINDEX_MAX -}; - -#define TCA_TCINDEX_MAX (__TCA_TCINDEX_MAX - 1) - -/* Flow filter */ - -enum { - FLOW_KEY_SRC, - FLOW_KEY_DST, - FLOW_KEY_PROTO, - FLOW_KEY_PROTO_SRC, - FLOW_KEY_PROTO_DST, - FLOW_KEY_IIF, - FLOW_KEY_PRIORITY, - FLOW_KEY_MARK, - FLOW_KEY_NFCT, - FLOW_KEY_NFCT_SRC, - FLOW_KEY_NFCT_DST, - FLOW_KEY_NFCT_PROTO_SRC, - FLOW_KEY_NFCT_PROTO_DST, - FLOW_KEY_RTCLASSID, - FLOW_KEY_SKUID, - FLOW_KEY_SKGID, - FLOW_KEY_VLAN_TAG, - FLOW_KEY_RXHASH, - __FLOW_KEY_MAX, -}; - -#define FLOW_KEY_MAX (__FLOW_KEY_MAX - 1) - -enum { - FLOW_MODE_MAP, - FLOW_MODE_HASH, -}; - -enum { - TCA_FLOW_UNSPEC, - TCA_FLOW_KEYS, - TCA_FLOW_MODE, - TCA_FLOW_BASECLASS, - TCA_FLOW_RSHIFT, - TCA_FLOW_ADDEND, - TCA_FLOW_MASK, - TCA_FLOW_XOR, - TCA_FLOW_DIVISOR, - TCA_FLOW_ACT, - TCA_FLOW_POLICE, - TCA_FLOW_EMATCHES, - TCA_FLOW_PERTURB, - __TCA_FLOW_MAX -}; - -#define TCA_FLOW_MAX (__TCA_FLOW_MAX - 1) - -/* Basic filter */ - -enum { - TCA_BASIC_UNSPEC, - TCA_BASIC_CLASSID, - TCA_BASIC_EMATCHES, - TCA_BASIC_ACT, - TCA_BASIC_POLICE, - __TCA_BASIC_MAX -}; - -#define TCA_BASIC_MAX (__TCA_BASIC_MAX - 1) - - -/* Cgroup classifier */ - -enum { - TCA_CGROUP_UNSPEC, - TCA_CGROUP_ACT, - TCA_CGROUP_POLICE, - TCA_CGROUP_EMATCHES, - __TCA_CGROUP_MAX, -}; - -#define TCA_CGROUP_MAX (__TCA_CGROUP_MAX - 1) - -/* BPF classifier */ - -#define TCA_BPF_FLAG_ACT_DIRECT (1 << 0) - -enum { - TCA_BPF_UNSPEC, - TCA_BPF_ACT, - TCA_BPF_POLICE, - TCA_BPF_CLASSID, - TCA_BPF_OPS_LEN, - TCA_BPF_OPS, - TCA_BPF_FD, - TCA_BPF_NAME, - TCA_BPF_FLAGS, - TCA_BPF_FLAGS_GEN, - TCA_BPF_TAG, - TCA_BPF_ID, - __TCA_BPF_MAX, -}; - -#define TCA_BPF_MAX (__TCA_BPF_MAX - 1) - -/* Flower classifier */ - -enum { - TCA_FLOWER_UNSPEC, - TCA_FLOWER_CLASSID, - TCA_FLOWER_INDEV, - TCA_FLOWER_ACT, - TCA_FLOWER_KEY_ETH_DST, /* ETH_ALEN */ - TCA_FLOWER_KEY_ETH_DST_MASK, /* ETH_ALEN */ - TCA_FLOWER_KEY_ETH_SRC, /* ETH_ALEN */ - TCA_FLOWER_KEY_ETH_SRC_MASK, /* ETH_ALEN */ - TCA_FLOWER_KEY_ETH_TYPE, /* be16 */ - TCA_FLOWER_KEY_IP_PROTO, /* u8 */ - TCA_FLOWER_KEY_IPV4_SRC, /* be32 */ - TCA_FLOWER_KEY_IPV4_SRC_MASK, /* be32 */ - TCA_FLOWER_KEY_IPV4_DST, /* be32 */ - TCA_FLOWER_KEY_IPV4_DST_MASK, /* be32 */ - TCA_FLOWER_KEY_IPV6_SRC, /* struct in6_addr */ - TCA_FLOWER_KEY_IPV6_SRC_MASK, /* struct in6_addr */ - TCA_FLOWER_KEY_IPV6_DST, /* struct in6_addr */ - TCA_FLOWER_KEY_IPV6_DST_MASK, /* struct in6_addr */ - TCA_FLOWER_KEY_TCP_SRC, /* be16 */ - TCA_FLOWER_KEY_TCP_DST, /* be16 */ - TCA_FLOWER_KEY_UDP_SRC, /* be16 */ - TCA_FLOWER_KEY_UDP_DST, /* be16 */ - - TCA_FLOWER_FLAGS, - TCA_FLOWER_KEY_VLAN_ID, /* be16 */ - TCA_FLOWER_KEY_VLAN_PRIO, /* u8 */ - TCA_FLOWER_KEY_VLAN_ETH_TYPE, /* be16 */ - - TCA_FLOWER_KEY_ENC_KEY_ID, /* be32 */ - TCA_FLOWER_KEY_ENC_IPV4_SRC, /* be32 */ - TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK,/* be32 */ - TCA_FLOWER_KEY_ENC_IPV4_DST, /* be32 */ - TCA_FLOWER_KEY_ENC_IPV4_DST_MASK,/* be32 */ - TCA_FLOWER_KEY_ENC_IPV6_SRC, /* struct in6_addr */ - TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK,/* struct in6_addr */ - TCA_FLOWER_KEY_ENC_IPV6_DST, /* struct in6_addr */ - TCA_FLOWER_KEY_ENC_IPV6_DST_MASK,/* struct in6_addr */ - - TCA_FLOWER_KEY_TCP_SRC_MASK, /* be16 */ - TCA_FLOWER_KEY_TCP_DST_MASK, /* be16 */ - TCA_FLOWER_KEY_UDP_SRC_MASK, /* be16 */ - TCA_FLOWER_KEY_UDP_DST_MASK, /* be16 */ - TCA_FLOWER_KEY_SCTP_SRC_MASK, /* be16 */ - TCA_FLOWER_KEY_SCTP_DST_MASK, /* be16 */ - - TCA_FLOWER_KEY_SCTP_SRC, /* be16 */ - TCA_FLOWER_KEY_SCTP_DST, /* be16 */ - - TCA_FLOWER_KEY_ENC_UDP_SRC_PORT, /* be16 */ - TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK, /* be16 */ - TCA_FLOWER_KEY_ENC_UDP_DST_PORT, /* be16 */ - TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK, /* be16 */ - - TCA_FLOWER_KEY_FLAGS, /* be32 */ - TCA_FLOWER_KEY_FLAGS_MASK, /* be32 */ - - TCA_FLOWER_KEY_ICMPV4_CODE, /* u8 */ - TCA_FLOWER_KEY_ICMPV4_CODE_MASK,/* u8 */ - TCA_FLOWER_KEY_ICMPV4_TYPE, /* u8 */ - TCA_FLOWER_KEY_ICMPV4_TYPE_MASK,/* u8 */ - TCA_FLOWER_KEY_ICMPV6_CODE, /* u8 */ - TCA_FLOWER_KEY_ICMPV6_CODE_MASK,/* u8 */ - TCA_FLOWER_KEY_ICMPV6_TYPE, /* u8 */ - TCA_FLOWER_KEY_ICMPV6_TYPE_MASK,/* u8 */ - - TCA_FLOWER_KEY_ARP_SIP, /* be32 */ - TCA_FLOWER_KEY_ARP_SIP_MASK, /* be32 */ - TCA_FLOWER_KEY_ARP_TIP, /* be32 */ - TCA_FLOWER_KEY_ARP_TIP_MASK, /* be32 */ - TCA_FLOWER_KEY_ARP_OP, /* u8 */ - TCA_FLOWER_KEY_ARP_OP_MASK, /* u8 */ - TCA_FLOWER_KEY_ARP_SHA, /* ETH_ALEN */ - TCA_FLOWER_KEY_ARP_SHA_MASK, /* ETH_ALEN */ - TCA_FLOWER_KEY_ARP_THA, /* ETH_ALEN */ - TCA_FLOWER_KEY_ARP_THA_MASK, /* ETH_ALEN */ - - TCA_FLOWER_KEY_MPLS_TTL, /* u8 - 8 bits */ - TCA_FLOWER_KEY_MPLS_BOS, /* u8 - 1 bit */ - TCA_FLOWER_KEY_MPLS_TC, /* u8 - 3 bits */ - TCA_FLOWER_KEY_MPLS_LABEL, /* be32 - 20 bits */ - - TCA_FLOWER_KEY_TCP_FLAGS, /* be16 */ - TCA_FLOWER_KEY_TCP_FLAGS_MASK, /* be16 */ - - TCA_FLOWER_KEY_IP_TOS, /* u8 */ - TCA_FLOWER_KEY_IP_TOS_MASK, /* u8 */ - TCA_FLOWER_KEY_IP_TTL, /* u8 */ - TCA_FLOWER_KEY_IP_TTL_MASK, /* u8 */ - - TCA_FLOWER_KEY_CVLAN_ID, /* be16 */ - TCA_FLOWER_KEY_CVLAN_PRIO, /* u8 */ - TCA_FLOWER_KEY_CVLAN_ETH_TYPE, /* be16 */ - - TCA_FLOWER_KEY_ENC_IP_TOS, /* u8 */ - TCA_FLOWER_KEY_ENC_IP_TOS_MASK, /* u8 */ - TCA_FLOWER_KEY_ENC_IP_TTL, /* u8 */ - TCA_FLOWER_KEY_ENC_IP_TTL_MASK, /* u8 */ - - TCA_FLOWER_KEY_ENC_OPTS, - TCA_FLOWER_KEY_ENC_OPTS_MASK, - - TCA_FLOWER_IN_HW_COUNT, - - __TCA_FLOWER_MAX, -}; - -#define TCA_FLOWER_MAX (__TCA_FLOWER_MAX - 1) - -enum { - TCA_FLOWER_KEY_ENC_OPTS_UNSPEC, - TCA_FLOWER_KEY_ENC_OPTS_GENEVE, /* Nested - * TCA_FLOWER_KEY_ENC_OPT_GENEVE_ - * attributes - */ - __TCA_FLOWER_KEY_ENC_OPTS_MAX, -}; - -#define TCA_FLOWER_KEY_ENC_OPTS_MAX (__TCA_FLOWER_KEY_ENC_OPTS_MAX - 1) - -enum { - TCA_FLOWER_KEY_ENC_OPT_GENEVE_UNSPEC, - TCA_FLOWER_KEY_ENC_OPT_GENEVE_CLASS, /* u16 */ - TCA_FLOWER_KEY_ENC_OPT_GENEVE_TYPE, /* u8 */ - TCA_FLOWER_KEY_ENC_OPT_GENEVE_DATA, /* 4 to 128 bytes */ - - __TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX, -}; - -#define TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX \ - (__TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX - 1) - -enum { - TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0), - TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1), -}; - -/* Match-all classifier */ - -enum { - TCA_MATCHALL_UNSPEC, - TCA_MATCHALL_CLASSID, - TCA_MATCHALL_ACT, - TCA_MATCHALL_FLAGS, - __TCA_MATCHALL_MAX, -}; - -#define TCA_MATCHALL_MAX (__TCA_MATCHALL_MAX - 1) - -/* Extended Matches */ - -struct tcf_ematch_tree_hdr { - __u16 nmatches; - __u16 progid; -}; - -enum { - TCA_EMATCH_TREE_UNSPEC, - TCA_EMATCH_TREE_HDR, - TCA_EMATCH_TREE_LIST, - __TCA_EMATCH_TREE_MAX -}; -#define TCA_EMATCH_TREE_MAX (__TCA_EMATCH_TREE_MAX - 1) - -struct tcf_ematch_hdr { - __u16 matchid; - __u16 kind; - __u16 flags; - __u16 pad; /* currently unused */ -}; - -/* 0 1 - * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 - * +-----------------------+-+-+---+ - * | Unused |S|I| R | - * +-----------------------+-+-+---+ - * - * R(2) ::= relation to next ematch - * where: 0 0 END (last ematch) - * 0 1 AND - * 1 0 OR - * 1 1 Unused (invalid) - * I(1) ::= invert result - * S(1) ::= simple payload - */ -#define TCF_EM_REL_END 0 -#define TCF_EM_REL_AND (1<<0) -#define TCF_EM_REL_OR (1<<1) -#define TCF_EM_INVERT (1<<2) -#define TCF_EM_SIMPLE (1<<3) - -#define TCF_EM_REL_MASK 3 -#define TCF_EM_REL_VALID(v) (((v) & TCF_EM_REL_MASK) != TCF_EM_REL_MASK) - -enum { - TCF_LAYER_LINK, - TCF_LAYER_NETWORK, - TCF_LAYER_TRANSPORT, - __TCF_LAYER_MAX -}; -#define TCF_LAYER_MAX (__TCF_LAYER_MAX - 1) - -/* Ematch type assignments - * 1..32767 Reserved for ematches inside kernel tree - * 32768..65535 Free to use, not reliable - */ -#define TCF_EM_CONTAINER 0 -#define TCF_EM_CMP 1 -#define TCF_EM_NBYTE 2 -#define TCF_EM_U32 3 -#define TCF_EM_META 4 -#define TCF_EM_TEXT 5 -#define TCF_EM_VLAN 6 -#define TCF_EM_CANID 7 -#define TCF_EM_IPSET 8 -#define TCF_EM_IPT 9 -#define TCF_EM_MAX 9 - -enum { - TCF_EM_PROG_TC -}; - -enum { - TCF_EM_OPND_EQ, - TCF_EM_OPND_GT, - TCF_EM_OPND_LT -}; - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/pkt_sched.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/pkt_sched.h deleted file mode 100644 index 9edc375..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/include/uapi/linux/pkt_sched.h +++ /dev/null @@ -1,1164 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ -#ifndef __LINUX_PKT_SCHED_H -#define __LINUX_PKT_SCHED_H - -#include - -/* Logical priority bands not depending on specific packet scheduler. - Every scheduler will map them to real traffic classes, if it has - no more precise mechanism to classify packets. - - These numbers have no special meaning, though their coincidence - with obsolete IPv6 values is not occasional :-). New IPv6 drafts - preferred full anarchy inspired by diffserv group. - - Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy - class, actually, as rule it will be handled with more care than - filler or even bulk. - */ - -#define TC_PRIO_BESTEFFORT 0 -#define TC_PRIO_FILLER 1 -#define TC_PRIO_BULK 2 -#define TC_PRIO_INTERACTIVE_BULK 4 -#define TC_PRIO_INTERACTIVE 6 -#define TC_PRIO_CONTROL 7 - -#define TC_PRIO_MAX 15 - -/* Generic queue statistics, available for all the elements. - Particular schedulers may have also their private records. - */ - -struct tc_stats { - __u64 bytes; /* Number of enqueued bytes */ - __u32 packets; /* Number of enqueued packets */ - __u32 drops; /* Packets dropped because of lack of resources */ - __u32 overlimits; /* Number of throttle events when this - * flow goes out of allocated bandwidth */ - __u32 bps; /* Current flow byte rate */ - __u32 pps; /* Current flow packet rate */ - __u32 qlen; - __u32 backlog; -}; - -struct tc_estimator { - signed char interval; - unsigned char ewma_log; -}; - -/* "Handles" - --------- - - All the traffic control objects have 32bit identifiers, or "handles". - - They can be considered as opaque numbers from user API viewpoint, - but actually they always consist of two fields: major and - minor numbers, which are interpreted by kernel specially, - that may be used by applications, though not recommended. - - F.e. qdisc handles always have minor number equal to zero, - classes (or flows) have major equal to parent qdisc major, and - minor uniquely identifying class inside qdisc. - - Macros to manipulate handles: - */ - -#define TC_H_MAJ_MASK (0xFFFF0000U) -#define TC_H_MIN_MASK (0x0000FFFFU) -#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK) -#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK) -#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK)) - -#define TC_H_UNSPEC (0U) -#define TC_H_ROOT (0xFFFFFFFFU) -#define TC_H_INGRESS (0xFFFFFFF1U) -#define TC_H_CLSACT TC_H_INGRESS - -#define TC_H_MIN_PRIORITY 0xFFE0U -#define TC_H_MIN_INGRESS 0xFFF2U -#define TC_H_MIN_EGRESS 0xFFF3U - -/* Need to corrospond to iproute2 tc/tc_core.h "enum link_layer" */ -enum tc_link_layer { - TC_LINKLAYER_UNAWARE, /* Indicate unaware old iproute2 util */ - TC_LINKLAYER_ETHERNET, - TC_LINKLAYER_ATM, -}; -#define TC_LINKLAYER_MASK 0x0F /* limit use to lower 4 bits */ - -struct tc_ratespec { - unsigned char cell_log; - __u8 linklayer; /* lower 4 bits */ - unsigned short overhead; - short cell_align; - unsigned short mpu; - __u32 rate; -}; - -#define TC_RTAB_SIZE 1024 - -struct tc_sizespec { - unsigned char cell_log; - unsigned char size_log; - short cell_align; - int overhead; - unsigned int linklayer; - unsigned int mpu; - unsigned int mtu; - unsigned int tsize; -}; - -enum { - TCA_STAB_UNSPEC, - TCA_STAB_BASE, - TCA_STAB_DATA, - __TCA_STAB_MAX -}; - -#define TCA_STAB_MAX (__TCA_STAB_MAX - 1) - -/* FIFO section */ - -struct tc_fifo_qopt { - __u32 limit; /* Queue length: bytes for bfifo, packets for pfifo */ -}; - -/* SKBPRIO section */ - -/* - * Priorities go from zero to (SKBPRIO_MAX_PRIORITY - 1). - * SKBPRIO_MAX_PRIORITY should be at least 64 in order for skbprio to be able - * to map one to one the DS field of IPV4 and IPV6 headers. - * Memory allocation grows linearly with SKBPRIO_MAX_PRIORITY. - */ - -#define SKBPRIO_MAX_PRIORITY 64 - -struct tc_skbprio_qopt { - __u32 limit; /* Queue length in packets. */ -}; - -/* PRIO section */ - -#define TCQ_PRIO_BANDS 16 -#define TCQ_MIN_PRIO_BANDS 2 - -struct tc_prio_qopt { - int bands; /* Number of bands */ - __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ -}; - -/* MULTIQ section */ - -struct tc_multiq_qopt { - __u16 bands; /* Number of bands */ - __u16 max_bands; /* Maximum number of queues */ -}; - -/* PLUG section */ - -#define TCQ_PLUG_BUFFER 0 -#define TCQ_PLUG_RELEASE_ONE 1 -#define TCQ_PLUG_RELEASE_INDEFINITE 2 -#define TCQ_PLUG_LIMIT 3 - -struct tc_plug_qopt { - /* TCQ_PLUG_BUFFER: Inset a plug into the queue and - * buffer any incoming packets - * TCQ_PLUG_RELEASE_ONE: Dequeue packets from queue head - * to beginning of the next plug. - * TCQ_PLUG_RELEASE_INDEFINITE: Dequeue all packets from queue. - * Stop buffering packets until the next TCQ_PLUG_BUFFER - * command is received (just act as a pass-thru queue). - * TCQ_PLUG_LIMIT: Increase/decrease queue size - */ - int action; - __u32 limit; -}; - -/* TBF section */ - -struct tc_tbf_qopt { - struct tc_ratespec rate; - struct tc_ratespec peakrate; - __u32 limit; - __u32 buffer; - __u32 mtu; -}; - -enum { - TCA_TBF_UNSPEC, - TCA_TBF_PARMS, - TCA_TBF_RTAB, - TCA_TBF_PTAB, - TCA_TBF_RATE64, - TCA_TBF_PRATE64, - TCA_TBF_BURST, - TCA_TBF_PBURST, - TCA_TBF_PAD, - __TCA_TBF_MAX, -}; - -#define TCA_TBF_MAX (__TCA_TBF_MAX - 1) - - -/* TEQL section */ - -/* TEQL does not require any parameters */ - -/* SFQ section */ - -struct tc_sfq_qopt { - unsigned quantum; /* Bytes per round allocated to flow */ - int perturb_period; /* Period of hash perturbation */ - __u32 limit; /* Maximal packets in queue */ - unsigned divisor; /* Hash divisor */ - unsigned flows; /* Maximal number of flows */ -}; - -struct tc_sfqred_stats { - __u32 prob_drop; /* Early drops, below max threshold */ - __u32 forced_drop; /* Early drops, after max threshold */ - __u32 prob_mark; /* Marked packets, below max threshold */ - __u32 forced_mark; /* Marked packets, after max threshold */ - __u32 prob_mark_head; /* Marked packets, below max threshold */ - __u32 forced_mark_head;/* Marked packets, after max threshold */ -}; - -struct tc_sfq_qopt_v1 { - struct tc_sfq_qopt v0; - unsigned int depth; /* max number of packets per flow */ - unsigned int headdrop; -/* SFQRED parameters */ - __u32 limit; /* HARD maximal flow queue length (bytes) */ - __u32 qth_min; /* Min average length threshold (bytes) */ - __u32 qth_max; /* Max average length threshold (bytes) */ - unsigned char Wlog; /* log(W) */ - unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ - unsigned char Scell_log; /* cell size for idle damping */ - unsigned char flags; - __u32 max_P; /* probability, high resolution */ -/* SFQRED stats */ - struct tc_sfqred_stats stats; -}; - - -struct tc_sfq_xstats { - __s32 allot; -}; - -/* RED section */ - -enum { - TCA_RED_UNSPEC, - TCA_RED_PARMS, - TCA_RED_STAB, - TCA_RED_MAX_P, - __TCA_RED_MAX, -}; - -#define TCA_RED_MAX (__TCA_RED_MAX - 1) - -struct tc_red_qopt { - __u32 limit; /* HARD maximal queue length (bytes) */ - __u32 qth_min; /* Min average length threshold (bytes) */ - __u32 qth_max; /* Max average length threshold (bytes) */ - unsigned char Wlog; /* log(W) */ - unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ - unsigned char Scell_log; /* cell size for idle damping */ - unsigned char flags; -#define TC_RED_ECN 1 -#define TC_RED_HARDDROP 2 -#define TC_RED_ADAPTATIVE 4 -}; - -struct tc_red_xstats { - __u32 early; /* Early drops */ - __u32 pdrop; /* Drops due to queue limits */ - __u32 other; /* Drops due to drop() calls */ - __u32 marked; /* Marked packets */ -}; - -/* GRED section */ - -#define MAX_DPs 16 - -enum { - TCA_GRED_UNSPEC, - TCA_GRED_PARMS, - TCA_GRED_STAB, - TCA_GRED_DPS, - TCA_GRED_MAX_P, - TCA_GRED_LIMIT, - TCA_GRED_VQ_LIST, /* nested TCA_GRED_VQ_ENTRY */ - __TCA_GRED_MAX, -}; - -#define TCA_GRED_MAX (__TCA_GRED_MAX - 1) - -enum { - TCA_GRED_VQ_ENTRY_UNSPEC, - TCA_GRED_VQ_ENTRY, /* nested TCA_GRED_VQ_* */ - __TCA_GRED_VQ_ENTRY_MAX, -}; -#define TCA_GRED_VQ_ENTRY_MAX (__TCA_GRED_VQ_ENTRY_MAX - 1) - -enum { - TCA_GRED_VQ_UNSPEC, - TCA_GRED_VQ_PAD, - TCA_GRED_VQ_DP, /* u32 */ - TCA_GRED_VQ_STAT_BYTES, /* u64 */ - TCA_GRED_VQ_STAT_PACKETS, /* u32 */ - TCA_GRED_VQ_STAT_BACKLOG, /* u32 */ - TCA_GRED_VQ_STAT_PROB_DROP, /* u32 */ - TCA_GRED_VQ_STAT_PROB_MARK, /* u32 */ - TCA_GRED_VQ_STAT_FORCED_DROP, /* u32 */ - TCA_GRED_VQ_STAT_FORCED_MARK, /* u32 */ - TCA_GRED_VQ_STAT_PDROP, /* u32 */ - TCA_GRED_VQ_STAT_OTHER, /* u32 */ - TCA_GRED_VQ_FLAGS, /* u32 */ - __TCA_GRED_VQ_MAX -}; - -#define TCA_GRED_VQ_MAX (__TCA_GRED_VQ_MAX - 1) - -struct tc_gred_qopt { - __u32 limit; /* HARD maximal queue length (bytes) */ - __u32 qth_min; /* Min average length threshold (bytes) */ - __u32 qth_max; /* Max average length threshold (bytes) */ - __u32 DP; /* up to 2^32 DPs */ - __u32 backlog; - __u32 qave; - __u32 forced; - __u32 early; - __u32 other; - __u32 pdrop; - __u8 Wlog; /* log(W) */ - __u8 Plog; /* log(P_max/(qth_max-qth_min)) */ - __u8 Scell_log; /* cell size for idle damping */ - __u8 prio; /* prio of this VQ */ - __u32 packets; - __u32 bytesin; -}; - -/* gred setup */ -struct tc_gred_sopt { - __u32 DPs; - __u32 def_DP; - __u8 grio; - __u8 flags; - __u16 pad1; -}; - -/* CHOKe section */ - -enum { - TCA_CHOKE_UNSPEC, - TCA_CHOKE_PARMS, - TCA_CHOKE_STAB, - TCA_CHOKE_MAX_P, - __TCA_CHOKE_MAX, -}; - -#define TCA_CHOKE_MAX (__TCA_CHOKE_MAX - 1) - -struct tc_choke_qopt { - __u32 limit; /* Hard queue length (packets) */ - __u32 qth_min; /* Min average threshold (packets) */ - __u32 qth_max; /* Max average threshold (packets) */ - unsigned char Wlog; /* log(W) */ - unsigned char Plog; /* log(P_max/(qth_max-qth_min)) */ - unsigned char Scell_log; /* cell size for idle damping */ - unsigned char flags; /* see RED flags */ -}; - -struct tc_choke_xstats { - __u32 early; /* Early drops */ - __u32 pdrop; /* Drops due to queue limits */ - __u32 other; /* Drops due to drop() calls */ - __u32 marked; /* Marked packets */ - __u32 matched; /* Drops due to flow match */ -}; - -/* HTB section */ -#define TC_HTB_NUMPRIO 8 -#define TC_HTB_MAXDEPTH 8 -#define TC_HTB_PROTOVER 3 /* the same as HTB and TC's major */ - -struct tc_htb_opt { - struct tc_ratespec rate; - struct tc_ratespec ceil; - __u32 buffer; - __u32 cbuffer; - __u32 quantum; - __u32 level; /* out only */ - __u32 prio; -}; -struct tc_htb_glob { - __u32 version; /* to match HTB/TC */ - __u32 rate2quantum; /* bps->quantum divisor */ - __u32 defcls; /* default class number */ - __u32 debug; /* debug flags */ - - /* stats */ - __u32 direct_pkts; /* count of non shaped packets */ -}; -enum { - TCA_HTB_UNSPEC, - TCA_HTB_PARMS, - TCA_HTB_INIT, - TCA_HTB_CTAB, - TCA_HTB_RTAB, - TCA_HTB_DIRECT_QLEN, - TCA_HTB_RATE64, - TCA_HTB_CEIL64, - TCA_HTB_PAD, - TCA_HTB_OFFLOAD, - __TCA_HTB_MAX, -}; - -#define TCA_HTB_MAX (__TCA_HTB_MAX - 1) - -struct tc_htb_xstats { - __u32 lends; - __u32 borrows; - __u32 giants; /* unused since 'Make HTB scheduler work with TSO.' */ - __s32 tokens; - __s32 ctokens; -}; - -/* HFSC section */ - -struct tc_hfsc_qopt { - __u16 defcls; /* default class */ -}; - -struct tc_service_curve { - __u32 m1; /* slope of the first segment in bps */ - __u32 d; /* x-projection of the first segment in us */ - __u32 m2; /* slope of the second segment in bps */ -}; - -struct tc_hfsc_stats { - __u64 work; /* total work done */ - __u64 rtwork; /* work done by real-time criteria */ - __u32 period; /* current period */ - __u32 level; /* class level in hierarchy */ -}; - -enum { - TCA_HFSC_UNSPEC, - TCA_HFSC_RSC, - TCA_HFSC_FSC, - TCA_HFSC_USC, - __TCA_HFSC_MAX, -}; - -#define TCA_HFSC_MAX (__TCA_HFSC_MAX - 1) - - -/* CBQ section */ - -#define TC_CBQ_MAXPRIO 8 -#define TC_CBQ_MAXLEVEL 8 -#define TC_CBQ_DEF_EWMA 5 - -struct tc_cbq_lssopt { - unsigned char change; - unsigned char flags; -#define TCF_CBQ_LSS_BOUNDED 1 -#define TCF_CBQ_LSS_ISOLATED 2 - unsigned char ewma_log; - unsigned char level; -#define TCF_CBQ_LSS_FLAGS 1 -#define TCF_CBQ_LSS_EWMA 2 -#define TCF_CBQ_LSS_MAXIDLE 4 -#define TCF_CBQ_LSS_MINIDLE 8 -#define TCF_CBQ_LSS_OFFTIME 0x10 -#define TCF_CBQ_LSS_AVPKT 0x20 - __u32 maxidle; - __u32 minidle; - __u32 offtime; - __u32 avpkt; -}; - -struct tc_cbq_wrropt { - unsigned char flags; - unsigned char priority; - unsigned char cpriority; - unsigned char __reserved; - __u32 allot; - __u32 weight; -}; - -struct tc_cbq_ovl { - unsigned char strategy; -#define TC_CBQ_OVL_CLASSIC 0 -#define TC_CBQ_OVL_DELAY 1 -#define TC_CBQ_OVL_LOWPRIO 2 -#define TC_CBQ_OVL_DROP 3 -#define TC_CBQ_OVL_RCLASSIC 4 - unsigned char priority2; - __u16 pad; - __u32 penalty; -}; - -struct tc_cbq_police { - unsigned char police; - unsigned char __res1; - unsigned short __res2; -}; - -struct tc_cbq_fopt { - __u32 split; - __u32 defmap; - __u32 defchange; -}; - -struct tc_cbq_xstats { - __u32 borrows; - __u32 overactions; - __s32 avgidle; - __s32 undertime; -}; - -enum { - TCA_CBQ_UNSPEC, - TCA_CBQ_LSSOPT, - TCA_CBQ_WRROPT, - TCA_CBQ_FOPT, - TCA_CBQ_OVL_STRATEGY, - TCA_CBQ_RATE, - TCA_CBQ_RTAB, - TCA_CBQ_POLICE, - __TCA_CBQ_MAX, -}; - -#define TCA_CBQ_MAX (__TCA_CBQ_MAX - 1) - -/* dsmark section */ - -enum { - TCA_DSMARK_UNSPEC, - TCA_DSMARK_INDICES, - TCA_DSMARK_DEFAULT_INDEX, - TCA_DSMARK_SET_TC_INDEX, - TCA_DSMARK_MASK, - TCA_DSMARK_VALUE, - __TCA_DSMARK_MAX, -}; - -#define TCA_DSMARK_MAX (__TCA_DSMARK_MAX - 1) - -/* ATM section */ - -enum { - TCA_ATM_UNSPEC, - TCA_ATM_FD, /* file/socket descriptor */ - TCA_ATM_PTR, /* pointer to descriptor - later */ - TCA_ATM_HDR, /* LL header */ - TCA_ATM_EXCESS, /* excess traffic class (0 for CLP) */ - TCA_ATM_ADDR, /* PVC address (for output only) */ - TCA_ATM_STATE, /* VC state (ATM_VS_*; for output only) */ - __TCA_ATM_MAX, -}; - -#define TCA_ATM_MAX (__TCA_ATM_MAX - 1) - -/* Network emulator */ - -enum { - TCA_NETEM_UNSPEC, - TCA_NETEM_CORR, - TCA_NETEM_DELAY_DIST, - TCA_NETEM_REORDER, - TCA_NETEM_CORRUPT, - TCA_NETEM_LOSS, - TCA_NETEM_RATE, - TCA_NETEM_ECN, - TCA_NETEM_RATE64, - TCA_NETEM_PAD, - TCA_NETEM_LATENCY64, - TCA_NETEM_JITTER64, - TCA_NETEM_SLOT, - TCA_NETEM_SLOT_DIST, - __TCA_NETEM_MAX, -}; - -#define TCA_NETEM_MAX (__TCA_NETEM_MAX - 1) - -struct tc_netem_qopt { - __u32 latency; /* added delay (us) */ - __u32 limit; /* fifo limit (packets) */ - __u32 loss; /* random packet loss (0=none ~0=100%) */ - __u32 gap; /* re-ordering gap (0 for none) */ - __u32 duplicate; /* random packet dup (0=none ~0=100%) */ - __u32 jitter; /* random jitter in latency (us) */ -}; - -struct tc_netem_corr { - __u32 delay_corr; /* delay correlation */ - __u32 loss_corr; /* packet loss correlation */ - __u32 dup_corr; /* duplicate correlation */ -}; - -struct tc_netem_reorder { - __u32 probability; - __u32 correlation; -}; - -struct tc_netem_corrupt { - __u32 probability; - __u32 correlation; -}; - -struct tc_netem_rate { - __u32 rate; /* byte/s */ - __s32 packet_overhead; - __u32 cell_size; - __s32 cell_overhead; -}; - -struct tc_netem_slot { - __s64 min_delay; /* nsec */ - __s64 max_delay; - __s32 max_packets; - __s32 max_bytes; - __s64 dist_delay; /* nsec */ - __s64 dist_jitter; /* nsec */ -}; - -enum { - NETEM_LOSS_UNSPEC, - NETEM_LOSS_GI, /* General Intuitive - 4 state model */ - NETEM_LOSS_GE, /* Gilbert Elliot models */ - __NETEM_LOSS_MAX -}; -#define NETEM_LOSS_MAX (__NETEM_LOSS_MAX - 1) - -/* State transition probabilities for 4 state model */ -struct tc_netem_gimodel { - __u32 p13; - __u32 p31; - __u32 p32; - __u32 p14; - __u32 p23; -}; - -/* Gilbert-Elliot models */ -struct tc_netem_gemodel { - __u32 p; - __u32 r; - __u32 h; - __u32 k1; -}; - -#define NETEM_DIST_SCALE 8192 -#define NETEM_DIST_MAX 16384 - -/* DRR */ - -enum { - TCA_DRR_UNSPEC, - TCA_DRR_QUANTUM, - __TCA_DRR_MAX -}; - -#define TCA_DRR_MAX (__TCA_DRR_MAX - 1) - -struct tc_drr_stats { - __u32 deficit; -}; - -/* MQPRIO */ -#define TC_QOPT_BITMASK 15 -#define TC_QOPT_MAX_QUEUE 16 - -enum { - TC_MQPRIO_HW_OFFLOAD_NONE, /* no offload requested */ - TC_MQPRIO_HW_OFFLOAD_TCS, /* offload TCs, no queue counts */ - __TC_MQPRIO_HW_OFFLOAD_MAX -}; - -#define TC_MQPRIO_HW_OFFLOAD_MAX (__TC_MQPRIO_HW_OFFLOAD_MAX - 1) - -enum { - TC_MQPRIO_MODE_DCB, - TC_MQPRIO_MODE_CHANNEL, - __TC_MQPRIO_MODE_MAX -}; - -#define __TC_MQPRIO_MODE_MAX (__TC_MQPRIO_MODE_MAX - 1) - -enum { - TC_MQPRIO_SHAPER_DCB, - TC_MQPRIO_SHAPER_BW_RATE, /* Add new shapers below */ - __TC_MQPRIO_SHAPER_MAX -}; - -#define __TC_MQPRIO_SHAPER_MAX (__TC_MQPRIO_SHAPER_MAX - 1) - -struct tc_mqprio_qopt { - __u8 num_tc; - __u8 prio_tc_map[TC_QOPT_BITMASK + 1]; - __u8 hw; - __u16 count[TC_QOPT_MAX_QUEUE]; - __u16 offset[TC_QOPT_MAX_QUEUE]; -}; - -#define TC_MQPRIO_F_MODE 0x1 -#define TC_MQPRIO_F_SHAPER 0x2 -#define TC_MQPRIO_F_MIN_RATE 0x4 -#define TC_MQPRIO_F_MAX_RATE 0x8 - -enum { - TCA_MQPRIO_UNSPEC, - TCA_MQPRIO_MODE, - TCA_MQPRIO_SHAPER, - TCA_MQPRIO_MIN_RATE64, - TCA_MQPRIO_MAX_RATE64, - __TCA_MQPRIO_MAX, -}; - -#define TCA_MQPRIO_MAX (__TCA_MQPRIO_MAX - 1) - -/* SFB */ - -enum { - TCA_SFB_UNSPEC, - TCA_SFB_PARMS, - __TCA_SFB_MAX, -}; - -#define TCA_SFB_MAX (__TCA_SFB_MAX - 1) - -/* - * Note: increment, decrement are Q0.16 fixed-point values. - */ -struct tc_sfb_qopt { - __u32 rehash_interval; /* delay between hash move, in ms */ - __u32 warmup_time; /* double buffering warmup time in ms (warmup_time < rehash_interval) */ - __u32 max; /* max len of qlen_min */ - __u32 bin_size; /* maximum queue length per bin */ - __u32 increment; /* probability increment, (d1 in Blue) */ - __u32 decrement; /* probability decrement, (d2 in Blue) */ - __u32 limit; /* max SFB queue length */ - __u32 penalty_rate; /* inelastic flows are rate limited to 'rate' pps */ - __u32 penalty_burst; -}; - -struct tc_sfb_xstats { - __u32 earlydrop; - __u32 penaltydrop; - __u32 bucketdrop; - __u32 queuedrop; - __u32 childdrop; /* drops in child qdisc */ - __u32 marked; - __u32 maxqlen; - __u32 maxprob; - __u32 avgprob; -}; - -#define SFB_MAX_PROB 0xFFFF - -/* QFQ */ -enum { - TCA_QFQ_UNSPEC, - TCA_QFQ_WEIGHT, - TCA_QFQ_LMAX, - __TCA_QFQ_MAX -}; - -#define TCA_QFQ_MAX (__TCA_QFQ_MAX - 1) - -struct tc_qfq_stats { - __u32 weight; - __u32 lmax; -}; - -/* CODEL */ - -enum { - TCA_CODEL_UNSPEC, - TCA_CODEL_TARGET, - TCA_CODEL_LIMIT, - TCA_CODEL_INTERVAL, - TCA_CODEL_ECN, - TCA_CODEL_CE_THRESHOLD, - __TCA_CODEL_MAX -}; - -#define TCA_CODEL_MAX (__TCA_CODEL_MAX - 1) - -struct tc_codel_xstats { - __u32 maxpacket; /* largest packet we've seen so far */ - __u32 count; /* how many drops we've done since the last time we - * entered dropping state - */ - __u32 lastcount; /* count at entry to dropping state */ - __u32 ldelay; /* in-queue delay seen by most recently dequeued packet */ - __s32 drop_next; /* time to drop next packet */ - __u32 drop_overlimit; /* number of time max qdisc packet limit was hit */ - __u32 ecn_mark; /* number of packets we ECN marked instead of dropped */ - __u32 dropping; /* are we in dropping state ? */ - __u32 ce_mark; /* number of CE marked packets because of ce_threshold */ -}; - -/* FQ_CODEL */ - -enum { - TCA_FQ_CODEL_UNSPEC, - TCA_FQ_CODEL_TARGET, - TCA_FQ_CODEL_LIMIT, - TCA_FQ_CODEL_INTERVAL, - TCA_FQ_CODEL_ECN, - TCA_FQ_CODEL_FLOWS, - TCA_FQ_CODEL_QUANTUM, - TCA_FQ_CODEL_CE_THRESHOLD, - TCA_FQ_CODEL_DROP_BATCH_SIZE, - TCA_FQ_CODEL_MEMORY_LIMIT, - __TCA_FQ_CODEL_MAX -}; - -#define TCA_FQ_CODEL_MAX (__TCA_FQ_CODEL_MAX - 1) - -enum { - TCA_FQ_CODEL_XSTATS_QDISC, - TCA_FQ_CODEL_XSTATS_CLASS, -}; - -struct tc_fq_codel_qd_stats { - __u32 maxpacket; /* largest packet we've seen so far */ - __u32 drop_overlimit; /* number of time max qdisc - * packet limit was hit - */ - __u32 ecn_mark; /* number of packets we ECN marked - * instead of being dropped - */ - __u32 new_flow_count; /* number of time packets - * created a 'new flow' - */ - __u32 new_flows_len; /* count of flows in new list */ - __u32 old_flows_len; /* count of flows in old list */ - __u32 ce_mark; /* packets above ce_threshold */ - __u32 memory_usage; /* in bytes */ - __u32 drop_overmemory; -}; - -struct tc_fq_codel_cl_stats { - __s32 deficit; - __u32 ldelay; /* in-queue delay seen by most recently - * dequeued packet - */ - __u32 count; - __u32 lastcount; - __u32 dropping; - __s32 drop_next; -}; - -struct tc_fq_codel_xstats { - __u32 type; - union { - struct tc_fq_codel_qd_stats qdisc_stats; - struct tc_fq_codel_cl_stats class_stats; - }; -}; - -/* FQ */ - -enum { - TCA_FQ_UNSPEC, - - TCA_FQ_PLIMIT, /* limit of total number of packets in queue */ - - TCA_FQ_FLOW_PLIMIT, /* limit of packets per flow */ - - TCA_FQ_QUANTUM, /* RR quantum */ - - TCA_FQ_INITIAL_QUANTUM, /* RR quantum for new flow */ - - TCA_FQ_RATE_ENABLE, /* enable/disable rate limiting */ - - TCA_FQ_FLOW_DEFAULT_RATE,/* obsolete, do not use */ - - TCA_FQ_FLOW_MAX_RATE, /* per flow max rate */ - - TCA_FQ_BUCKETS_LOG, /* log2(number of buckets) */ - - TCA_FQ_FLOW_REFILL_DELAY, /* flow credit refill delay in usec */ - - TCA_FQ_ORPHAN_MASK, /* mask applied to orphaned skb hashes */ - - TCA_FQ_LOW_RATE_THRESHOLD, /* per packet delay under this rate */ - - TCA_FQ_CE_THRESHOLD, /* DCTCP-like CE-marking threshold */ - - __TCA_FQ_MAX -}; - -#define TCA_FQ_MAX (__TCA_FQ_MAX - 1) - -struct tc_fq_qd_stats { - __u64 gc_flows; - __u64 highprio_packets; - __u64 tcp_retrans; - __u64 throttled; - __u64 flows_plimit; - __u64 pkts_too_long; - __u64 allocation_errors; - __s64 time_next_delayed_flow; - __u32 flows; - __u32 inactive_flows; - __u32 throttled_flows; - __u32 unthrottle_latency_ns; - __u64 ce_mark; /* packets above ce_threshold */ -}; - -/* Heavy-Hitter Filter */ - -enum { - TCA_HHF_UNSPEC, - TCA_HHF_BACKLOG_LIMIT, - TCA_HHF_QUANTUM, - TCA_HHF_HH_FLOWS_LIMIT, - TCA_HHF_RESET_TIMEOUT, - TCA_HHF_ADMIT_BYTES, - TCA_HHF_EVICT_TIMEOUT, - TCA_HHF_NON_HH_WEIGHT, - __TCA_HHF_MAX -}; - -#define TCA_HHF_MAX (__TCA_HHF_MAX - 1) - -struct tc_hhf_xstats { - __u32 drop_overlimit; /* number of times max qdisc packet limit - * was hit - */ - __u32 hh_overlimit; /* number of times max heavy-hitters was hit */ - __u32 hh_tot_count; /* number of captured heavy-hitters so far */ - __u32 hh_cur_count; /* number of current heavy-hitters */ -}; - -/* PIE */ -enum { - TCA_PIE_UNSPEC, - TCA_PIE_TARGET, - TCA_PIE_LIMIT, - TCA_PIE_TUPDATE, - TCA_PIE_ALPHA, - TCA_PIE_BETA, - TCA_PIE_ECN, - TCA_PIE_BYTEMODE, - __TCA_PIE_MAX -}; -#define TCA_PIE_MAX (__TCA_PIE_MAX - 1) - -struct tc_pie_xstats { - __u32 prob; /* current probability */ - __u32 delay; /* current delay in ms */ - __u32 avg_dq_rate; /* current average dq_rate in bits/pie_time */ - __u32 packets_in; /* total number of packets enqueued */ - __u32 dropped; /* packets dropped due to pie_action */ - __u32 overlimit; /* dropped due to lack of space in queue */ - __u32 maxq; /* maximum queue size */ - __u32 ecn_mark; /* packets marked with ecn*/ -}; - -/* CBS */ -struct tc_cbs_qopt { - __u8 offload; - __u8 _pad[3]; - __s32 hicredit; - __s32 locredit; - __s32 idleslope; - __s32 sendslope; -}; - -enum { - TCA_CBS_UNSPEC, - TCA_CBS_PARMS, - __TCA_CBS_MAX, -}; - -#define TCA_CBS_MAX (__TCA_CBS_MAX - 1) - - -/* ETF */ -struct tc_etf_qopt { - __s32 delta; - __s32 clockid; - __u32 flags; -#define TC_ETF_DEADLINE_MODE_ON BIT(0) -#define TC_ETF_OFFLOAD_ON BIT(1) -}; - -enum { - TCA_ETF_UNSPEC, - TCA_ETF_PARMS, - __TCA_ETF_MAX, -}; - -#define TCA_ETF_MAX (__TCA_ETF_MAX - 1) - - -/* CAKE */ -enum { - TCA_CAKE_UNSPEC, - TCA_CAKE_PAD, - TCA_CAKE_BASE_RATE64, - TCA_CAKE_DIFFSERV_MODE, - TCA_CAKE_ATM, - TCA_CAKE_FLOW_MODE, - TCA_CAKE_OVERHEAD, - TCA_CAKE_RTT, - TCA_CAKE_TARGET, - TCA_CAKE_AUTORATE, - TCA_CAKE_MEMORY, - TCA_CAKE_NAT, - TCA_CAKE_RAW, - TCA_CAKE_WASH, - TCA_CAKE_MPU, - TCA_CAKE_INGRESS, - TCA_CAKE_ACK_FILTER, - TCA_CAKE_SPLIT_GSO, - __TCA_CAKE_MAX -}; -#define TCA_CAKE_MAX (__TCA_CAKE_MAX - 1) - -enum { - __TCA_CAKE_STATS_INVALID, - TCA_CAKE_STATS_PAD, - TCA_CAKE_STATS_CAPACITY_ESTIMATE64, - TCA_CAKE_STATS_MEMORY_LIMIT, - TCA_CAKE_STATS_MEMORY_USED, - TCA_CAKE_STATS_AVG_NETOFF, - TCA_CAKE_STATS_MIN_NETLEN, - TCA_CAKE_STATS_MAX_NETLEN, - TCA_CAKE_STATS_MIN_ADJLEN, - TCA_CAKE_STATS_MAX_ADJLEN, - TCA_CAKE_STATS_TIN_STATS, - TCA_CAKE_STATS_DEFICIT, - TCA_CAKE_STATS_COBALT_COUNT, - TCA_CAKE_STATS_DROPPING, - TCA_CAKE_STATS_DROP_NEXT_US, - TCA_CAKE_STATS_P_DROP, - TCA_CAKE_STATS_BLUE_TIMER_US, - __TCA_CAKE_STATS_MAX -}; -#define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1) - -enum { - __TCA_CAKE_TIN_STATS_INVALID, - TCA_CAKE_TIN_STATS_PAD, - TCA_CAKE_TIN_STATS_SENT_PACKETS, - TCA_CAKE_TIN_STATS_SENT_BYTES64, - TCA_CAKE_TIN_STATS_DROPPED_PACKETS, - TCA_CAKE_TIN_STATS_DROPPED_BYTES64, - TCA_CAKE_TIN_STATS_ACKS_DROPPED_PACKETS, - TCA_CAKE_TIN_STATS_ACKS_DROPPED_BYTES64, - TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS, - TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64, - TCA_CAKE_TIN_STATS_BACKLOG_PACKETS, - TCA_CAKE_TIN_STATS_BACKLOG_BYTES, - TCA_CAKE_TIN_STATS_THRESHOLD_RATE64, - TCA_CAKE_TIN_STATS_TARGET_US, - TCA_CAKE_TIN_STATS_INTERVAL_US, - TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS, - TCA_CAKE_TIN_STATS_WAY_MISSES, - TCA_CAKE_TIN_STATS_WAY_COLLISIONS, - TCA_CAKE_TIN_STATS_PEAK_DELAY_US, - TCA_CAKE_TIN_STATS_AVG_DELAY_US, - TCA_CAKE_TIN_STATS_BASE_DELAY_US, - TCA_CAKE_TIN_STATS_SPARSE_FLOWS, - TCA_CAKE_TIN_STATS_BULK_FLOWS, - TCA_CAKE_TIN_STATS_UNRESPONSIVE_FLOWS, - TCA_CAKE_TIN_STATS_MAX_SKBLEN, - TCA_CAKE_TIN_STATS_FLOW_QUANTUM, - __TCA_CAKE_TIN_STATS_MAX -}; -#define TCA_CAKE_TIN_STATS_MAX (__TCA_CAKE_TIN_STATS_MAX - 1) -#define TC_CAKE_MAX_TINS (8) - -enum { - CAKE_FLOW_NONE = 0, - CAKE_FLOW_SRC_IP, - CAKE_FLOW_DST_IP, - CAKE_FLOW_HOSTS, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_DST_IP */ - CAKE_FLOW_FLOWS, - CAKE_FLOW_DUAL_SRC, /* = CAKE_FLOW_SRC_IP | CAKE_FLOW_FLOWS */ - CAKE_FLOW_DUAL_DST, /* = CAKE_FLOW_DST_IP | CAKE_FLOW_FLOWS */ - CAKE_FLOW_TRIPLE, /* = CAKE_FLOW_HOSTS | CAKE_FLOW_FLOWS */ - CAKE_FLOW_MAX, -}; - -enum { - CAKE_DIFFSERV_DIFFSERV3 = 0, - CAKE_DIFFSERV_DIFFSERV4, - CAKE_DIFFSERV_DIFFSERV8, - CAKE_DIFFSERV_BESTEFFORT, - CAKE_DIFFSERV_PRECEDENCE, - CAKE_DIFFSERV_MAX -}; - -enum { - CAKE_ACK_NONE = 0, - CAKE_ACK_FILTER, - CAKE_ACK_AGGRESSIVE, - CAKE_ACK_MAX -}; - -enum { - CAKE_ATM_NONE = 0, - CAKE_ATM_ATM, - CAKE_ATM_PTM, - CAKE_ATM_MAX -}; - - -/* TAPRIO */ -enum { - TC_TAPRIO_CMD_SET_GATES = 0x00, - TC_TAPRIO_CMD_SET_AND_HOLD = 0x01, - TC_TAPRIO_CMD_SET_AND_RELEASE = 0x02, -}; - -enum { - TCA_TAPRIO_SCHED_ENTRY_UNSPEC, - TCA_TAPRIO_SCHED_ENTRY_INDEX, /* u32 */ - TCA_TAPRIO_SCHED_ENTRY_CMD, /* u8 */ - TCA_TAPRIO_SCHED_ENTRY_GATE_MASK, /* u32 */ - TCA_TAPRIO_SCHED_ENTRY_INTERVAL, /* u32 */ - __TCA_TAPRIO_SCHED_ENTRY_MAX, -}; -#define TCA_TAPRIO_SCHED_ENTRY_MAX (__TCA_TAPRIO_SCHED_ENTRY_MAX - 1) - -/* The format for schedule entry list is: - * [TCA_TAPRIO_SCHED_ENTRY_LIST] - * [TCA_TAPRIO_SCHED_ENTRY] - * [TCA_TAPRIO_SCHED_ENTRY_CMD] - * [TCA_TAPRIO_SCHED_ENTRY_GATES] - * [TCA_TAPRIO_SCHED_ENTRY_INTERVAL] - */ -enum { - TCA_TAPRIO_SCHED_UNSPEC, - TCA_TAPRIO_SCHED_ENTRY, - __TCA_TAPRIO_SCHED_MAX, -}; - -#define TCA_TAPRIO_SCHED_MAX (__TCA_TAPRIO_SCHED_MAX - 1) - -enum { - TCA_TAPRIO_ATTR_UNSPEC, - TCA_TAPRIO_ATTR_PRIOMAP, /* struct tc_mqprio_qopt */ - TCA_TAPRIO_ATTR_SCHED_ENTRY_LIST, /* nested of entry */ - TCA_TAPRIO_ATTR_SCHED_BASE_TIME, /* s64 */ - TCA_TAPRIO_ATTR_SCHED_SINGLE_ENTRY, /* single entry */ - TCA_TAPRIO_ATTR_SCHED_CLOCKID, /* s32 */ - TCA_TAPRIO_PAD, - __TCA_TAPRIO_ATTR_MAX, -}; - -#define TCA_TAPRIO_ATTR_MAX (__TCA_TAPRIO_ATTR_MAX - 1) - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf.h deleted file mode 100644 index ac7a3d9..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf.h +++ /dev/null @@ -1,427 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -/* - * common eBPF ELF operations. - * - * Copyright (C) 2013-2015 Alexei Starovoitov - * Copyright (C) 2015 Wang Nan - * Copyright (C) 2015 Huawei Inc. - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License (not later!) - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this program; if not, see - */ -#ifndef __LIBBPF_BPF_H -#define __LIBBPF_BPF_H - -#include -#include -#include -#include - -#include "libbpf_common.h" -#include "libbpf_legacy.h" - -#ifdef __cplusplus -extern "C" { -#endif - -int libbpf_set_memlock_rlim(size_t memlock_bytes); - -struct bpf_map_create_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - - __u32 btf_fd; - __u32 btf_key_type_id; - __u32 btf_value_type_id; - __u32 btf_vmlinux_value_type_id; - - __u32 inner_map_fd; - __u32 map_flags; - __u64 map_extra; - - __u32 numa_node; - __u32 map_ifindex; -}; -#define bpf_map_create_opts__last_field map_ifindex - -LIBBPF_API int bpf_map_create(enum bpf_map_type map_type, - const char *map_name, - __u32 key_size, - __u32 value_size, - __u32 max_entries, - const struct bpf_map_create_opts *opts); - -struct bpf_prog_load_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - - /* libbpf can retry BPF_PROG_LOAD command if bpf() syscall returns - * -EAGAIN. This field determines how many attempts libbpf has to - * make. If not specified, libbpf will use default value of 5. - */ - int attempts; - - enum bpf_attach_type expected_attach_type; - __u32 prog_btf_fd; - __u32 prog_flags; - __u32 prog_ifindex; - __u32 kern_version; - - __u32 attach_btf_id; - __u32 attach_prog_fd; - __u32 attach_btf_obj_fd; - - const int *fd_array; - - /* .BTF.ext func info data */ - const void *func_info; - __u32 func_info_cnt; - __u32 func_info_rec_size; - - /* .BTF.ext line info data */ - const void *line_info; - __u32 line_info_cnt; - __u32 line_info_rec_size; - - /* verifier log options */ - __u32 log_level; - __u32 log_size; - char *log_buf; -}; -#define bpf_prog_load_opts__last_field log_buf - -LIBBPF_API int bpf_prog_load(enum bpf_prog_type prog_type, - const char *prog_name, const char *license, - const struct bpf_insn *insns, size_t insn_cnt, - const struct bpf_prog_load_opts *opts); - -/* Flags to direct loading requirements */ -#define MAPS_RELAX_COMPAT 0x01 - -/* Recommended log buffer size */ -#define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */ - -struct bpf_btf_load_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - - /* kernel log options */ - char *log_buf; - __u32 log_level; - __u32 log_size; -}; -#define bpf_btf_load_opts__last_field log_size - -LIBBPF_API int bpf_btf_load(const void *btf_data, size_t btf_size, - const struct bpf_btf_load_opts *opts); - -LIBBPF_API int bpf_map_update_elem(int fd, const void *key, const void *value, - __u64 flags); - -LIBBPF_API int bpf_map_lookup_elem(int fd, const void *key, void *value); -LIBBPF_API int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, - __u64 flags); -LIBBPF_API int bpf_map_lookup_and_delete_elem(int fd, const void *key, - void *value); -LIBBPF_API int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, - void *value, __u64 flags); -LIBBPF_API int bpf_map_delete_elem(int fd, const void *key); -LIBBPF_API int bpf_map_delete_elem_flags(int fd, const void *key, __u64 flags); -LIBBPF_API int bpf_map_get_next_key(int fd, const void *key, void *next_key); -LIBBPF_API int bpf_map_freeze(int fd); - -struct bpf_map_batch_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - __u64 elem_flags; - __u64 flags; -}; -#define bpf_map_batch_opts__last_field flags - - -/** - * @brief **bpf_map_delete_batch()** allows for batch deletion of multiple - * elements in a BPF map. - * - * @param fd BPF map file descriptor - * @param keys pointer to an array of *count* keys - * @param count input and output parameter; on input **count** represents the - * number of elements in the map to delete in batch; - * on output if a non-EFAULT error is returned, **count** represents the number of deleted - * elements if the output **count** value is not equal to the input **count** value - * If EFAULT is returned, **count** should not be trusted to be correct. - * @param opts options for configuring the way the batch deletion works - * @return 0, on success; negative error code, otherwise (errno is also set to - * the error code) - */ -LIBBPF_API int bpf_map_delete_batch(int fd, const void *keys, - __u32 *count, - const struct bpf_map_batch_opts *opts); - -/** - * @brief **bpf_map_lookup_batch()** allows for batch lookup of BPF map elements. - * - * The parameter *in_batch* is the address of the first element in the batch to read. - * *out_batch* is an output parameter that should be passed as *in_batch* to subsequent - * calls to **bpf_map_lookup_batch()**. NULL can be passed for *in_batch* to indicate - * that the batched lookup starts from the beginning of the map. - * - * The *keys* and *values* are output parameters which must point to memory large enough to - * hold *count* items based on the key and value size of the map *map_fd*. The *keys* - * buffer must be of *key_size* * *count*. The *values* buffer must be of - * *value_size* * *count*. - * - * @param fd BPF map file descriptor - * @param in_batch address of the first element in batch to read, can pass NULL to - * indicate that the batched lookup starts from the beginning of the map. - * @param out_batch output parameter that should be passed to next call as *in_batch* - * @param keys pointer to an array large enough for *count* keys - * @param values pointer to an array large enough for *count* values - * @param count input and output parameter; on input it's the number of elements - * in the map to read in batch; on output it's the number of elements that were - * successfully read. - * If a non-EFAULT error is returned, count will be set as the number of elements - * that were read before the error occurred. - * If EFAULT is returned, **count** should not be trusted to be correct. - * @param opts options for configuring the way the batch lookup works - * @return 0, on success; negative error code, otherwise (errno is also set to - * the error code) - */ -LIBBPF_API int bpf_map_lookup_batch(int fd, void *in_batch, void *out_batch, - void *keys, void *values, __u32 *count, - const struct bpf_map_batch_opts *opts); - -/** - * @brief **bpf_map_lookup_and_delete_batch()** allows for batch lookup and deletion - * of BPF map elements where each element is deleted after being retrieved. - * - * @param fd BPF map file descriptor - * @param in_batch address of the first element in batch to read, can pass NULL to - * get address of the first element in *out_batch* - * @param out_batch output parameter that should be passed to next call as *in_batch* - * @param keys pointer to an array of *count* keys - * @param values pointer to an array large enough for *count* values - * @param count input and output parameter; on input it's the number of elements - * in the map to read and delete in batch; on output it represents the number of - * elements that were successfully read and deleted - * If a non-**EFAULT** error code is returned and if the output **count** value - * is not equal to the input **count** value, up to **count** elements may - * have been deleted. - * if **EFAULT** is returned up to *count* elements may have been deleted without - * being returned via the *keys* and *values* output parameters. - * @param opts options for configuring the way the batch lookup and delete works - * @return 0, on success; negative error code, otherwise (errno is also set to - * the error code) - */ -LIBBPF_API int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, - void *out_batch, void *keys, - void *values, __u32 *count, - const struct bpf_map_batch_opts *opts); - -/** - * @brief **bpf_map_update_batch()** updates multiple elements in a map - * by specifying keys and their corresponding values. - * - * The *keys* and *values* parameters must point to memory large enough - * to hold *count* items based on the key and value size of the map. - * - * The *opts* parameter can be used to control how *bpf_map_update_batch()* - * should handle keys that either do or do not already exist in the map. - * In particular the *flags* parameter of *bpf_map_batch_opts* can be - * one of the following: - * - * Note that *count* is an input and output parameter, where on output it - * represents how many elements were successfully updated. Also note that if - * **EFAULT** then *count* should not be trusted to be correct. - * - * **BPF_ANY** - * Create new elements or update existing. - * - * **BPF_NOEXIST** - * Create new elements only if they do not exist. - * - * **BPF_EXIST** - * Update existing elements. - * - * **BPF_F_LOCK** - * Update spin_lock-ed map elements. This must be - * specified if the map value contains a spinlock. - * - * @param fd BPF map file descriptor - * @param keys pointer to an array of *count* keys - * @param values pointer to an array of *count* values - * @param count input and output parameter; on input it's the number of elements - * in the map to update in batch; on output if a non-EFAULT error is returned, - * **count** represents the number of updated elements if the output **count** - * value is not equal to the input **count** value. - * If EFAULT is returned, **count** should not be trusted to be correct. - * @param opts options for configuring the way the batch update works - * @return 0, on success; negative error code, otherwise (errno is also set to - * the error code) - */ -LIBBPF_API int bpf_map_update_batch(int fd, const void *keys, const void *values, - __u32 *count, - const struct bpf_map_batch_opts *opts); - -LIBBPF_API int bpf_obj_pin(int fd, const char *pathname); -LIBBPF_API int bpf_obj_get(const char *pathname); - -struct bpf_prog_attach_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - unsigned int flags; - int replace_prog_fd; -}; -#define bpf_prog_attach_opts__last_field replace_prog_fd - -LIBBPF_API int bpf_prog_attach(int prog_fd, int attachable_fd, - enum bpf_attach_type type, unsigned int flags); -LIBBPF_API int bpf_prog_attach_opts(int prog_fd, int attachable_fd, - enum bpf_attach_type type, - const struct bpf_prog_attach_opts *opts); -LIBBPF_API int bpf_prog_detach(int attachable_fd, enum bpf_attach_type type); -LIBBPF_API int bpf_prog_detach2(int prog_fd, int attachable_fd, - enum bpf_attach_type type); - -union bpf_iter_link_info; /* defined in up-to-date linux/bpf.h */ -struct bpf_link_create_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - __u32 flags; - union bpf_iter_link_info *iter_info; - __u32 iter_info_len; - __u32 target_btf_id; - union { - struct { - __u64 bpf_cookie; - } perf_event; - struct { - __u32 flags; - __u32 cnt; - const char **syms; - const unsigned long *addrs; - const __u64 *cookies; - } kprobe_multi; - struct { - __u64 cookie; - } tracing; - }; - size_t :0; -}; -#define bpf_link_create_opts__last_field kprobe_multi.cookies - -LIBBPF_API int bpf_link_create(int prog_fd, int target_fd, - enum bpf_attach_type attach_type, - const struct bpf_link_create_opts *opts); - -LIBBPF_API int bpf_link_detach(int link_fd); - -struct bpf_link_update_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - __u32 flags; /* extra flags */ - __u32 old_prog_fd; /* expected old program FD */ -}; -#define bpf_link_update_opts__last_field old_prog_fd - -LIBBPF_API int bpf_link_update(int link_fd, int new_prog_fd, - const struct bpf_link_update_opts *opts); - -LIBBPF_API int bpf_iter_create(int link_fd); - -struct bpf_prog_test_run_attr { - int prog_fd; - int repeat; - const void *data_in; - __u32 data_size_in; - void *data_out; /* optional */ - __u32 data_size_out; /* in: max length of data_out - * out: length of data_out */ - __u32 retval; /* out: return code of the BPF program */ - __u32 duration; /* out: average per repetition in ns */ - const void *ctx_in; /* optional */ - __u32 ctx_size_in; - void *ctx_out; /* optional */ - __u32 ctx_size_out; /* in: max length of ctx_out - * out: length of cxt_out */ -}; - -LIBBPF_API int bpf_prog_get_next_id(__u32 start_id, __u32 *next_id); -LIBBPF_API int bpf_map_get_next_id(__u32 start_id, __u32 *next_id); -LIBBPF_API int bpf_btf_get_next_id(__u32 start_id, __u32 *next_id); -LIBBPF_API int bpf_link_get_next_id(__u32 start_id, __u32 *next_id); -LIBBPF_API int bpf_prog_get_fd_by_id(__u32 id); -LIBBPF_API int bpf_map_get_fd_by_id(__u32 id); -LIBBPF_API int bpf_btf_get_fd_by_id(__u32 id); -LIBBPF_API int bpf_link_get_fd_by_id(__u32 id); -LIBBPF_API int bpf_obj_get_info_by_fd(int bpf_fd, void *info, __u32 *info_len); - -struct bpf_prog_query_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - __u32 query_flags; - __u32 attach_flags; /* output argument */ - __u32 *prog_ids; - __u32 prog_cnt; /* input+output argument */ - __u32 *prog_attach_flags; -}; -#define bpf_prog_query_opts__last_field prog_attach_flags - -LIBBPF_API int bpf_prog_query_opts(int target_fd, - enum bpf_attach_type type, - struct bpf_prog_query_opts *opts); -LIBBPF_API int bpf_prog_query(int target_fd, enum bpf_attach_type type, - __u32 query_flags, __u32 *attach_flags, - __u32 *prog_ids, __u32 *prog_cnt); - -LIBBPF_API int bpf_raw_tracepoint_open(const char *name, int prog_fd); -LIBBPF_API int bpf_task_fd_query(int pid, int fd, __u32 flags, char *buf, - __u32 *buf_len, __u32 *prog_id, __u32 *fd_type, - __u64 *probe_offset, __u64 *probe_addr); - -enum bpf_stats_type; /* defined in up-to-date linux/bpf.h */ -LIBBPF_API int bpf_enable_stats(enum bpf_stats_type type); - -struct bpf_prog_bind_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - __u32 flags; -}; -#define bpf_prog_bind_opts__last_field flags - -LIBBPF_API int bpf_prog_bind_map(int prog_fd, int map_fd, - const struct bpf_prog_bind_opts *opts); - -struct bpf_test_run_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - const void *data_in; /* optional */ - void *data_out; /* optional */ - __u32 data_size_in; - __u32 data_size_out; /* in: max length of data_out - * out: length of data_out - */ - const void *ctx_in; /* optional */ - void *ctx_out; /* optional */ - __u32 ctx_size_in; - __u32 ctx_size_out; /* in: max length of ctx_out - * out: length of cxt_out - */ - __u32 retval; /* out: return code of the BPF program */ - int repeat; - __u32 duration; /* out: average per repetition in ns */ - __u32 flags; - __u32 cpu; - __u32 batch_size; -}; -#define bpf_test_run_opts__last_field batch_size - -LIBBPF_API int bpf_prog_test_run_opts(int prog_fd, - struct bpf_test_run_opts *opts); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* __LIBBPF_BPF_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_core_read.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_core_read.h deleted file mode 100644 index 315549b..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_core_read.h +++ /dev/null @@ -1,473 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#ifndef __BPF_CORE_READ_H__ -#define __BPF_CORE_READ_H__ - -/* - * enum bpf_field_info_kind is passed as a second argument into - * __builtin_preserve_field_info() built-in to get a specific aspect of - * a field, captured as a first argument. __builtin_preserve_field_info(field, - * info_kind) returns __u32 integer and produces BTF field relocation, which - * is understood and processed by libbpf during BPF object loading. See - * selftests/bpf for examples. - */ -enum bpf_field_info_kind { - BPF_FIELD_BYTE_OFFSET = 0, /* field byte offset */ - BPF_FIELD_BYTE_SIZE = 1, - BPF_FIELD_EXISTS = 2, /* field existence in target kernel */ - BPF_FIELD_SIGNED = 3, - BPF_FIELD_LSHIFT_U64 = 4, - BPF_FIELD_RSHIFT_U64 = 5, -}; - -/* second argument to __builtin_btf_type_id() built-in */ -enum bpf_type_id_kind { - BPF_TYPE_ID_LOCAL = 0, /* BTF type ID in local program */ - BPF_TYPE_ID_TARGET = 1, /* BTF type ID in target kernel */ -}; - -/* second argument to __builtin_preserve_type_info() built-in */ -enum bpf_type_info_kind { - BPF_TYPE_EXISTS = 0, /* type existence in target kernel */ - BPF_TYPE_SIZE = 1, /* type size in target kernel */ -}; - -/* second argument to __builtin_preserve_enum_value() built-in */ -enum bpf_enum_value_kind { - BPF_ENUMVAL_EXISTS = 0, /* enum value existence in kernel */ - BPF_ENUMVAL_VALUE = 1, /* enum value value relocation */ -}; - -#define __CORE_RELO(src, field, info) \ - __builtin_preserve_field_info((src)->field, BPF_FIELD_##info) - -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -#define __CORE_BITFIELD_PROBE_READ(dst, src, fld) \ - bpf_probe_read_kernel( \ - (void *)dst, \ - __CORE_RELO(src, fld, BYTE_SIZE), \ - (const void *)src + __CORE_RELO(src, fld, BYTE_OFFSET)) -#else -/* semantics of LSHIFT_64 assumes loading values into low-ordered bytes, so - * for big-endian we need to adjust destination pointer accordingly, based on - * field byte size - */ -#define __CORE_BITFIELD_PROBE_READ(dst, src, fld) \ - bpf_probe_read_kernel( \ - (void *)dst + (8 - __CORE_RELO(src, fld, BYTE_SIZE)), \ - __CORE_RELO(src, fld, BYTE_SIZE), \ - (const void *)src + __CORE_RELO(src, fld, BYTE_OFFSET)) -#endif - -/* - * Extract bitfield, identified by s->field, and return its value as u64. - * All this is done in relocatable manner, so bitfield changes such as - * signedness, bit size, offset changes, this will be handled automatically. - * This version of macro is using bpf_probe_read_kernel() to read underlying - * integer storage. Macro functions as an expression and its return type is - * bpf_probe_read_kernel()'s return value: 0, on success, <0 on error. - */ -#define BPF_CORE_READ_BITFIELD_PROBED(s, field) ({ \ - unsigned long long val = 0; \ - \ - __CORE_BITFIELD_PROBE_READ(&val, s, field); \ - val <<= __CORE_RELO(s, field, LSHIFT_U64); \ - if (__CORE_RELO(s, field, SIGNED)) \ - val = ((long long)val) >> __CORE_RELO(s, field, RSHIFT_U64); \ - else \ - val = val >> __CORE_RELO(s, field, RSHIFT_U64); \ - val; \ -}) - -/* - * Extract bitfield, identified by s->field, and return its value as u64. - * This version of macro is using direct memory reads and should be used from - * BPF program types that support such functionality (e.g., typed raw - * tracepoints). - */ -#define BPF_CORE_READ_BITFIELD(s, field) ({ \ - const void *p = (const void *)s + __CORE_RELO(s, field, BYTE_OFFSET); \ - unsigned long long val; \ - \ - /* This is a so-called barrier_var() operation that makes specified \ - * variable "a black box" for optimizing compiler. \ - * It forces compiler to perform BYTE_OFFSET relocation on p and use \ - * its calculated value in the switch below, instead of applying \ - * the same relocation 4 times for each individual memory load. \ - */ \ - asm volatile("" : "=r"(p) : "0"(p)); \ - \ - switch (__CORE_RELO(s, field, BYTE_SIZE)) { \ - case 1: val = *(const unsigned char *)p; break; \ - case 2: val = *(const unsigned short *)p; break; \ - case 4: val = *(const unsigned int *)p; break; \ - case 8: val = *(const unsigned long long *)p; break; \ - } \ - val <<= __CORE_RELO(s, field, LSHIFT_U64); \ - if (__CORE_RELO(s, field, SIGNED)) \ - val = ((long long)val) >> __CORE_RELO(s, field, RSHIFT_U64); \ - else \ - val = val >> __CORE_RELO(s, field, RSHIFT_U64); \ - val; \ -}) - -#define ___bpf_field_ref1(field) (field) -#define ___bpf_field_ref2(type, field) (((typeof(type) *)0)->field) -#define ___bpf_field_ref(args...) \ - ___bpf_apply(___bpf_field_ref, ___bpf_narg(args))(args) - -/* - * Convenience macro to check that field actually exists in target kernel's. - * Returns: - * 1, if matching field is present in target kernel; - * 0, if no matching field found. - * - * Supports two forms: - * - field reference through variable access: - * bpf_core_field_exists(p->my_field); - * - field reference through type and field names: - * bpf_core_field_exists(struct my_type, my_field). - */ -#define bpf_core_field_exists(field...) \ - __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_EXISTS) - -/* - * Convenience macro to get the byte size of a field. Works for integers, - * struct/unions, pointers, arrays, and enums. - * - * Supports two forms: - * - field reference through variable access: - * bpf_core_field_size(p->my_field); - * - field reference through type and field names: - * bpf_core_field_size(struct my_type, my_field). - */ -#define bpf_core_field_size(field...) \ - __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_BYTE_SIZE) - -/* - * Convenience macro to get field's byte offset. - * - * Supports two forms: - * - field reference through variable access: - * bpf_core_field_offset(p->my_field); - * - field reference through type and field names: - * bpf_core_field_offset(struct my_type, my_field). - */ -#define bpf_core_field_offset(field...) \ - __builtin_preserve_field_info(___bpf_field_ref(field), BPF_FIELD_BYTE_OFFSET) - -/* - * Convenience macro to get BTF type ID of a specified type, using a local BTF - * information. Return 32-bit unsigned integer with type ID from program's own - * BTF. Always succeeds. - */ -#define bpf_core_type_id_local(type) \ - __builtin_btf_type_id(*(typeof(type) *)0, BPF_TYPE_ID_LOCAL) - -/* - * Convenience macro to get BTF type ID of a target kernel's type that matches - * specified local type. - * Returns: - * - valid 32-bit unsigned type ID in kernel BTF; - * - 0, if no matching type was found in a target kernel BTF. - */ -#define bpf_core_type_id_kernel(type) \ - __builtin_btf_type_id(*(typeof(type) *)0, BPF_TYPE_ID_TARGET) - -/* - * Convenience macro to check that provided named type - * (struct/union/enum/typedef) exists in a target kernel. - * Returns: - * 1, if such type is present in target kernel's BTF; - * 0, if no matching type is found. - */ -#define bpf_core_type_exists(type) \ - __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_EXISTS) - -/* - * Convenience macro to get the byte size of a provided named type - * (struct/union/enum/typedef) in a target kernel. - * Returns: - * >= 0 size (in bytes), if type is present in target kernel's BTF; - * 0, if no matching type is found. - */ -#define bpf_core_type_size(type) \ - __builtin_preserve_type_info(*(typeof(type) *)0, BPF_TYPE_SIZE) - -/* - * Convenience macro to check that provided enumerator value is defined in - * a target kernel. - * Returns: - * 1, if specified enum type and its enumerator value are present in target - * kernel's BTF; - * 0, if no matching enum and/or enum value within that enum is found. - */ -#define bpf_core_enum_value_exists(enum_type, enum_value) \ - __builtin_preserve_enum_value(*(typeof(enum_type) *)enum_value, BPF_ENUMVAL_EXISTS) - -/* - * Convenience macro to get the integer value of an enumerator value in - * a target kernel. - * Returns: - * 64-bit value, if specified enum type and its enumerator value are - * present in target kernel's BTF; - * 0, if no matching enum and/or enum value within that enum is found. - */ -#define bpf_core_enum_value(enum_type, enum_value) \ - __builtin_preserve_enum_value(*(typeof(enum_type) *)enum_value, BPF_ENUMVAL_VALUE) - -/* - * bpf_core_read() abstracts away bpf_probe_read_kernel() call and captures - * offset relocation for source address using __builtin_preserve_access_index() - * built-in, provided by Clang. - * - * __builtin_preserve_access_index() takes as an argument an expression of - * taking an address of a field within struct/union. It makes compiler emit - * a relocation, which records BTF type ID describing root struct/union and an - * accessor string which describes exact embedded field that was used to take - * an address. See detailed description of this relocation format and - * semantics in comments to struct bpf_field_reloc in libbpf_internal.h. - * - * This relocation allows libbpf to adjust BPF instruction to use correct - * actual field offset, based on target kernel BTF type that matches original - * (local) BTF, used to record relocation. - */ -#define bpf_core_read(dst, sz, src) \ - bpf_probe_read_kernel(dst, sz, (const void *)__builtin_preserve_access_index(src)) - -/* NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. */ -#define bpf_core_read_user(dst, sz, src) \ - bpf_probe_read_user(dst, sz, (const void *)__builtin_preserve_access_index(src)) -/* - * bpf_core_read_str() is a thin wrapper around bpf_probe_read_str() - * additionally emitting BPF CO-RE field relocation for specified source - * argument. - */ -#define bpf_core_read_str(dst, sz, src) \ - bpf_probe_read_kernel_str(dst, sz, (const void *)__builtin_preserve_access_index(src)) - -/* NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. */ -#define bpf_core_read_user_str(dst, sz, src) \ - bpf_probe_read_user_str(dst, sz, (const void *)__builtin_preserve_access_index(src)) - -#define ___concat(a, b) a ## b -#define ___apply(fn, n) ___concat(fn, n) -#define ___nth(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, __11, N, ...) N - -/* - * return number of provided arguments; used for switch-based variadic macro - * definitions (see ___last, ___arrow, etc below) - */ -#define ___narg(...) ___nth(_, ##__VA_ARGS__, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) -/* - * return 0 if no arguments are passed, N - otherwise; used for - * recursively-defined macros to specify termination (0) case, and generic - * (N) case (e.g., ___read_ptrs, ___core_read) - */ -#define ___empty(...) ___nth(_, ##__VA_ARGS__, N, N, N, N, N, N, N, N, N, N, 0) - -#define ___last1(x) x -#define ___last2(a, x) x -#define ___last3(a, b, x) x -#define ___last4(a, b, c, x) x -#define ___last5(a, b, c, d, x) x -#define ___last6(a, b, c, d, e, x) x -#define ___last7(a, b, c, d, e, f, x) x -#define ___last8(a, b, c, d, e, f, g, x) x -#define ___last9(a, b, c, d, e, f, g, h, x) x -#define ___last10(a, b, c, d, e, f, g, h, i, x) x -#define ___last(...) ___apply(___last, ___narg(__VA_ARGS__))(__VA_ARGS__) - -#define ___nolast2(a, _) a -#define ___nolast3(a, b, _) a, b -#define ___nolast4(a, b, c, _) a, b, c -#define ___nolast5(a, b, c, d, _) a, b, c, d -#define ___nolast6(a, b, c, d, e, _) a, b, c, d, e -#define ___nolast7(a, b, c, d, e, f, _) a, b, c, d, e, f -#define ___nolast8(a, b, c, d, e, f, g, _) a, b, c, d, e, f, g -#define ___nolast9(a, b, c, d, e, f, g, h, _) a, b, c, d, e, f, g, h -#define ___nolast10(a, b, c, d, e, f, g, h, i, _) a, b, c, d, e, f, g, h, i -#define ___nolast(...) ___apply(___nolast, ___narg(__VA_ARGS__))(__VA_ARGS__) - -#define ___arrow1(a) a -#define ___arrow2(a, b) a->b -#define ___arrow3(a, b, c) a->b->c -#define ___arrow4(a, b, c, d) a->b->c->d -#define ___arrow5(a, b, c, d, e) a->b->c->d->e -#define ___arrow6(a, b, c, d, e, f) a->b->c->d->e->f -#define ___arrow7(a, b, c, d, e, f, g) a->b->c->d->e->f->g -#define ___arrow8(a, b, c, d, e, f, g, h) a->b->c->d->e->f->g->h -#define ___arrow9(a, b, c, d, e, f, g, h, i) a->b->c->d->e->f->g->h->i -#define ___arrow10(a, b, c, d, e, f, g, h, i, j) a->b->c->d->e->f->g->h->i->j -#define ___arrow(...) ___apply(___arrow, ___narg(__VA_ARGS__))(__VA_ARGS__) - -#define ___type(...) typeof(___arrow(__VA_ARGS__)) - -#define ___read(read_fn, dst, src_type, src, accessor) \ - read_fn((void *)(dst), sizeof(*(dst)), &((src_type)(src))->accessor) - -/* "recursively" read a sequence of inner pointers using local __t var */ -#define ___rd_first(fn, src, a) ___read(fn, &__t, ___type(src), src, a); -#define ___rd_last(fn, ...) \ - ___read(fn, &__t, ___type(___nolast(__VA_ARGS__)), __t, ___last(__VA_ARGS__)); -#define ___rd_p1(fn, ...) const void *__t; ___rd_first(fn, __VA_ARGS__) -#define ___rd_p2(fn, ...) ___rd_p1(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) -#define ___rd_p3(fn, ...) ___rd_p2(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) -#define ___rd_p4(fn, ...) ___rd_p3(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) -#define ___rd_p5(fn, ...) ___rd_p4(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) -#define ___rd_p6(fn, ...) ___rd_p5(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) -#define ___rd_p7(fn, ...) ___rd_p6(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) -#define ___rd_p8(fn, ...) ___rd_p7(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) -#define ___rd_p9(fn, ...) ___rd_p8(fn, ___nolast(__VA_ARGS__)) ___rd_last(fn, __VA_ARGS__) -#define ___read_ptrs(fn, src, ...) \ - ___apply(___rd_p, ___narg(__VA_ARGS__))(fn, src, __VA_ARGS__) - -#define ___core_read0(fn, fn_ptr, dst, src, a) \ - ___read(fn, dst, ___type(src), src, a); -#define ___core_readN(fn, fn_ptr, dst, src, ...) \ - ___read_ptrs(fn_ptr, src, ___nolast(__VA_ARGS__)) \ - ___read(fn, dst, ___type(src, ___nolast(__VA_ARGS__)), __t, \ - ___last(__VA_ARGS__)); -#define ___core_read(fn, fn_ptr, dst, src, a, ...) \ - ___apply(___core_read, ___empty(__VA_ARGS__))(fn, fn_ptr, dst, \ - src, a, ##__VA_ARGS__) - -/* - * BPF_CORE_READ_INTO() is a more performance-conscious variant of - * BPF_CORE_READ(), in which final field is read into user-provided storage. - * See BPF_CORE_READ() below for more details on general usage. - */ -#define BPF_CORE_READ_INTO(dst, src, a, ...) ({ \ - ___core_read(bpf_core_read, bpf_core_read, \ - dst, (src), a, ##__VA_ARGS__) \ -}) - -/* - * Variant of BPF_CORE_READ_INTO() for reading from user-space memory. - * - * NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. - */ -#define BPF_CORE_READ_USER_INTO(dst, src, a, ...) ({ \ - ___core_read(bpf_core_read_user, bpf_core_read_user, \ - dst, (src), a, ##__VA_ARGS__) \ -}) - -/* Non-CO-RE variant of BPF_CORE_READ_INTO() */ -#define BPF_PROBE_READ_INTO(dst, src, a, ...) ({ \ - ___core_read(bpf_probe_read, bpf_probe_read, \ - dst, (src), a, ##__VA_ARGS__) \ -}) - -/* Non-CO-RE variant of BPF_CORE_READ_USER_INTO(). - * - * As no CO-RE relocations are emitted, source types can be arbitrary and are - * not restricted to kernel types only. - */ -#define BPF_PROBE_READ_USER_INTO(dst, src, a, ...) ({ \ - ___core_read(bpf_probe_read_user, bpf_probe_read_user, \ - dst, (src), a, ##__VA_ARGS__) \ -}) - -/* - * BPF_CORE_READ_STR_INTO() does same "pointer chasing" as - * BPF_CORE_READ() for intermediate pointers, but then executes (and returns - * corresponding error code) bpf_core_read_str() for final string read. - */ -#define BPF_CORE_READ_STR_INTO(dst, src, a, ...) ({ \ - ___core_read(bpf_core_read_str, bpf_core_read, \ - dst, (src), a, ##__VA_ARGS__) \ -}) - -/* - * Variant of BPF_CORE_READ_STR_INTO() for reading from user-space memory. - * - * NOTE: see comments for BPF_CORE_READ_USER() about the proper types use. - */ -#define BPF_CORE_READ_USER_STR_INTO(dst, src, a, ...) ({ \ - ___core_read(bpf_core_read_user_str, bpf_core_read_user, \ - dst, (src), a, ##__VA_ARGS__) \ -}) - -/* Non-CO-RE variant of BPF_CORE_READ_STR_INTO() */ -#define BPF_PROBE_READ_STR_INTO(dst, src, a, ...) ({ \ - ___core_read(bpf_probe_read_str, bpf_probe_read, \ - dst, (src), a, ##__VA_ARGS__) \ -}) - -/* - * Non-CO-RE variant of BPF_CORE_READ_USER_STR_INTO(). - * - * As no CO-RE relocations are emitted, source types can be arbitrary and are - * not restricted to kernel types only. - */ -#define BPF_PROBE_READ_USER_STR_INTO(dst, src, a, ...) ({ \ - ___core_read(bpf_probe_read_user_str, bpf_probe_read_user, \ - dst, (src), a, ##__VA_ARGS__) \ -}) - -/* - * BPF_CORE_READ() is used to simplify BPF CO-RE relocatable read, especially - * when there are few pointer chasing steps. - * E.g., what in non-BPF world (or in BPF w/ BCC) would be something like: - * int x = s->a.b.c->d.e->f->g; - * can be succinctly achieved using BPF_CORE_READ as: - * int x = BPF_CORE_READ(s, a.b.c, d.e, f, g); - * - * BPF_CORE_READ will decompose above statement into 4 bpf_core_read (BPF - * CO-RE relocatable bpf_probe_read_kernel() wrapper) calls, logically - * equivalent to: - * 1. const void *__t = s->a.b.c; - * 2. __t = __t->d.e; - * 3. __t = __t->f; - * 4. return __t->g; - * - * Equivalence is logical, because there is a heavy type casting/preservation - * involved, as well as all the reads are happening through - * bpf_probe_read_kernel() calls using __builtin_preserve_access_index() to - * emit CO-RE relocations. - * - * N.B. Only up to 9 "field accessors" are supported, which should be more - * than enough for any practical purpose. - */ -#define BPF_CORE_READ(src, a, ...) ({ \ - ___type((src), a, ##__VA_ARGS__) __r; \ - BPF_CORE_READ_INTO(&__r, (src), a, ##__VA_ARGS__); \ - __r; \ -}) - -/* - * Variant of BPF_CORE_READ() for reading from user-space memory. - * - * NOTE: all the source types involved are still *kernel types* and need to - * exist in kernel (or kernel module) BTF, otherwise CO-RE relocation will - * fail. Custom user types are not relocatable with CO-RE. - * The typical situation in which BPF_CORE_READ_USER() might be used is to - * read kernel UAPI types from the user-space memory passed in as a syscall - * input argument. - */ -#define BPF_CORE_READ_USER(src, a, ...) ({ \ - ___type((src), a, ##__VA_ARGS__) __r; \ - BPF_CORE_READ_USER_INTO(&__r, (src), a, ##__VA_ARGS__); \ - __r; \ -}) - -/* Non-CO-RE variant of BPF_CORE_READ() */ -#define BPF_PROBE_READ(src, a, ...) ({ \ - ___type((src), a, ##__VA_ARGS__) __r; \ - BPF_PROBE_READ_INTO(&__r, (src), a, ##__VA_ARGS__); \ - __r; \ -}) - -/* - * Non-CO-RE variant of BPF_CORE_READ_USER(). - * - * As no CO-RE relocations are emitted, source types can be arbitrary and are - * not restricted to kernel types only. - */ -#define BPF_PROBE_READ_USER(src, a, ...) ({ \ - ___type((src), a, ##__VA_ARGS__) __r; \ - BPF_PROBE_READ_USER_INTO(&__r, (src), a, ##__VA_ARGS__); \ - __r; \ -}) - -#endif - diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_endian.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_endian.h deleted file mode 100644 index 1ab7ec8..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_endian.h +++ /dev/null @@ -1,99 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#ifndef __BPF_ENDIAN__ -#define __BPF_ENDIAN__ - -/* - * Isolate byte #n and put it into byte #m, for __u##b type. - * E.g., moving byte #6 (nnnnnnnn) into byte #1 (mmmmmmmm) for __u64: - * 1) xxxxxxxx nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx - * 2) nnnnnnnn xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx mmmmmmmm xxxxxxxx 00000000 - * 3) 00000000 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn - * 4) 00000000 00000000 00000000 00000000 00000000 00000000 nnnnnnnn 00000000 - */ -#define ___bpf_mvb(x, b, n, m) ((__u##b)(x) << (b-(n+1)*8) >> (b-8) << (m*8)) - -#define ___bpf_swab16(x) ((__u16)( \ - ___bpf_mvb(x, 16, 0, 1) | \ - ___bpf_mvb(x, 16, 1, 0))) - -#define ___bpf_swab32(x) ((__u32)( \ - ___bpf_mvb(x, 32, 0, 3) | \ - ___bpf_mvb(x, 32, 1, 2) | \ - ___bpf_mvb(x, 32, 2, 1) | \ - ___bpf_mvb(x, 32, 3, 0))) - -#define ___bpf_swab64(x) ((__u64)( \ - ___bpf_mvb(x, 64, 0, 7) | \ - ___bpf_mvb(x, 64, 1, 6) | \ - ___bpf_mvb(x, 64, 2, 5) | \ - ___bpf_mvb(x, 64, 3, 4) | \ - ___bpf_mvb(x, 64, 4, 3) | \ - ___bpf_mvb(x, 64, 5, 2) | \ - ___bpf_mvb(x, 64, 6, 1) | \ - ___bpf_mvb(x, 64, 7, 0))) - -/* LLVM's BPF target selects the endianness of the CPU - * it compiles on, or the user specifies (bpfel/bpfeb), - * respectively. The used __BYTE_ORDER__ is defined by - * the compiler, we cannot rely on __BYTE_ORDER from - * libc headers, since it doesn't reflect the actual - * requested byte order. - * - * Note, LLVM's BPF target has different __builtin_bswapX() - * semantics. It does map to BPF_ALU | BPF_END | BPF_TO_BE - * in bpfel and bpfeb case, which means below, that we map - * to cpu_to_be16(). We could use it unconditionally in BPF - * case, but better not rely on it, so that this header here - * can be used from application and BPF program side, which - * use different targets. - */ -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -# define __bpf_ntohs(x) __builtin_bswap16(x) -# define __bpf_htons(x) __builtin_bswap16(x) -# define __bpf_constant_ntohs(x) ___bpf_swab16(x) -# define __bpf_constant_htons(x) ___bpf_swab16(x) -# define __bpf_ntohl(x) __builtin_bswap32(x) -# define __bpf_htonl(x) __builtin_bswap32(x) -# define __bpf_constant_ntohl(x) ___bpf_swab32(x) -# define __bpf_constant_htonl(x) ___bpf_swab32(x) -# define __bpf_be64_to_cpu(x) __builtin_bswap64(x) -# define __bpf_cpu_to_be64(x) __builtin_bswap64(x) -# define __bpf_constant_be64_to_cpu(x) ___bpf_swab64(x) -# define __bpf_constant_cpu_to_be64(x) ___bpf_swab64(x) -#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ -# define __bpf_ntohs(x) (x) -# define __bpf_htons(x) (x) -# define __bpf_constant_ntohs(x) (x) -# define __bpf_constant_htons(x) (x) -# define __bpf_ntohl(x) (x) -# define __bpf_htonl(x) (x) -# define __bpf_constant_ntohl(x) (x) -# define __bpf_constant_htonl(x) (x) -# define __bpf_be64_to_cpu(x) (x) -# define __bpf_cpu_to_be64(x) (x) -# define __bpf_constant_be64_to_cpu(x) (x) -# define __bpf_constant_cpu_to_be64(x) (x) -#else -# error "Fix your compiler's __BYTE_ORDER__?!" -#endif - -#define bpf_htons(x) \ - (__builtin_constant_p(x) ? \ - __bpf_constant_htons(x) : __bpf_htons(x)) -#define bpf_ntohs(x) \ - (__builtin_constant_p(x) ? \ - __bpf_constant_ntohs(x) : __bpf_ntohs(x)) -#define bpf_htonl(x) \ - (__builtin_constant_p(x) ? \ - __bpf_constant_htonl(x) : __bpf_htonl(x)) -#define bpf_ntohl(x) \ - (__builtin_constant_p(x) ? \ - __bpf_constant_ntohl(x) : __bpf_ntohl(x)) -#define bpf_cpu_to_be64(x) \ - (__builtin_constant_p(x) ? \ - __bpf_constant_cpu_to_be64(x) : __bpf_cpu_to_be64(x)) -#define bpf_be64_to_cpu(x) \ - (__builtin_constant_p(x) ? \ - __bpf_constant_be64_to_cpu(x) : __bpf_be64_to_cpu(x)) - -#endif /* __BPF_ENDIAN__ */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_gen_internal.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_gen_internal.h deleted file mode 100644 index 8198b25..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_gen_internal.h +++ /dev/null @@ -1,72 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -/* Copyright (c) 2021 Facebook */ -#ifndef __BPF_GEN_INTERNAL_H -#define __BPF_GEN_INTERNAL_H - -#include "bpf.h" - -struct ksym_relo_desc { - const char *name; - int kind; - int insn_idx; - bool is_weak; - bool is_typeless; -}; - -struct ksym_desc { - const char *name; - int ref; - int kind; - union { - /* used for kfunc */ - int off; - /* used for typeless ksym */ - bool typeless; - }; - int insn; -}; - -struct bpf_gen { - struct gen_loader_opts *opts; - void *data_start; - void *data_cur; - void *insn_start; - void *insn_cur; - ssize_t cleanup_label; - __u32 nr_progs; - __u32 nr_maps; - int log_level; - int error; - struct ksym_relo_desc *relos; - int relo_cnt; - struct bpf_core_relo *core_relos; - int core_relo_cnt; - char attach_target[128]; - int attach_kind; - struct ksym_desc *ksyms; - __u32 nr_ksyms; - int fd_array; - int nr_fd_array; -}; - -void bpf_gen__init(struct bpf_gen *gen, int log_level, int nr_progs, int nr_maps); -int bpf_gen__finish(struct bpf_gen *gen, int nr_progs, int nr_maps); -void bpf_gen__free(struct bpf_gen *gen); -void bpf_gen__load_btf(struct bpf_gen *gen, const void *raw_data, __u32 raw_size); -void bpf_gen__map_create(struct bpf_gen *gen, - enum bpf_map_type map_type, const char *map_name, - __u32 key_size, __u32 value_size, __u32 max_entries, - struct bpf_map_create_opts *map_attr, int map_idx); -void bpf_gen__prog_load(struct bpf_gen *gen, - enum bpf_prog_type prog_type, const char *prog_name, - const char *license, struct bpf_insn *insns, size_t insn_cnt, - struct bpf_prog_load_opts *load_attr, int prog_idx); -void bpf_gen__map_update_elem(struct bpf_gen *gen, int map_idx, void *value, __u32 value_size); -void bpf_gen__map_freeze(struct bpf_gen *gen, int map_idx); -void bpf_gen__record_attach_target(struct bpf_gen *gen, const char *name, enum bpf_attach_type type); -void bpf_gen__record_extern(struct bpf_gen *gen, const char *name, bool is_weak, - bool is_typeless, int kind, int insn_idx); -void bpf_gen__record_relo_core(struct bpf_gen *gen, const struct bpf_core_relo *core_relo); -void bpf_gen__populate_outer_map(struct bpf_gen *gen, int outer_map_idx, int key, int inner_map_idx); - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_helper_defs.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_helper_defs.h deleted file mode 100644 index a2c9398..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_helper_defs.h +++ /dev/null @@ -1,4578 +0,0 @@ -/* This is auto-generated file. See bpf_doc.py for details. */ - -/* Forward declarations of BPF structs */ -struct bpf_fib_lookup; -struct bpf_sk_lookup; -struct bpf_perf_event_data; -struct bpf_perf_event_value; -struct bpf_pidns_info; -struct bpf_redir_neigh; -struct bpf_sock; -struct bpf_sock_addr; -struct bpf_sock_ops; -struct bpf_sock_tuple; -struct bpf_spin_lock; -struct bpf_sysctl; -struct bpf_tcp_sock; -struct bpf_tunnel_key; -struct bpf_xfrm_state; -struct linux_binprm; -struct pt_regs; -struct sk_reuseport_md; -struct sockaddr; -struct tcphdr; -struct seq_file; -struct tcp6_sock; -struct tcp_sock; -struct tcp_timewait_sock; -struct tcp_request_sock; -struct udp6_sock; -struct unix_sock; -struct task_struct; -struct __sk_buff; -struct sk_msg_md; -struct xdp_md; -struct path; -struct btf_ptr; -struct inode; -struct socket; -struct file; -struct bpf_timer; -struct mptcp_sock; -struct bpf_dynptr; -struct iphdr; -struct ipv6hdr; - -/* - * bpf_map_lookup_elem - * - * Perform a lookup in *map* for an entry associated to *key*. - * - * Returns - * Map value associated to *key*, or **NULL** if no entry was - * found. - */ -static void *(*bpf_map_lookup_elem)(void *map, const void *key) = (void *) 1; - -/* - * bpf_map_update_elem - * - * Add or update the value of the entry associated to *key* in - * *map* with *value*. *flags* is one of: - * - * **BPF_NOEXIST** - * The entry for *key* must not exist in the map. - * **BPF_EXIST** - * The entry for *key* must already exist in the map. - * **BPF_ANY** - * No condition on the existence of the entry for *key*. - * - * Flag value **BPF_NOEXIST** cannot be used for maps of types - * **BPF_MAP_TYPE_ARRAY** or **BPF_MAP_TYPE_PERCPU_ARRAY** (all - * elements always exist), the helper would return an error. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_map_update_elem)(void *map, const void *key, const void *value, __u64 flags) = (void *) 2; - -/* - * bpf_map_delete_elem - * - * Delete entry with *key* from *map*. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_map_delete_elem)(void *map, const void *key) = (void *) 3; - -/* - * bpf_probe_read - * - * For tracing programs, safely attempt to read *size* bytes from - * kernel space address *unsafe_ptr* and store the data in *dst*. - * - * Generally, use **bpf_probe_read_user**\ () or - * **bpf_probe_read_kernel**\ () instead. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_probe_read)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 4; - -/* - * bpf_ktime_get_ns - * - * Return the time elapsed since system boot, in nanoseconds. - * Does not include time the system was suspended. - * See: **clock_gettime**\ (**CLOCK_MONOTONIC**) - * - * Returns - * Current *ktime*. - */ -static __u64 (*bpf_ktime_get_ns)(void) = (void *) 5; - -/* - * bpf_trace_printk - * - * This helper is a "printk()-like" facility for debugging. It - * prints a message defined by format *fmt* (of size *fmt_size*) - * to file *\/sys/kernel/debug/tracing/trace* from DebugFS, if - * available. It can take up to three additional **u64** - * arguments (as an eBPF helpers, the total number of arguments is - * limited to five). - * - * Each time the helper is called, it appends a line to the trace. - * Lines are discarded while *\/sys/kernel/debug/tracing/trace* is - * open, use *\/sys/kernel/debug/tracing/trace_pipe* to avoid this. - * The format of the trace is customizable, and the exact output - * one will get depends on the options set in - * *\/sys/kernel/debug/tracing/trace_options* (see also the - * *README* file under the same directory). However, it usually - * defaults to something like: - * - * :: - * - * telnet-470 [001] .N.. 419421.045894: 0x00000001: - * - * In the above: - * - * * ``telnet`` is the name of the current task. - * * ``470`` is the PID of the current task. - * * ``001`` is the CPU number on which the task is - * running. - * * In ``.N..``, each character refers to a set of - * options (whether irqs are enabled, scheduling - * options, whether hard/softirqs are running, level of - * preempt_disabled respectively). **N** means that - * **TIF_NEED_RESCHED** and **PREEMPT_NEED_RESCHED** - * are set. - * * ``419421.045894`` is a timestamp. - * * ``0x00000001`` is a fake value used by BPF for the - * instruction pointer register. - * * ```` is the message formatted with - * *fmt*. - * - * The conversion specifiers supported by *fmt* are similar, but - * more limited than for printk(). They are **%d**, **%i**, - * **%u**, **%x**, **%ld**, **%li**, **%lu**, **%lx**, **%lld**, - * **%lli**, **%llu**, **%llx**, **%p**, **%s**. No modifier (size - * of field, padding with zeroes, etc.) is available, and the - * helper will return **-EINVAL** (but print nothing) if it - * encounters an unknown specifier. - * - * Also, note that **bpf_trace_printk**\ () is slow, and should - * only be used for debugging purposes. For this reason, a notice - * block (spanning several lines) is printed to kernel logs and - * states that the helper should not be used "for production use" - * the first time this helper is used (or more precisely, when - * **trace_printk**\ () buffers are allocated). For passing values - * to user space, perf events should be preferred. - * - * Returns - * The number of bytes written to the buffer, or a negative error - * in case of failure. - */ -static long (*bpf_trace_printk)(const char *fmt, __u32 fmt_size, ...) = (void *) 6; - -/* - * bpf_get_prandom_u32 - * - * Get a pseudo-random number. - * - * From a security point of view, this helper uses its own - * pseudo-random internal state, and cannot be used to infer the - * seed of other random functions in the kernel. However, it is - * essential to note that the generator used by the helper is not - * cryptographically secure. - * - * Returns - * A random 32-bit unsigned value. - */ -static __u32 (*bpf_get_prandom_u32)(void) = (void *) 7; - -/* - * bpf_get_smp_processor_id - * - * Get the SMP (symmetric multiprocessing) processor id. Note that - * all programs run with migration disabled, which means that the - * SMP processor id is stable during all the execution of the - * program. - * - * Returns - * The SMP id of the processor running the program. - */ -static __u32 (*bpf_get_smp_processor_id)(void) = (void *) 8; - -/* - * bpf_skb_store_bytes - * - * Store *len* bytes from address *from* into the packet - * associated to *skb*, at *offset*. *flags* are a combination of - * **BPF_F_RECOMPUTE_CSUM** (automatically recompute the - * checksum for the packet after storing the bytes) and - * **BPF_F_INVALIDATE_HASH** (set *skb*\ **->hash**, *skb*\ - * **->swhash** and *skb*\ **->l4hash** to 0). - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_store_bytes)(struct __sk_buff *skb, __u32 offset, const void *from, __u32 len, __u64 flags) = (void *) 9; - -/* - * bpf_l3_csum_replace - * - * Recompute the layer 3 (e.g. IP) checksum for the packet - * associated to *skb*. Computation is incremental, so the helper - * must know the former value of the header field that was - * modified (*from*), the new value of this field (*to*), and the - * number of bytes (2 or 4) for this field, stored in *size*. - * Alternatively, it is possible to store the difference between - * the previous and the new values of the header field in *to*, by - * setting *from* and *size* to 0. For both methods, *offset* - * indicates the location of the IP checksum within the packet. - * - * This helper works in combination with **bpf_csum_diff**\ (), - * which does not update the checksum in-place, but offers more - * flexibility and can handle sizes larger than 2 or 4 for the - * checksum to update. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_l3_csum_replace)(struct __sk_buff *skb, __u32 offset, __u64 from, __u64 to, __u64 size) = (void *) 10; - -/* - * bpf_l4_csum_replace - * - * Recompute the layer 4 (e.g. TCP, UDP or ICMP) checksum for the - * packet associated to *skb*. Computation is incremental, so the - * helper must know the former value of the header field that was - * modified (*from*), the new value of this field (*to*), and the - * number of bytes (2 or 4) for this field, stored on the lowest - * four bits of *flags*. Alternatively, it is possible to store - * the difference between the previous and the new values of the - * header field in *to*, by setting *from* and the four lowest - * bits of *flags* to 0. For both methods, *offset* indicates the - * location of the IP checksum within the packet. In addition to - * the size of the field, *flags* can be added (bitwise OR) actual - * flags. With **BPF_F_MARK_MANGLED_0**, a null checksum is left - * untouched (unless **BPF_F_MARK_ENFORCE** is added as well), and - * for updates resulting in a null checksum the value is set to - * **CSUM_MANGLED_0** instead. Flag **BPF_F_PSEUDO_HDR** indicates - * the checksum is to be computed against a pseudo-header. - * - * This helper works in combination with **bpf_csum_diff**\ (), - * which does not update the checksum in-place, but offers more - * flexibility and can handle sizes larger than 2 or 4 for the - * checksum to update. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_l4_csum_replace)(struct __sk_buff *skb, __u32 offset, __u64 from, __u64 to, __u64 flags) = (void *) 11; - -/* - * bpf_tail_call - * - * This special helper is used to trigger a "tail call", or in - * other words, to jump into another eBPF program. The same stack - * frame is used (but values on stack and in registers for the - * caller are not accessible to the callee). This mechanism allows - * for program chaining, either for raising the maximum number of - * available eBPF instructions, or to execute given programs in - * conditional blocks. For security reasons, there is an upper - * limit to the number of successive tail calls that can be - * performed. - * - * Upon call of this helper, the program attempts to jump into a - * program referenced at index *index* in *prog_array_map*, a - * special map of type **BPF_MAP_TYPE_PROG_ARRAY**, and passes - * *ctx*, a pointer to the context. - * - * If the call succeeds, the kernel immediately runs the first - * instruction of the new program. This is not a function call, - * and it never returns to the previous program. If the call - * fails, then the helper has no effect, and the caller continues - * to run its subsequent instructions. A call can fail if the - * destination program for the jump does not exist (i.e. *index* - * is superior to the number of entries in *prog_array_map*), or - * if the maximum number of tail calls has been reached for this - * chain of programs. This limit is defined in the kernel by the - * macro **MAX_TAIL_CALL_CNT** (not accessible to user space), - * which is currently set to 33. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_tail_call)(void *ctx, void *prog_array_map, __u32 index) = (void *) 12; - -/* - * bpf_clone_redirect - * - * Clone and redirect the packet associated to *skb* to another - * net device of index *ifindex*. Both ingress and egress - * interfaces can be used for redirection. The **BPF_F_INGRESS** - * value in *flags* is used to make the distinction (ingress path - * is selected if the flag is present, egress path otherwise). - * This is the only flag supported for now. - * - * In comparison with **bpf_redirect**\ () helper, - * **bpf_clone_redirect**\ () has the associated cost of - * duplicating the packet buffer, but this can be executed out of - * the eBPF program. Conversely, **bpf_redirect**\ () is more - * efficient, but it is handled through an action code where the - * redirection happens only after the eBPF program has returned. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_clone_redirect)(struct __sk_buff *skb, __u32 ifindex, __u64 flags) = (void *) 13; - -/* - * bpf_get_current_pid_tgid - * - * Get the current pid and tgid. - * - * Returns - * A 64-bit integer containing the current tgid and pid, and - * created as such: - * *current_task*\ **->tgid << 32 \|** - * *current_task*\ **->pid**. - */ -static __u64 (*bpf_get_current_pid_tgid)(void) = (void *) 14; - -/* - * bpf_get_current_uid_gid - * - * Get the current uid and gid. - * - * Returns - * A 64-bit integer containing the current GID and UID, and - * created as such: *current_gid* **<< 32 \|** *current_uid*. - */ -static __u64 (*bpf_get_current_uid_gid)(void) = (void *) 15; - -/* - * bpf_get_current_comm - * - * Copy the **comm** attribute of the current task into *buf* of - * *size_of_buf*. The **comm** attribute contains the name of - * the executable (excluding the path) for the current task. The - * *size_of_buf* must be strictly positive. On success, the - * helper makes sure that the *buf* is NUL-terminated. On failure, - * it is filled with zeroes. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_get_current_comm)(void *buf, __u32 size_of_buf) = (void *) 16; - -/* - * bpf_get_cgroup_classid - * - * Retrieve the classid for the current task, i.e. for the net_cls - * cgroup to which *skb* belongs. - * - * This helper can be used on TC egress path, but not on ingress. - * - * The net_cls cgroup provides an interface to tag network packets - * based on a user-provided identifier for all traffic coming from - * the tasks belonging to the related cgroup. See also the related - * kernel documentation, available from the Linux sources in file - * *Documentation/admin-guide/cgroup-v1/net_cls.rst*. - * - * The Linux kernel has two versions for cgroups: there are - * cgroups v1 and cgroups v2. Both are available to users, who can - * use a mixture of them, but note that the net_cls cgroup is for - * cgroup v1 only. This makes it incompatible with BPF programs - * run on cgroups, which is a cgroup-v2-only feature (a socket can - * only hold data for one version of cgroups at a time). - * - * This helper is only available is the kernel was compiled with - * the **CONFIG_CGROUP_NET_CLASSID** configuration option set to - * "**y**" or to "**m**". - * - * Returns - * The classid, or 0 for the default unconfigured classid. - */ -static __u32 (*bpf_get_cgroup_classid)(struct __sk_buff *skb) = (void *) 17; - -/* - * bpf_skb_vlan_push - * - * Push a *vlan_tci* (VLAN tag control information) of protocol - * *vlan_proto* to the packet associated to *skb*, then update - * the checksum. Note that if *vlan_proto* is different from - * **ETH_P_8021Q** and **ETH_P_8021AD**, it is considered to - * be **ETH_P_8021Q**. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_vlan_push)(struct __sk_buff *skb, __be16 vlan_proto, __u16 vlan_tci) = (void *) 18; - -/* - * bpf_skb_vlan_pop - * - * Pop a VLAN header from the packet associated to *skb*. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_vlan_pop)(struct __sk_buff *skb) = (void *) 19; - -/* - * bpf_skb_get_tunnel_key - * - * Get tunnel metadata. This helper takes a pointer *key* to an - * empty **struct bpf_tunnel_key** of **size**, that will be - * filled with tunnel metadata for the packet associated to *skb*. - * The *flags* can be set to **BPF_F_TUNINFO_IPV6**, which - * indicates that the tunnel is based on IPv6 protocol instead of - * IPv4. - * - * The **struct bpf_tunnel_key** is an object that generalizes the - * principal parameters used by various tunneling protocols into a - * single struct. This way, it can be used to easily make a - * decision based on the contents of the encapsulation header, - * "summarized" in this struct. In particular, it holds the IP - * address of the remote end (IPv4 or IPv6, depending on the case) - * in *key*\ **->remote_ipv4** or *key*\ **->remote_ipv6**. Also, - * this struct exposes the *key*\ **->tunnel_id**, which is - * generally mapped to a VNI (Virtual Network Identifier), making - * it programmable together with the **bpf_skb_set_tunnel_key**\ - * () helper. - * - * Let's imagine that the following code is part of a program - * attached to the TC ingress interface, on one end of a GRE - * tunnel, and is supposed to filter out all messages coming from - * remote ends with IPv4 address other than 10.0.0.1: - * - * :: - * - * int ret; - * struct bpf_tunnel_key key = {}; - * - * ret = bpf_skb_get_tunnel_key(skb, &key, sizeof(key), 0); - * if (ret < 0) - * return TC_ACT_SHOT; // drop packet - * - * if (key.remote_ipv4 != 0x0a000001) - * return TC_ACT_SHOT; // drop packet - * - * return TC_ACT_OK; // accept packet - * - * This interface can also be used with all encapsulation devices - * that can operate in "collect metadata" mode: instead of having - * one network device per specific configuration, the "collect - * metadata" mode only requires a single device where the - * configuration can be extracted from this helper. - * - * This can be used together with various tunnels such as VXLan, - * Geneve, GRE or IP in IP (IPIP). - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_get_tunnel_key)(struct __sk_buff *skb, struct bpf_tunnel_key *key, __u32 size, __u64 flags) = (void *) 20; - -/* - * bpf_skb_set_tunnel_key - * - * Populate tunnel metadata for packet associated to *skb.* The - * tunnel metadata is set to the contents of *key*, of *size*. The - * *flags* can be set to a combination of the following values: - * - * **BPF_F_TUNINFO_IPV6** - * Indicate that the tunnel is based on IPv6 protocol - * instead of IPv4. - * **BPF_F_ZERO_CSUM_TX** - * For IPv4 packets, add a flag to tunnel metadata - * indicating that checksum computation should be skipped - * and checksum set to zeroes. - * **BPF_F_DONT_FRAGMENT** - * Add a flag to tunnel metadata indicating that the - * packet should not be fragmented. - * **BPF_F_SEQ_NUMBER** - * Add a flag to tunnel metadata indicating that a - * sequence number should be added to tunnel header before - * sending the packet. This flag was added for GRE - * encapsulation, but might be used with other protocols - * as well in the future. - * - * Here is a typical usage on the transmit path: - * - * :: - * - * struct bpf_tunnel_key key; - * populate key ... - * bpf_skb_set_tunnel_key(skb, &key, sizeof(key), 0); - * bpf_clone_redirect(skb, vxlan_dev_ifindex, 0); - * - * See also the description of the **bpf_skb_get_tunnel_key**\ () - * helper for additional information. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_set_tunnel_key)(struct __sk_buff *skb, struct bpf_tunnel_key *key, __u32 size, __u64 flags) = (void *) 21; - -/* - * bpf_perf_event_read - * - * Read the value of a perf event counter. This helper relies on a - * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of - * the perf event counter is selected when *map* is updated with - * perf event file descriptors. The *map* is an array whose size - * is the number of available CPUs, and each cell contains a value - * relative to one CPU. The value to retrieve is indicated by - * *flags*, that contains the index of the CPU to look up, masked - * with **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to - * **BPF_F_CURRENT_CPU** to indicate that the value for the - * current CPU should be retrieved. - * - * Note that before Linux 4.13, only hardware perf event can be - * retrieved. - * - * Also, be aware that the newer helper - * **bpf_perf_event_read_value**\ () is recommended over - * **bpf_perf_event_read**\ () in general. The latter has some ABI - * quirks where error and counter value are used as a return code - * (which is wrong to do since ranges may overlap). This issue is - * fixed with **bpf_perf_event_read_value**\ (), which at the same - * time provides more features over the **bpf_perf_event_read**\ - * () interface. Please refer to the description of - * **bpf_perf_event_read_value**\ () for details. - * - * Returns - * The value of the perf event counter read from the map, or a - * negative error code in case of failure. - */ -static __u64 (*bpf_perf_event_read)(void *map, __u64 flags) = (void *) 22; - -/* - * bpf_redirect - * - * Redirect the packet to another net device of index *ifindex*. - * This helper is somewhat similar to **bpf_clone_redirect**\ - * (), except that the packet is not cloned, which provides - * increased performance. - * - * Except for XDP, both ingress and egress interfaces can be used - * for redirection. The **BPF_F_INGRESS** value in *flags* is used - * to make the distinction (ingress path is selected if the flag - * is present, egress path otherwise). Currently, XDP only - * supports redirection to the egress interface, and accepts no - * flag at all. - * - * The same effect can also be attained with the more generic - * **bpf_redirect_map**\ (), which uses a BPF map to store the - * redirect target instead of providing it directly to the helper. - * - * Returns - * For XDP, the helper returns **XDP_REDIRECT** on success or - * **XDP_ABORTED** on error. For other program types, the values - * are **TC_ACT_REDIRECT** on success or **TC_ACT_SHOT** on - * error. - */ -static long (*bpf_redirect)(__u32 ifindex, __u64 flags) = (void *) 23; - -/* - * bpf_get_route_realm - * - * Retrieve the realm or the route, that is to say the - * **tclassid** field of the destination for the *skb*. The - * identifier retrieved is a user-provided tag, similar to the - * one used with the net_cls cgroup (see description for - * **bpf_get_cgroup_classid**\ () helper), but here this tag is - * held by a route (a destination entry), not by a task. - * - * Retrieving this identifier works with the clsact TC egress hook - * (see also **tc-bpf(8)**), or alternatively on conventional - * classful egress qdiscs, but not on TC ingress path. In case of - * clsact TC egress hook, this has the advantage that, internally, - * the destination entry has not been dropped yet in the transmit - * path. Therefore, the destination entry does not need to be - * artificially held via **netif_keep_dst**\ () for a classful - * qdisc until the *skb* is freed. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_IP_ROUTE_CLASSID** configuration option. - * - * Returns - * The realm of the route for the packet associated to *skb*, or 0 - * if none was found. - */ -static __u32 (*bpf_get_route_realm)(struct __sk_buff *skb) = (void *) 24; - -/* - * bpf_perf_event_output - * - * Write raw *data* blob into a special BPF perf event held by - * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf - * event must have the following attributes: **PERF_SAMPLE_RAW** - * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and - * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. - * - * The *flags* are used to indicate the index in *map* for which - * the value must be put, masked with **BPF_F_INDEX_MASK**. - * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** - * to indicate that the index of the current CPU core should be - * used. - * - * The value to write, of *size*, is passed through eBPF stack and - * pointed by *data*. - * - * The context of the program *ctx* needs also be passed to the - * helper. - * - * On user space, a program willing to read the values needs to - * call **perf_event_open**\ () on the perf event (either for - * one or for all CPUs) and to store the file descriptor into the - * *map*. This must be done before the eBPF program can send data - * into it. An example is available in file - * *samples/bpf/trace_output_user.c* in the Linux kernel source - * tree (the eBPF program counterpart is in - * *samples/bpf/trace_output_kern.c*). - * - * **bpf_perf_event_output**\ () achieves better performance - * than **bpf_trace_printk**\ () for sharing data with user - * space, and is much better suitable for streaming data from eBPF - * programs. - * - * Note that this helper is not restricted to tracing use cases - * and can be used with programs attached to TC or XDP as well, - * where it allows for passing data to user space listeners. Data - * can be: - * - * * Only custom structs, - * * Only the packet payload, or - * * A combination of both. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_perf_event_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 25; - -/* - * bpf_skb_load_bytes - * - * This helper was provided as an easy way to load data from a - * packet. It can be used to load *len* bytes from *offset* from - * the packet associated to *skb*, into the buffer pointed by - * *to*. - * - * Since Linux 4.7, usage of this helper has mostly been replaced - * by "direct packet access", enabling packet data to be - * manipulated with *skb*\ **->data** and *skb*\ **->data_end** - * pointing respectively to the first byte of packet data and to - * the byte after the last byte of packet data. However, it - * remains useful if one wishes to read large quantities of data - * at once from a packet into the eBPF stack. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_load_bytes)(const void *skb, __u32 offset, void *to, __u32 len) = (void *) 26; - -/* - * bpf_get_stackid - * - * Walk a user or a kernel stack and return its id. To achieve - * this, the helper needs *ctx*, which is a pointer to the context - * on which the tracing program is executed, and a pointer to a - * *map* of type **BPF_MAP_TYPE_STACK_TRACE**. - * - * The last argument, *flags*, holds the number of stack frames to - * skip (from 0 to 255), masked with - * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set - * a combination of the following flags: - * - * **BPF_F_USER_STACK** - * Collect a user space stack instead of a kernel stack. - * **BPF_F_FAST_STACK_CMP** - * Compare stacks by hash only. - * **BPF_F_REUSE_STACKID** - * If two different stacks hash into the same *stackid*, - * discard the old one. - * - * The stack id retrieved is a 32 bit long integer handle which - * can be further combined with other data (including other stack - * ids) and used as a key into maps. This can be useful for - * generating a variety of graphs (such as flame graphs or off-cpu - * graphs). - * - * For walking a stack, this helper is an improvement over - * **bpf_probe_read**\ (), which can be used with unrolled loops - * but is not efficient and consumes a lot of eBPF instructions. - * Instead, **bpf_get_stackid**\ () can collect up to - * **PERF_MAX_STACK_DEPTH** both kernel and user frames. Note that - * this limit can be controlled with the **sysctl** program, and - * that it should be manually increased in order to profile long - * user stacks (such as stacks for Java programs). To do so, use: - * - * :: - * - * # sysctl kernel.perf_event_max_stack= - * - * Returns - * The positive or null stack id on success, or a negative error - * in case of failure. - */ -static long (*bpf_get_stackid)(void *ctx, void *map, __u64 flags) = (void *) 27; - -/* - * bpf_csum_diff - * - * Compute a checksum difference, from the raw buffer pointed by - * *from*, of length *from_size* (that must be a multiple of 4), - * towards the raw buffer pointed by *to*, of size *to_size* - * (same remark). An optional *seed* can be added to the value - * (this can be cascaded, the seed may come from a previous call - * to the helper). - * - * This is flexible enough to be used in several ways: - * - * * With *from_size* == 0, *to_size* > 0 and *seed* set to - * checksum, it can be used when pushing new data. - * * With *from_size* > 0, *to_size* == 0 and *seed* set to - * checksum, it can be used when removing data from a packet. - * * With *from_size* > 0, *to_size* > 0 and *seed* set to 0, it - * can be used to compute a diff. Note that *from_size* and - * *to_size* do not need to be equal. - * - * This helper can be used in combination with - * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ (), to - * which one can feed in the difference computed with - * **bpf_csum_diff**\ (). - * - * Returns - * The checksum result, or a negative error code in case of - * failure. - */ -static __s64 (*bpf_csum_diff)(__be32 *from, __u32 from_size, __be32 *to, __u32 to_size, __wsum seed) = (void *) 28; - -/* - * bpf_skb_get_tunnel_opt - * - * Retrieve tunnel options metadata for the packet associated to - * *skb*, and store the raw tunnel option data to the buffer *opt* - * of *size*. - * - * This helper can be used with encapsulation devices that can - * operate in "collect metadata" mode (please refer to the related - * note in the description of **bpf_skb_get_tunnel_key**\ () for - * more details). A particular example where this can be used is - * in combination with the Geneve encapsulation protocol, where it - * allows for pushing (with **bpf_skb_get_tunnel_opt**\ () helper) - * and retrieving arbitrary TLVs (Type-Length-Value headers) from - * the eBPF program. This allows for full customization of these - * headers. - * - * Returns - * The size of the option data retrieved. - */ -static long (*bpf_skb_get_tunnel_opt)(struct __sk_buff *skb, void *opt, __u32 size) = (void *) 29; - -/* - * bpf_skb_set_tunnel_opt - * - * Set tunnel options metadata for the packet associated to *skb* - * to the option data contained in the raw buffer *opt* of *size*. - * - * See also the description of the **bpf_skb_get_tunnel_opt**\ () - * helper for additional information. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_set_tunnel_opt)(struct __sk_buff *skb, void *opt, __u32 size) = (void *) 30; - -/* - * bpf_skb_change_proto - * - * Change the protocol of the *skb* to *proto*. Currently - * supported are transition from IPv4 to IPv6, and from IPv6 to - * IPv4. The helper takes care of the groundwork for the - * transition, including resizing the socket buffer. The eBPF - * program is expected to fill the new headers, if any, via - * **skb_store_bytes**\ () and to recompute the checksums with - * **bpf_l3_csum_replace**\ () and **bpf_l4_csum_replace**\ - * (). The main case for this helper is to perform NAT64 - * operations out of an eBPF program. - * - * Internally, the GSO type is marked as dodgy so that headers are - * checked and segments are recalculated by the GSO/GRO engine. - * The size for GSO target is adapted as well. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_change_proto)(struct __sk_buff *skb, __be16 proto, __u64 flags) = (void *) 31; - -/* - * bpf_skb_change_type - * - * Change the packet type for the packet associated to *skb*. This - * comes down to setting *skb*\ **->pkt_type** to *type*, except - * the eBPF program does not have a write access to *skb*\ - * **->pkt_type** beside this helper. Using a helper here allows - * for graceful handling of errors. - * - * The major use case is to change incoming *skb*s to - * **PACKET_HOST** in a programmatic way instead of having to - * recirculate via **redirect**\ (..., **BPF_F_INGRESS**), for - * example. - * - * Note that *type* only allows certain values. At this time, they - * are: - * - * **PACKET_HOST** - * Packet is for us. - * **PACKET_BROADCAST** - * Send packet to all. - * **PACKET_MULTICAST** - * Send packet to group. - * **PACKET_OTHERHOST** - * Send packet to someone else. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_change_type)(struct __sk_buff *skb, __u32 type) = (void *) 32; - -/* - * bpf_skb_under_cgroup - * - * Check whether *skb* is a descendant of the cgroup2 held by - * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. - * - * Returns - * The return value depends on the result of the test, and can be: - * - * * 0, if the *skb* failed the cgroup2 descendant test. - * * 1, if the *skb* succeeded the cgroup2 descendant test. - * * A negative error code, if an error occurred. - */ -static long (*bpf_skb_under_cgroup)(struct __sk_buff *skb, void *map, __u32 index) = (void *) 33; - -/* - * bpf_get_hash_recalc - * - * Retrieve the hash of the packet, *skb*\ **->hash**. If it is - * not set, in particular if the hash was cleared due to mangling, - * recompute this hash. Later accesses to the hash can be done - * directly with *skb*\ **->hash**. - * - * Calling **bpf_set_hash_invalid**\ (), changing a packet - * prototype with **bpf_skb_change_proto**\ (), or calling - * **bpf_skb_store_bytes**\ () with the - * **BPF_F_INVALIDATE_HASH** are actions susceptible to clear - * the hash and to trigger a new computation for the next call to - * **bpf_get_hash_recalc**\ (). - * - * Returns - * The 32-bit hash. - */ -static __u32 (*bpf_get_hash_recalc)(struct __sk_buff *skb) = (void *) 34; - -/* - * bpf_get_current_task - * - * Get the current task. - * - * Returns - * A pointer to the current task struct. - */ -static __u64 (*bpf_get_current_task)(void) = (void *) 35; - -/* - * bpf_probe_write_user - * - * Attempt in a safe way to write *len* bytes from the buffer - * *src* to *dst* in memory. It only works for threads that are in - * user context, and *dst* must be a valid user space address. - * - * This helper should not be used to implement any kind of - * security mechanism because of TOC-TOU attacks, but rather to - * debug, divert, and manipulate execution of semi-cooperative - * processes. - * - * Keep in mind that this feature is meant for experiments, and it - * has a risk of crashing the system and running programs. - * Therefore, when an eBPF program using this helper is attached, - * a warning including PID and process name is printed to kernel - * logs. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_probe_write_user)(void *dst, const void *src, __u32 len) = (void *) 36; - -/* - * bpf_current_task_under_cgroup - * - * Check whether the probe is being run is the context of a given - * subset of the cgroup2 hierarchy. The cgroup2 to test is held by - * *map* of type **BPF_MAP_TYPE_CGROUP_ARRAY**, at *index*. - * - * Returns - * The return value depends on the result of the test, and can be: - * - * * 1, if current task belongs to the cgroup2. - * * 0, if current task does not belong to the cgroup2. - * * A negative error code, if an error occurred. - */ -static long (*bpf_current_task_under_cgroup)(void *map, __u32 index) = (void *) 37; - -/* - * bpf_skb_change_tail - * - * Resize (trim or grow) the packet associated to *skb* to the - * new *len*. The *flags* are reserved for future usage, and must - * be left at zero. - * - * The basic idea is that the helper performs the needed work to - * change the size of the packet, then the eBPF program rewrites - * the rest via helpers like **bpf_skb_store_bytes**\ (), - * **bpf_l3_csum_replace**\ (), **bpf_l3_csum_replace**\ () - * and others. This helper is a slow path utility intended for - * replies with control messages. And because it is targeted for - * slow path, the helper itself can afford to be slow: it - * implicitly linearizes, unclones and drops offloads from the - * *skb*. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_change_tail)(struct __sk_buff *skb, __u32 len, __u64 flags) = (void *) 38; - -/* - * bpf_skb_pull_data - * - * Pull in non-linear data in case the *skb* is non-linear and not - * all of *len* are part of the linear section. Make *len* bytes - * from *skb* readable and writable. If a zero value is passed for - * *len*, then the whole length of the *skb* is pulled. - * - * This helper is only needed for reading and writing with direct - * packet access. - * - * For direct packet access, testing that offsets to access - * are within packet boundaries (test on *skb*\ **->data_end**) is - * susceptible to fail if offsets are invalid, or if the requested - * data is in non-linear parts of the *skb*. On failure the - * program can just bail out, or in the case of a non-linear - * buffer, use a helper to make the data available. The - * **bpf_skb_load_bytes**\ () helper is a first solution to access - * the data. Another one consists in using **bpf_skb_pull_data** - * to pull in once the non-linear parts, then retesting and - * eventually access the data. - * - * At the same time, this also makes sure the *skb* is uncloned, - * which is a necessary condition for direct write. As this needs - * to be an invariant for the write part only, the verifier - * detects writes and adds a prologue that is calling - * **bpf_skb_pull_data()** to effectively unclone the *skb* from - * the very beginning in case it is indeed cloned. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_pull_data)(struct __sk_buff *skb, __u32 len) = (void *) 39; - -/* - * bpf_csum_update - * - * Add the checksum *csum* into *skb*\ **->csum** in case the - * driver has supplied a checksum for the entire packet into that - * field. Return an error otherwise. This helper is intended to be - * used in combination with **bpf_csum_diff**\ (), in particular - * when the checksum needs to be updated after data has been - * written into the packet through direct packet access. - * - * Returns - * The checksum on success, or a negative error code in case of - * failure. - */ -static __s64 (*bpf_csum_update)(struct __sk_buff *skb, __wsum csum) = (void *) 40; - -/* - * bpf_set_hash_invalid - * - * Invalidate the current *skb*\ **->hash**. It can be used after - * mangling on headers through direct packet access, in order to - * indicate that the hash is outdated and to trigger a - * recalculation the next time the kernel tries to access this - * hash or when the **bpf_get_hash_recalc**\ () helper is called. - * - * Returns - * void. - */ -static void (*bpf_set_hash_invalid)(struct __sk_buff *skb) = (void *) 41; - -/* - * bpf_get_numa_node_id - * - * Return the id of the current NUMA node. The primary use case - * for this helper is the selection of sockets for the local NUMA - * node, when the program is attached to sockets using the - * **SO_ATTACH_REUSEPORT_EBPF** option (see also **socket(7)**), - * but the helper is also available to other eBPF program types, - * similarly to **bpf_get_smp_processor_id**\ (). - * - * Returns - * The id of current NUMA node. - */ -static long (*bpf_get_numa_node_id)(void) = (void *) 42; - -/* - * bpf_skb_change_head - * - * Grows headroom of packet associated to *skb* and adjusts the - * offset of the MAC header accordingly, adding *len* bytes of - * space. It automatically extends and reallocates memory as - * required. - * - * This helper can be used on a layer 3 *skb* to push a MAC header - * for redirection into a layer 2 device. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_change_head)(struct __sk_buff *skb, __u32 len, __u64 flags) = (void *) 43; - -/* - * bpf_xdp_adjust_head - * - * Adjust (move) *xdp_md*\ **->data** by *delta* bytes. Note that - * it is possible to use a negative value for *delta*. This helper - * can be used to prepare the packet for pushing or popping - * headers. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_xdp_adjust_head)(struct xdp_md *xdp_md, int delta) = (void *) 44; - -/* - * bpf_probe_read_str - * - * Copy a NUL terminated string from an unsafe kernel address - * *unsafe_ptr* to *dst*. See **bpf_probe_read_kernel_str**\ () for - * more details. - * - * Generally, use **bpf_probe_read_user_str**\ () or - * **bpf_probe_read_kernel_str**\ () instead. - * - * Returns - * On success, the strictly positive length of the string, - * including the trailing NUL character. On error, a negative - * value. - */ -static long (*bpf_probe_read_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 45; - -/* - * bpf_get_socket_cookie - * - * If the **struct sk_buff** pointed by *skb* has a known socket, - * retrieve the cookie (generated by the kernel) of this socket. - * If no cookie has been set yet, generate a new cookie. Once - * generated, the socket cookie remains stable for the life of the - * socket. This helper can be useful for monitoring per socket - * networking traffic statistics as it provides a global socket - * identifier that can be assumed unique. - * - * Returns - * A 8-byte long unique number on success, or 0 if the socket - * field is missing inside *skb*. - */ -static __u64 (*bpf_get_socket_cookie)(void *ctx) = (void *) 46; - -/* - * bpf_get_socket_uid - * - * Get the owner UID of the socked associated to *skb*. - * - * Returns - * The owner UID of the socket associated to *skb*. If the socket - * is **NULL**, or if it is not a full socket (i.e. if it is a - * time-wait or a request socket instead), **overflowuid** value - * is returned (note that **overflowuid** might also be the actual - * UID value for the socket). - */ -static __u32 (*bpf_get_socket_uid)(struct __sk_buff *skb) = (void *) 47; - -/* - * bpf_set_hash - * - * Set the full hash for *skb* (set the field *skb*\ **->hash**) - * to value *hash*. - * - * Returns - * 0 - */ -static long (*bpf_set_hash)(struct __sk_buff *skb, __u32 hash) = (void *) 48; - -/* - * bpf_setsockopt - * - * Emulate a call to **setsockopt()** on the socket associated to - * *bpf_socket*, which must be a full socket. The *level* at - * which the option resides and the name *optname* of the option - * must be specified, see **setsockopt(2)** for more information. - * The option value of length *optlen* is pointed by *optval*. - * - * *bpf_socket* should be one of the following: - * - * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. - * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** - * and **BPF_CGROUP_INET6_CONNECT**. - * - * This helper actually implements a subset of **setsockopt()**. - * It supports the following *level*\ s: - * - * * **SOL_SOCKET**, which supports the following *optname*\ s: - * **SO_RCVBUF**, **SO_SNDBUF**, **SO_MAX_PACING_RATE**, - * **SO_PRIORITY**, **SO_RCVLOWAT**, **SO_MARK**, - * **SO_BINDTODEVICE**, **SO_KEEPALIVE**. - * * **IPPROTO_TCP**, which supports the following *optname*\ s: - * **TCP_CONGESTION**, **TCP_BPF_IW**, - * **TCP_BPF_SNDCWND_CLAMP**, **TCP_SAVE_SYN**, - * **TCP_KEEPIDLE**, **TCP_KEEPINTVL**, **TCP_KEEPCNT**, - * **TCP_SYNCNT**, **TCP_USER_TIMEOUT**, **TCP_NOTSENT_LOWAT**. - * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. - * * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_setsockopt)(void *bpf_socket, int level, int optname, void *optval, int optlen) = (void *) 49; - -/* - * bpf_skb_adjust_room - * - * Grow or shrink the room for data in the packet associated to - * *skb* by *len_diff*, and according to the selected *mode*. - * - * By default, the helper will reset any offloaded checksum - * indicator of the skb to CHECKSUM_NONE. This can be avoided - * by the following flag: - * - * * **BPF_F_ADJ_ROOM_NO_CSUM_RESET**: Do not reset offloaded - * checksum data of the skb to CHECKSUM_NONE. - * - * There are two supported modes at this time: - * - * * **BPF_ADJ_ROOM_MAC**: Adjust room at the mac layer - * (room space is added or removed below the layer 2 header). - * - * * **BPF_ADJ_ROOM_NET**: Adjust room at the network layer - * (room space is added or removed below the layer 3 header). - * - * The following flags are supported at this time: - * - * * **BPF_F_ADJ_ROOM_FIXED_GSO**: Do not adjust gso_size. - * Adjusting mss in this way is not allowed for datagrams. - * - * * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV4**, - * **BPF_F_ADJ_ROOM_ENCAP_L3_IPV6**: - * Any new space is reserved to hold a tunnel header. - * Configure skb offsets and other fields accordingly. - * - * * **BPF_F_ADJ_ROOM_ENCAP_L4_GRE**, - * **BPF_F_ADJ_ROOM_ENCAP_L4_UDP**: - * Use with ENCAP_L3 flags to further specify the tunnel type. - * - * * **BPF_F_ADJ_ROOM_ENCAP_L2**\ (*len*): - * Use with ENCAP_L3/L4 flags to further specify the tunnel - * type; *len* is the length of the inner MAC header. - * - * * **BPF_F_ADJ_ROOM_ENCAP_L2_ETH**: - * Use with BPF_F_ADJ_ROOM_ENCAP_L2 flag to further specify the - * L2 type as Ethernet. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_adjust_room)(struct __sk_buff *skb, __s32 len_diff, __u32 mode, __u64 flags) = (void *) 50; - -/* - * bpf_redirect_map - * - * Redirect the packet to the endpoint referenced by *map* at - * index *key*. Depending on its type, this *map* can contain - * references to net devices (for forwarding packets through other - * ports), or to CPUs (for redirecting XDP frames to another CPU; - * but this is only implemented for native XDP (with driver - * support) as of this writing). - * - * The lower two bits of *flags* are used as the return code if - * the map lookup fails. This is so that the return value can be - * one of the XDP program return codes up to **XDP_TX**, as chosen - * by the caller. The higher bits of *flags* can be set to - * BPF_F_BROADCAST or BPF_F_EXCLUDE_INGRESS as defined below. - * - * With BPF_F_BROADCAST the packet will be broadcasted to all the - * interfaces in the map, with BPF_F_EXCLUDE_INGRESS the ingress - * interface will be excluded when do broadcasting. - * - * See also **bpf_redirect**\ (), which only supports redirecting - * to an ifindex, but doesn't require a map to do so. - * - * Returns - * **XDP_REDIRECT** on success, or the value of the two lower bits - * of the *flags* argument on error. - */ -static long (*bpf_redirect_map)(void *map, __u32 key, __u64 flags) = (void *) 51; - -/* - * bpf_sk_redirect_map - * - * Redirect the packet to the socket referenced by *map* (of type - * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and - * egress interfaces can be used for redirection. The - * **BPF_F_INGRESS** value in *flags* is used to make the - * distinction (ingress path is selected if the flag is present, - * egress path otherwise). This is the only flag supported for now. - * - * Returns - * **SK_PASS** on success, or **SK_DROP** on error. - */ -static long (*bpf_sk_redirect_map)(struct __sk_buff *skb, void *map, __u32 key, __u64 flags) = (void *) 52; - -/* - * bpf_sock_map_update - * - * Add an entry to, or update a *map* referencing sockets. The - * *skops* is used as a new value for the entry associated to - * *key*. *flags* is one of: - * - * **BPF_NOEXIST** - * The entry for *key* must not exist in the map. - * **BPF_EXIST** - * The entry for *key* must already exist in the map. - * **BPF_ANY** - * No condition on the existence of the entry for *key*. - * - * If the *map* has eBPF programs (parser and verdict), those will - * be inherited by the socket being added. If the socket is - * already attached to eBPF programs, this results in an error. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_sock_map_update)(struct bpf_sock_ops *skops, void *map, void *key, __u64 flags) = (void *) 53; - -/* - * bpf_xdp_adjust_meta - * - * Adjust the address pointed by *xdp_md*\ **->data_meta** by - * *delta* (which can be positive or negative). Note that this - * operation modifies the address stored in *xdp_md*\ **->data**, - * so the latter must be loaded only after the helper has been - * called. - * - * The use of *xdp_md*\ **->data_meta** is optional and programs - * are not required to use it. The rationale is that when the - * packet is processed with XDP (e.g. as DoS filter), it is - * possible to push further meta data along with it before passing - * to the stack, and to give the guarantee that an ingress eBPF - * program attached as a TC classifier on the same device can pick - * this up for further post-processing. Since TC works with socket - * buffers, it remains possible to set from XDP the **mark** or - * **priority** pointers, or other pointers for the socket buffer. - * Having this scratch space generic and programmable allows for - * more flexibility as the user is free to store whatever meta - * data they need. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_xdp_adjust_meta)(struct xdp_md *xdp_md, int delta) = (void *) 54; - -/* - * bpf_perf_event_read_value - * - * Read the value of a perf event counter, and store it into *buf* - * of size *buf_size*. This helper relies on a *map* of type - * **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. The nature of the perf event - * counter is selected when *map* is updated with perf event file - * descriptors. The *map* is an array whose size is the number of - * available CPUs, and each cell contains a value relative to one - * CPU. The value to retrieve is indicated by *flags*, that - * contains the index of the CPU to look up, masked with - * **BPF_F_INDEX_MASK**. Alternatively, *flags* can be set to - * **BPF_F_CURRENT_CPU** to indicate that the value for the - * current CPU should be retrieved. - * - * This helper behaves in a way close to - * **bpf_perf_event_read**\ () helper, save that instead of - * just returning the value observed, it fills the *buf* - * structure. This allows for additional data to be retrieved: in - * particular, the enabled and running times (in *buf*\ - * **->enabled** and *buf*\ **->running**, respectively) are - * copied. In general, **bpf_perf_event_read_value**\ () is - * recommended over **bpf_perf_event_read**\ (), which has some - * ABI issues and provides fewer functionalities. - * - * These values are interesting, because hardware PMU (Performance - * Monitoring Unit) counters are limited resources. When there are - * more PMU based perf events opened than available counters, - * kernel will multiplex these events so each event gets certain - * percentage (but not all) of the PMU time. In case that - * multiplexing happens, the number of samples or counter value - * will not reflect the case compared to when no multiplexing - * occurs. This makes comparison between different runs difficult. - * Typically, the counter value should be normalized before - * comparing to other experiments. The usual normalization is done - * as follows. - * - * :: - * - * normalized_counter = counter * t_enabled / t_running - * - * Where t_enabled is the time enabled for event and t_running is - * the time running for event since last normalization. The - * enabled and running times are accumulated since the perf event - * open. To achieve scaling factor between two invocations of an - * eBPF program, users can use CPU id as the key (which is - * typical for perf array usage model) to remember the previous - * value and do the calculation inside the eBPF program. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_perf_event_read_value)(void *map, __u64 flags, struct bpf_perf_event_value *buf, __u32 buf_size) = (void *) 55; - -/* - * bpf_perf_prog_read_value - * - * For en eBPF program attached to a perf event, retrieve the - * value of the event counter associated to *ctx* and store it in - * the structure pointed by *buf* and of size *buf_size*. Enabled - * and running times are also stored in the structure (see - * description of helper **bpf_perf_event_read_value**\ () for - * more details). - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_perf_prog_read_value)(struct bpf_perf_event_data *ctx, struct bpf_perf_event_value *buf, __u32 buf_size) = (void *) 56; - -/* - * bpf_getsockopt - * - * Emulate a call to **getsockopt()** on the socket associated to - * *bpf_socket*, which must be a full socket. The *level* at - * which the option resides and the name *optname* of the option - * must be specified, see **getsockopt(2)** for more information. - * The retrieved value is stored in the structure pointed by - * *opval* and of length *optlen*. - * - * *bpf_socket* should be one of the following: - * - * * **struct bpf_sock_ops** for **BPF_PROG_TYPE_SOCK_OPS**. - * * **struct bpf_sock_addr** for **BPF_CGROUP_INET4_CONNECT** - * and **BPF_CGROUP_INET6_CONNECT**. - * - * This helper actually implements a subset of **getsockopt()**. - * It supports the following *level*\ s: - * - * * **IPPROTO_TCP**, which supports *optname* - * **TCP_CONGESTION**. - * * **IPPROTO_IP**, which supports *optname* **IP_TOS**. - * * **IPPROTO_IPV6**, which supports *optname* **IPV6_TCLASS**. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_getsockopt)(void *bpf_socket, int level, int optname, void *optval, int optlen) = (void *) 57; - -/* - * bpf_override_return - * - * Used for error injection, this helper uses kprobes to override - * the return value of the probed function, and to set it to *rc*. - * The first argument is the context *regs* on which the kprobe - * works. - * - * This helper works by setting the PC (program counter) - * to an override function which is run in place of the original - * probed function. This means the probed function is not run at - * all. The replacement function just returns with the required - * value. - * - * This helper has security implications, and thus is subject to - * restrictions. It is only available if the kernel was compiled - * with the **CONFIG_BPF_KPROBE_OVERRIDE** configuration - * option, and in this case it only works on functions tagged with - * **ALLOW_ERROR_INJECTION** in the kernel code. - * - * Also, the helper is only available for the architectures having - * the CONFIG_FUNCTION_ERROR_INJECTION option. As of this writing, - * x86 architecture is the only one to support this feature. - * - * Returns - * 0 - */ -static long (*bpf_override_return)(struct pt_regs *regs, __u64 rc) = (void *) 58; - -/* - * bpf_sock_ops_cb_flags_set - * - * Attempt to set the value of the **bpf_sock_ops_cb_flags** field - * for the full TCP socket associated to *bpf_sock_ops* to - * *argval*. - * - * The primary use of this field is to determine if there should - * be calls to eBPF programs of type - * **BPF_PROG_TYPE_SOCK_OPS** at various points in the TCP - * code. A program of the same type can change its value, per - * connection and as necessary, when the connection is - * established. This field is directly accessible for reading, but - * this helper must be used for updates in order to return an - * error if an eBPF program tries to set a callback that is not - * supported in the current kernel. - * - * *argval* is a flag array which can combine these flags: - * - * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) - * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) - * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) - * * **BPF_SOCK_OPS_RTT_CB_FLAG** (every RTT) - * - * Therefore, this function can be used to clear a callback flag by - * setting the appropriate bit to zero. e.g. to disable the RTO - * callback: - * - * **bpf_sock_ops_cb_flags_set(bpf_sock,** - * **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)** - * - * Here are some examples of where one could call such eBPF - * program: - * - * * When RTO fires. - * * When a packet is retransmitted. - * * When the connection terminates. - * * When a packet is sent. - * * When a packet is received. - * - * Returns - * Code **-EINVAL** if the socket is not a full TCP socket; - * otherwise, a positive number containing the bits that could not - * be set is returned (which comes down to 0 if all bits were set - * as required). - */ -static long (*bpf_sock_ops_cb_flags_set)(struct bpf_sock_ops *bpf_sock, int argval) = (void *) 59; - -/* - * bpf_msg_redirect_map - * - * This helper is used in programs implementing policies at the - * socket level. If the message *msg* is allowed to pass (i.e. if - * the verdict eBPF program returns **SK_PASS**), redirect it to - * the socket referenced by *map* (of type - * **BPF_MAP_TYPE_SOCKMAP**) at index *key*. Both ingress and - * egress interfaces can be used for redirection. The - * **BPF_F_INGRESS** value in *flags* is used to make the - * distinction (ingress path is selected if the flag is present, - * egress path otherwise). This is the only flag supported for now. - * - * Returns - * **SK_PASS** on success, or **SK_DROP** on error. - */ -static long (*bpf_msg_redirect_map)(struct sk_msg_md *msg, void *map, __u32 key, __u64 flags) = (void *) 60; - -/* - * bpf_msg_apply_bytes - * - * For socket policies, apply the verdict of the eBPF program to - * the next *bytes* (number of bytes) of message *msg*. - * - * For example, this helper can be used in the following cases: - * - * * A single **sendmsg**\ () or **sendfile**\ () system call - * contains multiple logical messages that the eBPF program is - * supposed to read and for which it should apply a verdict. - * * An eBPF program only cares to read the first *bytes* of a - * *msg*. If the message has a large payload, then setting up - * and calling the eBPF program repeatedly for all bytes, even - * though the verdict is already known, would create unnecessary - * overhead. - * - * When called from within an eBPF program, the helper sets a - * counter internal to the BPF infrastructure, that is used to - * apply the last verdict to the next *bytes*. If *bytes* is - * smaller than the current data being processed from a - * **sendmsg**\ () or **sendfile**\ () system call, the first - * *bytes* will be sent and the eBPF program will be re-run with - * the pointer for start of data pointing to byte number *bytes* - * **+ 1**. If *bytes* is larger than the current data being - * processed, then the eBPF verdict will be applied to multiple - * **sendmsg**\ () or **sendfile**\ () calls until *bytes* are - * consumed. - * - * Note that if a socket closes with the internal counter holding - * a non-zero value, this is not a problem because data is not - * being buffered for *bytes* and is sent as it is received. - * - * Returns - * 0 - */ -static long (*bpf_msg_apply_bytes)(struct sk_msg_md *msg, __u32 bytes) = (void *) 61; - -/* - * bpf_msg_cork_bytes - * - * For socket policies, prevent the execution of the verdict eBPF - * program for message *msg* until *bytes* (byte number) have been - * accumulated. - * - * This can be used when one needs a specific number of bytes - * before a verdict can be assigned, even if the data spans - * multiple **sendmsg**\ () or **sendfile**\ () calls. The extreme - * case would be a user calling **sendmsg**\ () repeatedly with - * 1-byte long message segments. Obviously, this is bad for - * performance, but it is still valid. If the eBPF program needs - * *bytes* bytes to validate a header, this helper can be used to - * prevent the eBPF program to be called again until *bytes* have - * been accumulated. - * - * Returns - * 0 - */ -static long (*bpf_msg_cork_bytes)(struct sk_msg_md *msg, __u32 bytes) = (void *) 62; - -/* - * bpf_msg_pull_data - * - * For socket policies, pull in non-linear data from user space - * for *msg* and set pointers *msg*\ **->data** and *msg*\ - * **->data_end** to *start* and *end* bytes offsets into *msg*, - * respectively. - * - * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a - * *msg* it can only parse data that the (**data**, **data_end**) - * pointers have already consumed. For **sendmsg**\ () hooks this - * is likely the first scatterlist element. But for calls relying - * on the **sendpage** handler (e.g. **sendfile**\ ()) this will - * be the range (**0**, **0**) because the data is shared with - * user space and by default the objective is to avoid allowing - * user space to modify data while (or after) eBPF verdict is - * being decided. This helper can be used to pull in data and to - * set the start and end pointer to given values. Data will be - * copied if necessary (i.e. if data was not linear and if start - * and end pointers do not point to the same chunk). - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_msg_pull_data)(struct sk_msg_md *msg, __u32 start, __u32 end, __u64 flags) = (void *) 63; - -/* - * bpf_bind - * - * Bind the socket associated to *ctx* to the address pointed by - * *addr*, of length *addr_len*. This allows for making outgoing - * connection from the desired IP address, which can be useful for - * example when all processes inside a cgroup should use one - * single IP address on a host that has multiple IP configured. - * - * This helper works for IPv4 and IPv6, TCP and UDP sockets. The - * domain (*addr*\ **->sa_family**) must be **AF_INET** (or - * **AF_INET6**). It's advised to pass zero port (**sin_port** - * or **sin6_port**) which triggers IP_BIND_ADDRESS_NO_PORT-like - * behavior and lets the kernel efficiently pick up an unused - * port as long as 4-tuple is unique. Passing non-zero port might - * lead to degraded performance. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_bind)(struct bpf_sock_addr *ctx, struct sockaddr *addr, int addr_len) = (void *) 64; - -/* - * bpf_xdp_adjust_tail - * - * Adjust (move) *xdp_md*\ **->data_end** by *delta* bytes. It is - * possible to both shrink and grow the packet tail. - * Shrink done via *delta* being a negative integer. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_xdp_adjust_tail)(struct xdp_md *xdp_md, int delta) = (void *) 65; - -/* - * bpf_skb_get_xfrm_state - * - * Retrieve the XFRM state (IP transform framework, see also - * **ip-xfrm(8)**) at *index* in XFRM "security path" for *skb*. - * - * The retrieved value is stored in the **struct bpf_xfrm_state** - * pointed by *xfrm_state* and of length *size*. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_XFRM** configuration option. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_get_xfrm_state)(struct __sk_buff *skb, __u32 index, struct bpf_xfrm_state *xfrm_state, __u32 size, __u64 flags) = (void *) 66; - -/* - * bpf_get_stack - * - * Return a user or a kernel stack in bpf program provided buffer. - * To achieve this, the helper needs *ctx*, which is a pointer - * to the context on which the tracing program is executed. - * To store the stacktrace, the bpf program provides *buf* with - * a nonnegative *size*. - * - * The last argument, *flags*, holds the number of stack frames to - * skip (from 0 to 255), masked with - * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set - * the following flags: - * - * **BPF_F_USER_STACK** - * Collect a user space stack instead of a kernel stack. - * **BPF_F_USER_BUILD_ID** - * Collect buildid+offset instead of ips for user stack, - * only valid if **BPF_F_USER_STACK** is also specified. - * - * **bpf_get_stack**\ () can collect up to - * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject - * to sufficient large buffer size. Note that - * this limit can be controlled with the **sysctl** program, and - * that it should be manually increased in order to profile long - * user stacks (such as stacks for Java programs). To do so, use: - * - * :: - * - * # sysctl kernel.perf_event_max_stack= - * - * Returns - * The non-negative copied *buf* length equal to or less than - * *size* on success, or a negative error in case of failure. - */ -static long (*bpf_get_stack)(void *ctx, void *buf, __u32 size, __u64 flags) = (void *) 67; - -/* - * bpf_skb_load_bytes_relative - * - * This helper is similar to **bpf_skb_load_bytes**\ () in that - * it provides an easy way to load *len* bytes from *offset* - * from the packet associated to *skb*, into the buffer pointed - * by *to*. The difference to **bpf_skb_load_bytes**\ () is that - * a fifth argument *start_header* exists in order to select a - * base offset to start from. *start_header* can be one of: - * - * **BPF_HDR_START_MAC** - * Base offset to load data from is *skb*'s mac header. - * **BPF_HDR_START_NET** - * Base offset to load data from is *skb*'s network header. - * - * In general, "direct packet access" is the preferred method to - * access packet data, however, this helper is in particular useful - * in socket filters where *skb*\ **->data** does not always point - * to the start of the mac header and where "direct packet access" - * is not available. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_load_bytes_relative)(const void *skb, __u32 offset, void *to, __u32 len, __u32 start_header) = (void *) 68; - -/* - * bpf_fib_lookup - * - * Do FIB lookup in kernel tables using parameters in *params*. - * If lookup is successful and result shows packet is to be - * forwarded, the neighbor tables are searched for the nexthop. - * If successful (ie., FIB lookup shows forwarding and nexthop - * is resolved), the nexthop address is returned in ipv4_dst - * or ipv6_dst based on family, smac is set to mac address of - * egress device, dmac is set to nexthop mac address, rt_metric - * is set to metric from route (IPv4/IPv6 only), and ifindex - * is set to the device index of the nexthop from the FIB lookup. - * - * *plen* argument is the size of the passed in struct. - * *flags* argument can be a combination of one or more of the - * following values: - * - * **BPF_FIB_LOOKUP_DIRECT** - * Do a direct table lookup vs full lookup using FIB - * rules. - * **BPF_FIB_LOOKUP_OUTPUT** - * Perform lookup from an egress perspective (default is - * ingress). - * - * *ctx* is either **struct xdp_md** for XDP programs or - * **struct sk_buff** tc cls_act programs. - * - * Returns - * * < 0 if any input argument is invalid - * * 0 on success (packet is forwarded, nexthop neighbor exists) - * * > 0 one of **BPF_FIB_LKUP_RET_** codes explaining why the - * packet is not forwarded or needs assist from full stack - * - * If lookup fails with BPF_FIB_LKUP_RET_FRAG_NEEDED, then the MTU - * was exceeded and output params->mtu_result contains the MTU. - */ -static long (*bpf_fib_lookup)(void *ctx, struct bpf_fib_lookup *params, int plen, __u32 flags) = (void *) 69; - -/* - * bpf_sock_hash_update - * - * Add an entry to, or update a sockhash *map* referencing sockets. - * The *skops* is used as a new value for the entry associated to - * *key*. *flags* is one of: - * - * **BPF_NOEXIST** - * The entry for *key* must not exist in the map. - * **BPF_EXIST** - * The entry for *key* must already exist in the map. - * **BPF_ANY** - * No condition on the existence of the entry for *key*. - * - * If the *map* has eBPF programs (parser and verdict), those will - * be inherited by the socket being added. If the socket is - * already attached to eBPF programs, this results in an error. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_sock_hash_update)(struct bpf_sock_ops *skops, void *map, void *key, __u64 flags) = (void *) 70; - -/* - * bpf_msg_redirect_hash - * - * This helper is used in programs implementing policies at the - * socket level. If the message *msg* is allowed to pass (i.e. if - * the verdict eBPF program returns **SK_PASS**), redirect it to - * the socket referenced by *map* (of type - * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and - * egress interfaces can be used for redirection. The - * **BPF_F_INGRESS** value in *flags* is used to make the - * distinction (ingress path is selected if the flag is present, - * egress path otherwise). This is the only flag supported for now. - * - * Returns - * **SK_PASS** on success, or **SK_DROP** on error. - */ -static long (*bpf_msg_redirect_hash)(struct sk_msg_md *msg, void *map, void *key, __u64 flags) = (void *) 71; - -/* - * bpf_sk_redirect_hash - * - * This helper is used in programs implementing policies at the - * skb socket level. If the sk_buff *skb* is allowed to pass (i.e. - * if the verdict eBPF program returns **SK_PASS**), redirect it - * to the socket referenced by *map* (of type - * **BPF_MAP_TYPE_SOCKHASH**) using hash *key*. Both ingress and - * egress interfaces can be used for redirection. The - * **BPF_F_INGRESS** value in *flags* is used to make the - * distinction (ingress path is selected if the flag is present, - * egress otherwise). This is the only flag supported for now. - * - * Returns - * **SK_PASS** on success, or **SK_DROP** on error. - */ -static long (*bpf_sk_redirect_hash)(struct __sk_buff *skb, void *map, void *key, __u64 flags) = (void *) 72; - -/* - * bpf_lwt_push_encap - * - * Encapsulate the packet associated to *skb* within a Layer 3 - * protocol header. This header is provided in the buffer at - * address *hdr*, with *len* its size in bytes. *type* indicates - * the protocol of the header and can be one of: - * - * **BPF_LWT_ENCAP_SEG6** - * IPv6 encapsulation with Segment Routing Header - * (**struct ipv6_sr_hdr**). *hdr* only contains the SRH, - * the IPv6 header is computed by the kernel. - * **BPF_LWT_ENCAP_SEG6_INLINE** - * Only works if *skb* contains an IPv6 packet. Insert a - * Segment Routing Header (**struct ipv6_sr_hdr**) inside - * the IPv6 header. - * **BPF_LWT_ENCAP_IP** - * IP encapsulation (GRE/GUE/IPIP/etc). The outer header - * must be IPv4 or IPv6, followed by zero or more - * additional headers, up to **LWT_BPF_MAX_HEADROOM** - * total bytes in all prepended headers. Please note that - * if **skb_is_gso**\ (*skb*) is true, no more than two - * headers can be prepended, and the inner header, if - * present, should be either GRE or UDP/GUE. - * - * **BPF_LWT_ENCAP_SEG6**\ \* types can be called by BPF programs - * of type **BPF_PROG_TYPE_LWT_IN**; **BPF_LWT_ENCAP_IP** type can - * be called by bpf programs of types **BPF_PROG_TYPE_LWT_IN** and - * **BPF_PROG_TYPE_LWT_XMIT**. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_lwt_push_encap)(struct __sk_buff *skb, __u32 type, void *hdr, __u32 len) = (void *) 73; - -/* - * bpf_lwt_seg6_store_bytes - * - * Store *len* bytes from address *from* into the packet - * associated to *skb*, at *offset*. Only the flags, tag and TLVs - * inside the outermost IPv6 Segment Routing Header can be - * modified through this helper. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_lwt_seg6_store_bytes)(struct __sk_buff *skb, __u32 offset, const void *from, __u32 len) = (void *) 74; - -/* - * bpf_lwt_seg6_adjust_srh - * - * Adjust the size allocated to TLVs in the outermost IPv6 - * Segment Routing Header contained in the packet associated to - * *skb*, at position *offset* by *delta* bytes. Only offsets - * after the segments are accepted. *delta* can be as well - * positive (growing) as negative (shrinking). - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_lwt_seg6_adjust_srh)(struct __sk_buff *skb, __u32 offset, __s32 delta) = (void *) 75; - -/* - * bpf_lwt_seg6_action - * - * Apply an IPv6 Segment Routing action of type *action* to the - * packet associated to *skb*. Each action takes a parameter - * contained at address *param*, and of length *param_len* bytes. - * *action* can be one of: - * - * **SEG6_LOCAL_ACTION_END_X** - * End.X action: Endpoint with Layer-3 cross-connect. - * Type of *param*: **struct in6_addr**. - * **SEG6_LOCAL_ACTION_END_T** - * End.T action: Endpoint with specific IPv6 table lookup. - * Type of *param*: **int**. - * **SEG6_LOCAL_ACTION_END_B6** - * End.B6 action: Endpoint bound to an SRv6 policy. - * Type of *param*: **struct ipv6_sr_hdr**. - * **SEG6_LOCAL_ACTION_END_B6_ENCAP** - * End.B6.Encap action: Endpoint bound to an SRv6 - * encapsulation policy. - * Type of *param*: **struct ipv6_sr_hdr**. - * - * A call to this helper is susceptible to change the underlying - * packet buffer. Therefore, at load time, all checks on pointers - * previously done by the verifier are invalidated and must be - * performed again, if the helper is used in combination with - * direct packet access. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_lwt_seg6_action)(struct __sk_buff *skb, __u32 action, void *param, __u32 param_len) = (void *) 76; - -/* - * bpf_rc_repeat - * - * This helper is used in programs implementing IR decoding, to - * report a successfully decoded repeat key message. This delays - * the generation of a key up event for previously generated - * key down event. - * - * Some IR protocols like NEC have a special IR message for - * repeating last button, for when a button is held down. - * - * The *ctx* should point to the lirc sample as passed into - * the program. - * - * This helper is only available is the kernel was compiled with - * the **CONFIG_BPF_LIRC_MODE2** configuration option set to - * "**y**". - * - * Returns - * 0 - */ -static long (*bpf_rc_repeat)(void *ctx) = (void *) 77; - -/* - * bpf_rc_keydown - * - * This helper is used in programs implementing IR decoding, to - * report a successfully decoded key press with *scancode*, - * *toggle* value in the given *protocol*. The scancode will be - * translated to a keycode using the rc keymap, and reported as - * an input key down event. After a period a key up event is - * generated. This period can be extended by calling either - * **bpf_rc_keydown**\ () again with the same values, or calling - * **bpf_rc_repeat**\ (). - * - * Some protocols include a toggle bit, in case the button was - * released and pressed again between consecutive scancodes. - * - * The *ctx* should point to the lirc sample as passed into - * the program. - * - * The *protocol* is the decoded protocol number (see - * **enum rc_proto** for some predefined values). - * - * This helper is only available is the kernel was compiled with - * the **CONFIG_BPF_LIRC_MODE2** configuration option set to - * "**y**". - * - * Returns - * 0 - */ -static long (*bpf_rc_keydown)(void *ctx, __u32 protocol, __u64 scancode, __u32 toggle) = (void *) 78; - -/* - * bpf_skb_cgroup_id - * - * Return the cgroup v2 id of the socket associated with the *skb*. - * This is roughly similar to the **bpf_get_cgroup_classid**\ () - * helper for cgroup v1 by providing a tag resp. identifier that - * can be matched on or used for map lookups e.g. to implement - * policy. The cgroup v2 id of a given path in the hierarchy is - * exposed in user space through the f_handle API in order to get - * to the same 64-bit id. - * - * This helper can be used on TC egress path, but not on ingress, - * and is available only if the kernel was compiled with the - * **CONFIG_SOCK_CGROUP_DATA** configuration option. - * - * Returns - * The id is returned or 0 in case the id could not be retrieved. - */ -static __u64 (*bpf_skb_cgroup_id)(struct __sk_buff *skb) = (void *) 79; - -/* - * bpf_get_current_cgroup_id - * - * Get the current cgroup id based on the cgroup within which - * the current task is running. - * - * Returns - * A 64-bit integer containing the current cgroup id based - * on the cgroup within which the current task is running. - */ -static __u64 (*bpf_get_current_cgroup_id)(void) = (void *) 80; - -/* - * bpf_get_local_storage - * - * Get the pointer to the local storage area. - * The type and the size of the local storage is defined - * by the *map* argument. - * The *flags* meaning is specific for each map type, - * and has to be 0 for cgroup local storage. - * - * Depending on the BPF program type, a local storage area - * can be shared between multiple instances of the BPF program, - * running simultaneously. - * - * A user should care about the synchronization by himself. - * For example, by using the **BPF_ATOMIC** instructions to alter - * the shared data. - * - * Returns - * A pointer to the local storage area. - */ -static void *(*bpf_get_local_storage)(void *map, __u64 flags) = (void *) 81; - -/* - * bpf_sk_select_reuseport - * - * Select a **SO_REUSEPORT** socket from a - * **BPF_MAP_TYPE_REUSEPORT_SOCKARRAY** *map*. - * It checks the selected socket is matching the incoming - * request in the socket buffer. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_sk_select_reuseport)(struct sk_reuseport_md *reuse, void *map, void *key, __u64 flags) = (void *) 82; - -/* - * bpf_skb_ancestor_cgroup_id - * - * Return id of cgroup v2 that is ancestor of cgroup associated - * with the *skb* at the *ancestor_level*. The root cgroup is at - * *ancestor_level* zero and each step down the hierarchy - * increments the level. If *ancestor_level* == level of cgroup - * associated with *skb*, then return value will be same as that - * of **bpf_skb_cgroup_id**\ (). - * - * The helper is useful to implement policies based on cgroups - * that are upper in hierarchy than immediate cgroup associated - * with *skb*. - * - * The format of returned id and helper limitations are same as in - * **bpf_skb_cgroup_id**\ (). - * - * Returns - * The id is returned or 0 in case the id could not be retrieved. - */ -static __u64 (*bpf_skb_ancestor_cgroup_id)(struct __sk_buff *skb, int ancestor_level) = (void *) 83; - -/* - * bpf_sk_lookup_tcp - * - * Look for TCP socket matching *tuple*, optionally in a child - * network namespace *netns*. The return value must be checked, - * and if non-**NULL**, released via **bpf_sk_release**\ (). - * - * The *ctx* should point to the context of the program, such as - * the skb or socket (depending on the hook in use). This is used - * to determine the base network namespace for the lookup. - * - * *tuple_size* must be one of: - * - * **sizeof**\ (*tuple*\ **->ipv4**) - * Look for an IPv4 socket. - * **sizeof**\ (*tuple*\ **->ipv6**) - * Look for an IPv6 socket. - * - * If the *netns* is a negative signed 32-bit integer, then the - * socket lookup table in the netns associated with the *ctx* - * will be used. For the TC hooks, this is the netns of the device - * in the skb. For socket hooks, this is the netns of the socket. - * If *netns* is any other signed 32-bit value greater than or - * equal to zero then it specifies the ID of the netns relative to - * the netns associated with the *ctx*. *netns* values beyond the - * range of 32-bit integers are reserved for future use. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_NET** configuration option. - * - * Returns - * Pointer to **struct bpf_sock**, or **NULL** in case of failure. - * For sockets with reuseport option, the **struct bpf_sock** - * result is from *reuse*\ **->socks**\ [] using the hash of the - * tuple. - */ -static struct bpf_sock *(*bpf_sk_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 84; - -/* - * bpf_sk_lookup_udp - * - * Look for UDP socket matching *tuple*, optionally in a child - * network namespace *netns*. The return value must be checked, - * and if non-**NULL**, released via **bpf_sk_release**\ (). - * - * The *ctx* should point to the context of the program, such as - * the skb or socket (depending on the hook in use). This is used - * to determine the base network namespace for the lookup. - * - * *tuple_size* must be one of: - * - * **sizeof**\ (*tuple*\ **->ipv4**) - * Look for an IPv4 socket. - * **sizeof**\ (*tuple*\ **->ipv6**) - * Look for an IPv6 socket. - * - * If the *netns* is a negative signed 32-bit integer, then the - * socket lookup table in the netns associated with the *ctx* - * will be used. For the TC hooks, this is the netns of the device - * in the skb. For socket hooks, this is the netns of the socket. - * If *netns* is any other signed 32-bit value greater than or - * equal to zero then it specifies the ID of the netns relative to - * the netns associated with the *ctx*. *netns* values beyond the - * range of 32-bit integers are reserved for future use. - * - * All values for *flags* are reserved for future usage, and must - * be left at zero. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_NET** configuration option. - * - * Returns - * Pointer to **struct bpf_sock**, or **NULL** in case of failure. - * For sockets with reuseport option, the **struct bpf_sock** - * result is from *reuse*\ **->socks**\ [] using the hash of the - * tuple. - */ -static struct bpf_sock *(*bpf_sk_lookup_udp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 85; - -/* - * bpf_sk_release - * - * Release the reference held by *sock*. *sock* must be a - * non-**NULL** pointer that was returned from - * **bpf_sk_lookup_xxx**\ (). - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_sk_release)(void *sock) = (void *) 86; - -/* - * bpf_map_push_elem - * - * Push an element *value* in *map*. *flags* is one of: - * - * **BPF_EXIST** - * If the queue/stack is full, the oldest element is - * removed to make room for this. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_map_push_elem)(void *map, const void *value, __u64 flags) = (void *) 87; - -/* - * bpf_map_pop_elem - * - * Pop an element from *map*. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_map_pop_elem)(void *map, void *value) = (void *) 88; - -/* - * bpf_map_peek_elem - * - * Get an element from *map* without removing it. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_map_peek_elem)(void *map, void *value) = (void *) 89; - -/* - * bpf_msg_push_data - * - * For socket policies, insert *len* bytes into *msg* at offset - * *start*. - * - * If a program of type **BPF_PROG_TYPE_SK_MSG** is run on a - * *msg* it may want to insert metadata or options into the *msg*. - * This can later be read and used by any of the lower layer BPF - * hooks. - * - * This helper may fail if under memory pressure (a malloc - * fails) in these cases BPF programs will get an appropriate - * error and BPF programs will need to handle them. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_msg_push_data)(struct sk_msg_md *msg, __u32 start, __u32 len, __u64 flags) = (void *) 90; - -/* - * bpf_msg_pop_data - * - * Will remove *len* bytes from a *msg* starting at byte *start*. - * This may result in **ENOMEM** errors under certain situations if - * an allocation and copy are required due to a full ring buffer. - * However, the helper will try to avoid doing the allocation - * if possible. Other errors can occur if input parameters are - * invalid either due to *start* byte not being valid part of *msg* - * payload and/or *pop* value being to large. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_msg_pop_data)(struct sk_msg_md *msg, __u32 start, __u32 len, __u64 flags) = (void *) 91; - -/* - * bpf_rc_pointer_rel - * - * This helper is used in programs implementing IR decoding, to - * report a successfully decoded pointer movement. - * - * The *ctx* should point to the lirc sample as passed into - * the program. - * - * This helper is only available is the kernel was compiled with - * the **CONFIG_BPF_LIRC_MODE2** configuration option set to - * "**y**". - * - * Returns - * 0 - */ -static long (*bpf_rc_pointer_rel)(void *ctx, __s32 rel_x, __s32 rel_y) = (void *) 92; - -/* - * bpf_spin_lock - * - * Acquire a spinlock represented by the pointer *lock*, which is - * stored as part of a value of a map. Taking the lock allows to - * safely update the rest of the fields in that value. The - * spinlock can (and must) later be released with a call to - * **bpf_spin_unlock**\ (\ *lock*\ ). - * - * Spinlocks in BPF programs come with a number of restrictions - * and constraints: - * - * * **bpf_spin_lock** objects are only allowed inside maps of - * types **BPF_MAP_TYPE_HASH** and **BPF_MAP_TYPE_ARRAY** (this - * list could be extended in the future). - * * BTF description of the map is mandatory. - * * The BPF program can take ONE lock at a time, since taking two - * or more could cause dead locks. - * * Only one **struct bpf_spin_lock** is allowed per map element. - * * When the lock is taken, calls (either BPF to BPF or helpers) - * are not allowed. - * * The **BPF_LD_ABS** and **BPF_LD_IND** instructions are not - * allowed inside a spinlock-ed region. - * * The BPF program MUST call **bpf_spin_unlock**\ () to release - * the lock, on all execution paths, before it returns. - * * The BPF program can access **struct bpf_spin_lock** only via - * the **bpf_spin_lock**\ () and **bpf_spin_unlock**\ () - * helpers. Loading or storing data into the **struct - * bpf_spin_lock** *lock*\ **;** field of a map is not allowed. - * * To use the **bpf_spin_lock**\ () helper, the BTF description - * of the map value must be a struct and have **struct - * bpf_spin_lock** *anyname*\ **;** field at the top level. - * Nested lock inside another struct is not allowed. - * * The **struct bpf_spin_lock** *lock* field in a map value must - * be aligned on a multiple of 4 bytes in that value. - * * Syscall with command **BPF_MAP_LOOKUP_ELEM** does not copy - * the **bpf_spin_lock** field to user space. - * * Syscall with command **BPF_MAP_UPDATE_ELEM**, or update from - * a BPF program, do not update the **bpf_spin_lock** field. - * * **bpf_spin_lock** cannot be on the stack or inside a - * networking packet (it can only be inside of a map values). - * * **bpf_spin_lock** is available to root only. - * * Tracing programs and socket filter programs cannot use - * **bpf_spin_lock**\ () due to insufficient preemption checks - * (but this may change in the future). - * * **bpf_spin_lock** is not allowed in inner maps of map-in-map. - * - * Returns - * 0 - */ -static long (*bpf_spin_lock)(struct bpf_spin_lock *lock) = (void *) 93; - -/* - * bpf_spin_unlock - * - * Release the *lock* previously locked by a call to - * **bpf_spin_lock**\ (\ *lock*\ ). - * - * Returns - * 0 - */ -static long (*bpf_spin_unlock)(struct bpf_spin_lock *lock) = (void *) 94; - -/* - * bpf_sk_fullsock - * - * This helper gets a **struct bpf_sock** pointer such - * that all the fields in this **bpf_sock** can be accessed. - * - * Returns - * A **struct bpf_sock** pointer on success, or **NULL** in - * case of failure. - */ -static struct bpf_sock *(*bpf_sk_fullsock)(struct bpf_sock *sk) = (void *) 95; - -/* - * bpf_tcp_sock - * - * This helper gets a **struct bpf_tcp_sock** pointer from a - * **struct bpf_sock** pointer. - * - * Returns - * A **struct bpf_tcp_sock** pointer on success, or **NULL** in - * case of failure. - */ -static struct bpf_tcp_sock *(*bpf_tcp_sock)(struct bpf_sock *sk) = (void *) 96; - -/* - * bpf_skb_ecn_set_ce - * - * Set ECN (Explicit Congestion Notification) field of IP header - * to **CE** (Congestion Encountered) if current value is **ECT** - * (ECN Capable Transport). Otherwise, do nothing. Works with IPv6 - * and IPv4. - * - * Returns - * 1 if the **CE** flag is set (either by the current helper call - * or because it was already present), 0 if it is not set. - */ -static long (*bpf_skb_ecn_set_ce)(struct __sk_buff *skb) = (void *) 97; - -/* - * bpf_get_listener_sock - * - * Return a **struct bpf_sock** pointer in **TCP_LISTEN** state. - * **bpf_sk_release**\ () is unnecessary and not allowed. - * - * Returns - * A **struct bpf_sock** pointer on success, or **NULL** in - * case of failure. - */ -static struct bpf_sock *(*bpf_get_listener_sock)(struct bpf_sock *sk) = (void *) 98; - -/* - * bpf_skc_lookup_tcp - * - * Look for TCP socket matching *tuple*, optionally in a child - * network namespace *netns*. The return value must be checked, - * and if non-**NULL**, released via **bpf_sk_release**\ (). - * - * This function is identical to **bpf_sk_lookup_tcp**\ (), except - * that it also returns timewait or request sockets. Use - * **bpf_sk_fullsock**\ () or **bpf_tcp_sock**\ () to access the - * full structure. - * - * This helper is available only if the kernel was compiled with - * **CONFIG_NET** configuration option. - * - * Returns - * Pointer to **struct bpf_sock**, or **NULL** in case of failure. - * For sockets with reuseport option, the **struct bpf_sock** - * result is from *reuse*\ **->socks**\ [] using the hash of the - * tuple. - */ -static struct bpf_sock *(*bpf_skc_lookup_tcp)(void *ctx, struct bpf_sock_tuple *tuple, __u32 tuple_size, __u64 netns, __u64 flags) = (void *) 99; - -/* - * bpf_tcp_check_syncookie - * - * Check whether *iph* and *th* contain a valid SYN cookie ACK for - * the listening socket in *sk*. - * - * *iph* points to the start of the IPv4 or IPv6 header, while - * *iph_len* contains **sizeof**\ (**struct iphdr**) or - * **sizeof**\ (**struct ipv6hdr**). - * - * *th* points to the start of the TCP header, while *th_len* - * contains the length of the TCP header (at least - * **sizeof**\ (**struct tcphdr**)). - * - * Returns - * 0 if *iph* and *th* are a valid SYN cookie ACK, or a negative - * error otherwise. - */ -static long (*bpf_tcp_check_syncookie)(void *sk, void *iph, __u32 iph_len, struct tcphdr *th, __u32 th_len) = (void *) 100; - -/* - * bpf_sysctl_get_name - * - * Get name of sysctl in /proc/sys/ and copy it into provided by - * program buffer *buf* of size *buf_len*. - * - * The buffer is always NUL terminated, unless it's zero-sized. - * - * If *flags* is zero, full name (e.g. "net/ipv4/tcp_mem") is - * copied. Use **BPF_F_SYSCTL_BASE_NAME** flag to copy base name - * only (e.g. "tcp_mem"). - * - * Returns - * Number of character copied (not including the trailing NUL). - * - * **-E2BIG** if the buffer wasn't big enough (*buf* will contain - * truncated name in this case). - */ -static long (*bpf_sysctl_get_name)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len, __u64 flags) = (void *) 101; - -/* - * bpf_sysctl_get_current_value - * - * Get current value of sysctl as it is presented in /proc/sys - * (incl. newline, etc), and copy it as a string into provided - * by program buffer *buf* of size *buf_len*. - * - * The whole value is copied, no matter what file position user - * space issued e.g. sys_read at. - * - * The buffer is always NUL terminated, unless it's zero-sized. - * - * Returns - * Number of character copied (not including the trailing NUL). - * - * **-E2BIG** if the buffer wasn't big enough (*buf* will contain - * truncated name in this case). - * - * **-EINVAL** if current value was unavailable, e.g. because - * sysctl is uninitialized and read returns -EIO for it. - */ -static long (*bpf_sysctl_get_current_value)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len) = (void *) 102; - -/* - * bpf_sysctl_get_new_value - * - * Get new value being written by user space to sysctl (before - * the actual write happens) and copy it as a string into - * provided by program buffer *buf* of size *buf_len*. - * - * User space may write new value at file position > 0. - * - * The buffer is always NUL terminated, unless it's zero-sized. - * - * Returns - * Number of character copied (not including the trailing NUL). - * - * **-E2BIG** if the buffer wasn't big enough (*buf* will contain - * truncated name in this case). - * - * **-EINVAL** if sysctl is being read. - */ -static long (*bpf_sysctl_get_new_value)(struct bpf_sysctl *ctx, char *buf, unsigned long buf_len) = (void *) 103; - -/* - * bpf_sysctl_set_new_value - * - * Override new value being written by user space to sysctl with - * value provided by program in buffer *buf* of size *buf_len*. - * - * *buf* should contain a string in same form as provided by user - * space on sysctl write. - * - * User space may write new value at file position > 0. To override - * the whole sysctl value file position should be set to zero. - * - * Returns - * 0 on success. - * - * **-E2BIG** if the *buf_len* is too big. - * - * **-EINVAL** if sysctl is being read. - */ -static long (*bpf_sysctl_set_new_value)(struct bpf_sysctl *ctx, const char *buf, unsigned long buf_len) = (void *) 104; - -/* - * bpf_strtol - * - * Convert the initial part of the string from buffer *buf* of - * size *buf_len* to a long integer according to the given base - * and save the result in *res*. - * - * The string may begin with an arbitrary amount of white space - * (as determined by **isspace**\ (3)) followed by a single - * optional '**-**' sign. - * - * Five least significant bits of *flags* encode base, other bits - * are currently unused. - * - * Base must be either 8, 10, 16 or 0 to detect it automatically - * similar to user space **strtol**\ (3). - * - * Returns - * Number of characters consumed on success. Must be positive but - * no more than *buf_len*. - * - * **-EINVAL** if no valid digits were found or unsupported base - * was provided. - * - * **-ERANGE** if resulting value was out of range. - */ -static long (*bpf_strtol)(const char *buf, unsigned long buf_len, __u64 flags, long *res) = (void *) 105; - -/* - * bpf_strtoul - * - * Convert the initial part of the string from buffer *buf* of - * size *buf_len* to an unsigned long integer according to the - * given base and save the result in *res*. - * - * The string may begin with an arbitrary amount of white space - * (as determined by **isspace**\ (3)). - * - * Five least significant bits of *flags* encode base, other bits - * are currently unused. - * - * Base must be either 8, 10, 16 or 0 to detect it automatically - * similar to user space **strtoul**\ (3). - * - * Returns - * Number of characters consumed on success. Must be positive but - * no more than *buf_len*. - * - * **-EINVAL** if no valid digits were found or unsupported base - * was provided. - * - * **-ERANGE** if resulting value was out of range. - */ -static long (*bpf_strtoul)(const char *buf, unsigned long buf_len, __u64 flags, unsigned long *res) = (void *) 106; - -/* - * bpf_sk_storage_get - * - * Get a bpf-local-storage from a *sk*. - * - * Logically, it could be thought of getting the value from - * a *map* with *sk* as the **key**. From this - * perspective, the usage is not much different from - * **bpf_map_lookup_elem**\ (*map*, **&**\ *sk*) except this - * helper enforces the key must be a full socket and the map must - * be a **BPF_MAP_TYPE_SK_STORAGE** also. - * - * Underneath, the value is stored locally at *sk* instead of - * the *map*. The *map* is used as the bpf-local-storage - * "type". The bpf-local-storage "type" (i.e. the *map*) is - * searched against all bpf-local-storages residing at *sk*. - * - * *sk* is a kernel **struct sock** pointer for LSM program. - * *sk* is a **struct bpf_sock** pointer for other program types. - * - * An optional *flags* (**BPF_SK_STORAGE_GET_F_CREATE**) can be - * used such that a new bpf-local-storage will be - * created if one does not exist. *value* can be used - * together with **BPF_SK_STORAGE_GET_F_CREATE** to specify - * the initial value of a bpf-local-storage. If *value* is - * **NULL**, the new bpf-local-storage will be zero initialized. - * - * Returns - * A bpf-local-storage pointer is returned on success. - * - * **NULL** if not found or there was an error in adding - * a new bpf-local-storage. - */ -static void *(*bpf_sk_storage_get)(void *map, void *sk, void *value, __u64 flags) = (void *) 107; - -/* - * bpf_sk_storage_delete - * - * Delete a bpf-local-storage from a *sk*. - * - * Returns - * 0 on success. - * - * **-ENOENT** if the bpf-local-storage cannot be found. - * **-EINVAL** if sk is not a fullsock (e.g. a request_sock). - */ -static long (*bpf_sk_storage_delete)(void *map, void *sk) = (void *) 108; - -/* - * bpf_send_signal - * - * Send signal *sig* to the process of the current task. - * The signal may be delivered to any of this process's threads. - * - * Returns - * 0 on success or successfully queued. - * - * **-EBUSY** if work queue under nmi is full. - * - * **-EINVAL** if *sig* is invalid. - * - * **-EPERM** if no permission to send the *sig*. - * - * **-EAGAIN** if bpf program can try again. - */ -static long (*bpf_send_signal)(__u32 sig) = (void *) 109; - -/* - * bpf_tcp_gen_syncookie - * - * Try to issue a SYN cookie for the packet with corresponding - * IP/TCP headers, *iph* and *th*, on the listening socket in *sk*. - * - * *iph* points to the start of the IPv4 or IPv6 header, while - * *iph_len* contains **sizeof**\ (**struct iphdr**) or - * **sizeof**\ (**struct ipv6hdr**). - * - * *th* points to the start of the TCP header, while *th_len* - * contains the length of the TCP header with options (at least - * **sizeof**\ (**struct tcphdr**)). - * - * Returns - * On success, lower 32 bits hold the generated SYN cookie in - * followed by 16 bits which hold the MSS value for that cookie, - * and the top 16 bits are unused. - * - * On failure, the returned value is one of the following: - * - * **-EINVAL** SYN cookie cannot be issued due to error - * - * **-ENOENT** SYN cookie should not be issued (no SYN flood) - * - * **-EOPNOTSUPP** kernel configuration does not enable SYN cookies - * - * **-EPROTONOSUPPORT** IP packet version is not 4 or 6 - */ -static __s64 (*bpf_tcp_gen_syncookie)(void *sk, void *iph, __u32 iph_len, struct tcphdr *th, __u32 th_len) = (void *) 110; - -/* - * bpf_skb_output - * - * Write raw *data* blob into a special BPF perf event held by - * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf - * event must have the following attributes: **PERF_SAMPLE_RAW** - * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and - * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. - * - * The *flags* are used to indicate the index in *map* for which - * the value must be put, masked with **BPF_F_INDEX_MASK**. - * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** - * to indicate that the index of the current CPU core should be - * used. - * - * The value to write, of *size*, is passed through eBPF stack and - * pointed by *data*. - * - * *ctx* is a pointer to in-kernel struct sk_buff. - * - * This helper is similar to **bpf_perf_event_output**\ () but - * restricted to raw_tracepoint bpf programs. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_skb_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 111; - -/* - * bpf_probe_read_user - * - * Safely attempt to read *size* bytes from user space address - * *unsafe_ptr* and store the data in *dst*. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_probe_read_user)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 112; - -/* - * bpf_probe_read_kernel - * - * Safely attempt to read *size* bytes from kernel space address - * *unsafe_ptr* and store the data in *dst*. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_probe_read_kernel)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 113; - -/* - * bpf_probe_read_user_str - * - * Copy a NUL terminated string from an unsafe user address - * *unsafe_ptr* to *dst*. The *size* should include the - * terminating NUL byte. In case the string length is smaller than - * *size*, the target is not padded with further NUL bytes. If the - * string length is larger than *size*, just *size*-1 bytes are - * copied and the last byte is set to NUL. - * - * On success, returns the number of bytes that were written, - * including the terminal NUL. This makes this helper useful in - * tracing programs for reading strings, and more importantly to - * get its length at runtime. See the following snippet: - * - * :: - * - * SEC("kprobe/sys_open") - * void bpf_sys_open(struct pt_regs *ctx) - * { - * char buf[PATHLEN]; // PATHLEN is defined to 256 - * int res = bpf_probe_read_user_str(buf, sizeof(buf), - * ctx->di); - * - * // Consume buf, for example push it to - * // userspace via bpf_perf_event_output(); we - * // can use res (the string length) as event - * // size, after checking its boundaries. - * } - * - * In comparison, using **bpf_probe_read_user**\ () helper here - * instead to read the string would require to estimate the length - * at compile time, and would often result in copying more memory - * than necessary. - * - * Another useful use case is when parsing individual process - * arguments or individual environment variables navigating - * *current*\ **->mm->arg_start** and *current*\ - * **->mm->env_start**: using this helper and the return value, - * one can quickly iterate at the right offset of the memory area. - * - * Returns - * On success, the strictly positive length of the output string, - * including the trailing NUL character. On error, a negative - * value. - */ -static long (*bpf_probe_read_user_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 114; - -/* - * bpf_probe_read_kernel_str - * - * Copy a NUL terminated string from an unsafe kernel address *unsafe_ptr* - * to *dst*. Same semantics as with **bpf_probe_read_user_str**\ () apply. - * - * Returns - * On success, the strictly positive length of the string, including - * the trailing NUL character. On error, a negative value. - */ -static long (*bpf_probe_read_kernel_str)(void *dst, __u32 size, const void *unsafe_ptr) = (void *) 115; - -/* - * bpf_tcp_send_ack - * - * Send out a tcp-ack. *tp* is the in-kernel struct **tcp_sock**. - * *rcv_nxt* is the ack_seq to be sent out. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_tcp_send_ack)(void *tp, __u32 rcv_nxt) = (void *) 116; - -/* - * bpf_send_signal_thread - * - * Send signal *sig* to the thread corresponding to the current task. - * - * Returns - * 0 on success or successfully queued. - * - * **-EBUSY** if work queue under nmi is full. - * - * **-EINVAL** if *sig* is invalid. - * - * **-EPERM** if no permission to send the *sig*. - * - * **-EAGAIN** if bpf program can try again. - */ -static long (*bpf_send_signal_thread)(__u32 sig) = (void *) 117; - -/* - * bpf_jiffies64 - * - * Obtain the 64bit jiffies - * - * Returns - * The 64 bit jiffies - */ -static __u64 (*bpf_jiffies64)(void) = (void *) 118; - -/* - * bpf_read_branch_records - * - * For an eBPF program attached to a perf event, retrieve the - * branch records (**struct perf_branch_entry**) associated to *ctx* - * and store it in the buffer pointed by *buf* up to size - * *size* bytes. - * - * Returns - * On success, number of bytes written to *buf*. On error, a - * negative value. - * - * The *flags* can be set to **BPF_F_GET_BRANCH_RECORDS_SIZE** to - * instead return the number of bytes required to store all the - * branch entries. If this flag is set, *buf* may be NULL. - * - * **-EINVAL** if arguments invalid or **size** not a multiple - * of **sizeof**\ (**struct perf_branch_entry**\ ). - * - * **-ENOENT** if architecture does not support branch records. - */ -static long (*bpf_read_branch_records)(struct bpf_perf_event_data *ctx, void *buf, __u32 size, __u64 flags) = (void *) 119; - -/* - * bpf_get_ns_current_pid_tgid - * - * Returns 0 on success, values for *pid* and *tgid* as seen from the current - * *namespace* will be returned in *nsdata*. - * - * Returns - * 0 on success, or one of the following in case of failure: - * - * **-EINVAL** if dev and inum supplied don't match dev_t and inode number - * with nsfs of current task, or if dev conversion to dev_t lost high bits. - * - * **-ENOENT** if pidns does not exists for the current task. - */ -static long (*bpf_get_ns_current_pid_tgid)(__u64 dev, __u64 ino, struct bpf_pidns_info *nsdata, __u32 size) = (void *) 120; - -/* - * bpf_xdp_output - * - * Write raw *data* blob into a special BPF perf event held by - * *map* of type **BPF_MAP_TYPE_PERF_EVENT_ARRAY**. This perf - * event must have the following attributes: **PERF_SAMPLE_RAW** - * as **sample_type**, **PERF_TYPE_SOFTWARE** as **type**, and - * **PERF_COUNT_SW_BPF_OUTPUT** as **config**. - * - * The *flags* are used to indicate the index in *map* for which - * the value must be put, masked with **BPF_F_INDEX_MASK**. - * Alternatively, *flags* can be set to **BPF_F_CURRENT_CPU** - * to indicate that the index of the current CPU core should be - * used. - * - * The value to write, of *size*, is passed through eBPF stack and - * pointed by *data*. - * - * *ctx* is a pointer to in-kernel struct xdp_buff. - * - * This helper is similar to **bpf_perf_eventoutput**\ () but - * restricted to raw_tracepoint bpf programs. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_xdp_output)(void *ctx, void *map, __u64 flags, void *data, __u64 size) = (void *) 121; - -/* - * bpf_get_netns_cookie - * - * Retrieve the cookie (generated by the kernel) of the network - * namespace the input *ctx* is associated with. The network - * namespace cookie remains stable for its lifetime and provides - * a global identifier that can be assumed unique. If *ctx* is - * NULL, then the helper returns the cookie for the initial - * network namespace. The cookie itself is very similar to that - * of **bpf_get_socket_cookie**\ () helper, but for network - * namespaces instead of sockets. - * - * Returns - * A 8-byte long opaque number. - */ -static __u64 (*bpf_get_netns_cookie)(void *ctx) = (void *) 122; - -/* - * bpf_get_current_ancestor_cgroup_id - * - * Return id of cgroup v2 that is ancestor of the cgroup associated - * with the current task at the *ancestor_level*. The root cgroup - * is at *ancestor_level* zero and each step down the hierarchy - * increments the level. If *ancestor_level* == level of cgroup - * associated with the current task, then return value will be the - * same as that of **bpf_get_current_cgroup_id**\ (). - * - * The helper is useful to implement policies based on cgroups - * that are upper in hierarchy than immediate cgroup associated - * with the current task. - * - * The format of returned id and helper limitations are same as in - * **bpf_get_current_cgroup_id**\ (). - * - * Returns - * The id is returned or 0 in case the id could not be retrieved. - */ -static __u64 (*bpf_get_current_ancestor_cgroup_id)(int ancestor_level) = (void *) 123; - -/* - * bpf_sk_assign - * - * Helper is overloaded depending on BPF program type. This - * description applies to **BPF_PROG_TYPE_SCHED_CLS** and - * **BPF_PROG_TYPE_SCHED_ACT** programs. - * - * Assign the *sk* to the *skb*. When combined with appropriate - * routing configuration to receive the packet towards the socket, - * will cause *skb* to be delivered to the specified socket. - * Subsequent redirection of *skb* via **bpf_redirect**\ (), - * **bpf_clone_redirect**\ () or other methods outside of BPF may - * interfere with successful delivery to the socket. - * - * This operation is only valid from TC ingress path. - * - * The *flags* argument must be zero. - * - * Returns - * 0 on success, or a negative error in case of failure: - * - * **-EINVAL** if specified *flags* are not supported. - * - * **-ENOENT** if the socket is unavailable for assignment. - * - * **-ENETUNREACH** if the socket is unreachable (wrong netns). - * - * **-EOPNOTSUPP** if the operation is not supported, for example - * a call from outside of TC ingress. - * - * **-ESOCKTNOSUPPORT** if the socket type is not supported - * (reuseport). - */ -static long (*bpf_sk_assign)(void *ctx, void *sk, __u64 flags) = (void *) 124; - -/* - * bpf_ktime_get_boot_ns - * - * Return the time elapsed since system boot, in nanoseconds. - * Does include the time the system was suspended. - * See: **clock_gettime**\ (**CLOCK_BOOTTIME**) - * - * Returns - * Current *ktime*. - */ -static __u64 (*bpf_ktime_get_boot_ns)(void) = (void *) 125; - -/* - * bpf_seq_printf - * - * **bpf_seq_printf**\ () uses seq_file **seq_printf**\ () to print - * out the format string. - * The *m* represents the seq_file. The *fmt* and *fmt_size* are for - * the format string itself. The *data* and *data_len* are format string - * arguments. The *data* are a **u64** array and corresponding format string - * values are stored in the array. For strings and pointers where pointees - * are accessed, only the pointer values are stored in the *data* array. - * The *data_len* is the size of *data* in bytes - must be a multiple of 8. - * - * Formats **%s**, **%p{i,I}{4,6}** requires to read kernel memory. - * Reading kernel memory may fail due to either invalid address or - * valid address but requiring a major memory fault. If reading kernel memory - * fails, the string for **%s** will be an empty string, and the ip - * address for **%p{i,I}{4,6}** will be 0. Not returning error to - * bpf program is consistent with what **bpf_trace_printk**\ () does for now. - * - * Returns - * 0 on success, or a negative error in case of failure: - * - * **-EBUSY** if per-CPU memory copy buffer is busy, can try again - * by returning 1 from bpf program. - * - * **-EINVAL** if arguments are invalid, or if *fmt* is invalid/unsupported. - * - * **-E2BIG** if *fmt* contains too many format specifiers. - * - * **-EOVERFLOW** if an overflow happened: The same object will be tried again. - */ -static long (*bpf_seq_printf)(struct seq_file *m, const char *fmt, __u32 fmt_size, const void *data, __u32 data_len) = (void *) 126; - -/* - * bpf_seq_write - * - * **bpf_seq_write**\ () uses seq_file **seq_write**\ () to write the data. - * The *m* represents the seq_file. The *data* and *len* represent the - * data to write in bytes. - * - * Returns - * 0 on success, or a negative error in case of failure: - * - * **-EOVERFLOW** if an overflow happened: The same object will be tried again. - */ -static long (*bpf_seq_write)(struct seq_file *m, const void *data, __u32 len) = (void *) 127; - -/* - * bpf_sk_cgroup_id - * - * Return the cgroup v2 id of the socket *sk*. - * - * *sk* must be a non-**NULL** pointer to a socket, e.g. one - * returned from **bpf_sk_lookup_xxx**\ (), - * **bpf_sk_fullsock**\ (), etc. The format of returned id is - * same as in **bpf_skb_cgroup_id**\ (). - * - * This helper is available only if the kernel was compiled with - * the **CONFIG_SOCK_CGROUP_DATA** configuration option. - * - * Returns - * The id is returned or 0 in case the id could not be retrieved. - */ -static __u64 (*bpf_sk_cgroup_id)(void *sk) = (void *) 128; - -/* - * bpf_sk_ancestor_cgroup_id - * - * Return id of cgroup v2 that is ancestor of cgroup associated - * with the *sk* at the *ancestor_level*. The root cgroup is at - * *ancestor_level* zero and each step down the hierarchy - * increments the level. If *ancestor_level* == level of cgroup - * associated with *sk*, then return value will be same as that - * of **bpf_sk_cgroup_id**\ (). - * - * The helper is useful to implement policies based on cgroups - * that are upper in hierarchy than immediate cgroup associated - * with *sk*. - * - * The format of returned id and helper limitations are same as in - * **bpf_sk_cgroup_id**\ (). - * - * Returns - * The id is returned or 0 in case the id could not be retrieved. - */ -static __u64 (*bpf_sk_ancestor_cgroup_id)(void *sk, int ancestor_level) = (void *) 129; - -/* - * bpf_ringbuf_output - * - * Copy *size* bytes from *data* into a ring buffer *ringbuf*. - * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification - * of new data availability is sent. - * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification - * of new data availability is sent unconditionally. - * If **0** is specified in *flags*, an adaptive notification - * of new data availability is sent. - * - * An adaptive notification is a notification sent whenever the user-space - * process has caught up and consumed all available payloads. In case the user-space - * process is still processing a previous payload, then no notification is needed - * as it will process the newly added payload automatically. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_ringbuf_output)(void *ringbuf, void *data, __u64 size, __u64 flags) = (void *) 130; - -/* - * bpf_ringbuf_reserve - * - * Reserve *size* bytes of payload in a ring buffer *ringbuf*. - * *flags* must be 0. - * - * Returns - * Valid pointer with *size* bytes of memory available; NULL, - * otherwise. - */ -static void *(*bpf_ringbuf_reserve)(void *ringbuf, __u64 size, __u64 flags) = (void *) 131; - -/* - * bpf_ringbuf_submit - * - * Submit reserved ring buffer sample, pointed to by *data*. - * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification - * of new data availability is sent. - * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification - * of new data availability is sent unconditionally. - * If **0** is specified in *flags*, an adaptive notification - * of new data availability is sent. - * - * See 'bpf_ringbuf_output()' for the definition of adaptive notification. - * - * Returns - * Nothing. Always succeeds. - */ -static void (*bpf_ringbuf_submit)(void *data, __u64 flags) = (void *) 132; - -/* - * bpf_ringbuf_discard - * - * Discard reserved ring buffer sample, pointed to by *data*. - * If **BPF_RB_NO_WAKEUP** is specified in *flags*, no notification - * of new data availability is sent. - * If **BPF_RB_FORCE_WAKEUP** is specified in *flags*, notification - * of new data availability is sent unconditionally. - * If **0** is specified in *flags*, an adaptive notification - * of new data availability is sent. - * - * See 'bpf_ringbuf_output()' for the definition of adaptive notification. - * - * Returns - * Nothing. Always succeeds. - */ -static void (*bpf_ringbuf_discard)(void *data, __u64 flags) = (void *) 133; - -/* - * bpf_ringbuf_query - * - * Query various characteristics of provided ring buffer. What - * exactly is queries is determined by *flags*: - * - * * **BPF_RB_AVAIL_DATA**: Amount of data not yet consumed. - * * **BPF_RB_RING_SIZE**: The size of ring buffer. - * * **BPF_RB_CONS_POS**: Consumer position (can wrap around). - * * **BPF_RB_PROD_POS**: Producer(s) position (can wrap around). - * - * Data returned is just a momentary snapshot of actual values - * and could be inaccurate, so this facility should be used to - * power heuristics and for reporting, not to make 100% correct - * calculation. - * - * Returns - * Requested value, or 0, if *flags* are not recognized. - */ -static __u64 (*bpf_ringbuf_query)(void *ringbuf, __u64 flags) = (void *) 134; - -/* - * bpf_csum_level - * - * Change the skbs checksum level by one layer up or down, or - * reset it entirely to none in order to have the stack perform - * checksum validation. The level is applicable to the following - * protocols: TCP, UDP, GRE, SCTP, FCOE. For example, a decap of - * | ETH | IP | UDP | GUE | IP | TCP | into | ETH | IP | TCP | - * through **bpf_skb_adjust_room**\ () helper with passing in - * **BPF_F_ADJ_ROOM_NO_CSUM_RESET** flag would require one call - * to **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_DEC** since - * the UDP header is removed. Similarly, an encap of the latter - * into the former could be accompanied by a helper call to - * **bpf_csum_level**\ () with **BPF_CSUM_LEVEL_INC** if the - * skb is still intended to be processed in higher layers of the - * stack instead of just egressing at tc. - * - * There are three supported level settings at this time: - * - * * **BPF_CSUM_LEVEL_INC**: Increases skb->csum_level for skbs - * with CHECKSUM_UNNECESSARY. - * * **BPF_CSUM_LEVEL_DEC**: Decreases skb->csum_level for skbs - * with CHECKSUM_UNNECESSARY. - * * **BPF_CSUM_LEVEL_RESET**: Resets skb->csum_level to 0 and - * sets CHECKSUM_NONE to force checksum validation by the stack. - * * **BPF_CSUM_LEVEL_QUERY**: No-op, returns the current - * skb->csum_level. - * - * Returns - * 0 on success, or a negative error in case of failure. In the - * case of **BPF_CSUM_LEVEL_QUERY**, the current skb->csum_level - * is returned or the error code -EACCES in case the skb is not - * subject to CHECKSUM_UNNECESSARY. - */ -static long (*bpf_csum_level)(struct __sk_buff *skb, __u64 level) = (void *) 135; - -/* - * bpf_skc_to_tcp6_sock - * - * Dynamically cast a *sk* pointer to a *tcp6_sock* pointer. - * - * Returns - * *sk* if casting is valid, or **NULL** otherwise. - */ -static struct tcp6_sock *(*bpf_skc_to_tcp6_sock)(void *sk) = (void *) 136; - -/* - * bpf_skc_to_tcp_sock - * - * Dynamically cast a *sk* pointer to a *tcp_sock* pointer. - * - * Returns - * *sk* if casting is valid, or **NULL** otherwise. - */ -static struct tcp_sock *(*bpf_skc_to_tcp_sock)(void *sk) = (void *) 137; - -/* - * bpf_skc_to_tcp_timewait_sock - * - * Dynamically cast a *sk* pointer to a *tcp_timewait_sock* pointer. - * - * Returns - * *sk* if casting is valid, or **NULL** otherwise. - */ -static struct tcp_timewait_sock *(*bpf_skc_to_tcp_timewait_sock)(void *sk) = (void *) 138; - -/* - * bpf_skc_to_tcp_request_sock - * - * Dynamically cast a *sk* pointer to a *tcp_request_sock* pointer. - * - * Returns - * *sk* if casting is valid, or **NULL** otherwise. - */ -static struct tcp_request_sock *(*bpf_skc_to_tcp_request_sock)(void *sk) = (void *) 139; - -/* - * bpf_skc_to_udp6_sock - * - * Dynamically cast a *sk* pointer to a *udp6_sock* pointer. - * - * Returns - * *sk* if casting is valid, or **NULL** otherwise. - */ -static struct udp6_sock *(*bpf_skc_to_udp6_sock)(void *sk) = (void *) 140; - -/* - * bpf_get_task_stack - * - * Return a user or a kernel stack in bpf program provided buffer. - * To achieve this, the helper needs *task*, which is a valid - * pointer to **struct task_struct**. To store the stacktrace, the - * bpf program provides *buf* with a nonnegative *size*. - * - * The last argument, *flags*, holds the number of stack frames to - * skip (from 0 to 255), masked with - * **BPF_F_SKIP_FIELD_MASK**. The next bits can be used to set - * the following flags: - * - * **BPF_F_USER_STACK** - * Collect a user space stack instead of a kernel stack. - * **BPF_F_USER_BUILD_ID** - * Collect buildid+offset instead of ips for user stack, - * only valid if **BPF_F_USER_STACK** is also specified. - * - * **bpf_get_task_stack**\ () can collect up to - * **PERF_MAX_STACK_DEPTH** both kernel and user frames, subject - * to sufficient large buffer size. Note that - * this limit can be controlled with the **sysctl** program, and - * that it should be manually increased in order to profile long - * user stacks (such as stacks for Java programs). To do so, use: - * - * :: - * - * # sysctl kernel.perf_event_max_stack= - * - * Returns - * The non-negative copied *buf* length equal to or less than - * *size* on success, or a negative error in case of failure. - */ -static long (*bpf_get_task_stack)(struct task_struct *task, void *buf, __u32 size, __u64 flags) = (void *) 141; - -/* - * bpf_load_hdr_opt - * - * Load header option. Support reading a particular TCP header - * option for bpf program (**BPF_PROG_TYPE_SOCK_OPS**). - * - * If *flags* is 0, it will search the option from the - * *skops*\ **->skb_data**. The comment in **struct bpf_sock_ops** - * has details on what skb_data contains under different - * *skops*\ **->op**. - * - * The first byte of the *searchby_res* specifies the - * kind that it wants to search. - * - * If the searching kind is an experimental kind - * (i.e. 253 or 254 according to RFC6994). It also - * needs to specify the "magic" which is either - * 2 bytes or 4 bytes. It then also needs to - * specify the size of the magic by using - * the 2nd byte which is "kind-length" of a TCP - * header option and the "kind-length" also - * includes the first 2 bytes "kind" and "kind-length" - * itself as a normal TCP header option also does. - * - * For example, to search experimental kind 254 with - * 2 byte magic 0xeB9F, the searchby_res should be - * [ 254, 4, 0xeB, 0x9F, 0, 0, .... 0 ]. - * - * To search for the standard window scale option (3), - * the *searchby_res* should be [ 3, 0, 0, .... 0 ]. - * Note, kind-length must be 0 for regular option. - * - * Searching for No-Op (0) and End-of-Option-List (1) are - * not supported. - * - * *len* must be at least 2 bytes which is the minimal size - * of a header option. - * - * Supported flags: - * - * * **BPF_LOAD_HDR_OPT_TCP_SYN** to search from the - * saved_syn packet or the just-received syn packet. - * - * - * Returns - * > 0 when found, the header option is copied to *searchby_res*. - * The return value is the total length copied. On failure, a - * negative error code is returned: - * - * **-EINVAL** if a parameter is invalid. - * - * **-ENOMSG** if the option is not found. - * - * **-ENOENT** if no syn packet is available when - * **BPF_LOAD_HDR_OPT_TCP_SYN** is used. - * - * **-ENOSPC** if there is not enough space. Only *len* number of - * bytes are copied. - * - * **-EFAULT** on failure to parse the header options in the - * packet. - * - * **-EPERM** if the helper cannot be used under the current - * *skops*\ **->op**. - */ -static long (*bpf_load_hdr_opt)(struct bpf_sock_ops *skops, void *searchby_res, __u32 len, __u64 flags) = (void *) 142; - -/* - * bpf_store_hdr_opt - * - * Store header option. The data will be copied - * from buffer *from* with length *len* to the TCP header. - * - * The buffer *from* should have the whole option that - * includes the kind, kind-length, and the actual - * option data. The *len* must be at least kind-length - * long. The kind-length does not have to be 4 byte - * aligned. The kernel will take care of the padding - * and setting the 4 bytes aligned value to th->doff. - * - * This helper will check for duplicated option - * by searching the same option in the outgoing skb. - * - * This helper can only be called during - * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. - * - * - * Returns - * 0 on success, or negative error in case of failure: - * - * **-EINVAL** If param is invalid. - * - * **-ENOSPC** if there is not enough space in the header. - * Nothing has been written - * - * **-EEXIST** if the option already exists. - * - * **-EFAULT** on failrue to parse the existing header options. - * - * **-EPERM** if the helper cannot be used under the current - * *skops*\ **->op**. - */ -static long (*bpf_store_hdr_opt)(struct bpf_sock_ops *skops, const void *from, __u32 len, __u64 flags) = (void *) 143; - -/* - * bpf_reserve_hdr_opt - * - * Reserve *len* bytes for the bpf header option. The - * space will be used by **bpf_store_hdr_opt**\ () later in - * **BPF_SOCK_OPS_WRITE_HDR_OPT_CB**. - * - * If **bpf_reserve_hdr_opt**\ () is called multiple times, - * the total number of bytes will be reserved. - * - * This helper can only be called during - * **BPF_SOCK_OPS_HDR_OPT_LEN_CB**. - * - * - * Returns - * 0 on success, or negative error in case of failure: - * - * **-EINVAL** if a parameter is invalid. - * - * **-ENOSPC** if there is not enough space in the header. - * - * **-EPERM** if the helper cannot be used under the current - * *skops*\ **->op**. - */ -static long (*bpf_reserve_hdr_opt)(struct bpf_sock_ops *skops, __u32 len, __u64 flags) = (void *) 144; - -/* - * bpf_inode_storage_get - * - * Get a bpf_local_storage from an *inode*. - * - * Logically, it could be thought of as getting the value from - * a *map* with *inode* as the **key**. From this - * perspective, the usage is not much different from - * **bpf_map_lookup_elem**\ (*map*, **&**\ *inode*) except this - * helper enforces the key must be an inode and the map must also - * be a **BPF_MAP_TYPE_INODE_STORAGE**. - * - * Underneath, the value is stored locally at *inode* instead of - * the *map*. The *map* is used as the bpf-local-storage - * "type". The bpf-local-storage "type" (i.e. the *map*) is - * searched against all bpf_local_storage residing at *inode*. - * - * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be - * used such that a new bpf_local_storage will be - * created if one does not exist. *value* can be used - * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify - * the initial value of a bpf_local_storage. If *value* is - * **NULL**, the new bpf_local_storage will be zero initialized. - * - * Returns - * A bpf_local_storage pointer is returned on success. - * - * **NULL** if not found or there was an error in adding - * a new bpf_local_storage. - */ -static void *(*bpf_inode_storage_get)(void *map, void *inode, void *value, __u64 flags) = (void *) 145; - -/* - * bpf_inode_storage_delete - * - * Delete a bpf_local_storage from an *inode*. - * - * Returns - * 0 on success. - * - * **-ENOENT** if the bpf_local_storage cannot be found. - */ -static int (*bpf_inode_storage_delete)(void *map, void *inode) = (void *) 146; - -/* - * bpf_d_path - * - * Return full path for given **struct path** object, which - * needs to be the kernel BTF *path* object. The path is - * returned in the provided buffer *buf* of size *sz* and - * is zero terminated. - * - * - * Returns - * On success, the strictly positive length of the string, - * including the trailing NUL character. On error, a negative - * value. - */ -static long (*bpf_d_path)(struct path *path, char *buf, __u32 sz) = (void *) 147; - -/* - * bpf_copy_from_user - * - * Read *size* bytes from user space address *user_ptr* and store - * the data in *dst*. This is a wrapper of **copy_from_user**\ (). - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_copy_from_user)(void *dst, __u32 size, const void *user_ptr) = (void *) 148; - -/* - * bpf_snprintf_btf - * - * Use BTF to store a string representation of *ptr*->ptr in *str*, - * using *ptr*->type_id. This value should specify the type - * that *ptr*->ptr points to. LLVM __builtin_btf_type_id(type, 1) - * can be used to look up vmlinux BTF type ids. Traversing the - * data structure using BTF, the type information and values are - * stored in the first *str_size* - 1 bytes of *str*. Safe copy of - * the pointer data is carried out to avoid kernel crashes during - * operation. Smaller types can use string space on the stack; - * larger programs can use map data to store the string - * representation. - * - * The string can be subsequently shared with userspace via - * bpf_perf_event_output() or ring buffer interfaces. - * bpf_trace_printk() is to be avoided as it places too small - * a limit on string size to be useful. - * - * *flags* is a combination of - * - * **BTF_F_COMPACT** - * no formatting around type information - * **BTF_F_NONAME** - * no struct/union member names/types - * **BTF_F_PTR_RAW** - * show raw (unobfuscated) pointer values; - * equivalent to printk specifier %px. - * **BTF_F_ZERO** - * show zero-valued struct/union members; they - * are not displayed by default - * - * - * Returns - * The number of bytes that were written (or would have been - * written if output had to be truncated due to string size), - * or a negative error in cases of failure. - */ -static long (*bpf_snprintf_btf)(char *str, __u32 str_size, struct btf_ptr *ptr, __u32 btf_ptr_size, __u64 flags) = (void *) 149; - -/* - * bpf_seq_printf_btf - * - * Use BTF to write to seq_write a string representation of - * *ptr*->ptr, using *ptr*->type_id as per bpf_snprintf_btf(). - * *flags* are identical to those used for bpf_snprintf_btf. - * - * Returns - * 0 on success or a negative error in case of failure. - */ -static long (*bpf_seq_printf_btf)(struct seq_file *m, struct btf_ptr *ptr, __u32 ptr_size, __u64 flags) = (void *) 150; - -/* - * bpf_skb_cgroup_classid - * - * See **bpf_get_cgroup_classid**\ () for the main description. - * This helper differs from **bpf_get_cgroup_classid**\ () in that - * the cgroup v1 net_cls class is retrieved only from the *skb*'s - * associated socket instead of the current process. - * - * Returns - * The id is returned or 0 in case the id could not be retrieved. - */ -static __u64 (*bpf_skb_cgroup_classid)(struct __sk_buff *skb) = (void *) 151; - -/* - * bpf_redirect_neigh - * - * Redirect the packet to another net device of index *ifindex* - * and fill in L2 addresses from neighboring subsystem. This helper - * is somewhat similar to **bpf_redirect**\ (), except that it - * populates L2 addresses as well, meaning, internally, the helper - * relies on the neighbor lookup for the L2 address of the nexthop. - * - * The helper will perform a FIB lookup based on the skb's - * networking header to get the address of the next hop, unless - * this is supplied by the caller in the *params* argument. The - * *plen* argument indicates the len of *params* and should be set - * to 0 if *params* is NULL. - * - * The *flags* argument is reserved and must be 0. The helper is - * currently only supported for tc BPF program types, and enabled - * for IPv4 and IPv6 protocols. - * - * Returns - * The helper returns **TC_ACT_REDIRECT** on success or - * **TC_ACT_SHOT** on error. - */ -static long (*bpf_redirect_neigh)(__u32 ifindex, struct bpf_redir_neigh *params, int plen, __u64 flags) = (void *) 152; - -/* - * bpf_per_cpu_ptr - * - * Take a pointer to a percpu ksym, *percpu_ptr*, and return a - * pointer to the percpu kernel variable on *cpu*. A ksym is an - * extern variable decorated with '__ksym'. For ksym, there is a - * global var (either static or global) defined of the same name - * in the kernel. The ksym is percpu if the global var is percpu. - * The returned pointer points to the global percpu var on *cpu*. - * - * bpf_per_cpu_ptr() has the same semantic as per_cpu_ptr() in the - * kernel, except that bpf_per_cpu_ptr() may return NULL. This - * happens if *cpu* is larger than nr_cpu_ids. The caller of - * bpf_per_cpu_ptr() must check the returned value. - * - * Returns - * A pointer pointing to the kernel percpu variable on *cpu*, or - * NULL, if *cpu* is invalid. - */ -static void *(*bpf_per_cpu_ptr)(const void *percpu_ptr, __u32 cpu) = (void *) 153; - -/* - * bpf_this_cpu_ptr - * - * Take a pointer to a percpu ksym, *percpu_ptr*, and return a - * pointer to the percpu kernel variable on this cpu. See the - * description of 'ksym' in **bpf_per_cpu_ptr**\ (). - * - * bpf_this_cpu_ptr() has the same semantic as this_cpu_ptr() in - * the kernel. Different from **bpf_per_cpu_ptr**\ (), it would - * never return NULL. - * - * Returns - * A pointer pointing to the kernel percpu variable on this cpu. - */ -static void *(*bpf_this_cpu_ptr)(const void *percpu_ptr) = (void *) 154; - -/* - * bpf_redirect_peer - * - * Redirect the packet to another net device of index *ifindex*. - * This helper is somewhat similar to **bpf_redirect**\ (), except - * that the redirection happens to the *ifindex*' peer device and - * the netns switch takes place from ingress to ingress without - * going through the CPU's backlog queue. - * - * The *flags* argument is reserved and must be 0. The helper is - * currently only supported for tc BPF program types at the ingress - * hook and for veth device types. The peer device must reside in a - * different network namespace. - * - * Returns - * The helper returns **TC_ACT_REDIRECT** on success or - * **TC_ACT_SHOT** on error. - */ -static long (*bpf_redirect_peer)(__u32 ifindex, __u64 flags) = (void *) 155; - -/* - * bpf_task_storage_get - * - * Get a bpf_local_storage from the *task*. - * - * Logically, it could be thought of as getting the value from - * a *map* with *task* as the **key**. From this - * perspective, the usage is not much different from - * **bpf_map_lookup_elem**\ (*map*, **&**\ *task*) except this - * helper enforces the key must be an task_struct and the map must also - * be a **BPF_MAP_TYPE_TASK_STORAGE**. - * - * Underneath, the value is stored locally at *task* instead of - * the *map*. The *map* is used as the bpf-local-storage - * "type". The bpf-local-storage "type" (i.e. the *map*) is - * searched against all bpf_local_storage residing at *task*. - * - * An optional *flags* (**BPF_LOCAL_STORAGE_GET_F_CREATE**) can be - * used such that a new bpf_local_storage will be - * created if one does not exist. *value* can be used - * together with **BPF_LOCAL_STORAGE_GET_F_CREATE** to specify - * the initial value of a bpf_local_storage. If *value* is - * **NULL**, the new bpf_local_storage will be zero initialized. - * - * Returns - * A bpf_local_storage pointer is returned on success. - * - * **NULL** if not found or there was an error in adding - * a new bpf_local_storage. - */ -static void *(*bpf_task_storage_get)(void *map, struct task_struct *task, void *value, __u64 flags) = (void *) 156; - -/* - * bpf_task_storage_delete - * - * Delete a bpf_local_storage from a *task*. - * - * Returns - * 0 on success. - * - * **-ENOENT** if the bpf_local_storage cannot be found. - */ -static long (*bpf_task_storage_delete)(void *map, struct task_struct *task) = (void *) 157; - -/* - * bpf_get_current_task_btf - * - * Return a BTF pointer to the "current" task. - * This pointer can also be used in helpers that accept an - * *ARG_PTR_TO_BTF_ID* of type *task_struct*. - * - * Returns - * Pointer to the current task. - */ -static struct task_struct *(*bpf_get_current_task_btf)(void) = (void *) 158; - -/* - * bpf_bprm_opts_set - * - * Set or clear certain options on *bprm*: - * - * **BPF_F_BPRM_SECUREEXEC** Set the secureexec bit - * which sets the **AT_SECURE** auxv for glibc. The bit - * is cleared if the flag is not specified. - * - * Returns - * **-EINVAL** if invalid *flags* are passed, zero otherwise. - */ -static long (*bpf_bprm_opts_set)(struct linux_binprm *bprm, __u64 flags) = (void *) 159; - -/* - * bpf_ktime_get_coarse_ns - * - * Return a coarse-grained version of the time elapsed since - * system boot, in nanoseconds. Does not include time the system - * was suspended. - * - * See: **clock_gettime**\ (**CLOCK_MONOTONIC_COARSE**) - * - * Returns - * Current *ktime*. - */ -static __u64 (*bpf_ktime_get_coarse_ns)(void) = (void *) 160; - -/* - * bpf_ima_inode_hash - * - * Returns the stored IMA hash of the *inode* (if it's avaialable). - * If the hash is larger than *size*, then only *size* - * bytes will be copied to *dst* - * - * Returns - * The **hash_algo** is returned on success, - * **-EOPNOTSUP** if IMA is disabled or **-EINVAL** if - * invalid arguments are passed. - */ -static long (*bpf_ima_inode_hash)(struct inode *inode, void *dst, __u32 size) = (void *) 161; - -/* - * bpf_sock_from_file - * - * If the given file represents a socket, returns the associated - * socket. - * - * Returns - * A pointer to a struct socket on success or NULL if the file is - * not a socket. - */ -static struct socket *(*bpf_sock_from_file)(struct file *file) = (void *) 162; - -/* - * bpf_check_mtu - * - * Check packet size against exceeding MTU of net device (based - * on *ifindex*). This helper will likely be used in combination - * with helpers that adjust/change the packet size. - * - * The argument *len_diff* can be used for querying with a planned - * size change. This allows to check MTU prior to changing packet - * ctx. Providing an *len_diff* adjustment that is larger than the - * actual packet size (resulting in negative packet size) will in - * principle not exceed the MTU, why it is not considered a - * failure. Other BPF-helpers are needed for performing the - * planned size change, why the responsability for catch a negative - * packet size belong in those helpers. - * - * Specifying *ifindex* zero means the MTU check is performed - * against the current net device. This is practical if this isn't - * used prior to redirect. - * - * On input *mtu_len* must be a valid pointer, else verifier will - * reject BPF program. If the value *mtu_len* is initialized to - * zero then the ctx packet size is use. When value *mtu_len* is - * provided as input this specify the L3 length that the MTU check - * is done against. Remember XDP and TC length operate at L2, but - * this value is L3 as this correlate to MTU and IP-header tot_len - * values which are L3 (similar behavior as bpf_fib_lookup). - * - * The Linux kernel route table can configure MTUs on a more - * specific per route level, which is not provided by this helper. - * For route level MTU checks use the **bpf_fib_lookup**\ () - * helper. - * - * *ctx* is either **struct xdp_md** for XDP programs or - * **struct sk_buff** for tc cls_act programs. - * - * The *flags* argument can be a combination of one or more of the - * following values: - * - * **BPF_MTU_CHK_SEGS** - * This flag will only works for *ctx* **struct sk_buff**. - * If packet context contains extra packet segment buffers - * (often knows as GSO skb), then MTU check is harder to - * check at this point, because in transmit path it is - * possible for the skb packet to get re-segmented - * (depending on net device features). This could still be - * a MTU violation, so this flag enables performing MTU - * check against segments, with a different violation - * return code to tell it apart. Check cannot use len_diff. - * - * On return *mtu_len* pointer contains the MTU value of the net - * device. Remember the net device configured MTU is the L3 size, - * which is returned here and XDP and TC length operate at L2. - * Helper take this into account for you, but remember when using - * MTU value in your BPF-code. - * - * - * Returns - * * 0 on success, and populate MTU value in *mtu_len* pointer. - * - * * < 0 if any input argument is invalid (*mtu_len* not updated) - * - * MTU violations return positive values, but also populate MTU - * value in *mtu_len* pointer, as this can be needed for - * implementing PMTU handing: - * - * * **BPF_MTU_CHK_RET_FRAG_NEEDED** - * * **BPF_MTU_CHK_RET_SEGS_TOOBIG** - */ -static long (*bpf_check_mtu)(void *ctx, __u32 ifindex, __u32 *mtu_len, __s32 len_diff, __u64 flags) = (void *) 163; - -/* - * bpf_for_each_map_elem - * - * For each element in **map**, call **callback_fn** function with - * **map**, **callback_ctx** and other map-specific parameters. - * The **callback_fn** should be a static function and - * the **callback_ctx** should be a pointer to the stack. - * The **flags** is used to control certain aspects of the helper. - * Currently, the **flags** must be 0. - * - * The following are a list of supported map types and their - * respective expected callback signatures: - * - * BPF_MAP_TYPE_HASH, BPF_MAP_TYPE_PERCPU_HASH, - * BPF_MAP_TYPE_LRU_HASH, BPF_MAP_TYPE_LRU_PERCPU_HASH, - * BPF_MAP_TYPE_ARRAY, BPF_MAP_TYPE_PERCPU_ARRAY - * - * long (\*callback_fn)(struct bpf_map \*map, const void \*key, void \*value, void \*ctx); - * - * For per_cpu maps, the map_value is the value on the cpu where the - * bpf_prog is running. - * - * If **callback_fn** return 0, the helper will continue to the next - * element. If return value is 1, the helper will skip the rest of - * elements and return. Other return values are not used now. - * - * - * Returns - * The number of traversed map elements for success, **-EINVAL** for - * invalid **flags**. - */ -static long (*bpf_for_each_map_elem)(void *map, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 164; - -/* - * bpf_snprintf - * - * Outputs a string into the **str** buffer of size **str_size** - * based on a format string stored in a read-only map pointed by - * **fmt**. - * - * Each format specifier in **fmt** corresponds to one u64 element - * in the **data** array. For strings and pointers where pointees - * are accessed, only the pointer values are stored in the *data* - * array. The *data_len* is the size of *data* in bytes - must be - * a multiple of 8. - * - * Formats **%s** and **%p{i,I}{4,6}** require to read kernel - * memory. Reading kernel memory may fail due to either invalid - * address or valid address but requiring a major memory fault. If - * reading kernel memory fails, the string for **%s** will be an - * empty string, and the ip address for **%p{i,I}{4,6}** will be 0. - * Not returning error to bpf program is consistent with what - * **bpf_trace_printk**\ () does for now. - * - * - * Returns - * The strictly positive length of the formatted string, including - * the trailing zero character. If the return value is greater than - * **str_size**, **str** contains a truncated string, guaranteed to - * be zero-terminated except when **str_size** is 0. - * - * Or **-EBUSY** if the per-CPU memory copy buffer is busy. - */ -static long (*bpf_snprintf)(char *str, __u32 str_size, const char *fmt, __u64 *data, __u32 data_len) = (void *) 165; - -/* - * bpf_sys_bpf - * - * Execute bpf syscall with given arguments. - * - * Returns - * A syscall result. - */ -static long (*bpf_sys_bpf)(__u32 cmd, void *attr, __u32 attr_size) = (void *) 166; - -/* - * bpf_btf_find_by_name_kind - * - * Find BTF type with given name and kind in vmlinux BTF or in module's BTFs. - * - * Returns - * Returns btf_id and btf_obj_fd in lower and upper 32 bits. - */ -static long (*bpf_btf_find_by_name_kind)(char *name, int name_sz, __u32 kind, int flags) = (void *) 167; - -/* - * bpf_sys_close - * - * Execute close syscall for given FD. - * - * Returns - * A syscall result. - */ -static long (*bpf_sys_close)(__u32 fd) = (void *) 168; - -/* - * bpf_timer_init - * - * Initialize the timer. - * First 4 bits of *flags* specify clockid. - * Only CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME are allowed. - * All other bits of *flags* are reserved. - * The verifier will reject the program if *timer* is not from - * the same *map*. - * - * Returns - * 0 on success. - * **-EBUSY** if *timer* is already initialized. - * **-EINVAL** if invalid *flags* are passed. - * **-EPERM** if *timer* is in a map that doesn't have any user references. - * The user space should either hold a file descriptor to a map with timers - * or pin such map in bpffs. When map is unpinned or file descriptor is - * closed all timers in the map will be cancelled and freed. - */ -static long (*bpf_timer_init)(struct bpf_timer *timer, void *map, __u64 flags) = (void *) 169; - -/* - * bpf_timer_set_callback - * - * Configure the timer to call *callback_fn* static function. - * - * Returns - * 0 on success. - * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. - * **-EPERM** if *timer* is in a map that doesn't have any user references. - * The user space should either hold a file descriptor to a map with timers - * or pin such map in bpffs. When map is unpinned or file descriptor is - * closed all timers in the map will be cancelled and freed. - */ -static long (*bpf_timer_set_callback)(struct bpf_timer *timer, void *callback_fn) = (void *) 170; - -/* - * bpf_timer_start - * - * Set timer expiration N nanoseconds from the current time. The - * configured callback will be invoked in soft irq context on some cpu - * and will not repeat unless another bpf_timer_start() is made. - * In such case the next invocation can migrate to a different cpu. - * Since struct bpf_timer is a field inside map element the map - * owns the timer. The bpf_timer_set_callback() will increment refcnt - * of BPF program to make sure that callback_fn code stays valid. - * When user space reference to a map reaches zero all timers - * in a map are cancelled and corresponding program's refcnts are - * decremented. This is done to make sure that Ctrl-C of a user - * process doesn't leave any timers running. If map is pinned in - * bpffs the callback_fn can re-arm itself indefinitely. - * bpf_map_update/delete_elem() helpers and user space sys_bpf commands - * cancel and free the timer in the given map element. - * The map can contain timers that invoke callback_fn-s from different - * programs. The same callback_fn can serve different timers from - * different maps if key/value layout matches across maps. - * Every bpf_timer_set_callback() can have different callback_fn. - * - * - * Returns - * 0 on success. - * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier - * or invalid *flags* are passed. - */ -static long (*bpf_timer_start)(struct bpf_timer *timer, __u64 nsecs, __u64 flags) = (void *) 171; - -/* - * bpf_timer_cancel - * - * Cancel the timer and wait for callback_fn to finish if it was running. - * - * Returns - * 0 if the timer was not active. - * 1 if the timer was active. - * **-EINVAL** if *timer* was not initialized with bpf_timer_init() earlier. - * **-EDEADLK** if callback_fn tried to call bpf_timer_cancel() on its - * own timer which would have led to a deadlock otherwise. - */ -static long (*bpf_timer_cancel)(struct bpf_timer *timer) = (void *) 172; - -/* - * bpf_get_func_ip - * - * Get address of the traced function (for tracing and kprobe programs). - * - * Returns - * Address of the traced function. - */ -static __u64 (*bpf_get_func_ip)(void *ctx) = (void *) 173; - -/* - * bpf_get_attach_cookie - * - * Get bpf_cookie value provided (optionally) during the program - * attachment. It might be different for each individual - * attachment, even if BPF program itself is the same. - * Expects BPF program context *ctx* as a first argument. - * - * Supported for the following program types: - * - kprobe/uprobe; - * - tracepoint; - * - perf_event. - * - * Returns - * Value specified by user at BPF link creation/attachment time - * or 0, if it was not specified. - */ -static __u64 (*bpf_get_attach_cookie)(void *ctx) = (void *) 174; - -/* - * bpf_task_pt_regs - * - * Get the struct pt_regs associated with **task**. - * - * Returns - * A pointer to struct pt_regs. - */ -static long (*bpf_task_pt_regs)(struct task_struct *task) = (void *) 175; - -/* - * bpf_get_branch_snapshot - * - * Get branch trace from hardware engines like Intel LBR. The - * hardware engine is stopped shortly after the helper is - * called. Therefore, the user need to filter branch entries - * based on the actual use case. To capture branch trace - * before the trigger point of the BPF program, the helper - * should be called at the beginning of the BPF program. - * - * The data is stored as struct perf_branch_entry into output - * buffer *entries*. *size* is the size of *entries* in bytes. - * *flags* is reserved for now and must be zero. - * - * - * Returns - * On success, number of bytes written to *buf*. On error, a - * negative value. - * - * **-EINVAL** if *flags* is not zero. - * - * **-ENOENT** if architecture does not support branch records. - */ -static long (*bpf_get_branch_snapshot)(void *entries, __u32 size, __u64 flags) = (void *) 176; - -/* - * bpf_trace_vprintk - * - * Behaves like **bpf_trace_printk**\ () helper, but takes an array of u64 - * to format and can handle more format args as a result. - * - * Arguments are to be used as in **bpf_seq_printf**\ () helper. - * - * Returns - * The number of bytes written to the buffer, or a negative error - * in case of failure. - */ -static long (*bpf_trace_vprintk)(const char *fmt, __u32 fmt_size, const void *data, __u32 data_len) = (void *) 177; - -/* - * bpf_skc_to_unix_sock - * - * Dynamically cast a *sk* pointer to a *unix_sock* pointer. - * - * Returns - * *sk* if casting is valid, or **NULL** otherwise. - */ -static struct unix_sock *(*bpf_skc_to_unix_sock)(void *sk) = (void *) 178; - -/* - * bpf_kallsyms_lookup_name - * - * Get the address of a kernel symbol, returned in *res*. *res* is - * set to 0 if the symbol is not found. - * - * Returns - * On success, zero. On error, a negative value. - * - * **-EINVAL** if *flags* is not zero. - * - * **-EINVAL** if string *name* is not the same size as *name_sz*. - * - * **-ENOENT** if symbol is not found. - * - * **-EPERM** if caller does not have permission to obtain kernel address. - */ -static long (*bpf_kallsyms_lookup_name)(const char *name, int name_sz, int flags, __u64 *res) = (void *) 179; - -/* - * bpf_find_vma - * - * Find vma of *task* that contains *addr*, call *callback_fn* - * function with *task*, *vma*, and *callback_ctx*. - * The *callback_fn* should be a static function and - * the *callback_ctx* should be a pointer to the stack. - * The *flags* is used to control certain aspects of the helper. - * Currently, the *flags* must be 0. - * - * The expected callback signature is - * - * long (\*callback_fn)(struct task_struct \*task, struct vm_area_struct \*vma, void \*callback_ctx); - * - * - * Returns - * 0 on success. - * **-ENOENT** if *task->mm* is NULL, or no vma contains *addr*. - * **-EBUSY** if failed to try lock mmap_lock. - * **-EINVAL** for invalid **flags**. - */ -static long (*bpf_find_vma)(struct task_struct *task, __u64 addr, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 180; - -/* - * bpf_loop - * - * For **nr_loops**, call **callback_fn** function - * with **callback_ctx** as the context parameter. - * The **callback_fn** should be a static function and - * the **callback_ctx** should be a pointer to the stack. - * The **flags** is used to control certain aspects of the helper. - * Currently, the **flags** must be 0. Currently, nr_loops is - * limited to 1 << 23 (~8 million) loops. - * - * long (\*callback_fn)(u32 index, void \*ctx); - * - * where **index** is the current index in the loop. The index - * is zero-indexed. - * - * If **callback_fn** returns 0, the helper will continue to the next - * loop. If return value is 1, the helper will skip the rest of - * the loops and return. Other return values are not used now, - * and will be rejected by the verifier. - * - * - * Returns - * The number of loops performed, **-EINVAL** for invalid **flags**, - * **-E2BIG** if **nr_loops** exceeds the maximum number of loops. - */ -static long (*bpf_loop)(__u32 nr_loops, void *callback_fn, void *callback_ctx, __u64 flags) = (void *) 181; - -/* - * bpf_strncmp - * - * Do strncmp() between **s1** and **s2**. **s1** doesn't need - * to be null-terminated and **s1_sz** is the maximum storage - * size of **s1**. **s2** must be a read-only string. - * - * Returns - * An integer less than, equal to, or greater than zero - * if the first **s1_sz** bytes of **s1** is found to be - * less than, to match, or be greater than **s2**. - */ -static long (*bpf_strncmp)(const char *s1, __u32 s1_sz, const char *s2) = (void *) 182; - -/* - * bpf_get_func_arg - * - * Get **n**-th argument (zero based) of the traced function (for tracing programs) - * returned in **value**. - * - * - * Returns - * 0 on success. - * **-EINVAL** if n >= arguments count of traced function. - */ -static long (*bpf_get_func_arg)(void *ctx, __u32 n, __u64 *value) = (void *) 183; - -/* - * bpf_get_func_ret - * - * Get return value of the traced function (for tracing programs) - * in **value**. - * - * - * Returns - * 0 on success. - * **-EOPNOTSUPP** for tracing programs other than BPF_TRACE_FEXIT or BPF_MODIFY_RETURN. - */ -static long (*bpf_get_func_ret)(void *ctx, __u64 *value) = (void *) 184; - -/* - * bpf_get_func_arg_cnt - * - * Get number of arguments of the traced function (for tracing programs). - * - * - * Returns - * The number of arguments of the traced function. - */ -static long (*bpf_get_func_arg_cnt)(void *ctx) = (void *) 185; - -/* - * bpf_get_retval - * - * Get the syscall's return value that will be returned to userspace. - * - * This helper is currently supported by cgroup programs only. - * - * Returns - * The syscall's return value. - */ -static int (*bpf_get_retval)(void) = (void *) 186; - -/* - * bpf_set_retval - * - * Set the syscall's return value that will be returned to userspace. - * - * This helper is currently supported by cgroup programs only. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static int (*bpf_set_retval)(int retval) = (void *) 187; - -/* - * bpf_xdp_get_buff_len - * - * Get the total size of a given xdp buff (linear and paged area) - * - * Returns - * The total size of a given xdp buffer. - */ -static __u64 (*bpf_xdp_get_buff_len)(struct xdp_md *xdp_md) = (void *) 188; - -/* - * bpf_xdp_load_bytes - * - * This helper is provided as an easy way to load data from a - * xdp buffer. It can be used to load *len* bytes from *offset* from - * the frame associated to *xdp_md*, into the buffer pointed by - * *buf*. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_xdp_load_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = (void *) 189; - -/* - * bpf_xdp_store_bytes - * - * Store *len* bytes from buffer *buf* into the frame - * associated to *xdp_md*, at *offset*. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_xdp_store_bytes)(struct xdp_md *xdp_md, __u32 offset, void *buf, __u32 len) = (void *) 190; - -/* - * bpf_copy_from_user_task - * - * Read *size* bytes from user space address *user_ptr* in *tsk*'s - * address space, and stores the data in *dst*. *flags* is not - * used yet and is provided for future extensibility. This helper - * can only be used by sleepable programs. - * - * Returns - * 0 on success, or a negative error in case of failure. On error - * *dst* buffer is zeroed out. - */ -static long (*bpf_copy_from_user_task)(void *dst, __u32 size, const void *user_ptr, struct task_struct *tsk, __u64 flags) = (void *) 191; - -/* - * bpf_skb_set_tstamp - * - * Change the __sk_buff->tstamp_type to *tstamp_type* - * and set *tstamp* to the __sk_buff->tstamp together. - * - * If there is no need to change the __sk_buff->tstamp_type, - * the tstamp value can be directly written to __sk_buff->tstamp - * instead. - * - * BPF_SKB_TSTAMP_DELIVERY_MONO is the only tstamp that - * will be kept during bpf_redirect_*(). A non zero - * *tstamp* must be used with the BPF_SKB_TSTAMP_DELIVERY_MONO - * *tstamp_type*. - * - * A BPF_SKB_TSTAMP_UNSPEC *tstamp_type* can only be used - * with a zero *tstamp*. - * - * Only IPv4 and IPv6 skb->protocol are supported. - * - * This function is most useful when it needs to set a - * mono delivery time to __sk_buff->tstamp and then - * bpf_redirect_*() to the egress of an iface. For example, - * changing the (rcv) timestamp in __sk_buff->tstamp at - * ingress to a mono delivery time and then bpf_redirect_*() - * to sch_fq@phy-dev. - * - * Returns - * 0 on success. - * **-EINVAL** for invalid input - * **-EOPNOTSUPP** for unsupported protocol - */ -static long (*bpf_skb_set_tstamp)(struct __sk_buff *skb, __u64 tstamp, __u32 tstamp_type) = (void *) 192; - -/* - * bpf_ima_file_hash - * - * Returns a calculated IMA hash of the *file*. - * If the hash is larger than *size*, then only *size* - * bytes will be copied to *dst* - * - * Returns - * The **hash_algo** is returned on success, - * **-EOPNOTSUP** if the hash calculation failed or **-EINVAL** if - * invalid arguments are passed. - */ -static long (*bpf_ima_file_hash)(struct file *file, void *dst, __u32 size) = (void *) 193; - -/* - * bpf_kptr_xchg - * - * Exchange kptr at pointer *map_value* with *ptr*, and return the - * old value. *ptr* can be NULL, otherwise it must be a referenced - * pointer which will be released when this helper is called. - * - * Returns - * The old value of kptr (which can be NULL). The returned pointer - * if not NULL, is a reference which must be released using its - * corresponding release function, or moved into a BPF map before - * program exit. - */ -static void *(*bpf_kptr_xchg)(void *map_value, void *ptr) = (void *) 194; - -/* - * bpf_map_lookup_percpu_elem - * - * Perform a lookup in *percpu map* for an entry associated to - * *key* on *cpu*. - * - * Returns - * Map value associated to *key* on *cpu*, or **NULL** if no entry - * was found or *cpu* is invalid. - */ -static void *(*bpf_map_lookup_percpu_elem)(void *map, const void *key, __u32 cpu) = (void *) 195; - -/* - * bpf_skc_to_mptcp_sock - * - * Dynamically cast a *sk* pointer to a *mptcp_sock* pointer. - * - * Returns - * *sk* if casting is valid, or **NULL** otherwise. - */ -static struct mptcp_sock *(*bpf_skc_to_mptcp_sock)(void *sk) = (void *) 196; - -/* - * bpf_dynptr_from_mem - * - * Get a dynptr to local memory *data*. - * - * *data* must be a ptr to a map value. - * The maximum *size* supported is DYNPTR_MAX_SIZE. - * *flags* is currently unused. - * - * Returns - * 0 on success, -E2BIG if the size exceeds DYNPTR_MAX_SIZE, - * -EINVAL if flags is not 0. - */ -static long (*bpf_dynptr_from_mem)(void *data, __u32 size, __u64 flags, struct bpf_dynptr *ptr) = (void *) 197; - -/* - * bpf_ringbuf_reserve_dynptr - * - * Reserve *size* bytes of payload in a ring buffer *ringbuf* - * through the dynptr interface. *flags* must be 0. - * - * Please note that a corresponding bpf_ringbuf_submit_dynptr or - * bpf_ringbuf_discard_dynptr must be called on *ptr*, even if the - * reservation fails. This is enforced by the verifier. - * - * Returns - * 0 on success, or a negative error in case of failure. - */ -static long (*bpf_ringbuf_reserve_dynptr)(void *ringbuf, __u32 size, __u64 flags, struct bpf_dynptr *ptr) = (void *) 198; - -/* - * bpf_ringbuf_submit_dynptr - * - * Submit reserved ring buffer sample, pointed to by *data*, - * through the dynptr interface. This is a no-op if the dynptr is - * invalid/null. - * - * For more information on *flags*, please see - * 'bpf_ringbuf_submit'. - * - * Returns - * Nothing. Always succeeds. - */ -static void (*bpf_ringbuf_submit_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = (void *) 199; - -/* - * bpf_ringbuf_discard_dynptr - * - * Discard reserved ring buffer sample through the dynptr - * interface. This is a no-op if the dynptr is invalid/null. - * - * For more information on *flags*, please see - * 'bpf_ringbuf_discard'. - * - * Returns - * Nothing. Always succeeds. - */ -static void (*bpf_ringbuf_discard_dynptr)(struct bpf_dynptr *ptr, __u64 flags) = (void *) 200; - -/* - * bpf_dynptr_read - * - * Read *len* bytes from *src* into *dst*, starting from *offset* - * into *src*. - * - * Returns - * 0 on success, -E2BIG if *offset* + *len* exceeds the length - * of *src*'s data, -EINVAL if *src* is an invalid dynptr. - */ -static long (*bpf_dynptr_read)(void *dst, __u32 len, struct bpf_dynptr *src, __u32 offset) = (void *) 201; - -/* - * bpf_dynptr_write - * - * Write *len* bytes from *src* into *dst*, starting from *offset* - * into *dst*. - * - * Returns - * 0 on success, -E2BIG if *offset* + *len* exceeds the length - * of *dst*'s data, -EINVAL if *dst* is an invalid dynptr or if *dst* - * is a read-only dynptr. - */ -static long (*bpf_dynptr_write)(struct bpf_dynptr *dst, __u32 offset, void *src, __u32 len) = (void *) 202; - -/* - * bpf_dynptr_data - * - * Get a pointer to the underlying dynptr data. - * - * *len* must be a statically known value. The returned data slice - * is invalidated whenever the dynptr is invalidated. - * - * Returns - * Pointer to the underlying dynptr data, NULL if the dynptr is - * read-only, if the dynptr is invalid, or if the offset and length - * is out of bounds. - */ -static void *(*bpf_dynptr_data)(struct bpf_dynptr *ptr, __u32 offset, __u32 len) = (void *) 203; - -/* - * bpf_tcp_raw_gen_syncookie_ipv4 - * - * Try to issue a SYN cookie for the packet with corresponding - * IPv4/TCP headers, *iph* and *th*, without depending on a - * listening socket. - * - * *iph* points to the IPv4 header. - * - * *th* points to the start of the TCP header, while *th_len* - * contains the length of the TCP header (at least - * **sizeof**\ (**struct tcphdr**)). - * - * Returns - * On success, lower 32 bits hold the generated SYN cookie in - * followed by 16 bits which hold the MSS value for that cookie, - * and the top 16 bits are unused. - * - * On failure, the returned value is one of the following: - * - * **-EINVAL** if *th_len* is invalid. - */ -static __s64 (*bpf_tcp_raw_gen_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th, __u32 th_len) = (void *) 204; - -/* - * bpf_tcp_raw_gen_syncookie_ipv6 - * - * Try to issue a SYN cookie for the packet with corresponding - * IPv6/TCP headers, *iph* and *th*, without depending on a - * listening socket. - * - * *iph* points to the IPv6 header. - * - * *th* points to the start of the TCP header, while *th_len* - * contains the length of the TCP header (at least - * **sizeof**\ (**struct tcphdr**)). - * - * Returns - * On success, lower 32 bits hold the generated SYN cookie in - * followed by 16 bits which hold the MSS value for that cookie, - * and the top 16 bits are unused. - * - * On failure, the returned value is one of the following: - * - * **-EINVAL** if *th_len* is invalid. - * - * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. - */ -static __s64 (*bpf_tcp_raw_gen_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th, __u32 th_len) = (void *) 205; - -/* - * bpf_tcp_raw_check_syncookie_ipv4 - * - * Check whether *iph* and *th* contain a valid SYN cookie ACK - * without depending on a listening socket. - * - * *iph* points to the IPv4 header. - * - * *th* points to the TCP header. - * - * Returns - * 0 if *iph* and *th* are a valid SYN cookie ACK. - * - * On failure, the returned value is one of the following: - * - * **-EACCES** if the SYN cookie is not valid. - */ -static long (*bpf_tcp_raw_check_syncookie_ipv4)(struct iphdr *iph, struct tcphdr *th) = (void *) 206; - -/* - * bpf_tcp_raw_check_syncookie_ipv6 - * - * Check whether *iph* and *th* contain a valid SYN cookie ACK - * without depending on a listening socket. - * - * *iph* points to the IPv6 header. - * - * *th* points to the TCP header. - * - * Returns - * 0 if *iph* and *th* are a valid SYN cookie ACK. - * - * On failure, the returned value is one of the following: - * - * **-EACCES** if the SYN cookie is not valid. - * - * **-EPROTONOSUPPORT** if CONFIG_IPV6 is not builtin. - */ -static long (*bpf_tcp_raw_check_syncookie_ipv6)(struct ipv6hdr *iph, struct tcphdr *th) = (void *) 207; - - diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_helpers.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_helpers.h deleted file mode 100644 index bb8526c..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_helpers.h +++ /dev/null @@ -1,288 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#ifndef __BPF_HELPERS__ -#define __BPF_HELPERS__ - -/* - * Note that bpf programs need to include either - * vmlinux.h (auto-generated from BTF) or linux/types.h - * in advance since bpf_helper_defs.h uses such types - * as __u64. - */ -#include "bpf_helper_defs.h" - -#define __uint(name, val) int (*name)[val] -#define __type(name, val) typeof(val) *name -#define __array(name, val) typeof(val) *name[] - -/* - * Helper macro to place programs, maps, license in - * different sections in elf_bpf file. Section names - * are interpreted by libbpf depending on the context (BPF programs, BPF maps, - * extern variables, etc). - * To allow use of SEC() with externs (e.g., for extern .maps declarations), - * make sure __attribute__((unused)) doesn't trigger compilation warning. - */ -#define SEC(name) \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wignored-attributes\"") \ - __attribute__((section(name), used)) \ - _Pragma("GCC diagnostic pop") \ - -/* Avoid 'linux/stddef.h' definition of '__always_inline'. */ -#undef __always_inline -#define __always_inline inline __attribute__((always_inline)) - -#ifndef __noinline -#define __noinline __attribute__((noinline)) -#endif -#ifndef __weak -#define __weak __attribute__((weak)) -#endif - -/* - * Use __hidden attribute to mark a non-static BPF subprogram effectively - * static for BPF verifier's verification algorithm purposes, allowing more - * extensive and permissive BPF verification process, taking into account - * subprogram's caller context. - */ -#define __hidden __attribute__((visibility("hidden"))) - -/* When utilizing vmlinux.h with BPF CO-RE, user BPF programs can't include - * any system-level headers (such as stddef.h, linux/version.h, etc), and - * commonly-used macros like NULL and KERNEL_VERSION aren't available through - * vmlinux.h. This just adds unnecessary hurdles and forces users to re-define - * them on their own. So as a convenience, provide such definitions here. - */ -#ifndef NULL -#define NULL ((void *)0) -#endif - -#ifndef KERNEL_VERSION -#define KERNEL_VERSION(a, b, c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c))) -#endif - -/* - * Helper macros to manipulate data structures - */ -#ifndef offsetof -#define offsetof(TYPE, MEMBER) ((unsigned long)&((TYPE *)0)->MEMBER) -#endif -#ifndef container_of -#define container_of(ptr, type, member) \ - ({ \ - void *__mptr = (void *)(ptr); \ - ((type *)(__mptr - offsetof(type, member))); \ - }) -#endif - -/* - * Compiler (optimization) barrier. - */ -#ifndef barrier -#define barrier() asm volatile("" ::: "memory") -#endif - -/* Variable-specific compiler (optimization) barrier. It's a no-op which makes - * compiler believe that there is some black box modification of a given - * variable and thus prevents compiler from making extra assumption about its - * value and potential simplifications and optimizations on this variable. - * - * E.g., compiler might often delay or even omit 32-bit to 64-bit casting of - * a variable, making some code patterns unverifiable. Putting barrier_var() - * in place will ensure that cast is performed before the barrier_var() - * invocation, because compiler has to pessimistically assume that embedded - * asm section might perform some extra operations on that variable. - * - * This is a variable-specific variant of more global barrier(). - */ -#ifndef barrier_var -#define barrier_var(var) asm volatile("" : "=r"(var) : "0"(var)) -#endif - -/* - * Helper macro to throw a compilation error if __bpf_unreachable() gets - * built into the resulting code. This works given BPF back end does not - * implement __builtin_trap(). This is useful to assert that certain paths - * of the program code are never used and hence eliminated by the compiler. - * - * For example, consider a switch statement that covers known cases used by - * the program. __bpf_unreachable() can then reside in the default case. If - * the program gets extended such that a case is not covered in the switch - * statement, then it will throw a build error due to the default case not - * being compiled out. - */ -#ifndef __bpf_unreachable -# define __bpf_unreachable() __builtin_trap() -#endif - -/* - * Helper function to perform a tail call with a constant/immediate map slot. - */ -#if __clang_major__ >= 8 && defined(__bpf__) -static __always_inline void -bpf_tail_call_static(void *ctx, const void *map, const __u32 slot) -{ - if (!__builtin_constant_p(slot)) - __bpf_unreachable(); - - /* - * Provide a hard guarantee that LLVM won't optimize setting r2 (map - * pointer) and r3 (constant map index) from _different paths_ ending - * up at the _same_ call insn as otherwise we won't be able to use the - * jmpq/nopl retpoline-free patching by the x86-64 JIT in the kernel - * given they mismatch. See also d2e4c1e6c294 ("bpf: Constant map key - * tracking for prog array pokes") for details on verifier tracking. - * - * Note on clobber list: we need to stay in-line with BPF calling - * convention, so even if we don't end up using r0, r4, r5, we need - * to mark them as clobber so that LLVM doesn't end up using them - * before / after the call. - */ - asm volatile("r1 = %[ctx]\n\t" - "r2 = %[map]\n\t" - "r3 = %[slot]\n\t" - "call 12" - :: [ctx]"r"(ctx), [map]"r"(map), [slot]"i"(slot) - : "r0", "r1", "r2", "r3", "r4", "r5"); -} -#endif - -/* - * Helper structure used by eBPF C program - * to describe BPF map attributes to libbpf loader - */ -struct bpf_map_def { - unsigned int type; - unsigned int key_size; - unsigned int value_size; - unsigned int max_entries; - unsigned int map_flags; -} __attribute__((deprecated("use BTF-defined maps in .maps section"))); - -enum libbpf_pin_type { - LIBBPF_PIN_NONE, - /* PIN_BY_NAME: pin maps by name (in /sys/fs/bpf by default) */ - LIBBPF_PIN_BY_NAME, -}; - -enum libbpf_tristate { - TRI_NO = 0, - TRI_YES = 1, - TRI_MODULE = 2, -}; - -#define __kconfig __attribute__((section(".kconfig"))) -#define __ksym __attribute__((section(".ksyms"))) -#define __kptr __attribute__((btf_type_tag("kptr"))) -#define __kptr_ref __attribute__((btf_type_tag("kptr_ref"))) - -#ifndef ___bpf_concat -#define ___bpf_concat(a, b) a ## b -#endif -#ifndef ___bpf_apply -#define ___bpf_apply(fn, n) ___bpf_concat(fn, n) -#endif -#ifndef ___bpf_nth -#define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N -#endif -#ifndef ___bpf_narg -#define ___bpf_narg(...) \ - ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) -#endif - -#define ___bpf_fill0(arr, p, x) do {} while (0) -#define ___bpf_fill1(arr, p, x) arr[p] = x -#define ___bpf_fill2(arr, p, x, args...) arr[p] = x; ___bpf_fill1(arr, p + 1, args) -#define ___bpf_fill3(arr, p, x, args...) arr[p] = x; ___bpf_fill2(arr, p + 1, args) -#define ___bpf_fill4(arr, p, x, args...) arr[p] = x; ___bpf_fill3(arr, p + 1, args) -#define ___bpf_fill5(arr, p, x, args...) arr[p] = x; ___bpf_fill4(arr, p + 1, args) -#define ___bpf_fill6(arr, p, x, args...) arr[p] = x; ___bpf_fill5(arr, p + 1, args) -#define ___bpf_fill7(arr, p, x, args...) arr[p] = x; ___bpf_fill6(arr, p + 1, args) -#define ___bpf_fill8(arr, p, x, args...) arr[p] = x; ___bpf_fill7(arr, p + 1, args) -#define ___bpf_fill9(arr, p, x, args...) arr[p] = x; ___bpf_fill8(arr, p + 1, args) -#define ___bpf_fill10(arr, p, x, args...) arr[p] = x; ___bpf_fill9(arr, p + 1, args) -#define ___bpf_fill11(arr, p, x, args...) arr[p] = x; ___bpf_fill10(arr, p + 1, args) -#define ___bpf_fill12(arr, p, x, args...) arr[p] = x; ___bpf_fill11(arr, p + 1, args) -#define ___bpf_fill(arr, args...) \ - ___bpf_apply(___bpf_fill, ___bpf_narg(args))(arr, 0, args) - -/* - * BPF_SEQ_PRINTF to wrap bpf_seq_printf to-be-printed values - * in a structure. - */ -#define BPF_SEQ_PRINTF(seq, fmt, args...) \ -({ \ - static const char ___fmt[] = fmt; \ - unsigned long long ___param[___bpf_narg(args)]; \ - \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ - ___bpf_fill(___param, args); \ - _Pragma("GCC diagnostic pop") \ - \ - bpf_seq_printf(seq, ___fmt, sizeof(___fmt), \ - ___param, sizeof(___param)); \ -}) - -/* - * BPF_SNPRINTF wraps the bpf_snprintf helper with variadic arguments instead of - * an array of u64. - */ -#define BPF_SNPRINTF(out, out_size, fmt, args...) \ -({ \ - static const char ___fmt[] = fmt; \ - unsigned long long ___param[___bpf_narg(args)]; \ - \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ - ___bpf_fill(___param, args); \ - _Pragma("GCC diagnostic pop") \ - \ - bpf_snprintf(out, out_size, ___fmt, \ - ___param, sizeof(___param)); \ -}) - -#ifdef BPF_NO_GLOBAL_DATA -#define BPF_PRINTK_FMT_MOD -#else -#define BPF_PRINTK_FMT_MOD static const -#endif - -#define __bpf_printk(fmt, ...) \ -({ \ - BPF_PRINTK_FMT_MOD char ____fmt[] = fmt; \ - bpf_trace_printk(____fmt, sizeof(____fmt), \ - ##__VA_ARGS__); \ -}) - -/* - * __bpf_vprintk wraps the bpf_trace_vprintk helper with variadic arguments - * instead of an array of u64. - */ -#define __bpf_vprintk(fmt, args...) \ -({ \ - static const char ___fmt[] = fmt; \ - unsigned long long ___param[___bpf_narg(args)]; \ - \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ - ___bpf_fill(___param, args); \ - _Pragma("GCC diagnostic pop") \ - \ - bpf_trace_vprintk(___fmt, sizeof(___fmt), \ - ___param, sizeof(___param)); \ -}) - -/* Use __bpf_printk when bpf_printk call has 3 or fewer fmt args - * Otherwise use __bpf_vprintk - */ -#define ___bpf_pick_printk(...) \ - ___bpf_nth(_, ##__VA_ARGS__, __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, \ - __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, __bpf_vprintk, \ - __bpf_vprintk, __bpf_vprintk, __bpf_printk /*3*/, __bpf_printk /*2*/,\ - __bpf_printk /*1*/, __bpf_printk /*0*/) - -/* Helper macro to print out debug messages */ -#define bpf_printk(fmt, args...) ___bpf_pick_printk(args)(fmt, ##args) - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_tracing.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_tracing.h deleted file mode 100644 index 57ecc19..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/bpf_tracing.h +++ /dev/null @@ -1,531 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#ifndef __BPF_TRACING_H__ -#define __BPF_TRACING_H__ - -/* Scan the ARCH passed in from ARCH env variable (see Makefile) */ -#if defined(__TARGET_ARCH_x86) - #define bpf_target_x86 - #define bpf_target_defined -#elif defined(__TARGET_ARCH_s390) - #define bpf_target_s390 - #define bpf_target_defined -#elif defined(__TARGET_ARCH_arm) - #define bpf_target_arm - #define bpf_target_defined -#elif defined(__TARGET_ARCH_arm64) - #define bpf_target_arm64 - #define bpf_target_defined -#elif defined(__TARGET_ARCH_mips) - #define bpf_target_mips - #define bpf_target_defined -#elif defined(__TARGET_ARCH_powerpc) - #define bpf_target_powerpc - #define bpf_target_defined -#elif defined(__TARGET_ARCH_sparc) - #define bpf_target_sparc - #define bpf_target_defined -#elif defined(__TARGET_ARCH_riscv) - #define bpf_target_riscv - #define bpf_target_defined -#elif defined(__TARGET_ARCH_arc) - #define bpf_target_arc - #define bpf_target_defined -#else - -/* Fall back to what the compiler says */ -#if defined(__x86_64__) - #define bpf_target_x86 - #define bpf_target_defined -#elif defined(__s390__) - #define bpf_target_s390 - #define bpf_target_defined -#elif defined(__arm__) - #define bpf_target_arm - #define bpf_target_defined -#elif defined(__aarch64__) - #define bpf_target_arm64 - #define bpf_target_defined -#elif defined(__mips__) - #define bpf_target_mips - #define bpf_target_defined -#elif defined(__powerpc__) - #define bpf_target_powerpc - #define bpf_target_defined -#elif defined(__sparc__) - #define bpf_target_sparc - #define bpf_target_defined -#elif defined(__riscv) && __riscv_xlen == 64 - #define bpf_target_riscv - #define bpf_target_defined -#elif defined(__arc__) - #define bpf_target_arc - #define bpf_target_defined -#endif /* no compiler target */ - -#endif - -#ifndef __BPF_TARGET_MISSING -#define __BPF_TARGET_MISSING "GCC error \"Must specify a BPF target arch via __TARGET_ARCH_xxx\"" -#endif - -#if defined(bpf_target_x86) - -#if defined(__KERNEL__) || defined(__VMLINUX_H__) - -#define __PT_PARM1_REG di -#define __PT_PARM2_REG si -#define __PT_PARM3_REG dx -#define __PT_PARM4_REG cx -#define __PT_PARM5_REG r8 -#define __PT_RET_REG sp -#define __PT_FP_REG bp -#define __PT_RC_REG ax -#define __PT_SP_REG sp -#define __PT_IP_REG ip -/* syscall uses r10 for PARM4 */ -#define PT_REGS_PARM4_SYSCALL(x) ((x)->r10) -#define PT_REGS_PARM4_CORE_SYSCALL(x) BPF_CORE_READ(x, r10) - -#else - -#ifdef __i386__ - -#define __PT_PARM1_REG eax -#define __PT_PARM2_REG edx -#define __PT_PARM3_REG ecx -/* i386 kernel is built with -mregparm=3 */ -#define __PT_PARM4_REG __unsupported__ -#define __PT_PARM5_REG __unsupported__ -#define __PT_RET_REG esp -#define __PT_FP_REG ebp -#define __PT_RC_REG eax -#define __PT_SP_REG esp -#define __PT_IP_REG eip - -#else /* __i386__ */ - -#define __PT_PARM1_REG rdi -#define __PT_PARM2_REG rsi -#define __PT_PARM3_REG rdx -#define __PT_PARM4_REG rcx -#define __PT_PARM5_REG r8 -#define __PT_RET_REG rsp -#define __PT_FP_REG rbp -#define __PT_RC_REG rax -#define __PT_SP_REG rsp -#define __PT_IP_REG rip -/* syscall uses r10 for PARM4 */ -#define PT_REGS_PARM4_SYSCALL(x) ((x)->r10) -#define PT_REGS_PARM4_CORE_SYSCALL(x) BPF_CORE_READ(x, r10) - -#endif /* __i386__ */ - -#endif /* __KERNEL__ || __VMLINUX_H__ */ - -#elif defined(bpf_target_s390) - -struct pt_regs___s390 { - unsigned long orig_gpr2; -}; - -/* s390 provides user_pt_regs instead of struct pt_regs to userspace */ -#define __PT_REGS_CAST(x) ((const user_pt_regs *)(x)) -#define __PT_PARM1_REG gprs[2] -#define __PT_PARM2_REG gprs[3] -#define __PT_PARM3_REG gprs[4] -#define __PT_PARM4_REG gprs[5] -#define __PT_PARM5_REG gprs[6] -#define __PT_RET_REG grps[14] -#define __PT_FP_REG gprs[11] /* Works only with CONFIG_FRAME_POINTER */ -#define __PT_RC_REG gprs[2] -#define __PT_SP_REG gprs[15] -#define __PT_IP_REG psw.addr -#define PT_REGS_PARM1_SYSCALL(x) ({ _Pragma("GCC error \"use PT_REGS_PARM1_CORE_SYSCALL() instead\""); 0l; }) -#define PT_REGS_PARM1_CORE_SYSCALL(x) BPF_CORE_READ((const struct pt_regs___s390 *)(x), orig_gpr2) - -#elif defined(bpf_target_arm) - -#define __PT_PARM1_REG uregs[0] -#define __PT_PARM2_REG uregs[1] -#define __PT_PARM3_REG uregs[2] -#define __PT_PARM4_REG uregs[3] -#define __PT_PARM5_REG uregs[4] -#define __PT_RET_REG uregs[14] -#define __PT_FP_REG uregs[11] /* Works only with CONFIG_FRAME_POINTER */ -#define __PT_RC_REG uregs[0] -#define __PT_SP_REG uregs[13] -#define __PT_IP_REG uregs[12] - -#elif defined(bpf_target_arm64) - -struct pt_regs___arm64 { - unsigned long orig_x0; -}; - -/* arm64 provides struct user_pt_regs instead of struct pt_regs to userspace */ -#define __PT_REGS_CAST(x) ((const struct user_pt_regs *)(x)) -#define __PT_PARM1_REG regs[0] -#define __PT_PARM2_REG regs[1] -#define __PT_PARM3_REG regs[2] -#define __PT_PARM4_REG regs[3] -#define __PT_PARM5_REG regs[4] -#define __PT_RET_REG regs[30] -#define __PT_FP_REG regs[29] /* Works only with CONFIG_FRAME_POINTER */ -#define __PT_RC_REG regs[0] -#define __PT_SP_REG sp -#define __PT_IP_REG pc -#define PT_REGS_PARM1_SYSCALL(x) ({ _Pragma("GCC error \"use PT_REGS_PARM1_CORE_SYSCALL() instead\""); 0l; }) -#define PT_REGS_PARM1_CORE_SYSCALL(x) BPF_CORE_READ((const struct pt_regs___arm64 *)(x), orig_x0) - -#elif defined(bpf_target_mips) - -#define __PT_PARM1_REG regs[4] -#define __PT_PARM2_REG regs[5] -#define __PT_PARM3_REG regs[6] -#define __PT_PARM4_REG regs[7] -#define __PT_PARM5_REG regs[8] -#define __PT_RET_REG regs[31] -#define __PT_FP_REG regs[30] /* Works only with CONFIG_FRAME_POINTER */ -#define __PT_RC_REG regs[2] -#define __PT_SP_REG regs[29] -#define __PT_IP_REG cp0_epc - -#elif defined(bpf_target_powerpc) - -#define __PT_PARM1_REG gpr[3] -#define __PT_PARM2_REG gpr[4] -#define __PT_PARM3_REG gpr[5] -#define __PT_PARM4_REG gpr[6] -#define __PT_PARM5_REG gpr[7] -#define __PT_RET_REG regs[31] -#define __PT_FP_REG __unsupported__ -#define __PT_RC_REG gpr[3] -#define __PT_SP_REG sp -#define __PT_IP_REG nip -/* powerpc does not select ARCH_HAS_SYSCALL_WRAPPER. */ -#define PT_REGS_SYSCALL_REGS(ctx) ctx - -#elif defined(bpf_target_sparc) - -#define __PT_PARM1_REG u_regs[UREG_I0] -#define __PT_PARM2_REG u_regs[UREG_I1] -#define __PT_PARM3_REG u_regs[UREG_I2] -#define __PT_PARM4_REG u_regs[UREG_I3] -#define __PT_PARM5_REG u_regs[UREG_I4] -#define __PT_RET_REG u_regs[UREG_I7] -#define __PT_FP_REG __unsupported__ -#define __PT_RC_REG u_regs[UREG_I0] -#define __PT_SP_REG u_regs[UREG_FP] -/* Should this also be a bpf_target check for the sparc case? */ -#if defined(__arch64__) -#define __PT_IP_REG tpc -#else -#define __PT_IP_REG pc -#endif - -#elif defined(bpf_target_riscv) - -#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) -#define __PT_PARM1_REG a0 -#define __PT_PARM2_REG a1 -#define __PT_PARM3_REG a2 -#define __PT_PARM4_REG a3 -#define __PT_PARM5_REG a4 -#define __PT_RET_REG ra -#define __PT_FP_REG s0 -#define __PT_RC_REG a5 -#define __PT_SP_REG sp -#define __PT_IP_REG pc -/* riscv does not select ARCH_HAS_SYSCALL_WRAPPER. */ -#define PT_REGS_SYSCALL_REGS(ctx) ctx - -#elif defined(bpf_target_arc) - -/* arc provides struct user_pt_regs instead of struct pt_regs to userspace */ -#define __PT_REGS_CAST(x) ((const struct user_regs_struct *)(x)) -#define __PT_PARM1_REG scratch.r0 -#define __PT_PARM2_REG scratch.r1 -#define __PT_PARM3_REG scratch.r2 -#define __PT_PARM4_REG scratch.r3 -#define __PT_PARM5_REG scratch.r4 -#define __PT_RET_REG scratch.blink -#define __PT_FP_REG __unsupported__ -#define __PT_RC_REG scratch.r0 -#define __PT_SP_REG scratch.sp -#define __PT_IP_REG scratch.ret -/* arc does not select ARCH_HAS_SYSCALL_WRAPPER. */ -#define PT_REGS_SYSCALL_REGS(ctx) ctx - -#endif - -#if defined(bpf_target_defined) - -struct pt_regs; - -/* allow some architecutres to override `struct pt_regs` */ -#ifndef __PT_REGS_CAST -#define __PT_REGS_CAST(x) (x) -#endif - -#define PT_REGS_PARM1(x) (__PT_REGS_CAST(x)->__PT_PARM1_REG) -#define PT_REGS_PARM2(x) (__PT_REGS_CAST(x)->__PT_PARM2_REG) -#define PT_REGS_PARM3(x) (__PT_REGS_CAST(x)->__PT_PARM3_REG) -#define PT_REGS_PARM4(x) (__PT_REGS_CAST(x)->__PT_PARM4_REG) -#define PT_REGS_PARM5(x) (__PT_REGS_CAST(x)->__PT_PARM5_REG) -#define PT_REGS_RET(x) (__PT_REGS_CAST(x)->__PT_RET_REG) -#define PT_REGS_FP(x) (__PT_REGS_CAST(x)->__PT_FP_REG) -#define PT_REGS_RC(x) (__PT_REGS_CAST(x)->__PT_RC_REG) -#define PT_REGS_SP(x) (__PT_REGS_CAST(x)->__PT_SP_REG) -#define PT_REGS_IP(x) (__PT_REGS_CAST(x)->__PT_IP_REG) - -#define PT_REGS_PARM1_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM1_REG) -#define PT_REGS_PARM2_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM2_REG) -#define PT_REGS_PARM3_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM3_REG) -#define PT_REGS_PARM4_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM4_REG) -#define PT_REGS_PARM5_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_PARM5_REG) -#define PT_REGS_RET_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RET_REG) -#define PT_REGS_FP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_FP_REG) -#define PT_REGS_RC_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_RC_REG) -#define PT_REGS_SP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_SP_REG) -#define PT_REGS_IP_CORE(x) BPF_CORE_READ(__PT_REGS_CAST(x), __PT_IP_REG) - -#if defined(bpf_target_powerpc) - -#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = (ctx)->link; }) -#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP - -#elif defined(bpf_target_sparc) - -#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ (ip) = PT_REGS_RET(ctx); }) -#define BPF_KRETPROBE_READ_RET_IP BPF_KPROBE_READ_RET_IP - -#else - -#define BPF_KPROBE_READ_RET_IP(ip, ctx) \ - ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)PT_REGS_RET(ctx)); }) -#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) \ - ({ bpf_probe_read_kernel(&(ip), sizeof(ip), (void *)(PT_REGS_FP(ctx) + sizeof(ip))); }) - -#endif - -#ifndef PT_REGS_PARM1_SYSCALL -#define PT_REGS_PARM1_SYSCALL(x) PT_REGS_PARM1(x) -#endif -#define PT_REGS_PARM2_SYSCALL(x) PT_REGS_PARM2(x) -#define PT_REGS_PARM3_SYSCALL(x) PT_REGS_PARM3(x) -#ifndef PT_REGS_PARM4_SYSCALL -#define PT_REGS_PARM4_SYSCALL(x) PT_REGS_PARM4(x) -#endif -#define PT_REGS_PARM5_SYSCALL(x) PT_REGS_PARM5(x) - -#ifndef PT_REGS_PARM1_CORE_SYSCALL -#define PT_REGS_PARM1_CORE_SYSCALL(x) PT_REGS_PARM1_CORE(x) -#endif -#define PT_REGS_PARM2_CORE_SYSCALL(x) PT_REGS_PARM2_CORE(x) -#define PT_REGS_PARM3_CORE_SYSCALL(x) PT_REGS_PARM3_CORE(x) -#ifndef PT_REGS_PARM4_CORE_SYSCALL -#define PT_REGS_PARM4_CORE_SYSCALL(x) PT_REGS_PARM4_CORE(x) -#endif -#define PT_REGS_PARM5_CORE_SYSCALL(x) PT_REGS_PARM5_CORE(x) - -#else /* defined(bpf_target_defined) */ - -#define PT_REGS_PARM1(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM2(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM3(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM4(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM5(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_RET(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_FP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_RC(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_SP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_IP(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) - -#define PT_REGS_PARM1_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM2_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM3_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM4_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM5_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_RET_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_FP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_RC_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_SP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_IP_CORE(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) - -#define BPF_KPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define BPF_KRETPROBE_READ_RET_IP(ip, ctx) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) - -#define PT_REGS_PARM1_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM2_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM3_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM4_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM5_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) - -#define PT_REGS_PARM1_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM2_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM3_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM4_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) -#define PT_REGS_PARM5_CORE_SYSCALL(x) ({ _Pragma(__BPF_TARGET_MISSING); 0l; }) - -#endif /* defined(bpf_target_defined) */ - -/* - * When invoked from a syscall handler kprobe, returns a pointer to a - * struct pt_regs containing syscall arguments and suitable for passing to - * PT_REGS_PARMn_SYSCALL() and PT_REGS_PARMn_CORE_SYSCALL(). - */ -#ifndef PT_REGS_SYSCALL_REGS -/* By default, assume that the arch selects ARCH_HAS_SYSCALL_WRAPPER. */ -#define PT_REGS_SYSCALL_REGS(ctx) ((struct pt_regs *)PT_REGS_PARM1(ctx)) -#endif - -#ifndef ___bpf_concat -#define ___bpf_concat(a, b) a ## b -#endif -#ifndef ___bpf_apply -#define ___bpf_apply(fn, n) ___bpf_concat(fn, n) -#endif -#ifndef ___bpf_nth -#define ___bpf_nth(_, _1, _2, _3, _4, _5, _6, _7, _8, _9, _a, _b, _c, N, ...) N -#endif -#ifndef ___bpf_narg -#define ___bpf_narg(...) ___bpf_nth(_, ##__VA_ARGS__, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0) -#endif - -#define ___bpf_ctx_cast0() ctx -#define ___bpf_ctx_cast1(x) ___bpf_ctx_cast0(), (void *)ctx[0] -#define ___bpf_ctx_cast2(x, args...) ___bpf_ctx_cast1(args), (void *)ctx[1] -#define ___bpf_ctx_cast3(x, args...) ___bpf_ctx_cast2(args), (void *)ctx[2] -#define ___bpf_ctx_cast4(x, args...) ___bpf_ctx_cast3(args), (void *)ctx[3] -#define ___bpf_ctx_cast5(x, args...) ___bpf_ctx_cast4(args), (void *)ctx[4] -#define ___bpf_ctx_cast6(x, args...) ___bpf_ctx_cast5(args), (void *)ctx[5] -#define ___bpf_ctx_cast7(x, args...) ___bpf_ctx_cast6(args), (void *)ctx[6] -#define ___bpf_ctx_cast8(x, args...) ___bpf_ctx_cast7(args), (void *)ctx[7] -#define ___bpf_ctx_cast9(x, args...) ___bpf_ctx_cast8(args), (void *)ctx[8] -#define ___bpf_ctx_cast10(x, args...) ___bpf_ctx_cast9(args), (void *)ctx[9] -#define ___bpf_ctx_cast11(x, args...) ___bpf_ctx_cast10(args), (void *)ctx[10] -#define ___bpf_ctx_cast12(x, args...) ___bpf_ctx_cast11(args), (void *)ctx[11] -#define ___bpf_ctx_cast(args...) ___bpf_apply(___bpf_ctx_cast, ___bpf_narg(args))(args) - -/* - * BPF_PROG is a convenience wrapper for generic tp_btf/fentry/fexit and - * similar kinds of BPF programs, that accept input arguments as a single - * pointer to untyped u64 array, where each u64 can actually be a typed - * pointer or integer of different size. Instead of requring user to write - * manual casts and work with array elements by index, BPF_PROG macro - * allows user to declare a list of named and typed input arguments in the - * same syntax as for normal C function. All the casting is hidden and - * performed transparently, while user code can just assume working with - * function arguments of specified type and name. - * - * Original raw context argument is preserved as well as 'ctx' argument. - * This is useful when using BPF helpers that expect original context - * as one of the parameters (e.g., for bpf_perf_event_output()). - */ -#define BPF_PROG(name, args...) \ -name(unsigned long long *ctx); \ -static __attribute__((always_inline)) typeof(name(0)) \ -____##name(unsigned long long *ctx, ##args); \ -typeof(name(0)) name(unsigned long long *ctx) \ -{ \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ - return ____##name(___bpf_ctx_cast(args)); \ - _Pragma("GCC diagnostic pop") \ -} \ -static __attribute__((always_inline)) typeof(name(0)) \ -____##name(unsigned long long *ctx, ##args) - -struct pt_regs; - -#define ___bpf_kprobe_args0() ctx -#define ___bpf_kprobe_args1(x) ___bpf_kprobe_args0(), (void *)PT_REGS_PARM1(ctx) -#define ___bpf_kprobe_args2(x, args...) ___bpf_kprobe_args1(args), (void *)PT_REGS_PARM2(ctx) -#define ___bpf_kprobe_args3(x, args...) ___bpf_kprobe_args2(args), (void *)PT_REGS_PARM3(ctx) -#define ___bpf_kprobe_args4(x, args...) ___bpf_kprobe_args3(args), (void *)PT_REGS_PARM4(ctx) -#define ___bpf_kprobe_args5(x, args...) ___bpf_kprobe_args4(args), (void *)PT_REGS_PARM5(ctx) -#define ___bpf_kprobe_args(args...) ___bpf_apply(___bpf_kprobe_args, ___bpf_narg(args))(args) - -/* - * BPF_KPROBE serves the same purpose for kprobes as BPF_PROG for - * tp_btf/fentry/fexit BPF programs. It hides the underlying platform-specific - * low-level way of getting kprobe input arguments from struct pt_regs, and - * provides a familiar typed and named function arguments syntax and - * semantics of accessing kprobe input paremeters. - * - * Original struct pt_regs* context is preserved as 'ctx' argument. This might - * be necessary when using BPF helpers like bpf_perf_event_output(). - */ -#define BPF_KPROBE(name, args...) \ -name(struct pt_regs *ctx); \ -static __attribute__((always_inline)) typeof(name(0)) \ -____##name(struct pt_regs *ctx, ##args); \ -typeof(name(0)) name(struct pt_regs *ctx) \ -{ \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ - return ____##name(___bpf_kprobe_args(args)); \ - _Pragma("GCC diagnostic pop") \ -} \ -static __attribute__((always_inline)) typeof(name(0)) \ -____##name(struct pt_regs *ctx, ##args) - -#define ___bpf_kretprobe_args0() ctx -#define ___bpf_kretprobe_args1(x) ___bpf_kretprobe_args0(), (void *)PT_REGS_RC(ctx) -#define ___bpf_kretprobe_args(args...) ___bpf_apply(___bpf_kretprobe_args, ___bpf_narg(args))(args) - -/* - * BPF_KRETPROBE is similar to BPF_KPROBE, except, it only provides optional - * return value (in addition to `struct pt_regs *ctx`), but no input - * arguments, because they will be clobbered by the time probed function - * returns. - */ -#define BPF_KRETPROBE(name, args...) \ -name(struct pt_regs *ctx); \ -static __attribute__((always_inline)) typeof(name(0)) \ -____##name(struct pt_regs *ctx, ##args); \ -typeof(name(0)) name(struct pt_regs *ctx) \ -{ \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ - return ____##name(___bpf_kretprobe_args(args)); \ - _Pragma("GCC diagnostic pop") \ -} \ -static __always_inline typeof(name(0)) ____##name(struct pt_regs *ctx, ##args) - -#define ___bpf_syscall_args0() ctx -#define ___bpf_syscall_args1(x) ___bpf_syscall_args0(), (void *)PT_REGS_PARM1_CORE_SYSCALL(regs) -#define ___bpf_syscall_args2(x, args...) ___bpf_syscall_args1(args), (void *)PT_REGS_PARM2_CORE_SYSCALL(regs) -#define ___bpf_syscall_args3(x, args...) ___bpf_syscall_args2(args), (void *)PT_REGS_PARM3_CORE_SYSCALL(regs) -#define ___bpf_syscall_args4(x, args...) ___bpf_syscall_args3(args), (void *)PT_REGS_PARM4_CORE_SYSCALL(regs) -#define ___bpf_syscall_args5(x, args...) ___bpf_syscall_args4(args), (void *)PT_REGS_PARM5_CORE_SYSCALL(regs) -#define ___bpf_syscall_args(args...) ___bpf_apply(___bpf_syscall_args, ___bpf_narg(args))(args) - -/* - * BPF_KPROBE_SYSCALL is a variant of BPF_KPROBE, which is intended for - * tracing syscall functions, like __x64_sys_close. It hides the underlying - * platform-specific low-level way of getting syscall input arguments from - * struct pt_regs, and provides a familiar typed and named function arguments - * syntax and semantics of accessing syscall input parameters. - * - * Original struct pt_regs* context is preserved as 'ctx' argument. This might - * be necessary when using BPF helpers like bpf_perf_event_output(). - * - * This macro relies on BPF CO-RE support. - */ -#define BPF_KPROBE_SYSCALL(name, args...) \ -name(struct pt_regs *ctx); \ -static __attribute__((always_inline)) typeof(name(0)) \ -____##name(struct pt_regs *ctx, ##args); \ -typeof(name(0)) name(struct pt_regs *ctx) \ -{ \ - struct pt_regs *regs = PT_REGS_SYSCALL_REGS(ctx); \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ - return ____##name(___bpf_syscall_args(args)); \ - _Pragma("GCC diagnostic pop") \ -} \ -static __attribute__((always_inline)) typeof(name(0)) \ -____##name(struct pt_regs *ctx, ##args) - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/btf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/btf.h deleted file mode 100644 index e516eac..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/btf.h +++ /dev/null @@ -1,555 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -/* Copyright (c) 2018 Facebook */ -/*! \file */ - -#ifndef __LIBBPF_BTF_H -#define __LIBBPF_BTF_H - -#include -#include -#ifdef __linux__ -#include -#endif -#include - -#include "libbpf_common.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define BTF_ELF_SEC ".BTF" -#define BTF_EXT_ELF_SEC ".BTF.ext" -#define MAPS_ELF_SEC ".maps" - -struct btf; -struct btf_ext; -struct btf_type; - -struct bpf_object; - -enum btf_endianness { - BTF_LITTLE_ENDIAN = 0, - BTF_BIG_ENDIAN = 1, -}; - -/** - * @brief **btf__free()** frees all data of a BTF object - * @param btf BTF object to free - */ -LIBBPF_API void btf__free(struct btf *btf); - -/** - * @brief **btf__new()** creates a new instance of a BTF object from the raw - * bytes of an ELF's BTF section - * @param data raw bytes - * @param size number of bytes passed in `data` - * @return new BTF object instance which has to be eventually freed with - * **btf__free()** - * - * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract - * error code from such a pointer `libbpf_get_error()` should be used. If - * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is - * returned on error instead. In both cases thread-local `errno` variable is - * always set to error code as well. - */ -LIBBPF_API struct btf *btf__new(const void *data, __u32 size); - -/** - * @brief **btf__new_split()** create a new instance of a BTF object from the - * provided raw data bytes. It takes another BTF instance, **base_btf**, which - * serves as a base BTF, which is extended by types in a newly created BTF - * instance - * @param data raw bytes - * @param size length of raw bytes - * @param base_btf the base BTF object - * @return new BTF object instance which has to be eventually freed with - * **btf__free()** - * - * If *base_btf* is NULL, `btf__new_split()` is equivalent to `btf__new()` and - * creates non-split BTF. - * - * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract - * error code from such a pointer `libbpf_get_error()` should be used. If - * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is - * returned on error instead. In both cases thread-local `errno` variable is - * always set to error code as well. - */ -LIBBPF_API struct btf *btf__new_split(const void *data, __u32 size, struct btf *base_btf); - -/** - * @brief **btf__new_empty()** creates an empty BTF object. Use - * `btf__add_*()` to populate such BTF object. - * @return new BTF object instance which has to be eventually freed with - * **btf__free()** - * - * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract - * error code from such a pointer `libbpf_get_error()` should be used. If - * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is - * returned on error instead. In both cases thread-local `errno` variable is - * always set to error code as well. - */ -LIBBPF_API struct btf *btf__new_empty(void); - -/** - * @brief **btf__new_empty_split()** creates an unpopulated BTF object from an - * ELF BTF section except with a base BTF on top of which split BTF should be - * based - * @return new BTF object instance which has to be eventually freed with - * **btf__free()** - * - * If *base_btf* is NULL, `btf__new_empty_split()` is equivalent to - * `btf__new_empty()` and creates non-split BTF. - * - * On error, error-code-encoded-as-pointer is returned, not a NULL. To extract - * error code from such a pointer `libbpf_get_error()` should be used. If - * `libbpf_set_strict_mode(LIBBPF_STRICT_CLEAN_PTRS)` is enabled, NULL is - * returned on error instead. In both cases thread-local `errno` variable is - * always set to error code as well. - */ -LIBBPF_API struct btf *btf__new_empty_split(struct btf *base_btf); - -LIBBPF_API struct btf *btf__parse(const char *path, struct btf_ext **btf_ext); -LIBBPF_API struct btf *btf__parse_split(const char *path, struct btf *base_btf); -LIBBPF_API struct btf *btf__parse_elf(const char *path, struct btf_ext **btf_ext); -LIBBPF_API struct btf *btf__parse_elf_split(const char *path, struct btf *base_btf); -LIBBPF_API struct btf *btf__parse_raw(const char *path); -LIBBPF_API struct btf *btf__parse_raw_split(const char *path, struct btf *base_btf); - -LIBBPF_API struct btf *btf__load_vmlinux_btf(void); -LIBBPF_API struct btf *btf__load_module_btf(const char *module_name, struct btf *vmlinux_btf); -LIBBPF_API struct btf *libbpf_find_kernel_btf(void); - -LIBBPF_API struct btf *btf__load_from_kernel_by_id(__u32 id); -LIBBPF_API struct btf *btf__load_from_kernel_by_id_split(__u32 id, struct btf *base_btf); - -LIBBPF_API int btf__load_into_kernel(struct btf *btf); -LIBBPF_API __s32 btf__find_by_name(const struct btf *btf, - const char *type_name); -LIBBPF_API __s32 btf__find_by_name_kind(const struct btf *btf, - const char *type_name, __u32 kind); -LIBBPF_API __u32 btf__type_cnt(const struct btf *btf); -LIBBPF_API const struct btf *btf__base_btf(const struct btf *btf); -LIBBPF_API const struct btf_type *btf__type_by_id(const struct btf *btf, - __u32 id); -LIBBPF_API size_t btf__pointer_size(const struct btf *btf); -LIBBPF_API int btf__set_pointer_size(struct btf *btf, size_t ptr_sz); -LIBBPF_API enum btf_endianness btf__endianness(const struct btf *btf); -LIBBPF_API int btf__set_endianness(struct btf *btf, enum btf_endianness endian); -LIBBPF_API __s64 btf__resolve_size(const struct btf *btf, __u32 type_id); -LIBBPF_API int btf__resolve_type(const struct btf *btf, __u32 type_id); -LIBBPF_API int btf__align_of(const struct btf *btf, __u32 id); -LIBBPF_API int btf__fd(const struct btf *btf); -LIBBPF_API void btf__set_fd(struct btf *btf, int fd); -LIBBPF_API const void *btf__raw_data(const struct btf *btf, __u32 *size); -LIBBPF_API const char *btf__name_by_offset(const struct btf *btf, __u32 offset); -LIBBPF_API const char *btf__str_by_offset(const struct btf *btf, __u32 offset); - -LIBBPF_API struct btf_ext *btf_ext__new(const __u8 *data, __u32 size); -LIBBPF_API void btf_ext__free(struct btf_ext *btf_ext); -LIBBPF_API const void *btf_ext__raw_data(const struct btf_ext *btf_ext, __u32 *size); - -LIBBPF_API int btf__find_str(struct btf *btf, const char *s); -LIBBPF_API int btf__add_str(struct btf *btf, const char *s); -LIBBPF_API int btf__add_type(struct btf *btf, const struct btf *src_btf, - const struct btf_type *src_type); -/** - * @brief **btf__add_btf()** appends all the BTF types from *src_btf* into *btf* - * @param btf BTF object which all the BTF types and strings are added to - * @param src_btf BTF object which all BTF types and referenced strings are copied from - * @return BTF type ID of the first appended BTF type, or negative error code - * - * **btf__add_btf()** can be used to simply and efficiently append the entire - * contents of one BTF object to another one. All the BTF type data is copied - * over, all referenced type IDs are adjusted by adding a necessary ID offset. - * Only strings referenced from BTF types are copied over and deduplicated, so - * if there were some unused strings in *src_btf*, those won't be copied over, - * which is consistent with the general string deduplication semantics of BTF - * writing APIs. - * - * If any error is encountered during this process, the contents of *btf* is - * left intact, which means that **btf__add_btf()** follows the transactional - * semantics and the operation as a whole is all-or-nothing. - * - * *src_btf* has to be non-split BTF, as of now copying types from split BTF - * is not supported and will result in -ENOTSUP error code returned. - */ -LIBBPF_API int btf__add_btf(struct btf *btf, const struct btf *src_btf); - -LIBBPF_API int btf__add_int(struct btf *btf, const char *name, size_t byte_sz, int encoding); -LIBBPF_API int btf__add_float(struct btf *btf, const char *name, size_t byte_sz); -LIBBPF_API int btf__add_ptr(struct btf *btf, int ref_type_id); -LIBBPF_API int btf__add_array(struct btf *btf, - int index_type_id, int elem_type_id, __u32 nr_elems); -/* struct/union construction APIs */ -LIBBPF_API int btf__add_struct(struct btf *btf, const char *name, __u32 sz); -LIBBPF_API int btf__add_union(struct btf *btf, const char *name, __u32 sz); -LIBBPF_API int btf__add_field(struct btf *btf, const char *name, int field_type_id, - __u32 bit_offset, __u32 bit_size); - -/* enum construction APIs */ -LIBBPF_API int btf__add_enum(struct btf *btf, const char *name, __u32 bytes_sz); -LIBBPF_API int btf__add_enum_value(struct btf *btf, const char *name, __s64 value); -LIBBPF_API int btf__add_enum64(struct btf *btf, const char *name, __u32 bytes_sz, bool is_signed); -LIBBPF_API int btf__add_enum64_value(struct btf *btf, const char *name, __u64 value); - -enum btf_fwd_kind { - BTF_FWD_STRUCT = 0, - BTF_FWD_UNION = 1, - BTF_FWD_ENUM = 2, -}; - -LIBBPF_API int btf__add_fwd(struct btf *btf, const char *name, enum btf_fwd_kind fwd_kind); -LIBBPF_API int btf__add_typedef(struct btf *btf, const char *name, int ref_type_id); -LIBBPF_API int btf__add_volatile(struct btf *btf, int ref_type_id); -LIBBPF_API int btf__add_const(struct btf *btf, int ref_type_id); -LIBBPF_API int btf__add_restrict(struct btf *btf, int ref_type_id); -LIBBPF_API int btf__add_type_tag(struct btf *btf, const char *value, int ref_type_id); - -/* func and func_proto construction APIs */ -LIBBPF_API int btf__add_func(struct btf *btf, const char *name, - enum btf_func_linkage linkage, int proto_type_id); -LIBBPF_API int btf__add_func_proto(struct btf *btf, int ret_type_id); -LIBBPF_API int btf__add_func_param(struct btf *btf, const char *name, int type_id); - -/* var & datasec construction APIs */ -LIBBPF_API int btf__add_var(struct btf *btf, const char *name, int linkage, int type_id); -LIBBPF_API int btf__add_datasec(struct btf *btf, const char *name, __u32 byte_sz); -LIBBPF_API int btf__add_datasec_var_info(struct btf *btf, int var_type_id, - __u32 offset, __u32 byte_sz); - -/* tag construction API */ -LIBBPF_API int btf__add_decl_tag(struct btf *btf, const char *value, int ref_type_id, - int component_idx); - -struct btf_dedup_opts { - size_t sz; - /* optional .BTF.ext info to dedup along the main BTF info */ - struct btf_ext *btf_ext; - /* force hash collisions (used for testing) */ - bool force_collisions; - size_t :0; -}; -#define btf_dedup_opts__last_field force_collisions - -LIBBPF_API int btf__dedup(struct btf *btf, const struct btf_dedup_opts *opts); - -struct btf_dump; - -struct btf_dump_opts { - size_t sz; -}; -#define btf_dump_opts__last_field sz - -typedef void (*btf_dump_printf_fn_t)(void *ctx, const char *fmt, va_list args); - -LIBBPF_API struct btf_dump *btf_dump__new(const struct btf *btf, - btf_dump_printf_fn_t printf_fn, - void *ctx, - const struct btf_dump_opts *opts); - -LIBBPF_API void btf_dump__free(struct btf_dump *d); - -LIBBPF_API int btf_dump__dump_type(struct btf_dump *d, __u32 id); - -struct btf_dump_emit_type_decl_opts { - /* size of this struct, for forward/backward compatiblity */ - size_t sz; - /* optional field name for type declaration, e.g.: - * - struct my_struct - * - void (*)(int) - * - char (*)[123] - */ - const char *field_name; - /* extra indentation level (in number of tabs) to emit for multi-line - * type declarations (e.g., anonymous struct); applies for lines - * starting from the second one (first line is assumed to have - * necessary indentation already - */ - int indent_level; - /* strip all the const/volatile/restrict mods */ - bool strip_mods; - size_t :0; -}; -#define btf_dump_emit_type_decl_opts__last_field strip_mods - -LIBBPF_API int -btf_dump__emit_type_decl(struct btf_dump *d, __u32 id, - const struct btf_dump_emit_type_decl_opts *opts); - - -struct btf_dump_type_data_opts { - /* size of this struct, for forward/backward compatibility */ - size_t sz; - const char *indent_str; - int indent_level; - /* below match "show" flags for bpf_show_snprintf() */ - bool compact; /* no newlines/indentation */ - bool skip_names; /* skip member/type names */ - bool emit_zeroes; /* show 0-valued fields */ - size_t :0; -}; -#define btf_dump_type_data_opts__last_field emit_zeroes - -LIBBPF_API int -btf_dump__dump_type_data(struct btf_dump *d, __u32 id, - const void *data, size_t data_sz, - const struct btf_dump_type_data_opts *opts); - -/* - * A set of helpers for easier BTF types handling. - * - * The inline functions below rely on constants from the kernel headers which - * may not be available for applications including this header file. To avoid - * compilation errors, we define all the constants here that were added after - * the initial introduction of the BTF_KIND* constants. - */ -#ifndef BTF_KIND_FUNC -#define BTF_KIND_FUNC 12 /* Function */ -#define BTF_KIND_FUNC_PROTO 13 /* Function Proto */ -#endif -#ifndef BTF_KIND_VAR -#define BTF_KIND_VAR 14 /* Variable */ -#define BTF_KIND_DATASEC 15 /* Section */ -#endif -#ifndef BTF_KIND_FLOAT -#define BTF_KIND_FLOAT 16 /* Floating point */ -#endif -/* The kernel header switched to enums, so the following were never #defined */ -#define BTF_KIND_DECL_TAG 17 /* Decl Tag */ -#define BTF_KIND_TYPE_TAG 18 /* Type Tag */ -#define BTF_KIND_ENUM64 19 /* Enum for up-to 64bit values */ - -static inline __u16 btf_kind(const struct btf_type *t) -{ - return BTF_INFO_KIND(t->info); -} - -static inline __u16 btf_vlen(const struct btf_type *t) -{ - return BTF_INFO_VLEN(t->info); -} - -static inline bool btf_kflag(const struct btf_type *t) -{ - return BTF_INFO_KFLAG(t->info); -} - -static inline bool btf_is_void(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_UNKN; -} - -static inline bool btf_is_int(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_INT; -} - -static inline bool btf_is_ptr(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_PTR; -} - -static inline bool btf_is_array(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_ARRAY; -} - -static inline bool btf_is_struct(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_STRUCT; -} - -static inline bool btf_is_union(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_UNION; -} - -static inline bool btf_is_composite(const struct btf_type *t) -{ - __u16 kind = btf_kind(t); - - return kind == BTF_KIND_STRUCT || kind == BTF_KIND_UNION; -} - -static inline bool btf_is_enum(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_ENUM; -} - -static inline bool btf_is_enum64(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_ENUM64; -} - -static inline bool btf_is_fwd(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_FWD; -} - -static inline bool btf_is_typedef(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_TYPEDEF; -} - -static inline bool btf_is_volatile(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_VOLATILE; -} - -static inline bool btf_is_const(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_CONST; -} - -static inline bool btf_is_restrict(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_RESTRICT; -} - -static inline bool btf_is_mod(const struct btf_type *t) -{ - __u16 kind = btf_kind(t); - - return kind == BTF_KIND_VOLATILE || - kind == BTF_KIND_CONST || - kind == BTF_KIND_RESTRICT || - kind == BTF_KIND_TYPE_TAG; -} - -static inline bool btf_is_func(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_FUNC; -} - -static inline bool btf_is_func_proto(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_FUNC_PROTO; -} - -static inline bool btf_is_var(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_VAR; -} - -static inline bool btf_is_datasec(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_DATASEC; -} - -static inline bool btf_is_float(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_FLOAT; -} - -static inline bool btf_is_decl_tag(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_DECL_TAG; -} - -static inline bool btf_is_type_tag(const struct btf_type *t) -{ - return btf_kind(t) == BTF_KIND_TYPE_TAG; -} - -static inline bool btf_is_any_enum(const struct btf_type *t) -{ - return btf_is_enum(t) || btf_is_enum64(t); -} - -static inline bool btf_kind_core_compat(const struct btf_type *t1, - const struct btf_type *t2) -{ - return btf_kind(t1) == btf_kind(t2) || - (btf_is_any_enum(t1) && btf_is_any_enum(t2)); -} - -static inline __u8 btf_int_encoding(const struct btf_type *t) -{ - return BTF_INT_ENCODING(*(__u32 *)(t + 1)); -} - -static inline __u8 btf_int_offset(const struct btf_type *t) -{ - return BTF_INT_OFFSET(*(__u32 *)(t + 1)); -} - -static inline __u8 btf_int_bits(const struct btf_type *t) -{ - return BTF_INT_BITS(*(__u32 *)(t + 1)); -} - -static inline struct btf_array *btf_array(const struct btf_type *t) -{ - return (struct btf_array *)(t + 1); -} - -static inline struct btf_enum *btf_enum(const struct btf_type *t) -{ - return (struct btf_enum *)(t + 1); -} - -static inline struct btf_enum64 *btf_enum64(const struct btf_type *t) -{ - return (struct btf_enum64 *)(t + 1); -} - -static inline __u64 btf_enum64_value(const struct btf_enum64 *e) -{ - return ((__u64)e->val_hi32 << 32) | e->val_lo32; -} - -static inline struct btf_member *btf_members(const struct btf_type *t) -{ - return (struct btf_member *)(t + 1); -} - -/* Get bit offset of a member with specified index. */ -static inline __u32 btf_member_bit_offset(const struct btf_type *t, - __u32 member_idx) -{ - const struct btf_member *m = btf_members(t) + member_idx; - bool kflag = btf_kflag(t); - - return kflag ? BTF_MEMBER_BIT_OFFSET(m->offset) : m->offset; -} -/* - * Get bitfield size of a member, assuming t is BTF_KIND_STRUCT or - * BTF_KIND_UNION. If member is not a bitfield, zero is returned. - */ -static inline __u32 btf_member_bitfield_size(const struct btf_type *t, - __u32 member_idx) -{ - const struct btf_member *m = btf_members(t) + member_idx; - bool kflag = btf_kflag(t); - - return kflag ? BTF_MEMBER_BITFIELD_SIZE(m->offset) : 0; -} - -static inline struct btf_param *btf_params(const struct btf_type *t) -{ - return (struct btf_param *)(t + 1); -} - -static inline struct btf_var *btf_var(const struct btf_type *t) -{ - return (struct btf_var *)(t + 1); -} - -static inline struct btf_var_secinfo * -btf_var_secinfos(const struct btf_type *t) -{ - return (struct btf_var_secinfo *)(t + 1); -} - -struct btf_decl_tag; -static inline struct btf_decl_tag *btf_decl_tag(const struct btf_type *t) -{ - return (struct btf_decl_tag *)(t + 1); -} - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* __LIBBPF_BTF_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/hashmap.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/hashmap.h deleted file mode 100644 index 2fbf5dd..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/hashmap.h +++ /dev/null @@ -1,204 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -/* - * Generic non-thread safe hash map implementation. - * - * Copyright (c) 2019 Facebook - */ -#ifndef __LIBBPF_HASHMAP_H -#define __LIBBPF_HASHMAP_H - -#include -#include -#include - -static inline size_t hash_bits(size_t h, int bits) -{ - /* shuffle bits and return requested number of upper bits */ - if (bits == 0) - return 0; - -#if (__SIZEOF_SIZE_T__ == __SIZEOF_LONG_LONG__) - /* LP64 case */ - return (h * 11400714819323198485llu) >> (__SIZEOF_LONG_LONG__ * 8 - bits); -#elif (__SIZEOF_SIZE_T__ <= __SIZEOF_LONG__) - return (h * 2654435769lu) >> (__SIZEOF_LONG__ * 8 - bits); -#else -# error "Unsupported size_t size" -#endif -} - -/* generic C-string hashing function */ -static inline size_t str_hash(const char *s) -{ - size_t h = 0; - - while (*s) { - h = h * 31 + *s; - s++; - } - return h; -} - -typedef size_t (*hashmap_hash_fn)(const void *key, void *ctx); -typedef bool (*hashmap_equal_fn)(const void *key1, const void *key2, void *ctx); - -struct hashmap_entry { - const void *key; - void *value; - struct hashmap_entry *next; -}; - -struct hashmap { - hashmap_hash_fn hash_fn; - hashmap_equal_fn equal_fn; - void *ctx; - - struct hashmap_entry **buckets; - size_t cap; - size_t cap_bits; - size_t sz; -}; - -#define HASHMAP_INIT(hash_fn, equal_fn, ctx) { \ - .hash_fn = (hash_fn), \ - .equal_fn = (equal_fn), \ - .ctx = (ctx), \ - .buckets = NULL, \ - .cap = 0, \ - .cap_bits = 0, \ - .sz = 0, \ -} - -void hashmap__init(struct hashmap *map, hashmap_hash_fn hash_fn, - hashmap_equal_fn equal_fn, void *ctx); -struct hashmap *hashmap__new(hashmap_hash_fn hash_fn, - hashmap_equal_fn equal_fn, - void *ctx); -void hashmap__clear(struct hashmap *map); -void hashmap__free(struct hashmap *map); - -size_t hashmap__size(const struct hashmap *map); -size_t hashmap__capacity(const struct hashmap *map); - -/* - * Hashmap insertion strategy: - * - HASHMAP_ADD - only add key/value if key doesn't exist yet; - * - HASHMAP_SET - add key/value pair if key doesn't exist yet; otherwise, - * update value; - * - HASHMAP_UPDATE - update value, if key already exists; otherwise, do - * nothing and return -ENOENT; - * - HASHMAP_APPEND - always add key/value pair, even if key already exists. - * This turns hashmap into a multimap by allowing multiple values to be - * associated with the same key. Most useful read API for such hashmap is - * hashmap__for_each_key_entry() iteration. If hashmap__find() is still - * used, it will return last inserted key/value entry (first in a bucket - * chain). - */ -enum hashmap_insert_strategy { - HASHMAP_ADD, - HASHMAP_SET, - HASHMAP_UPDATE, - HASHMAP_APPEND, -}; - -/* - * hashmap__insert() adds key/value entry w/ various semantics, depending on - * provided strategy value. If a given key/value pair replaced already - * existing key/value pair, both old key and old value will be returned - * through old_key and old_value to allow calling code do proper memory - * management. - */ -int hashmap__insert(struct hashmap *map, const void *key, void *value, - enum hashmap_insert_strategy strategy, - const void **old_key, void **old_value); - -static inline int hashmap__add(struct hashmap *map, - const void *key, void *value) -{ - return hashmap__insert(map, key, value, HASHMAP_ADD, NULL, NULL); -} - -static inline int hashmap__set(struct hashmap *map, - const void *key, void *value, - const void **old_key, void **old_value) -{ - return hashmap__insert(map, key, value, HASHMAP_SET, - old_key, old_value); -} - -static inline int hashmap__update(struct hashmap *map, - const void *key, void *value, - const void **old_key, void **old_value) -{ - return hashmap__insert(map, key, value, HASHMAP_UPDATE, - old_key, old_value); -} - -static inline int hashmap__append(struct hashmap *map, - const void *key, void *value) -{ - return hashmap__insert(map, key, value, HASHMAP_APPEND, NULL, NULL); -} - -bool hashmap__delete(struct hashmap *map, const void *key, - const void **old_key, void **old_value); - -bool hashmap__find(const struct hashmap *map, const void *key, void **value); - -/* - * hashmap__for_each_entry - iterate over all entries in hashmap - * @map: hashmap to iterate - * @cur: struct hashmap_entry * used as a loop cursor - * @bkt: integer used as a bucket loop cursor - */ -#define hashmap__for_each_entry(map, cur, bkt) \ - for (bkt = 0; bkt < map->cap; bkt++) \ - for (cur = map->buckets[bkt]; cur; cur = cur->next) - -/* - * hashmap__for_each_entry_safe - iterate over all entries in hashmap, safe - * against removals - * @map: hashmap to iterate - * @cur: struct hashmap_entry * used as a loop cursor - * @tmp: struct hashmap_entry * used as a temporary next cursor storage - * @bkt: integer used as a bucket loop cursor - */ -#ifdef __GNUC__ -#define hashmap__for_each_entry_safe(map, cur, tmp, bkt) \ - for (bkt = 0; bkt < map->cap; bkt++) \ - for (cur = map->buckets[bkt]; \ - cur && ({tmp = cur->next; true; }); \ - cur = tmp) -#elif _MSC_VER -#define hashmap__for_each_entry_safe(map, cur, tmp, bkt) \ - for (bkt = 0; bkt < map->cap; bkt++) \ - for (cur = map->buckets[bkt]; \ - cur && ( tmp = cur->next, true ); \ - cur = tmp) -#endif - - -/* - * hashmap__for_each_key_entry - iterate over entries associated with given key - * @map: hashmap to iterate - * @cur: struct hashmap_entry * used as a loop cursor - * @key: key to iterate entries for - */ -#define hashmap__for_each_key_entry(map, cur, _key) \ - for (cur = map->buckets \ - ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \ - : NULL; \ - cur; \ - cur = cur->next) \ - if (map->equal_fn(cur->key, (_key), map->ctx)) - -#define hashmap__for_each_key_entry_safe(map, cur, tmp, _key) \ - for (cur = map->buckets \ - ? map->buckets[hash_bits(map->hash_fn((_key), map->ctx), map->cap_bits)] \ - : NULL; \ - cur && ({ tmp = cur->next; true; }); \ - cur = tmp) \ - if (map->equal_fn(cur->key, (_key), map->ctx)) - -#endif /* __LIBBPF_HASHMAP_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf.h deleted file mode 100644 index ae26bb4..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf.h +++ /dev/null @@ -1,1356 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -/* - * Common eBPF ELF object loading operations. - * - * Copyright (C) 2013-2015 Alexei Starovoitov - * Copyright (C) 2015 Wang Nan - * Copyright (C) 2015 Huawei Inc. - */ -#ifndef __LIBBPF_LIBBPF_H -#define __LIBBPF_LIBBPF_H - -#include -#include -#include -#include -#include // for size_t -#include - -#include "libbpf_common.h" -#include "libbpf_legacy.h" - -#ifdef __cplusplus -extern "C" { -#endif - -LIBBPF_API __u32 libbpf_major_version(void); -LIBBPF_API __u32 libbpf_minor_version(void); -LIBBPF_API const char *libbpf_version_string(void); - -enum libbpf_errno { - __LIBBPF_ERRNO__START = 4000, - - /* Something wrong in libelf */ - LIBBPF_ERRNO__LIBELF = __LIBBPF_ERRNO__START, - LIBBPF_ERRNO__FORMAT, /* BPF object format invalid */ - LIBBPF_ERRNO__KVERSION, /* Incorrect or no 'version' section */ - LIBBPF_ERRNO__ENDIAN, /* Endian mismatch */ - LIBBPF_ERRNO__INTERNAL, /* Internal error in libbpf */ - LIBBPF_ERRNO__RELOC, /* Relocation failed */ - LIBBPF_ERRNO__LOAD, /* Load program failure for unknown reason */ - LIBBPF_ERRNO__VERIFY, /* Kernel verifier blocks program loading */ - LIBBPF_ERRNO__PROG2BIG, /* Program too big */ - LIBBPF_ERRNO__KVER, /* Incorrect kernel version */ - LIBBPF_ERRNO__PROGTYPE, /* Kernel doesn't support this program type */ - LIBBPF_ERRNO__WRNGPID, /* Wrong pid in netlink message */ - LIBBPF_ERRNO__INVSEQ, /* Invalid netlink sequence */ - LIBBPF_ERRNO__NLPARSE, /* netlink parsing error */ - __LIBBPF_ERRNO__END, -}; - -LIBBPF_API int libbpf_strerror(int err, char *buf, size_t size); - -/** - * @brief **libbpf_bpf_attach_type_str()** converts the provided attach type - * value into a textual representation. - * @param t The attach type. - * @return Pointer to a static string identifying the attach type. NULL is - * returned for unknown **bpf_attach_type** values. - */ -LIBBPF_API const char *libbpf_bpf_attach_type_str(enum bpf_attach_type t); - -/** - * @brief **libbpf_bpf_link_type_str()** converts the provided link type value - * into a textual representation. - * @param t The link type. - * @return Pointer to a static string identifying the link type. NULL is - * returned for unknown **bpf_link_type** values. - */ -LIBBPF_API const char *libbpf_bpf_link_type_str(enum bpf_link_type t); - -/** - * @brief **libbpf_bpf_map_type_str()** converts the provided map type value - * into a textual representation. - * @param t The map type. - * @return Pointer to a static string identifying the map type. NULL is - * returned for unknown **bpf_map_type** values. - */ -LIBBPF_API const char *libbpf_bpf_map_type_str(enum bpf_map_type t); - -/** - * @brief **libbpf_bpf_prog_type_str()** converts the provided program type - * value into a textual representation. - * @param t The program type. - * @return Pointer to a static string identifying the program type. NULL is - * returned for unknown **bpf_prog_type** values. - */ -LIBBPF_API const char *libbpf_bpf_prog_type_str(enum bpf_prog_type t); - -enum libbpf_print_level { - LIBBPF_WARN, - LIBBPF_INFO, - LIBBPF_DEBUG, -}; - -typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level, - const char *, va_list ap); - -LIBBPF_API libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn); - -/* Hide internal to user */ -struct bpf_object; - -struct bpf_object_open_opts { - /* size of this struct, for forward/backward compatibility */ - size_t sz; - /* object name override, if provided: - * - for object open from file, this will override setting object - * name from file path's base name; - * - for object open from memory buffer, this will specify an object - * name and will override default "-" name; - */ - const char *object_name; - /* parse map definitions non-strictly, allowing extra attributes/data */ - bool relaxed_maps; - /* maps that set the 'pinning' attribute in their definition will have - * their pin_path attribute set to a file in this directory, and be - * auto-pinned to that path on load; defaults to "/sys/fs/bpf". - */ - const char *pin_root_path; - long :0; - /* Additional kernel config content that augments and overrides - * system Kconfig for CONFIG_xxx externs. - */ - const char *kconfig; - /* Path to the custom BTF to be used for BPF CO-RE relocations. - * This custom BTF completely replaces the use of vmlinux BTF - * for the purpose of CO-RE relocations. - * NOTE: any other BPF feature (e.g., fentry/fexit programs, - * struct_ops, etc) will need actual kernel BTF at /sys/kernel/btf/vmlinux. - */ - const char *btf_custom_path; - /* Pointer to a buffer for storing kernel logs for applicable BPF - * commands. Valid kernel_log_size has to be specified as well and are - * passed-through to bpf() syscall. Keep in mind that kernel might - * fail operation with -ENOSPC error if provided buffer is too small - * to contain entire log output. - * See the comment below for kernel_log_level for interaction between - * log_buf and log_level settings. - * - * If specified, this log buffer will be passed for: - * - each BPF progral load (BPF_PROG_LOAD) attempt, unless overriden - * with bpf_program__set_log() on per-program level, to get - * BPF verifier log output. - * - during BPF object's BTF load into kernel (BPF_BTF_LOAD) to get - * BTF sanity checking log. - * - * Each BPF command (BPF_BTF_LOAD or BPF_PROG_LOAD) will overwrite - * previous contents, so if you need more fine-grained control, set - * per-program buffer with bpf_program__set_log_buf() to preserve each - * individual program's verification log. Keep using kernel_log_buf - * for BTF verification log, if necessary. - */ - char *kernel_log_buf; - size_t kernel_log_size; - /* - * Log level can be set independently from log buffer. Log_level=0 - * means that libbpf will attempt loading BTF or program without any - * logging requested, but will retry with either its own or custom log - * buffer, if provided, and log_level=1 on any error. - * And vice versa, setting log_level>0 will request BTF or prog - * loading with verbose log from the first attempt (and as such also - * for successfully loaded BTF or program), and the actual log buffer - * could be either libbpf's own auto-allocated log buffer, if - * kernel_log_buffer is NULL, or user-provided custom kernel_log_buf. - * If user didn't provide custom log buffer, libbpf will emit captured - * logs through its print callback. - */ - __u32 kernel_log_level; - - size_t :0; -}; -#define bpf_object_open_opts__last_field kernel_log_level - -LIBBPF_API struct bpf_object *bpf_object__open(const char *path); - -/** - * @brief **bpf_object__open_file()** creates a bpf_object by opening - * the BPF ELF object file pointed to by the passed path and loading it - * into memory. - * @param path BPF object file path - * @param opts options for how to load the bpf object, this parameter is - * optional and can be set to NULL - * @return pointer to the new bpf_object; or NULL is returned on error, - * error code is stored in errno - */ -LIBBPF_API struct bpf_object * -bpf_object__open_file(const char *path, const struct bpf_object_open_opts *opts); - -/** - * @brief **bpf_object__open_mem()** creates a bpf_object by reading - * the BPF objects raw bytes from a memory buffer containing a valid - * BPF ELF object file. - * @param obj_buf pointer to the buffer containing ELF file bytes - * @param obj_buf_sz number of bytes in the buffer - * @param opts options for how to load the bpf object - * @return pointer to the new bpf_object; or NULL is returned on error, - * error code is stored in errno - */ -LIBBPF_API struct bpf_object * -bpf_object__open_mem(const void *obj_buf, size_t obj_buf_sz, - const struct bpf_object_open_opts *opts); - -/* Load/unload object into/from kernel */ -LIBBPF_API int bpf_object__load(struct bpf_object *obj); - -LIBBPF_API void bpf_object__close(struct bpf_object *object); - -/* pin_maps and unpin_maps can both be called with a NULL path, in which case - * they will use the pin_path attribute of each map (and ignore all maps that - * don't have a pin_path set). - */ -LIBBPF_API int bpf_object__pin_maps(struct bpf_object *obj, const char *path); -LIBBPF_API int bpf_object__unpin_maps(struct bpf_object *obj, - const char *path); -LIBBPF_API int bpf_object__pin_programs(struct bpf_object *obj, - const char *path); -LIBBPF_API int bpf_object__unpin_programs(struct bpf_object *obj, - const char *path); -LIBBPF_API int bpf_object__pin(struct bpf_object *object, const char *path); - -LIBBPF_API const char *bpf_object__name(const struct bpf_object *obj); -LIBBPF_API unsigned int bpf_object__kversion(const struct bpf_object *obj); -LIBBPF_API int bpf_object__set_kversion(struct bpf_object *obj, __u32 kern_version); - -struct btf; -LIBBPF_API struct btf *bpf_object__btf(const struct bpf_object *obj); -LIBBPF_API int bpf_object__btf_fd(const struct bpf_object *obj); - -LIBBPF_API struct bpf_program * -bpf_object__find_program_by_name(const struct bpf_object *obj, - const char *name); - -LIBBPF_API int -libbpf_prog_type_by_name(const char *name, enum bpf_prog_type *prog_type, - enum bpf_attach_type *expected_attach_type); -LIBBPF_API int libbpf_attach_type_by_name(const char *name, - enum bpf_attach_type *attach_type); -LIBBPF_API int libbpf_find_vmlinux_btf_id(const char *name, - enum bpf_attach_type attach_type); - -/* Accessors of bpf_program */ -struct bpf_program; - -LIBBPF_API struct bpf_program * -bpf_object__next_program(const struct bpf_object *obj, struct bpf_program *prog); - -#define bpf_object__for_each_program(pos, obj) \ - for ((pos) = bpf_object__next_program((obj), NULL); \ - (pos) != NULL; \ - (pos) = bpf_object__next_program((obj), (pos))) - -LIBBPF_API struct bpf_program * -bpf_object__prev_program(const struct bpf_object *obj, struct bpf_program *prog); - -LIBBPF_API void bpf_program__set_ifindex(struct bpf_program *prog, - __u32 ifindex); - -LIBBPF_API const char *bpf_program__name(const struct bpf_program *prog); -LIBBPF_API const char *bpf_program__section_name(const struct bpf_program *prog); -LIBBPF_API bool bpf_program__autoload(const struct bpf_program *prog); -LIBBPF_API int bpf_program__set_autoload(struct bpf_program *prog, bool autoload); - -struct bpf_insn; - -/** - * @brief **bpf_program__insns()** gives read-only access to BPF program's - * underlying BPF instructions. - * @param prog BPF program for which to return instructions - * @return a pointer to an array of BPF instructions that belong to the - * specified BPF program - * - * Returned pointer is always valid and not NULL. Number of `struct bpf_insn` - * pointed to can be fetched using **bpf_program__insn_cnt()** API. - * - * Keep in mind, libbpf can modify and append/delete BPF program's - * instructions as it processes BPF object file and prepares everything for - * uploading into the kernel. So depending on the point in BPF object - * lifetime, **bpf_program__insns()** can return different sets of - * instructions. As an example, during BPF object load phase BPF program - * instructions will be CO-RE-relocated, BPF subprograms instructions will be - * appended, ldimm64 instructions will have FDs embedded, etc. So instructions - * returned before **bpf_object__load()** and after it might be quite - * different. - */ -LIBBPF_API const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog); - -/** - * @brief **bpf_program__set_insns()** can set BPF program's underlying - * BPF instructions. - * - * WARNING: This is a very advanced libbpf API and users need to know - * what they are doing. This should be used from prog_prepare_load_fn - * callback only. - * - * @param prog BPF program for which to return instructions - * @param new_insns a pointer to an array of BPF instructions - * @param new_insn_cnt number of `struct bpf_insn`'s that form - * specified BPF program - * @return 0, on success; negative error code, otherwise - */ -LIBBPF_API int bpf_program__set_insns(struct bpf_program *prog, - struct bpf_insn *new_insns, size_t new_insn_cnt); - -/** - * @brief **bpf_program__insn_cnt()** returns number of `struct bpf_insn`'s - * that form specified BPF program. - * @param prog BPF program for which to return number of BPF instructions - * - * See **bpf_program__insns()** documentation for notes on how libbpf can - * change instructions and their count during different phases of - * **bpf_object** lifetime. - */ -LIBBPF_API size_t bpf_program__insn_cnt(const struct bpf_program *prog); - -LIBBPF_API int bpf_program__fd(const struct bpf_program *prog); - -/** - * @brief **bpf_program__pin()** pins the BPF program to a file - * in the BPF FS specified by a path. This increments the programs - * reference count, allowing it to stay loaded after the process - * which loaded it has exited. - * - * @param prog BPF program to pin, must already be loaded - * @param path file path in a BPF file system - * @return 0, on success; negative error code, otherwise - */ -LIBBPF_API int bpf_program__pin(struct bpf_program *prog, const char *path); - -/** - * @brief **bpf_program__unpin()** unpins the BPF program from a file - * in the BPFFS specified by a path. This decrements the programs - * reference count. - * - * The file pinning the BPF program can also be unlinked by a different - * process in which case this function will return an error. - * - * @param prog BPF program to unpin - * @param path file path to the pin in a BPF file system - * @return 0, on success; negative error code, otherwise - */ -LIBBPF_API int bpf_program__unpin(struct bpf_program *prog, const char *path); -LIBBPF_API void bpf_program__unload(struct bpf_program *prog); - -struct bpf_link; - -LIBBPF_API struct bpf_link *bpf_link__open(const char *path); -LIBBPF_API int bpf_link__fd(const struct bpf_link *link); -LIBBPF_API const char *bpf_link__pin_path(const struct bpf_link *link); -/** - * @brief **bpf_link__pin()** pins the BPF link to a file - * in the BPF FS specified by a path. This increments the links - * reference count, allowing it to stay loaded after the process - * which loaded it has exited. - * - * @param link BPF link to pin, must already be loaded - * @param path file path in a BPF file system - * @return 0, on success; negative error code, otherwise - */ - -LIBBPF_API int bpf_link__pin(struct bpf_link *link, const char *path); - -/** - * @brief **bpf_link__unpin()** unpins the BPF link from a file - * in the BPFFS specified by a path. This decrements the links - * reference count. - * - * The file pinning the BPF link can also be unlinked by a different - * process in which case this function will return an error. - * - * @param prog BPF program to unpin - * @param path file path to the pin in a BPF file system - * @return 0, on success; negative error code, otherwise - */ -LIBBPF_API int bpf_link__unpin(struct bpf_link *link); -LIBBPF_API int bpf_link__update_program(struct bpf_link *link, - struct bpf_program *prog); -LIBBPF_API void bpf_link__disconnect(struct bpf_link *link); -LIBBPF_API int bpf_link__detach(struct bpf_link *link); -LIBBPF_API int bpf_link__destroy(struct bpf_link *link); - -/** - * @brief **bpf_program__attach()** is a generic function for attaching - * a BPF program based on auto-detection of program type, attach type, - * and extra paremeters, where applicable. - * - * @param prog BPF program to attach - * @return Reference to the newly created BPF link; or NULL is returned on error, - * error code is stored in errno - * - * This is supported for: - * - kprobe/kretprobe (depends on SEC() definition) - * - uprobe/uretprobe (depends on SEC() definition) - * - tracepoint - * - raw tracepoint - * - tracing programs (typed raw TP/fentry/fexit/fmod_ret) - */ -LIBBPF_API struct bpf_link * -bpf_program__attach(const struct bpf_program *prog); - -struct bpf_perf_event_opts { - /* size of this struct, for forward/backward compatiblity */ - size_t sz; - /* custom user-provided value fetchable through bpf_get_attach_cookie() */ - __u64 bpf_cookie; -}; -#define bpf_perf_event_opts__last_field bpf_cookie - -LIBBPF_API struct bpf_link * -bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd); - -LIBBPF_API struct bpf_link * -bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd, - const struct bpf_perf_event_opts *opts); - -struct bpf_kprobe_opts { - /* size of this struct, for forward/backward compatiblity */ - size_t sz; - /* custom user-provided value fetchable through bpf_get_attach_cookie() */ - __u64 bpf_cookie; - /* function's offset to install kprobe to */ - size_t offset; - /* kprobe is return probe */ - bool retprobe; - size_t :0; -}; -#define bpf_kprobe_opts__last_field retprobe - -LIBBPF_API struct bpf_link * -bpf_program__attach_kprobe(const struct bpf_program *prog, bool retprobe, - const char *func_name); -LIBBPF_API struct bpf_link * -bpf_program__attach_kprobe_opts(const struct bpf_program *prog, - const char *func_name, - const struct bpf_kprobe_opts *opts); - -struct bpf_kprobe_multi_opts { - /* size of this struct, for forward/backward compatibility */ - size_t sz; - /* array of function symbols to attach */ - const char **syms; - /* array of function addresses to attach */ - const unsigned long *addrs; - /* array of user-provided values fetchable through bpf_get_attach_cookie */ - const __u64 *cookies; - /* number of elements in syms/addrs/cookies arrays */ - size_t cnt; - /* create return kprobes */ - bool retprobe; - size_t :0; -}; - -#define bpf_kprobe_multi_opts__last_field retprobe - -LIBBPF_API struct bpf_link * -bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, - const char *pattern, - const struct bpf_kprobe_multi_opts *opts); - -struct bpf_uprobe_opts { - /* size of this struct, for forward/backward compatiblity */ - size_t sz; - /* offset of kernel reference counted USDT semaphore, added in - * a6ca88b241d5 ("trace_uprobe: support reference counter in fd-based uprobe") - */ - size_t ref_ctr_offset; - /* custom user-provided value fetchable through bpf_get_attach_cookie() */ - __u64 bpf_cookie; - /* uprobe is return probe, invoked at function return time */ - bool retprobe; - /* Function name to attach to. Could be an unqualified ("abc") or library-qualified - * "abc@LIBXYZ" name. To specify function entry, func_name should be set while - * func_offset argument to bpf_prog__attach_uprobe_opts() should be 0. To trace an - * offset within a function, specify func_name and use func_offset argument to specify - * offset within the function. Shared library functions must specify the shared library - * binary_path. - */ - const char *func_name; - size_t :0; -}; -#define bpf_uprobe_opts__last_field func_name - -/** - * @brief **bpf_program__attach_uprobe()** attaches a BPF program - * to the userspace function which is found by binary path and - * offset. You can optionally specify a particular proccess to attach - * to. You can also optionally attach the program to the function - * exit instead of entry. - * - * @param prog BPF program to attach - * @param retprobe Attach to function exit - * @param pid Process ID to attach the uprobe to, 0 for self (own process), - * -1 for all processes - * @param binary_path Path to binary that contains the function symbol - * @param func_offset Offset within the binary of the function symbol - * @return Reference to the newly created BPF link; or NULL is returned on error, - * error code is stored in errno - */ -LIBBPF_API struct bpf_link * -bpf_program__attach_uprobe(const struct bpf_program *prog, bool retprobe, - pid_t pid, const char *binary_path, - size_t func_offset); - -/** - * @brief **bpf_program__attach_uprobe_opts()** is just like - * bpf_program__attach_uprobe() except with a options struct - * for various configurations. - * - * @param prog BPF program to attach - * @param pid Process ID to attach the uprobe to, 0 for self (own process), - * -1 for all processes - * @param binary_path Path to binary that contains the function symbol - * @param func_offset Offset within the binary of the function symbol - * @param opts Options for altering program attachment - * @return Reference to the newly created BPF link; or NULL is returned on error, - * error code is stored in errno - */ -LIBBPF_API struct bpf_link * -bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, - const char *binary_path, size_t func_offset, - const struct bpf_uprobe_opts *opts); - -struct bpf_usdt_opts { - /* size of this struct, for forward/backward compatibility */ - size_t sz; - /* custom user-provided value accessible through usdt_cookie() */ - __u64 usdt_cookie; - size_t :0; -}; -#define bpf_usdt_opts__last_field usdt_cookie - -/** - * @brief **bpf_program__attach_usdt()** is just like - * bpf_program__attach_uprobe_opts() except it covers USDT (User-space - * Statically Defined Tracepoint) attachment, instead of attaching to - * user-space function entry or exit. - * - * @param prog BPF program to attach - * @param pid Process ID to attach the uprobe to, 0 for self (own process), - * -1 for all processes - * @param binary_path Path to binary that contains provided USDT probe - * @param usdt_provider USDT provider name - * @param usdt_name USDT probe name - * @param opts Options for altering program attachment - * @return Reference to the newly created BPF link; or NULL is returned on error, - * error code is stored in errno - */ -LIBBPF_API struct bpf_link * -bpf_program__attach_usdt(const struct bpf_program *prog, - pid_t pid, const char *binary_path, - const char *usdt_provider, const char *usdt_name, - const struct bpf_usdt_opts *opts); - -struct bpf_tracepoint_opts { - /* size of this struct, for forward/backward compatiblity */ - size_t sz; - /* custom user-provided value fetchable through bpf_get_attach_cookie() */ - __u64 bpf_cookie; -}; -#define bpf_tracepoint_opts__last_field bpf_cookie - -LIBBPF_API struct bpf_link * -bpf_program__attach_tracepoint(const struct bpf_program *prog, - const char *tp_category, - const char *tp_name); -LIBBPF_API struct bpf_link * -bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, - const char *tp_category, - const char *tp_name, - const struct bpf_tracepoint_opts *opts); - -LIBBPF_API struct bpf_link * -bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, - const char *tp_name); - -struct bpf_trace_opts { - /* size of this struct, for forward/backward compatibility */ - size_t sz; - /* custom user-provided value fetchable through bpf_get_attach_cookie() */ - __u64 cookie; -}; -#define bpf_trace_opts__last_field cookie - -LIBBPF_API struct bpf_link * -bpf_program__attach_trace(const struct bpf_program *prog); -LIBBPF_API struct bpf_link * -bpf_program__attach_trace_opts(const struct bpf_program *prog, const struct bpf_trace_opts *opts); - -LIBBPF_API struct bpf_link * -bpf_program__attach_lsm(const struct bpf_program *prog); -LIBBPF_API struct bpf_link * -bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd); -LIBBPF_API struct bpf_link * -bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd); -LIBBPF_API struct bpf_link * -bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex); -LIBBPF_API struct bpf_link * -bpf_program__attach_freplace(const struct bpf_program *prog, - int target_fd, const char *attach_func_name); - -struct bpf_map; - -LIBBPF_API struct bpf_link *bpf_map__attach_struct_ops(const struct bpf_map *map); - -struct bpf_iter_attach_opts { - size_t sz; /* size of this struct for forward/backward compatibility */ - union bpf_iter_link_info *link_info; - __u32 link_info_len; -}; -#define bpf_iter_attach_opts__last_field link_info_len - -LIBBPF_API struct bpf_link * -bpf_program__attach_iter(const struct bpf_program *prog, - const struct bpf_iter_attach_opts *opts); - -LIBBPF_API enum bpf_prog_type bpf_program__type(const struct bpf_program *prog); - -/** - * @brief **bpf_program__set_type()** sets the program - * type of the passed BPF program. - * @param prog BPF program to set the program type for - * @param type program type to set the BPF map to have - * @return error code; or 0 if no error. An error occurs - * if the object is already loaded. - * - * This must be called before the BPF object is loaded, - * otherwise it has no effect and an error is returned. - */ -LIBBPF_API int bpf_program__set_type(struct bpf_program *prog, - enum bpf_prog_type type); - -LIBBPF_API enum bpf_attach_type -bpf_program__expected_attach_type(const struct bpf_program *prog); - -/** - * @brief **bpf_program__set_expected_attach_type()** sets the - * attach type of the passed BPF program. This is used for - * auto-detection of attachment when programs are loaded. - * @param prog BPF program to set the attach type for - * @param type attach type to set the BPF map to have - * @return error code; or 0 if no error. An error occurs - * if the object is already loaded. - * - * This must be called before the BPF object is loaded, - * otherwise it has no effect and an error is returned. - */ -LIBBPF_API int -bpf_program__set_expected_attach_type(struct bpf_program *prog, - enum bpf_attach_type type); - -LIBBPF_API __u32 bpf_program__flags(const struct bpf_program *prog); -LIBBPF_API int bpf_program__set_flags(struct bpf_program *prog, __u32 flags); - -/* Per-program log level and log buffer getters/setters. - * See bpf_object_open_opts comments regarding log_level and log_buf - * interactions. - */ -LIBBPF_API __u32 bpf_program__log_level(const struct bpf_program *prog); -LIBBPF_API int bpf_program__set_log_level(struct bpf_program *prog, __u32 log_level); -LIBBPF_API const char *bpf_program__log_buf(const struct bpf_program *prog, size_t *log_size); -LIBBPF_API int bpf_program__set_log_buf(struct bpf_program *prog, char *log_buf, size_t log_size); - -/** - * @brief **bpf_program__set_attach_target()** sets BTF-based attach target - * for supported BPF program types: - * - BTF-aware raw tracepoints (tp_btf); - * - fentry/fexit/fmod_ret; - * - lsm; - * - freplace. - * @param prog BPF program to set the attach type for - * @param type attach type to set the BPF map to have - * @return error code; or 0 if no error occurred. - */ -LIBBPF_API int -bpf_program__set_attach_target(struct bpf_program *prog, int attach_prog_fd, - const char *attach_func_name); - -/** - * @brief **bpf_object__find_map_by_name()** returns BPF map of - * the given name, if it exists within the passed BPF object - * @param obj BPF object - * @param name name of the BPF map - * @return BPF map instance, if such map exists within the BPF object; - * or NULL otherwise. - */ -LIBBPF_API struct bpf_map * -bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name); - -LIBBPF_API int -bpf_object__find_map_fd_by_name(const struct bpf_object *obj, const char *name); - -LIBBPF_API struct bpf_map * -bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *map); - -#define bpf_object__for_each_map(pos, obj) \ - for ((pos) = bpf_object__next_map((obj), NULL); \ - (pos) != NULL; \ - (pos) = bpf_object__next_map((obj), (pos))) -#define bpf_map__for_each bpf_object__for_each_map - -LIBBPF_API struct bpf_map * -bpf_object__prev_map(const struct bpf_object *obj, const struct bpf_map *map); - -/** - * @brief **bpf_map__set_autocreate()** sets whether libbpf has to auto-create - * BPF map during BPF object load phase. - * @param map the BPF map instance - * @param autocreate whether to create BPF map during BPF object load - * @return 0 on success; -EBUSY if BPF object was already loaded - * - * **bpf_map__set_autocreate()** allows to opt-out from libbpf auto-creating - * BPF map. By default, libbpf will attempt to create every single BPF map - * defined in BPF object file using BPF_MAP_CREATE command of bpf() syscall - * and fill in map FD in BPF instructions. - * - * This API allows to opt-out of this process for specific map instance. This - * can be useful if host kernel doesn't support such BPF map type or used - * combination of flags and user application wants to avoid creating such - * a map in the first place. User is still responsible to make sure that their - * BPF-side code that expects to use such missing BPF map is recognized by BPF - * verifier as dead code, otherwise BPF verifier will reject such BPF program. - */ -LIBBPF_API int bpf_map__set_autocreate(struct bpf_map *map, bool autocreate); -LIBBPF_API bool bpf_map__autocreate(const struct bpf_map *map); - -/** - * @brief **bpf_map__fd()** gets the file descriptor of the passed - * BPF map - * @param map the BPF map instance - * @return the file descriptor; or -EINVAL in case of an error - */ -LIBBPF_API int bpf_map__fd(const struct bpf_map *map); -LIBBPF_API int bpf_map__reuse_fd(struct bpf_map *map, int fd); -/* get map name */ -LIBBPF_API const char *bpf_map__name(const struct bpf_map *map); -/* get/set map type */ -LIBBPF_API enum bpf_map_type bpf_map__type(const struct bpf_map *map); -LIBBPF_API int bpf_map__set_type(struct bpf_map *map, enum bpf_map_type type); -/* get/set map size (max_entries) */ -LIBBPF_API __u32 bpf_map__max_entries(const struct bpf_map *map); -LIBBPF_API int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries); -/* get/set map flags */ -LIBBPF_API __u32 bpf_map__map_flags(const struct bpf_map *map); -LIBBPF_API int bpf_map__set_map_flags(struct bpf_map *map, __u32 flags); -/* get/set map NUMA node */ -LIBBPF_API __u32 bpf_map__numa_node(const struct bpf_map *map); -LIBBPF_API int bpf_map__set_numa_node(struct bpf_map *map, __u32 numa_node); -/* get/set map key size */ -LIBBPF_API __u32 bpf_map__key_size(const struct bpf_map *map); -LIBBPF_API int bpf_map__set_key_size(struct bpf_map *map, __u32 size); -/* get/set map value size */ -LIBBPF_API __u32 bpf_map__value_size(const struct bpf_map *map); -LIBBPF_API int bpf_map__set_value_size(struct bpf_map *map, __u32 size); -/* get map key/value BTF type IDs */ -LIBBPF_API __u32 bpf_map__btf_key_type_id(const struct bpf_map *map); -LIBBPF_API __u32 bpf_map__btf_value_type_id(const struct bpf_map *map); -/* get/set map if_index */ -LIBBPF_API __u32 bpf_map__ifindex(const struct bpf_map *map); -LIBBPF_API int bpf_map__set_ifindex(struct bpf_map *map, __u32 ifindex); -/* get/set map map_extra flags */ -LIBBPF_API __u64 bpf_map__map_extra(const struct bpf_map *map); -LIBBPF_API int bpf_map__set_map_extra(struct bpf_map *map, __u64 map_extra); - -LIBBPF_API int bpf_map__set_initial_value(struct bpf_map *map, - const void *data, size_t size); -LIBBPF_API const void *bpf_map__initial_value(struct bpf_map *map, size_t *psize); - -/** - * @brief **bpf_map__is_internal()** tells the caller whether or not the - * passed map is a special map created by libbpf automatically for things like - * global variables, __ksym externs, Kconfig values, etc - * @param map the bpf_map - * @return true, if the map is an internal map; false, otherwise - */ -LIBBPF_API bool bpf_map__is_internal(const struct bpf_map *map); -LIBBPF_API int bpf_map__set_pin_path(struct bpf_map *map, const char *path); -LIBBPF_API const char *bpf_map__pin_path(const struct bpf_map *map); -LIBBPF_API bool bpf_map__is_pinned(const struct bpf_map *map); -LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path); -LIBBPF_API int bpf_map__unpin(struct bpf_map *map, const char *path); - -LIBBPF_API int bpf_map__set_inner_map_fd(struct bpf_map *map, int fd); -LIBBPF_API struct bpf_map *bpf_map__inner_map(struct bpf_map *map); - -/** - * @brief **bpf_map__lookup_elem()** allows to lookup BPF map value - * corresponding to provided key. - * @param map BPF map to lookup element in - * @param key pointer to memory containing bytes of the key used for lookup - * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** - * @param value pointer to memory in which looked up value will be stored - * @param value_sz size in byte of value data memory; it has to match BPF map - * definition's **value_size**. For per-CPU BPF maps value size has to be - * a product of BPF map value size and number of possible CPUs in the system - * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for - * per-CPU values value size has to be aligned up to closest 8 bytes for - * alignment reasons, so expected size is: `round_up(value_size, 8) - * * libbpf_num_possible_cpus()`. - * @flags extra flags passed to kernel for this operation - * @return 0, on success; negative error, otherwise - * - * **bpf_map__lookup_elem()** is high-level equivalent of - * **bpf_map_lookup_elem()** API with added check for key and value size. - */ -LIBBPF_API int bpf_map__lookup_elem(const struct bpf_map *map, - const void *key, size_t key_sz, - void *value, size_t value_sz, __u64 flags); - -/** - * @brief **bpf_map__update_elem()** allows to insert or update value in BPF - * map that corresponds to provided key. - * @param map BPF map to insert to or update element in - * @param key pointer to memory containing bytes of the key - * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** - * @param value pointer to memory containing bytes of the value - * @param value_sz size in byte of value data memory; it has to match BPF map - * definition's **value_size**. For per-CPU BPF maps value size has to be - * a product of BPF map value size and number of possible CPUs in the system - * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for - * per-CPU values value size has to be aligned up to closest 8 bytes for - * alignment reasons, so expected size is: `round_up(value_size, 8) - * * libbpf_num_possible_cpus()`. - * @flags extra flags passed to kernel for this operation - * @return 0, on success; negative error, otherwise - * - * **bpf_map__update_elem()** is high-level equivalent of - * **bpf_map_update_elem()** API with added check for key and value size. - */ -LIBBPF_API int bpf_map__update_elem(const struct bpf_map *map, - const void *key, size_t key_sz, - const void *value, size_t value_sz, __u64 flags); - -/** - * @brief **bpf_map__delete_elem()** allows to delete element in BPF map that - * corresponds to provided key. - * @param map BPF map to delete element from - * @param key pointer to memory containing bytes of the key - * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** - * @flags extra flags passed to kernel for this operation - * @return 0, on success; negative error, otherwise - * - * **bpf_map__delete_elem()** is high-level equivalent of - * **bpf_map_delete_elem()** API with added check for key size. - */ -LIBBPF_API int bpf_map__delete_elem(const struct bpf_map *map, - const void *key, size_t key_sz, __u64 flags); - -/** - * @brief **bpf_map__lookup_and_delete_elem()** allows to lookup BPF map value - * corresponding to provided key and atomically delete it afterwards. - * @param map BPF map to lookup element in - * @param key pointer to memory containing bytes of the key used for lookup - * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** - * @param value pointer to memory in which looked up value will be stored - * @param value_sz size in byte of value data memory; it has to match BPF map - * definition's **value_size**. For per-CPU BPF maps value size has to be - * a product of BPF map value size and number of possible CPUs in the system - * (could be fetched with **libbpf_num_possible_cpus()**). Note also that for - * per-CPU values value size has to be aligned up to closest 8 bytes for - * alignment reasons, so expected size is: `round_up(value_size, 8) - * * libbpf_num_possible_cpus()`. - * @flags extra flags passed to kernel for this operation - * @return 0, on success; negative error, otherwise - * - * **bpf_map__lookup_and_delete_elem()** is high-level equivalent of - * **bpf_map_lookup_and_delete_elem()** API with added check for key and value size. - */ -LIBBPF_API int bpf_map__lookup_and_delete_elem(const struct bpf_map *map, - const void *key, size_t key_sz, - void *value, size_t value_sz, __u64 flags); - -/** - * @brief **bpf_map__get_next_key()** allows to iterate BPF map keys by - * fetching next key that follows current key. - * @param map BPF map to fetch next key from - * @param cur_key pointer to memory containing bytes of current key or NULL to - * fetch the first key - * @param next_key pointer to memory to write next key into - * @param key_sz size in bytes of key data, needs to match BPF map definition's **key_size** - * @return 0, on success; -ENOENT if **cur_key** is the last key in BPF map; - * negative error, otherwise - * - * **bpf_map__get_next_key()** is high-level equivalent of - * **bpf_map_get_next_key()** API with added check for key size. - */ -LIBBPF_API int bpf_map__get_next_key(const struct bpf_map *map, - const void *cur_key, void *next_key, size_t key_sz); - -struct bpf_xdp_set_link_opts { - size_t sz; - int old_fd; - size_t :0; -}; -#define bpf_xdp_set_link_opts__last_field old_fd - -struct bpf_xdp_attach_opts { - size_t sz; - int old_prog_fd; - size_t :0; -}; -#define bpf_xdp_attach_opts__last_field old_prog_fd - -struct bpf_xdp_query_opts { - size_t sz; - __u32 prog_id; /* output */ - __u32 drv_prog_id; /* output */ - __u32 hw_prog_id; /* output */ - __u32 skb_prog_id; /* output */ - __u8 attach_mode; /* output */ - size_t :0; -}; -#define bpf_xdp_query_opts__last_field attach_mode - -LIBBPF_API int bpf_xdp_attach(int ifindex, int prog_fd, __u32 flags, - const struct bpf_xdp_attach_opts *opts); -LIBBPF_API int bpf_xdp_detach(int ifindex, __u32 flags, - const struct bpf_xdp_attach_opts *opts); -LIBBPF_API int bpf_xdp_query(int ifindex, int flags, struct bpf_xdp_query_opts *opts); -LIBBPF_API int bpf_xdp_query_id(int ifindex, int flags, __u32 *prog_id); - -/* TC related API */ -enum bpf_tc_attach_point { - BPF_TC_INGRESS = 1 << 0, - BPF_TC_EGRESS = 1 << 1, - BPF_TC_CUSTOM = 1 << 2, -}; - -#define BPF_TC_PARENT(a, b) \ - ((((a) << 16) & 0xFFFF0000U) | ((b) & 0x0000FFFFU)) - -enum bpf_tc_flags { - BPF_TC_F_REPLACE = 1 << 0, -}; - -struct bpf_tc_hook { - size_t sz; - int ifindex; - enum bpf_tc_attach_point attach_point; - __u32 parent; - size_t :0; -}; -#define bpf_tc_hook__last_field parent - -struct bpf_tc_opts { - size_t sz; - int prog_fd; - __u32 flags; - __u32 prog_id; - __u32 handle; - __u32 priority; - size_t :0; -}; -#define bpf_tc_opts__last_field priority - -LIBBPF_API int bpf_tc_hook_create(struct bpf_tc_hook *hook); -LIBBPF_API int bpf_tc_hook_destroy(struct bpf_tc_hook *hook); -LIBBPF_API int bpf_tc_attach(const struct bpf_tc_hook *hook, - struct bpf_tc_opts *opts); -LIBBPF_API int bpf_tc_detach(const struct bpf_tc_hook *hook, - const struct bpf_tc_opts *opts); -LIBBPF_API int bpf_tc_query(const struct bpf_tc_hook *hook, - struct bpf_tc_opts *opts); - -/* Ring buffer APIs */ -struct ring_buffer; - -typedef int (*ring_buffer_sample_fn)(void *ctx, void *data, size_t size); - -struct ring_buffer_opts { - size_t sz; /* size of this struct, for forward/backward compatiblity */ -}; - -#define ring_buffer_opts__last_field sz - -LIBBPF_API struct ring_buffer * -ring_buffer__new(int map_fd, ring_buffer_sample_fn sample_cb, void *ctx, - const struct ring_buffer_opts *opts); -LIBBPF_API void ring_buffer__free(struct ring_buffer *rb); -LIBBPF_API int ring_buffer__add(struct ring_buffer *rb, int map_fd, - ring_buffer_sample_fn sample_cb, void *ctx); -LIBBPF_API int ring_buffer__poll(struct ring_buffer *rb, int timeout_ms); -LIBBPF_API int ring_buffer__consume(struct ring_buffer *rb); -LIBBPF_API int ring_buffer__epoll_fd(const struct ring_buffer *rb); - -/* Perf buffer APIs */ -struct perf_buffer; - -typedef void (*perf_buffer_sample_fn)(void *ctx, int cpu, - void *data, __u32 size); -typedef void (*perf_buffer_lost_fn)(void *ctx, int cpu, __u64 cnt); - -/* common use perf buffer options */ -struct perf_buffer_opts { - size_t sz; -}; -#define perf_buffer_opts__last_field sz - -/** - * @brief **perf_buffer__new()** creates BPF perfbuf manager for a specified - * BPF_PERF_EVENT_ARRAY map - * @param map_fd FD of BPF_PERF_EVENT_ARRAY BPF map that will be used by BPF - * code to send data over to user-space - * @param page_cnt number of memory pages allocated for each per-CPU buffer - * @param sample_cb function called on each received data record - * @param lost_cb function called when record loss has occurred - * @param ctx user-provided extra context passed into *sample_cb* and *lost_cb* - * @return a new instance of struct perf_buffer on success, NULL on error with - * *errno* containing an error code - */ -LIBBPF_API struct perf_buffer * -perf_buffer__new(int map_fd, size_t page_cnt, - perf_buffer_sample_fn sample_cb, perf_buffer_lost_fn lost_cb, void *ctx, - const struct perf_buffer_opts *opts); - -enum bpf_perf_event_ret { - LIBBPF_PERF_EVENT_DONE = 0, - LIBBPF_PERF_EVENT_ERROR = -1, - LIBBPF_PERF_EVENT_CONT = -2, -}; - -struct perf_event_header; - -typedef enum bpf_perf_event_ret -(*perf_buffer_event_fn)(void *ctx, int cpu, struct perf_event_header *event); - -/* raw perf buffer options, giving most power and control */ -struct perf_buffer_raw_opts { - size_t sz; - long :0; - long :0; - /* if cpu_cnt == 0, open all on all possible CPUs (up to the number of - * max_entries of given PERF_EVENT_ARRAY map) - */ - int cpu_cnt; - /* if cpu_cnt > 0, cpus is an array of CPUs to open ring buffers on */ - int *cpus; - /* if cpu_cnt > 0, map_keys specify map keys to set per-CPU FDs for */ - int *map_keys; -}; -#define perf_buffer_raw_opts__last_field map_keys - -struct perf_event_attr; - -LIBBPF_API struct perf_buffer * -perf_buffer__new_raw(int map_fd, size_t page_cnt, struct perf_event_attr *attr, - perf_buffer_event_fn event_cb, void *ctx, - const struct perf_buffer_raw_opts *opts); - -LIBBPF_API void perf_buffer__free(struct perf_buffer *pb); -LIBBPF_API int perf_buffer__epoll_fd(const struct perf_buffer *pb); -LIBBPF_API int perf_buffer__poll(struct perf_buffer *pb, int timeout_ms); -LIBBPF_API int perf_buffer__consume(struct perf_buffer *pb); -LIBBPF_API int perf_buffer__consume_buffer(struct perf_buffer *pb, size_t buf_idx); -LIBBPF_API size_t perf_buffer__buffer_cnt(const struct perf_buffer *pb); -LIBBPF_API int perf_buffer__buffer_fd(const struct perf_buffer *pb, size_t buf_idx); - -struct bpf_prog_linfo; -struct bpf_prog_info; - -LIBBPF_API void bpf_prog_linfo__free(struct bpf_prog_linfo *prog_linfo); -LIBBPF_API struct bpf_prog_linfo * -bpf_prog_linfo__new(const struct bpf_prog_info *info); -LIBBPF_API const struct bpf_line_info * -bpf_prog_linfo__lfind_addr_func(const struct bpf_prog_linfo *prog_linfo, - __u64 addr, __u32 func_idx, __u32 nr_skip); -LIBBPF_API const struct bpf_line_info * -bpf_prog_linfo__lfind(const struct bpf_prog_linfo *prog_linfo, - __u32 insn_off, __u32 nr_skip); - -/* - * Probe for supported system features - * - * Note that running many of these probes in a short amount of time can cause - * the kernel to reach the maximal size of lockable memory allowed for the - * user, causing subsequent probes to fail. In this case, the caller may want - * to adjust that limit with setrlimit(). - */ - -/** - * @brief **libbpf_probe_bpf_prog_type()** detects if host kernel supports - * BPF programs of a given type. - * @param prog_type BPF program type to detect kernel support for - * @param opts reserved for future extensibility, should be NULL - * @return 1, if given program type is supported; 0, if given program type is - * not supported; negative error code if feature detection failed or can't be - * performed - * - * Make sure the process has required set of CAP_* permissions (or runs as - * root) when performing feature checking. - */ -LIBBPF_API int libbpf_probe_bpf_prog_type(enum bpf_prog_type prog_type, const void *opts); -/** - * @brief **libbpf_probe_bpf_map_type()** detects if host kernel supports - * BPF maps of a given type. - * @param map_type BPF map type to detect kernel support for - * @param opts reserved for future extensibility, should be NULL - * @return 1, if given map type is supported; 0, if given map type is - * not supported; negative error code if feature detection failed or can't be - * performed - * - * Make sure the process has required set of CAP_* permissions (or runs as - * root) when performing feature checking. - */ -LIBBPF_API int libbpf_probe_bpf_map_type(enum bpf_map_type map_type, const void *opts); -/** - * @brief **libbpf_probe_bpf_helper()** detects if host kernel supports the - * use of a given BPF helper from specified BPF program type. - * @param prog_type BPF program type used to check the support of BPF helper - * @param helper_id BPF helper ID (enum bpf_func_id) to check support for - * @param opts reserved for future extensibility, should be NULL - * @return 1, if given combination of program type and helper is supported; 0, - * if the combination is not supported; negative error code if feature - * detection for provided input arguments failed or can't be performed - * - * Make sure the process has required set of CAP_* permissions (or runs as - * root) when performing feature checking. - */ -LIBBPF_API int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, - enum bpf_func_id helper_id, const void *opts); - -/** - * @brief **libbpf_num_possible_cpus()** is a helper function to get the - * number of possible CPUs that the host kernel supports and expects. - * @return number of possible CPUs; or error code on failure - * - * Example usage: - * - * int ncpus = libbpf_num_possible_cpus(); - * if (ncpus < 0) { - * // error handling - * } - * long values[ncpus]; - * bpf_map_lookup_elem(per_cpu_map_fd, key, values); - */ -LIBBPF_API int libbpf_num_possible_cpus(void); - -struct bpf_map_skeleton { - const char *name; - struct bpf_map **map; - void **mmaped; -}; - -struct bpf_prog_skeleton { - const char *name; - struct bpf_program **prog; - struct bpf_link **link; -}; - -struct bpf_object_skeleton { - size_t sz; /* size of this struct, for forward/backward compatibility */ - - const char *name; - const void *data; - size_t data_sz; - - struct bpf_object **obj; - - int map_cnt; - int map_skel_sz; /* sizeof(struct bpf_map_skeleton) */ - struct bpf_map_skeleton *maps; - - int prog_cnt; - int prog_skel_sz; /* sizeof(struct bpf_prog_skeleton) */ - struct bpf_prog_skeleton *progs; -}; - -LIBBPF_API int -bpf_object__open_skeleton(struct bpf_object_skeleton *s, - const struct bpf_object_open_opts *opts); -LIBBPF_API int bpf_object__load_skeleton(struct bpf_object_skeleton *s); -LIBBPF_API int bpf_object__attach_skeleton(struct bpf_object_skeleton *s); -LIBBPF_API void bpf_object__detach_skeleton(struct bpf_object_skeleton *s); -LIBBPF_API void bpf_object__destroy_skeleton(struct bpf_object_skeleton *s); - -struct bpf_var_skeleton { - const char *name; - struct bpf_map **map; - void **addr; -}; - -struct bpf_object_subskeleton { - size_t sz; /* size of this struct, for forward/backward compatibility */ - - const struct bpf_object *obj; - - int map_cnt; - int map_skel_sz; /* sizeof(struct bpf_map_skeleton) */ - struct bpf_map_skeleton *maps; - - int prog_cnt; - int prog_skel_sz; /* sizeof(struct bpf_prog_skeleton) */ - struct bpf_prog_skeleton *progs; - - int var_cnt; - int var_skel_sz; /* sizeof(struct bpf_var_skeleton) */ - struct bpf_var_skeleton *vars; -}; - -LIBBPF_API int -bpf_object__open_subskeleton(struct bpf_object_subskeleton *s); -LIBBPF_API void -bpf_object__destroy_subskeleton(struct bpf_object_subskeleton *s); - -struct gen_loader_opts { - size_t sz; /* size of this struct, for forward/backward compatiblity */ - const char *data; - const char *insns; - __u32 data_sz; - __u32 insns_sz; -}; - -#define gen_loader_opts__last_field insns_sz -LIBBPF_API int bpf_object__gen_loader(struct bpf_object *obj, - struct gen_loader_opts *opts); - -enum libbpf_tristate { - TRI_NO = 0, - TRI_YES = 1, - TRI_MODULE = 2, -}; - -struct bpf_linker_opts { - /* size of this struct, for forward/backward compatiblity */ - size_t sz; -}; -#define bpf_linker_opts__last_field sz - -struct bpf_linker_file_opts { - /* size of this struct, for forward/backward compatiblity */ - size_t sz; -}; -#define bpf_linker_file_opts__last_field sz - -struct bpf_linker; - -LIBBPF_API struct bpf_linker *bpf_linker__new(const char *filename, struct bpf_linker_opts *opts); -LIBBPF_API int bpf_linker__add_file(struct bpf_linker *linker, - const char *filename, - const struct bpf_linker_file_opts *opts); -LIBBPF_API int bpf_linker__finalize(struct bpf_linker *linker); -LIBBPF_API void bpf_linker__free(struct bpf_linker *linker); - -/* - * Custom handling of BPF program's SEC() definitions - */ - -struct bpf_prog_load_opts; /* defined in bpf.h */ - -/* Called during bpf_object__open() for each recognized BPF program. Callback - * can use various bpf_program__set_*() setters to adjust whatever properties - * are necessary. - */ -typedef int (*libbpf_prog_setup_fn_t)(struct bpf_program *prog, long cookie); - -/* Called right before libbpf performs bpf_prog_load() to load BPF program - * into the kernel. Callback can adjust opts as necessary. - */ -typedef int (*libbpf_prog_prepare_load_fn_t)(struct bpf_program *prog, - struct bpf_prog_load_opts *opts, long cookie); - -/* Called during skeleton attach or through bpf_program__attach(). If - * auto-attach is not supported, callback should return 0 and set link to - * NULL (it's not considered an error during skeleton attach, but it will be - * an error for bpf_program__attach() calls). On error, error should be - * returned directly and link set to NULL. On success, return 0 and set link - * to a valid struct bpf_link. - */ -typedef int (*libbpf_prog_attach_fn_t)(const struct bpf_program *prog, long cookie, - struct bpf_link **link); - -struct libbpf_prog_handler_opts { - /* size of this struct, for forward/backward compatiblity */ - size_t sz; - /* User-provided value that is passed to prog_setup_fn, - * prog_prepare_load_fn, and prog_attach_fn callbacks. Allows user to - * register one set of callbacks for multiple SEC() definitions and - * still be able to distinguish them, if necessary. For example, - * libbpf itself is using this to pass necessary flags (e.g., - * sleepable flag) to a common internal SEC() handler. - */ - long cookie; - /* BPF program initialization callback (see libbpf_prog_setup_fn_t). - * Callback is optional, pass NULL if it's not necessary. - */ - libbpf_prog_setup_fn_t prog_setup_fn; - /* BPF program loading callback (see libbpf_prog_prepare_load_fn_t). - * Callback is optional, pass NULL if it's not necessary. - */ - libbpf_prog_prepare_load_fn_t prog_prepare_load_fn; - /* BPF program attach callback (see libbpf_prog_attach_fn_t). - * Callback is optional, pass NULL if it's not necessary. - */ - libbpf_prog_attach_fn_t prog_attach_fn; -}; -#define libbpf_prog_handler_opts__last_field prog_attach_fn - -/** - * @brief **libbpf_register_prog_handler()** registers a custom BPF program - * SEC() handler. - * @param sec section prefix for which custom handler is registered - * @param prog_type BPF program type associated with specified section - * @param exp_attach_type Expected BPF attach type associated with specified section - * @param opts optional cookie, callbacks, and other extra options - * @return Non-negative handler ID is returned on success. This handler ID has - * to be passed to *libbpf_unregister_prog_handler()* to unregister such - * custom handler. Negative error code is returned on error. - * - * *sec* defines which SEC() definitions are handled by this custom handler - * registration. *sec* can have few different forms: - * - if *sec* is just a plain string (e.g., "abc"), it will match only - * SEC("abc"). If BPF program specifies SEC("abc/whatever") it will result - * in an error; - * - if *sec* is of the form "abc/", proper SEC() form is - * SEC("abc/something"), where acceptable "something" should be checked by - * *prog_init_fn* callback, if there are additional restrictions; - * - if *sec* is of the form "abc+", it will successfully match both - * SEC("abc") and SEC("abc/whatever") forms; - * - if *sec* is NULL, custom handler is registered for any BPF program that - * doesn't match any of the registered (custom or libbpf's own) SEC() - * handlers. There could be only one such generic custom handler registered - * at any given time. - * - * All custom handlers (except the one with *sec* == NULL) are processed - * before libbpf's own SEC() handlers. It is allowed to "override" libbpf's - * SEC() handlers by registering custom ones for the same section prefix - * (i.e., it's possible to have custom SEC("perf_event/LLC-load-misses") - * handler). - * - * Note, like much of global libbpf APIs (e.g., libbpf_set_print(), - * libbpf_set_strict_mode(), etc)) these APIs are not thread-safe. User needs - * to ensure synchronization if there is a risk of running this API from - * multiple threads simultaneously. - */ -LIBBPF_API int libbpf_register_prog_handler(const char *sec, - enum bpf_prog_type prog_type, - enum bpf_attach_type exp_attach_type, - const struct libbpf_prog_handler_opts *opts); -/** - * @brief *libbpf_unregister_prog_handler()* unregisters previously registered - * custom BPF program SEC() handler. - * @param handler_id handler ID returned by *libbpf_register_prog_handler()* - * after successful registration - * @return 0 on success, negative error code if handler isn't found - * - * Note, like much of global libbpf APIs (e.g., libbpf_set_print(), - * libbpf_set_strict_mode(), etc)) these APIs are not thread-safe. User needs - * to ensure synchronization if there is a risk of running this API from - * multiple threads simultaneously. - */ -LIBBPF_API int libbpf_unregister_prog_handler(int handler_id); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* __LIBBPF_LIBBPF_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_common.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_common.h deleted file mode 100644 index 23b2e4a..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_common.h +++ /dev/null @@ -1,103 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -/* - * Common user-facing libbpf helpers. - * - * Copyright (c) 2019 Facebook - */ - -#ifndef __LIBBPF_LIBBPF_COMMON_H -#define __LIBBPF_LIBBPF_COMMON_H - -#include -#include "libbpf_version.h" - -#ifndef LIBBPF_API -#define LIBBPF_API __attribute__((visibility("default"))) -#endif - -#ifdef __GNUC__ -#define LIBBPF_DEPRECATED(msg) __attribute__((deprecated(msg))) -#define LIBBPF_FORMAT_PRINTF(a,b) __attribute__((format(printf, a, b))) -#define LIBBPF_ALIAS(a) __attribute__((alias(a))) -#endif -#ifdef _MSC_VER -#define LIBBPF_DEPRECATED(msg) __declspec(deprecated(msg)) -#define LIBBPF_FORMAT_PRINTF(a, b) -#define LIBBPF_ALIAS(a) -#endif - -/* Mark a symbol as deprecated when libbpf version is >= {major}.{minor} */ -#define LIBBPF_DEPRECATED_SINCE(major, minor, msg) \ - __LIBBPF_MARK_DEPRECATED_ ## major ## _ ## minor \ - (LIBBPF_DEPRECATED("libbpf v" # major "." # minor "+: " msg)) - -#define __LIBBPF_CURRENT_VERSION_GEQ(major, minor) \ - (LIBBPF_MAJOR_VERSION > (major) || \ - (LIBBPF_MAJOR_VERSION == (major) && LIBBPF_MINOR_VERSION >= (minor))) - -/* Add checks for other versions below when planning deprecation of API symbols - * with the LIBBPF_DEPRECATED_SINCE macro. - */ -#if __LIBBPF_CURRENT_VERSION_GEQ(1, 0) -#define __LIBBPF_MARK_DEPRECATED_1_0(X) X -#else -#define __LIBBPF_MARK_DEPRECATED_1_0(X) -#endif - -/* This set of internal macros allows to do "function overloading" based on - * number of arguments provided by used in backwards-compatible way during the - * transition to libbpf 1.0 - * It's ugly but necessary evil that will be cleaned up when we get to 1.0. - * See bpf_prog_load() overload for example. - */ -#define ___libbpf_cat(A, B) A ## B -#ifdef __GNUC__ -#define ___libbpf_select(NAME, NUM) ___libbpf_cat(NAME, NUM) -#else -#define ___libbpf_select_impl(NAME, NUM) ___libbpf_cat(NAME, NUM) -#define ___libbpf_select(NAME, NUM) ___libbpf_select_impl(NAME, NUM) -#endif -#define ___libbpf_nth(_1, _2, _3, _4, _5, _6, N, ...) N -#ifdef __GNUC__ -#define ___libbpf_cnt(...) ___libbpf_nth(__VA_ARGS__, 6, 5, 4, 3, 2, 1) -#define ___libbpf_overload(NAME, ...) ___libbpf_select(NAME, ___libbpf_cnt(__VA_ARGS__))(__VA_ARGS__) -#else -#define ___libbpf_cnt_impl(args) ___libbpf_nth args -#define ___libbpf_cnt(...) ___libbpf_cnt_impl((__VA_ARGS__, 6, 5, 4, 3, 2, 1)) -#define ___libbpf_glue(x, y) x y -#define ___libbpf_overload(NAME, ...) ___libbpf_glue(___libbpf_select(NAME, ___libbpf_cnt(__VA_ARGS__)), (__VA_ARGS__)) -#endif - -/* Helper macro to declare and initialize libbpf options struct - * - * This dance with uninitialized declaration, followed by memset to zero, - * followed by assignment using compound literal syntax is done to preserve - * ability to use a nice struct field initialization syntax and **hopefully** - * have all the padding bytes initialized to zero. It's not guaranteed though, - * when copying literal, that compiler won't copy garbage in literal's padding - * bytes, but that's the best way I've found and it seems to work in practice. - * - * Macro declares opts struct of given type and name, zero-initializes, - * including any extra padding, it with memset() and then assigns initial - * values provided by users in struct initializer-syntax as varargs. - */ -#ifndef _MSC_VER -#define LIBBPF_OPTS(TYPE, NAME, ...) \ - struct TYPE NAME = ({ \ - memset(&NAME, 0, sizeof(struct TYPE)); \ - (struct TYPE) { \ - .sz = sizeof(struct TYPE), \ - __VA_ARGS__ \ - }; \ - }) -#else -/* The MSVC compiler doesn't support function calls within the struct - * definition, but always zero initializes other fields. - */ -#define LIBBPF_OPTS(TYPE, NAME, ...) \ - struct TYPE NAME = \ - {.sz = sizeof(struct TYPE), __VA_ARGS__}; -#endif - -#endif /* __LIBBPF_LIBBPF_COMMON_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_internal.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_internal.h deleted file mode 100644 index 2dfd145..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_internal.h +++ /dev/null @@ -1,576 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -/* - * Internal libbpf helpers. - * - * Copyright (c) 2019 Facebook - */ - -#ifndef __LIBBPF_LIBBPF_INTERNAL_H -#define __LIBBPF_LIBBPF_INTERNAL_H - -#include -#include -#include -#include -#include -#ifdef __linux__ -#include -#endif -#include "relo_core.h" - -/* make sure libbpf doesn't use kernel-only integer typedefs */ -#pragma GCC poison u8 u16 u32 u64 s8 s16 s32 s64 - -/* prevent accidental re-addition of reallocarray() */ -#pragma GCC poison reallocarray - -#include "libbpf.h" -#include "btf.h" - -#ifndef EM_BPF -#define EM_BPF 247 -#endif - -#ifndef R_BPF_64_64 -#define R_BPF_64_64 1 -#endif -#ifndef R_BPF_64_ABS64 -#define R_BPF_64_ABS64 2 -#endif -#ifndef R_BPF_64_ABS32 -#define R_BPF_64_ABS32 3 -#endif -#ifndef R_BPF_64_32 -#define R_BPF_64_32 10 -#endif - -#ifndef SHT_LLVM_ADDRSIG -#define SHT_LLVM_ADDRSIG 0x6FFF4C03 -#endif - -/* if libelf is old and doesn't support mmap(), fall back to read() */ -#ifndef ELF_C_READ_MMAP -#define ELF_C_READ_MMAP ELF_C_READ -#endif - -/* Older libelf all end up in this expression, for both 32 and 64 bit */ -#ifndef ELF64_ST_VISIBILITY -#define ELF64_ST_VISIBILITY(o) ((o) & 0x03) -#endif - -#define BTF_INFO_ENC(kind, kind_flag, vlen) \ - ((!!(kind_flag) << 31) | ((kind) << 24) | ((vlen) & BTF_MAX_VLEN)) -#define BTF_TYPE_ENC(name, info, size_or_type) (name), (info), (size_or_type) -#define BTF_INT_ENC(encoding, bits_offset, nr_bits) \ - ((encoding) << 24 | (bits_offset) << 16 | (nr_bits)) -#define BTF_TYPE_INT_ENC(name, encoding, bits_offset, bits, sz) \ - BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_INT, 0, 0), sz), \ - BTF_INT_ENC(encoding, bits_offset, bits) -#define BTF_MEMBER_ENC(name, type, bits_offset) (name), (type), (bits_offset) -#define BTF_PARAM_ENC(name, type) (name), (type) -#define BTF_VAR_SECINFO_ENC(type, offset, size) (type), (offset), (size) -#define BTF_TYPE_FLOAT_ENC(name, sz) \ - BTF_TYPE_ENC(name, BTF_INFO_ENC(BTF_KIND_FLOAT, 0, 0), sz) -#define BTF_TYPE_DECL_TAG_ENC(value, type, component_idx) \ - BTF_TYPE_ENC(value, BTF_INFO_ENC(BTF_KIND_DECL_TAG, 0, 0), type), (component_idx) -#define BTF_TYPE_TYPE_TAG_ENC(value, type) \ - BTF_TYPE_ENC(value, BTF_INFO_ENC(BTF_KIND_TYPE_TAG, 0, 0), type) - -#ifndef likely -#define likely(x) __builtin_expect(!!(x), 1) -#endif -#ifndef unlikely -#define unlikely(x) __builtin_expect(!!(x), 0) -#endif -#ifndef min -# define min(x, y) ((x) < (y) ? (x) : (y)) -#endif -#ifndef max -# define max(x, y) ((x) < (y) ? (y) : (x)) -#endif -#ifndef offsetofend -# define offsetofend(TYPE, FIELD) \ - (offsetof(TYPE, FIELD) + sizeof(((TYPE *)0)->FIELD)) -#endif -#ifndef __alias -#define __alias(symbol) __attribute__((alias(#symbol))) -#endif - -/* Check whether a string `str` has prefix `pfx`, regardless if `pfx` is - * a string literal known at compilation time or char * pointer known only at - * runtime. - */ -#define str_has_pfx(str, pfx) \ - (strncmp(str, pfx, __builtin_constant_p(pfx) ? sizeof(pfx) - 1 : strlen(pfx)) == 0) - -/* suffix check */ -static inline bool str_has_sfx(const char *str, const char *sfx) -{ - size_t str_len = strlen(str); - size_t sfx_len = strlen(sfx); - - if (sfx_len <= str_len) - return strcmp(str + str_len - sfx_len, sfx); - return false; -} - -/* Symbol versioning is different between static and shared library. - * Properly versioned symbols are needed for shared library, but - * only the symbol of the new version is needed for static library. - * Starting with GNU C 10, use symver attribute instead of .symver assembler - * directive, which works better with GCC LTO builds. - */ -#if defined(SHARED) && defined(__GNUC__) && __GNUC__ >= 10 - -#define DEFAULT_VERSION(internal_name, api_name, version) \ - __attribute__((symver(#api_name "@@" #version))) -#define COMPAT_VERSION(internal_name, api_name, version) \ - __attribute__((symver(#api_name "@" #version))) - -#elif defined(SHARED) - -#define COMPAT_VERSION(internal_name, api_name, version) \ - asm(".symver " #internal_name "," #api_name "@" #version); -#define DEFAULT_VERSION(internal_name, api_name, version) \ - asm(".symver " #internal_name "," #api_name "@@" #version); - -#else /* !SHARED */ - -#define COMPAT_VERSION(internal_name, api_name, version) -#define DEFAULT_VERSION(internal_name, api_name, version) \ - extern typeof(internal_name) api_name \ - __attribute__((alias(#internal_name))); - -#endif - -extern void libbpf_print(enum libbpf_print_level level, - const char *format, ...) - __attribute__((format(printf, 2, 3))); - -#define __pr(level, fmt, ...) \ -do { \ - libbpf_print(level, "libbpf: " fmt, ##__VA_ARGS__); \ -} while (0) - -#define pr_warn(fmt, ...) __pr(LIBBPF_WARN, fmt, ##__VA_ARGS__) -#define pr_info(fmt, ...) __pr(LIBBPF_INFO, fmt, ##__VA_ARGS__) -#define pr_debug(fmt, ...) __pr(LIBBPF_DEBUG, fmt, ##__VA_ARGS__) - -#ifndef __has_builtin -#define __has_builtin(x) 0 -#endif - -struct bpf_link { - int (*detach)(struct bpf_link *link); - void (*dealloc)(struct bpf_link *link); - char *pin_path; /* NULL, if not pinned */ - int fd; /* hook FD, -1 if not applicable */ - bool disconnected; -}; - -/* - * Re-implement glibc's reallocarray() for libbpf internal-only use. - * reallocarray(), unfortunately, is not available in all versions of glibc, - * so requires extra feature detection and using reallocarray() stub from - * and COMPAT_NEED_REALLOCARRAY. All this complicates - * build of libbpf unnecessarily and is just a maintenance burden. Instead, - * it's trivial to implement libbpf-specific internal version and use it - * throughout libbpf. - */ -static inline void *libbpf_reallocarray(void *ptr, size_t nmemb, size_t size) -{ - size_t total; - -#if __has_builtin(__builtin_mul_overflow) - if (unlikely(__builtin_mul_overflow(nmemb, size, &total))) - return NULL; -#else - if (size == 0 || nmemb > ULONG_MAX / size) - return NULL; - total = nmemb * size; -#endif - return realloc(ptr, total); -} - -/* Copy up to sz - 1 bytes from zero-terminated src string and ensure that dst - * is zero-terminated string no matter what (unless sz == 0, in which case - * it's a no-op). It's conceptually close to FreeBSD's strlcpy(), but differs - * in what is returned. Given this is internal helper, it's trivial to extend - * this, when necessary. Use this instead of strncpy inside libbpf source code. - */ -static inline void libbpf_strlcpy(char *dst, const char *src, size_t sz) -{ - size_t i; - - if (sz == 0) - return; - - sz--; - for (i = 0; i < sz && src[i]; i++) - dst[i] = src[i]; - dst[i] = '\0'; -} - -__u32 get_kernel_version(void); - -struct btf; -struct btf_type; - -struct btf_type *btf_type_by_id(const struct btf *btf, __u32 type_id); -const char *btf_kind_str(const struct btf_type *t); -const struct btf_type *skip_mods_and_typedefs(const struct btf *btf, __u32 id, __u32 *res_id); - -static inline enum btf_func_linkage btf_func_linkage(const struct btf_type *t) -{ - return (enum btf_func_linkage)(int)btf_vlen(t); -} - -static inline __u32 btf_type_info(int kind, int vlen, int kflag) -{ - return (kflag << 31) | (kind << 24) | vlen; -} - -enum map_def_parts { - MAP_DEF_MAP_TYPE = 0x001, - MAP_DEF_KEY_TYPE = 0x002, - MAP_DEF_KEY_SIZE = 0x004, - MAP_DEF_VALUE_TYPE = 0x008, - MAP_DEF_VALUE_SIZE = 0x010, - MAP_DEF_MAX_ENTRIES = 0x020, - MAP_DEF_MAP_FLAGS = 0x040, - MAP_DEF_NUMA_NODE = 0x080, - MAP_DEF_PINNING = 0x100, - MAP_DEF_INNER_MAP = 0x200, - MAP_DEF_MAP_EXTRA = 0x400, - - MAP_DEF_ALL = 0x7ff, /* combination of all above */ -}; - -struct btf_map_def { - enum map_def_parts parts; - __u32 map_type; - __u32 key_type_id; - __u32 key_size; - __u32 value_type_id; - __u32 value_size; - __u32 max_entries; - __u32 map_flags; - __u32 numa_node; - __u32 pinning; - __u64 map_extra; -}; - -int parse_btf_map_def(const char *map_name, struct btf *btf, - const struct btf_type *def_t, bool strict, - struct btf_map_def *map_def, struct btf_map_def *inner_def); - -void *libbpf_add_mem(void **data, size_t *cap_cnt, size_t elem_sz, - size_t cur_cnt, size_t max_cnt, size_t add_cnt); -int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t need_cnt); - -static inline bool libbpf_is_mem_zeroed(const char *p, ssize_t len) -{ - while (len > 0) { - if (*p) - return false; - p++; - len--; - } - return true; -} - -static inline bool libbpf_validate_opts(const char *opts, - size_t opts_sz, size_t user_sz, - const char *type_name) -{ - if (user_sz < sizeof(size_t)) { - pr_warn("%s size (%zu) is too small\n", type_name, user_sz); - return false; - } - if (!libbpf_is_mem_zeroed(opts + opts_sz, (ssize_t)user_sz - opts_sz)) { - pr_warn("%s has non-zero extra bytes\n", type_name); - return false; - } - return true; -} - -#define OPTS_VALID(opts, type) \ - (!(opts) || libbpf_validate_opts((const char *)opts, \ - offsetofend(struct type, \ - type##__last_field), \ - (opts)->sz, #type)) -#define OPTS_HAS(opts, field) \ - ((opts) && opts->sz >= offsetofend(typeof(*(opts)), field)) -#define OPTS_GET(opts, field, fallback_value) \ - (OPTS_HAS(opts, field) ? (opts)->field : fallback_value) -#define OPTS_SET(opts, field, value) \ - do { \ - if (OPTS_HAS(opts, field)) \ - (opts)->field = value; \ - } while (0) - -#define OPTS_ZEROED(opts, last_nonzero_field) \ -({ \ - ssize_t __off = offsetofend(typeof(*(opts)), last_nonzero_field); \ - !(opts) || libbpf_is_mem_zeroed((const void *)opts + __off, \ - (opts)->sz - __off); \ -}) - -enum kern_feature_id { - /* v4.14: kernel support for program & map names. */ - FEAT_PROG_NAME, - /* v5.2: kernel support for global data sections. */ - FEAT_GLOBAL_DATA, - /* BTF support */ - FEAT_BTF, - /* BTF_KIND_FUNC and BTF_KIND_FUNC_PROTO support */ - FEAT_BTF_FUNC, - /* BTF_KIND_VAR and BTF_KIND_DATASEC support */ - FEAT_BTF_DATASEC, - /* BTF_FUNC_GLOBAL is supported */ - FEAT_BTF_GLOBAL_FUNC, - /* BPF_F_MMAPABLE is supported for arrays */ - FEAT_ARRAY_MMAP, - /* kernel support for expected_attach_type in BPF_PROG_LOAD */ - FEAT_EXP_ATTACH_TYPE, - /* bpf_probe_read_{kernel,user}[_str] helpers */ - FEAT_PROBE_READ_KERN, - /* BPF_PROG_BIND_MAP is supported */ - FEAT_PROG_BIND_MAP, - /* Kernel support for module BTFs */ - FEAT_MODULE_BTF, - /* BTF_KIND_FLOAT support */ - FEAT_BTF_FLOAT, - /* BPF perf link support */ - FEAT_PERF_LINK, - /* BTF_KIND_DECL_TAG support */ - FEAT_BTF_DECL_TAG, - /* BTF_KIND_TYPE_TAG support */ - FEAT_BTF_TYPE_TAG, - /* memcg-based accounting for BPF maps and progs */ - FEAT_MEMCG_ACCOUNT, - /* BPF cookie (bpf_get_attach_cookie() BPF helper) support */ - FEAT_BPF_COOKIE, - /* BTF_KIND_ENUM64 support and BTF_KIND_ENUM kflag support */ - FEAT_BTF_ENUM64, - __FEAT_CNT, -}; - -int probe_memcg_account(void); -bool kernel_supports(const struct bpf_object *obj, enum kern_feature_id feat_id); -int bump_rlimit_memlock(void); - -int parse_cpu_mask_str(const char *s, bool **mask, int *mask_sz); -int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz); -int libbpf__load_raw_btf(const char *raw_types, size_t types_len, - const char *str_sec, size_t str_len); -int btf_load_into_kernel(struct btf *btf, char *log_buf, size_t log_sz, __u32 log_level); - -struct btf *btf_get_from_fd(int btf_fd, struct btf *base_btf); -void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type, - const char **prefix, int *kind); - -struct btf_ext_info { - /* - * info points to the individual info section (e.g. func_info and - * line_info) from the .BTF.ext. It does not include the __u32 rec_size. - */ - void *info; - __u32 rec_size; - __u32 len; - /* optional (maintained internally by libbpf) mapping between .BTF.ext - * section and corresponding ELF section. This is used to join - * information like CO-RE relocation records with corresponding BPF - * programs defined in ELF sections - */ - __u32 *sec_idxs; - int sec_cnt; -}; - -#define for_each_btf_ext_sec(seg, sec) \ - for (sec = (seg)->info; \ - (void *)sec < (seg)->info + (seg)->len; \ - sec = (void *)sec + sizeof(struct btf_ext_info_sec) + \ - (seg)->rec_size * sec->num_info) - -#define for_each_btf_ext_rec(seg, sec, i, rec) \ - for (i = 0, rec = (void *)&(sec)->data; \ - i < (sec)->num_info; \ - i++, rec = (void *)rec + (seg)->rec_size) - -/* - * The .BTF.ext ELF section layout defined as - * struct btf_ext_header - * func_info subsection - * - * The func_info subsection layout: - * record size for struct bpf_func_info in the func_info subsection - * struct btf_sec_func_info for section #1 - * a list of bpf_func_info records for section #1 - * where struct bpf_func_info mimics one in include/uapi/linux/bpf.h - * but may not be identical - * struct btf_sec_func_info for section #2 - * a list of bpf_func_info records for section #2 - * ...... - * - * Note that the bpf_func_info record size in .BTF.ext may not - * be the same as the one defined in include/uapi/linux/bpf.h. - * The loader should ensure that record_size meets minimum - * requirement and pass the record as is to the kernel. The - * kernel will handle the func_info properly based on its contents. - */ -struct btf_ext_header { - __u16 magic; - __u8 version; - __u8 flags; - __u32 hdr_len; - - /* All offsets are in bytes relative to the end of this header */ - __u32 func_info_off; - __u32 func_info_len; - __u32 line_info_off; - __u32 line_info_len; - - /* optional part of .BTF.ext header */ - __u32 core_relo_off; - __u32 core_relo_len; -}; - -struct btf_ext { - union { - struct btf_ext_header *hdr; - void *data; - }; - struct btf_ext_info func_info; - struct btf_ext_info line_info; - struct btf_ext_info core_relo_info; - __u32 data_size; -}; - -struct btf_ext_info_sec { - __u32 sec_name_off; - __u32 num_info; - /* Followed by num_info * record_size number of bytes */ - __u8 data[]; -}; - -/* The minimum bpf_func_info checked by the loader */ -struct bpf_func_info_min { - __u32 insn_off; - __u32 type_id; -}; - -/* The minimum bpf_line_info checked by the loader */ -struct bpf_line_info_min { - __u32 insn_off; - __u32 file_name_off; - __u32 line_off; - __u32 line_col; -}; - - -typedef int (*type_id_visit_fn)(__u32 *type_id, void *ctx); -typedef int (*str_off_visit_fn)(__u32 *str_off, void *ctx); -int btf_type_visit_type_ids(struct btf_type *t, type_id_visit_fn visit, void *ctx); -int btf_type_visit_str_offs(struct btf_type *t, str_off_visit_fn visit, void *ctx); -int btf_ext_visit_type_ids(struct btf_ext *btf_ext, type_id_visit_fn visit, void *ctx); -int btf_ext_visit_str_offs(struct btf_ext *btf_ext, str_off_visit_fn visit, void *ctx); -__s32 btf__find_by_name_kind_own(const struct btf *btf, const char *type_name, - __u32 kind); - -typedef int (*kallsyms_cb_t)(unsigned long long sym_addr, char sym_type, - const char *sym_name, void *ctx); - -int libbpf_kallsyms_parse(kallsyms_cb_t cb, void *arg); - -/* handle direct returned errors */ -static inline int libbpf_err(int ret) -{ - if (ret < 0) - errno = -ret; - return ret; -} - -/* handle errno-based (e.g., syscall or libc) errors according to libbpf's - * strict mode settings - */ -static inline int libbpf_err_errno(int ret) -{ - /* errno is already assumed to be set on error */ - return ret < 0 ? -errno : ret; -} - -/* handle error for pointer-returning APIs, err is assumed to be < 0 always */ -static inline void *libbpf_err_ptr(int err) -{ - /* set errno on error, this doesn't break anything */ - errno = -err; - return NULL; -} - -/* handle pointer-returning APIs' error handling */ -static inline void *libbpf_ptr(void *ret) -{ - /* set errno on error, this doesn't break anything */ - if (IS_ERR(ret)) - errno = -PTR_ERR(ret); - - return IS_ERR(ret) ? NULL : ret; -} - -static inline bool str_is_empty(const char *s) -{ - return !s || !s[0]; -} - -static inline bool is_ldimm64_insn(struct bpf_insn *insn) -{ - return insn->code == (BPF_LD | BPF_IMM | BPF_DW); -} - -/* if fd is stdin, stdout, or stderr, dup to a fd greater than 2 - * Takes ownership of the fd passed in, and closes it if calling - * fcntl(fd, F_DUPFD_CLOEXEC, 3). - */ -static inline int ensure_good_fd(int fd) -{ - int old_fd = fd, saved_errno; - - if (fd < 0) - return fd; - if (fd < 3) { - fd = fcntl(fd, F_DUPFD_CLOEXEC, 3); - saved_errno = errno; - close(old_fd); - if (fd < 0) { - pr_warn("failed to dup FD %d to FD > 2: %d\n", old_fd, -saved_errno); - errno = saved_errno; - } - } - return fd; -} - -/* The following two functions are exposed to bpftool */ -int bpf_core_add_cands(struct bpf_core_cand *local_cand, - size_t local_essent_len, - const struct btf *targ_btf, - const char *targ_btf_name, - int targ_start_id, - struct bpf_core_cand_list *cands); -void bpf_core_free_cands(struct bpf_core_cand_list *cands); - -struct usdt_manager *usdt_manager_new(struct bpf_object *obj); -void usdt_manager_free(struct usdt_manager *man); -struct bpf_link * usdt_manager_attach_usdt(struct usdt_manager *man, - const struct bpf_program *prog, - pid_t pid, const char *path, - const char *usdt_provider, const char *usdt_name, - __u64 usdt_cookie); - -static inline bool is_pow_of_2(size_t x) -{ - return x && (x & (x - 1)) == 0; -} - -#endif /* __LIBBPF_LIBBPF_INTERNAL_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_legacy.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_legacy.h deleted file mode 100644 index bb44cd3..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_legacy.h +++ /dev/null @@ -1,138 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -/* - * Libbpf legacy APIs (either discouraged or deprecated, as mentioned in [0]) - * - * [0] https://docs.google.com/document/d/1UyjTZuPFWiPFyKk1tV5an11_iaRuec6U-ZESZ54nNTY - * - * Copyright (C) 2021 Facebook - */ -#ifndef __LIBBPF_LEGACY_BPF_H -#define __LIBBPF_LEGACY_BPF_H - -#include -#include -#include -#include -#include "libbpf_common.h" - -#ifdef __cplusplus -extern "C" { -#endif - -/* As of libbpf 1.0 libbpf_set_strict_mode() and enum libbpf_struct_mode have - * no effect. But they are left in libbpf_legacy.h so that applications that - * prepared for libbpf 1.0 before final release by using - * libbpf_set_strict_mode() still work with libbpf 1.0+ without any changes. - */ -enum libbpf_strict_mode { - /* Turn on all supported strict features of libbpf to simulate libbpf - * v1.0 behavior. - * This will be the default behavior in libbpf v1.0. - */ - LIBBPF_STRICT_ALL = 0xffffffff, - - /* - * Disable any libbpf 1.0 behaviors. This is the default before libbpf - * v1.0. It won't be supported anymore in v1.0, please update your - * code so that it handles LIBBPF_STRICT_ALL mode before libbpf v1.0. - */ - LIBBPF_STRICT_NONE = 0x00, - /* - * Return NULL pointers on error, not ERR_PTR(err). - * Additionally, libbpf also always sets errno to corresponding Exx - * (positive) error code. - */ - LIBBPF_STRICT_CLEAN_PTRS = 0x01, - /* - * Return actual error codes from low-level APIs directly, not just -1. - * Additionally, libbpf also always sets errno to corresponding Exx - * (positive) error code. - */ - LIBBPF_STRICT_DIRECT_ERRS = 0x02, - /* - * Enforce strict BPF program section (SEC()) names. - * E.g., while prefiously SEC("xdp_whatever") or SEC("perf_event_blah") were - * allowed, with LIBBPF_STRICT_SEC_PREFIX this will become - * unrecognized by libbpf and would have to be just SEC("xdp") and - * SEC("xdp") and SEC("perf_event"). - * - * Note, in this mode the program pin path will be based on the - * function name instead of section name. - * - * Additionally, routines in the .text section are always considered - * sub-programs. Legacy behavior allows for a single routine in .text - * to be a program. - */ - LIBBPF_STRICT_SEC_NAME = 0x04, - /* - * Disable the global 'bpf_objects_list'. Maintaining this list adds - * a race condition to bpf_object__open() and bpf_object__close(). - * Clients can maintain it on their own if it is valuable for them. - */ - LIBBPF_STRICT_NO_OBJECT_LIST = 0x08, - /* - * Automatically bump RLIMIT_MEMLOCK using setrlimit() before the - * first BPF program or map creation operation. This is done only if - * kernel is too old to support memcg-based memory accounting for BPF - * subsystem. By default, RLIMIT_MEMLOCK limit is set to RLIM_INFINITY, - * but it can be overriden with libbpf_set_memlock_rlim() API. - * Note that libbpf_set_memlock_rlim() needs to be called before - * the very first bpf_prog_load(), bpf_map_create() or bpf_object__load() - * operation. - */ - LIBBPF_STRICT_AUTO_RLIMIT_MEMLOCK = 0x10, - /* - * Error out on any SEC("maps") map definition, which are deprecated - * in favor of BTF-defined map definitions in SEC(".maps"). - */ - LIBBPF_STRICT_MAP_DEFINITIONS = 0x20, - - __LIBBPF_STRICT_LAST, -}; - -LIBBPF_API int libbpf_set_strict_mode(enum libbpf_strict_mode mode); - -/** - * @brief **libbpf_get_error()** extracts the error code from the passed - * pointer - * @param ptr pointer returned from libbpf API function - * @return error code; or 0 if no error occured - * - * Note, as of libbpf 1.0 this function is not necessary and not recommended - * to be used. Libbpf doesn't return error code embedded into the pointer - * itself. Instead, NULL is returned on error and error code is passed through - * thread-local errno variable. **libbpf_get_error()** is just returning -errno - * value if it receives NULL, which is correct only if errno hasn't been - * modified between libbpf API call and corresponding **libbpf_get_error()** - * call. Prefer to check return for NULL and use errno directly. - * - * This API is left in libbpf 1.0 to allow applications that were 1.0-ready - * before final libbpf 1.0 without needing to change them. - */ -LIBBPF_API long libbpf_get_error(const void *ptr); - -#define DECLARE_LIBBPF_OPTS LIBBPF_OPTS - -/* "Discouraged" APIs which don't follow consistent libbpf naming patterns. - * They are normally a trivial aliases or wrappers for proper APIs and are - * left to minimize unnecessary disruption for users of libbpf. But they - * shouldn't be used going forward. - */ - -struct bpf_program; -struct bpf_map; -struct btf; -struct btf_ext; - -LIBBPF_API enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog); -LIBBPF_API enum bpf_attach_type bpf_program__get_expected_attach_type(const struct bpf_program *prog); -LIBBPF_API const char *bpf_map__get_pin_path(const struct bpf_map *map); -LIBBPF_API const void *btf__get_raw_data(const struct btf *btf, __u32 *size); -LIBBPF_API const void *btf_ext__get_raw_data(const struct btf_ext *btf_ext, __u32 *size); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* __LIBBPF_LEGACY_BPF_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_version.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_version.h deleted file mode 100644 index d88e9f8..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/libbpf_version.h +++ /dev/null @@ -1,9 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -/* Copyright (C) 2021 Facebook */ -#ifndef __LIBBPF_VERSION_H -#define __LIBBPF_VERSION_H - -#define LIBBPF_MAJOR_VERSION 1 -#define LIBBPF_MINOR_VERSION 0 - -#endif /* __LIBBPF_VERSION_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/nlattr.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/nlattr.h deleted file mode 100644 index 3544b8a..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/nlattr.h +++ /dev/null @@ -1,164 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -/* - * NETLINK Netlink attributes - * - * Copyright (c) 2003-2013 Thomas Graf - */ - -#ifndef __LIBBPF_NLATTR_H -#define __LIBBPF_NLATTR_H - -#include -#include -#include -#include -#include - -/* avoid multiple definition of netlink features */ -#define __LINUX_NETLINK_H - -/** - * Standard attribute types to specify validation policy - */ -enum { - LIBBPF_NLA_UNSPEC, /**< Unspecified type, binary data chunk */ - LIBBPF_NLA_U8, /**< 8 bit integer */ - LIBBPF_NLA_U16, /**< 16 bit integer */ - LIBBPF_NLA_U32, /**< 32 bit integer */ - LIBBPF_NLA_U64, /**< 64 bit integer */ - LIBBPF_NLA_STRING, /**< NUL terminated character string */ - LIBBPF_NLA_FLAG, /**< Flag */ - LIBBPF_NLA_MSECS, /**< Micro seconds (64bit) */ - LIBBPF_NLA_NESTED, /**< Nested attributes */ - __LIBBPF_NLA_TYPE_MAX, -}; - -#define LIBBPF_NLA_TYPE_MAX (__LIBBPF_NLA_TYPE_MAX - 1) - -/** - * @ingroup attr - * Attribute validation policy. - * - * See section @core_doc{core_attr_parse,Attribute Parsing} for more details. - */ -struct libbpf_nla_policy { - /** Type of attribute or LIBBPF_NLA_UNSPEC */ - uint16_t type; - - /** Minimal length of payload required */ - uint16_t minlen; - - /** Maximal length of payload allowed */ - uint16_t maxlen; -}; - -struct libbpf_nla_req { - struct nlmsghdr nh; - union { - struct ifinfomsg ifinfo; - struct tcmsg tc; - }; - char buf[128]; -}; - -/** - * @ingroup attr - * Iterate over a stream of attributes - * @arg pos loop counter, set to current attribute - * @arg head head of attribute stream - * @arg len length of attribute stream - * @arg rem initialized to len, holds bytes currently remaining in stream - */ -#define libbpf_nla_for_each_attr(pos, head, len, rem) \ - for (pos = head, rem = len; \ - nla_ok(pos, rem); \ - pos = nla_next(pos, &(rem))) - -/** - * libbpf_nla_data - head of payload - * @nla: netlink attribute - */ -static inline void *libbpf_nla_data(const struct nlattr *nla) -{ - return (void *)nla + NLA_HDRLEN; -} - -static inline uint8_t libbpf_nla_getattr_u8(const struct nlattr *nla) -{ - return *(uint8_t *)libbpf_nla_data(nla); -} - -static inline uint32_t libbpf_nla_getattr_u32(const struct nlattr *nla) -{ - return *(uint32_t *)libbpf_nla_data(nla); -} - -static inline const char *libbpf_nla_getattr_str(const struct nlattr *nla) -{ - return (const char *)libbpf_nla_data(nla); -} - -/** - * libbpf_nla_len - length of payload - * @nla: netlink attribute - */ -static inline int libbpf_nla_len(const struct nlattr *nla) -{ - return nla->nla_len - NLA_HDRLEN; -} - -int libbpf_nla_parse(struct nlattr *tb[], int maxtype, struct nlattr *head, - int len, struct libbpf_nla_policy *policy); -int libbpf_nla_parse_nested(struct nlattr *tb[], int maxtype, - struct nlattr *nla, - struct libbpf_nla_policy *policy); - -int libbpf_nla_dump_errormsg(struct nlmsghdr *nlh); - -static inline struct nlattr *nla_data(struct nlattr *nla) -{ - return (struct nlattr *)((void *)nla + NLA_HDRLEN); -} - -static inline struct nlattr *req_tail(struct libbpf_nla_req *req) -{ - return (struct nlattr *)((void *)req + NLMSG_ALIGN(req->nh.nlmsg_len)); -} - -static inline int nlattr_add(struct libbpf_nla_req *req, int type, - const void *data, int len) -{ - struct nlattr *nla; - - if (NLMSG_ALIGN(req->nh.nlmsg_len) + NLA_ALIGN(NLA_HDRLEN + len) > sizeof(*req)) - return -EMSGSIZE; - if (!!data != !!len) - return -EINVAL; - - nla = req_tail(req); - nla->nla_type = type; - nla->nla_len = NLA_HDRLEN + len; - if (data) - memcpy(nla_data(nla), data, len); - req->nh.nlmsg_len = NLMSG_ALIGN(req->nh.nlmsg_len) + NLA_ALIGN(nla->nla_len); - return 0; -} - -static inline struct nlattr *nlattr_begin_nested(struct libbpf_nla_req *req, int type) -{ - struct nlattr *tail; - - tail = req_tail(req); - if (nlattr_add(req, type | NLA_F_NESTED, NULL, 0)) - return NULL; - return tail; -} - -static inline void nlattr_end_nested(struct libbpf_nla_req *req, - struct nlattr *tail) -{ - tail->nla_len = (void *)req_tail(req) - (void *)tail; -} - -#endif /* __LIBBPF_NLATTR_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/relo_core.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/relo_core.h deleted file mode 100644 index 3454b82..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/relo_core.h +++ /dev/null @@ -1,95 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -/* Copyright (c) 2019 Facebook */ - -#ifndef __RELO_CORE_H -#define __RELO_CORE_H - -#include - -struct bpf_core_cand { - const struct btf *btf; - __u32 id; -}; - -/* dynamically sized list of type IDs and its associated struct btf */ -struct bpf_core_cand_list { - struct bpf_core_cand *cands; - int len; -}; - -#define BPF_CORE_SPEC_MAX_LEN 64 - -/* represents BPF CO-RE field or array element accessor */ -struct bpf_core_accessor { - __u32 type_id; /* struct/union type or array element type */ - __u32 idx; /* field index or array index */ - const char *name; /* field name or NULL for array accessor */ -}; - -struct bpf_core_spec { - const struct btf *btf; - /* high-level spec: named fields and array indices only */ - struct bpf_core_accessor spec[BPF_CORE_SPEC_MAX_LEN]; - /* original unresolved (no skip_mods_or_typedefs) root type ID */ - __u32 root_type_id; - /* CO-RE relocation kind */ - enum bpf_core_relo_kind relo_kind; - /* high-level spec length */ - int len; - /* raw, low-level spec: 1-to-1 with accessor spec string */ - int raw_spec[BPF_CORE_SPEC_MAX_LEN]; - /* raw spec length */ - int raw_len; - /* field bit offset represented by spec */ - __u32 bit_offset; -}; - -struct bpf_core_relo_res { - /* expected value in the instruction, unless validate == false */ - __u64 orig_val; - /* new value that needs to be patched up to */ - __u64 new_val; - /* relocation unsuccessful, poison instruction, but don't fail load */ - bool poison; - /* some relocations can't be validated against orig_val */ - bool validate; - /* for field byte offset relocations or the forms: - * *(T *)(rX + ) = rY - * rX = *(T *)(rY + ), - * we remember original and resolved field size to adjust direct - * memory loads of pointers and integers; this is necessary for 32-bit - * host kernel architectures, but also allows to automatically - * relocate fields that were resized from, e.g., u32 to u64, etc. - */ - bool fail_memsz_adjust; - __u32 orig_sz; - __u32 orig_type_id; - __u32 new_sz; - __u32 new_type_id; -}; - -int __bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, - const struct btf *targ_btf, __u32 targ_id, int level); -int bpf_core_types_are_compat(const struct btf *local_btf, __u32 local_id, - const struct btf *targ_btf, __u32 targ_id); - -size_t bpf_core_essential_name_len(const char *name); - -int bpf_core_calc_relo_insn(const char *prog_name, - const struct bpf_core_relo *relo, int relo_idx, - const struct btf *local_btf, - struct bpf_core_cand_list *cands, - struct bpf_core_spec *specs_scratch, - struct bpf_core_relo_res *targ_res); - -int bpf_core_patch_insn(const char *prog_name, struct bpf_insn *insn, - int insn_idx, const struct bpf_core_relo *relo, - int relo_idx, const struct bpf_core_relo_res *res); - -int bpf_core_parse_spec(const char *prog_name, const struct btf *btf, - const struct bpf_core_relo *relo, - struct bpf_core_spec *spec); - -int bpf_core_format_spec(char *buf, size_t buf_sz, const struct bpf_core_spec *spec); - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/skel_internal.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/skel_internal.h deleted file mode 100644 index 121770f..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/skel_internal.h +++ /dev/null @@ -1,349 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -/* Copyright (c) 2021 Facebook */ -#ifndef __SKEL_INTERNAL_H -#define __SKEL_INTERNAL_H - -#ifdef __KERNEL__ -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#include "bpf.h" -#endif - -#ifndef __NR_bpf -# if defined(__mips__) && defined(_ABIO32) -# define __NR_bpf 4355 -# elif defined(__mips__) && defined(_ABIN32) -# define __NR_bpf 6319 -# elif defined(__mips__) && defined(_ABI64) -# define __NR_bpf 5315 -# endif -#endif - -/* This file is a base header for auto-generated *.lskel.h files. - * Its contents will change and may become part of auto-generation in the future. - * - * The layout of bpf_[map|prog]_desc and bpf_loader_ctx is feature dependent - * and will change from one version of libbpf to another and features - * requested during loader program generation. - */ -struct bpf_map_desc { - /* output of the loader prog */ - int map_fd; - /* input for the loader prog */ - __u32 max_entries; - __aligned_u64 initial_value; -}; -struct bpf_prog_desc { - int prog_fd; -}; - -enum { - BPF_SKEL_KERNEL = (1ULL << 0), -}; - -struct bpf_loader_ctx { - __u32 sz; - __u32 flags; - __u32 log_level; - __u32 log_size; - __u64 log_buf; -}; - -struct bpf_load_and_run_opts { - struct bpf_loader_ctx *ctx; - const void *data; - const void *insns; - __u32 data_sz; - __u32 insns_sz; - const char *errstr; -}; - -long bpf_sys_bpf(__u32 cmd, void *attr, __u32 attr_size); - -static inline int skel_sys_bpf(enum bpf_cmd cmd, union bpf_attr *attr, - unsigned int size) -{ -#ifdef __KERNEL__ - return bpf_sys_bpf(cmd, attr, size); -#else - return syscall(__NR_bpf, cmd, attr, size); -#endif -} - -#ifdef __KERNEL__ -static inline int close(int fd) -{ - return close_fd(fd); -} - -static inline void *skel_alloc(size_t size) -{ - struct bpf_loader_ctx *ctx = kzalloc(size, GFP_KERNEL); - - if (!ctx) - return NULL; - ctx->flags |= BPF_SKEL_KERNEL; - return ctx; -} - -static inline void skel_free(const void *p) -{ - kfree(p); -} - -/* skel->bss/rodata maps are populated the following way: - * - * For kernel use: - * skel_prep_map_data() allocates kernel memory that kernel module can directly access. - * Generated lskel stores the pointer in skel->rodata and in skel->maps.rodata.initial_value. - * The loader program will perform probe_read_kernel() from maps.rodata.initial_value. - * skel_finalize_map_data() sets skel->rodata to point to actual value in a bpf map and - * does maps.rodata.initial_value = ~0ULL to signal skel_free_map_data() that kvfree - * is not nessary. - * - * For user space: - * skel_prep_map_data() mmaps anon memory into skel->rodata that can be accessed directly. - * Generated lskel stores the pointer in skel->rodata and in skel->maps.rodata.initial_value. - * The loader program will perform copy_from_user() from maps.rodata.initial_value. - * skel_finalize_map_data() remaps bpf array map value from the kernel memory into - * skel->rodata address. - * - * The "bpftool gen skeleton -L" command generates lskel.h that is suitable for - * both kernel and user space. The generated loader program does - * either bpf_probe_read_kernel() or bpf_copy_from_user() from initial_value - * depending on bpf_loader_ctx->flags. - */ -static inline void skel_free_map_data(void *p, __u64 addr, size_t sz) -{ - if (addr != ~0ULL) - kvfree(p); - /* When addr == ~0ULL the 'p' points to - * ((struct bpf_array *)map)->value. See skel_finalize_map_data. - */ -} - -static inline void *skel_prep_map_data(const void *val, size_t mmap_sz, size_t val_sz) -{ - void *addr; - - addr = kvmalloc(val_sz, GFP_KERNEL); - if (!addr) - return NULL; - memcpy(addr, val, val_sz); - return addr; -} - -static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int flags, int fd) -{ - struct bpf_map *map; - void *addr = NULL; - - kvfree((void *) (long) *init_val); - *init_val = ~0ULL; - - /* At this point bpf_load_and_run() finished without error and - * 'fd' is a valid bpf map FD. All sanity checks below should succeed. - */ - map = bpf_map_get(fd); - if (IS_ERR(map)) - return NULL; - if (map->map_type != BPF_MAP_TYPE_ARRAY) - goto out; - addr = ((struct bpf_array *)map)->value; - /* the addr stays valid, since FD is not closed */ -out: - bpf_map_put(map); - return addr; -} - -#else - -static inline void *skel_alloc(size_t size) -{ - return calloc(1, size); -} - -static inline void skel_free(void *p) -{ - free(p); -} - -static inline void skel_free_map_data(void *p, __u64 addr, size_t sz) -{ - munmap(p, sz); -} - -static inline void *skel_prep_map_data(const void *val, size_t mmap_sz, size_t val_sz) -{ - void *addr; - - addr = mmap(NULL, mmap_sz, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_ANONYMOUS, -1, 0); - if (addr == (void *) -1) - return NULL; - memcpy(addr, val, val_sz); - return addr; -} - -static inline void *skel_finalize_map_data(__u64 *init_val, size_t mmap_sz, int flags, int fd) -{ - void *addr; - - addr = mmap((void *) (long) *init_val, mmap_sz, flags, MAP_SHARED | MAP_FIXED, fd, 0); - if (addr == (void *) -1) - return NULL; - return addr; -} -#endif - -static inline int skel_closenz(int fd) -{ - if (fd > 0) - return close(fd); - return -EINVAL; -} - -#ifndef offsetofend -#define offsetofend(TYPE, MEMBER) \ - (offsetof(TYPE, MEMBER) + sizeof((((TYPE *)0)->MEMBER))) -#endif - -static inline int skel_map_create(enum bpf_map_type map_type, - const char *map_name, - __u32 key_size, - __u32 value_size, - __u32 max_entries) -{ - const size_t attr_sz = offsetofend(union bpf_attr, map_extra); - union bpf_attr attr; - - memset(&attr, 0, attr_sz); - - attr.map_type = map_type; - strncpy(attr.map_name, map_name, sizeof(attr.map_name)); - attr.key_size = key_size; - attr.value_size = value_size; - attr.max_entries = max_entries; - - return skel_sys_bpf(BPF_MAP_CREATE, &attr, attr_sz); -} - -static inline int skel_map_update_elem(int fd, const void *key, - const void *value, __u64 flags) -{ - const size_t attr_sz = offsetofend(union bpf_attr, flags); - union bpf_attr attr; - - memset(&attr, 0, attr_sz); - attr.map_fd = fd; - attr.key = (long) key; - attr.value = (long) value; - attr.flags = flags; - - return skel_sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, attr_sz); -} - -static inline int skel_raw_tracepoint_open(const char *name, int prog_fd) -{ - const size_t attr_sz = offsetofend(union bpf_attr, raw_tracepoint.prog_fd); - union bpf_attr attr; - - memset(&attr, 0, attr_sz); - attr.raw_tracepoint.name = (long) name; - attr.raw_tracepoint.prog_fd = prog_fd; - - return skel_sys_bpf(BPF_RAW_TRACEPOINT_OPEN, &attr, attr_sz); -} - -static inline int skel_link_create(int prog_fd, int target_fd, - enum bpf_attach_type attach_type) -{ - const size_t attr_sz = offsetofend(union bpf_attr, link_create.iter_info_len); - union bpf_attr attr; - - memset(&attr, 0, attr_sz); - attr.link_create.prog_fd = prog_fd; - attr.link_create.target_fd = target_fd; - attr.link_create.attach_type = attach_type; - - return skel_sys_bpf(BPF_LINK_CREATE, &attr, attr_sz); -} - -#ifdef __KERNEL__ -#define set_err -#else -#define set_err err = -errno -#endif - -static inline int bpf_load_and_run(struct bpf_load_and_run_opts *opts) -{ - int map_fd = -1, prog_fd = -1, key = 0, err; - union bpf_attr attr; - - err = map_fd = skel_map_create(BPF_MAP_TYPE_ARRAY, "__loader.map", 4, opts->data_sz, 1); - if (map_fd < 0) { - opts->errstr = "failed to create loader map"; - set_err; - goto out; - } - - err = skel_map_update_elem(map_fd, &key, opts->data, 0); - if (err < 0) { - opts->errstr = "failed to update loader map"; - set_err; - goto out; - } - - memset(&attr, 0, sizeof(attr)); - attr.prog_type = BPF_PROG_TYPE_SYSCALL; - attr.insns = (long) opts->insns; - attr.insn_cnt = opts->insns_sz / sizeof(struct bpf_insn); - attr.license = (long) "Dual BSD/GPL"; - memcpy(attr.prog_name, "__loader.prog", sizeof("__loader.prog")); - attr.fd_array = (long) &map_fd; - attr.log_level = opts->ctx->log_level; - attr.log_size = opts->ctx->log_size; - attr.log_buf = opts->ctx->log_buf; - attr.prog_flags = BPF_F_SLEEPABLE; - err = prog_fd = skel_sys_bpf(BPF_PROG_LOAD, &attr, sizeof(attr)); - if (prog_fd < 0) { - opts->errstr = "failed to load loader prog"; - set_err; - goto out; - } - - memset(&attr, 0, sizeof(attr)); - attr.test.prog_fd = prog_fd; - attr.test.ctx_in = (long) opts->ctx; - attr.test.ctx_size_in = opts->ctx->sz; - err = skel_sys_bpf(BPF_PROG_RUN, &attr, sizeof(attr)); - if (err < 0 || (int)attr.test.retval < 0) { - opts->errstr = "failed to execute loader prog"; - if (err < 0) { - set_err; - } else { - err = (int)attr.test.retval; -#ifndef __KERNEL__ - errno = -err; -#endif - } - goto out; - } - err = 0; -out: - if (map_fd >= 0) - close(map_fd); - if (prog_fd >= 0) - close(prog_fd); - return err; -} - -#endif diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/str_error.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/str_error.h deleted file mode 100644 index 2fde037..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/str_error.h +++ /dev/null @@ -1,6 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -#ifndef __LIBBPF_STR_ERROR_H -#define __LIBBPF_STR_ERROR_H - -char *libbpf_strerror_r(int err, char *dst, int len); -#endif /* __LIBBPF_STR_ERROR_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/strset.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/strset.h deleted file mode 100644 index 71a3e50..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/strset.h +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ - -/* Copyright (c) 2021 Facebook */ -#ifndef __LIBBPF_STRSET_H -#define __LIBBPF_STRSET_H - -#include -#include - -struct strset; - -struct strset *strset__new(size_t max_data_sz, const char *init_data, size_t init_data_sz); -void strset__free(struct strset *set); - -const char *strset__data(const struct strset *set); -size_t strset__data_size(const struct strset *set); - -int strset__find_str(struct strset *set, const char *s); -int strset__add_str(struct strset *set, const char *s); - -#endif /* __LIBBPF_STRSET_H */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/usdt.bpf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/usdt.bpf.h deleted file mode 100644 index 707bb48..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/libbpf/src/usdt.bpf.h +++ /dev/null @@ -1,259 +0,0 @@ -/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ -/* Copyright (c) 2022 Meta Platforms, Inc. and affiliates. */ -#ifndef __USDT_BPF_H__ -#define __USDT_BPF_H__ - -#include -#include -#include -#include - -/* Below types and maps are internal implementation details of libbpf's USDT - * support and are subjects to change. Also, bpf_usdt_xxx() API helpers should - * be considered an unstable API as well and might be adjusted based on user - * feedback from using libbpf's USDT support in production. - */ - -/* User can override BPF_USDT_MAX_SPEC_CNT to change default size of internal - * map that keeps track of USDT argument specifications. This might be - * necessary if there are a lot of USDT attachments. - */ -#ifndef BPF_USDT_MAX_SPEC_CNT -#define BPF_USDT_MAX_SPEC_CNT 256 -#endif -/* User can override BPF_USDT_MAX_IP_CNT to change default size of internal - * map that keeps track of IP (memory address) mapping to USDT argument - * specification. - * Note, if kernel supports BPF cookies, this map is not used and could be - * resized all the way to 1 to save a bit of memory. - */ -#ifndef BPF_USDT_MAX_IP_CNT -#define BPF_USDT_MAX_IP_CNT (4 * BPF_USDT_MAX_SPEC_CNT) -#endif -/* We use BPF CO-RE to detect support for BPF cookie from BPF side. This is - * the only dependency on CO-RE, so if it's undesirable, user can override - * BPF_USDT_HAS_BPF_COOKIE to specify whether to BPF cookie is supported or not. - */ -#ifndef BPF_USDT_HAS_BPF_COOKIE -#define BPF_USDT_HAS_BPF_COOKIE \ - bpf_core_enum_value_exists(enum bpf_func_id___usdt, BPF_FUNC_get_attach_cookie___usdt) -#endif - -enum __bpf_usdt_arg_type { - BPF_USDT_ARG_CONST, - BPF_USDT_ARG_REG, - BPF_USDT_ARG_REG_DEREF, -}; - -struct __bpf_usdt_arg_spec { - /* u64 scalar interpreted depending on arg_type, see below */ - __u64 val_off; - /* arg location case, see bpf_udst_arg() for details */ - enum __bpf_usdt_arg_type arg_type; - /* offset of referenced register within struct pt_regs */ - short reg_off; - /* whether arg should be interpreted as signed value */ - bool arg_signed; - /* number of bits that need to be cleared and, optionally, - * sign-extended to cast arguments that are 1, 2, or 4 bytes - * long into final 8-byte u64/s64 value returned to user - */ - char arg_bitshift; -}; - -/* should match USDT_MAX_ARG_CNT in usdt.c exactly */ -#define BPF_USDT_MAX_ARG_CNT 12 -struct __bpf_usdt_spec { - struct __bpf_usdt_arg_spec args[BPF_USDT_MAX_ARG_CNT]; - __u64 usdt_cookie; - short arg_cnt; -}; - -struct { - __uint(type, BPF_MAP_TYPE_ARRAY); - __uint(max_entries, BPF_USDT_MAX_SPEC_CNT); - __type(key, int); - __type(value, struct __bpf_usdt_spec); -} __bpf_usdt_specs SEC(".maps") __weak; - -struct { - __uint(type, BPF_MAP_TYPE_HASH); - __uint(max_entries, BPF_USDT_MAX_IP_CNT); - __type(key, long); - __type(value, __u32); -} __bpf_usdt_ip_to_spec_id SEC(".maps") __weak; - -/* don't rely on user's BPF code to have latest definition of bpf_func_id */ -enum bpf_func_id___usdt { - BPF_FUNC_get_attach_cookie___usdt = 0xBAD, /* value doesn't matter */ -}; - -static __always_inline -int __bpf_usdt_spec_id(struct pt_regs *ctx) -{ - if (!BPF_USDT_HAS_BPF_COOKIE) { - long ip = PT_REGS_IP(ctx); - int *spec_id_ptr; - - spec_id_ptr = bpf_map_lookup_elem(&__bpf_usdt_ip_to_spec_id, &ip); - return spec_id_ptr ? *spec_id_ptr : -ESRCH; - } - - return bpf_get_attach_cookie(ctx); -} - -/* Return number of USDT arguments defined for currently traced USDT. */ -__weak __hidden -int bpf_usdt_arg_cnt(struct pt_regs *ctx) -{ - struct __bpf_usdt_spec *spec; - int spec_id; - - spec_id = __bpf_usdt_spec_id(ctx); - if (spec_id < 0) - return -ESRCH; - - spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); - if (!spec) - return -ESRCH; - - return spec->arg_cnt; -} - -/* Fetch USDT argument #*arg_num* (zero-indexed) and put its value into *res. - * Returns 0 on success; negative error, otherwise. - * On error *res is guaranteed to be set to zero. - */ -__weak __hidden -int bpf_usdt_arg(struct pt_regs *ctx, __u64 arg_num, long *res) -{ - struct __bpf_usdt_spec *spec; - struct __bpf_usdt_arg_spec *arg_spec; - unsigned long val; - int err, spec_id; - - *res = 0; - - spec_id = __bpf_usdt_spec_id(ctx); - if (spec_id < 0) - return -ESRCH; - - spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); - if (!spec) - return -ESRCH; - - if (arg_num >= BPF_USDT_MAX_ARG_CNT || arg_num >= spec->arg_cnt) - return -ENOENT; - - arg_spec = &spec->args[arg_num]; - switch (arg_spec->arg_type) { - case BPF_USDT_ARG_CONST: - /* Arg is just a constant ("-4@$-9" in USDT arg spec). - * value is recorded in arg_spec->val_off directly. - */ - val = arg_spec->val_off; - break; - case BPF_USDT_ARG_REG: - /* Arg is in a register (e.g, "8@%rax" in USDT arg spec), - * so we read the contents of that register directly from - * struct pt_regs. To keep things simple user-space parts - * record offsetof(struct pt_regs, ) in arg_spec->reg_off. - */ - err = bpf_probe_read_kernel(&val, sizeof(val), (void *)ctx + arg_spec->reg_off); - if (err) - return err; - break; - case BPF_USDT_ARG_REG_DEREF: - /* Arg is in memory addressed by register, plus some offset - * (e.g., "-4@-1204(%rbp)" in USDT arg spec). Register is - * identified like with BPF_USDT_ARG_REG case, and the offset - * is in arg_spec->val_off. We first fetch register contents - * from pt_regs, then do another user-space probe read to - * fetch argument value itself. - */ - err = bpf_probe_read_kernel(&val, sizeof(val), (void *)ctx + arg_spec->reg_off); - if (err) - return err; - err = bpf_probe_read_user(&val, sizeof(val), (void *)val + arg_spec->val_off); - if (err) - return err; -#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ - val >>= arg_spec->arg_bitshift; -#endif - break; - default: - return -EINVAL; - } - - /* cast arg from 1, 2, or 4 bytes to final 8 byte size clearing - * necessary upper arg_bitshift bits, with sign extension if argument - * is signed - */ - val <<= arg_spec->arg_bitshift; - if (arg_spec->arg_signed) - val = ((long)val) >> arg_spec->arg_bitshift; - else - val = val >> arg_spec->arg_bitshift; - *res = val; - return 0; -} - -/* Retrieve user-specified cookie value provided during attach as - * bpf_usdt_opts.usdt_cookie. This serves the same purpose as BPF cookie - * returned by bpf_get_attach_cookie(). Libbpf's support for USDT is itself - * utilizing BPF cookies internally, so user can't use BPF cookie directly - * for USDT programs and has to use bpf_usdt_cookie() API instead. - */ -__weak __hidden -long bpf_usdt_cookie(struct pt_regs *ctx) -{ - struct __bpf_usdt_spec *spec; - int spec_id; - - spec_id = __bpf_usdt_spec_id(ctx); - if (spec_id < 0) - return 0; - - spec = bpf_map_lookup_elem(&__bpf_usdt_specs, &spec_id); - if (!spec) - return 0; - - return spec->usdt_cookie; -} - -/* we rely on ___bpf_apply() and ___bpf_narg() macros already defined in bpf_tracing.h */ -#define ___bpf_usdt_args0() ctx -#define ___bpf_usdt_args1(x) ___bpf_usdt_args0(), ({ long _x; bpf_usdt_arg(ctx, 0, &_x); (void *)_x; }) -#define ___bpf_usdt_args2(x, args...) ___bpf_usdt_args1(args), ({ long _x; bpf_usdt_arg(ctx, 1, &_x); (void *)_x; }) -#define ___bpf_usdt_args3(x, args...) ___bpf_usdt_args2(args), ({ long _x; bpf_usdt_arg(ctx, 2, &_x); (void *)_x; }) -#define ___bpf_usdt_args4(x, args...) ___bpf_usdt_args3(args), ({ long _x; bpf_usdt_arg(ctx, 3, &_x); (void *)_x; }) -#define ___bpf_usdt_args5(x, args...) ___bpf_usdt_args4(args), ({ long _x; bpf_usdt_arg(ctx, 4, &_x); (void *)_x; }) -#define ___bpf_usdt_args6(x, args...) ___bpf_usdt_args5(args), ({ long _x; bpf_usdt_arg(ctx, 5, &_x); (void *)_x; }) -#define ___bpf_usdt_args7(x, args...) ___bpf_usdt_args6(args), ({ long _x; bpf_usdt_arg(ctx, 6, &_x); (void *)_x; }) -#define ___bpf_usdt_args8(x, args...) ___bpf_usdt_args7(args), ({ long _x; bpf_usdt_arg(ctx, 7, &_x); (void *)_x; }) -#define ___bpf_usdt_args9(x, args...) ___bpf_usdt_args8(args), ({ long _x; bpf_usdt_arg(ctx, 8, &_x); (void *)_x; }) -#define ___bpf_usdt_args10(x, args...) ___bpf_usdt_args9(args), ({ long _x; bpf_usdt_arg(ctx, 9, &_x); (void *)_x; }) -#define ___bpf_usdt_args11(x, args...) ___bpf_usdt_args10(args), ({ long _x; bpf_usdt_arg(ctx, 10, &_x); (void *)_x; }) -#define ___bpf_usdt_args12(x, args...) ___bpf_usdt_args11(args), ({ long _x; bpf_usdt_arg(ctx, 11, &_x); (void *)_x; }) -#define ___bpf_usdt_args(args...) ___bpf_apply(___bpf_usdt_args, ___bpf_narg(args))(args) - -/* - * BPF_USDT serves the same purpose for USDT handlers as BPF_PROG for - * tp_btf/fentry/fexit BPF programs and BPF_KPROBE for kprobes. - * Original struct pt_regs * context is preserved as 'ctx' argument. - */ -#define BPF_USDT(name, args...) \ -name(struct pt_regs *ctx); \ -static __attribute__((always_inline)) typeof(name(0)) \ -____##name(struct pt_regs *ctx, ##args); \ -typeof(name(0)) name(struct pt_regs *ctx) \ -{ \ - _Pragma("GCC diagnostic push") \ - _Pragma("GCC diagnostic ignored \"-Wint-conversion\"") \ - return ____##name(___bpf_usdt_args(args)); \ - _Pragma("GCC diagnostic pop") \ -} \ -static __attribute__((always_inline)) typeof(name(0)) \ -____##name(struct pt_regs *ctx, ##args) - -#endif /* __USDT_BPF_H__ */ diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/linux/bpf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/linux/bpf.h deleted file mode 100644 index a9d884d..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/linux/bpf.h +++ /dev/null @@ -1,182 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -//! @file linux/bpf.h -//! This file should be thought of as platform/bpf.h not Linux-specific per se. -//! It is needed under this path though since the Libbpf bpf.h includes it as such. - -#include -#include "ebpf_structs.h" - -#ifdef _MSC_VER -// This file is being included by a user-mode Windows application. -#include "ebpf_program_types.h" -#include "ebpf_api.h" -#define LIBBPF_API -#include "libbpf/src/libbpf_common.h" -#undef LIBBPF_DEPRECATED -#define LIBBPF_DEPRECATED(x) -#else -// This file is being included by an eBPF program. -typedef int32_t s32; -typedef uint8_t u8; -typedef uint32_t u32; -typedef uint64_t u64; -#endif - -#define __SIZEOF_SIZE_T__ 8 /* only x64 is supported */ -#define __SIZEOF_LONG_LONG__ 8 /* only x64 is supported */ - -typedef int32_t __s32; - -typedef uint8_t __u8; -typedef uint32_t __u32; -typedef uint64_t __u64; -typedef uint32_t pid_t; - -enum bpf_func_id -{ - BPF_FUNC_ID_UNKNOWN -}; - -enum bpf_stats_type -{ - BPF_STATS_TYPE_UNKNOWN -}; - -enum bpf_cmd_id -{ - BPF_MAP_CREATE, - BPF_MAP_LOOKUP_ELEM, - BPF_MAP_UPDATE_ELEM, - BPF_MAP_DELETE_ELEM, - BPF_MAP_GET_NEXT_KEY, - BPF_PROG_LOAD, - BPF_OBJ_PIN, - BPF_OBJ_GET, - BPF_PROG_GET_NEXT_ID, - BPF_MAP_GET_NEXT_ID, - BPF_LINK_GET_NEXT_ID, - BPF_PROG_GET_FD_BY_ID, - BPF_MAP_GET_FD_BY_ID, - BPF_LINK_GET_FD_BY_ID, - BPF_OBJ_GET_INFO_BY_FD, - BPF_LINK_DETACH, - BPF_PROG_BIND_MAP, -}; - -/// Attributes used by BPF_OBJ_GET_INFO_BY_FD. -typedef struct -{ - uint32_t bpf_fd; ///< File descriptor referring to an eBPF object. - uint64_t info; ///< Pointer to memory in which to write the info obtained. - - /** - * @brief On input, contains the maximum number of bytes to write into the info. On output, contains - * the actual number of bytes written. - */ - uint32_t info_len; -} bpf_obj_info_attr_t; - -/// Attributes used by BPF_LINK_DETACH. -typedef struct -{ - uint32_t link_fd; ///< File descriptor of link to detach. -} bpf_link_detach_attr_t; - -/// Attributes used by BPF_PROG_BIND_MAP. -typedef struct -{ - uint32_t prog_fd; ///< File descriptor of program to bind map to. - uint32_t map_fd; ///< File descriptor of map to bind. - uint32_t flags; ///< Flags affecting the bind operation. -} bpf_prog_bind_map_attr_t; - -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable : 4201) // nonstandard extension used: nameless struct/union -#endif -/// Parameters used by the bpf() API. -union bpf_attr -{ - // BPF_MAP_CREATE - struct - { - enum bpf_map_type map_type; ///< Type of map to create. - uint32_t key_size; ///< Size in bytes of keys. - uint32_t value_size; ///< Size in bytes of values. - uint32_t max_entries; ///< Maximum number of entries in the map. - uint32_t map_flags; ///< Flags (currently 0). - }; ///< Attributes used by BPF_MAP_CREATE. - - // BPF_MAP_LOOKUP_ELEM - // BPF_MAP_UPDATE_ELEM - // BPF_MAP_DELETE_ELEM - // BPF_MAP_GET_NEXT_KEY - struct - { - uint32_t map_fd; ///< File descriptor of map. - uint64_t key; ///< Pointer to key to look up. - union - { - uint64_t value; ///< Pointer to value. - uint64_t next_key; ///< Pointer to next key. - }; - uint64_t flags; ///< Flags (currently 0). - }; ///< Attributes used by BPF_MAP_LOOKUP_ELEM, BPF_MAP_UPDATE_ELEM, BPF_MAP_DELETE_ELEM, and BPF_MAP_GET_NEXT_KEY. - - // BPF_PROG_LOAD - struct - { - enum bpf_prog_type prog_type; ///< Program type to use for loading the program. - uint64_t insns; ///< Array of instructions - uint32_t insn_cnt; ///< Number of instructions in the array. - uint64_t license; ///< Optional pointer to a string specifying the license (currently ignored on Windows). - uint32_t log_level; ///< Logging level (currently ignored on Windows). - uint64_t log_buf; ///< Pointer to a buffer in which log info can be written. - uint32_t log_size; ///< Size in bytes of the log buffer. - uint32_t kern_version; ///< Kernel version (currently ignored on Windows). - }; ///< Attributes used by BPF_PROG_LOAD. - - // BPF_OBJ_PIN - // BPF_OBJ_GET - struct - { - uint64_t pathname; ///< Path name for pinning. - uint32_t bpf_fd; ///< File descriptor referring to the program or map. - }; ///< Attributes used by BPF_OBJ_PIN and BPF_OBJ_GET. - - // BPF_PROG_GET_NEXT_ID - // BPF_MAP_GET_NEXT_ID - // BPF_LINK_GET_NEXT_ID - struct - { - uint32_t start_id; ///< ID to look for an ID after. The start_id need not exist. - uint32_t next_id; ///< On return, contains the next ID. - }; ///< Attributes used by BPF_PROG_GET_NEXT_ID, BPF_MAP_GET_NEXT_ID, and BPF_LINK_GET_NEXT_ID. - - // BPF_MAP_GET_FD_BY_ID - uint32_t map_id; ///< ID of map for BPF_MAP_GET_FD_BY_ID to find. - - // BPF_PROG_GET_FD_BY_ID - uint32_t prog_id; ///< ID of program for BPF_PROG_GET_FD_BY_ID to find. - - // BPF_LINK_GET_FD_BY_ID - uint32_t link_id; ///< ID of link for BPF_LINK_GET_FD_BY_ID to find. - - // BPF_OBJ_GET_INFO_BY_FD - bpf_obj_info_attr_t info; ///< Attributes used by BPF_OBJ_GET_INFO_BY_FD. - - // BPF_LINK_DETACH - bpf_link_detach_attr_t link_detach; ///< Attributes used by BPF_LINK_DETACH. - - // BPF_PROG_BIND_MAP - bpf_prog_bind_map_attr_t prog_bind_map; ///< Attributes used by BPF_PROG_BIND_MAP. -}; -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -int -bpf(int cmd, union bpf_attr* attr, unsigned int size); diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/linux/stddef.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/linux/stddef.h deleted file mode 100644 index be96b11..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/linux/stddef.h +++ /dev/null @@ -1,3 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/if_ether.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/if_ether.h deleted file mode 100644 index b0c5b51..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/if_ether.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -typedef uint8_t mac_address_t[6]; - -#define ETHERNET_TYPE_IPV4 0x0800 -#define ETHERNET_TYPE_IPV6 0x86dd - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union -#endif -typedef struct _ETHERNET_HEADER -{ - uint8_t Destination[6]; - uint8_t Source[6]; - union - { - uint16_t Type; // Ethernet - uint16_t Length; // IEEE 802 - }; -} ETHERNET_HEADER, *PETHERNET_HEADER; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -// Linux mappings for cross-platform eBPF programs. -#define h_proto Type -#define ethhdr _ETHERNET_HEADER -#define ETH_P_IP ETHERNET_TYPE_IPV4 diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/ip.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/ip.h deleted file mode 100644 index e4094c4..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/ip.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -#define IPPROTO_IPV4 4 -#define IPPROTO_TCP 6 -#define IPPROTO_UDP 17 -#define IPPROTO_IPV6 41 - -#define AF_INET 2 -#define AF_INET6 23 - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union -#endif -typedef struct _IPV4_HEADER -{ - union - { - uint8_t VersionAndHeaderLength; // Version and header length. - struct - { - uint8_t HeaderLength : 4; - uint8_t Version : 4; - }; - }; - union - { - uint8_t TypeOfServiceAndEcnField; // Type of service & ECN (RFC 3168). - struct - { - uint8_t EcnField : 2; - uint8_t TypeOfService : 6; - }; - }; - uint16_t TotalLength; // Total length of datagram. - uint16_t Identification; - union - { - uint16_t FlagsAndOffset; // Flags and fragment offset. - struct - { - uint16_t DontUse1 : 5; // High bits of fragment offset. - uint16_t MoreFragments : 1; - uint16_t DontFragment : 1; - uint16_t Reserved : 1; - uint16_t DontUse2 : 8; // Low bits of fragment offset. - }; - }; - uint8_t TimeToLive; - union - { - uint8_t protocol; // Linux field name. - uint8_t Protocol; - }; - uint16_t HeaderChecksum; - uint32_t SourceAddress; - uint32_t DestinationAddress; -} IPV4_HEADER, *PIPV4_HEADER; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -typedef uint8_t ipv6_address_t[16]; - -#if defined(_MSC_VER) -#pragma warning(push) -#pragma warning(disable : 4201) // nonstandard extension used : nameless struct/union -#endif -typedef struct _IPV6_HEADER -{ - union - { - uint32_t VersionClassFlow; // 4 bits Version, 8 Traffic Class, 20 Flow Label. - struct - { // Convenience structure to access Version field only. - uint32_t : 4; - uint32_t Version : 4; - uint32_t : 24; - }; - }; - uint16_t PayloadLength; // Zero indicates Jumbo Payload hop-by-hop option. - uint8_t NextHeader; // Values are superset of IPv4's Protocol field. - uint8_t HopLimit; - ipv6_address_t SourceAddress; - ipv6_address_t DestinationAddress; -} IPV6_HEADER, *PIPV6_HEADER; -#if defined(_MSC_VER) -#pragma warning(pop) -#endif - -// Linux mappings. -#define iphdr _IPV4_HEADER diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/tcp.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/tcp.h deleted file mode 100644 index d5448b7..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/tcp.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -struct tcphdr -{ - uint16_t source; - uint16_t dest; - uint32_t sequence_number; - uint32_t ack_number; - unsigned int data_offset : 4; - unsigned int reserved : 3; - unsigned int ns : 1; - unsigned int cwr : 1; - unsigned int ece : 1; - unsigned int urg : 1; - unsigned int ack : 1; - unsigned int psh : 1; - unsigned int rst : 1; - unsigned int syn : 1; - unsigned int fin : 1; - uint16_t window_size; - uint16_t checksum; - uint16_t urgent_pointer; -}; - -// Verify the bit fields give the correct header size. -#ifndef C_ASSERT -#define C_ASSERT(e) typedef char __C_ASSERT__[(e) ? 1 : -1] -#endif -C_ASSERT(sizeof(struct tcphdr) == 20); diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/udp.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/udp.h deleted file mode 100644 index 66b1c67..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/net/udp.h +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -typedef struct UDP_HEADER_ -{ - uint16_t srcPort; - uint16_t destPort; - uint16_t length; - uint16_t checksum; -} UDP_HEADER; \ No newline at end of file diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/bpf.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/bpf.h deleted file mode 100644 index d5d58d6..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/bpf.h +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once -#include "../../linux/bpf.h" diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/if_ether.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/if_ether.h deleted file mode 100644 index 4975aa9..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/if_ether.h +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -#include "../../net/if_ether.h" diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/in.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/in.h deleted file mode 100644 index be96b11..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/in.h +++ /dev/null @@ -1,3 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/ip.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/ip.h deleted file mode 100644 index ca08cc7..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/ip.h +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -#include "../../net/ip.h" diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/tcp.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/tcp.h deleted file mode 100644 index f91117e..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/uapi/linux/tcp.h +++ /dev/null @@ -1,5 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT -#pragma once - -#include "../../net/tcp.h" diff --git a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/user/ebpf_registry_helper.h b/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/user/ebpf_registry_helper.h deleted file mode 100644 index bf31431..0000000 --- a/windows/packages/eBPF-for-Windows.0.3.0/build/native/include/user/ebpf_registry_helper.h +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -#pragma once - -#include -#include "ebpf_api.h" -#include "platform.h" - -#define __return_type uint32_t -#define IS_SUCCESS(x) (x == ERROR_SUCCESS) -#define _SUCCESS NO_ERROR - -#define GUID_STRING_LENGTH 38 // not including the null terminator. - -#define REG_CREATE_FLAGS (KEY_WRITE | DELETE | KEY_READ) -#define REG_OPEN_FLAGS (DELETE | KEY_READ) - -typedef HKEY ebpf_registry_key_t; - -void -close_registry_key(ebpf_registry_key_t key); - -uint32_t -write_registry_value_binary( - ebpf_registry_key_t key, - _In_z_ const wchar_t* value_name, - _In_reads_(value_size) uint8_t* value, - size_t value_size); - -uint32_t -write_registry_value_ansi_string(ebpf_registry_key_t key, _In_z_ const wchar_t* value_name, _In_z_ const char* value); - -uint32_t -write_registry_value_dword(ebpf_registry_key_t key, _In_z_ const wchar_t* value_name, uint32_t value); - -uint32_t -create_registry_key( - ebpf_registry_key_t root_key, _In_z_ const wchar_t* sub_key, uint32_t flags, _Out_ ebpf_registry_key_t* key); - -uint32_t -open_registry_key( - ebpf_registry_key_t root_key, _In_opt_z_ const wchar_t* sub_key, uint32_t flags, _Out_ ebpf_registry_key_t* key); - -uint32_t -delete_registry_key(ebpf_registry_key_t root_key, _In_z_ const wchar_t* sub_key); - -uint32_t -delete_registry_tree(ebpf_registry_key_t root_key, _In_opt_z_ const wchar_t* sub_key); - -uint32_t -read_registry_value_dword(ebpf_registry_key_t key, _In_z_ const wchar_t* value_name, _Out_ uint32_t* value); - -uint32_t -read_registry_value_binary( - ebpf_registry_key_t key, - _In_z_ const wchar_t* value_name, - _Out_writes_(value_size) uint8_t* value, - size_t value_size); - -_Success_(return == 0) uint32_t - convert_guid_to_string(_In_ const GUID* guid, _Out_writes_all_(string_size) wchar_t* string, size_t string_size); - -_Success_(return == 0) uint32_t convert_string_to_guid(_In_z_ const wchar_t* string, _Out_ GUID* guid); - -uint32_t -create_registry_key_ansi( - ebpf_registry_key_t root_key, _In_z_ const char* sub_key, uint32_t flags, _Out_ ebpf_registry_key_t* key); - -_Success_(return == 0) uint32_t read_registry_value_string( - ebpf_registry_key_t key, _In_z_ const wchar_t* value_name, _Outptr_result_z_ wchar_t** value); diff --git a/windows/packages/eBPF-for-Windows.0.3.0/eBPF-for-Windows.0.3.0.nupkg b/windows/packages/eBPF-for-Windows.0.3.0/eBPF-for-Windows.0.3.0.nupkg deleted file mode 100644 index 77a99eaa4a0748230bfdf2a87f0373738b1dd875..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 829697 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


S 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

u$HYG`}V9da*`k(&Mz-UFD!n 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≷ptm1a*yvrEZoa4Arv(#z$)7|={V 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

K)op-Lphjp0Y9Tft4CDeyVmx z>i3;hJX{|7t?wQf(Bt6%p(HX_O{2Ltx~k3v&FgKdT5fqOjI4c!rKV34g6B!NErkC)tMF|r5;1#6 z5ayA_o(EYWfi7ocAwVitmY_L=8hr+X?yz2}eN=}h6gOpMQh#*}pVhkRXfPrSGcPhq z3B%1BXscnsMr(qHhkSK7hddBy7kA&obT4b><4i9er0iilYT46{^`ldDaH0g9XB=J` ze`+8U{4Dof%+la9pD(L7Sbz=5YOz(j_In0HO{2?-;r*aOx158iDLx2t0!acX>uE7d zo})(hF`R>)r5wPwwR5M2XjGoWDuhSse{1((yaC%Ey51s#`75idQNIpX)1n8=q=r_R zmDQqWo$8z?X|8z;<&%ALp3@eerq~HevEnPH`IibRW@GStg%oBg`Nf$oj)qRtdz{i1 zGzoR>bxk#mtIn0wNe(Y)763TmwLCgtfaf;=z00L7k7UXCzgf;Nwz#fFl*$7QKtY*B z<2&s*%t!KKB0F1Nmf;%*(m8)4#5BZWP zE-K_LjJN#J=`+Q(=3;t>Xk06$XznD40)5IXq!p-6d+N%_#JOzHZFB|w*T7*~^y%Z& z0Yy6d`iC5cGWihaj*zENiysf6Y)1Lja2X7lG|7D$b4N%R>W+|-1-FN1YHwig{$(8X zN9c_B(<@olQQtXZ@WV(R^=p|s!pazr`j`NS`#pfcg)TV1o9zS(Db z{Tg^(hS!ZwpRB*$>h7dN!8y=z@yA?OJAF5RHZOUnIwaKDSMXm<3GKI zIjUotWsa&$v(8a}IxU@!#|O{CcsjyP{ClvHz@IEe-PIv4x+UGBjn6~>g$*C|hepRI zR`qN&eELvsIt}==jp5TFhELpxsIfJQPW!o<9T9YzXC3Vg9hq9A$mAM=OiqeS3Lulh zpWyDpW3f3pGRfqG5|2z*2m8bRD->%kV#t(zd?4#y7O*9}8ox6{|*CB&o>>X}0i5BPppk?fnBE!)6ya&SEo9f^YjTM&oh;51t1 z^d=7L0^h`G^xs23kuV;g&?A}r=y|(M!Jwb*sDjT*G8*LJnAGxP#3bk8{^9ZWnNg$) zOJ*v~fEg*aeBehWdhl&C(n<#nVLe0Q{aj5N#S$$2C!-UT)O6B>hVAZ8DT`?adxEi; zg@6_PVXPQ8#N+90D)3W|Q-RM|%))5U&h$WkI6P-@Fq4JsO#W&hdMyd@0qt9SZ?D4pUdPFC(yz!rd&ruEU*^ z_!h24p>QuXDy)ui82IKe@LQt5|3x%n>M{oWZ)Cn1fZs3ir?~rQiBi%D6bUaMWRFK+ z|I!f(dj+(S?BG=9XEt8jaBLuQmA!zmxw7X-uk0(BLMvCONdgfKpw-8&LoZk3qm;7? zZ8(G)R$c}x34mt>;9230`xAUa@d4A}dtDde+9~nj(+~%VL(W^8rE;Ay# z(TfnZ-G?a20y~>P*Bh-##-$1TusW&x-~^dJ;LefxcCMz5vfK#Iq-$aC2aYMI5grK- zx(^1IAjMAqSI;61A9OM&LwNCkYX(?jR>=ldrX#r*c`5wu2Tn@N$-qV#)9jT@EhvHC zjS}}#LsDn zG~n^`k4B>3?$2ZC*A+*W3A>T;p?=Tvkx6S#G_3P3}RR&@0Y>aLzv zd@PN*dV&INhGlBOYwn{I+LTVOd~7g!Xf~Wqhd1Bk4h9=F!)3S_b??NI=xFo_M!<)$ zA}k@g6bX@~xSB4-Cln`_#fY$kQCHz~j0lU z2BKHTAZD?+QxIXV(=%y8*MSB8g2}~y=$a&xeVW!W7y_LU?|>m`)_OX^k-ppYNZ-VP z5u-x2t(PDKr2|n2o-O>&paN*a;5V`guxyA55C^~KhpPZF@Vn^nNbs`;M}^-hcBYT1 zXGenIpLfJU(4sxDV<-g8)5EdS@eo`y10k5$(?5E=TQpw!Y@j#U_#c4Y{xd>PI~d{a zF;UNZ0t2CuqMlKKl9wRyC&uegH~(8Y6pdE?--}0t>PQ;Y4sD_hLH+dp{`m9Mk>DNc z-yb7~rGHBf|KdB!;i2*AadLS4a5)^aQdfO2(n@7(Bd=6g4%28tZerq>G@|fJbm1T3 zw_j&qe)|{duJd0~-(l)J&m?JMI`Z(tIuB1r9)5n*UH?mTQT&oR?6Yc~2i*UR%FgL0 z&lG|_VpmP>!@;du&U9Sh*Y?FO@R{i8B<`Hpel)sJofbz++*!-hI9fV%CVBe1_eNTv z`#u?Yfn?7oC{fR$2?RhG0xOzlq1CLZFunCm!gStQ2vchBeR}_hG&QmiZPQ-A7=bSC z?T_XMwbFQqFw7bApDvSr+&mzk%RUj5I%-B_Z~t-t20#H41Jx_XLUoo$ywR?=M7 z6O{ZaQ2kmJuCT(!p-kf}|lPhf1zCKRh zvfeo*n5ytq)=JPeueSy{Y`PMj4=N-mk#pCto@(G~eg$iZjZ473Ig#!grU&yS-~3F; za~F28f_9iXtV1v{6zuI@*4t&Pa^k(#*mJc4rPa!9;51)70@&y2Y^@Nem^K;fMAlRKYQ&jF&qO$qi<#{6=A*^ z6BOS}<`_fXcKXZ{wEs5YX7kRuKJ!JA4N$EE<@f{iB8c)%$u=mXnb=LOLBHlQ;eK$3 zf+w;2B=Q!kY6+{T@9UE_v_`OQ#Ro)_?p6PPHvT0ejeqW_o>rEh#S5K=DFeZe?ZjL7qWh4bUPez=_=E2M)<^7*40>VoFeQfH|2yMdH+;M) zXEom9UEg`Up3kyb8cr-O%QE?DCC89`aE~<(3HI0-f1bD|E0eNUpzSY_C)kdm&eAlP zfO2McD0rb1>SX!(efrr8L4R(6n75*DriNvMq}tHBo|y9~9S?HCB`yDx{XKgY{na%M znQydSq@qeO@pbPw@F46Y*430Uwe1~r<;FQkG9Je{RL%iPBl?$+bF}B!%?nt%c+e)* zM0JvbBxw(_8y5DG%8kG%&$54U=NbCX-Z@JD+|IM_pYabmhFDz&SO{_rTQi<~0n1QG zK=w4A2F@V)GVZ}6P(JY4c+COje|&bF?&e z>3b4C2=nJiqMD>mplx_sp`GI^8lC*tE9W|WYfp#Y5?}!Dx6{`y5~Bmy!7hPl4w_~D zplcjSrbn`Z$|04?o}*?bOypH)&wVkp>{`tF)L~ANu~+Dyp5dw!0;@re%AVHK@TmJD zY*gXDa-|4l0)ZwI)#P9TzH-#eUJsPQ<75Ib1{GMtguqXz6uuQD{dVfPB&+2HmhfM# zwhYhn|L?EwZ%>ZCzW>`kY<-_@Kg0U2Z6CJ2zi$86>s!)3Y<*|8f2Z{wXdAY^pSJz~ zdVPoFBaYqQlYPrVPI6ee6TaL~>4&wOzX)GK-cR|yBuN`Qm zT*D-VI*9rAs(GtKPD%XxYj(ju?o{DKtI?fONF4t-4Yy?9TIgaY-G@LeQIB=K6`l56 z)WbZwPZrp$yH)&$$2;Bse>7g^Cox>VTEL9FW7HYo9ULX!Ts@tN>(wC;R7`58ZPgy! zPDeHY1(f;scv`_9UDGXKo*e4Iw9LS?8cq=-B~Q@7|Ru(yO{N&-&mDswuYMo&;`4XjLD9 zfjgb9co(gY<(p#+8?#AT*IWIeU`p-@G-54Ub2l2Xy$){cty!y_wmwN+l7d1CwT^}D=N^76xf+fGZ`?~>2iU*jR)DQ>1KtJwS2ZOjh9V3oxWnDmZ)Ls z>@s7FJM|pho%(>}D`M`{diq}!V5wld$da=fmFmf<;d9?T9mNZO8v(0OGdz1OMbe~AL1;F(|=`uB6ls*)I| z4Wd7ix;8e>erU<^Gw;`)jG)iefEwI=SUy=Hw^$V0bh&9DA-XS;FzPuW-QoTL-524v zRoc*V0JDy!FvA9VkL-qg5A-qI4e6(A6TAq|CGUF-C;k@O7FquGK=gJ(Zb&~WT$8nG zu5ach+!(VRN4NavzNYX2*zHGfO+5x9n2MfCX%vx&5%|2*w-NyK1ptVeMAzX-zIO0$ zblbLrrnu}zD=K~yBry0-(9YY>!5xqJ&HbU#_2Xu$A2%VXc@CWhbhNCIw$dscz7?lI zafU^rN;2xjPSQ$}6q{d$HOB~ugk#KcFV;$isV!=WK63k)u`e7O06cqZWPb3S=l|aE|F7o%*WQ0Q|AWV3U$}d; z`A4U|7))Jh#QGHWxcU_KNPP+^u0Dk{ygtR`aD9pty*@?Y_tZx<-kpyoyz|jOQayWt z%8L1&K7nPT*fp$R0aKygW7OCF!M#H~{_qyd3lPOOJZ{9qt5D1GicKB2~iOV;t?a6VxyQYL3Vjd7qC_8BfS?Y&OC z3Cn&1hBYm?Z&*B1)IJ8?2ke*Snc>ZrFJZVsgP9%`>~Kxw>IOFF+U-h`qhGmrKY2qf@!~08*+anfqtIB)q`C0r93S8(w!pv@d5XT^xv@_-rzR37Nr{M7NmOTr`GIoO{6!HiK(yW zd+p!f;hmE@M5-#`1Utf_q4_zY^dH^(b7Fq|16=)VtI$9bQgHQlD>(+ew27G2|5FE7 z)GlyEy&~V~7VBoG3M7G~(lerFb&}MiWvWGH7=^=UH&!@csx|Fg%^lEEg~WPYqzwLE#Nt41ud}68W79c^?6_4f;bsIk}>D6t3v)+&$vujh;cvia9bd zKO(Ge49SzskAfQds7xG>Sma5LN0CAwwct-H{&n0L`ztSW`er`jw7mm%7B*TmDJ54;c@!TLOx;e?*Zlq!9}E2M${#p=8IOn{y#)d6 zJb2Qx+YtNUd+^YTgYFCQk@E$*;M?dt^aU4S#itg-k_RV|9e^m0&he$y$-b02E#alX zkd6nPBjQ146c0Kn9(2ayL0JqQbPmIVcqXauqU!rM4zTIZkh26+3gMBri04tDBN`P_ znyJ`I)1~OqBc3}BalGVez8*t&fVHRQ8x3U4q`^e2tl*E7+kMSWtG^XANosW`$(Z6R zGOFe&!kbtpuCUI085;H4dHV)J_+x9Yky_bfv}Cxl#evl-ux_0BDmBAf3=aUj-BYwL z_6~%?zs72Z^j}*svRE?pNqE}Fj+|Kw=DbiNXb^p<`Lb7D(qEzX)r>rm_PGJBV&-z_ zFmbjgtKYB%$4)Ym3fC80h6U|b!UJ1+sl8&(D^xSKgm0AZ#h3{&jlv;k5_erYd~x1~ z;f)&vvcQ6_C{9psu;w1JQpjI%0%5Rp4X|^w=-$~3}V2{*m<$pjiVwy+H8vNcQ0ek)Q zX&iQXY<<3sdtf?^`gCTi8CrP0u@Bv|Cw|V)ZONny3Ia#wHtoc#lBubf+iK3H!-sX} zi&gXU0*e&0Yd8MX20x;)rwLqHdAwf3C;E(4MvlQd!4f6 zN754eX$;rGDlZRuKs@5#LQl%(5PQv|nOP)<4Qm~twc_bFu1sMW8SL5*mKY6~BO)_) zMw@rXPTQ9P@=Uy0AqId}FD?6|o&PM}3}5UA5N>3W_X{vOY0vHtg&YKv26nITs&0#tLN@!_%DMoZ%6K|J@6`r~j zo-!8t%$T~%;4&AXs=Ndwu2}}4Hv{i<)+=O2v%&|s8Xty;Eg2L@Ie@=IM3tcoB)M~u zb{sSv00OI7ivTb`gG+P@ZUS(OfNwov{Hl8jXq`d%a)W!EHXFn_{jDQUN)E#=Gsvp) zO@;a9SKT-3k4}p`s;^4UY(ArZjYMyc(F|SD^`dvU+HD4wMFP+yEk{SlP8}U{038bf z9rFsunqLe2Haem$ox{3OGx~L$&(S-3v@?qCIY{Cox1N%xcaIOHYyr4$poQ&damxhf z62HPXR;Cq_w7YBftV&_XxaCGbjPU}CG_q^*HAaK%*=|<&+v>U6bu@6Yx|0$I##B-Y zh$oQRAXu@qE}sHa;H+(Q6-uP+8QIn)c|JUijvV}6R?QlC11MOHk&x~ZRIn_5PzqVV z^@EaU=`#k_I%thEp_%(I1|6FD7nSVZt;R}rZ?+C#jZl;qLo?09=-Uojk2yxluI4~yNQ({REo+n|-2GnMu$sWZgmf~K<`}>gO z+`wO2tuo)|{wr>2c3T z{2yNI86(Z%TQ0WYE`6~NHlKO1ck21?q|7tqzhjo{M3jmOIVq4{G53V<25JZn)$JF_ z&p~wuY28@rP|FX(#5*}FP1@B-ojhz7++|Rmeyqoi@H_&K_2DDNBaSh5se0vUL*L!J3hs9D7eWqn$|m+F=WBToxd8sIx%WEA+#oAKO0%$qsO zove}efslURm$EXVE-32EUYShUl1-^~oI+;ik!wK}`$SRQ4Kgq@kgIB0m9UkmLZI3y z#M~xxHNw!&Y!;bJZFBqFRt8d$yT_k1536;DkjY&fA@~R@_6Q z+ESY<9aK+yPmtJ0VMb9*>ngQyv)B}`AeYeb+Pcg8d@aDxVsz0BVS6J zjP#uf5Cjq@CbiHa1A$xh{D_^}^E*Q!JOXSnM zmdI2wcMqBT%ics-(13v3I)SB%P8tfiexYK!zEo~Hl^~EEBEPp1*089w&{Ob`!8Jw* zH3v1B6m$u%;@E)JID8}#2N?WN*uv=Q1D&J<3Wtf>m7q1Sd+aqtrzoCzvU&|zjgit8 zE0hP+C6NS$oIu+un}sKk3^1A2pviOuu{vQ`S=l{pr!-lmYOHXM}S{9JSZ z=V<@fj*Ja+%f*ZWRciDkE96DS0pTyrwX4#M7WdPP)93~WWJUHP zWl4H|KVSnge}ePON0Mr=vW~Adkn;ft`0c}Kithg9;i-omL4j`FK>48V0X;PxGE1iI z60dPJAJX-}@M@xMWsnttfF9EaQcM$=*tz<010|yyA4OEZ3WzA4g7PQ@y|OKif@)X} z?h&adgRv4B-m_?{;XP;0I6Pmomq>Ew^IqP0V$-@{E9r1k&RmV{Qy28e+wqOvE@bH=7hRk0|CS66$cLNNUx}8uTrOsDRt5Px~qm za6JZHaYT9%fnEkNh5u+k)Gk_Fljb3R+P0$7$$p&in4w|7h}a#jIrKDD#mic1o8C! zn4&H1DiRE1KvIkp`~1xzQp`I>HcZe9f`^^}dkkt%L zx3QQQivSeQGAW1{g|Mp#ynA-U5=roeSnBw}n@AmTlp*OFMkJ4WER{$e0jLCQiWaS| zIaYur#R{VVNwn%C?2Dn5PmXwY(n9#OHY299+5% zLn>tzYmEESXg*rxY<=4EOAUsHaDNl*T9A64rT5{%z=LX81IRVHFYb>s_3mSLyTf-6 z(p^ZOvq8IhHOelo<^)}Yk8m@+tX{#rbn&QzRQto*=^)J7C`V@8_^6W{l=%U!<_RM* z`d7_Kz}hK}xYo9*j&B|x{kFjYL~Icap~7y8WA zG}Sfk4qq+#%yx-5`+#Ql}$Q zm%auBlS!En+ch<%q!ZC&_s%p*9>0~~+KER4H(>7J5GXj+{>Vy~-H9tL5%(glb~07{ zmaYSda?E95Gs)$SGF9E;3@>~W>jKtYfvMhqoUS6F2a z5J!4&vhI{FF2X&_yBg_^%_8K|Xm7k0Y6XQbGQK&h5E69mwKq|9xqK5IF!Pe_pyc_e z7u_cG+^QMS#KjU>*Dpo$;NgBw&N8~6L!GlyULK$s2>Z0l+YMMtqV0_4ui3mrhxH?OC=gI8s-rphkDx( z9`W+o@`w_W^1Q2%O13FLtRW;_fpeS^$y;pu5OB^}rCkNDtgqf^ zptSuA(sn1(c4vgPuMD631lh^YNVGl9q5d$IvehP}?D>bzK-nw*5uxl|61T~DBtqH+ zMwE)AY!i|;n@ZqMK)|8^L_oX0=_}x;4UvU%xfxpDwun8%)y^MI=J!!D-w=x%7nB1r ziW?bfJTn|M^t+wmyHV6ga8p9R4-o^6IzR+UkuXK2l2h{O60dA zkw5+hCGy+jh&&373fC|q-|#Joe9lc#BER^hFp)dA{|h2#`$O^cJyL&Kv_Xs;@1n%dogn?5f@ijy@2l>J4?^A2n z9kE|$lbMG^@`VG_$}Ft{EdY47OfoPP@J4oi*`Y1C0@r?yMas8ukGB-AFSwMR|GqL1 z0-kh*HzO(JXVQoD+P#9>$geloCT<9S z@>f*8V_w69-}MD1Agc{jA+Gl0CLK)tVw`wAJU-WFz6`LwLC5+Ic>Q)f&DFj~k0fsM zS<(qX7&|GH;<`n^!8s>XS<>?*c0YTaVeAZ=$A-u0;U#W>7gx zL(O1it~X#%wD}8}C}RwTo~*kK!FT;E(~Qv&Ej*FK(m4YDk*bA~t*R8m-S`hG3$P)y zi(KYVOYn2p9t_KVF*Y-#<+C?{vw0{jN zvMe2WQ%n-C99mK7WbV7_!Zt~rDycuSzz3fE89ezjF#ms+4WAtNZWhHU7^%$QCiji~)I+QhcQ-`wd5gp17j^}pO4q1I6_Qb}Q(u1}H^LWDK=-=E)cdfz>Vwb^AGDo|FEOXKMY7u+%(ib%)fRz@ zKHc4$L2rk#OG`R%Cm;R3xSIXUI}Aj-q0Vf?nyAbLF^g@R_(==Q$j;CQH%)Fr^!XUj z=ZL)ygocwp&DB)Xia>1NMD~@yn)K5%+@*9svLuW;mmxoa$sJ)3_>dab)ICghKctBB z>qJ+ z58TE4!45J6udc^j`#BWTV`-t*JP`E=+W;ICox%j@dE;3)g%zVy*jLX+Tvj$H>e7v@ zdEF=M!L#!T^IwO;{rP99Pgu{0Hitc4THKm-STB(XV$S*pJ-|Rra*|^L=>ZKFH7_vd zSe^u~Mn&ZmzpRHZxgpHCSNj^gtyUj(_--~j)TN;czi2WT?cVA!KpjUlf@}lmOW}K6 zc0pYWwkc?%G)>!PD=Ma9NNzfm0O)zto>y&_I7eBZkhgX+Jm5BCz94P-W)s-uCc#^r zhEH&{JD_j)HioNhgl}Nyf-q*`V`y4ObRh1Y|1#s&>o8Dp_j=$)X!4T_09;u5?kQ}h z&Q2Q6@u`&-l8Dahnd8Dug3jY?ppP5TF8VoiEW#^+UnN9F%YVkzVq7ShW0sl@ zXMzo$+=lU$FtWusMGO>clKYOwjRuB-aSDRDujkx7eeVdSeN+YCrTuvVBFS7BWq!C@ z*Lif5Q=+5Hzsfxp9tfJTeSy4%U9^DgXRvNXSOcuAQq!lIYN@&JooE-hjztq_85CHY z{J;f>lWO%Q9PM;cRR59kUcQN5{%m|qn5#>&~S zt}amsy;VdqUId8;ppcRe2xNgZv_tQB$9Rh66e2BhUvH6`_9Av{E>g{#@b#Y-b`80%#|@eFEHee}b!` z0D22vH2%{CexG~NQ2Y@xDNQ)BaZK4JL|V@r(z;cMZ~mXyJT4Byw@;CC@%y;i!}x{v z;)Gs={HwUyT?Q~ApZfjQ#bn@5YrY)zM-H=tq#={rg=qEO*{9PX!bhCz}<12 zH31px(cqPguqEV7KT3(GZ0u#71#jt$$cfuf+FxEU86I+?XL$=UDMXZdtU`NPQ6!!n?Fbs*$IwSvoI?Vq$8H<(ogM!jctvts3?@!j5 zzb6?JOM?cuaU344!I$5U3v&i45?;pDc~>p(1A&kP0wLL8^p=lTa7S!4lLvhg-|s3= z7lAlPqU6`9{b3v>lq6jo^yQVOpfm{OEdq+{L`<7!(K7ym!XVjOk_NZA+BaY%dFA7| z+EeMB6E7k!fBmCoq&>Sw$PL$R}Vd`RQEk1M~>=XS!U$ z*}gIsv9DOiz8j#;{m8)&8L*k+w7|XNhK}Y3BR3H<6l~&|=P=B^1cjX6n~n@?T2%IYXbFXApJAz$ z?!5stZuiq7|3%eB+&vSaQ=m41FR^kpSb{^yFR`B6=sA=SYO8JJyvN4Eyvh#(#vBEV z`3f=SxVL-*n!S(w2C?WR)`-tV+nAwMNv`j(TviPHqKj)sX}~aFX(g*0$ryhh^YHri6{+r zjcnU_=aE1j{G#IVxB8$(Qe_5{FcU_hB;yGqpvNk>awL-&l;nP#&rGat)GGJ&#V*>Y z(sET&C`9L_zk{pf$9GCb7JoQjM-r{7CHe(#df=HvrbA2uwO6q14>juzPfMae0i#E) zeg;ps=b>*YKz%Qs_R)dD02Rbk1yh@?r!Bd4v_hPL9%bQId_lN^=EY8 zDcj`mE`17pen|N_7M6P7JNVK2`Z@I0wuAr_QBlKP{M}SrYXhn)NBlzY5R>OLccD$mnhI?r$ zMX^C3+XY)I=ubGY)qqF>Nx3Jld;?cA6Brr4W2MEmLr_!h2`=)L8kx{IsGS}|+1J6m z@~?q8;Wo3g0St}J9y|p)SHfWJ=uI^P#EEQn+P-#cb>deF+@evsyYhKGpJgeX0b?QGU3i*?#gj={CoD_7K$>9k9+}(J zCYg2@`OH5O)U@jkvyi|srB?}|0=a|w-3u`%CLX|354AvlLIGx#%l)PXVAomxiqU??bs-^fpQT@v#!ZNO-W zCD{CQ_xBw6H(TAHTAd%{Vp>XgWH1z&H(n9)5?$l8jz?k6KSb0y3|$2>*-9RT6@eyv zrJ*pW=bNZBJqqjg6;4LXJKx0#b&0g1>fu4bv@`e%%8nadDS%cwBMx3gnP4Zv2Q!40 z>B~`egz>;t8NmNk*|yt3EDn+e{BO5=TbTC+NegM~I{+}_9BsAjYtM_09eYpGE<@m~ z(kw8A;2oTmgG+Z6TkMBO!hjzMzT;#K({+uH}9M} z@wm6-9Ix{@Yq--f>m6tw8s5JKS{$Qo0+5ZszmTRM6E`54^T?0#%Aayw;Vpj(R+ zSp9q4V3U6nR@#vhPEG*K4d1@c^)c}AZhVzoXLa~~71G7pidzM;i@Wc_Q$VM9ATwUb zzb-7&fk4S=)$R0_Wt^M$kAZYx9eY;P^BnD(%q+ z0fd)?pMH&^`ozld;a42Sizs%6AD?*_VCQvdFt0RMe$5{4u_h*5EOkwQ{O3}Xo*YYs z`QLMo0oha6LUaCf3$senaE1Iez^f2LU=^*aVF-y@;Gx0LLx6T%?FUBG?v8V{ZzFR- zr;&(ucO+K3d)YXOcK4(awY$y5pxse*RH&2CS{RF}o+>7Rxlo=Y)Y-vaNT&8eiq|r~<=5i>uDx_85{kR#Eu~qPNgbGPYgTU{s zED~!&uB(JlC&>N=UG?MYL2t6{68IgM4PpoOjJn^~g=$(uc=u%szPF$-KcfLFL7i}M z0M#adD&E4j^`H0(J~^Xyk9!(dUt$$ar$BKO_-1Un8Qw%}!4@;HMdm?LoS)Ued4A6J zUtIIK`nfFO$VDvCME)=CJsp#8WNswi$Vc?wr2O;UrZ{Ma(~TrX0FE<^Z}Ps_Cg%-n zavC%l1ANzI^!oJtX@R{1SX-I0h#s1jMHRKW!c?#LDG&(azvia3?wq|ys|Qq?0%leG zE(LYA8GqXoF}oCtAE#RqJzCPA!n+jjvrCOyO>uOW!ZI_uOEKd91are3v%D^{Kdq=@ zr%Vnwk?Eoh?csC$0?EcZOh9iWW}gV1I_g?4#yDzrxV!Y!;t;LBt`Vm)wN zk^aPo&kH|XoEoqv>C7gsxl>P?40i8oY|E7llU!?6ud;jBraDOZD~!BEK3Mew?j9rS z$B|{N$S<MV)y3y*op5{#xNFr`d&dg#RBw`1#*H&BA zNjQkWeAQyvyj01@9nNB3A$U~E;MLZuY;)-({D}Wsd zCO-RGu&{&EzW8W2gbI`E8UuLGRg01xe??yK#ksKFoU*VK)pX)R0 z1!Ky<+D)0jj0X zV~@g{bhvdzsg7A0Y=F62!b)% zwjUxYxHkq009Foc9dHl;4;qbwZ{iA@07y20>;{A*j>o%6%A>0JQTm*!Jl+jY(HZg0 zpuITwwiR#J%}E7-d7Xh-fE*Yp*8yx2H$e6R-^bp$8jRu6-g^Z^#~Ty|O>wh_2HTJ) z!NvT7dt8Swbro_UhwqjUaP$>(s~oUcN|x2dRS5a;Hw>ETco0V+Lt12CT8-1TO$1)x zAgO3?9*{hrnh`QV;s=Y=B9o3l4u~(Y2A1sus?Gv30UB{NUAk&kL=pj)Hreymrn;vB z7|hT~hJv1l%-9*5Z7>ASk43UXiag=_2VM?^>gJ~kd26y#T{Efe=mqGY-Ixmc>uRez z8L&19kKVACN` zj|NjwE`n-<7eS*zSxygvyrNNixGxkrd>L~$wLhL5W`EFpZ8Sj}!LkTydx7UEy6~V83|+}D+{+*`>$kl zkZWQ7gaC-s>!@;Pzg~9(Tz^-ZLBO?KS64V0G<#P%?g%KP&?4N8l||OCNcW>!wZ0{M zUCg(vFgw(-E$B?z%+5)OK{a~rvKk#=o30!$080hrGzzAsU=k*70|BlYqxA)1^5r5J zvGOct?$z6J5KBWQZmp|h0qVZ0!{h_Lb>(HA(6q`Q;^Q)D!v|+uNQ>zM&@%2Oo$}tp z9)G6OlK=^y<~nk_{xpeqry24%>du$xH|5=wj_O>VyA^bdt2q z0+`JgHcNXC$)+Y*HG#Ah*00hZLytb8Z;zukZL@oN_Br+GI63I3C_kGq@7vz5_5Sy~GJlo4~Z=^Y_HS1E_W@oBTwDyo1OMIO*^e9~MYI zm`jb7mjIgp*5MhPR{4G4b-O&RnS!a`LDKG#_kO6DCMoJ9%rOX$@F!R72lVCpE0>C- z&9g&?#V%p*VbRv+Abx-a*#*$pfm`$PgbUtSq+KRmv;x>WlySloB~EG%Pf_A`N2b^W9SC*Tq_Qbi zgy)zl%z~Mmcqcr!0+0fN)inW_g%FVi=L?uw(y?cmKd?jMHQVJgNuzhKh< zemry*+G>3k(vl`ezPTp2dFRmiyuIfCbiH8sgQ3RQ^@3R@gxbI3dbNWR*F)ES-U2=ALg0$T zAaR@8)Cp2kAXA-d#!Vz@cbTY76--mbE|AS#xViWRyhdMjcz=V9aWyZ%uZsKyR<8CB zxHXj9=*UmxY9B|%9c|wGsqONfdj^i6?&n~18uaG0KcbE~>lF8RqZf7RUmEFdScNtC zH_XG7NtJ+VjVS>=Uhz}9+o631s#f3%bfn}@xKo+_P_F6vLr<{VXXfMd`eLgml)Yk# z=T!EJR8(fxOhqH%IvD(d)Sw6T0cOYGy)Jbi1Tz5cS{rgzImr>Yy}&Bkb_@JF4z6%7 zn0;dH9#@Hz^f<|2kuPn!KsYpX5q`w{gktJZOa~ll#uIW=FjEL^cly?uMgG$j`<%7! zx~xUMlvas0kyi9en4CClpfM#nubE1f1H3dIgvbfD#V2^#sa|%5-iW_lsq}#q-P`B;ZQi-5;XR@4RdJcBM$6U_ zpZ^x~;d}D1e3^pf_uAc4JQo-Q8j1@_m0)cZQVoG4@Qd04PX2(NG?>>axWet2GB{{P z`T)}azzm>wlHHQ8;BJNQbSW~~E8BJ#k`yp~5T1&uNmLUQ)7xkoDqz)o3`l*A75y|b zeT7D{12k>j%n(#yGrL!g6;-oJ9}-brrQ;I4*QAOydt9K(@m=mTffyMqb_iY>!PDis zEY>;`JZtU-Ep9SZ;RIEV8fb0q_h}Q!f+yeL9wXpfb)k4`tWcy!t~7KetO(G=*_rmb zJJM*b@B{Xm6Rrhy@?_BBfNSQ_*vocgiA5FwuFD43!@on&ddvFNjAPQT< zYf+jZXhr2PPdD*A?m<0|wEcuX$(^KKZpElb?G*gME|;xeorbyA>WU_ZyLH>xY0(@D z%*mC)eq3(}B?tM~mZw9@!RgUQLzU4-P4R=+wP-LDU+!Yj(D>N+dUya2ne@u&d;X2q zSPpMrSOhQ6PnS%MEZ-(S$AU3~Y0V@tI2IF8C!_EHp6mWHn2_7f@;BGEV-yDGn4_0U zP`Pm55-|>`_aRtXMjB6M*>%DK#$93H-v=x|DS4J=gEsqRYawP2KPCgCtZj7PNCQF1 zR2qG|89IA$i(En6(>gHJWw@O(2Tk758q5 z?{RTly{RHUX+@IIT5K@{vo;%p>0lCP16$8g=n+niCUL0qmuCy!Vhce20*o%R_0Z5R zUz$lGqFq+cp+&c6TLRxudq=c0e@L;H7Nk(C@kocu7JDmzi}s=qKX=cc=#wXW?J#4w&v80OUKM;X5+n1FLrj zAmJT(@Ug>3f=?-Y7Q$ySe3rpyIeb=0>dP#U>SY#4^)d~l(jkGNQ^6F3(alMER1{VU zn3q06RMg%T-IDq@n*V})Ad}k{%C_4}Y5W!D1m@r8JkMbDoQe?QG z$93z0FpB8}CXlM3<03E8d`=(-FLGei2=h%V$-zW>m~A*u@v)>EBH4x<;4SSJAzBjW z%1DMRM4J1loWW>1DsPZsD11QSoFHp=I*EY=RsG0ElUP|%vip#&W`|mGPXw-}aV&mV zOesc6h3(y;{Djr_L_Vum_`DN;-$Cnrj>Y<%O1KW`AMd6$KF_=J;>|RtR$dLNga@f{ z9Wl@)zRJ4dV3qmu#^Ad^n%%%Z5-{BfSF)QGxYXnASWc^0=(}#@>L*}3nGQ0;D|iM%?nH!g@FSW=hE!unm|xNBJ&9yH zt9Sj_01f|270Fw`hS;@-2#{k7t}I0kKCk*8lA0HMIn+W|3$W~-Idrk!pt)dLlMFH| z>KnQ& zXEFB?@%K(0e|PIBJTY9PRw7jti#aL3Qpe&VtM=a7v%=!acr1>EKf~w3Fh0kRN5-JU zliEM}L-arpsPy%IDi|bUssNKgEw+qM^e~p+lJ{iwdW)?7+A6D+>9V?-)wIDhim3kS z@S+xsY@tObUZlWv;;A&2Ts{dpzU(W~6jO(+7WF_&U9vhKR&%djnB(~=xX<~n3*P25 zcnP)~w|?GPOv9k>LR0 z%|mo(^LucAZfERZ8g7jaW+AIZ#RjuDJeXxnMh(gT9Id~s=i!pk;($R27AmE#vC41g zn>I<3Z7SB%Alsa#CR%1NfCJ+jSHQ4$VvN*sO}iae5A%ptEsDQonOk*+0A4S4mCExfb z%FPDt;SUBwBhM%2yUb^qKA*)}dUQVX!}Ceg=fhBE7o7o}R3{xiOir6P$V&e$r;1leH=fF-*t>0zx#*Cf%iLSnWy==V>A|vh#;lKQW{jLiW?oi zb;j2)fKGU|2mhrZm651F2l>IVrxOi)f2AAqtWgd(Rxn|V=Eh)PHko-?B!^gf1FM#_ zVjvXL6uQWz04vBk34=TrnBA%HgCE=x_n?3Ubl^!fnc?DCVE&vosBv)zG;wZieRrW_1GlwZLUPryMtzoti+6EdgS9#WGJ6r zjc(T`6nYEeM0;u30Me!{pG9M40R{znl7@mK6e^@w4>dg>#xJ}#>iRf+yGxw9tzR-Sn#Z0vWX42%rfs^nT(;c(0+^2 z7!EX@?aS!ZhvtN#VW>GPseo~>9a{TU6b$+kw&gT+1pvrA3ufCZ;At#Iq>AZEZ00!G z)CyhqDVRMjiRS;RzFCfucVMqvN}C+3_1qqAGG$hHNW`qo&Nm0R+E)xZ+{S8~Z;y5@ zEkQV?bSX5-CP~YpgY3}rtG_@AD#yu;g}{Oe701>?p>XR?GU0 z+4>EPA(haHkT|;|Po_*K%+}qdj)U=eQx`HL!H|iuxCevGWPDIL zlab()nCZ}TF!-51@`s>}Ej^J`wa(jVl`L})=GP1E$JWCUr`_Rj(<5gaZdy|j2{-Kq zyYvXdO+DPS^X$S+7oLZ1e6uPrm7jma)3XulodNUwl$K&db7Krx-YYI-dw`@_``!M* z5N=R_zM=0?WE$w+#4Y4btF0e*dnNJ}-U1`3>2nj=?jQnnd{JPAzO)?NceAWC89e_q z(S1AHTTO>eo|BoC=Q@1zLbM;!y!Vi;x$pw>1MWor8-Xi1=>UzC=BYV2T)yn(xqgeJM44F-GuwG>zP1<&UqpI5NA2w+BPHA$#8H$&vYCZ0G89lq&((UIoUz2|i#DRQEbb zwWjbP*IbqeQWdL6kMIV~14@$Mmzr2aWu!%W4O$>@8*_)|`psUGf#q7p)S%FU8x-^M zdWB%G)xEjxlIlDt+p0ARi`o!Za~I6acPB`RvQ0F@`wU|^sg0uE)=kq#c)kEJ;SM>- zRaCqct}n6nxl zStyp^STZ`JXLLp>B`LKi)3mg>I-_Kg_b@8O|W6b^qV@`}&1*&e`v^*Is+=wb!G5j46CWj$@2Be8XC$PlM2N z(nqt1PAKtpkRN@z|?n!V(|U z2Gu%U+~b@M;Vi*fI2`q^763-r(BA@ig^`BAPBy!O9AG-aj{B1VSi?Es%qq8nlCTBL zGz6DGnNp<<=OZO#Q6i2FYlHE*HbSGW=S25LhM2A3E#kIwGMu;D)uuGcGI}JkLfhFH zVnTKrB8$cMc!;TbUXm!K^1TJvyK2njuMNVA>u16)!@cT8CA#BY*7++_2c7mu@D(IY z{SJ>Gz^vtz`mac$gVjU1- z_L*fg1hS+IE^u`qDT zg$-sno4?KqLMtSWX2RCxHsX|-tUw7)gJm2fwfqutVKoi6y%ReY$*g! zo^F?JPbvZ+ECu>pqmDP7|L zC4B}vkDU#`%uLOXrM9D1@$zTJpx>sHs8xc;O9NNp*2Ul*ljy!*kN+5S7``qRqvY;j z`|gAD3e_YvQ1zl3Nj{Yvg}w=<~g1V$6{o!|`^8#k2)&Jhq^Q zn-pr645kfpCns$1hS^L9ovBv>EQu#Ch%dP(W)Q?MP&(kz3!S%rgj{Ivj*a z=f8!2Gwl#OKf!~i*dM2UarIBA@OCj5pka;hLNV5}MewZFal@HUQ06+av#$1CJVR^% z+7xDXKM}5Tbu+u8ddOjW?7paFxTHq9hYi#@f0wobm;Q7@i8oxreqVz($`z=Cstlm( zi`vdlniaJK0f?ePN6Bb_a6f`@)}9u_NU{#11m<+1{)Ty0lpvbbGUP z&vw$<*bW#n95G}x4^TX*bHN71W@x*sBPK;+(x75%p6t9DX6Jn)_R> z>F)sQ?>WrT3GWgzscV8H>ggsu(7$rg^xxqA{Ym}%4QeT2M;^Fn|1fkQ?^mr7zg3Qj ziwwv4y*chF^a4rf5p9SF2OjPZ_*aw~Xg4us$IcT(Nd&5L)fqT9xbE|ZChgD7j?+22 zuuty*Mgnt0V+eQ1(SSLIBkUtY>7f5+kvm}%;k<`jV}tCx6?-XSpF}(nEXEq7F7PM= zFW|j;xrbu~^luUMVk4JF;8=h?VK?hkEOw12K;5h-%R++g1>ChyM}K1 zyleOc{TjNUw-&4S^ESMW|F&64prp0C`FR7-t?!#hkgplfi?p6`Zlzsvq~T?)!Ipr2 z-}%)*g;b5!Fgr=Im{a4Oy2*m-^pF8~oLu#8_^g}mhV4=s99mBY-woS+w<~wU&IqnrLuX?Iueh~x6j?(?#%172#v**pV%*W#srDBk%yq)raWrXMX`_2gx_ZQr+` z&uA&?4RqTcYb8l>4SKp*U5(}_3BwX~u0FiT8E%(G>Ph~@{w2Zik(5BglQ#zZAB$uKf~FLx;}odT zD>C@2Ta$`KtH){DPBqLZO^po+5xwm!1?cRQYo+)HQ1zwi;1ch>V1D$<)qNi{G~vxi zdwJhcGfXVv6Y)U@(NwWu5UZ6?4jU%AjnJn|9AzdR0E%JU$3t9ioWp%_SQWxR$s&yX_$&Fj0QqD5-J!C z#BgLhB>j9VB>~9B16>@8T6K7D7b2$ty&4Tf1-?FM)|eM2~@q(S$g>wpV-=ssgpsq1IPV^-8F z8wqqAx-Vh(N!@RBd{VJ{JRrY!G;|&N3jOp&jHW)dgQux?DP?^T5AnxDu2a-fVWBPf z{y0p9?;SU^3g3~ulZVFz!0;>;!9I=$5RZ)yhG!y&5cYRuGJqGM>x;NKU4`e^^gu-! z>1su-!!xMAXK-8A(+=}uzRn!dmnI&8GYMvZ=_Hfl*8fOZ%{-gDIUoO1Z9Mp-xv{R;;l zx)LnWQO-Kw)*$o4ENq$O(4Xaivg@Ec%YPHu$TWi``Jo;z8+5^FMc^G*d?eC_ zznmkYTQ-Qo$ZdAXTJ12^IfM}`**PstuLMPfKN&j6UK?bJMRUzV$wa?Fb4ZGM+ zG#N=!1c!^nD+NTFbppf1SGb=~2y1*-OUiS^b?v znDsVJbNPN3tKIL6t?yoV9!Ivr7jfVjb(e}*FY;z!343pkwR_FR3-vEWZFkwou=L=PvNI#IQd50J1St6 zm7y?ZFrUc*?u>I~Hf!r#8E&&&GY$WNGNon%2?tBfU3DQP=59Iye$p=1@1M}2wOmyk zPMhq=y+p+~k^_32%bWG&Zb24B{oI$b`*UR z0*p!h1j7H9tehEAd3)jyCUCBPZ;2%?K7?0Ne2r3x1*4cMH31~Bs*iY84sBJ5lP}N@ znHaD~2|6xtxEGCR10ki3$XsEyunADNi z$4?ZAEf=u{J~ktAjKFhGNL2NE6!e2*t+@eF5UomlX09eQ1J#74V%6?xc(RxlkN+g< zD2|g-QS9YZbTwAgl~;tPlWBN5nHH<#lOV@*f_+FsZ_wV-MlEz$ix%c=uUTW3sg9=y z-b(j^z8K_~tOnf3#v0|A8T=_;j+uf_fmv<|4?CXbQ6m~b${OO4_H^X%#4@!r%<2J2 zOJmQF{?%Q8pFMQ0c;w;~SB(!&As3X?T~X@E`ayBboht@|!F>2Gu5(v=U>h<Ml{#KhgSYrLX6$6ZMQ?e~G|7mwsS6GHyWzymKF5z}G7&z6nP5D=IGeVs7b!h055w zltic7l3=Ywq6=ugJ>k{>u86peNqezlMmmZSmr}+mJ|oVa-nOwpRA&{BABJbMo9S$J zc{4rrB+m5kVK}oJIX43{{hf&@b()6gs{Tke5a}Ympp4c3M3+Uh07yW$zxe!p!bs6~ zQCyj{og@T|Spd8t77|iB}L7iPHwVBR4gwdN|KE~b0=i{rfcmi}qK#Fsk z8WrGE4CpE~lv+!}c&+6q2K_gDMJI7kQI@7!w7wxr9DEy&<~OF(c(^2}l(Tf+Ks%f1 z^xV+-5vhY@f0()8{I@tM=5Gb4?)1iR=UDflb0R9LxEl;}2a4!7TGch#)8^E@c><>{ zZzxXH^lCUqyN;At%b~tdtgjL3YZp}C@k`Wq2h}&2*C%6r?Mkf2b>_SSZ~~Un`)SYp z!X@g8q`FuNDt?u!3MjKuI2o@Hm<$De;03Cj zaXeQSO{Ehc&jiS`kLRgy9Ux|8%0t*9~>#VI^hJ6;VWevbvJs z)U~(3+%;(z_Rc)C7@b#}4GSJhzCDI};dn9yrYBcezTO{NP?opFm6k_&Mj953N}kZH zrTip%$zQx+ke4XJ4}75)u9jumb|gn8PJGr7KJocHawK+U>PAw`x5uTi4L_g7Ej(sn zY`Bhp$!$0*Ta&glle}%Lu?odM(H{>DhxG@aV_q1l=6-Vqk=TAusvpb^xFx5j^0$#S zSUqnno>?PlyT0N~gpPkWJi2+mz5rgOL$vT>`D@9B^=6D637oV#+)k^J{Am{6-R^{Pg1y7{F5@{ zcnfbPc@ow(d86id&8qo0S9A+kzPx*yI zlNU}kIO^5m^rhi&{ZU0q5h2{7-9t%IPY8;z#Y4 zV=Qp6UTcwidNHub6$*>|BeKYQkVRev7*Iq$S#z)9OffRdHSEptbPZ^&DIgYqqZtRA z^CvOMr-@0f(J;yEG6ov&$ANZG2kL0RaY{)%6ls=CnhbR7aidK-G&T4wRqw}hyU9jXjithD#mhmv~YuBQ1hWTd0xj8#@s0CW20d(;t z6gW55B9Px1)QGcnOy|nX&H1m+b+?4)tUx6-m#E|ksw5LC@f%A}$6_2Z!F6`%UdbpU zzQ?<_%Ba{OKs%*p`7g!NN9(!7ZCQJd0{bIeWTZNOT#h-j3{!V zJWDl|8Fz29Tn`xb^1IaeK`Wh{DA#cKHyUT?0uSgH0d60Lzzu^wV+^S{*KP3cwWy~n zXe#M`iAoL}!AibOL^22kz1HJ^&~P4f2yD$5?rqtdQ!S!8G{#EsVh`z8MooxY5?cpY zH3CeDieAlDT%n3N0UQ9a+|l%IE$0k6!XKV*OjHlR{SY5Mx#?o6!`k!L zB0!1&J)?uJ&&r@f27ZxiMMDjvdwK;>uo{Je9YzZFn+~1q;R!lENFtboa3esw-B0%eYXk?@g_PWEFsfXP*8sf5d+S9R@!=~cyu*67v0Iycj+ClZ3_m3;mG*Yv6}f$+Rr zH!Z!2A9We@YTosiL9Y(#ThOa@=1b74AbwcBKEMyBYWQKBN+gDlA^@xWa7~j;{P3-u zAHI$A!|_^vIPo$TX~@rrDu?<9_~BHXn`!-9<%hNOHSPLK(AVnu7p1Sd{;kv3j2}3C zHFQv^XSd&pzP^5g`eAb!(bs)*)eom?ThiA*c53PCsd}QX>wZ`1>+>mX)7J(4FG64M z9{D%utEWHV-D_Pm^!3w`|1*6ZRgF^@A0I?t-|u%h^fh1^{83yD2Ag>Ds4<*obz!_R zc#k0r4HIhYUh4`B_u@@oWk*mrijeKMCY`o;opGraudBlD{c;7_!+yC6jf;Fw0Kr*@ zQhrN5Pw+*5bOY*(z-i4lDO~jV@GGn7N$N8EW#fNBb)0sJ(lRVda;zkhV^NMv5IoaC z1jW@jcJG(DWD~sZCEf*mQx#}Dg`uS2KA2F+he=Evf@(Bh`a;P8rs!Kn#eKdyO#JtU zq?EDjr50Vvy>ypW{)AmBxQ@D1ctMw}$*WP}LGZ*!;ma3s{OwA3bEGWDcEQ~JXp_EY zJ(8N_T7kYg>T3{=orM`QakledvgKb|aXibN8_ucyIcGMju0 z4ff$sa#V&fzF~SiRMNMM;OvWT2bHp2PpDcub9=b%MXepNh1L#LC`zyLAKq+0edkMT z-XWFPOsDOr#B=gyQsQY3c;hL4tb^ZZH=Ujv3va1kh4{Ov#d&4^F!*jRIE`2MD?^=T zcTFRa#J{57lW-u6>-TiHwoyh0iqlb^d_8IHRPG7Wu?@c};{TZZ{^2_IIe*1~QbkO? zCs_Chq`Vx+I0-Wrs2P7`&jd2wjv2Ecg)<`_&2qrkT>e_9yy6&>_KV(Ev-k(JD}Z&G zMUSL@p8~6XP=A?CgaTwR{8!5e%3tOy(T`#UgQu8xg1m}}UP|)E0ZtT$^2Z)cJ~?_XSSxZ9#hNC+D-2uw4Gh0oHDa_SRA@; zwR@?{ehi#fM$u9@q!-+br6~<^yUS!RdAwT`m*u>|>}^M$1E5ng(L@hYY+R`(lMSbG zIDW}mWS4UBTrQQ`d{M;?2`?yCvZ*H#V**ok1>Q_}LzUTzrfmi1>Q0o|xHlSXrk@1Q z*JSZH2lxr=3e@gE=1Or~>9wwel|!o*A^tr<94J4)oNy`IF8NmCOs)Sp+#XggqR*$D zVnU_3{%p7%x{-|v&Iww#m-dvdW$5)XybKnTLG^qYw$r~GxDbDZ&9vUx)owD(MH3jw znrrrkOSKl-{ADp=5#aH9In?f5hErKW^GdV!7tm~5%7rtBfbVRP=HyzvH#GzQN|?3W z0PHs=DX_#8_@bHq;1SCPB$L!z5REBJjaTBc52DR_n{Qx42@kyHS)qr6aSS#;*EAmgx>sq}QLmmStE zer*KtCs5tspZGTeyPlp&labM!^_}KeZqic+00oM+6;TNW`4eO81NP>x3}s8 z2dJFgiY$|EbaHMFo4e$~lJ;=K`#o$W7PhCngVbKgn@((0dF|M6+@K$bOB6g& zAps96`F8L0mwvC%hwzVgyJ$dK(p0 z(4@gC%GI(eKIHe=(w$U@*KqyNCfSmFt!X?mMr(;NdWTkCsfXbN;kqX737Eke&J6bM zL;MlJ+B5+9qj&Zb^Ry@~)$A@04_dp?wc~(0`og7hNB8$|O=*=os^AO_|5?X^xucq3 z?r8T7T*djZcCZ;CV?HHuADNBfqFL@oFnY#iRC z5RtoXQ;Ep&DwT-*TBQ;ZTwP<^q#tdos88O7%=E22+aw{kwMjzSt~8P=Wmg7Mk<^P& zk+$nvyA$hr<;q|}0*u)*+RI3BukI3c%%?gsu56|!&K}C~hYf%rwJ+2JHt!Gm2}9!$08`P?fnb-y_CqUZU<9<86}^EdMIeCpXS z<;$pjbe`{hwR(L2vxv^~9j2)t;`X&X&tJ1ad!CPDbe=!9Pd(3X>>oJK$EF8+zS;{z ztl%=lS9_=@`|hN>P-{(s!&%O1_$xL0?nUE{a!WqE`=YPBnx9yWz6oLEnr>h;x9(WY zx&y=uzg4U|%C!m?t1qE&v8)^?ctI>433Do;wd2rQrMW1I=n=X=iCKFUS$9;jPvemi z4JTSTe-hf}@)5L`F;zhOxWy>SrA{xaL@YePuQea(e z@xtQhZI>1(7Of}!_w%ztTID{W{KO^&pzI`a8A1U==Tnu>L`H)<8Y;uqV8Sw`S;l_-pQB z(7M`eIwiQnvE&X>T8hb*lwtYKaOmJ+yKk@!yE9H&RHt{Kd$3X+dMvpr-vWpiH%=N{ zhpw9)VNDKGy^!|-BszTQi8gc_B8|^93#%ioQh2V#YjulK_)fsXrB;kbh%(e?(6n~S z+jtqdT<45}PA?Txtj{=aUo_sDw8a9{Ee`R(=5r*nn<-nh&Y5nJ9Bz&wuTx4-N_kI* zp|`ECD`r8J%yN{1Z$XXv#eK-RB8(LJ=!DoMOB~hgN?Le(@ zp_+^7e5!D0J7-U-uLIVVgmqmf;@$R4s0*#0Ct*FBI%+}!bvQ>Aj5ZD()qKzH8z0Z= z#zMJ%)SYV`q#_A@z!Xg#uW0HB{XC>Vu|RD0I?+OZy@kKubZ%5+k)o5VXr6u|;L=ZZ zw#TG>W29ka=GD_q^O&C)oO95u$G$Pj%OKbI;5$J)N_s= zl4ZrN1w98#I$KJl@JcZ^?BVEjp}n?x{{*-NBTup5$j>y7{9AS8e~gi?!jbpFk>3Hm zG=Eo2`_)7=$qon9h=Luzot?YIWtoR)SiPV&99AD1R(G2e)ms_ROej!G1G!o0b_Sj? z)gBvLUXG~pT(W;?A=F)QhJ?DA?P%Y7r?V>5O^YON-6+@gF4NJ*e**1JW@06oa5lt1 z0m;BK8zPByHb$aEcTpUQbmJpYc*#?I(S5oFiFENRi;mx|z8PXT6INB&BaugxEUN0x8-k!1xRZV?W^XYBx^Tty>@ncI~{iRtWVBaQOI z2omNdE5ckV>RUzt_C*hcT3N&_&2i;kZi2Zm__#u)q*wV5wcC7Lc?a8eNShp}nLDDC zU1wB!ra5wf<_YN7ByFf!d&=%9+qWtvoJULF9~z+DN&9uw+d*iDU&dF zZx=eZbXX7PmOsl?8SU5bmHno?!r|P%OFhE;Cj(Np2Qn65#&zY2Fn15z5XhK^8Q&^b zg}K%uIJ1}Gg8?4USkQx0jRH+H*x=}g$qkUK$A_8lfHF#tW)0!@3iw`w>uWF)=fUJj zx`BE7%5sa3Gnw>l+ln9aAAsW!d`zW}70h!T4yG4{h)`vPWVGihCQ0F0 z?om1xrnVu1JS$hJGQ(7=hXhM_4gTSDWUZ2IN=>$~ND+OMzCo0uL`<+25nDjlhF)KB z1j%zFxICBRA?c4PB;nPUuo%|w^;ATljIav+4Y8Z%)Hu5f2Ksi=44~54+?xU1bE;6r zN}p}$tpaUSg+zB5ntmK!@IGAURzKZu_Fwq4NuLgSwMo zf2n1~RWOD;m6td5G6 zY9z|Euoo^xPP4oi2#4~CCRdr$faCC@gcSYB7W-rDB>W%+g(CKIFYJ-4*lx-(Le|mx zfG9dA*5B3cgZ|T%qk*mNg&@j_ zi9WoAXV$NQNq6{0C2~Qc4*|py@gs(E2h3hYBCRd(=))}!KUMHwUkw?|zf;G58kAIB zC{H!;Uyo6F=ZB8hnl4WHtDpfT5zLZanF9UVEGB(K1COs#ESzPMYzoDAJP7q zjF_ufCr?O&S;w=sJDdy4MfWZw0*{9 znC*4s;`+)`$@qH}vW$FUe_EAaVm)wD0DR)4T+&;lVb9v7Wrf6eD}H-gfq`A}k?U3| z>SfWibwQF@3K2~k79?1tG7B6LearYd+R9EZ$A)~|bt6?I!%=@)4F?UW+)nX> zl({|@2OY%IiI<=d1f?g-2}+)QbU-<54*RJ#1*2SXBE14=>neruCG3RZ7IMl{5eB6v zyi5*9ABanI!RFz?Z=`2|^i&kla*fLvsUJ`UFPq-Lg%7_@q7}8mCRM}oTj{(`D}m(= z%zZx~gk9;X@rPq}Ww98V7mHC@4vETQN#&~~jsIjQshLV@mhzsfychCpD~R~Q+QoHp zt7h2%l|?Alzd|b}k*}EeORSheT@Wawbu0L4d8v7|;NrL;XsPtlE)|4O-}h;u+>r8r zyijVNC&>+=LyI*r_*ps^LnoH;t%j4S{x2XmMN8i~&MNKT{9lD8M?0Pa@!WZXUGh{Y zsFta&`ffiVYVJ@`lYn~1H9DPgcXa`3{3_?{B<0D^+|naC|J|_?U?3 zvhl?LK2C#4NNf`y4ICeN+4Px;K7M*IJ{p7YksA2rT`fM^l_mfX^y5oI(c#C>af(hG ze-?2x=q|x)&81812;Qd*ku#sT%rLNBA^audOB$>>27j42D}*#2jx^-ykz#d~e zYL1|3AB1_<;jHVNPXHEEnrTs7>Juq;yfle6dwVO}Wum_iaZr4}jAu)`{Ea`vMk?gsKN4Q@VtvwoK8%(Ez1# z31W{fFyW4um~$`b_FI7O92~U3so8hc0)#_&J#5)4lh&3LW=ql81^Y%SiLvXZ=F=Ld z_3-r9I_~M-R4;g@p}8m^jLp;}czViMe%%V%KxOoTpZ5!OcL>@8;WX0lsP*_IG-&$D zVL_wlw1h^TMih;Y+Jeztay7%|I8WJsc~TuT9~q9~iK>>PF4l~CRiFe19)QVF)yA;R zbmLBgetE4r=u?8{fxw^}foYU+r#)ttenJ9Fw-}_)g}kF(a#dJ;(?d)L=gpMPApyV} zvy>Z(Fs8}@KlAK&){7M7z(Z;wDYMJ;u3zCTE$~*^40x*tYdr#6K$9i;QN8mU(w^gI zhBHg>c>So}{~o_LwB{?hi=b?8uq9Jvpza5sf7W|5qr4~_I#v&AH#1Jlx-~}(K12|$e zN+jZRcrZRp7kU-pbTB^gDIAOs6ss3{H0Yl;s)yXyZE(o_wwNyTvgpeCRW1$M#>zVK zdp#=Q?~6L8DRa`CSHh;w>n8D$Z zomU|XnBhn$#Z)4_oKo3%4Y-|pb~(G#c?5m)lC&9VP&{Q&Fy&ky<HD7=kvWIQ3QEyi;djYS6xY1{n8fiUV^9{!r zT52)$BBf&>SZ553x`y{SoQ|mPt)UCN|KPdb8Lh~=*gu-iQ<<4+nQUGrjE<2>sdRA& z45yN+Z%%DsF+7z^u^hA<6O^j@?2a({d4ho#H>$kW=b#&S1L-8RB>@AJwNnl^pjs*57W^7ep-`ag#4Jw=R zE63=j2<1M`KoQVMYI}lcPNT&;8<;2fC(G`glMA#)fbBQml8+yJ(Qkz+*K=lHdM}PA zg(vE<%lPPWH*1punZQ*wP%*d9x`fu|AD`oT`tkgEIncJY-LY!BYh#rQ&Mej)8&>Fd z7Dc|D{v^Mr`)f@vpr-GlrZufvl0W7`#l!7z_bF$~?{6Y@^T&30N%yGUbsc_vlD@jG zL{Z?QOuTi0_y2?F|vp48&GlH!LEoU@n;u&ezSLz zY%bV?kE5YOKy6k=aT6}^$@yPz5tH&NqbZW0%8-XA33v}53;Dd=K*5z0GM(dKNtJ=p9p{pt`#Y+{a% zs$lb&r#QQpU+*v-o!b>%6BhjD@2u$dK_w{Egm1s5o-Pe_-s(QmXd`i^?efH#&wQ$g zGaos7o~ZUXv~|`I)i!+uRQtNGiE3ke@u-nnvPLD_Y$TBFc3%g?n^E7YDLXLb*xIwQ zKZ459%;W$CtBns2%xF%x<_YQ4D=;BneM%G3?gpHYk1jePCmYoX>C{1)5VO=2G$CaP zFd@(1p_z~=e|ti{Y2V6(=+y~`F@#h`^v z=qw}py$@hco?8<Zayo>mnf=oYBCTl^XE6iHZl!_`pQSKw>U{VX&N?1uWE!I3)$VDX&ZK4owmF6%Cx!5^+D6t32I;m(lpaHu8nE4b654VaoQRUHeqBrZrYg+Qw`0T zUa$CTjP;S7&8@Xf9;; zM*%#g(eYk1mqwWYvfa|v)80jR#Vn#y+t`$^$mKyHKI^_De+aiLN#?IeEeNWryb3SV zW1@x=1?+<@#X%zU!iBxKLz$S_7<5$jn z55kY@#v${KYwAycoDo&M@Y+@DjwkIhc(Ha@@HwpSOIkZp1X!e442Lb zo+s&glYEBiS(mX*)`#}Y7x6cXQrGKg)Hb2Yl-%J7fx6dxHfBTmf-lvMW{oCg%yq^!{@OIbg zYwL9ZA9(PdSbIeC-t3Rh7jgU~BKaB78-iAGHiH~9eIM8tRHDQOf#9&ZmJqzKzSw4em}DpobG5S|B)Nr`j?em$ z_7Lhu9f{`-*4FFM$(lxc=$@Y%1KLB5f_6hkYZZ|6>``6?>LR_(tMH+B@=4k%dTOfZ zfFOAYjwya)31aeC^m5Sw51J(-jrdMpF3z-90s=@=E(izPMm(3j6z9IZO`<5KsK0-? z2$YBjbmYGPRA2ZfqSwSDw9wp!uja1byy$mQgE>3j(fZE}_|qdJ(m>EH-XT)7p$@@@ z4IK)|AM6P`198PK(5Amwe^ao(L$JSI6NOdtMU|q_oO*Qj`t{NCfkCqW`$5h=`nLyZdkcACQ-yOtGZEqI zolnmjXVvMUu%WF}AS^$qWqHl;zww_BRKi-Rqz(KZ$SXn*4W@3cYt6aYJ#@}qc2pvf zcCz|iXiGmI%H0A#2Ag|^UgyscO_k0GB6)fJf#*lhW&UW71>!E4ck}USXmSI0y)+pl?G>AUY$o{qUtm;m&oaOv} zsr`Wa^CoZZs^<&x=q`J+(Mhk6M>lLKDT3!2ctBQXZ!OkYhipeNror(cQ*{~~h4dZx z`+tS${22V<)+><3<~)HMGyYZb1xdlxz2A`ERP6T-Ic75yC`7-ue%#d}E$AKa2jowO zL7qaqrLDJlZ=ubuqf*&gC{h$o9eyQ_e8H=}1GOra0sps89;F*YDWb#g0j`O%7clOQ z6zJ6o>|TSS%L%=b{}mSSXKYklB$NIlU9(`0pCCtS-Z5bJCq#$q(D&VVgIy|yZKlgB zzyJ{`hisAmB3JyRln!b2|E4q}rTy}9P}+W;29Hp$GnPJodL#Q$FU$EOmDd~mSEHII zJZBc@*&3dNoT>5&s(G6}_CWTJCKcGf5O!YcXA!~C(mEr^pEPks_lQCJ2yStIYah7^ z5%u_ymW-3?Bl_5D3IT25FBTm^6S3siRxLJ!n@<0~vLW23>Fr zM%_1?v<~c#Ie8G&MPIqkuGXsp$qs-yCRK9w$A}sBh6$qSBVl zbimmkTdIa88g(}BZFcVhJ$C_2F$|2_!y=hUL0gSF{73KiUC2Lb{O?r2LQUkyoBMuK zW%Wh^A22vqic-(oGo(c{*2w*=)v%P?FngWon-I?pVqcO`G*ZE@FcVJUErpU6&lag^ zj$CHIBw8|1&kCeAO(@3a<-(%4Rap%?(-EZw6G_6kf_0n(-!a}3g&-p<6KR4GH-Mkp zlNJ&tM00cbc=jJ7uVn@Myd#CRFRPM39JskJ*@^p;u$6tHqb zQ8+g@{)Xojhs>@z8LBI>cF>tSHYzc$kHBWLr)#8+yql>*9BK~*tXcV-8n9+= zLb#4SOG#*ORnF2MM4g2?hwsruJnMQJJ%%v#DO ze+C$0np*wDsOBUT&0yN_&rsiB3ks7H&C(vKZ;4K4^DQsasVWutvEO{IFBygx8}3a8 z4j`Ih&()-t0yqH_$Ygz8$UBB`G(?h$Q)2F|*L0yN->$pVly~@5nezT8_>{ZLLp4)= zs54CY$0^NI?poBE(3elQ9j4pXa=N*|cYhsDxAUgQ2Kh%iO#c;@T+ytlTkvOXdm0WP z3)E73hJ>}ZFNZA-#ll_GY`^+D*_AxjL5KNQx|teEH&ci#w#z}5uNA39Wi>yPB%^rU zgd$SdWTW4B7Vu+O7ZqJ*px%AX3d9K>-{`SI6gpppA`Acep1qH42%!LJ)i$+H2)U7 zKZ7k<`T;QkC-bTowKGg{QMa?vb8&{9{b0HCNTTl!q^XYO(~1mqZ5&Ow^#$cV$P&^d zqiu9K`~3wVB7=@KM|C9wB)eq&#DQcrjtHXTJ7k7iQ;Jm>QnYV0RSHXv5{g`4-zYrw z10=vX2}o!mjzv|XOhgN{RCP!s2UE~?S9e*J+?_-2Fj?z^0W%ED(J3w%7R4pI4&hjO z&BfaQVWe$ss5z0^(Hky7O;nhPpN#Vj%C+2 z1|nyrvaNv>BfF=TI998Ud-Zk{vjaYUf1_h}07hC0T*a1TSB)_g(?g%GfQP zc^Zbea4_~@mnPYNoZ?4tb9>^eAm72#MmZ@E;vxfC;>k^ofav%X@|;XpMrR)7O%}6i z9p`RS*=`+jx4vBEsQKbv4#p}D#=;i&N7%8*)a0BRAe`zzp5H`k@HOS!|G>StfEfyT zk_#Ng`DnqA4olyW&(@r5L~ob5!V4R@u^+s=N?t2pL$8(j8lQHBm$0szUr7EBptpH| z^Fu;0%y4nOwYe?FN$wRh*V!&Le^FevzYA9b#1q0mNGpL8S%^pmOr*F>hY7rygnp-% zTIlLUHv=9f>O!!BI~91-X#!{WXh|dYmy=3p5RFF?OF=!oBu*ja3BCC%fPb|=iatL4 z2I<2lf$ONt`aKE?RGw2&K-$b1tU1#-27Gaj$41~7@a{P@fA~JYhAp4pi~!R2 z%6|6dLmc!4x*!A)rBPxl2q5I$4wY(=05WCDb@nvOEZ>4`e?cLHgPFP{7jaSqZ441xNEH#D{C9Ir zz+_S~7|cC(7%xM|;2{a;&i*6Hyr5;ZIdjn!)VLLnOffg^CkEBXJcp4%y^-5GrvpLr zp)xN!nDI9oKURQ^m;XSGCk7hN{g!Uy1&=vQr$g@-htM6!@ett2)Q1T5;i(YiAzXbx z{eHI`B6w~IBlEMFWZ5z*ksCOsvedz(vrAS_f$y}3v1=*G=i!R&%Zj;vdn#*uH&lrb zLA%sAz7-M)V>{0fDd!bz!k5|uA+0uCn$%{)A0@Tk@Whvc8s7bgrr`{2!(*x8X{|Rr zuI+}C+Gx1vFS4v@c#5{+>IO~2yYQv*_VF9^x-hWG_6`F6Z^kBy|X$W1vJH@;oGvLpBFk z-Jf0yg64k(&Pt^+i)KWAF;Ekv{9d4~hMQVIO(Wk5s_AWB6K}ab(6?jtjl{EAXYgcN zrB&&u=|iT0$gI_tp9d=aN?anT3{D1OIS-CXhs^ihtBFpN$ObLsS|Y!%3RAw+6_S=n z|4Q}4>yMI_$QM1rl@B`#n*-1!vWjd~Lj)+u53iAe$ScoAaEdao=Dg}p$$$oV#z4@o zkK%GUx#TWzBWx8axy;g#OS|+XS?o4b&2Ko>oUT&MyY>XA=EOKoHg{}P$>ta7f0J@0 zJ%yAjraVA4r(Z}m>vt<;b6j;xvWW~LdvC(uZ2T(^HvZC%0NI=#Og0}@$Y%F2g(U7$ zspSgw;kZgI$EXkQsATirFurVH1(ng+23HT>9 zbRZ2c``Bv-==`D>yDsBqioD9V-UwRmr)F`4B}pIPIM2Ux=ozD!KgHgPsIP06Y`v zwmR?g&9Hj7i)Lt9lUn@Mx9*CsVk2n=h|VRTCZ ze~DJ#>^Q;hos(?IhY!B!`U(w&?Mf7H_O~j9y(3NIokt;ciOr<$V#kW|TqJX!Zb3U0 zY?(J0L}Fj4P)MwQZ>SDZZ)_&9D9d4%aat04ne9%Zc2jt}iE6u|REgJp8+OC_!u`E$ z~y_ z^aSOF+8Cw05bD>CC2EwZP@}V(IlGs|*}Y_7_fl=r<07$qTt*i}mxg9>y7b4pDj8~c zis;h7@6`|QO((kajiAz{J(NQkHh$Rsh=%p6dVxsO8%q_|FMH2z=+bcg>rlNY;w5fY22%@-k3$G0g&YSivliPY=1zuET3k7L_~ zn}P`yVvGH5AQmmC)C!fX;3mt?9^_=DI6zj2+8jDaRLViT!ZuD)upsMjE%6CxPK!0N z>kq2z01_tl^{z%G8OC`v!oZ05ngN|O$9x>7^b++6QoR5&N$g2MA)FbP#a$|4MEBn9Ym03t^aET>HUW}LAvivmHs@qgb31#GWA2Z z`-mVVbW{nFm2xaIhNzWT9?}q`(S<~i3~q%W9oZQmNEhg%Vf1p;L_%-bW8rxR_kzL> z-KW#3imSi2)Dvr=f76=(#58`1w2EIMO<%84w-rP_$gF6e=uLmgF4ZQ<7O5UDMnrE; zG5l5d76_u(Rh62bQw-$o*%D6P2Kgq%(A5h2f)lr5wqul*2dmQZLdBQhg~l#G5;LF} zHNkUW1g>Og4u2C#r6MM&M4@dDRfOsw>857dMrgFr@;4Z;J@c{AqVK5DM72>f_arQM z)D1&~SD%Q`33)!m6mL!qWN$!^XZ&vc!;RFx8n(5Z`scSwr%sLUVZ6iCKyC^bmn#?RdVd#tN>1I}XlucF ze@C^5b&zb$JLSC1?Ea0b)C}e-HKi@c`(gk?kQHLNi>^(}*~j0Wmy^gL;Q;izu!(HI z9?J^Tu?H3_HekEitRzUqKhjD2(C?I-o2M3Ya zy(3fuqfDrRC3OGaU^ID08!&?GPz+#XK3x(@Kx+I;K>EO`0Li-!fOHyxG@K4@(HV~d zfKHMj3qs|6)H@pdM8LW>4GrfWctQo*=|})t%oD0za~fAOOhr8)0mEsf<~!pC;y;5@ z3!3mZvA~*|kKxtB3`*_6o5_KSS6Cnw6Fz9v1PgZIn4a9hz0Jb=vf!G2%el8cd<=cC@b!Xfi0Xn-HFgxLlK!2t zWSrYjvgZe0Ye%?d$qayMSVI?$%Fd|2zGULJDN82CZ=fa9LAzcK!+HsK4*g4O<%xeN zYh~(MuAwsx?PQCIoLoN}mPgFvs-6{Fi)Jytn0b_1#?CF|S~qFyRUuw1x{z^ju)Fs)hOhjC}>6 zSb;T@FT9zw@K*c)NGh!TZ~NSwVjZl!QbOc~2OIeuqePub)F>qwdjv`p0$%H)(204C z&KX%^tQoE^sL9_bSk?4FJ(3c=2BY@>4jA=rC*s6v z6jS3;{B}oYZfa~PI06`<$M_WK4cdc5&1Ec$>5t;F7+s{eC9pNoEDrgWFvIW=V8*%Z z0A{T4t0eVK$iRNiCS&c|Llg!(X9YqB$hks8QrS+FMHE=8@`{}|1PIGV{|JcK5H^hy zIDXVHH%uGs3_O2F1+@2^BzL@m2cz*Qdb-6T#^J=L8hEM$z`=u}pj(XEUujC+Z^RJS z!+?uIuWL0F)k%~ntYSXErwrXvXNactt{!&NSyxwn_NJmUpj)+11L?ICprN6p*nVeW z+Vv^qD=tyzyhF*oawCcnJu>&2!yOQX^CM9WJNFM#?tvCjJM6@H^p|C=uqPCgHy_2p z$sWj5yZb!a)jJZ|OJj99^xoyA7*fDeNn33Rj#zR1nQ)8LU^ks{IgzbQC9k|TQ+mA9 zfKkg*0Vbg~x7BFyU%{Qi`W&%r|Bfcv;af-AVidrHJJA%_bN@tbtYs*IwV9To2UEoj zE!5$`uX_Jzm?%^e>sNMO_7Bw-=V!+8|HPTsDX(L^;b-`Td`_&*+uNMGSg&)1Tk{{( zD>G+IqCF`~#M3cA1STb3G+E*@ggla)pyROz;s%q~H*!Bo;To_2>Adl%4L0G4;=nb2 zDx3WjkC{bN)7!)WXE({tD^Z&*!{!yt-qCui_d$crT^eim=EVC4pw>=?f--jQ>^NCH z!4BKhBx5g3`ZA&;c) zQVpC6)X}&KRlRVEy-Gm*o;@Nb?#)2VWPgulbN6_tvGqqC?I*`2J3$ zqnQLRTCI@a$KN3mY|xP43@FF?Mg@^z3w|q)QoKFTrfd-M-e|xMb22O}c^=g>|4r2V$~eRgT9=-FkHHlPBc zVB4@(CUmtHOB)~4+fBQK<;DI;yJ@TNda(?ksU1GU3s6E^#PybZ$1btH%2r<`dbU8> z^%!=R7u!I^L@FjiApigr&v*Q89=Zi8z&#T~!Bsiiv1xb7z(KR4zck6hY6?(XEEud+ z*bL+lUop&+Jsw3Jtu;~t5A^II%FxrKRqw2QIRo7ZLAWcmdhIfqFDwmZ=~b+ z%r~0t1^0cb0(XcgolV*=){~j32fDk#AvLTazzVif-#iS@+ztUHnszFHIs^Kg^k07*qTk>7C zFz9yZ>ep+%3C50}fN^(J&hWZqp_BD^{?rim!gVsh-EqV`s42Ce)G5p`?QnIFtd;du zR~DyUQ;L<(@H&ntfqu&Kt+iM?MhGfrGY8UKltVM6Hkym_pt-2TQ0A<2QY&-8gLQi` zIJ%>fy-w5R43!SjL=3@+c>EJC?Lp|mTo`TAym*+8WJTK3(jKu@d>_3kfbU8B0pkhZ zw*>HAostdB_^!^!PQrI_{qKbDHo*7#s{Hg_=#3AjV~b6L?#>gX3!lUJ}PgC$);>#*bUa@k_$9{^S4u(T~p$HX;4ED*f_c`^Aly z1KWENF9}=!z*b?q>7zF22kNVE(V+V=G!Q+5X8q=5aXkwYO=iRVPG}})mw@VbX4Sy? z`!hs}5M|bjZlg}IvW*d?9^A%q`$x!AZxcQHU4GS~Hxc8&qu&{f1<%b;;YFGRjNtfK zQfFkl-{jHLTa`DeqRTUD&`k*IflXj3pk*G6HiT}%%Gj={ilaRgUHV2RiuKiE&s}2Q z3W_H`G7(8u&n>pTWlW^oZ)sy|4F zfj&k}wn^MsV`X~oxCbblV=3@bpV+18)pqan#dzd4trzl;O`c&%8RCi-ec1*i z{}d|QBCH+)ZN85Fe{2$fR*HhdhT}c>wt%!y(-B4AW5ScNY&HGqTx9i}b`G$5jydCj z_CIKqHj{N)IlD2Ltd}|irbC;K2gQ_-C&r835PxSD`s1e~r= zj>Bgu&so0-!6W0cvo6ONzi=b~?%IIC!U#CaIdE`m{EpeyB5-obaY(52TN_WdF;gq; zlHV@5z5}2wwwVsVXkX_hUclK~=|K979SsBd2tHv07vllzAZn*S2<27_h9ser>p0}8 zS1@2Hi(ZUOu;alQX5ooC2}88)U@5m;IO#oTT$t+wPP>w`_a<2h<6P}}1G|PnO&q49 zf@cw1_T!Zdi%d zHlF>?Tf~HuB1Np-XfvI{vL&rq{B-4I$;E5kd*@{#{tMdr#V0r63T+naOrEOxw*uN> zm)cwLfUplXW*d-7OLAHdS5KRy7gI#zyhu?>HNZB4lc~cbC$l8q(F6TmjWF6$baT7d zOgn+jxHnKpF7NtA+24VC42a&)Nd7R$?Lh1H!7Z<1_PwXQim^#&Y*H0B=NG-{xk;xn zES!zJgxQf&+vDPq*r9wX5d+?<1|SxcvO42NAwiE*;^g8*l>Y_A00d1^^H~&h5OQO* z5}j&llEzAk=^hoA_T(?QT$WO1vX7J$-*_WS#UzVwewYROl$z{%6~)f3*HAv%Qj7mm zf}kl=Q4n<7ySN+mg#S~M=k*Xgqe6IitCYu$LLQl_DTehkS>IySOsR&g{z7AOpT_io zBprL@3ldhFlfR_v=zgjBt`#KQS;_uUjOGmau44CAndEty_yNvdQT|wm&zguf|2!zq z3g(Gy!c$o|jns}ZZC`pOwJrUiDDdLh6yWvme{hjBhu*6@@M7>zBf+b1hkCQwZ99L; zWKqh~3KqIu72`E*Yn1;V=H3OqsWRyUPMVemD4ZZI1i2WYO4q7Xa5W{MNt?hqC4nLq zidd|ofUdZeCQ^h#HLWH+8y8(sysfK7Z0A=ki?VnP+C6ng3v~)Y9G;S^gi8)j^1}#Ge)S<`vXLI zztid%;XUQFW{!X@f#Tk3q70sk|Cbv)b-f!ryUA}HiYf;oTS$b<2P(bxj}Z}0l#jlq zXW#z;cU@O4d;4{?t#ZBhZ%awInc{eBFP5cX4u?#mJkTLmwtQCkjUg2KgrOp})-WT{ z5isJ#ad0s>wCsTIAcD~}{fgWFE7+D?-!CO) zr`vX@@DecuVmp6mXNK@*tjQ@Kd26i>IiypVc@$p4Uf~2e18Me-`hTO3-l^CEY)SYx z|KR|Uc`?f5`cn>gPR}R&=Rc4SFC8>6v_Vw68gyio1o7}>roW!A^gKX{nCa<3R)Lm-nFT zZ{P>oUD1S~5MZ)9vo!9~iK`;2xGIs(t`KlEGr8Rn!rb!5QgDG$ z3jWF@1q%spEe#E6(5bVI*Yr{_lSw?ApxneJ=qN}F)tP)eg+{aVUJm0X--~bnUV^Yn zyR8YcV05mZZv5WD`F$hj_uu@F#_v&@a|YZPKGX^#32>EH?8E>Sm)zonN|PPsH34AO z@Gn~n$jx=h$H}rRg+voumdxXwnh>@eQC9wnsnsbToqQww@3gKRfu^i{q3oCav3f72 znO;q@vOFCPahnm}4mBQD`8H=r+t_fm)Xylr09=@RHx0gR;;cdh)-r((Mv$n2I zP7z8UrA6Ys&KcN_KDXomgxF5(?AzppvmL#8iS>qXXJ((jt)7iQ5hxTnfB}0pQ}8Nx z+SThj=(xoQj98D1IJumhfCHFKe*Ff%{>^N_+x%2!0H*fB6XkFL=4WySinD3$=dvQ+ zfZ_tq_>0&Qt!hw-!Xvs=?a5|A9j|wwwgDuUy9xq$f}K+&B6$6Vw|I>pgy%Hl@dY0&!~b=Q(^@>pXNSLoeUoKZYt&|`i(0}XdNb2KdJ`hnC%)K5 z<;8jjLwV<^p%w4*I%24fb}0QSs^e;`!yHwI<$`tmfPnj(f6wdCdrjm*pw7d5s0K=H z5XwHGln^;bI7lI-;LJ1@34PIqWaf(!Tv45{x!S+ z{j=un_1$32+lOJT+oH;-xL_GaFnz>tpbT74z%-_tthun;j-zA~(~V80SXvh_R40V8 zr)Xgmeo?m8whhy-@WV?VM-@G&c7} z)jQwh4-8SM+S2q$Un_e2)?Qb%No#;Eq4yO%L2biDP`thG6>U{pl1M8WzQjisSem-P ztZe9;L>XsRX2TO__!B>81-LQG#^0XfE5Pm@1}k8PO4PjZH|^xB&ElN}_l{{5{>RJu zbIkrRRjttEg)#a1q*@_N*O!&F=+eAb;p|(4vbPBx+?|kR(ldHRjTQjV*i`9_rZ9&L(k4gIv~f1wxG>vbL#_Hc~R~zv@ ze4F%9(?ne%%V?Z1eR`?98*5ep0lrYUEzL9y#n3@mTQn6rj_`J0f|j z&r7yrLTMRhXf(x>C?={0^*Nh3*=8?Ay^BvBW=}-~px^*H<5p)bY;toXMyeq@1#^qn zm?WFx`%6I>RE5i7vQC*{GB^10jJ;k-R6t2BB_N~2Nmv!FiLh{1%gaB3g@Czl%B3uoKfT;-$>n6iSSqrXyuo z1)NA@Ghj<$YLkrfC<@CrfXr;2K0+uv zXXMhd)y7g=4h;mamWC#VX~I#qZ!veH*MYcaA9&0Khn=c(O{Y{WuMcy8vxGcMi7 z7RJ!#I-#0Eg!$%5-s!urq-rt-shcag(Z7M0!)A3?)$v^wUu8#sfIH<>OaPbG`hZT2 zH#_;aC?BXN-f34#imf{DsFKymV|7B=J(Q2jr>k}*kJY>7^G!usATgnJy#6;8egytl zbo^S!aIU@KrO5V?&#uo?w+}pmFN*9R`D}0lIVf4wOdci0IXWL~F>`gei`b*)SG*vT z9gj?Q@RQ`KHyT=h!hq$Cfp1@sfMtv-%@lq7y#w<@_ICXJCj&CWgINZQA*|AJqo%R> zd6BIsg?+mb<<>k;0Vep@l)FHuA z=#{$eeWh3G%6X+P>RRrzK^N7jyB&#Vuao{ z@R4Y`C5qlw{~p=uT>)JudWa{$&fL!7OmbD#-oP$O_Bn`>Ji#JH&oF>Yk; zmx&lR6AM(C+s_%cFfP+2>$tF|V|iQJm9Ps((03z_9%@~Ej9ecDVq$hSY#r`^(<9)f z)5$zqMCQ@fXmHb3G>@X7rNL;ck`@OyEm@1mruK8>Oav^jbUfu(^d{$WqAm51;DoX1 z&7gsKY{!MNHt3WvBqlQI87AEI%}p=Gs=RLv@xG$IdEdNV z#~>Ai((n|TmMJtX*Y!Ouy~(KUB=v-)XR8>2SpmP3>uo+N1&J=0gK#a1=^lJjE7FEnCWgd@1iT@hAZv znoeV3>M|DO-Kh;mVjelFny9tVlsoT;434XT#>Ukc8Ja{sG_J;|kx9Ums5meW{s9N3 z#td!oJ*=X43uQAD)oB=8NR|eW>QkVfwSwt-VF-|;)=G4JREM*wb1=QPDhm37HuD_} zhVzO0vBmgwD5n{l{Mzj(z|Vyy&Q-;Kd$jmJElT{iQ+(Sf693KEq_PJnA1@zbOSnKC zUu)<1lCojtz;QTWLp!S{?8{nq&Fy$4he`5H(1x3OYePoYHtb@1N466cNw!aYviMFX z4x?uy9t@;Vg3Z+ZXq4x$?421#MK#0dH%SCD=&|4nz%Ozte)I(kdn<{s{3=xKW>=7( z+7i0TL+>$tFQ>Mh|CKw;U9M<&@*e_KlUQ#cQ2d%qGahmT45(X}SGROMl<2%M;r{qzpi9U& z=MKiWgBhlG$?Y?^-0Td*)VQ8Qt;i`$CYSt~qw>o*M`(KM|Fr-G2&FL?a)#63X!&yg zH_p&<*u8eUZD&>ta|a9I`RdTzOWD?E+7w51>=<2GaJ-i0EO$LE$%ojbcbtRyUuBY% zdhUa=wS3kv*fdM)g0320EL^B5pO+ZO*pb!`pb=#(o+ zFxblGoNZT}@U~Rh7~{0AND}44n0{a$THm%ht-d{?;PmWZdp5-A;3;Usp7NaClayd_ ze2r^3Ka_Tj#53vQ(a!SYr3Vn;uz0uQ?|OeLFwRq4h}`Nbt)OzmU~xVCJ0=Ew$Kknp z7$XDM9P8QH8@WOiOJ^LeddIsQ2K0#cE>WIirt>f$)PbV1Q?eaeZpLj3Qv^h(2e=k- zKpP&#Bg<7LF<5A}2W*aQ7PSf_62k_JAB<{3c%YK><_#Qw_qaM|7z86ce3m3u421F2 zQ-I+i;o-)f^1FNiues6_JPqHh%?SNUUk#iK@jIAuU1*hJn;MBuoC!wxbs4EAt{i0htqbqkA0Sv@}+JV<_KQ(HIj-FvZk4uc&l{#5Al2 zm*XlPpJd1gBv>W62Iv+KAp1L%N{9b!|K(I0xYELhzjvW$ z06SI&VoEL9dA^+jVhWBc0S|tKz=QQs1szrk>dUt9$`rIM{I(2@|Cy#Pt@l8iM`VQ( zbSQY*Dhmgd+?eLOPgH6|+u7yci~f4WZL5)lj8=5J)7~2BPOWhRqmq;gXobMmuaD8e znhmYdi|K_XUzR(4m3jHqh^(ugigUbn74W1p?_0b>9IvH%xOe<+HUUAs>{j0>MEdlNM&Ud@YEXm= z49W%@4$6b2g!Jj#Bb1$qL9kTcUZLz;QeU@56}CfLDSP@-UEd(pH4_VUS{;c(+5Q;B zXKZ%(6{AB~U+wT$8yxaJGASKwRBD5+mx2FoEuS~6d?%28onu^G&{G3!ZFlJb;Yna_ zIeUTabTT)GORjX#9<-JD{?*CdO4cS(W|g(X+DeM|=r~J~53}zm(7wfu z`_gN3$a@^X%MO07?82f|&W=To-KCZsZ!bBSZjY(&UN&C}QACZzj>}=R6iPG_Jo2u> zAtlx{p^V_^f!1w1m!G7pA2s+~f6)dTlN1tRiB!T8>DqdCYGvmVF`|U?>nC8dalN$3 z=$*VNRt&{GT5bRdJ+2f#1Ps)RyC1$Hy|@Ku1uQ|A^;)a1#Vyx!dVf_%hGgF!-z@mM z*C+KPQO;+P>c{s+^%p5gf3RXIp;YuVXqp17g{^!@&4I)rp3jwVYpt2fGbl(zTWg&> ztY(lu04?42ciPjEF2A3mLE_oy=i13u7)tt8kS^7;tTh;2&m-bGO52rnY}*x`0HD$G zkEt*Dr?7ANr`$23PkAb(kMe4l_gxDl&6{9 zp;##^GzxxKdP13Ihp;u_;l)8Z>DkR5IgGw*V^Qr4*5e&UN%FNMPLI}PU~#)1QW^B;UH5-B{qO=oPZyQ$pordr3)_j z1PRjxR=VXnx_?TtRrt2xCXxC(MTts2nAR;rS2uqh2{VwMc9RGBSr2e*_#XzqZP1IM zIVNo1Xmrjri)9DAL*1#+qur9fv6+4FSPb_XS8B!J81BFmL?`may&-2Tt=a6<_SB?F4rl_#E(iVeB(QVBzWptnm+;x0NR`d5*<7g^M<~> zuM~2GWDiA`6`g0< zj;P=rp?A?{y%;niSh-K3y}})Wm2P_q5Bj}>B#KHE{nL#`JnO1wD}IYXW(E+OQQ6Ps z+@ha5bY(3X9F87nr(-`+cIAqdpT|mu9MDd7dJ_rDCWw~0oMwD*9nUWbl#s`KkBIV2 zGqn_3`HN{{mjBLkn93KpOf59OHA`OI3e7(b%|DN(rCX`JJ(_`>l(%E{Pi==W(vD-k zSG5YAty(M2LMuWuVg9FOXVk=Q=DvV)3q;%8BJTiaa3WgAVk!AjHX9v6W6OKiJ~ehV zf2&smrHMF|!t})*doaqW^g}2RtyhgmKyjE+5wjVqiHu=JY?WRkP=;Se-<9r_j{YD9Lr~#mA71&$D2i)h?zN zZSzvR0ve_;G+HE+PXZ6(+{bo4-oXPp;o+$EvRh&ioT^&$vV5nAds${n@`5x;F0^*_ zvQ+(Z?^OpiIuD#(PFncqI6U(Ny*TzVp0f9p;~ysaGOEF4oifT7#~uXv#IfCqF!%D5 zRMFNVJkk#ZZM@r`-3oW&5*{99V;wDozWz@Na(HDtLBM#bRMXJ!OpQR~!(z>#E1|K~HqYcu;EXM{ zDV^-TbYN7^<_0^Irtx&;Rx}JENY=05voIPY>$WPMX}kZ!1lSRirlsCCKia13;a^WY zMEAa)pxtYGByw**zqc!Lukn#iT)r;+LWQs5S)^B5#6=*D4kuVF5Gg?DsBDb^X1;u+ zAH+o^l&KdNHIPLUyR!TDxF&}K2jf9-lszsc82c;?J#f6aW^e!C#hir^YJte+2PmRl zM7QxpyXC|HObFizaW`6+*HkM+(uen0e<;~WprZ=!Ho0X72pDJGpyL$dR)h*~DyTfo zE2c=HSd@oMB&?hz^#&B}Q6`X}NWDpz1Oh%=R|e|M2jpnHn;k5}IjjkfMyM@2hD*wa z?16hx)TpPb+3e>#6rQ~ucIs>bFyI0nyZ-JLrE7cD)Y56h#N<}saypXp93ZId7v&L{ z9*FOhsFz*imO-9u5chv0LcNAMcY4C^!bE5==z4XEn7Rvh54WK*40`TPc)@o7t#QLK ztzLTkazRRk0sf*{GF;rW1+|~I$i@}GJQ+8^zYG)1p=7IEz7k6Z1}_-~h_>CnOVEI9 z!jTE;VWNW$dR`1==%rwWF}%zjax~*3Luh~2J76cnDA>K|_M8VN5@X=VGOuq}Xb8cr`cgs%UvWipidp zlfL}lIAXHfklU6_G3#I%npUB?X!tgQnUNELAlzmnj$Y;2ILWr_fefkg^EkKRfP_dr z&<~&sk9-m6hQd9-hA>J8-O4FF#V+>6>*v&#`CAoXeT6#JfBk#cHKfHi%{Nk>-65#y z$XOPb9P97QTq>nznS10}0=iu>0<8bN^dC(lu zuSm%OoeJbZ`4ozUpkKqfbf9Y0fZ776UF_w$b~^EnR<9boLq!T*%rasM#?5*$I5-?L zu|jpXMrmg&MK!=}tMDdCplzXI zS3TXR=W&7p^nAKe7tu6&w4+OYQ4nk%`nH6h92k~I$u{T2V9qA=4GtD>r0`rI;|V;K z@uaZ^Oh?fG{~8?}Xpiy3`382|q88xDzJ}1kGhu}0*bM(F)T0DnE!^20TG-+a-sldl zHNihKw`e1lCNRQ@55?%#d4g+TY#uPX0yl8W#+j-ZZ-)Pic2Ul$CCm9QcqGZ@AG4%7 z+4=&6{zNoDU#&Axy!lL(p3*L|XtceC3)l;njz@c8Rsk_KP2So4Yi=%~1DA*1E75gL zD{5DTe>Ids$3rP}9HaHc0?m=Fnfl%A=I#;aP}$*;a^53I`tW9<%Z zsU_CLZ-fS&@pUFX0gB}SN2_ttqEwYdHW)gd3g&S1fp0+;D_rs^UH*4UiG~m@elu# zCN*4!O?v%4YEmyvDS1bQ`%giiD-HX9B>7dXD$@B(BBwa}s&=JGfXntb^@L+qGPQIg z!JNIpySYv+n_P%^yd#G>yKgxfySSfq`I;E0_&I#ku_J~?LdAZkn8rbqp-2{2)7A-j zmfKsF!Vu3j{sMluWva3>T_IKNu{Bbp*)LH&DCM)Dk<)skn zN)15=s#z$n?Ut>uue5Z(PFB;>&0NOe(C&ji?<^$HtC5!&bgbXi=TxMtJ@>=UmaF(r zJfcRype0QM4}9xQxP9a*?dhlR={oJ{o0F|O!; zP0g05sS#_+u)op3jWkl&u7b`PVyio6h%!ianV)B&Tz1#{QS+1Y^X4bGTAiPf;ZfTB zn7U7nec~AhWs>~2Cg#vsbz-*sitrDCDTk6A%V}aB9u4ES>`Ha0Z-#*@n4pdA#4T`d zHs0fz+Uwb!E65oR$2a)fb|pLz6E@YetHvpvi3ch`Mkme}LUx7BZ{IyIOb@+>?2M%B z-t}iLZ_efBOGg1Rw{*u+khlC5Z8GpUyyVFCCvVal-xrI8YF7(#&nF7#EbMS-9<VM_H$*bLCgmJoK5*-UXWRaJhT9vINaj`YO<&E|l4D^s-qg~_8baBLD+EW~ z@@$j1=$uF1<$=kPTcpafG18(d-wDN{d#ld9sKR5b6#N)O?UAcIsSVE1s2g3O!WaqW zQd(3k*>)BtgPJETy15xB!ze9sHpfbGLZy_Ru)lZ!%&`x5?C?eKj0*v)-~tsa8$F8> z*Lmb4k{sJKBRzJ1afU0HxS0g-MG2cR_(0CI1g8WtLb2)_3ycoA!!6G-c~Cz)ATFwv zQV$YM*>(vJ=hGN?VOv{N;|N~qCriAHwu32~kh_peUK%phzRo*{K18koyBF=6xoA|N z?10xU$qyP`A&27F-zqJt5Eoths3gabvXXE*D?Q=E;xW>qy5P0H1w9s<9)M4aGnf!? z$+a%fge&N}jFre(3ADltFF1pv=*elpgblsLORr8gfwJbosg^*c1(Jy2n(;2QdoFYc zTdj+2*5x^Fxz3$h3)2=0OE>%rkGx;n{|%0g;lSebDGjKk$2N#SyHe@_SXQ8>DJ}BE8^kK#ES52 z1UG>4D$h}^SGeU}(*7n%t`iN2xH4r|VWKCLxC?CqQfi&#-)RyJ`@;qVy(&B4+wTbu zb%T2MIFuc;INcC_1avz-K+x+R{QseEx&PpPZX-5x`@&(9E;Q!^qr*SK}qB9 zrnBK=Y+)hgdH9ZRFqn{DVQ(Mj8_d5|R^6M4f_NeRuk2*`U^Bn9*zxLmah(Gi;h?GqFT+%?2ZTf8cXp(K9-L1 zHu}Bc3qF?itx;onFs0{MzWUtH8p|WYX#Q`bfH9xgZ5%)UW%qG}rSY`(5JE=fr>R+e zUB7i;=;_QfHdU1je)$8(6jj*nFG+eK*N|fiRov;`T|>Iq(|%<^qmnA~n7TD7LDR;_rnY7N$`T4HciZFq>2^5D|J*giJ% zK`u#TYlpoSw7f*~WNuG%q3gki6d%cU{ZonZ{?P1=BVbbi8N(shdZ1;nWkQQA?qFgv znq-XrDFMY7U+qjb>%ybt*Z_V*;Q)495C}yx>{|QrRM>==wT|F?izHVHCU>&QAq>&O zKgpyS9(%)6TG!4K_ZWzUmoJPY?m-8BRC&l4WJhC==$fQBIJkz@X?=?@f|5Xro>UpC+tk?6%K-dDZ z@pN@EGPd!9G~wKtyp+ZF_102VX5WB@K`AsX8yl8QslMS#2|B=MqktbkKM*k$ruA$L zbS3gcZRCjtHKlk7`*0l3W4yaRT337^n0)OqfViG%o@QO$XcS7HA|Q|%qEpyf99T@I zF;QL#Br-xnAvdzPzqc#e*>k$pH+4oR;Q{m&u!F2BqJ4H!#bOGp?)svM?Rg{mMWOW4 z{yZ1}UKGV%D>JhVUEcBD%OzU*HuZV!K?|w{_rB4aXU+gR>Iu44X7E85be9ElQwb1A3Vpb@jx%cj-uuop^ z+FkN<)5a+)G^%-$vN*aAY1oHNulLr6fxHjSzK%~y*5Eq|8_}Uf3R}e$%DO(PV7Y@d} zyQvaWI0=(5;gzr6rz<34)8L>dDvcWBk`GZA!QwFUyW-39}I_!MZ&U3w6O4jHdNXk;}xc zrDtEL^x;_gw)yD6idZeP394l~#?Mo+Z|Zrm8}(g^-K4)ju{8+Ua=Th=EEannN*k@U zc8uCuW7pQ2F4Wo;SnL3`*cfj%fxc{i0UPOrFTckxHn}X&wYBRm)Y|b_>>IhHp_;Sg zSc13DS2H4c>`YvRs<@1nE`+A&|C=_2Te?nu$yrT*6c5Xg5&~s*s$9)^84{5?mM$kM zGh*rlXeK`4jdPTv_dsa9$R8x)z7ZbWtPhlJQ+=)m8$0j4bcv$Kt?)YD^a>QwN;m%e zI}!r6=V`;RP#p%b>o8Iz>H>ltq$rgva3+)rH@fbc+2Req!^ z7j>po-o#eikNv=95^z;uM`p*XcRm?I;w;8zSbY_$AhU^m{RH)43u@s$5x%U!FE`3% zOS|@=fcN3YBlH#{c+8h`+Z2aQ5z2TlIL_9PVI3f@pur-|ueAA6p-<@9!qR`h>{Rq! zNqVxsfhVNK-riQ+t~4z%kO6pW9_bv}?3Ur@l$K-SqQjy*Xj&i+cG$S<;RB;BD$mBD za{kDzh#OV;d7NZG*fwT_H=4G@AdTR_mQ&#qE4^bum#Fg&hT4!?*r^cc5WuZMIN)p? zT2aTM$e}S$Z6fI5Co?t80@_4?Vxc56G%;KVUxvdM_WH1Mn8ykRVeQTGv6hdVww5&} z^i4=tJMuU@AT9zeBW^8b3X}&G;0KIkWh-=Jr|`)7INlA=X6Xexyx>r(mEA5VYBT1f z(u$e}cVK9nD26GNB;TrDzZ$Op$ikTQ>vqL4@XU|U+f~0NdK=^{U!O;!KA|(%%eNQP zFCvI?deKT1`0~rkR@1Lr@z+gqSuT9q%8F=ls5A=Ft|U13tF3UA9)Mr9?$D@*)GPQi zJXnrN*ZYQu{>oUOvRKKs+jrs(ec0eAKZersOrU-uQdd_Zm7-Rd2PjjDrp$v_xLn7k z-`u8j?GZEradi0Fy}s+(mE?-3BJHi{R1qoiQ7W>Q{cBE}Qu>iMLmTaqE~AYck$tv| z#&R$wj^ryfn{7|x_IZ*EHWvZOAreuAc6$sN6tu^4+2018!y*KV2M(!~aNK~U?6vtF zon^(k_@N=Ku*0XKR@lUTQ7f!{B~)oZG&S5<6@<}L#W>WDfpwInpFyvj!Zg*?+xV6h zOWbl(uM(xJ@#hJVP0iHA9sMb$cN_nBjeq=^f4sy$o`;V;O454%>oNZED1OMr0gw$0 z6&Rc4w65N1RI?n(u{%jl0qJqAgud1?`dWJt^Z09!fxgG+N4seI)VpZ0Gu`F`tq-FM zj)=Bu?`#lN5h4*vmE@UNYNgS89h6u}@{*Ig%Yq2**}w)K;6P)Pxr1$3Y>~)lfzL$1K$yz(6W8>U7a6GW!;Hd-f*cGO$MY-pzct2h~lp z81WjOi~6CRI}OmPmgDZp*7U>8Wad6a=2mnWL0Q@ol?XC>ImXOyH_>@_=`2hi>Ayj@ zW|GKprtD04SW8g!%v{)U?50TSqOZ7*+@UmsuE_~67B5tfU+rvHF$jXL1U(vmb>H@ZjICFX35eP$g5=Jt-v4iVF*q(a??KJtHIZ*2=`U&KeldY9jJ5(zzO)G87(9Y8Of5J)9B1 zd7YO2QH(Y~QqHs=$;9Z6LtD(%GwEQ>u6u_c=H-dit~4xbX>?iH7br_dWqt0UvhuN* zrPZ!%^w%I^D5|7_3zYO`ES9u^O8R3731Pt(u#jq30hYH(D{lpNw%|vUKU(A>D$)f- zhBG3B^k#`R^P8^5^Z!8+LVCW02&wLBo*nIzL6`$;7<^Tdj<%y)+ab<}65}apsi&6R z6Fy7u#!6DHf)7+{P9U(l7P{%Y8CL=tdKTnWb@8v^rf}{t5|`nLn8N9J=Bya>Ky!0m z#O?MjL{ckvZ6$e9DE%H4fPMiyWSncH6Grc1u4=wWhPuUzHH2n`ox7zSHh)i>TXvl+ zH(EW%d^5#Rwy``T(ds(y%aC0ywhWVRveWut5=Q0SMCG|k>$s4T_z?c=T|(Ivkx=;I zuG3mP$~O)Ej`rDmi)`%sy!G7}oTQC2+9EB52Kc5zQSBg|xQ=%bP1It#i6&Ug3M>YP zYc7;jJ`EP{T(m16hk;^q?rH~tMJRnw7X_2G1Ma@atYekPXziJgaMO5v%U76tA!!QG zu^Xvly@qV|-LbFqgnyRB0oB@svT-pqPVGY32nyLe9#z;$UYPK3D{`3LLN+m&SxH)_ zCy7R#>j&@boa@2!|KFeM|9qB@=*a#n{mfZ@T&K=*fz(D*`gzYOjT_lHrDx|+j9>ZS zfTwf4I2RGDcoiMvpg+m2e4g8Ap4)MrdzqR(yVed%e-Aq*w*4Gp*+zvts}{1=%dxb9 zK1)GpwZiI;WX^k$CBrq~0P*|?Xs(eJ-hmuqnk6vZf+s{s`s}tlDA7iZW)H8QPV8v2 zu21)u&huI`Ip{_umHC6H@h8}^>vMFPa3gnSF@~#7H*^bE3U5* zbc+pt2_=}kuj%g+G*7E7~p=DJ)I!?BuESy4m{|-hq)n+{&Lve!OBRPLd3|s_5~ybhEEF zw~_p0BB0y2E2eAmlMw-ac!m{_ia%GgN5e>#pa5p=#Id%!gWD0>3_gyas}s4oZfT4m z*Gsw)8gxF3J3FS)iU{FV_S?x^9;F}4_vm$+Y_YyErmL4@ZOjEX-f!BFn)kTyh;w@Z zZ%ql|KWz!{mK5-o1htmDJ%o!?c%2z0N8Bz8$ZQv4c-g&+yIlslHK^di4Vq64vhfD> zY>A6!p+=ARgBU;l`RsP3X@C*gHTh$D<0Scm@K-!PwRP&q6_|e+kCdRaY+l+@`k-?V z?q}IgA}>C?&Bo^7+41%TI3b8Or$dlfJ18aeGN{h%1`1jveJKgmaxqIM>)tEF9C(&ig5DekaexaHpbuncU6qUKoqFMRN0d?uQs1 zdn8tqf!%PGt%!{zyIviy`Sjcnf;)MU2S?(AGu59w2KW%08F|`-Pfv*D-j{G!I}D<8 zq#d zqS-}6mf75ag5)$br1BN+F|n)hA}386VW_o&#ydp6LWIX9Y8a2Y6QuOLzyYYwi?$bV za=e$x@kkMBd@oKB5N7NI0=J44ZA4eTk1(+YQceo)P)k({4V4SCQV`8@Lde~i|6d&_ zc1+D&j(qKH&ew4E&`CL_yOT1#m^9wWos@B~GP8-jJ%{X#a%R)i^Y#rob3ZV($_-IW z?bhDXW>ZPPj`+uxO~ll+{MoN;B&PPh$JS0+v_GE}&D7$5CwgSnPB|09vuelR2-;&DJ&)+z*Fe`}oy5)dHUl@?rkv$m zXg!VOTQM3_S``4M^eo=xw{TneOBP4*q(}GN5e4aa`|a)AyE9Xi%aAOPtK#yENRU-g zt?j{dAN)aOy7O<~o}4E3>UlCY0X6mJbHS+`vyh$p~+Nir&|08g<`c zB}1?x_We{kq~aSdlmuL6J#DI~`$hlf%@-(R@4v8&SE&p?F=3r|kSbTOfLe66TC^R; zgX~q*%&77B(JJntD%`v*G{0)y&Hwkx8B68FQaP#+vSgR;~WL2VYYg@L9In%3<`9k(@0SQddfV5{Z+f=Lhj!fp}$`Dt7n4Vw8! zu2KCoO{&9h)lQ>XCo0hVvoWi`Bf-CWhP}@C#OOvGCFi?SUE5J#b1I1`k|}57WuS%){Sn` zHyPO)@*IwLO{$Y{PB3UV(}=X|mNSelt2n}ElVqdQDpBezJ>?Uvb;5P;DR(f2o=5Lp z(G-s7Xe%as*84qr289QR!HX!2)NbkntRg}`K+K{sVpjt)a+DwS$c=8aqn&cg=@b^T z5+16BMbx0u_h(jIv#k!nG|fT;4&P>`5rw;hRyR=eVt>9Fw!3_zqkNh#+q@P~jMku0b7*x%1GV4j4PGgH6z_n|r&cskpf;%Ay zl6)AG?Axl?|6a#KsC(qILO=RbG+}6I@Q;JVy~qgi==Hs_0+1s>)g6c#W91ntcSMSu zWh8V6)qy{Xn1~BT;-yBV?cKmM$p@89~dGApHHTUkebS7cso2n48;zRK<%+rfP_;k+I9<%UPWgn zM+t^Qd;FoZq-+gfX;&f+RBL!RCWET;8rdb+5d}w{3{qsm*Uh4#h4K};L-&C&elKDv z-;3g3X)+JS_$LzQ!{?AVy*ROpjgoww$WJj>gNO`Q^F6jU-<57zk!=6+j@4cjc{{ne)M(Xa^0CWaKN^7gfOXoYte*^wmq0V6gd8~^YMKnL{>Ra1y$v)B$^ zWSG%08Vw~Ss7$r!bR2El|6V~9>`4{VuV_>DFnMfC7yopkA9RoW(2W}cCVZ=-r6Wr6 zY>Q+wbze38Xu$wFK*hg|bKv6e4wKU90Y~S`@CdH`utP>x(KdS0XOQFpRPHY%#2T7y zf%O#imX`%j2$=Z+&QqYO-3Xg1dr_ZOfn9#5! zUMuJ<^DUsv*YRTM+ELCEpe1^GlM-s$L`$KOOl3N(+s;E^m>YTNPIoZN*wfzEiC2&h z97NO+ig$n7iT7(xa(1fWDv!*6xiN3&K=o-m@EcKX0DdEq5mweworh?glC&hA3BX`5 zs=Xp{r$PV~sJbq={-xIf4Cf=v`H@~}-!B#19DI2_~O zn;s=TaC*`KSU=lx_K>-S@)6N@0RaCp?XWUnt6Z*$>P4p#*$=dkpFNY0|j&L_-BM z0S3ig0Ru8zwC(Z@Ler(%m2k2oCsxRrrf`3_<-Hwaa}bH`G)867tYeJ1kOJQp<3w5r zz*e9}=yb2WDsmXXAJ)tMQiha&pRj!S@{hEkO zmm;ah;Ae3&x3CA$VTH@DzoM@c-`4OwC~YNcl61bwC2NN1eAgm$)XYx!_(*QXUI2JU zBT3FmL#n_n8pOH-6G*H}L*A(*xsS)_BK#6D63v<_fN)S>H=k9sHN%=dZr2*O53kE; z;y_Hvi< zPi6s|uW}lWIpxHMv_5VGtRVvgya9 z0hFiY3$g6Xn%h0{GI;5XC?Avdf9H`q#9*G?n?%n&2QNuVy{AlBds3A1?06Axv*i?Y zkWx4*a-{&vmqA~yRWM_=p&4W9&OilgUjh~);?xvL!70h0`=a)b=Q=%fe2kAHf>cA~ zZsnG;_rtNOKDuCPTX%WoKOK*XgsAZt*Z-%D2TWP-<8cSvaNAM}|}F0xYO8w|}gp`|pNJ#i9b?wCm*!Fy&6#ByP;`1Dcs85P?k6!*`I z4G4k+-)BNX>Iy@Fw~vr@$14APT;f$NoQ zGa>H;Gcl>96+W%jE5%up$q98f|17(LNVLqY1A(ACvT>!z2k|RRTR;<30Fk8 znr0Z%P-ap(X$XmdCH|rd4ZW_9P>~yE#{myRyBtA>sXQ~$5pX1y&q#6vq@?o9Veo5M zX`Oeh6CNOV>QzY?42f(H1FP!T{PY-I`JAM%fJZD2VXfZ3$fOI*Nh&?yOSjG$2HUcM zl+B;AEsw)(d0UE#$b-1Hz#^^mo9n{%+hB8k^;nF?<2irl2u1@4+nTLRiQ=dle(+I_ zfHud%?XRtoR$vRTCDE-&##T&(V(@r%2CB$rqOV|P3dMajEgp`3CMliG=&E0Jk{WLq zXvgy{Xt^GN_GiqYsQMi4W_!lBabU^L_P;g0t?v!KH~k+9&LAA&ffx^jHW*)uTb|Bg zaCWn2GSDBc{%vj}xRK3=^6??>NAL#M1*S!+?23-twLcVV6dug6t0xUXJ0b_|Jkhs2 z(qtRfbwBPbFSOEx)(GeU!U$lK(VO%z$~a#;u*tjCCXZx)x*VFkiZ@wMuWB_m1uu`< zF?Q;@PDzjP;;P$-@SUPum7l`^W9neVV_K?EfxPJO2s2bg0`zH3ct=>VMOMq%I@SG;nYi zBE>-dbiMFog*s8NJ|e;9jhCtHq%@iP+!3+E5lc|>_bgzC+&bMlexgb@Gdpjl zvA6JM1VOlfr9)ZeNBF%LW~i_<1?&m8`RSMH6ttgN8Ij!9y$U7Fm zo8u{hd=eHisxyK-Qplf&sF5Dm>YM%!O||wD%Kl91`8;$aL!d{>7Vs1v+=9@UVG_zv zeYf7C`jmm1Zk-R`5$(_uN+|Iq5{@@_DO=R(QdZ|XQ9j*boo4aPET29F$_3_AlLBS? zZoqPlNY|4x+L z0>0s+1Q*IlV~>p{3CoHMVd5wx8FVR2V^6j7K&%twk9t>yuEtes=ieLf&k>!2DBl6A z?ZL6VhYmETi4u62ftwDGbFlbkcKmCFoDdu7_!R0slfs2C#BkI2$uDR@VJ;+m<;kh) zk{XGrY37dYdD8olXxjVV53;Ohu*`2^QzcPGcW@tnpN#6o8|33i|a2bDaN4VS4Mt*7K6sg zlZXV6-E6~74DlG$lxE<$RFftoYfn$j?m+k7o%d)LKK=|fVVfhp!m%c{UF&8Lac=l&e_=06qWx=^)QROv!}50 z%^XEMMH`uOm-I3+5wH4embHryNsM0Wlku}2LsC{rL-MBy+K`MIr#*eeEE${2 z6ZJ;U;@dBYI8l4#R=4~)S@Cm@tI<5KiXr$HL@);Wtl5F97V(0{^u9=6b(XtcCMOcl ztIXcsrmU0XOJIe#CY^9ve>FlVyM?U(h)SOmkLK!x6{_Q@3j|%)ac6K@*BnI7z_PE( zGpE2S=$Tw^%}Dgdvzq?Ei~F&SmvA5Mddd@YAe}ssspuV4e}TJ$;+SC%z%)Uuc^dhw zE{nxbu4QqUJhFSTo*$1~#PAe$#TfE8T}Do;%X)QM{qa&>#8SQ-&1DLwb?Jy+WeU2X z$rNw}F5FG0f=7AANVyzVfc{?|Mf6|MuM7QO*Mt70ZuFn| zU!nhz{}uYb`2T10KWC&$|NA-p;|E(9*M98GgdqmOWVZ-IW|-h7Y;0A+kWBoEnpFM*O+K;Y%DliRIZ=w=#-*S6yKIjI7}#tpO{TJOmJ1=I7}O1AU3ka{Zttm zg~S0E{Zro00g|p(j08e7yPt}IuPN+LR198~NTOGZxg@%nDm=;$O|w8n7LwPl@l#xb zN3Nz*RL^EM;UP7sfxFMIONF2BAmx@6@1=ym`zRsswkYzhAn&Jxed8b1qxVxkGi9?q zq4VXJ6o04l-6Fe=L>1C_fkKY$!$K;Dw<%#ubw3@d5R(qD*%L7}_B0FrPVw(jn0+F- zrbSXSScY@5;HTj4l|;xQiYAC2Fg(Fvj@XLw35vVZ2D|BFMR9E7+Ajrpy*wUW2SG_h z6ATGaTZWNMrJ#pBuqVCU^6|e*Z_%bi_Lnh~hu#9xKfON7#9yCop?6KQ((wK82r>2i zTSjVf>?LAjIT-WJK5D1(KY{$S+zXeZz8@j7{PdYSWNb@CD(Mdn2aCRX)zhh zEhdR@$$sX2y?4;t7S)ua$1#%cMa8NrqN8_LuzJ`dj-ti4fA?k_!~z@Bx;A5DQV+vT zC<&WUjmJ?fajO&NMQ8TBQ2G$-4Ni5K`b>UpmcGx>d zB%{v3pJ_?Ls>flK(6d)m(yCEWiBvO?hAXM*3%8gE39M3-cRH;zMtGt4Td49(lW#mx z#sVYVIDzNe10ybIyjt#phE~vjY;RN4?$)wPhPEl)^o~C1XH?LRark zK?>l@f^ug4@f>=(d(5DmxyQNEJcf!H>DN~J2F?hMs+@s`)nV@p*;#3nXP9iF$(QPu zO>Wyk@0S$49-NF8Sa)y;xtRpbQZNfX=8}K_RqpOpa9Rr}y zw{NAs z@e?_igCK%40rBG*Vi?2huq$gQpu$;MHgqjYBYfZpBh0<&alDXYTd-mP1(z1X!{T;t{B#kk|jIab)xEVgg=aGQo1U2@;PD9nzUQ+K{9uh5d?89D`80WzoCmX z6YSH$ZFB|S;)fl326HS2i==o=V!AUq#XB0=+;i^qzf-kB89tm9ytQ4|gfy#N_YIgC zyt5tM%)YtGU5m8&tN~AJ>z`Pk2BEpABf;trYmLVRgrHVwC)ET z{xLS?DoQuJ*c9}SLDYRyLht#9j9NYq&}ADyAW!2~vTFuw0y%7hr&K^`ifpQ9IT*fM zZVC`aR<@Cc0~L%%c^COGrl7E{PR{qnBQi&BcxVI?!_Kncslcttx%faa1~RWsUgNtF zu`@a)T6c0ml-k#qSZjO_#oBKYc(}zzws8`AfK~IHYW3_jipUi$0Z$3E5!KxQ+j}_= zGcMsRvm%ZaPkC=)uU$?Jv%>8ce3|g~_r9qz26IK^>~%k(QH535s2sIXjcnkgb{dOZ zq4c;8BNw4oo?X#_xxq@xZ%)oBcPHOGdAIM9^jnj&g-7YM1k*c}9uNhmGg)+|8-=GU z!ZGEQh}QBy_$u<+wWW2wQT&xq&sTISRzcCfgrcv7qDR7WX)Er=XDsS7DbdCHWE3Je0+u+>`>%ZK8bPg-6>a;Rk#GPW*dU3*jj~It*)|)qF7t&ntLct9eU~= z#DnoH?0ar3gMr{EU|7nrY5a)BV?iC@wELt1H^Q_ zH;(Nj=lt$=X0Gq~?@YE}X!640m^7GMVv;I{8&sqA@v&Og;HhSQO=SLlooRzxK2o~m z1LIq%eK%$mI$3i1_u-qK=4@j8XE0(HJdH#CI1Zf;t|hVN|#B-t@tH z)j^O4rKZQ}BB{K#tGN$n4m1L>yTs zjjLrT9k{uZUjro-^cNX* z4sy!{VUnl&K)rOqSQM#7Izeen-RF4wM%+VFL0KLu*$(nJSy6s4t$cd2tE|qKP+H*y z0k@{$M3a)=mku&VNuwSUbT}thctKCfi1=V+(6D9Gur)+$&JE$G zh`bs|b1o+pc7H^3Zh8Q@SSZWF-nbOE5gw}JM3dkl`3U z*BU|Uv?x*I+^Mz6t9e#KP2cXS57;S}H;hpO3=^wpL`#@~Xu`-{C5T8QxlV$q36H@< zA3j5RL7GE&qQZr-78ESdk3#rC6v-ap{TQd;cO?Z-7;N|Rm<-=2$yVnbE|?sa>gi_v zX~86=2}9yf3qxj^!m-Z4JhSSNU87}Tj3iBl`E>?G3&s^}1%v0N7EQ?ES z@~Dc#XOqqZeaFS%L@~G=I=kFd<2sIFq&?t!+98+_5x{jAwkm{UYGF;lg6vkG;JX6u z#XEz`b_hdUEzn5U4rrk(zScm zF;Xpqd0WGY?vR}fhFHtYUFuydpz^b*b|ypd;g@J&p3w>(9$oP7uwcJyt0`=XF0ri+ zOZ03NW#6k}>OKtI@;B*)z}2WlE^2ZIm%S)eeiaL!FS{mwnI(_9T0~~BY^~F}XoOIv z(E2Z4;SQ~`xDZ(HFp5PrX0q`v;Z#u1R(wQ*c(WR56{fH!j1T13`-}c+vt;|1k4coS z_O$N`33JwtaFCHW1_KjkVd!m^N%BuKn!^JT+XLQLhIJ^8zw3XxFBhIWX%;y3+$lQI z&2=!fNQG{B*~>T}m^y8gC<85Fnt9iYlK+GWM*>s!22XS#wC=LCZuzbyZWscjkOee3 zw(q^e(MYh5eb>aJz~B-Z2{8M0&JHp45RVYA?xxE;0J=b`*L*)s?Gp1-WcFvbVGX^ZHA5NHHn%QN(+{lpk zu~|tSihZk|MhoU_(iyw8p!d^4x)D8VcI*Aor-gL?6t%uI181#NfsF?{_m@v;RnP#f zZPD08Ju`g7!8Th6O%j&L!=I|+wr2@UaXqmNzM7V>Lm$GB_0wxZwuHGp?KWhm)FGoh zThO&9kI=v@=^VnHNi>8x-G}g=BR^*d6B20%|7*jCb0L&YREKa3b$00|5yrBF?LNxK z?KJ25Ph)B-&fEXzVh*G7(0kju99V){!tT03HFc=@*j4}jxlvl-DJ^>JC{I+{;0{i9 z2Ol)TKiGd7R5-IVHu-yM%@Jf`fBOOEWf4cmO=Fw61dHPx%xSD~F*|K*^-x$dNo8_> zr*$PvRtmmRcEA_s!gRj0*Ty<+k{SScG48YK9_wm^F-Iq}oJJ=(n>kDfLW+azpg|UC zkZbvgb`cG7Ee>+6Th_VY0t$Au6tYl3_fKI9ybojT{h@ZD6f@>|BPZ0UoKWOsfmyXF(Oo@j9nztmy%+U$_FmNe?0sd|vv=Oo zRU^Cs8rj7ksbh{m>JD=X2$1Sg6Xo@m9i2I~oBW)ORyA%jJ4#w3nHC*#D|-vUrY3>h z3u>cxW|`v4a)Q)kcf3Ps3FWF(P*ohZole2s;3_+?=1OT%rD%X_lC7%n3K&=N?Ml8; zs$~7jYaMu`@Of7M#449<*Xn;pg;XQGtoc^yW^r@NSthr9w5gn?VTdH}^kDQ7MR$U< znw279WM@AQ$!Q>Fdt@CyEILk)fVLxA#PqC`LW6|*0na#zr!Uzw=oxhSvJ>4v=?0y? z42U}P=@eZh+W{YJg!?i4)&rDLwhR{GqzY*FO=*(6yXg<7vF%a$7&(MnBKiVU zJxUh8I!fGph+BKM4AbdCzp~4F+4|*i z;T%!vC)&b36Q-8pIhSfrfb4Re7!p(1i6oNZoif@y)xI<(Q2=EMz3>4ZE~G=1-dfgp z5qiqSM+GV7q9mWs<#!G-K>89wNT4|!bvZ7lv)B(1z^F=f0IX%+9fVY8?|uM2v7(!P zD8JWLp5A2TXus%wDEy*elPJd(wZ>}hjTlde3N}UhKc{ew> zZWKx>fE|snxzKkM8$6p?-XV@&onPZjUW)8fNbx4;FBaCqU#Gm=P3V3hHEwYuabk=z zw$-AVXT`%GD+M4El$%^c5%D4@qCulbr&}VzSdf)O#z)C9{O-Yu63i=cl&mr9ye5n& zxy}(>$T2R$7Kbq8I@BdffY%L~W^zL%+6fXu26kK*$JICS^?w`e?7`&D4E>Z;nCd*SR|f-x#e09Xv@6!?&MsSc25vDD~56h~k~=PF13^owuCqD-~r;H;JzY+sG5z1Im#Bikv@0QP5aAR-z0>;Ivh3>#@kITd<3 z(lX1K6^R^S$U9{? z+z?X!o?O5!(*b=qaii<{MEgb;55Y}lzC<_kCAtlk=m-B&mnfwYb|3&y1-U$Z2BJiX zTi${o-12raEv;$_GK95yOp4^Q@np08cTp0W6He8|@47r~enrV_kIc;o} zKwd*B`mhO0xZNA)SB%~<&cJ;sydfjvIG!FfK)JeIY3h$H0_rJ%C0?X0@d8@n1x^n3 zSrD;jpCldG)hedDntd~RJY>R$<_|y~?V;#%(jrUP+>QSaZC?W4RPj9i(gOmB2}-e^ zL@gKuwOWs8Q4*TK3nWm4a)VW<;$0zyDio@1q3JV#0*VJvzlwkt^@8F7Ek#<+mP09r zP(fj95GpFRwlx2p*?liBP1^AF`}==CUrX}xc6N4Vc6N4lb_P!JQ?fyucl@~72l!!F zepW|nuub+swY^(@jf2c;Obf-#s)t+8oipBz5J=|daO2rY<$_vVZB=v~>a$1gW=M&i z=rs`Ij?0=G3l2pW@&|B{@S`6h1eQ1uvc=E`-G65fFdtkx&j;7pvoC^&2!h-@Igc4ASP zdZ;`1bRpKAi^bVk)d}j(6>8)fMNi)Xb>yDD73#>vs*bq~Vd~m1Tn$HDQ-5!y8ZSNH zR!2L?6k#=gmUmr;UDsgO^_ZkP1-q`%&>uTvrf~l40*;AWE|}U z2v)-v$qLeNGm{F6|Di@|VzQ<41bte&y%A<6?WrI3bZ_XMT0Q@LAJ2c!wCpfn?$9-p zcQ&0q@jgR!z)3^2;7Wt}|0kROD`5VwZSb)e>k8tCzTo5L5M6bzO`*R-9$CyRzk>`} z+rVOIcaWU5m>jZ_9Et(m6Qjdhyq)6!;7#;3KtMJCR+GPaUGRa5M8#d-75acY^|+6r z3(UIT8nMiC5hf`dXSV2!)9Rqcv$_<-PY~9NkvL$6D`z-T=h1NKLb|4+7*2Dt`^Lg~ zO)g!(H(<(DI2INocd&zmkH2C?9&<`!!Ac#+^5H|$W4=ZacJ_bQ8F_uGMnC-T7{7Kf z`#!-1Wev@O_j1Y@aJ1%>cTdo7`BRp}-o~H$QJNd~(FypYK`1o;{F{ zx7TvFxvsKGo8i(gUb&GIF;2Ol5xiG`VQ+*)o$w4ZYtcUL*FdoloEn(qpE%0sijh5w zVk93c8%e&ACCtG4F>f_sbTk&fV7*YD-Mz~vZ%PcjP#yqV5OKj*o(Dw^H2mo8!sWQ) z@-6|M_e`@tW#rMzdBg$39x*z!GbHSUAlUB&!Cs(-{Sy5-J1bq#EiPlfUax1#DzTTz zm$RdDEV2V4G|k%xmm7h9YMVr~5Bav?X6 z?L}afmeFBCYU0F0({8X7RAm3uPq%K5U8)dEYuky^C6%J?-91yac3+7zar4xp*4|~- z-X#`KR4iVv9a;^v0}nv%UVntiD{)K^M+^Q4lPvlSJkic{m?J|8Q?uDj&FYmz^(3zk zZL6~1$NkcyE+G19h1F1bb407 zhLr%_#rOTE&-yScmH}Uj_ou&l64PJlxdLZz2V@oF#L# zJ9nqh$gllaT4T(1HiV@$4$Re#XQ5`OC!sd%XYK|ERYj?+eaP$8{l?AC%WilCF4C)jdT~83Y)Kw zG4+0p+cp|@YAf&?vG#t_kN~v_ZFxV>j<60W)rwcaryhh5=BU-&PG?#X*n{*PW@g zP-fSYc|W&e>AGjrvCNKj&o-FzXUEZxMyvbLc!!iG+H-cF+QxBLK|;qHlg zo3tAv$5QCB=d32xc;{|_5l*Hpkmp9SB}-<58w%dAbAp~l{A}kr2r5suYNi=P_cT4- zwT`y+-faVmVYm@ty$n79JmF3r?kb+f@`9SeawuV0TEmT1Hz<{2211*?okltR=Xcpv1*7wgQhl4Kb8<^ z;E7hevhJA_qnWYpnUsDrDg9;|%abq}ki$L61OaQuV3oBc!C?IuPUT2tXz)I9RIa z+|R>p4Kc`VBU!XT@k?4f6FO{>wy~l%`)X{S;byCQu-2Bi-J!Ep+j>{oeLF1Dc1!PV zpuG2;pu+38@hbYk;l3IZOv*sf{~I5|{|o+JUQg@@x_;wXd`!;iOy#Q6*>&g#(7q!l zuUdYtvBh};*zf*wR<&TkBWI(h9hX-JpH2D+o%V+?VBh&H<|L9>LNu9Wu1l?TpS_z_FOVK`+;uum%Er!1wqoO2*2QVATf#P!4TmIA6A zj*EZq9dvzHsu{{`iHBzG%FbFL@Ez7Xvgn!%K2QvY&#?tI9s@G0kW|?Lmu)%9*VMzt zS=2iuip+kty2Q@E;A6?Y-JKvOrFUdFZ1YsuP7_05I;ew!=Kk6d)FOk-n;7on^nw2U z?ijPy<%7%dAdfH;9D4&#jQIJbiy8r{vSme-&#b<0v{WPW*=&c5#ntTQGztP?LO2tx4;8$SI7wqr4(?J zTtY^fk?*V|VhIt4F)=71*R?}2$j+ExHT8I*3;5eu{p*-Ze!&GVdLdo9w1u#$UE8n# z_tsa{vAy-V6_C~-#(S21J;A;f8(E%z`Yx%Wk7_~rs!?aYMlH!{V5l1y>P9lPfummO zM_nLq_v5IG_|=olP#4IgXh5ABBN>Az?i=-h`)IVcW0HSH-0gsaV+G=VKf`?@NA_-p z>>U2}CP1`3H`a~l612J}#~C+)e1JzC@&Wb*-_+!|2dJqt9;_Ns*)!JnMFgiN>2_!@R`IHQ{<(Pwlb)AWqIw~BV=;ddSECbKro3Zfb z%#Toq)%8R^M#CfRa&(VSTFb_}NcP8~&n7Kfel&%Y@<(6l^420MY3p=(5ZEWdj#Sx* zt@aO0_YxjqhZx*bzL-OcB7}vkvw`n5;{g=(l1M*0CRNF&zdJ0wwCJK(PnK4ohAH#+kI0k!3U-kYk6%HHXK*bJ=E(u3#SfmK zT0Cn3m0yc;e1O-<3vZWe6jDXFh#k{850J+rsOH=VqM4nwp0@g$Y48;!`8`>KuWqTq zrL1{Y=|Ez+N+;ePputb6H8@>h)cV^Nc@z|5Wx_Uc%Wr;djjFbi*ZN7>1V}z}PSMsl z&0i-^<%6zvzD`xOHGi5GFm^r6YqBluM)x8k!r|#w>+Yl=96@t)1b?U<8=$$b0Dg8l zgqj-|!%Iqn+Fr7gbI`2RI)h8mXAVUvm!j>EO0v$u5->u=S7dE2-mbRl)(K4PuC**?Gao5?-0eFbzMn;&-YaKG^8vseyR$vq1UU z=FiMEK*rN{6BdYt6aJjE*ZF4BwusuaQcFoi@8E&%QJb#GeY_WAyuj%9S8$y z0YZANn)!83k(+!?baMq|{%!)olLL)%o-r;Wf$OV5_ZIzy;THj^%zRmM!UPyiH2Zf$wp6Kj836RKu$XlP;iWJ`C?w zI*NtaS$_!`4`gSZ7vSWhMg@d~0rDgQaRMpuAQejm?*5@sDHRyovQ(hjU#Y%7VaEGK z)UvVkE^$bEEs3QTC_Y$A=X3>_=>;XWylt}wT6F8`%mww%No9`6GW(15&}dq+rJw?> zGMMDqKlOtNe&dMm1PdGk(rIViD*k=wsuF6dnQth!B_5o$p+&A~OMZWiUD|BRk6=;G zbSWEiGJ>1qEB2j-wavIxw$GbSwzSW={YLlCatTDN_EP6iRePBNJDz>tH~Q@E0b0ni z=oaa^o@o^Es2w7T3L@o7lf$*7Lmg#tL6X1Hns|1PzWZT{gbZc|LPOA*@NoB z*jZheWVtw^LVvu%xf+%C5xaYw)=u|xcpX8t?r7}pBx28*R7aQE=e0t{&G>mkEDYlk zIt;p7#{}q@H_JVM4u61N^bNqf)rrSk5Aek4`2Lao%KOp~J!E*re?+a)oHvcc+UVsO zn|Z`M)&mQ=o)Gf>y%~rN`71B=#^CtCCX)K=-4;EjMz~B&+?{a}&ZrFuKDmf!KS^)_T7RiZ=+E zAK&bRboh{Tz)shb-uvwSa0#hI{QFmjwB26X5Mieixs>#CL{h!*xE2YuOYFTH->G#- z|JX}?^qoqvw3fcp;7qL4&3z9Kg(#!s*8)$<9f{kgcd<)*K$$XO$B$pFklpOT&W5xlyG@Bh{ zAcufk@ethhJ?8VQhRe+5v5a{+-^JP!PiLI)PNZGhMNi+Y_QWHu+u-u_l~5r*pc7D< zuVX)3W1%nlYR30==@~8Ft-s*93Syt`ovC-h%p_0mZS=_))!N+@BMkVX>S78oH656m zsa(+=U)JLOMygU@2CF>SrM>K8zf#}9&g(mf7hT`sGP%A(2VUR7`+`_J{gIpC{}EV0 zCJS@iqj3SXWTXR5X)~GJvWyItZnzec>Wr>uY3q442UJhFdm3A-=FmYOP+2CE-)ezs zJE;$qkwI1JTlb;v$6KAGo)n?qTWJ=jZcHu3VV=N7Wk!++p4a5g_S-)2`vUDYt zp)S{}?-N2A6y{fYnzn&@c&8v3gICtlLSZdk7co|+hvYG4BUIYLIz*=640tWzUCZDd z{nzjmddTsWbb~-}3(qF)59)xFU+FZ9^iMNg?#n<5e|-wbyMT{8eIFD{Peq9@`dH~2 zm?KlaJMZ)A;0~V8)d?OvT#1pHcK3C5DAeGI>Q2`mJxr`AJS+Nmd7fRzQ~ln0l5R2w z7%@+ASvpR+YyO#Cb3M+73zhIFRb=)yt{1tdAZ`{=rj{SDMs(72|GIYi@{gnvii zUmO0t8~@&ff9b5O*SI=B#^u`CYcTHDSo_Ng{$b~T_=jol^AEqS;vX#U@DG`J{KK3# zDa$^nX$*l+s^}}B9krX0KW-lX@al4kTo#8{Mj{!St>2fE>OoR^{{yoI(r-uy#l+|J(;dnsq4r{8 z{R{}4gd7}X+AiRBCkM6dVOFy$PRr>-hdaR`eTS}H%47`cqnzG9NDx51TC~(KhkJvt z%OtmgaKY-<`mHs{BeIEZ@-H`E@U@ulNy}OWVZK z6HyMSj6D0JMsP&_Ax3(|-t-OEm2}hNjRpbMp?JeasGQj8TWSq3i)jFMgO1UUO0{UP z=9?jNpXgalnlaV^U1ZY1>d5_EZRGB0(c%F;@eGK=GSAu79H$Be{i0c*3egSR|0 z`~w$SL9rUG`K+`j{Ah(MmzY~Ajy9-Wi{u*5BE&}HAuP*}ML${L(-hH@7tf)k)6XXU zIaBGymM!L_Rq$i5O}(1nrr4!C9spFh8xFZ`3t2oFyLN;5WTn+m-}2V3K$zB>Jp_e&QWlDd+jUDe`;rZ?Gewu(i(6pKK?g!=db&f<(+0iyN!kQf zwiE&3$1RC^SDQqIsx+LaqO^y6fBF9ha;6*AS+IoUMeT?1XI~vv$vyc+bQQg(I9SbpgrR z7V;#=MwjtMb_Fk)toa4@4wJ6qN3rzp6n?_gFLZ0n@V1Xd{XX>zIw$keIjO1XY%}xd zMn_z#gPk!agO&Bu8Sbh`CGXd<^cZIHHvMGxECcdFVWH$lb#rV*l=10!#%3$x(N@uA zbZR={=;lSM%exWlZY;@^gW+Ox&`Bacs3Pt0K~5Uz(loh3!PJV-q!8HQl%Blvb8B?C zCv;Oa9VY*bBVsjwQ|0K&}*UMJ)sBT)d_EFvJl7z!l z9=l+yq6C?zE6FwO6{0LZ)FL@&DS|3h|i` z>Pg%QM!$ScKTbBIOi4<=h(P*9{1Qw*PQ5CbdPk#uoMd<6G(|f0IwRApJO5NwTgX*Q zD*TzkaJGcTSv}lmj)xv@yKuw3>v$9M>!tF!;uI`UH(C(c<-NOh$cWGUO+h@JezfrO zxd)NQjV*YL^9bgP?RUKYPO0`!z$@@uuipbjK#wA@Zw?m$J(6b2oRA`L%XeXEGWMs? zG=3{9^8DXa)Y28w|1cz6*w94S-s_R|U_d!Cj>;F{C22>ge~qy!GQZ)mL51Ae?F z^nf+t1{_}#LI@)LLJ+@AMt!m@3}$iaZ;Zt^L@*Y!w6q;(aTXhJ z=#4X*;g$&A-%7>0xfah*Gnri4+K4TlQCc?Sg+H<(JKR|U{ZESxdxvi5AMe;7!!X$9 z85*r(?|sL@v$vZd)95Lp(CA?zvv(Ac*Fz@(b7BNs^`hT=FK|+r@U=Sl>Zb$a-?)<2 z2=NuBe?>~nJrYO>*3=NXsh<=>kA#)=_JOi~%hB+}=-_MS#CYhGLW~ioWMT|DB@@F; zKRG5*A*#ioj243X$fhv%&?|>=(B0U2@BkKF;doOa&bJh|_X}~}79a0^$4S{rDLn~E zrVk)0dC**jmC0dMsbEF>Vco01nsZVfO2$e5d{_utFK1f_oj3GXHX)wjI?u>xQ=iGj zz=(L&;#ZE?>HAfP9lKvO$aon;qs&3du6BX!ntdcByDnq*7CFDhTxjOwS^JATo|V7I zRC?UoA4)W_|Pk(Ljd_VPY>8t2;|f0Dh7O!s6uX4 zVmJo0u>A)dx(Ehb-zYO+#tE4|PoIz(FzJNM0PjE-f*t@j1PQdz6>6j-~C%dpCh`(e#f!+IeEES1rdsK9zrfi*(~D^U&W))25% zOY7N9GOW84SiM!S&fcqnb^P8owbHu^tlFPsSjT?y!+KW@>$MQDRFXeRfwfG5wMYeP zlp5Bc5U^C5x03>Em;!5{3RWjItY%Z2vuM*s8CJ9ctC1S1a`R0l79)iyJ4DAW zggB?L`ykGA^5i~QLc7$+OVWA;MirUKVN}tnRfNY#yGVPTd_BX=uV;wlMha&moPce$ z6$w^pa-4|qdd_0<#y)oDT|^<|vse`~xsz>^oJHi&kFsx}ihW`iW^#_nBkEPt0I_zJ8mI}jFfMM&(miyXN20yw7P=_{7V z{Sc`xBIdUZ!dIhIuYQED;_a)9XuO$aKEE}})j8*6BR1&^!={fS;L!!_uor)%ab1#g zvKdk9Mjx?DR98{$V+Ozpuj3G5b*10F>!cCvIptbMVpfqZucq0@DR}>n7z5z}K9E#q z?l`BAkw@SJ$%FMI5_XaU>o6b!d|E97aD)6`)y)58Vqvj0nuu}r@^C)Hcou{b!u z#7WD*8gQdGI&UfWK_xq+m4&ij%;EQo8R&mJEoR!f(8iB}nQrl9@!lqMA;CT&P2MKl z)=De3OQ6C(aj&vTfWz^$dfxE-m!TWhvF-%YV=uE54f4XFY!>Rc3k}2Tj~?{#%TJTJ zl&8w}w$nh8e+2u%Bm2@Ije@NTJoT7K0Sw3kn zDqe?VH$$??j6IAvOJR(Ktlj0U3~{O4Y&9|SW}GzG?8q0bP==9IAf5IoBsD-gBWw3w zEA12p?yF)HT`I51buwuU@-C!-t;k5(FZRkSa#f%=?lN}wTuP~eHQDn=Gbi?m!%dtO z2l=O^r1CIdlhetT!-_jDUUA1+=}b1O>{Z`!rcN$ZIpgYx{TY=r&Oq*arddsFCQvIs zZ-v^7Y^%xsO20Ex<}YjdMChhCNOqfkX{AaS<7FDEF0QM6aY()CdxELQw=H!t=^i}S zEE8wdA(>*!4#~p1h<~c9U4g#13AED*g$(8OpM@Fi$=$7uc2?-7s?mP1TO}yywN4K( zZa!G=lkq-#P{#Y0gZ}-<5XBY8=31GG!`J?#_QM7Kruiw5`+DU5;HOl6I0NbXR0!^` z`ZNqZe%RF-J)R2PR7HLj`xR&#~`>{X{$0COxe?sMhGmx=Q zgy8UZYr~BA&mFCexFB>>)rgCCgynElActSu6`sRW&nO%&|3RkHw?D`n{``lwIQ;!5 zVa6NP>UiG_-BdN+itQmdtlB12e6Db~vjAv7m%oB}PNgFcRK2RnjE&}nRUIp<41@T@A;@uU*W9TQ#Ccv$BxgfhUmXh7Q)i{>) zW;h1Ok!mZJ{iz~H-|dro`+A?e7h6i^1b}-k6gbt6^L9VD=?b`~_W8wfK6iw*l*`qJ zg4|$qi09H&UNCCEq$%EvrR3zzYQ(B<4$F&nfxMW$?IPCyU;XRPaeXlnz}-c%7D?YC+bwCncBXrJ68qkUwLtk(XB^vlg_ zz0`>1_X@#il{-LOt1#N5bdj^iFE;}Nz}*`PoN5=}@QDKM0RUH<65tH0mYrdh0>oyh zEfU{e?hN|^p)tF?j#L<-L;lr3Ho#XIwU3Ny)Rr5=vOp8ag1+V9SrAJU7Cc=g(`QnZ z%z`oeQ=NB^j8(S)thB}u1XH=fDn9n>e+7PIm7o6QH>tsGxG4lUmBIMDAKb=D8Qd3@ zesGxq;GPHtPGx`G><9O(0xnGju2%rKt3!cPEp~@LQotD$aNShk4)s)n+u5^iCH1l& z+@9Ssxboe8a8dxctWe-oQ{jF;xR(@gnJRF71Hj!H3Y_r2_X`4>h=B zJ=&gGEBxSo-X()Ow2M2p;PJ8^=-p!3$_(H+>D|wVM^`v2w;wh_Ad&;WGvn9+^2EMk{Y~8IR9S_Nl zu%hj<%6*@G@<2Ca%uab|zMWWcJe90_1RZ5rbjsSmO;&|&vYxHE$?n&_N_G6T`KC#(N6}L{YK4D$jW^+V2ggTPPuA7*|K_p zv4A_vs&sjWSisNnoy<&QjQ%^NjIUaz3iaC4K^^K{zWnLF{5RPx!AiLEwI8sIQ_>JL-e#tR~=nt36L?6XJ5$^;whK$fJtO$qW>aT+d z9qA|Zn)eh!pV+r;U?ucLiZIOxj%@$c7 ze6|Jj!AKK+NgKrmVPf(-Dugs_emmR{>WbTzhW4rf?EfnK0E!MP1Bg}z&{)O?P>c8C zTL{FpVUZkM94rv+{Q}{5M-hlu%HSSVApCFN3J2f2J{W$qAO7h=1^(@2OyJ}-ICp(e zAPs24j^#|~-e5v!M1Fml!uVxGnyg9*DRlZ)k(IqZ*`)9KHpQ-8px9lvAw1XqIjC@L z=w_K~w#~BGC2mHsGvk*tBiJy^_)^V?ki)RQ+1fC^hGB3MXxh5AgiqR`8pY`1@T0iX zKMHrLJc>D`@+dM&mBqC7_9##n=N&A;s|!4XL(F8+8{s6S^vjl#V)G1W$K_N_#%FleGxwiEdz5Fm2zLiRzYn7QvEkPzyvHIR}M!H zYfFN>v@{&fMPIbRLYrrZM#aO$>%#Le{eZ&5?>5Oi{CbnJngru`^!0E!Uh+ihBm{hwWiiwbe{l%-C9j2pf9A6` zSKG61De&(M0Y5b?{P`i^tCZ^kKm7gQf>U8XvV3U_b0d`a8@2N{8p|5d_X<^QCI`1s ztr9(zHczSA#0R(0`rDj)Q*L9TZ7_wG5^(dHmpLVz@jPzFL_S}u3YHo94R4W>4zEAv zmAwvn?sbSIIrM$Y#&~o)6bd}ZWi@G9+oa@-g{`=ryvcV!g~ZHkBl_%a{wbZD{+b2j zq>~39#43+gR_!2DbUO>h#M0U^c%#9@oDAiBkN86wTchCUjXqVy;e0d#+zI81gCUu` zIf6MDlI2JoLe}3v31`XKt+BGI1}wQA8~T$y*l!W|8}}Uy_y=!_4T5WiA{J#xDS^a2 z&5zR=PhXDWfOyTTbkd_IgQ8VK5g3%H&o$nNI}TgUZ`Hakwd9=q8(S;_BisT$33%4X z^gn+V;p$>RuLMJJ3V*C|b+)hw9zsUYXSs)&Um_Vgn>Gze!~GJ`1Qv6CJ;bILb4s*g zB4v`>rq|^yA!YId%RE6?!i0gdZqqdtF)lMVXvLQGYr-;Sj6j322Q69`= ziB1loW6L-kNawTpmGFT$XFg`5;(^_)p*wU#o8r;elXV{lP=mD_)=E2t8rdH+YP1M* z<;$fbu7RzWm|=VJ+SVgn(^-V;Zql!+nGe+GrL@+K_|r~F^}C~&x~dQ5P@(>@6oxxbqXtyBzz_twh;esjI- zk6lPVfr1I;F8N|XICPJH*ydV(VzIJT8P|t!mju!^ZKK*<68M{aV+eOi6?xU}cb5nx z*B)X^cXocbL0tP`8#MR3OOWE4kHb^^$6X4=?^q{O+{iywg>sh+4vXXSAGB%Iys$_i z^rkQ6Eq;xlju8=6)NK4F$XQZF28e!Vi9k$Z2wJ}D35VyNHEq)}N=3^rKMYUHS9U72 zJo$x8%OhXNvvLcxGx#B9RBKHmOyGjJoXFv#9 zcwGuNgzr|hEeq{c16Z>r`~dQ{D+4(6nLL0h{;4XYtK?ikI3x|L+H{p%zfci}M?VX8 zmAo1je#!f7TJxm~6!`5vlf~^rRg8sN-mDv#yh(m9NflXO^?OMK@}f1Qy#4A9? zewz~4E>Pm?SA}QT{tAU*y*`y0*8Nji;$l8kyd+hmBFXP15y)3bAtbIxtAnt5rfDsh zY&Dw@L$8N;0yF$TSV3~5F37{(RJLI+CNkELZJP}>6M@%iBdW7T^hHrZRb zSbX5|$N#NWiygqeHZ1JHp(;D5Hx0 zSM3q4WYN4@qDsZ{e^f3qDQshZ6X(M;u{80v4f_#@dzv5@;H&K=@D zie&Di7)^95n2!SECqDa-w-^zJPKwQkWG6)xcT!Z7qswI{MgD{$36sV+i^=E}P4Wez zlysDw^L+bJMBZK_OVg`sl#R&151Uv{=}#=^qkwItGamADhV)R#(>4Bcwnp@B;iX6> z?W}=biqYiHB<7_UEl)aubh#{~mjVa>UDps^io#m-FAT;sN^Ky!_rI!Lx-26dHFNHup`M~d`7!7^xdPMD| zc<2D^EJVET#5@#5AUC2e?`;-DVI(_OH*(L>Ic6<5lL=Xc9*QdNp?Lfyr4mxGhaxZ^ zp8>PZ{qB$~TDw#Y+3`wGM2V4CLJGUY1FkqR@35=8n77w;6(-u+A?BQd`#9u>S2Yyv zA(%7`%6(w=snYr=dt|AIIXqo)CYFVc<%`2qgNLjpd#r1y)!k9D=-vJG1(vS){ks+n zi^(4zQ()*j(>h2^cAZ^Dm|x^Aw>p2pLs;EYKq z5#4hO(fKmBi2YLn|CG4PuX3&zSSnVu(8TPJ3mar$rL^8hGT#Qt3*8CJj};3UOtAwjFb>~n7v&a+@DUy@ zw{#UWTP@uLhsUg^G^mFIXUtM-h0@J*{B=#f?3poiAY~u|Nm{pQYf@K%CsquV-w^V! zy84KcC6*_2wCJ(UvNR^v3-W=vL`CUp^35DM5h;@t%zr0!faF!t%!tDZ+53FSklNKG|8xa5s$`A4QKEY=<@sYKnH%we0)XR(bk2Xw_NV>^ zJm?N!G;K2oVPY+AxFX=w!waK%8Yu(m{4}tME(q|}Wk5zu@}F2iySHFIu`(sU_lsF9 zzjx^QuFkjTCq*x^qZH<4d#L6j4P-fNA>F1si3-e3ls%6@QQya)sPBwehi6)>Bk{be z4!uP`ok3E;VFFhdN!_(68rFBHv%jdgZFYcX2?n zRp~No0R$dyUJXmis94%_Z1At|;jaVfNT$(|)VUrIr72p6M7#UmL5a}&2ONCw63ob1 zS|2GUR!#2&HtL6|u%b~KeGf$2H4b(RKq?sjG&Xk6z~nF>BPhrS1*CC;8srNyNY6k@ zwP{oSD^Nd5rsGf_dig_p-=Ens^`p6$mz`)llm<&~@ zWr##Uxxm+J*iSX;pLRVa2nF-t{&#*3%RSg)lD95jdtBW>f>?6l2wd?m!+2)OD2nH_ z*cOZeE|vZhh1}rGs*h3_b!Pyh=8lmW#YY!&0pQMKqx+nVE(G+*0O)=pZ8uR3-N>Ok zJo6Y$K8Jto6yP0L_S+%}SS3~q+T1Sb$?NZdLLaFIP|{aTSgru#XW(2a1ocEF4lPrS z2kC2Aipg8eun)|^BOcEptWV}y0RQN^%wtB1ga%5N1D4u^Suo|Z%;VQ8PHd* z&Gxbf>c8I0%eK7+7?bJ;eg01UrXlZ-T4lIqVs7R`JaeY&hOLlfevp=$2WwuXWZjxX zS98x`W6pLTSqcxlI)}#+&uzo4)uF9Fo_`*)bSiZQ#%3yY2AJp;XzsHZTsJ1{Wn+6z z3%ne$mhPqdU^-}b5$t}ZX}#CtkDg&h2i+;LgRI@8aWd5T(=9K7oz5Quie zf&u%m^LZc{k>-M|YV#fCP)^WvIqi!!Km7@mPROeE#-WSiTH2TQtODPYQiJ)q{e8Fw znhVPBNHVytP1tMBg-piK?0wkz_rMg|q5VZ}$ z)XI@=f%*ndPjAFBtgO7j*$h@yuaFr!>A~qfkspRpoE4SR6&qm+8s!b5oT}SMK3mu% z*8wq;G=~oY@XJJ22W|RDzHv5_am(Pfa}1uG*lNQHzr>5z;B zmQeycZeEDH<=i+dRxBg5CB9jW&|ia^WrVhab(}pb?tUS|M*n$0$ap})!&85?*Z7N| zZ|^=p-_AH1|L8ofHb=K}r$aj8bSK5y-NSKKQPV5>@eE~v$!Ltz(b+x2^>)wT5_06$ zW;Qxp`B*`={Qi6}MsndTHnFfe8128a3vI4cWtQ5TibXLb`Z?u1GrgS85iICElwIS$EEZ|_alZ40Yr-_uTE z6{I%?Al)$tX5qe!7qanSx^i4o6_hA$Og zEJa)4ZK~PvdgS7`BIf!4r+61CRyw^|4^g}#+7)?$NY{u#gMjl>K1;vHw z7HPMx7yS;uh`L@cqYS_=qjkNQI){g_Sds64^D%GD%ZMh7^M+^9jTVn-s{{0%-+z*f z6~kfUy1!AWdY+2rU?s88MZbKYF@k$=K6{Nbe>@c7m1Q~z-ev@eB&s0uhXz6Q<|0%L zhdMqa)WG#F6uz$dAjq!-LXKz^-vIj%{b&PHntgYG%k)aRuVAL@d}Qa3BcYTPcv8{u zD+qEKw7?IlsYneDph6Wx^sR;gy6spPOab=dAdY>+DA3yIlz|3d!Hu~IC%FIW5 zkgX@uFfHvQ%GRlbt?f;(2|{+J7SdY!je$&J>j?@>8mxCr((nZ86=b1>Yqd<0wg^ft z4mLWZ;Rc746e~(e@p#B)m+%PAXeo%u=XY3>Z4$e{+KFr|=SD>`xp5JYolSojQo@r= ztyQB^+yaAmsEjcZj}__+IMN6Dg2!CSKdGlI*&%nOivf;NWQaY8IeZN&cj}fLh#*OBTund#qFHfPK?` zHSClE@nGk>v}Y_jM3zm23kz_f-AKvOO%swDWauywjLjI9#lm;C#%iM@K|8L&w@l|W2_HtG1fWa| zm%tPX#q~8$GDhEodcNNXYC*gyV6p1*Sin9d2c;8CdG|`>+{D%-#5+Tl zkZWWKDH(O%r_AaTNkOx|WP@tfFDeL_^^a>p&Uz?IA9B`1u#_+6{FRjPR^-inh<`Uw z&$2ufo<$Z9p)7u$zR{;WmM8`b1+abObW71iyk=%L`P|>uaIyW(jVr>EVx-n?^4nUr zD6n@c*{`g(&2CsEba^YCuJ)g;jY ztlGI$M3{W*+sX1>MW(Ii@{RU4oM?69Q^<@+C!O(e%K=k0F&Z2VP1BoZsA>8}ejrWX z_(V<9ne12E!*ltJphK`GV5H_JQ_hH6{B~gAhoc_|!2Bv4IaVvWS zQkkZ4#HA~$Cfk8!vOG(SD)^)B09_LitZU|HpjwFlU2{QZV#8ee(42eBzuKId+k_n8 zYl*8JCH)j{jEL7r4)uf+TDm7pNj1~Qkjs`L3}vKKRe5cL6x9y$X)5CaVv;*o73wvE zeyJTC*;02asdPsD7H&aLxf4dL2i?tydPAh2sIPzVe?ZiT+o20XFj4PyAyExL)MGMH z-^;^?dOuNL&1+48uO6==%#+Zt_Be>2WMM1$?WohA*JHIlIw^2P$6WX7sX;%d!)Hse z4(CP8n5o=A(>{X++Ou>@%jPjd^4VWQPTwihny3k>%-@5#{-wNFP?qxJpQ|R-m$?Cx zYEEeFKB+bBJ_xmYY*#v|Ld^KW=j0iGy*%S>!&EbV%Ka^7d?m4|k&6vP4h^GV+lKj29)VFkaU;NJlODOoj2IIclYU=fx}i?=J(T zzkVF-eKAN8wiu>yY%5&H3e^?yt9@{KMPBY*?^{Ub;@@oi`vU%T;ooQI-(Y`REcnL^ zDf}8B>`E50T}e9Il~j+DcO|K~EBVy{yON*b9$+%_FMI(v;-FM6wa?t>4X|i&SI90v zK3404B!E-_p{syeKxm)EpsO2Sp`w^Au)E|Q31#_mr;n{F_->Dv*jh4&u5dQfN;q?M z8LjzgW-w))BDo6`A^o0;$6(GWBn}=}Jmcfyy;nIsws;4)gAu&bOa^}4g zIykMvlP2Ws(0FfgxYKGxcUCYn3aRYgbzPQkyGdWH#*fEM}YgC*7%hC{7mZX$=6#IB4_BCOsb6f}1*)qD( zM`es6SO*AFG-|w&^uhTujmw^MqM1UCRYMiRKz$jZJ~JBXr>4=xE-RLT1hGSJn1|)i zzwHw_B)No#Bv+8ZQ=5Qh9q4}@Q7GD5^C!n;dM{^E0ZH|Z^p&mFxJ=Ez7m4341@tOM z$s&7=ffY1Uk=fR`DJ^B9Kb47V*o*hHcoD_o z28Q*y>lC>-^##gBCngtB-rHokU}5xBEUeT}^u)aT1ec7tkD+87XOf{s$$-nrMfAU7 zzho2==VKuyLkp7e_kSxH6`g@dAB=2GGNN1q{#&ugK#-$G28xAKnyy#M^3K87acEY5 zo9?A6+Jm^zX^@j;(u=wzm=NHY#{0(Q)Kt0+wOQv`k4Hd~G(!Qiu3_yZ3twxXI*HwB z@Wf2K2Z+gjdGs;}K&hrUl+gdG=zrCgVuS2(b(WCmM>VjNPNFEzq$u9VZ|s-I`th%r z2GFI^AKx3n+F&JCGCv04qDWl^+4vlg=%mEX;)v=##3hRUwsjV>-mp>a0JgFr;3N1& zN~u;;wImExyI%rS)ubR*t0+~gDOF44!MZufVl~LZFd%n!0+64KK#)|-vWh9lLN-M@ z!y*78-ESdVW=(3yhA@z)BIFSaGG%0zi9$AjD%RyzMGELFp=$KR0&3Hi(C<>`rFl_8 znkYr}7>yjdrec#Gm3LhCjA-&TU7U*{&jH0Pww*55gK1`mP&4DMVegez2!z9BMy4JW!sy3vMi-LBw)0%|{F=aQnL;Kg7~i}` z7L;W#H2Ha_d+C)3+4KVb;j&0ct$S%&L@Tz}*a)z_d>tss?a}~B<RlfG>CQ4v~FgCn9=cK_)VDY$P^!ta|@kQGmX6(FzNvC7IV zki4g0<&M?hWSTOA(F&#U>gVD9%S1gQ4`ib4sWrX`*TZ0f{h7uIHpzM(FQo`_nhG;n zc--e}K{-es$tXAJ`2fnT7u1wPqAhRDV9i5=b-Na=>0p$emr<%pl6lzkjvyXJDwrJ1 zRADmp_KTZ;4lT@*TZc6wfn!~ra9Rjt=gW+IvVf`Z(#Uw3059CB$dsCXB8XCxR>}C? z`)~03s6F5}KbhfI@45u>t08?}Zt^R$6*C*~3#|FI5D$R<@;nyS(*^hZZa`77Ua{4h zquhFhg?}`du%c|(4(UiuSh)@|<}!spe8-&4?Ajth$&oZ?7~2zI+XrW;FtgDwwF{L^ zNa)F0F^LoOltpIr{qaGJzUqCMkag45guE+wqP9xSiS2-z=ApRlNafp((jinudftvp z$GC`b)MA<@+NBfx#tz+kRQ083?QCOzF%pjDHqea)8)@{Mq4KfZJs4ooz;+WWaocgF zWg|M8Bae#GFuHSa>c}xIo;qU6{ZnKQe)HILoZ!w=C}X($S~;Ah_&7zp8O$H0BR^$; z7o5(an7b&t@;^a^vtrvo5z*fDb;`bT}}69&HH-=od|*8w|DX z{JgjXSIA}2%6TzBex`t(7gvxiQ-Mg(FqvAkDZHUUX*fBs;a$+MHp1VV(cha?m) zBSGnHq|%#c_BS*u4bMjfG%R;RZ;J(`w^)CpSfx>EV53)|k@peaLhEm#Raz_vY>|pB z;&}_bzlC0DF(I(Ut!{ZlxzE9foOK`vOYH$6nyKorV)Jl_yD?F|zcfe*kTKdJ3=jfS z`NgNFMM>jJ)|(6JMQJ$O(DXs|-Kov^x7#rO4SLU+q!+~Uq*z!%wnhr(0*r?<0(Sq1 z7z<;1Xj~cH{|MBmAoE7i-9_N}G-&D?s;Swvfave-vXI7N-2d+dm$A#Fm#k1+u}0Yy ztB!bMuGrDCD;8pwJ;T8aBV^bb09`He5*Nj!WR0>zfvM-2kGFDfo+Su)j$cf=r?dG- zNDTdyPy!yISJ)1c?amo+ z&N4GrFG^)oBSk3^MR6;O-@;g|7Y49E*>s4o%WN4z=9j;gu@Mgrl)aF6rBpho(|1H^ zqq5askFq5`D(Yr$7fXL->15L1X0qAKmW`s>%efFGvzM(91+$m4NI4=X5p^5!8Z%Y0 zs6}Dpo<9PzAb5a#Wi;eBOBsG3T_%65zyhoF+^Wf9hGF# za(3Cg0lfi0e2fS7*s|FTL!PZG6$ml~UWjM8#Bx^V%aQ5HWa7Jx5U$u?^h6(~TPsQ% zz!eQrT^G#9rZduwv95~;LV?afU}-u8Hn3cr_%dyiul~k^viiaje!>D;wme=;Y|c2%ULAFp zAb4LS*RNlI(ecnp^jVk3`Jd?93CTG7|WjQO6V{jTo&(x@bZfJX7{U(C&8rcDe=gBVdD1_rpToHeK$1 zSk!AZy4)i9!&~x)%jFLetoIF6tmbrN$!$I0Kp+Vd!QuU>hVD3+Ljm3Jm1M^olx$Yh z$`lZWJab3zKdc;yUlITSdt32TdPHnoYES%L_mV!cl^yBdxQ#dcLnprmxl&;F zryc6f?q6xmi;#)kZ)gbU{*F-HPgtn#zQ4NryTWyUS!>-l;OW+V&^@)e za;H*2e;@X0;q#*%Fb51*hI10=KC@cOA90il?u8x~fPS!SfD|&2R7E;KUP`1d7i!f! zeQ11$Ar0!M9@4W~)sP<1h8a@7)(-4?;*cJzr$frAZOgCR z)wq5>E(EUE1>joNUWMzr_F-^c6xtm!eYP)V)87G{H-+kY(F%3fqPpwEw!3b1eHWoy za82J+4`9{4vMSDuHCKke7(qcS#sRy&nIK{c4no&4CB zBLME-bUY7EfiNy8v#a4}zdt_8VmGi52u1Q1R;Hc3Uh-%Y%e;!dlRA>UtrfUe1i{T~ z0r&ev72GNG$J(uQ=V!^Dt*3(XBpraIV5Bym`Nr{`EsN#lwU95bMSOWJ;X1WS(Wy1E z^1LbfKuCirP>(ciC80&?ipM5G|X;K#GFb*uw5b!}MFmZFCFeA*;c2&(>*&`^(Y%SF?P$ z>R!2;#VDX)&3+5lcag5|IU{g=PscSK8N%0boe>Qby2j_TH68)MD!-Ji>#XQY-fHzX z3_0G->UzauzK%S;##fRKn{kbgC8-ayHGVZ)<8`^6qu?ct%x8I>ul*}hp~r$Kpa+B- zAu+PjFaws$;HS@3>8eSRbq%HJhmkF4{rcNHU)mBgm#1GI#rcbuhI8jC@B4p$i>Jn? zCIj#1ktZ1+M)SA1P=C0!6`}6`pe)pK%wy4{K%uUChX*?0`>#%d9baYcVb`^Ev#^kS zCN}%KuOvxy<*7Xq0U-pFGVpx7E zSz>O!gBrWj1BQO;Zu)36UC3SiLHpf|S}~v68u(!jd}z>Q^bcs0a1U)07w|~Gls@Vb z@Tl|M3Q>xx8j}gp&4tm#HW!9S z++0)zq`IC^Ml!Yat;XL6M!K9asUuz3r9XbdUzfL$g16mq-kR@jJrKS)V`}@Q46_O_~ln!OfME9jON^QtYL>71y=Zg~lmd>M>Ra+2I;-?a#=w4Ri z-*4s-{#oSp$M`lA1u$jueq&W7!-L1LufdJxAysJ6?c$d>A$annQG; zFGJc#o*fC!h;nUh9_2FL;lRjuq}}kB)%&jlo_*)lo?Oc)|AV-Trj4A zVRwpHGMB!zb{y{c`_i{=(14TXna2W7iu=mm8WVVHUb(-~Cm;Tr@bDM+x=3z|uS&}7 zLl-!(u+R^65Bj0-e!@k#qL!V8c{1lNm>4^9e431SKc*yhBuCRV$68QnMQVA#)j@~Q zX8_fuklWZ&gcrNw$yf2PeZ|AOba-QXA7$8#6ZF|@h2FO~& zxQtbkK*lI@UcJ@d3Fb>{(a$4&@O`g=>yaHKxhsefe|^$p%KnK%lqKojTNzRhdw^xV z1eX@RB@9I!BOhk{nZR^L5pzhSt7GVlnJwBmTJvHtS;x8ab922LTVS?`%m^xrmho|UkB)x<&Bw zw`)&IJd_@Gnw&dNmJdf|7ZO8uj#R;bOj zurzZlf1g%#r|U&`W^9V+nNrPzbl zjGa;`nR6cun;H@t#6eGSh_y>I4HS~82!hJ&cY9iHiJZ#+@kIU^j3{}U#bzB?CKaco)wbLp8s5y~oFnG`o+^F$cKY0EGnH8=Yrgza@?952R9QH z&B?w}<;j;q18FqE%ZvH*9i;JLX2}`g%kE3@Ayt^r#kkt$c>&4(hS@qXcL%1K5# z+%0CeNUhSKDAb4hh;K4eBX6U=*PxMkg`n1+9<~RRoEaN+|8);e3x>V7NI)F_cnehj%*n&17?fX`x~;6=K9GyMf?_ z+?Ny;Q8~UyrdFkiS(VhhD=a{hk{S}xp8jZ33b@LF2z1HQYFP3MkuG_$%zzY_IcZXV z!=2|2w%MxUepPbPrEItoKSg7*ioBZ4j7d|VF)0LYxNvm^R`2W0^ie9)M^p#QG@>48 zJHF+kI5Q)82_yO2ePoieOs9Cso*D(b9!)x#IZO}=uAsz*m7IM0;(u{u1sTQBOTsoQ zJFKP|5xU$<08S4l&H!+*Nfl(&G8SrtUEKU21P8j}M(gr+NlSisjS&Ry_P!ML;bcfhnESxt+wl=-7tj~#TQ45#Sh3gLAt9}g@-`S{fKr8?b9^ae><~KW5G>d4s zv#sEG7O$4h&Kv1GO;sF{&@N)0a<;hs0i2y^nHpj7>VkKG;cPLP&Q6ntpDm_>ManmO z1~ykmtH0q~tz;X&D%o7W?>S}Tx8P$wS5G?FTpb-aR}C%ZY7w8SHyPPnEs1D7@FsA+ zGX3~e+(Ov<%0oq2f!nk5S@FHaX?^k}sX%<4eZetHhU>82qc`_>%YA1;v--%#!0v#yJ0Fd`ZO- zAoT}5{P88X_PEIS5?S6=B#-DRlUz@Q9p$`&+&?ow&R2t+moPbB4RT)0oBSyyYWl3c z2>Pr(4D>08L;C1}K9|NZQ8a`SMTI^A`C%ah=Tw|O1jklThpTq2D2>&M(o{VJ9_)kU zxzDA5cd2ZOn0PefG-B0a94)cD_1)xCBID3W<2Ghs3Orttrr3AKGO%w3ZLeAp3u%)BerMA2%prm`;hY z{CClvvbsQHvKU;~VYb!I;MFCyW14&g72Y10Z1tLPO+N4M=F&_|T3!?olDJgV(QX?S0x>l*B?lif2! zOI{embERs@+Od!;6`n#9r8A>W$(5SXyPzHGM}&UnV?P57`2%@JBaP$*?5G5d6S@%d z(pzx_aGF)^l(38rSmzO#@q^W#fcgM;(yw2Gv}I@Q5;FQ_XYCf?mRqsvmRku1>F;Y* z9NSleIMy1d-IAU48Al>+ z>YEtI_nn)4+^G5LJ!YU8h~Cmn2KJV>#zJ)(z z^x$?BmNMB#c4mUT#dF%Ro3v}RaysJ>36wE^<6te%+IGsab+se>qehiRvJ?}1$D4r#l6PpzE_NMhA=s$nm9>741?#hzGi z*Y&SYI1IMqU1I6+2qkP5LS{j*g2HBp;|Q-4-4iJ~6ZK-^g&7ZurKf01AGYiQG(URz zd7rndFXn;osSJvFkj|Jst+=)k^|*et$@_}<$Eymvw$3IaSzwE!8LJ5#gEtO1zg%M%n2kd_x9W2LW z;t#rc=TU3f_4Z94vLA02r7P`Fk7k?Ldk0%+Bm4_3t_a)3J+&fIXhtW|b0;NE9VJd3 zU_V=wp4HNky1I)wGxc~-(23j!qsb|YrOz{n16FgXyQB9G=p_igrz@q=@koDAwltVW z$q-R@a7CAQn2d5-pUda;DYb*wqXVIPLgc82H+f6=?ZB{BKoyPYx?FGR* zh9$f#$0ujaU=3FYt|WLO4L73Ud=Q@&3$9zB6qG}97C9taiKNFS<40j$-`lE^PjvO`S>g6Nw!4q(Ci|UhP+$*PPzvIqbehw% zlv#{+qXVv1O2Z6TiOPeC3?OugIS4UoWJKI(2mO-@p;lAGoR!srAbSXFrlNKk&^`wA2D z4q{uscMxHyyn{G!O3)5n8A0{zs2>QVx{rtU2VG33&{>|2mvB-oQY<^fha{-EcvG8_ z2tsaQR(Zr~a{d8!xkGTJiP9(|-Z}tVg1$ozJs^keU}`8dAbx=89cdR<1H(WcIMD-F zUbz+BWN@J6LSG@4>oky<4tOdDQZm*6afNgP2T?&6TiP(74_(4uP~+1R@bQd~OQn-G)-F9sC+;*Oo=1_x zBLgz@D*BkqZ$e4y^<{AX^Hy53PioI<3(={o)E9DK*`ndB&X6>aa&MF#Gzs#|5B|e4Wxoj_rua)`fn24_%qS(^xwfIR!R&lk)a_f(y8$~ zh$vzeq<)ABHL`M!H??Uy*}!%>)diNV8!06wfhh=g^)9BumwylEi}|KPBU~Ilb>Z8wc5|Q$3X-n^S&Y8J4H;=a9?)Uw^|8M`8-aGfq znKNf*&TGz53$JAwu)rIhFiHcnw$K~Z;tT+Xl;I9GQB(j>K(D`i8%eh*Z*dOZ?oFd& zar>xP9P}t&b<$Rt<1pIr|Fq)sKh>gh7nFJilVKd71sWmu=g2Z@81Z6 z_eQVKzXyi>y{)JA@9=#3-Ed;LF7*iLQa^Y)<7Vx>QK>ih1J)btMOM-Es?w(DYOxWz zR9v&V)HOnvdcA$5E+y(#S`?0a{tM*D5dZ81CI3J*7vkjhYW@Km>aQq0kRf~@>px9# z#4b@Cu3LrEmh2j1L4c*oNxj(mR9>GJMwzvQ;tyi6OzS3YEbC8pt^s7{>ZP%BT}`2` z`9tAq5b!agD)1A$t&PGFL1@eNaqL<36gX7wY zoot$^bTW!Mab8>}2I}N!+j=?Ber{U@=;ObOD^TPn{bUM(qWkojZMig9tqXPQ-KD)x z@B7^en}+ly1})&;k&0pq{4vfY3Hb%+vztw$%Uqv3o2(zEiSL`4@?$Vf{-L%Cj~Fws zK4vw~9`BN-FSJYUhe23jwS#mzYjLgk6H{N|ePVhDtv5?qbAX)7SlRXl8B1U}t@&q- z1;r%zWG#bNt69R9^F-;@@MIST*u8c)8DBB+Fto^e7SlD|Jx~_O-S6v*1;vH}9M3Qn z#%EuI!1#*Y9R)@Y6~+~Pxvy(A+eV6n+lVCpzBMQL+91h8qp*oM<_fy3JN|YZ z?J!gLb!GH!6bdmojkUV8UjE1hqJT9GHmz+F&6 zS`?CE2!0A~lQp<;ue`e`9m@!I;(s-0GSeVEY~;o~%)Yw3f!jLq&$roME?0`?)v&TIq?X{`xs`QRUvy<_y6}Cp zM$jesRj&8du$TH^v7_A6RM+kd)wMgU*-(#MfQ#?Fjku|9O)t=*=-Uz(#_(QL7I9vT8lf8Euel< zFc5Vj91v;T3rxo*CXDJ{rc4=@cZW$k%4(iVBscXnj;<8E3sgrrCr!j*e)=;BFLbwX6&t-&mh%ts8YRzqdh_*vgt2ZI zr(;yYdv5E^tCSo;04~fu6u3rd`YCU!g!J^$Hoc6eDS}pA;jwMKPKUWE_fpT^?#jNw3gFM3a2=Rn^Bo$szvIu=89Oah~h>d7h31 zyjqqAn*9EsO@Gh7lfDf3bgP}BVssi1r8SWtF6Mi46cn2MJ|^^g>&5mT_I*jT@3E8@ zdT)Uv4^YG!%gB>u%tWfp{6}O%Lx*cx#PSgJlGJ1vGgE3|kr?>FP^njK+-{HvB$1rT z(NA_2%|~e)D|v6l*bE(pNa7=ZyFf?vuE&I)e67wnbA}=blz8+t#o@7RE7|8=kXuU? zoCk0P$AusrE5%~7PT)4?o;VFjF88jL8`MO_L|)q7U)JoT{srrFJ`R z2utN@`xI|z4YS~wm_=!A0VkLavjb1l#h8r!bvGJaIBdZPx=Ic#~L|2D}r(o+34b!7E*Q# zkUm+5kX`~vitpfZ{JrRNnvGcNuV z=O;M8k9qRSuZ@dWQS@|_Y$i|WF`LPA@4-kvmSvu)14ysCoffV#R*_y47+D$Y!uCo; z=Y)2AsBcxDQ6d%j-CJ6=6IsC-ShjZVsK~*QPYa(`cLl5NfCH~p27dPyV&D^DiB^bl z&m5!p!G>NThMmnvs9g;cTZoDJ&$~FO%jv`YLCYh}fSO9690HUx zNFOyKGffkb*$kjd2v9>Etxysw^Xh1Ynv@mV-1^Mo$wD>jb4E^6YxPMz&j zBXRT0luS4_Ef}vqsja#=vy6OB5B#A$j&fMH{P3wOVFOG!b>+&`y?$AcXB{PCcYTN7 zD}dHZE(R89+^W)P?mwLy;ESrg>g=qC#2*YQfd zNntd6y;kAX>qB{U`eBTsK8|74H9V~PFwW-(t#Cdat2gwd>2x1v{eKTKsry6bU8KnO zZ}XXw+27jXOkJ(aRBSIEQ+*gFN=e3N9K|O}X2162G1WENnCin9a9oW057OjDq(f84 zcTtsp-qa0V0I>nN{x)`!Sz_WXze>~0$}fT2Aj2QbR53?Svt4&dpxZ~)%3G^y9) zq@FuNlZsP?5u%|Js>tK|X!3ZhkjI6IGCR<;JbxkIS48<<<)`qwdt=YWYVPh)i1JCg zOZIpiT_2;ndJ9IX;rmwQuAZ9RfEPx(CZsTulz@w08gBqB`{xa5?HvQuUe10qqRdjt z1xCLgH9^)fA5F(_9Hiov7Lnr`-?&xd{jOI0juW+?eQASSb&OboXRE0Yzxyk0f1ZrO zRkTjYLy@NBq2Twhf|mt3#OyH?Z!pa1k6+O`cwaD;AS*WpQ_1fy?hL{^o{*v-wS^mm z;#Sfc-gM=W^&)(i)bTd{H+DpE^Z+hVvKXGqMMTCiG+a$HRQlrDTr2ZA_xe9Y#8t4?)!9h+s#VE;> zW~Cg4IyNCAN)AKEz=sUEy?I_4lxR9$g^~S{dFl@SF3VNl#ES6oEXwe5)=9<%N|))* zWJjiv=Rtu~ekJBS93Mx0OYJa@9H*5M-ukn2^hw-2EMw>$3+>vH9dRnPiw(A0Pwl>Y zoZ9tX2HP=e_dd0A6#wdpwY{&$+8{39&-Hf8tn=P<__xvfSINONrq=2U z*h-vlQ2w`*b-d;p06Y(%b`Zdw2rwcRz6F3aYY^ap6LtJ1mJ{G4d56NkUC-4D#$%M`fPbZbOWT&L|!G z=i}j0-+DGAp+VkAtm&Pnq^Rv+?^RJe<1@SfdGOBelftat;uN%g4X5DuV|5{h_L;{xm7PIDdkB?7 z{L|qo(U3n>l}L5mIr^QoTi)g8LwCwBW1^_Usp;yTZx&Y{9sW@b;@U|35q@opJE*#v zfpocs2TQKSR~B*AG|&l1<|JOf4)NZKLdQ!egd)-fLt8y788_dfuNSdj@FUW z-=yA>3|^m(un(^U_TzQs<4Xey`(+9(hgZ@BS*1!^$2~1V(j!CB%RD2}M<|N{N2gN2 zA*O_qKEqVgC@Rc4+sI=U&|tO?qZr!!BBP7csq?g=i^|EAvr2s zlB0qrJh!qkj~u4nn%QJs$W7~=9r(6P9i%l!IRHpQlViz67GOn1s$nvP;ZJNoss z=*St;(Jj2At!F|zT0$Mwb1I2Ge(p-w(~@l;)rCCY-Zi4{*wDW3SNhHj>HD**sqc|t zeYc^$8$3raVPKN$m!5NR)ac3e5!Pi(3R&F#R?CaPU1s5DLExN znG({;xvQv?#bKQcg-$fE5<_8)Q()zUzqQE?MUyDSq^c_&WZ$?j9oiDj}=^zpa$A@~|X@qLv;qAXr2Ao)rHR2T{< zqdmDGDNPMD4fV3`J_-k5zqV`O*F`az zzP99mIA7^$?5#We=2xM>;h`z==Sp2HeDNP(+(YWT`X)JxZ!z@cBz)I)bO$sRE_ zOI(b%qBDeOJ@FONgJ+_oJ0HVc&-1MGPN|o=5;X}H4s@c`c)P~r`oXI>9VV1D=6z1> zH&C%5KM#yze-FODL%i3E_ZZj29t*x7{5j9@h*%UnPJ12VR3Lk9=8|0ReNNv`wK(~q z^jHY=*s7(+{r|vAYQQ*7B!RROs9>cl#CKG6NmlY)3I3Z;mo8?eyaD`D$>rU5e^E}u z;pmE;{w&H%&oT*!mG?0@V?C)`9ErT1ppp3+K~~t}xLU_6)?UwMy_M7m4gydxQKj5~$d5bsnhi^Ago3X7Mnnt=Oj>`^K$p;M4`4# z%-2)oBk7oz`=Ro96`R?UBBUB9Lh3w4NFC7#JI618&!2h@`TWtJ>SVevJ{-CH%#U2; zsU#E29l#sa)mV8c?b3xSQz{FAcCPjtp5 zZxTgeK*szM9o2ss06p~=J*63!6pPQy;25av;`L`~yK!G0;Q1*t7S5L1%{FONeA`A; z?`@m-p?F=nE$`+&m;=`j=Y570cRgN%&Pu871oZVtiNztRo zPniW$t;NtupcSS=8EA|1c9gebj|<*%Qi7DC*g)KtbS#ZD6J@*2c;aW`y#Nf2O{1I; zQT#Wmzfltw`O^=|8n?Ppps2(1IgMu;^i$2QJ?w{ivPQPUQzPcq2D$1nJ-S8m_$FV- zUaF-{zC>*DYnUG&05++EL1;2A>x#;1JEt+!fLm_+gs4Ti-qZ7L?vIq33g`4lDXx!V z3;{A3^RLJ6vG^&5C*Clbi$L7(ZedT=)XPf!;46Q}%F;aEE|bks-&C?T_y)B1QeleC zV+S?_;lQ5{Bw+rqv1YQ-O-^VKrnaAB8^q71EuX zQrskeSEs~|YD7pmsqkq%-o4z#CX9v^^hHba|J?=5|2fV4kB&0`XT#_JY_$1rcOmot zbCdHg!c%X!BW(W9Xy*TD$o!wt%>U7d`ClJ8|8d&+k5lJgug<^ze=`3Eo1OpDQRe@& zI{*66`9Iji{6D44zgwOE3*YZf*6{tVFxq}MQ);)k%?0dtFa8*|-@#@#NV3M^es@We zn_a?S_^Ix6?_JDJ*ED~}9Bi4t8_x#$`*K$#e{Vb$#@}z9io)MBT3-Nv`zo8{@3x%3 zZ=D#*-|w6Z^0(uNmcO4p8RYNYN5c90+`16{F4k-KJ6EspcdT45`1>3R=KnQ+pW4?P zfB$+SlD~JKQ22XJW4)HYE&HPL_nM`Gzvqll`J4M2!&1K`?pLPXgg3)U%PnNKzXT)q zvlW%)3QS^1v%Q~HoS@mR7PDQ;Hl2tjwpOqsHwkwj&uXxrdj~PU0q6$B_7n^7RN}|5 zcgg`1mtCg61d73a{z^$*X=V?1Y><($c``TKUT!K+=%3xXz%h5O(XTH^G!?3DJYmJ1$x@D1qcc9EQL2fIqg(+P7>UvQhngLpT`tht+` z(pO1!3@Q&sAi&Jqq*|u$&5faC2Zap`?V$eQ3FKEH3#qSG|JVSZeBN`7Pj2+|@X4~L z1L)}qTha}>Kq~HP*1#qBA7`Kw)uRlwrL8UyPX=Gu@t~!iwz?O1erj>MB^}QgXkuWWo~0o8uGKU>J zRxcYj1PrLDPXa1#2(+?Vyvd$KJZ+``Wzbv=Gk<`hGqPeYw3u z;NMZ`BC%-HM=OPJHC?#;wIWmry2;bk_w#WpXhc>;BT8l6+moHafF0F97fIAn z7wjn9;oe+FH&aJFc}H;wtRBEjCt&v?uuKiGi7fy-UWmYU?-qdtfc1IAdWwRzlTB|Y ztRoJ9KY)6<5qmLfdP!}emm=!rLF|RN@-omxs4y^95Wqd@a0R!Dltys`iS^|eTxNWx zbaUi-OIG}o6_`AdFSb>?m3`L?D-E_@zS6ARKj}$@RaHr=iZM@sR+U$5zy>xopsuHm zVi&GtOK(sYQY9>;_CSV^Ra7YAKbEs+jz(KWh1ylLoRju}qs_0PQr_%mclat=WZp>>SGH|bQ=c7?pkSAq^vV=MdXDPBIt7?7?t>Mk?c89N_W%o3@hCU@e*@%3y zM#Cp-Ti}zspP+nWyP94@`&x@NG=i_80XD-zKSZ@q0?d&xy`tQ zUf98xP+D*arD>N?sC-hY(XE8S0d>HW{yRZ{_Yp$3E4Y zSOZUwut5hgikIJ|@56uZ!rzzk-;_173;%r_f4Anp599B~1N6HFYdVCUsgtXIf_JDN zVda`Chb(S=MX7f{p{?SQWOjzMpVeM2?n&+?--swI5hF^H;7z`0r33p zR=I-s=1C3MjsH@>K64VUPc3bT4GrVbRwI804#y3o0LK!gr?4S)H57|pLJ0YC+Ukr? zqHlmDEJX)vsfyR@6C&|?r7~o=owRserQ+3aLK*J6exl%p#^ao(X>9GdNT{w*sGpwD zK&^N~f%-Z;4s>RB`BgOGby=Cr@Ayn%Pn@q&b51|MtxlVBI_O#;ekrD6G*Qk^HNHoq zqTltU!a`1)bigH@)Jm!qY zn@;>#$$xmp`0Dk>f*Dw@(m$+@ZetP2dW;VzSqbZQxLz*umLs{AR&#REb%Lk5i1>+; zsxk4RmX`wO+pI`9yMIvO4Aa8NAUJ^!Y`$_i2;u1{5S9fY#AzWU5`?NpV8^koZ=`)k z0pp4S#u)_j>2VF1(j)?NErB^70wz8R7<~}TV_GnCIhdat5lnpun2iw}S;97auY$Q= z3#Kmz^8$fs2mv!E3YbTOVAvlTFoDhlCaV$Ms*b`91c{(Lb!#M)zW|g?6cL$ApkCC1 zD&e4711Mj>V9f6nE4V5>M*OH&816;o2bLTGUh^dOEv@RuE3+1EIIrT+E&_)N_QrQA z4z-9wH`26BIP#W1BZ6E5=-)XueA`TBw*$DMTr0(^A45oKx+w~zWQ4S> z6G9@93Wce5AWYGRFJo(vh>ZDLxt>%}MfJ~c1jJ<6qboDAM|MaZ0ChW&x{cErLb@G8 z-Filbvi%EVBJY*0JcJ`4TC_XHoyN%_v`EyBz0;HRxK-zyW6p~X5X(Wf#HUg)UqarE0 z^k67u8%b%<=jlQyTibysJI3xG-Vmhh&|4!hyX7FB2DM6UytfHlY@R-Zx^HlBK;0Tm zMU4u!h*X&T!-BfA14!L1fy___=^ZhQ3byq?C_!!tXb3W>gVr+(XMJ@E#$|RoZGM5K1$&J71-QbG>Urf$`Y}3A{Lm>+Uc|*;2L}xXTsovOZXa32 zJ|rfo)zD-gdv8BZh0G7;T`Yy%6iNh18vDf+PR2x*N1t4;oaHB~@ROn&T}6)>;Qvkb zVlr(zZUV|;r8bs^F-i{quo&#HYDR1jC+y+!2+m!_dQuNt71?N66FuyL9#&xwJ5N9l zRdKk_72V(}dIVZMVyZHR^|U^MC04Qb_fby@Ctlf7Pt&NU=VL-4-x&q+?Eu+cJxFDX2ds{Hs&M?XAM ziDN#&V^2Zh$cRW3e0vE6W%5rSX&HqyLg8M$W^n!}kgwSrGPvh20P^1B2pRVq3D)8U^^n--cjb`CH4tFGb*iER`VhGa|tzhvHmx0bsxQ zqY-Ze@*pnvDwn@qI()^GIG@{!mhde~7LwaH@@-AWx3yHQ22I`1^@FhOPdYd^mSC}g zyXxeq`j|FfbLUOUR#uyVX76*(B6o?e4uodBX=cpFthBg|t@I_m6vJxvH-|h+|0vq&qd;@?9Ckwq44QUl1!U8%FD~D~HqV0A)E< z{mEK`MyJO|ghMra9SpRb{|k3oRaE^`rB(&&5`oD#dsIvUbCqVthle+NYmYkgz!;TC z73_FSkL$E4sKeB^=FiKwKWXl~jG^=LWpQ5K ztL$@EC_g$W=cPX4ygaTGvn&?-mSK?x=HlHU2j;1tf(NF1HGAI?d0uAj4mmH&ern;o z)CIKX<#n+^oS=h#!y@upq_ICLu!mI&sqbo{ht;C0^G^2SQQX_M#DpH0dtySm%Ao># zkzn=#qN@?ggrof0#pp;x`hs^_{S!sO zsKRmmp`3Qhlo{@={P4eD zm)EKFK*H`5o6hr0@UgThU9w*BcvjM4sHF=!KT>4?m-H51O2;r&*wRuc4;`;3-M`(R z%tYr$PYfII2qhye$fgtkD|k`oU2JDtUVM|<-1-A(GcV#R%ZpgK(UaP5PyQiKXS}G^8CS_#Yet{(Tnkq@1htKjh00q9J- zWgYc2JcH6S=CQwQhMC+7Q;oj+49Sg&oQ?V466N$tvWz?#L#%i~@=HGxK^axkp%HW; zZr=Yg3kF;#j5J!#}_# zo_HH5lS$Ch!dnsz-`YjN)&+&|$H!>Z19nJ3r&Mxmu#qA6yew4*;y2<=98~|i(^cqo z_>sqm2Lx}YJ5kSFCll#r^Ex-;>4G1l@JG5-zho7wv)(>hXUx$)^Pvq;! zTYZuFKEl4QjPiYWy~UaDs<);usNUkGD;xhry~Sa+|FYg<*7Xtf7GGIg*F?QVlTr_0 z**of;rzxVw?w2xm&3d-;Ezc@wX4mn86`Z7#M3HYyB*M#uK7-Y1^5&;Z=69g(Kh`N%c|KQu4ohX5_$kHF-?~Ay9)_-us{j(Eake;EKaPHYxALR;K zh(4jFr7OX_FI=a%W3770R=MCU+d;ogv0JD*q33FQVJ^QKkj(mgNf%3U(|8nxh4sJ( zHvhsjyi;ULbD^IXGlrU2x~W0lgx)&m2Bq4b6H^k5#EEcj(DDB(C7b0<+bKHHRETRB z?|QfkS-)+d^zE|xcIgorbO~^|r294{_OhD2{V9Cs+ZBT?iXGL(?!3NbRNHc!rwsvl z={GpeuclbSuaCgbOSLCE-e-X}BVJI?bYlTtHo*HZRAG<@7tLU6%5m#Hp6J^ZCvaKM znQB?Nf=dOvg5zS~xKx0+HU*IBLCA;z(@aDml|mik5wRX2*zD(xKK@6&T*i9!*JE~( z8c(e413l0DWj(tUgNlyS*e$uo@NRbQ9~fH@UfQy`1XM?+AvbP&3$|{6hAB&qz&SlX zB^U3~%uiWB0TvN~r_DiJK@jH%h%tyCob0*n2*37-U--SC=AaEHXx9j6dXF7|yy(3J z{(T7x4isuYEpGu-!&C(I!@uifNB&uu0G@c@p(iQRMeaJn?*qgyJkv#UKvxscqJNX5 zk-LL{?2J~Vv^gO65D@#nd4PwB)$OTQucvN&lgsH-xSVbQIo%qP9zQZawHg{RgHa|8 z%2XZ}jML4!ZfTpm95VXqb`Xn(Qh%a|655^9J`#aIU@<{$vw_4HMLYtrXi`(+|*-^d^%U4&*dFt#N${};LTiTr=>K`9)`aYtx zoyPnzIG_G^W)R5GG5UWpd~=gcvtzNu6rhtvYPdiCTbML)j=QkH z*Js69A98<9RW0(RZ!O8pS&0-S-TVI9prttJ`zPUBshl~c*V6Ioo4yHi(Cxy1_UUZv z&4fSh@SE6=>rtkp>P1`AlPN)6EFkUPq-3Jn$rjuxi!2;YDNEL7vpmv5)(qEOxGVHo zLwWFOFa@5>Q{WvzP`$LE5?cVJCs04Ht^?&D-gQ6|K{GoJlnZ+^0# zsy$FvJj)VfEBDp7a;{rVQWwsna*;1%#hIWzocIxze0--hs_d0X7Vv|Lkra1~Go_T> zhVq?lJ6$hApv>&8o!sLn3Mp)Soi2w@35&PVlp>W5Y~sca5In7g^HHdz)Nr34z+3Tl z{<+2l3hhp%vnn9ZV)PY9z2)yqj5s%DdR#% z#YZ!6Vcv*%M&_J%ROD@>*e_$jKZ)nul}wsSscLeWQ_8K(7%Us}`JJ6!nAac;O#{fr z7&LaCZnke1i7-)%+4LMdQJTeyX7v%xRz_=97t!nyZL>JhtTCe52yHW5@f6<{+U6>4 z8{FD_FqvU+Vzg}%qr>@OrKXJ`I-CtF`2~EWUBTy=vk(Z0_wUo4lA{{$*q7DD!uk6J zKYv@ihX2zY;u?P0t9Vz6vgF>IPthtB8B%iIyly)0WS1YSxQ(U5WSbQWI;5NOa=Pg} zJ+bCupq+E@L=#?Hg0s-tEDuWKM) zA|NJeAYP?HYykCxig9MGqIyTq%W{T)qbjmNBJB2>hCqd@nW)LDg~Fu z-)?0&*F|E~S%XpGHja@|gV8gK6pS9&7CFW(eIg-#_F)j>jRImX4aA`;#AJ9Y^6^>l zjRjV+1Gei1?eO~j0}Yxx*&W}?G8T$T=JHv?T}lWezHD5HjnE7|gyR28qM4!R@u(8p zB$970B)_SsSCIMlKbap@e80At@0+dHpyXFw@!x%)cCq+}eV-Yv{|Ng5kM|mr#t+4t`6<;x ztb*QquM0YNS8WkpzmQVPCG|>OSVVN>_*~M^G&RD{%z9rFF~IWoRo5-{GH^>X0~GSc zIBrx*?cOZ(fm z-6QO8m%kX*{-!-2oCZNOkt@*Yy9`d8yA2>HIT`$a^+%Zao7KJ$ReDOmjN?|JsrQc| z1MZ!sVBJuPk%NCyIh1#!Lx~ko=w1RkM3>VzCSevN59a<3ou8n6Ol2xF<;1Ne_j(6H zpLb}Z4u`?f?SxIWld}l3@!~~+iEkl8!HXgb|4)uV{MXcP8~)m2HzezvGDzv?V&?xL z@UcV_M=uZ`E6&k7{}A{{ZGg6BydevccdHEPR)brznKFELn?PfN<{3B*MSyfsW}2(W zYWZK`8o3_Lv|i4I(ybNYIou#@rmdV(2O=TRkDc#^e1=tEllgxp8pMAIo#7GaY~|>v zm^gg{b=nJK+IqDI9mVBNsUz(XdMq5y7NF`NB|7?T%Rsh~x;m-iFIN5?YH(Pb-MoV{ zB!k_O(GA5nJtobP%I)ynbHarc>7o5l_{?bvkP-%(Dz^2Uauy9W1zJ0cI#SgNt4UM3 z_Ny>@(R!h^qSgt4C1Wc-;Fc}=(_Ke{_MN4X!I$1PFDYqFWspSdPOs^Z+r*1lCI zpQLTdltw<>DU_^^24`{lhnk&(Ydu#A}Rv)$AK-7J2WgXvWDKFqoQ1)QAV1LD{@cdq|G1Y_Bb(F}R2Z3QX zi~B|V5;Mzw_Kf^h)cL+JdgcB5e^0M@swpLw)2pxvdim<3(W@8ci|eSdg|%R&vhPXr zu@2GaW*hK7mk(x&O?rX`HDM?9+FcTs45y3lI|#LUrv#ee=rl^|&ato&774J)APN>8 zcT4s`6i`q6Bpd~0FKMR#TG4+$P8v=Bhx_e8;`m3J*>&x7Ix*tyY|{!c;vG$O7gmoM zM2Umg5ufrCZ08$wa*#&{x5T5D0FQQ2d9VVov>y7yuzmWDRgU`7Z+*wBHH?R zCV#5xv{zJr#9UO5oD1V%XK=-z*}zx4Q?ugBo~a`tDN`_U8fRhv&W3%hGBIi6LB>ty zj9c)uU|b+ds?)e}D99MO}aSn(l@AkJb~GE_140T2S{-w!L>cJ>_=aQ zgyI>jlvL;7!=5SJ(!cR3SxvX=7uw{8bLzFWyFTKV>87w1p$#)JnCGcr!yB=oZ?geF zdtc){!76v~v<(T1QHRE74&F!{{?+{$SET|x&@8-B+0;QbXw^yjJLt#IdLHOr~LY<6dB zWXrppIJvWN{Xq-zL4y*(c2ldn%=q#(L)gpr`Ab7+FAtpy;-VSMlI3bdc!<1-j-%d5 zr~~_WJ&>o#D(7E@|1ox0f)9-*$wGfEqyLzEPX5lx-%aH2@ITDj0hQXPx%*-n{b%r( z9)qJ_DLZp*O}J+$h);4@z43piOgYCZfF#l`Gh?}00VDzG`V)%mQjANo!tQ3R&dV|B zjRl7=+C}2!OZpzNJcldaa|7meS|Hplh1fkAeYygeV)!fn5QyT1ORy>Y%%2rUu}Y{a zv-kb5nDY;LteDq3SFdd76u`5hG>#vCax39&;one!8owXkvi|Gp<*IplW!C}bqWE+* zS<|?8>y(s0l97F|2St-?kTQB^4F18GUqjo~*h}fVf$eb6$u7xhaQEJxQFbm?WV}Z4 zruS}VSzWAa@RxHi>*!zyoSX%FJU6)fwpzD8t|CL;Hrn5IyG_#B2I{@v+u$g(VV1zJ zGvv=Qd{u@FA2YZH@0tC>T77=0cYw>EeyL`B%M7HBssnuZA==^i2*yehTXDDw^aib8hF7DHIxwWB-f8GjuwUE%U?S}PndX0fO5 zVtcW2sARyS7KTe>>(?14kA5p7Oj}h?Re$`VMDUdMC>F-0IHid&8`-8nTiD~PLA7SD zVQxJ<%U@8<1M>Jpln?$8 z&$T&;?4kQ*Oc*`k5AsfJXFK1;1Bo{ibJV>d$b@gd%LB!z+gIMjz_O}Sjok4RB*wP0 zT4GS!t2z-eI2Ii4=6X2@Ydpa6ZNei~XUxAAUT@_7NzH&xy%)f3v=|3PSng31%C3n{aDLMU} z`Y@`2Ko!nH)g3e>>h}(joAEt?9+}_a(?N|pVTY0*cQic5J;mJAj9VUvZdMT8oZ3hV zw)yrNStF0(E}6%7$vnPG4waN$G8(OZRldQETzrx3f~}^Uo}L#UJmSOWz0Nq zXq>U&AUrFiM$p82Exg_leC@r2)I z_z%u%65Yz!z?U5F`K`B!%GrX-?Tfgyv^J5XC8S(fMdwic!JIc2Me`HhT=l$hR_Dz% z>Amx%1lUm9O2guCJB?eb55)8>EgWXR1kp}ukW;z~w8w=elr3#}3k;}iaCQ$0-$O|F z?goHjIG~|gK!MM3Ftcz^+@N}cg&~Q3FcFx6?uR^I7pjnI&-Vk!16=fj(_(Bg9u}DT zTWp{(d$wBKL^FDqJN-7Em=AcnoJ}Z1Q4ejH6g}XZnyjPvrgkC??{+qzP-ID0?M8Ca zz#%B6YWs)Y&DeWq01pCtx|yf5^;SDCO9%4IGhuqObc0jg<&@giauF3J9JY4}fG?1} zKRTt6gnu8v-{dU&DYjYUdm!@9FCpYj!V0U!@Y!4Rx^R0(IKF|AfKswkE_cS3UAOf z9HM_arEVxeVNML5rv83VRK7w^NbIhbdAyJw&N|Gcfu0USNe@ zPHBS4+52nYv1%227#Csh?0vxLPv_Y8AyRK=)de_!s{#M}kk#%p>7uIja?;_O)p=9r z%ZfYPqOwv&vBN|=$DiZseHsZF8C<>J@43o17&ZENpwV}i3|!Mk^*(iAoB1hRy-$yu ze+i(OiYL{;XX|B=JQQVB>s_GYwab4%uVc%6b>RlHaD3Kk@ww}Ng3lX&kAlzX`vD($ zaa4R1d;EM5s(D<9Rajg6&lPeHstM`8d<)gQf%$9Wy>!bka7#RDC;CUvKxTDG^2(eB$hoRLf+9^FwM=))uDXo2wA>52&{V~5vz(S!Ok`qQ~ zBmKmC7wIMm(1AYiB8EBe-|A;oY+@ z5_Q73-2;b)R*!J^MZ|j0#7fb#xwCZQsD+TG=c2Xu3XO&Yt2Y@?iH0dzQ*;=4mkz+lz^uFx$O|Qn_KL(TJsDvMtz-HLl zyyb+|D>1Hn~d{Xg9gA__r*lf5v{1 zV~qRqZ0qy#d+NA_bx45NGG3mg7j;b)5k8fc{jRE@a4CJw(h_LWK#=sV$7$;wF0v6+ z&q$Kn64@glng;f$zUHPL}0aoTdh9I|U@?Qy~tWsX%yXAG-@)}=R z(fdxPN&F)V)d)q48iMNL)w^1;uLsx5_F~@wB{E?rv)ztzu~e!RpN}!k2=}taV?>ah zY{jdJ@(ydMHkT}WR&?J{2#b+|66~;BtT?CrjTME&TZMB5bh6CoC@d*Lw;k|QW|DBFkR9YA|Q1iJi@%q z&Z2(gF!%>K43_?E!T-fN2M#yzni?)CG2CG=^A*)$FcUG_r*RmV6L8Y9!yE>R%WLs3 zby}B!6K84ZeAQ*JMYs%h370{qkDG8AXwn?BQS(~xcSWJcCErHSW9zrk=+Te=U-R^s z^m5bm$i#cSP10kwUZ>O0gSd9Vye8=pyWs-pam(Wo^azb7uoY80LFgh#PNFn_yYdft zF14+Xr)@TA)!$%mTW}MGaqnU`;-%gMwu*;;Xk!L~@s6`&xU(SC1RrYOr$IjVcoh5o z0XBxd2Q3gov#+Dj>^4C$9X4lFG_*=aPgF8ok1I+>Fov9?ASXF*h)}1r_Y){$Ub6aNga2`ZvLjnXKJ$<$EIwb7 zEe?n`SU=y?Td%hn7?wlyjf|5~gb4M(G=)!G6nxU6;nVv<@In6hn~vjv%4QIcruxr+ zBeMUs3#0V^X8ncG0|ey*pc3R7SQ|7irN^oL`+j%INsZUhwFtbQHU)Q!iFnY@5L*Q- zb2;f7XaNeu<#1F@giT?Rv+PH+vrV~k{SJkYH9tDbj>du*7!sjKOIzF-IMA=ONWayF z)t7YlZnbsR=?iUL1`ajM@8X&OR6wi0ieWY#*?-#50^ZE;1aOI?-EGVCI@|h~1X}hD z%k;u(_0w{0r1U4{E$7ditWSIT{%gGA@lzZ0K#Bcjrf`x3^BN#kZa2C7_nREjbQt_m z`{19YQz!r#(@)!_EpXafkJQ8QmIT{sjW^CE%`xQV;veVnk6eR&@NbVMLBo;$wy!&S zf8K9TMpjq<8C!l?Yo~uqoU^RT?CSl6mks{G=o>@f zgPmWZl2md=Y4Y9i0LypfUm=U#UWtVhApFa77t@Q51vUBJ^JnI@ZGK zeJaD>_9Ymn7+~)w>g1|J#Ax3Fu)c0-3jsqP2|-Jj;w<>10$8E!sF?${73ti5D?r}i z-8cA$NBg(|Cdb((=`&(0YARyChi@fnd+mz+LHMk*cRoz~)djLK|82Z=g$%e$VZfVO zB{-3KFfS*nmIqm-K=xb)!iNiIcB{&OtwI^lHn{OoFQ_UTZ69&&+ZKC1*aY6r{ymTt zS9 z=}QN&VGo51Ym06nGL{_&{C3V}cwOZh8?d1R*>F2M`xDKh133|+1C-euX&72`GqB== zf)!!wQ(mPT>;p~SID6sP&dQ@ZR93VP>?}pFVy39v!z=bgvf}@MAN&0Dr}(jE(FOD4 z4Hv_YH?+);H~cw%?Dv0aAN&1Te!REx{}+Db^|DMEMW7}WJ!)2T_jL~k zb$8H7T@;4fk&J726O>C3_LTlQ{T6%5jXG=b?9R60oX*xkHO3X2-TsmLS^774xz^FS zFc}_ty7_WVdT%E@z!CFV24AjD=Z)QhS0Pgd@SG1f@|+K5?S1&v3$VZ}x)LogQy;1e zS_FQZRVPQD4pta?lktvxh#>F}viWjMdTa3<5Fl3Is>sVhq%l6lh6&v5#S@ZhDr_}r zuBoFjZ@Aq*TkpuI5-yUg4 zhVkv4&e*byno}9*cae_HJs>VbZ?{XIG3yT?|IEX~aWm(DqSWHyoeR@D2ij5MhkgCF zvG4X!wX4q7!oGAX$Ttt@+!4Rx93sWm?7w82xpgxkmeKS<#WbPXZ88Rzdxm2;%n;NI zr73~tE5LlX z1^#Q1hFgo$t?*5JK7JDmzq;qEfKu}nK%2vEJ4C_voD(hW?LNOvuLJDRW?N)*`X`v+ znT0UN3UE#Xpv}@a%0-J%x!XloGEkZGjfRt>6#m4U1b`->=#QW2!*3Je*JApGZR3~m zpJsHSpxu+qEJG{rmU>QNj=@=@={$P$y7ie!Z#hfxOj4c{r+A=grufbZ$&li@}r(lM1 zDR&~j!bS$?ESTNNX|`f(XWG^WedfKwHZap&nD$$I6EA9jW$yk&Zw ztma3#Lv!Ci$#=|iJzTAz>8KSOW>MCDo2YowI!_d~bQZby`=*!bwmK@feCGHD#52cU zA}aanO4<1=o{7E`am&Up^K#EnE%viii@j2lSchGJ>=l10%3epNDU3lWcV|rFm+Gf* z19U{bUDc~kHG!bdA_uHjL!S4TuhM# zk%ToqAwy$1Y0V`-+;&mZDH%j@>#(8^=5YM0$z~SOvwz`$ZSCeWU3p9shSvnlT5X?8#2}3?h#gUzT0%V zhwnCPg1e1!QGm57@M`xUrhBzYcJ9(<|CD7~b^Zz>PYT^`(0(pY_K zWlMpvHKx&yvh@l|O>Sl{%?{sCLidve_gu(+Qa(?!pWKnH-A~?{7rLMPH9KrSxlX6k ziT&h;!ifFkk15gi6LVNT*)*O{wu0xA{qk-l?y{8f$yO^Uk4v#Q`u&2LB>KDjbIrwi z+n_|s_Ezd?LpNjAuEcC_85raJ>vNdx4WDKJ8(t}+%UC{=sM8`$;O&<5**i#|9M)*YYOEz?r6F#XuHl<{5*r7hGb zsZNm~s9UtPykr!HhJJAu^u!d)dzY(*SR&vaK6@m9w3@t@ISTR@0 zd{@G*d5AKBmn!idt?Ky=eBR!j$7ZOFr?7@uO5+t2Y6iqQP)B!vHVd)ff!RUYz4kq{ z@jBth5BOtjAn_asaDlO40G8TCPB0c+3qPCS2IJyH zjB<*$yZ?dN6Oz8{3{sLZ@zYmCOgv2FsySjJ{Wy0lZKgW$Q*a_p=d=^g8D*yO3G7z7 zVEYnel*-zWiGL(pvuOS#b>chI`9JBuny1oE2;`MX{}so~BOsGGkpBfAUrPYnP6|%^ z%?;|r-_X#^#J6u~V&czWE~%v59RV=kQHJszWpGnFN>jKkMG!3e4za0-lGK%~{j>G5 z!cr%__56m86?aI_&yBLZxH4~kN|w%Rga3>NH2`|TZv7Y9ZCC2{-0hg;@fTzMKs|;x z%J#zCN}ivTv0N_~1}ZZsEoljB`w(rPx#uaZWFw}PWSUv6ZlTB5I#B&z=n;C!6MMM3 zkR@S1Zs`k3<1J$4U!KLgY9@nab6pLht}eYDWmiXuvc^84n=$)c{sJDapJm3Uuk)2u zD$-uexrwLpF|!wiFg}Gnou|oo{DgR1!sf%TDsNnH%OB}crU?P>`0;-*P1z3WS2)@1AFGEyQ`vtWB{Fa2HLCeo z28qUIRt+Mkn+Kv;3C=RQ3A3M`;o-|am|G)<9zomLup6l%acv%RK3cDcTqW$mj_0+c zz4S&|pf+@&$kfi9Ih?e#DfSkRE7@fW>y@yzE(+fN+ z|@2AWuE6Ve|aQ6*hnTah1&Ao)E9en?;eUOg5phhO|KA0KK?Tmy|?WVEdWMgU?T) z9Wm*^i^_vjokv^ywQypI09W zq0g^lnxoH6=Q(|j_ftlHrW2>ngUW+fPZE7TdO>;cbtf%-zOC2NXWwN+pOVfBeIA>t z(#Q9EYO&rD@jSo{i2qR}XrAknDSi}izSW>3$4hcsGx>mtg@j#)W| z6bH5R@u@Dqdn;^DTiNbED*aYKyqa5t)LTS#Q8VW;Uk?~gEYqsY*B0?$pt%`!Q~dy8fAm8ioQ zHOO}*!L8|9^dBZ5V>~ySP;Uzg2XqKDFc$Q~xP%Bg04U?)j&c*q#yLzin=}nUA~DmE zn71@T%%+gKoREs+NF5QX#xC~H;(7}GJyZtF(6g|YICtjX50opsOFedG-me@xJioDP z6j`W{k41jtNPlLiy=rF4fnf5}9-|e;@1>*)J_n5dtfSvCd(q646xbSU<`5%QnShk6?%DyI9r6v|x<$$YBuKEOpiQ>dUhnzunWp^UmeXpp3 zv=|3fIBS(CWtVXu%DzuT`6Bv0 zLT$1&eS2da#lI54P{MVBgbS2yK-0#o^SCV>(a`odt>vc4S`vd~T|BamOU3}K2Ecqr zz`jRdTQ$ITwE%1^0UN-9#UZeI0P_g}`xJq#)&P6E1z-sTjE$({lDHjUT#DNFtRAR+ zCu$%WTY&V5p6Wl15T*qWIbepF`Rt_%jB|`E+LHD13tQO4uS}-XI{18Z^e7hehlr`r65wE;J{cqjfiY!#ZZd*vQ&`g|* z+zp)W>%2Dj_XCuMO2P`L@bU*ux*z63KWy0WI<@0>;}zpm8v9`}2t+T(2L+-MHV=9y zkcfR8yuwX9k2?q5g{TZ{q6-=~9-D&uts8qVviFGvLlEF6--9A5tD@lb{~7 z_biAg4^&ERdiPiB@p!JG#ZJ>irCXLwsh4dVAEFa;mciSaMr8X?kDKjz+u1D!PlnC+ z8*YwQ(t^4Q7nDguujCdiXE&bL!GcO22Gjy@aRd&x$8QPTUIbUF0axAvxFZb+ZkvOH zb@BxQwZMV$KQyCRPX(Z!8Hb~(pwXf_b}i(+UP+_53P*D>+*4bJqdAz4nlmq-mC3%Ftfmo~L5O^ONEQy78SE|* z&QL=3$aj>cVgjC0TRPc*G5nYV7+Fr-7~UVxQJqelc`tHirUuoCEuiWqRIg8`ZQ(8a z3Vji8p%8|kvNfP`S^yP8pne(34)&Qw(0Z0x3 zxm^HRXDn!qCNbDHjRm@TRG`AQPV&|qu5030+=3-NlCD6Yv;z;J9XLt}tLAX}r5178 zVpH~C&TF{$-jiET(#Z4ghn}N@CWW1&*Gy8*Q9otBfTJ|Q#*b3QkJ9B)kJ2XfsZvaU z$q&;VHbtMZfIj7tesb}XG&^{b4hlO-H{_@%>G8QuC{*|M(HwzY6Qe6skL0Kd)$4Pc zP^fxn0qsoCC{$zL)hbkucg4v%!C^V?(pKCzY`Vj z@S0^UYEy5VMb?pq)I~^RSI<*MTlKGau4lm*g`$rh&akz!v^hQMB@MSLnRA5`X50W@K+Qhjv4cvq^INIyHe;>B`kG9J(k0UtuuF}C&6BrTOH^iPO1H@4ZO4# zdaJ3b-z`+t&vJ2u*?kHzc<<&qnQM5pLc`OsxA~!#TkC0ME3Sc#mj^mR$2z{io*GX* zV}m3-t#Z3yaGA!d?>4m1^91U7AoOf4COFl`{3XDQ*8H=^`~`R!O2cb>{qJYbUsEru ze-)HEjiYzdz7R8>FaMSF*Dsd}H=R3~6^@`CJhzs(UdLvP=Z81OG1lVFQNwo!7{(A9 z#=wgk#`2RmjM;;ES;PSZ1E-J<6ZV*Y0C?DbHq9@tqooC#@Fhd+ti14_%X`s_!e2dLOy#TPiBq9L{4-AkO^- z&I61ELuHf_a&I&iSjfy8g^I?-U7IqqHj!u9FhC#-`qvu)CGr`xL1JC`T<8aj#&P*}m6FT{?$442`=OjtPv2Ps6kNuVW*tbSG_M_>~ znOuKf%a8nn0~P(bM5hyJM}nt5#rs7$^*_&6PyKU`G;!)@U!{%pYlRxhpy3+*d9;D$ zaxnhUsq9@2hGOqRz+9sR)1{SAlkv>I>tA?$hy;x(cFUAxPj`_UeHR-FFF#J8vwupm z?E_K@Pvg$pl}udIQf4SKlF5F1RQQg&P-XOKTDj~?c;~ z6A9c>W5F=^C859;gqFvl85h42*F?B=k~@%_0_@b>G}k!R=D>meY)p)=3-3hIG>Hc74XEiq9DBxsXgpBi%Py6K%#Q z@_v(57oGTiljmpYmf|P3MBHzp3_5}RCfCl=_nVa85^=vt%%CXyP133&?l-ww5&KOJ z&J_Di1}ys@>^IqeL4^G#58oQL-(=9NNc&B$R3hv*x%nGuze(w=u>B@~+xFk?HyN`Z z+WvVL{15k=wEk%LFZY|g0UXqY!$S6(49}zeCbz#BwBMxnnBe^;hp!CYZ?bpjzrWw4 znP14s1pl>Rn&6vhzX@Myv__vFeSW%-{~1wM8m}B6iS9Tf&5w=)LY;RhCUJIhzGjY19!@bG+2NWmSO(Qn`3 z`0rdH5Rb*{0`XvcB!S@bO!3hUjkVyRu|?nE7&nvFD$>+>pGgDU3iXZ*eSjNxi8jD> zB-N&ex^pTDhrsehW^z8QUx1VjvEgvnOi9USO0ocy zq`uBzrwv{IskH9e3%RZt!iT(LXh+v;IOJIiL!N&}Y9B#n(}(b_0e|XSr~H)X4z#aX zo)g&rJ}d@5OzO|6#!3ASl$%SKhx)8)Hte0q8~FN70c=Utyf3Iw-^e9v)US3h^AZ<) zYWRZB2KC?-7=x)~hXqTud`=^u_q`pg^^zSnAnQYypLPcV8Jp>xO`#K0n+fx5dm!>0 z^=0B_hB*mhCn=EAfMG_jeZ&xS2x^_Dcf%F<8S{@6#M$17f#WMCI;aBTef+f@F7k8h$%4NI|fZLr>XYw z*c+TB2AKC<5u%u90ik8HrX_iz)6^ReYO1nPz2;&X4%G0?2p98lMkDpEyVTlCr~+!# z`xL?&)j16F&EVq#=QF`8$^OejlCke{eMgoVjHAtG(V(D+=94Ya=aXqf@GhJhrxC%z zvo*u$Qt1NziGgr?X#Ndo$b&t!c`_REVm$CH%iptVnprYpZjOO{S0h69U1bpy*mv~+ zG12#3aVCG6BqoE%?%xLn!uboet*`DK>gn)NJg?ngDy=iXEe&5XY@EdQ0rM9jp$!oVX9horb@q>-x9EDt>rT{XAXh-&?JihEzl0 zwRlfLwmWOE)ZEWKffEGq*3nKi|IDsHiwTbteE~T&!(L#>5^uAc)uU5*b_*^*%0BhL z6p)en?glO+JE8NfztUpRWaPbcT}Cbi8F|6N2aY5ojc7=V5hH*94xj2^67q@|Gv0ls zCLv?AyEd|aFPYhb7gp?0@5#YdGmaH}JM&{wTvOSv?X2)m;)UM}3O@k~|7TW?zvD2- z(}zlxjViKFRo6kOda_P^uLn%O^`lEpE>iPG=(g|F7Jk%f0;84ehzDEN!ED*$d6|a7 z(Z%z!4274wvo4Z~|I!mEe$$sw{C^DYq6eUq;(5dHx{C|&x{FgKZi7#NTkRJ(|2bH@ zLuCvUd-7m;V7aA+CBDfvzrH-{Th_mgF5O=E4|i6Bl%PhQplBko zb`OX|#p#eHNKl=_owXrr#Q6RNeKO|PwlxjhUh@6XxLqw%GSVlR3lcIen`8!3Y+!rK zCiT-C@v%Y>p~X0 z8m|o9b$?5S`;#m-R*G%^s@69c-triO<~=|3+KgGh?j0}=@RTo3kG21G7}sp&3dpVz zN0yIM0WcS*t{Bt>SDU%Ayz@u*FVCu*KQ6I6`@{L8Pbtr;XX&wIvL9*e_8`CflA3#s z`tC4V>5Ah;|Df4ceorDx#H3H3I&)_ERsH8@e^`E1;{2@o@-e5-BAzB( zIFSBnsKH>HU-%(ZJ7g`ZhUM)fCRJWrdEtk)(ze3Ov6wHFLQixwsqKtdS#KC z%o4B@Zt)s1FzB+T_f8{4Q%s7+YIomblOOI2)i)&viuB9=E~b!X1pavN&l)41~5#O_r8=_x^Kr6&yBYj3RB@tj`WZ2{!J-q z2*6c2II+X>y>$TP+Zv-O*xNzD;v+oDP}nrz(zsK;?~%X1qsN8)r2YeU8lE7Qc#!fu-5X;7+jAl!_$80Jc1#_~lLU{0|LD`no zh))KTvu}9Cd?52Pz*P1eY*U#(ug2kd(2`a9YeBcn`M<%o*u=+=&CNe0*Pr=){7?ChsVHcRCf1uW_2bAt*emr28Ak%($Ax8a=07N%a>@o z@9TY#?{F)b*JxHuqiHiO`|`tAHuIjPI?}Tm3VW#6o@amy>T_9=_Fo)>Nvis)J>YQ9 zR2^Cv2Zl+X*?8Z1il%<6m z4S;8zzJiyp+zt5qA6PM^x8nnui6akFHLPi(bTwkS(kWdVq;#DfN#*wmB)+!`^~8E` z)MrlZVi~R1+UTjL2DQ;NYNHS84{S1fed<;+cEDM zAobHfQy$p@hxF&e#qZsd|6zK&!S0U#LNTpqFg^OL0XIk$g0P)-2;}_}wf;*y@OxDU ze%dZ>Q`a+!=V^T1%H0r1{Cpeh96h6BGTcpBW#0S895ar)yOnH>DcYNn-t^EJjB8;c z-j}J~j4T5&oaLk2pa)9)tc#K`n*GXxnaVE@U$oGB%_!+5Goa?=d| z-Lpm^_leRQR>A4Gzdxh{3JuE0-2)zIcR4LkcA+VOVo4$=hnG^$u}dkmfWqGQ(Z(ZR zo6gIJH-4DZ`KYwi;*>6UmCVLESnHprzW4~#gk&ea;g+tyB<42J^I`Co*npBW?Ip3( z(v5RZ(O(klt+-Ccr-7b?$TmEcY=?jG%4Js?O{MU@ufyFPSKl3QLF;U|_woz17~lUX z67T=uyV1iH_tjQ-@NXc!SUF02v64Uer+e&4kFno&a#w)Amj%m_%uryJqqbfxJqJX? zh>#b7GE6D=_~}`obNlJf0!1i4>g2k3`Bh{2H9`5=&J8KQTqwU>EWb4Uu}F6>D!&JV z%kNZHekbdXMfOl!r`C@#8d`D`e3gRz#X;c}+$sughhA{)_(n9|kDNoLr%u2}#<%j_ zU{nfD^*1M!!byyCj47ocIbTwuW+pn0rcB{%|qs{jvYFBrw<^3Qnqmvx)psIVES@FbYi_gc7=?j`>97{+1ALzP!|55UDj2#{=g{zod@tsNl z?kh$$H&@ndA@@Nm+ABs3v$KSZVun(Kl+^5#!DUHwUu(ffZsB2DaNYM{8kM*|rNrTr zudB_$iF2O>$#b!OaZJ48f`@;`u(HcAwXc3oDX)nM&G}ya7sOTdf}+EoO#fd{4W3yFI;@nJ5iP z`X{Ex8?i6yRBFGE*S$Z|NrQX!scr{Zx%k1Nh0DfYcUcv#`cnb`I(h_A>`fa@Z4{9FnMHEKR|I^Z-k3OU~C`H%8-4)&DltT zYqR01$!vFKGNZGsy1#I^X0RsVnvkqyr~3=@TFz5krzx%*jMz=Z@?Ofw88hR=jDD4p zTC+X9q3~0@y#%kD@h!pRop9h?a$xoBo)EYIc094lgv{hZ%JLlPe-vDvJ@lYsXq(+N z*zUT?IL@7Uh2QQv3EU1l>o~@_rd;6%&|xpxhUJiJ_gv|>$8A&6YYVpnA%`Z8KY$n4 znTmC|;X)Od72Bzvp8%DXiBE0ii|NhDTUGB>Y_y_|J=7XFzP#l|leZ6qyw#gZ&Bv3s zdLeJ?ldC0pyBOpx+uh0JjhV?Ej`X9Z#~W~L@(IYB-QDhBl2IKba)aXz;_45RrwzKu z)dY#$;oe=c7u^FBxkDgwNaT#U$Xyggm$1&Nze|YP_Y3J=!jv}ZUTva#J=o1);13UO zh>Peql0XSzT3x2PkVTe?rX;v1ip3*tsVZUI(8u4 zi$fQ#huv4tIjhKvD)!Qh2Ns8w|FO5nI^%?mWJ8dT3d<@fc@OWZP^oPtTm*w9?dV<=Gf% zM!n4vP)r|;!FON_((wt{K3Y=Pk1;LhiZTi+7I@#lb(QfLrDF|AZ&3N5je4&!w5pWw zs@i>4a8+G)l@SJ0L5X42)|>rkVgFOuf9rAU%eUj_koPB;DB&KrpzCGm{^l+|hVonw z&m7;GHT+kHYpBC@yD%D#wR5EKppaN~?S=($$F){d<#Elm4&i%6gEH$?$vHzAV zPoX)(y-U591$DUcFokS@`HDnQFatC;k@Bet;0Jl%@AE z9rTg*lTMERNO7|fG3y~ura@K)4zlR=5T^3($crhAcew7zb@yU^=9c(k3T!2vF{ZK= z)T|*H&njTvv!BiQ6ugTOT-h)B0~t(~uZ_obNqDLQ?i*oNNy}^=?B&p4FSB6lq+l;= z!D9NbV1MVq-U$u%4hyzf3igf`?15gaJTAK<&s6pkJ+mHwU`cX5d(mDz{_uM}zcHNp ztdKo&vi@PMf*HT8j#F6$rU5dPxQ;dg*E6)2-Z@blw;~a=?N$7hSDY1iGrlVjsyrf% zU+!W7FM|i^Z!-SdF|uA-ylXb%)B?g4hUk1h&;u978z*_QXS z4q#saGZr5-!aH|7QDd}3oy4Nk5;aCk6cV8}w=x5MAGA>BbCOvZ`k7MlgI_#F;~vNN zBz~oMM$-!2Xf!N#sCOH>w1t2?NJIpZst3VE& z`XhK#wgwU%?~nT|i&)qRND-v*;Wf_AZ#_&&luwD|}-r$vP^~U?5&5cVshO~w> z5qo-L!Oc+~?fSpaaM9+o_*NvC6e`>9FlE)koaoR_CB5tJ?)H)n<2?iQL4?UZ)N4=o znjSrs1<8){w(P;#A?@eE%I@DB?B~b-WDMExk$QYSM(wFS*xDL!xcx0AD5I0q*+)AA zEx%_CZ-c3$Y)^cfg6~=NuT?y~|4_%bVR;(CNK9|P58izIL%j@%u!lhz`i1%)Gdk?< z`W85)+o_(8zl}EHHNO4*j7f*u18ME}U`B)L{)<>b^cO1bYt2gS4{^tQ#`_#tCGF4B zsl+^Jrs*{(ScmH#quya<+{k3e_!g|v_iSkmpyhH`445z>?|c3m#XXDux@*PVPZam< zQgLHh`y-aM>91CpUux+?WoaJE%)Ss))KjBL& z>Ni@csPXCf{wfyrQl$N^xIc%Yw*2|;7WEJ)>Q@eHMGXrzdMS%FhCt%dH=(4fe7vNk z@gufhPr|pS#28d>S7+#RPm=t@l#E5*v{G^)*Y57LgEoT$(A?1SX1lL8W|w_ha83s6 zKU#Wulo)@8>GiS3g6?JB!arI}c9@dL^4f7uB8wT5Q@waw#Sec3@cJHjqCWjvOToEH z$yuxuo(5C<%!G}lsgqGgdx^zh#~J^U(Mjf(o{DFjSuMjmw@Y@i@|&un7RYedp%%!9 zs}ov)6MF+u(gJiRN2B_QAGW5sCm9vk7BWmqz|AHXIM(EG@4t? zxY3YVj|+Z*I-J^M_dHpS%f{JWy3XCNF8c|%Gd6#d)0Ry9!qeA_7G$}RncV`8pA5A+>uG+JCl^DJyI zkp5M{IVI`ZEXzQ5-;yr)xF6Uia({}UAd%Pb#hbwCZOZqxKP=cvf z=08Qj%bBI2l1P1TepfTem}laPkbEx+xI23@giaKmdm@cGbWir`I~pOl`EY@T>+uvC>Zse;|R*>2TA z`|aSmYZNK7TG0YYV=BOlmy286)~t*7xJ}joq!fk2*Y~2jQa# zFv1^?9E|RaVZ%QKyZVv)Q{dUb!Z>$EN|x#E{ps~M(UoZ$|GnFvzRh%1JM=MW&H)9d zOWP`X^KBJC{|$Ck^g@CGz7N{dzb$k*-0#zZ$ZNE{cu|vqPLo*GS3xtDe1gr@l5RDX zogQy6Y%@SI?4C)MZ1;Fuw)@I7d!RvaP4s8S)iSA8;L%ghb+PuLpW2y5h6T39?6bGv zG_pIsajZMu3(s9aYxLLycGq|ttDeGm`)}nmyJfCI3R=dvl8Piw%D1sr@pHHGp{rDZ!Z7PZamnX8X`RdO{(U z*=N^9PpGNvc34bgiSkG(c zQwmdoM8wv;Evq^fRTSumH4fLD4O*v&72rrNf?(%CjQP+9vUb%#YGE4*_BLu*MWSI< z+hL++){lVz7d&^GCU{nyzw~{>XQeH)h3wVm$*gCe*A9XmH6ywLu(7*rCFulAZZ77* zd^L*%lbE7{Lg5H=(uc_Jgl zn2{wvkcy}x6`}j?N#`_3MZg^T{^zKNvB9!X*&tF94WuOWP{AD?ua%4FcO&~fneVos zE)waZ^|Ynw0n4zpxD}&se2i9mjhW@JS#u)Z(66X(`5@h<53-uE!76dJY%G~xTlja) zG#EzQA=Wd)BNVm<2DiH>vN7L8bHPQDi2)CeGe$l9G2@K<`SDCP@**q4UXsPEjDB!( zNdav?1TW@bp6s3{NcFr1naFm3Ok$j?4*!l@8<&cd4dZ-6lh>bbErIfAIf?UfFay$( z;kq~eKQ382T*ZWXTdy%qZ$DC36m(cZpEC;#d33pMoZ|N{>^m@I4W|Z%JdYUIt=aAj z7S%^~_iisWVxm=`oN834W8mKhUgD(Gc;o4F;;en(t`V>pXu`()q8{?23U5wp9mX9@Zf zPrCYOGafTnSdS17Q(^&kR($fTwkAwx)#BQf=#oZA|ybefZ0cKM%&n(ZEzs=%MT;1MbPRkke8tw4y8J??S0*UDm zv8&q*@WFg158tj99PEUn3IiZLFl&?4-bwiz?xg|ByD%V8mmG$&rSZrGn2CLu#DpZ| zwY{KwAhB?zsA4W3x2*`4muVs2Z-jiW4*A~ra`5+U_+1ktm-DPyrop8K94wX`VCHH6 zWCxUc_V8~Utba&y3~kIdjrwe+!#!vSOdn>ae|FC)voap}!QjvKykKCXij4X=pcb;R z5)12wF;z*Od23)ua!_i*;|ny0{~GlBkoiIBS3L7AjOFL8b z3Mf8|I}dP;g$-F`hQ(u(hdAQHLK_|D(8gd^r%uo;%tC{JR*w>+bl!sUyZe7x>Qz=bsaif0X)74iEpo zDt|Z>FW~uv zS7Uizihi&y<`5lUZQBHNkeO>IP69J14ZAuI?bnTgQF9CDI@QDqSLiASm74ol-MH z4n1@;@7(wE{C@BI$M^lQ&z#t?_O-5c&e?nRSxZ>`?`99HP9cNb=sd)}j{$XB;v?)}F2W=B;f63#10w{|*D1M2{NY*2`e^#`$6=bM@J`LQgJ zAb)C>B+*_d{ths>dswmOQw^iTz*c2ACCB36gPM;ECMH7quQ}Z5N^(L(2A0H3$@*}B(H!(9Jg%ee}}u8hTLI$-l)9~WpB6FY}@F&yLJASxEp-IHT<6VV#6#y z_*ABiGw+GW9-ejNjk8wc@VAnd;c%9)KD+U$bsu?8UEzUV?xpW z!vz@rL+=}B0e7LY4i}j!BXCTHX}Am>&sUv}h!wNBc?J$@n%9&%56+$VSFZfa^uKi+ zJI(lfruL?DP)i+i%S~DT-J3VGwKbL(WPjm#a?SST&qp1QEKh2V`tzmS#4#JHrC z@!~Z%#okb7@V<%-p^r^IvE3Q=JXs#zbg{rMcC19`o*zRvV<#u(;AL?N(vg43r{Grn znDg(fJs74QJ<`#_$IYX8FH59!tarl3hL+K}KeEi{6^I^C%u88^x#4|8t4Hvlf5i!# z-IrBkDf-UAZlaxw|G%?9-jXz z>_pVyW4F4Zg8E?OZkz1scR&VKRy6 z<9V{knqA9@Yty|+bM#L~97cY$$F7tD@lSMy+xN31KT?ZO@tP273-ly!;hzxHhPYH@ zZAjtw#&^~}DvF6FKIdMlGk3ucO=sdz4;sB_av`st-$x8SApKE(j4m5=UMw}9{nmjl z9Q=B#_q}|m?c3mSb6nbtQrfHb%qlcW^&fp?TCs%x*_#M!*7 zM10xKUX`HXtPd|7d}~vk>a?a^uL!;OH+!E`kI(8f8H=<7#a}->r;r zi@_vgKD3q;@l{n&E0F+e+~}AmRj$K04^@_!;!0*mq;f0cP@mSu$yw0tYFlRT5FuLz z;+9f6G!rwyEf;znG*Iv^IHahs*@_5PNE#X)7xyAMysWx5U-TV~&oxKA4!b~9u-VM>y%(1yU3F#n4^p=%32Zo`Lv;wzM`QVjCpdY{ zgH@9H;VU5;sd&2TJ92Lqnz7&hef4Fu_B*~F^t*(i>fX)qq-5-CoFvWNCEiDWcD#7B zB0iJSKan2gTu^u~_7u6q=z`)NYMewoL5{ULJzG});~^(ly&9ZtpX>%6bz!CbE$rBm zwA2c8y`YJ?e06xl(chrao@ zp@BN6T=iRDKwaHo>Xl0T(V}^j+$?7z6Uj88z_$hkY2t*l0{@+7CwRt z&iWqOF<8H+6X|{Qs}hJZX6S6nQ;-WCfxX|XO#0NO5p$7WNmnOwFmu8?bW$s*J#S>B zNjNEe_=QR?x1n!7f47dO(?iI9E84zd;U@oct~J{3^Zk?AGZnEN@tW15^YIG$V4nDG z8pqG2^=r{k=aoz0r`6q3R7vp?ROV)VR-@G)h(JftS8MknerVp)13R;XoD1x- ziCIpwrV??c+TzReDPK_V*7f=LMatNVjvsw^&M~KiDWdl^s@ESiMcGbUAVrTk@>lp2 zCt2{)q8ksG!^oZ!*w|F{Pkl}2+Z9M3KO_BA8h)VM8r!)RD_EDGlSr8%ICdmRawU7U zPV%<-{gu%E-~0=-+O5<9tAi)b>bK9oL zcZ|go!3jD~7Yzj8>CJO^f8vN@=8vl3$UzxXBGE$Z*P+^2cWC3!_o1qj=)=6cX56KN z7K_b?#*w!O}{r z_9p4W-Z`ynn80>uWf8iC{TjxogqDihM%zC@w?#SmG1)g?3Rj?I6>;xaJDb`u7end4 zp^I$vje&4x{la`omd}@` zNOUPA#Df7&?K{1~tRa5l<0p81XH)!e$+WB-y#iN+=Eb#hz zKHo>uf|uvn)1Q&lrJe$oVZ!Mq=aegWr{CUH{i#kxk>my9Yh<_Ptd++H&n%IC>au5{ zK~iV&?r^fuj>j!TVU6)LQy?26x0Jr>C zX($u!wdDaW@=C5e1tBi2m$!wghaSM40F4PH#K=;)5r`hbA9&4%sn_+N296?c!d5(z z2MLh4czR-C3LH#{UYF-&uHXPL!aC25LyiWSbxcY!NlV=e~6Lte~v z-AIeD*8gB71qzl&*m7L{z;`>qIo7KOof33P0a`w}&;Ni6a5RIEzws-v0)!F%kX%ST zEs_8snU}<6iQSln;>zQtbUnbulwnO@3B*iEdV>+f5VyOympI4=2xACLTiWu=x(in` z9?~ar4iF4RJk6_QZ^lO&N0tDB*%9wkmF{IoP8*g;$4~stJ~w1{_=Du5`>?%n^}yqA z<=#T{Hk@z*2*wD1m>3X*o0miYmHiLr0d?+x(+JM!dd_EZxvr z+_N&5dEZ_fq})+Ae?0Ez$A&`;vR&UE{JHNX+|X}d1IZE;XaWW;MOn{L;D=r3YH%=0tYET zOOXTelR-Rf$JC4Er+_eqj*bpG7p`;u^V7NnP zCJ+M`-knk3q0v2*l}!#8<$-l6DuoI!JEyM|W(LR_6)O2I9vJ z?}-cqim+K?%O$yspJG45(*rL(!N~OmBUg^PA2GZO!}uj->0$YsYs#GP>s)tUcywst zvBsUAA2s|2-wkqyAp|Nrk~ggNjDkc(9~RJgqL2PBT6y=p&Gab4&V)SPIJ`QLLMDo- z-3uRcF9acGpaK}F6h304`Wa~fDdDE90OY9pDZpDW1YE*!4>fC3dJ8ngmx`!Z)b?Y5 zCq!;x0{ZyLz#0EhATdUPrgseGi~=Fp%YJ1=j7n#vbq9DWBGEU5wAK;lQVYk#Za4{! z9%*iOnf7}Yy3z-oX1Cwya81b)%i@Y73o&1iNH0wM_BYGhq9Doi2%_{eV?t9LU|nmn z(D<3l=;iUAoC4%yN`S}~OdiI1*1Wn_B@dt#cQfcZw}lBefD>^AspMS3zrZ6)L#_fFVsGTPsMRhOQOe&QXc zdMGlHKyioK4L=CA8o$s!<%wy1RuIU29S~zJG(oFsV^fh!vEgGbe&z12 zk{QpJNjIm;xT71<7}pf!9e1Na0c%Cdu?;8khC3it6~;f&LJ{1eTA7ZF;|_>Y6-h&? zQ3Thjj-??fxf(eToZN~gF*$-0sayeWF|NtTpSxIAR=mhS?tnto%2XsH*EK_oHTMLq z)~RQVf@#5)_9;Duyhed6SEFu0iPkAqjDluCCU-!y>YN_DO!vQXrElZ8PKax&1IXQj!`fyu;31;R@M86Y~gNHDyXYSSr1L%LQ}LD6wEz2 zC8h{YP_6ukB;*cgP|X#XIN`n~ipk-eV5V5+nRvz>5Ua|{H8DaVZ(ZQq{9piG_VHHx zRGy**F@w6=JNpQ89yqj*v1Xsp<_<_v%@vyP;=aa;sn9%4p;&$}k;)w~S%$cCY(5R_ zbM8(Fv8~CI`nR-Ff!jx<1VwPMYNaJJODO-{(_L1>`o9$NrUiP*NKBLb6F({BpBM1{ zB&n?Q;}2%8{NO2ziv1KC)2dM*rFp7L(V|{Z`3adu5gew9=`}Wm{Qn!NPEu1s#d~KZ zn8-vX*Y(qwgEZtWcR-D*jo^d;S3s$%$VcRF?tuRvQmum9Z5iBmyc3Mv0okfBwuw2- z(+4rF`UM%|Obfv$7z0XjU zDQ9QuGdGT0lXhfBNT&<@^9b|8@AEKHK=^Sv^@a>rl8+UVGtWI^id-WxWJLH8@u#6I z@iMCwU*FO6MmN&NPVRz@HhK_=zI}S9mh{xBvN)dVGA|`NWs}!kBhUBC@YGHj{=aWTdD%FhLfJRv6MDc|lNMIV~V$;aFLIgL-B@~TYFaZ{9@KFPb~ZK$ zeiGkz*^=`?ltWy*3q(1K<BIMsoO1&t#{@*BLkQvQ0b;Qhtb-Fo0GUZ1+U5D4Ruio6Fgp` zuyc`mYm9bxzMOTP{}J-?$9ydDkD}p;in#LNDzcIxT0)O&M#KZS3Z7g0DaPTA-#^dT zJ~EQWv%aXP*>R!2I!+-4$_5hd%xgwqA-T#k#^=^ub>W##0`<7%R%Zu#%Dy7cX=`_@ zW$f5%_2kS~P>{@4SP12^6!h`(6?8u05h7|9a@w*L`&cEBSmv&Q&_af31eJXp{>vn= zl}&J=aIBD~qkx{f=XUBOKyOnP4fLpP)3eBYsz`XK%5_W8?mu4zjdp2J)2A(egDQe^ z|F-q=|BHi(Dd8xHJLTY!9lYDbrpeAESl>01on0B?P56mPh`ox?Z%_V7mw*zOKEBf3fJ(6uRYQ{|3&@wEtz@-%QI``kp=DAv`XZ za*d2|i?VBt|Nfiq&H1Yk&U0V-(nm)RBKXH@)a!XWbQ~4r^z(O`_TLulc#v-{ZFT3_ zvmxqVpODJdaI~8SsX5NDe>~SR{0glzitU(J==6BF^;^sCSMc8^?F%nF*7*F6nba(j z5Uo+l)zdvnjzZVf2*-6+9;UHr*fW0BgJ}<|#{L#jk}J+!ND5icN9JrhAxYEVP-j_1 zJ;=`SoUeb}KAHp{i=laLd5(ssz-0fHH~YjWG%Jk5{3(a?M1PB;C;sB~J1qVY&Pu`6 zdnwA=ZN&ZYOaonlaEE4DPRCmP_P(veiy4a+YQ5Xhi64lJv9pH~O;% zheQvYq)5KQ1r+_=~0(k&F!S7NJGGR1`|zK_6Xx9 zl%R`#2}5A+C*pM@J6e0QfJ(TzsvjfLy1xtQBRjns*{QH-5L@VQcku;#9FlXu)JYy_X^7)9d6bUl9G=$2ilLDnHV z6YfbJS>nE<7~=JerJ6Ls&g)JCJsWd@LHDKe3TU~UsKTA>z}#^dasgNS75ba$^xr3o z;r>gjZ z)?{(go-9m~(KU-^w+FYQdb9lA*&JggnP=Yduk`j%#K zu-T~Ngc6>#AWhlE-&Mk5E()!Bu6>0vgs*1#@O-t?&gL<1wZ{p0IPWKtN+uzSg;i--%^?5V8{@L@i6$5Xn1IB;MQPm!Xq$bW;kiZPevFn7mNnFgIAZG)tv_=up-AQ-h2* zGObJ0r59>P+(Qg}j6OkBN$Lkx%ujzr^syVreQoH2NhCfi&=hGi! z`Ph)EZC>5>`&sg~(Z44Hr ze6c&no@hrUD@V2O@M9lIdr=0*Z=@EMzw_o_^#2=;v@nmTjp zO$;j!HLdy*eWNx5Jzr!L&DB(@4#6rSAbU)XFK<+_g3{M)5 ze7|l2QNyTDnQ+tgy+q9;{F1yu<(4dy;;NZQV- z1m>1PE2(M)?#Dki0y>YT*VH>Rf3N-xgdOoL+Y#(oAkEcSXLoo=@J?ZfG6JLM1NwP_!pR9`0$+e74% z{RZcM5#qasmv*8Ilt2jtW>z8IHh~`s-ZmENnof~CCXd-IxY~Gx0}8@H)JsW3yIVf< zAxjLjd>grzGiijG8k8!w)bS@;wF63>{PJ4~kH&6Z^B{=Z62j|~n0M&>3B}ww#y&kF z%OSnw=@bB9CQfirX_x`B^}rRl6?zhVLe`U|2*<`G|18CvI{58TGxk=}mXLI)oLk4$ znm^$v>!`Zf|2Z17kW>FB6G8&hn!8-rw5oJ=9oteorp3Bdf5Oh}e^1-gd_L(rq4`gh zK#|p3VD88jBYn=$6<8tc1lJOA3uMJe;JSgiC2wL9Cd1*#f0`S!_(YCrTuC}-Y+l6|SK73rLr?;J}6m&&88C{Ijkz{q}uN#fF>?OvF~oE0jP9E!PM zgh^DGq=dQXfcf>qq(sA2(o10Hh&xZ=7x(&$xw>e~yaRFM+VcV3$hE(T44p0jnfd2qiHVl2mt`RDYJ8dNHD^Kcl2y@;s*o$^| z$wPv583~2%{)7bZMBAc3 z`dDWjgRLYwLH?}BzUs%{%H^0Ge7=MIqrRl8SwAQ1C{f3|kELm@dZ3JAYHa3REDdSP z9Fs8BIOg4qs+hZ^#_V8u{jH21uo4(<|fFa3&MBv@rUcr)x#YXA8-$;cp8ahAy?D7`GbnZ>!` zy!i73K)_Ofho!c%&ml=X{@GmYXB)>;qeAz@G@gI1%AUJldstpGT3UE;AfC-pU1l&wh5nm1}!-C$TNdw zTvY49FQUvAWdA^#TXsZ^Vxu*@VgDExz}U zT-)molduPse{ugKU^;6XfJ(&p>++y@2SmJflQjGSr}E!b`>@ui*+-{CdJrQAkxn4B zrWF5JeBRY4pQG$;$w`ly*}8P-^!WSeUgF_)s`_@fSAQ2?Uz+z2!^7q2+%4=*27ci` zFkA!r)djr@{GpDxjjMp=DTkW#pzt5@3506bF z(SfCsM-It3q~m6+&Y`Btkgc{TZ85l;wjb>bo3QPDt;wHpDbLqbaTl*BSwGF=@(ET9 z2mdnB+-7u%n*R9_X_LARU%jF3#+^FnyHdK{m*5~SYY1)6@EpLpWjIbE{9$^0K#n4J zQCktQ6u8y1;Jno{=e$j_;yiAx^@WfIKD;3HceCIg3{|aZcVptYwG`LsUc4LZnv|2Z zhTwbsx?$NR`obWc4a(nG@|~~xRtH)8F4f8-K|ZZSXic43-&3icTmI@T5f4yrjy_Uv z{Hs&=EVxliH~8%G84|M=fY~KcF^XgXa%Wfb5}x;T?V6a-9{pqd&(O17x~UNZ`;R5F z55E=6q{uJS_l=l4edh3F0$~qn2oCT%VSCnQ1!aBRYcl`dSlFE* z(;BKaPTI;9>3Soe^jvSI32wBo^Rmr!$8uuFWsJ0?PVrJA`q>8Ayr|+K`FL9I-HdWr zv!1socaUk4`bLDxP{xNuo*w^7Jo=Wb$%InBm(z&kY(mS}Nl2`%RPwcjPbBE+R59N^ zS(~NFooK9vu$mK_+OIjy>=uq{4PhZCHX--V$}PME|J}D&VYU!57IZz@_EUSEwQ~B0 zz*&Hhn(4q_t5~adU$xiyp&*^A_Y&bo==0anlSG1+{pFS4^NdBhvqcCqyR`klmtP_*}gZKw8Z_g%EoJMg8c34xuQj`Tr~ zX9dMO`)y(kZ@Hd#(w(yrCCwccq@(7Y(M}a5ulu3fHsBzRef(LS`!KJ>_AJT$oHdJ$ z75V`UPg6PWeZkAEGma;?UWrJ;R`8qZqZxHOY~w(cc-yk0ea_ZX|JhSpZMiwsJYSJRO`2yR#2F1 z1+7NVTrdk@2Q#<{L17l$<;PRjT>OCMu{ir8PnsFIbj?M>u!~PfQiJAtmF)v#`);p6 zf{B9Oik-87l*?XZn7V{NqxtAAK?@Tfji0} zk8(1J2X`dd$NoOlF0gHE;fh~=`orvz`j!wa^|4gJ+C<%#A+=oJmDoK0k2+S~;vG85 z6IL~1$|mAxB*K)Br9W6?Q}%Ek!o~6+Yn z*>Iy}C*zY+ZdZ55h^W6gKX}El$2}BLy*FMq>p|sM2un1oA(3w*=@;SB%%<((9IISQ zK6f3Dq&5tBD3U8ovt4QDLC!2c%58N#?@G z26`i8+b3m-X{4VTQ=hW2zJ?!|)5x>peM8NjdAFvPbun)zjJC9oD zi$P<5D}r8EjmBopj{ng!y|D1M+zU48kgIRcSTl(% zIQFhK-3mm=-0xanJ~>rb(FvAIs3J_)^hta-^oQH(TIXDE>;uJZQ0xD@HBu z_rVS+sJ3hR{HYs3nc0FEU8|e$PXv1s=fX6Dg&tMlhw<-4 zL!-HZwZ*rwkAqV_k?ei0wB}Mp*^ChyfP-0DKEwAJYJMJHHuTA4bL(lG_Zt^s8*x>D zE8{yShQ*I$9ekWV8EyrPg96AlZKl}`R@1z~)8W4;`|-^|x$@NVyxxNJ4i2rs=a=~1 zKr1JzcOAw}=k%qM`X&3pPtDRsMAXdRll`cx+fM^mqMNdg*s8J#MbNN)|nnf%jqy`dyFaSyzB`MG-_*xvcw*L zxftYP@?*Z*{9f@?jE3OZ>S1JI*u~70_bPEZ`YG>YVZw8(`QpkI9}B;7g~A_<<)o?x z14=*e*7uf6iYI#|kB_Gcq=J$Sb#5r>Ldy4zeFw8dyQfQ{$d=9$_^!%Jdi*wL6_a+R zUSufhmiXuCt+YS~u~2GK>R7I zn%tj%)J+=&yWURov24tRR{5~_U|14OSekiub)&g#{6o%CGYSFHsVo~)J10C(+noDO zEVQY5#3*ok4z&z}#g`N!bvjQ`uC<=3lMwCRIvL zn7r{b)RN{o-{nyJ87aEUzm-@<017yt z-hW`J>79xeQE`x+q2&x*7s8ci@KE2fUM`fhQS9>C0|(y?6<&0i|6DI^lNX*Lct;Qz z=2?E0mG2MqP-jOPMjno>20yblhzt&5pqx%qTn^WHZMws;s@5hr`#H->l{w317p|^L ziq&1$Q^$?8IJzS{%|6VOR0*2WRc(#?HpKPjOX4;#c$Gg_IWMw!l#H;HIq=sSO-O&bc%6P<`y&hmr%sxObgD{HqVc zpLfhD#ax;{NTP=IrP0~Qdrj}Etll_(qk;_%=3TDj(o^Jy)3$O60z+Oc5>}Wj#SDpV zn!iH27OzK>>_3`e>v?+!r8FKKH!tpvD=9sY=T9~h!y_>qc^RZT=b!d=x#CBBPvrfp z06GsEx53%*+bVB)N`aj3fuydH`l~n+d4_drz3>;7WDP-|c6FMX zl;lMt=UU2&F0|OuIg#ay&y@o7 zqPv7+99LN4aEA_BKT!`O7TZr~_>$JBy1`^=kE4nm)3--mcYW!Iew&f+y+rIbwfI<+ zhiNIt9h%VOruO-kG1;ud^v+SP$%c;=&(`Z(!vy<9ISMn2ccV+H{M6@5 zw|0}kl3PJ~@Z4Jv69pFbT!(Iq>1>&L|2yd$OV&4S&nI!aK9gQ!pLMuMMI*t!_G2Z* z=~u!EJgjp~6Bnl33Nf2cZ#Vd_e2s5{cYj~XHfPj{&cZG9avK$7EBjLBad};oyNV*AfljLb zm22A2MaHw|SDlDI`wd@R1Kjh+b)l*0cr&EgdR>9x_Np zfpuDx!k1!f(9eXENPfzxPeoi`KNSKH4~ z7vtwBgdk0>V$5nLcc0X*>Y4@dwSiUp+M>u*np0qK2$D0)S`;2peF@|->$0WGZ=N-Xj=?j9> ztL4p+g4yA5T)J5K(7J)fmpDCAdcs{iCn3tGUh3l*vB0}Yv^H{OB~{SXP`o|`Y;gZ&UG5&@FDoo&Ar%WM_sZ)$9=HQ`Qh{} zT6#|tGI$v9cP@~+$~@%D$geI$qRPHOM4Uj&qmho`Xa!1@Vccw3JX?q{`PG*;x!BvR z$8DrMk;iM-dnbMRDf^(l7Dkl|MtrXh{6l#jqOVjix!!gZ8XeR2r|dc}kl44Tt+;OD z!fEN}+JW!y0jtsFh9%~Xn*yL`Lo7??&Twz2z;Bo>OPh@a{69)*0rTt zGWxo~UCDjt-0KpX5|)<7mK7T^y(JpHEVX1d5iiLPE>FAo$t?-39%vnev@cgS1b%LE zn)@i5*`(cIF}8e9*`M9Lys>nb*tDg`bs>3R;&lP=eVf{E)xX@bRAY&WL$zepZ>2(_ zN9sH0RkwAvzB05dRe!_l`^=5)0(juM?z;EVv(K~cW0UTZydy!S+kx=r0qs(a&c<=q z^5cV?cbpBB^-Z6etd?5Vc|1!zd^vsf2Dqg*&TVC^vvgsk9=;5|V~C0`O&ZMW)&p&h z9wFEb9k+sBes}J^57BpT4-Qsc#eHS#83V-|g6lJfmkpLi5SacxlR*pAFK#8mz2#^= z3cFaNE|x5$Lvt!&^%nlxzuIa&PWLws-v0J$86h|~ZSTrm#rtOZ5;ruL=3}CK)*<4{ zx&i}5E32NKgJwMk3)<{Jf&60*_%@JIB-e9P@ykh|ELSdTR1g~DJa%mAj8gAV_+CDt zDFbzR?Qv0_e7f!t!dWk?5Q&~7L$@8B)*hW6t{yOoN8Bag@r!^(O6JM##?i7^@A5#V|urNoEaCn z^@|{M?G!h3YqDRxE@Dn!(58X8jR*( z*1a*KX_T=(^kCC#PVx(S)XIedo!um{BtZmk^O8b8y1#*V-bM7km5Z?a9d)zjy7nb2 zghr3o*Q>#Wu5-$Zq@ic)__PFdESnsCgrnXt|>n=s8Xn9$GCn$XNrnNZG>n~=>W0)OBv0tw`60fHgr zl;vdQ+;2F{Sm*hEsoB=pX13#m{REcb?cy?G*W#s10YU(q{6t28Ur!}$WncZtWEX@o z0BX0}=^^3(!liCw3C7zIV5l!3!uNT`v*sw^2`|y35Q1DGqUqZ~=x@qj!hkp4)VupE zT_N((VLym)oO>VIx&!>8!(x-@`q7_(XyNwOmotax2;hkgkr}`YI8Ww+O$2R72KHJ5T84WHpmI|kQ3n-lnWCZX+Edf`6SaPCQ z?XpD5mH=yEEF1t4?L%7}Tc9m=GHD(TWCqqg8avo_r%pq?EG!G)G71PINt79<(^5N(MF+zv~ z6aib3I1Io?U=&zXO4Jq`j)jp91R;j1{{!_toD@n4QGgNvBmfLRKSfYz6WbP`9PkEk zt9gU<8sH4@13m)vM_aIuG$C*Sqk8OE(AY7yZWc_;D6|*q0{ap?j@M4we#?CcP9}Bv z(F22+{ae+)?Hyu^z?4gY{b&*epb_9Z5Wa+~2*5~&-A3_Px1i%3_1HJ-{ZVB!~ zBJ=<~Z4tEpsla{Aff%sGin`+U1H!S#iP}-LMO08?h%nS1VEk_xI`a-z03$|wJ%Ato z^bJ!RR_MPS&H{J>sleYs|CSra!3MU2+6mhKk`x2uS~s8egZ>4K+6sP1_D@&agXnI7 z7^ULcDuC_*(!h1_cYr=Pj~vPhz2dtBV^C%Vg#J?eLl2dBA4UMUsv@H5dzj2P2GNze z?C6I!;DSQ{#w~Ox&@XNPG4!X%Eg%mEN(=E&g!_tt6Ye^+IWRrY0fm6!rdVJM^0i9I zY=E8;aa$R%92f(k1YJl}9Q)U?NF!q4f=qI_7eXAn-Jgi=y%GU{P8j+@7)u!N0PqO( z%M$Agjy@4aFznjtMF5>TAf3dzB2t>_!z6It56^?z@4YTs60lj8Uk;cCh+2a2zXA-N zg2v{Q%st_AyJ3U?Md&Rf+!R0!_(Auf=BWdQJJc9bby4960-N0Kfw%^If%+A&lQ4>oxDW2SmFb~`=l@+G!~;ZN<6!G$5$w9@F6jG9eo)hMfQO>pynz8ppPtG91|dkAc%+ zOsE&#w~`6%Gq7^%GA&M@HqrJBRFkabX9QPQsk+$w(jBUe&z}GGVyM@a(nou_nt{t_ zYPtGV?ISFT-`w_3R+EQ|29EDWB@4My(I>;A^i|w1*$dx@lURI(P~cg-V0(y?XG|w`BBZ;Aq2ER^UNM+0HubFm9uRsU)wC*Fci17Et&&*stCFOxTCRJ-Pkn%VWBuf5$*C={s4Mtdlw)H zAV;v|n|J(h9t6J;b_d)ahM|J}!0i{(?tnEw7^|`zWYdPM$75IqTE(ign1pbIUg`lt z2te)95E958{YPLt*bhzp9DsMrXatJSg;eLRk=RnOU2?4hi-0`9=@NHbcp$^@SUXCv zU<`3^VT*&x0kJ}E-+l&?p}}~ekqu1E;LcpOjWNw$t(YHVpZR#mM1XwQd|*D_Wbo%x zvVIdXJQE7r-zh}4Oi+Z5vm~w|AlwW8a+94P85?g{g9>5=VIyv*p`ZhQ$PJ^KNyZhe z#hdP769k_)n*qoaSp(*v*lbpDFMaZ6RSYP@bi{$7ga!My2LN$sD04x!=DUXnwNQG< zGC>O<>;iHan2!g2t5Ut62f}*S&Is7yCL>MmEnR$Z81X$DzK9+1j*|es45ooHK~RRG z;CQgk0rr6yTsXQ`pq&UFtXPD_&P}w5XLQ~Lf<6K;f>@yha4;R?dxZ40>}ORfTPC(t zkR8?liLwafnruA*%2Pz%Ym!3pxygAGl#? z%Ea541iWm;Ndw%w<@sR@<-RSV7_cMNK?FyKvcrKzeptgv%E&s83uZV#Oc6pA-HjVc zaHI$(gq+*3Z@}0#u-pOLxe*)qMc8->_$aDDq!V%kBuD5EXtfC+?C{bggom==0AGeg zAuHJl*zOpMf`JCm(>OAe1rqy18`f4cQ3Rm55`uKeTU|GRG1doC*4M$oP<#OFFb{c= z>`O3RM~;oU1JYxm?#PEjacaI35&D3XphVCe4l+JYc%~ZL7SNTY;H0At+P?n9_PODE zeCe=DLsWKBlSDG8eFrZdd?^C(lE)*icj>mGT$kW{PFV2s6>USu>rjK-g&@`zu+z47R^Fwn|b&Ft9-&c?*#sU}vL!UxUgP1hoRH0UlsX z>KAPRz>^$)4a8}uzy`AUak~TF;C(~1fv3yDz<4}tk7D>BkE5E%p%I!MbSw2VG?vjs zD}eMzhD%tTxa@}xs9?MW1)`;&zpfO0{3KrF4Wss@)I=>}DvwPocOt^6!c6$>1fn{xs7zVb>4Vfqph%5?i9sy5tb% z2YLl0Ex?^jO$^iI&7LY9F7_X?wu9hXzK3iUq3^K)PS6-%;O9)USUfC%7$Br4Awf7m83Hl%mI8oN8#n?O!9WI`5@8T0jihj>uM9O2HFPdnB05Z^{ z4b3Ldu%ikK6fKAP*~tvSv9*^l%pzT4Kmm(fl(73je!Fcx9GlJ! zI;g(nF;3)VVXGu?Jo}!hCW4-A3TQwZ{))NCGV)KzFK=bcTKBig3&I~jnr=9-p87@N zO?k2anW8=Le3GCgFtZZp%v`g9gdR)NhLi?M1ZV;LAx{98DNrnQM46DF=aQ z$D!-{af@VZz*$!^E}0zYs7`qWbC0<^jB2>}AEK^0s;xiP!x*p)9WWe@raUE{MiVt^pcXwK(ufKQRIq$#Q-rOYpev^E1((g_DcX(*LQQbg+ zx$XY%{lYM5&VKf<0|Ry><}dMIqPzsidY~9X(V%@Xn_lZ)l-?+0D7RAm!u~|3;(E4vs>WPSK5mt9xPEPz#3;omgeXv(&lsEyRN=1TFvjc`+k*42 zt0;!OXiPY;|AW4v7~&4EPs1qZr&4eH)_t`+(YM;< zr|zKgb3<8p(T@^|_A(bAeZ7SsyyC?gjTQlZ8ZzJxqE1WcqlTinSN5(%RiV&aNsvC% zR(X@M*rIRXuA@u~=it!b;6J|4y%Qho)5r2VBkZ6;zhXv$&aqhjJ&`>aJ*hpI&X3X$ z!P8-q{ffpNcrS)U?6h7Hy1K*HTSL6kGAaSTq>81(baXuC%g z2|vLOQolQwWe0l#mDRv6D2OwCQ9s1pIO@6=g%HZWXTM)?`X02GtN#3c_Ygm{SC3?y zYe6C?KsII;WXb`4n~U<5r7sfOtvCCHvF?s};mg*mp^F&&iCWZA+UzU^{bP|=#S%4F zs6Srce`MgS&gx(gzoq+pOZdu}?hXF@tKA4%ORPGZpx<|r`~3I~XgV(_{ocfEe1Bva zC&fHNn}03Sg3^p!0j%{E93GTkNEabQ(MCC=-lqHyWBO6Pq8KB?*)bCDic!S;!rD-h zB`Eyd056Y2aFKBn@#Y)quQSXX%$I%+ey{!H{XU4}`k~Xl5l25qrjU*(@om|+s3gJs z$b0%PEgq2J(F|M zZ?9ueKZCF&$rqa6@~>gH$;I4id_(nal-N1>+d}x_d`xk*1?3d=p7hV=I^nn%(MQyN zZ-QKu$2(Nab%d2U+UGSq4+s+U(2&`JH|{hC4FIKyL#j_xytiE%){aVrK-Lak@N|%h zKmN>q=E+6r42h-3rIxt<{t7(>MSm@L`%JvU2x&TCfZKm244^~rc!}~rvW~!9cr;H~>scYKASo2_b%D>fFJ7WVw!cDcM}J52z}>+{(~2RmF;?GNN&hB0OWLE= zpU5s(1nK5ADE^H!=pA>$`AF@)fuo6#Y20g+8=_p4Ljdiwvc3Ve$TKbeHxc(+IU2pM zeoe3PQU9U-Vq9lqv?sXpzYqiwPUAS=Q94&XSCb4UOK^+B9oKIq27Ue5@O^-F zs4pcsYw&0yy^&_J`F0sK@}@fpt)E!@{L4J%dixt>z(VdV|0^-%9%FYfAd?~+ z;lyU)dWHVK>v3;aS6vqSA?!USeFv&B-o~kC=nGQJl)tEd@z(!KC$VDC^ev3ZY0!{9 z<)W#dBc=bMLsQRxQj(}+ucX5{#;@_0I5`a_{vQU;*D+}48tU0<{%HL#suns>BT+dY zwSQ6~Go2JPDimlF(&sWUsgQuN?%j`e&f%wybg(tae3bJn)QkVpd%j|ntw-Cp$e4;W zU2CpCFGA72qHKeq5Y5oL2*cew@M`_zpR?EKV(N^mz&L{&E6Lw(?cN;nP`o6kj=SJ4 zOLKe9S&}a@M%|G%0}EGFE*~v4sgc)hX-Si7 zyX?)yxPbpf_F-C&)vwGQ9=mT}T2K;FbfOSdlk=^$2sms!PpI63%OEKwPunw%C`e#fL4dlAq*p0|{cQ z&b#Xehz#b6e>KRyt2ws-W@O zq~ohMu;S?3N~DXG>m;K_=gDur@n(=~^&P1&^f-avzg5g>ow+#*6yq*b()gub7O1Nx z;2AezMOOpoQsURgl~F}gd+TAVk2i)Y$&M#&OfV*uy7gWgGvtICR}P-n9eZA1<6EgJ zbAdlcJ5BLsrc+{F+b$o99_B?Kg+pg;Au0I&B7gw+{^B)cFtLKx?^yal-IXROyd)rJ zwLiN#>4?7H;m5;|HdYVyGqHv=?!2tZ8n(Y9tmj{?bPi!hyspGwnB;=#Si3&|N|VM^ z6t1GG;^H0tX_*lIt(fr9AK3rwk$Q|NLO0ycDWDLzs=e!LKFq$k#aM%Il=rNDwH1C` z6fV6VZ;&M4ie25TGLVF|LDEy8J7J(#yZ%^zrkm$lsX4*6eSt~u!@{aksyhIc=FOVC z1aI1;0v4jVG+5xmsqObIx$U@*+JT2>())?D@j1$qZQR38@`3T(l*tC`>~G;F`|&xf z-CP4CbNByUY6dsC8S4aJ0KfQ>!HorPF$WM0b#lR5+}DGgzF#H_S{=x!W1qhl0AI8x zUxGE~0otjM*JP%~DM<$B<*BfM0nUfQ1m^BY>?v;S!5HMH;O%4s*j8Vo!m)lN`FV3sJJZepCtLSx_UBS0qiRitXA>6X z;Dfcn%R%HqFf)kKcX!wsLm9zv3zj<>ZD3Zy&i$_h`tFRc$*_8)u+!v8jF{SI~f z^T5a0lRXlZcI-Y#>@!@GESWamu}1sAjjWXW>k#LAq&9yNglYd*TgrGi69ZT_coiHE z8$XVLMFWj)m3J*7z*%vgCf+K+M%-Vm9F_Vn<2@%;PQQP$yHr4YeT--m)j+tLkRnp^ z5o&|U8}rJ>aDW1M$o^4|yA69Qp1W;Y_+$5SV}S^nCf_3-qh7EtnWstdp#7$o%Bh>o zJkvweaB2+z@q3#2z=%6?h?7PNf{olDQKp?idmW_A|Nlz9Eq;w_kB4SUn+%X_@B?`d zdyw;E_i*tCt@iuLo5EWYX zr{5`QA|lfi6w~PY@p~0E=@#D9k;VV6c?=8J^y@gdGa{=3Vxs4@8O zL=Q)tkFD!(qiposypDYZ9pzbGNcW;_Vh_$}+aqAbozwtAQS{rFpV8__2-vOy0J9XF9M>30~b z(x1Ug7}unQiy2+5?+@uB41(%dG&K8O{r9Q4oT*vY(2T-)k6AY6mN5fCa_kQ5!`>xokv}gR zON_wg;Cz8qkiy8HTl|^m`J8+l$p&&UUIns8&BsF`{E2u?E=IKg|~RJ zUUzt^OM;{e0IE|8%GYu)H-6>BcB=7ag`wQ-{GoNH8+@eDWH~P=j zyQ`(TS(C>nCP*lhg3MFnv+2$vdaguu9xWcODaJ3Hi|H3H`^W9AjJSTJW&k2C;6zw* z)8=uc7V2{X_=g3Bgoj06hcN26__;}U(=qC{i^$~?a`vlM(XvTPdK5i*s$!QfsoHnQ7Cu5*jx`{OIm2VCpnljYiGtz@6Z?e`0oadqi!)I}85A1M zm?qRJyQCD(II5t65FGUKP2A%qFvT>QzW4Hkcf~>_Mh12r5BK+Fr~tUk15dgAo(!ht zc2RbUqPjlQ(Bd`4AYmbA8!Nfs38Ma;fa(pjqnR5jstv7ZbHMa30^a@UZw@Lg3~tQR zGgi{lyx(af)MStt8X%e>efmRz7`Ni0TyrdO$nvm~KF{H>@-xmMh9@W2EG4=4nOqr+ zK~|tRyI160(YQ{Z_2iLA?1osJgxgy&Q<;!0dY079lR16AyW}tmfrM}5EQg-A>P6i7g}QI6`URyN*T)Zosw6apfWWYyUJv8e*oF{Kz9m} zb%GkNYbZk8`eS)Na1^JdSW9I&eTjeP>TSeb&fa`O7%9K*m#u@}ib1eYRPPIk!+(My z$Dkf}exyA-;FX1WLVC_Nmwp<$e>Y+foK+r4U=_q6UTSu&I%#RJho11_PvU=i$yiQ= zCx>@ATXsvWv4O7`&A(b?-oXq!3NJ1y92nGRK&KcGM{!{wlaJGki+#B(HNAxw96zk{ zJ0rC*Z~L<*OnpQshoS!AX#$6WC1NlJ0R#yRc3 zk8&HhvcY)ckzba)3kDQ=R7OguL*+XY!Xp8E_)u_vRb#=)bQqxbK_ySrF*&9$YAGXh zh!$ivac*cei4jdVJx;WjcJ)~7Qf*+v_H7SPXd(5h@C`Y1)zGZ1choZ?^9I*-R(M|9 zuDVulQTt5atSulDhgg{6gDbz*v9*0wZD;2wMnopgdb#1SqSw!zBF{bcOrk+y2= zF4neSZ(T?Vu*Z=Zc8IS{h1$-3*Z66ZiP4%lV^uaYX^GrzRFVd!nDp54^Sf*0#GXVAx_Au{sAs7MFABhi5r6 z%7GfaPh1ptUz4dV)U%S3mg*#@BkYCREg4055JT$kYN3sOE*8#$Y2gG{eBPU_JK7I7 z4CR+`_a7^;ANO-MrZLY^~A?!Wt+vSw%=~1FSkNG zJkhd@D#CE&;_Bt~t)kA@ip}J@FzE(demou<{IFnBe?o=QW~zU@#*wWsHEr$Dy03~h z-Hj)0R;L)0(Nf+BepP--@4bdo`KBr}mSIN_(AY0ZgmcwL>CyW8Es#aI+mY-8hufP~ zI`Dgf>g}I~`8qw3u7?g0l%*JkwQO&5eN)77K1!0sGr zI@kASry?tov6s$&cI^)uS=`IAvG-NSO0aJLFM-D7%PCg ztw}rJ;LLB;GaR1l_47J9M$1btb1{9D89zC+Ju$H|mmDG38qKSNKHQnfk6YLdg&zh! z)f!9NbT28~uv=yX7W4?_I-`8aoY89IC1lQSeci>lJn#hxCzz$Q$IQ`ry&UVW>20F#x{Eu zTshBHIsC=8?lfMd|rg-0`a)qT(1bq2h7#xn;?O&CM0eIi{7Ros=)qPcr0!;)~|`0tZA zXmH9rQ4I}L&01DDITf{QzIIpgsIdNdIe-)U{iI2Oj@Mf}opa)m)%hB#mGDXf-f zY3opCwHtWXO#i{I9+qE4J)obrx=z1tfgh~uYvlji^m>+%1{p@y2K@THq@c;5yr-wwmwL4QMNP);=T&0rCwaL6q8prx7GIT*JNk|Y%%+>u zJG<*igR2#cIkD`r&Ce2Xf;JC7iy)hiw9W*&+iv?ZPsk)!N23QGwnnRo_T{c|)uG$i zq1>P3e1GOw=gl2!eW*suuLm0mwesdMZo>%IevD`6B?KlZTT*yeG6v4EOR5!5Pgoau z>%9B)L63i;@E!w8g2bbG4}Yw!UQ>ucyBXE>bX_keOUie->tqT`l{}c_qkGt`1*D~F zBwbM5mY9sJ_`ZZqIn0CxCcrWn#x?*(DF6bKABJ|8zdi9$^Ow}Otn3up8&(vZruFmYjVS3`~g#) zx5b7Dov{R_569qLb<2<<@5pVD4Cd)>Hr%f8RHbPU}-G%Sjl zhFJR0ORs2xWehyK-zi;%7e9+gLqU7j%>$9UU;}cD+d~t=5^cgXk--wehsXGpqn-w<)_= z(QSr6P=A|Y7RPk?Qs1CDe4x2O3fHFosMl5VrtDI9I3?yR*}(L3;Hp5lySv&YI=i<6 z7D&+X=CiTQo#&91!-t;D4}+Eq_zDCf(s$iNx7DNyRj*bU7Yw?tt5KT)#y2l1_Ajf2 zhztKdlm6C~S$@44iC+=x{^wdZAojDjk+s%w*IDOM>hy!%a=`=#j_$hyO3I9`oC&v~ zJ2m#og77mBSc(wkCu8^3LQ&Ew$FlN1c0Ai_kL+8v%OuVtJ6x=qg5iJ z{I~FyhkG**YX>gGk>jqbolzyU1q{HI(d(J5p?m(vH!?QQ6R7*`*fd<_aCZME_Vr#E z^e-tmpdqHduFl#B;@LRa9<_q7EokXIv0D(BYcp*3ElG9TtHNB(RNYtwnnAmEOWz2` z8tYJ6|#FW+?QW=){mz&OW^ zg||_hR36|VG_@i~1NK7*2ON#htdnae>WijBk=e>(AAiUPX7`o#H@BoNZ#Hj@5jdm0bMn(-? z>sf%B5)i+7>|){db7OssqMzp`dGuOJ87A&lAHaN{TK4BsF(W9i$F`H9s&{zG+#k0V zdJQvF#}YQo%D(zK!^{7Qg3iM2mHs?3CeSq+(RJE!FX)pX$`dy*4vo}2K=e}6DH+p8 zv0=M|?(4D}cYhNEI7ZIhB85cdNDvSBvow0w+mo7A5xP4jGBr2irYY!2E%K8hGef^s zAlf6WpUO+L3|3#jYG&Q6yv7gjdVAk!?k4Y0l9pB7+&S-9m&^U|5PTw6sDQ!&(3$3& zfCwmT+Y0h55kY8o`@74r4&ZM8{``l6j!-gHd!OED*w%~o1Hg{=N&KbPI$-c@keY+P z9tf`N0e|rg`5>jJ^keW7T{jo91|;~g`?VqjyOw)+;GBxA8Gvt4k3EBV?U^O3T(J<; z91LGK+pYajisRg~^ud7*0j_I3^;^_B*0S7&NJD+b*oDk_RxiBZ26d7{W%{IlvOMO> zk*#CiH-q%l==%6j*bIOW3Pr zqcz~na1}Vs>khOG9N8yv?m!eg)lT6#)!>g*5=@gAbV7NmzV|k&voZ~f`UHIcF?)CJ zakY^(ZvQs~tjW0c<-02K5YUIzLKWdHpO*UsbF`5TmU&W&+@|j@-NP0#LUB^H{!*n2 zSqgEq+Vkj=oR*eX+EmzF&G7T{2{bhF*7Net@YmH(KO9n|rKMRO9r=uml%Lp)MAb*# zoJ8Fy-rStv)Zf^glt+z>+>|RCCW;e^*9b8ZorGUUG31tXr_*g3J!|C(^S=vW!CPW7 zi`%`P;A9L97EYxFw9u7|#!h$4Zaizv6`zhF+Y)*8IrPqMIZM*d+-Pw6N>Xi?E zOE>cZGfN`U>8_E!aZpwu_E4!tx}_ZAL3Sw+*1spZDf8=KKkTz51J|Fk?roTH&QIfa z`4q+uN#8^k>Gg~z@2U&e)!AdyC2s9bAcoK$kP`%i$k_PW&KxYrH|F zR|kNEa3^c)3;xBzjVT4SBj$P%6?TWcOUF%~#WhH%^mf_T!pA<(%E;>i&&>$~tJbQu z>b?i(ElUAYfcKV*=D-%mUvi{B1M+N_6u)9`_y%m zP@6N?%>F^{9*BHL5-})DyY|%l&9ao{d4oW3t=dA)mBO_w+IDD#!}^}d2ZEb*9e`ZB z;Q81*aH^2wm^tes_k87o8)_&?=-{Vvu`hQd3l?9PPp0-V&Bsep8b)0^j;`XUyL-NS zE1IMvlTQ42c$dg(sMUUXXTghGUI2-2UC-F&eQY?fkbMlk?SaAA9w)u89_PYr7qYmH zX0$@2q~4~Uc}JUV^trJH*Y>>>>snjx^hOphSHh;oi?oZzXfhpqv&`mhgx9g6LxS#Y zX3+!3I0WsgcH(c+d8Fe-lhAUl&kJ+kIX_1({LM58a7)1?S?3uEh$8zeEgQG! zZWPgYAW*cybA~1leauQP$og6!e9JR+xiq|Vzw2_gp~i3!2w8yl{sx)yz7=x5{X|dv z5ShL!Pw}95ExDtevZhs`;o9Ok0-DT}Xyd;kdn~OCxFRpy#5x99JoCP)>RdXLasc$N z8owu|CYy$00!dp~Ckdl&3NWbdO&15bOI@jDR;`4DXP&|2upSBZux>|X+;*x*(UOydTFxDh7zS$-1JTT7 zo$09^gW-%kj=RwC^8KrB5AOd&QFH`nCnx{2luk?;}&-3cOI<(wc zD+^S%*MBOMs9;~U$UGYsP>+7r;;1a6X&d)dLb}w$r}aG~*6-Z9hdfok@GgAf@+qek zpt**Ve8JH=ao9}%xHeV9b0_RczTs%J?D}M&(0H7_FS5+C>uJy=6&L|JWaOVN8b}hhZT)_b&NJvLd-RKE&1eP=PdXk`AdU)(WCH{_O7y)|K0WP^{YJU zr%KxUmJ0zQ(<=GsW~wjL)Ti;$Qrk_x3vcd+?=$b{l?2)fe6-_-C~ss7^MtSac-H4W z%=6OW%7j_J6<%mKkPF5k<}z!+@t%cYtv;M?oxwv@L$(pV`;}AQRMJwhR_VD%{$fX4 z9$Z1(&i}fmRNe9s{O%}Lz#WhL`0g;#`@V|1gz7X(5LmBjk}ma~@-`LZvtXB!ajey6R6rt=baJ$ZVAn0zXpca;}=BgBAVm9O4b z!OEM#b+s3-8DWZjM^;LkW+UW>6A1`ZEu;I$Z`71M?G=o^8FG=%j}#b8w@;pRuQrk8 z9PfNNqp3|H%vYk-kA!$ioHQ7O!9AgUC05GP9xZv#(m+f+Z&}?(Rq3ugd6kHKmq}j@ zIZcwIg2ZpYa$iGh!t!5rE}6GeqxUDDh{6kv+j~iFMB$z5xuWNZ8gmjSqDf@=wN#tUfy8xB zIn|Gu6k25>RIP;j@s6U4(jpJA?}>j4R65~s6omEtinH~Wrg>ijI{J5DylZ>1x$;w> z1brW7>wNcH*S{hv(&m6DMA+?gdBG!f*6y@*dy^WCZoJ;fNZ&2`UumxkF23i-h2`2d zo+^c86Y=>G!c??X2fdU2mvu|wqQ~ybtvvobQTPl$kmOw42#W`ea6$+ z<+^x&`~+>7SakAM6f!66Em+gyFok7yd;f`ws`=qNXY4d5?)F3Q9glADlWf6?gvH(0 zwXqQqIz;9EhT+shQxhhmo|g>yyHMe!V@_BaT@1avcQz9c35s8`!VA78Ds#TPuh0qy zg_K~^e zb?Rc#j?+3vOn_HqyAoWUAl5M@HAb_h5XtG2*4uE-0pD!)HKJ^Yw6{w6sC`_$vy*<2 z{;F_)^7tTM>&vNzYx?7+bW=)QpE-6{%bCVfAdo(RNyft;atXgJp-_L6TZLxowz&Vj zc)aqMuNUa(E?<)QYt!fDG2dh*+*K}hIes%zW2Y!NE2Bf~>*ZSCSc3WU(A#pY6Zzkp z8jQKr(#I-5Ij^x4Gd&E-HeP)3ZCX=vZF17Iz{p2w+7qN}l~+0O0j!zbTbfrLw2uRY zo4UB^tL8}y@bXOySl$QRC?-rx-Z(Vjh=KAvtLiKC%9kc)*axDZvldHm1yZNbd*}i&LQzKj#(M<#QXj{2^|CLA6+Eqe z2Atku~=p0fU-oj?5K{@Izo{-9gH0m9u_(lPNy&?6=Ms6D^DWBSs z<&xmKy@4BOa4^e_Zv682{IQio%+kJRD?yAq}_N>9Urg7fsgdv!DR{h zTx0q+R(r~%D#hi@(s;e)gchiBs@{9=Np_?@XGO!ecD3S%V8{Tp)sG1jP!&5=^jQBE zCY0!;$}%%|)PyY5mYYJ!)#}uR+P>!oT;WId&z7gvLZnyYFtHcFR#;CSb@%#w%Vraw7__Cc$%K8pXY%XOf7--{V;E*p+6 ziW{dcywHAN?hjYq#PFpIyV$NxPu5vlwvSM>%zj&>h=ffI4om}hAKb0dB**4Li9uye z(9}tR`ybz9{$0b~tnW@|s67@5ah?NpjRq$b} zO;UE!HOdsb=M#ANVY8UmM9n`vHz%;rZ&7MBI%Hv4pCdrFk8}I<1-fRwm*`;Go^6%} zkH!!dCOCp^{25=VB9;&`5|qt?vF)VSI2~P9^{^Uj+d+{?dvr$ zPg?;rXXQ&@NeqtcZ+;3z9Sc}??gtvA4S)u_j>8jXGGQ$ZARHBdTOy^ zqW-e!JxJ_E7C`~0R}?ZOFV3~v0bo=VJ>W9kg?ODqvIO~{%mtYXjx=$L1#M_r$)B0F zHAK37mlz)>zL?u%A>voAaC~fL7!*evdDk&#SL6o@ss^9JpS9X-|kh1!m!d+>99nQH2;h4M$hVO}Hl-&hv_Q+PxAk}(XUYWAKd0&h6{FEMDeXEm;?D7qk zn7D@#vk3_BiGM%m@17|#j6A`+H*$v;B%Rplu*GEGO*O=OF~}bC@@pWulD~k+i2jFZ zGv6-Ste+coY@J+j2t<$IbGNwH)L%^Sv}v*5c3C>dWoQ&pRCPu@**kY@u?s3+rzj$K3tq{yNRPxa>WPCDR1oBWRje5 z=dU#zT`@+U!O6L09lrblER__H{G(rUg~zP1OJ02>(_1FvO#N^nG#b3tAL8_=DvPSy zy`caXh`=KkpBgggV^m_|GU~0qQ(axt6k7-4oO1^83{6mOm#wQ`LcLa~XxmkEqQ{smr zwKVg0Uo$?{o9HnvsaO}%Hmu2zOx*r7SGPV?&Xb@XWfJn0Wfaz9nyeqWriq<;^w_%H zgWOwfdq{Fqg4ny9h8Vg(f6v*9cLQsG6OgEi-pl4)nMdghgv+TpCI=WzRDUA~`^1bDQS@dTGHDzt zCKR>0g#kArUNyq?&Si4Wf~sansxn3Po^Tvt&(^Q)Ce)>eMjq462)V}eIL9`173*IUlf z+#@Rc&*(QL?e@1}g;K%+ljfSsxmVL8xjM_lVuuTHb}lPcE`vFSO0PEGsGvwQ~WGe_5&+&G6&lV}EO5uNw5@PhTuH8Nfre zK}$Dp(Vj?G_8dnW#0zy>egluJ<#uOTUBma|ab5jLd@r84mF@Dp?&K}Om8$L6&9zT4 zHhamcNDhut?}Q~U1KK|vCrA2=N!-b;I^JR#FT!^EIWkY?6`rSix+YdZCbL!~_&^t9?Vf z-_F;rh8SE0i(x_5kesNPpv0&1+UK;rFZ zxP!m}tX59NXPj#zTsZ9zKY~N>XiOzdRT`2Z+kPh_^$e<;gSd=?OZ}d&GZVmZB<>Dr zj}-fTl-E*8HqRjE*)zne9mszC)c)P`Yz$&;@hIfO(j&<@q<}Y%f#ZD1;?nLvJ&-Jb z@TC{ei1+_T3^ndYDBwOLilv^h_BH$7BapwPGRh1Xvq;_&F!>!y`7sSoS|9;+ve=1MHJ94)g32A^B@6;|SPyRDuZ;x){p3&R- z`{!bZ^1cpqv!XtXuta~3@1dQ`r9R;s-*P_VD9z}?)ONk;N0d6j&{;-aPDCr^Ap-rg zoW=ppfP^4=^s6TzGee%zfPG{lpjdxo*W6r4B*8Ewd1^aVE^jPdI~nj3!q)=RMw_wGBO7hX`B87 z3>ptn+&)S8U8*Y9+%DEt|B=CTKlwLiiM3Xpce}HRXiMd|fBoRecV6MM>b?T6^%2|L zZXXtY_tj^})W>xi3UXLFxAa_8+Ob%C4&rNbL3E`&qo<2>xEWzQwAra5&V|!`@A1^A z+ack1LfiCL%wEFTl_URf`$;+XZEEuYZu@K0wf9HW(Vy;jY(*26KHjM%I$n7*0a2&elyV#0-{7z*Y^v$o zUdwUzp}uWP&F#q;VZ`sef)U~w>S_15Q~XTXXfd`0XylmV$ILA5E5bH8t(*IK6_UDu zw>G~3JRQfK5KyBSTzz=`aJ~9sCs-&PK7V_wM&&Bj72OC9P*yy8SAz=wJ>QQ-{q8As z&JZ;IPb|aDuSWc*REv-SyS70f6oxX=x2Xqjvx4dzlb;1S#PbM8qKFc|orZ(;u0qwFlH~aI_rNHp2w-yQY`#~!>BDzofJvP1cQlSxren7)gDtxkZEJ0^?3nuNLiv%=Y@ z)W>@#QYjDeJv8(O94R)Oo&-r%o+YMwux>i7ALti~4#+hmj76`w?KekMRF2;)42c|*Jct|v*3JyhZr!zh_H^qV-Bl@m$D_zQ5_Wz{t>Dx2oL6-A z`BfoskmiyYazcJxh1&e@U~sbDzP~%|z!OhbrkkkfXv^6rwIaGl0<6%`t)>`EC#TAZ9*KEzcx{N%s{iG4lfY@dOW5;9pm4n);vC zX;qbczG)tt_)6Wz-z?*~BQVX>`9NLD!|<0Ck;X@8lJ%eK6nv+1YRN}Hy7S(YgAAiN zs*!O5VQRuKH|jq{W>*!bnYvzRtScw0w0hQO-!;u4{(tn}jGh(;WHgIqEGy}0iC-pk z>1j3EwrSg39h9EnrHf8FG`|Rz!@%4sdD*CuJn7i1Vvhll|Ala7ybcO}pbNOCu{P%H zEq>8_O|Wcv)H15Z%1zV~<9~@Iwff=~5;wlXS-h>2L9}drKdMi+jvjyrJ_3xFP z)M35nO^M`;kMy5P{N4?Gq4Izs88%a9xfx3xzO`S!c=OuZih)PFB}?+gn{Rdv5}B`& zI+XX|?6OGJt7Rl^4})=gu0{S#6$wn~^Tdsm?zVOnc`Hncvvn-yiz}dXlVQW_JJvpC zz+)%Q3xbN{gF0nv7WZ7$;@c)ca-i@ zGyhELL*mpaaUF14TYuOvlQE(UXGi_-!XE_I&0GZumChWaOF0pYWcqEFKS*#B_6m#RX${!80uzPGoqif_VdOQT-h2Z!5^58a|_>F0NE&)s}= z^hPGZogJ;83v0+yuXq9&O(&8{IwN5T7WZ`$uECejHGfEsv^7r(mNcRzZQ+2}aL{OA8!{rAYuDs2wu0gKTU1r5NYVo?SHC7H+u-jg+!>$7C1;%4{1nxwv|t)sh&3Dpq- zu6Er46E?}_Ga$ZF5( zcJ7YMY=-pqjai~!NdcaLtaWja!;Q)keZCmvP~RIs_5ybA#&L6$aEs>Y%KYoBzhsR# zf4_I(5FPwo=`hhuz5j@LicV-tn4CQ$ zjT*maaNLEWuHo{qL*u|I(RN{XbNhn6OubYxiPq5EE!=+?s#5QdzdA62ao=Ce=~spx zF+R2~Fo^({cQ=|6=ViGzVL7~&_|W;ty`raeVVJxoHF$(?Lyr>3%jz_)3mbI3h8~k~16VE)X`jN&dg-8X7k0HW~%w&u_?za=RN>{Lwviwojm}u0%CnJ7jEI>c_8Kuw5KjdIZu< z{(|Gepox$Bz$Dsbqh6ukOE!zqi1v2G!vkWB!zQwo4UCwPB}!!dQzvopF0n<+LzRWi z?tK(VQ+Ub|Q!Z`(4lGv)PgQl~D~rkr zro~LVZ+0M`dr9WQPy3^1{&e-@A9}<52C^E?g%O#ltUI10x@V?yA$!%vcRKvzydjCt zT48|p)$YFOPm>J}ap$kX$~`hVl=oHsdYj-Gt0&ZiW4KlD9)*)&60Kbl1SJNR0GU@F z%%P6I=97(N1@xnCVaE!F8>`JR#|Gg(?6PDjG z$zw{4Rr?v-uCj;NuCh~-uCf!}yR>WF%0>yM6G&}H*vGeIh*xBs6p%+%OWjSX=+<*$ zohDwyrGE2X?-Oq}PmOTjt65-PS-vAxBQDSCP0A;(VcbBsmY?!&$T$BuHQ3^1!Pt`N z{wsMRswF?rhFybr#88tcKAoieqRM1r##(!dwc(FBdV2bmX&DpiCUvT7WL!dCg?F4S z^!I0v(;K>^t(k4d=@cas(bIqex1@wo7S+?sb9f_z3)4bPiggLo&)r(|CXa?l2M}$-;C)NCr(NfTN4xL$pA zVWkqW%d5j@X){T+?SIRi{S^7>pz^ZHvRE1hs`yfHePd{1fxeWlmK|l^LeN$5I!|{? zTG)(u#@}Q(K0T2={e4)=uU;{k*^m#D70$ImYJfqfQ|p75^%244ZZ(uSJsG*z4UOVqMvhSSRiHNGY( z|J^d_RMFO?reQ&Zdfw8k{IzrVZuFfxqt}(ylR8;>z({EZn<2)rXS5TS+k&lJolx9I}5~9oYM&&^x-IEkUI&&m!iFCkm ziJNEaQfAoWD=IlPZDlc80Z{f4ZL>7r0AJ|fm;dpAt19i~(oQXZ9e zDCgh_Tb>IU3PMTqhw}=C;9oUOzigLBYUd&0iG60(L+`ZRh=bG{Lbo+`MHaLPO)gXd ztiOwyRbNX*uE02r0vHTqe+=%bto;uFhCq40Hut2^qSwQ-OWA_d0=9ta?1Gb?Jf7RH zlKp3q{Zvo0`99{&<)S=;ZzJ#P_-h)A&MIYdsJ>{e1#%`~%a`5k%RfDfeew~NEqHS& zb3ea~P5zkHw?8G~3OP;~;?TR0{IZbBcy_LG(laqD?hXpQgDYeiAEuiR(v?}E)uSSm zE>)!4SLmg?=7S#gz6EpA@8e-<*DTjz7dil~Kb~jqj|=4Yc@p|C^7|sBf6YaMnIil~ zJ|j6Mznw$vrh5V9VLn@Ua(1>dUJ=au+6`V)ucFfyE6j7!&_8fLoJD@9h99yZvsUWf{{g9el)9zYd06^NsVk+l(^|4f z_Pe4C=9|l4MJbyXp3mlyPv@Pii1YrRL|zNuN1)?bzTqT&rKel&q5*)?rD@>%JY9pt zD%!w29>2j;#I9Q@>Y6ofOk*6Uq5COK_p{LbC!u?J3Gu98vuS)l-=mKSe9TZWW=vYg z486~MzJ`s>FJkvDpaJ@vN>Lw*&SAzB;P(=F`8*e!_vT7UvxWuEC}KOSi&zuV@cOlI z#`O#N`20CCA77*!Wq}xXx$XsQR<0~-)XnERZO$S^RTm;y4YDoYi;|*IHmasB@K?y zjqEiqL^4}!Wj;cpK1VVKFn4^MB2~A#*>@FXKYLtJ_OfP0 z*&_SvT52mRZDqL6t7P+FS0&vjA>rfm%Bhb&PxR4~<}zs`wzI*%4*Z?GZizKQ8DAp^ zn=dAt*W2nFrDVUvJP$VC2pPAEez>Nb`mi(E;*;i7Nb{BRL_Og7{3bPM=l z^doC)D%m&Ck8Guzopiro!)U)6MEtmCReNQonnDF`rcTVuF36D}SHK&%1*kQ;@N&_i%}F zQ)#+9Q1z!Wr6V4r4r`yT_a(fXE~Ij5u%G{|u4FgC&mp=QSgp;mCQ9eHmD;)N z2|f?1EvNR_Zri?&Qj)JD{rzZawan%ZN~=@K6Q99?Z|M7=V`7cDQN{OZ?U)qMYSyEfc7S@WkS&48?dW?!_ zq(pg;ui3HwBOhW7X!hYU^5McMKI|qDU*_w7x^cC;*(#4B#)etw)IilREo^CH6-=EfKnh8JZA1|x^I?oyR+g`|D>S0TXe`$9aTiR60mgdgPE}A@JVga?)q9qkHuXWSBwu~+5 zE~UJduqC<0+3LxK6LaRf+5B)No8MhQW1WZ1Pk8yB(F0^d&7%Zfq^pXz&6aU0yE@$M znb7YhahD}f9#C$mSXtFp@lF01Q||8t7OkRjH|3!<1clwSmZ1DB-nlRfyH(=eXFM=UuGikqVBxnJ(s&;|AfU;4JBj+%A!ipxk%tE@$ak z3VVRAZY_-k$Ln9Jn3Xh9zqU|eWkqxJF_7;;_Lk*JCX3@}>&t80tcL7Z_(%z>3YSuv zD(3YnY!6+Z=knd$PDXS_bT);~O!1<5ZZ@ymLv5s-&1>MRHrWQ;Y+{bWs^`)eTrcNI zhIrBJGB$eypSMqzOrUop+vdC2{FIB^G(mh7^AxtWUha>kT-+8jo|)oe&+?4?nr;z% zk>A6dGryeL!F)FVZgWq7IyFh@Ykp4P*L1ncgDVu~@8GcXGM7^0TB;OI@1=QE4JK1H z4cLF=Dck%zP>bR&lJMPW(g%?AG6I7Q*u(L2{T%xE*jTz7R*1GzNX}8nxu3w-=&BHM z+WcGgK*lHxc|~DGvs`Re1K*YQEuTky+?yV%3*}VTX0gnf3i}>i#~Xxyjd59*vb-*# z{#UzM^_#S2)9O-p74wm!-cMIfrZ>h#J*B$QR3z&8PBAVn2Oe#P`Yv|1!j{mrwo#-v z$6casTKHs}3F>?G)TSngc7m=WQjRgM=O1m1=K9NsAMH$Csjv-n9oKXbo=w3sQ(PaT z@QkBW?1A%V9G|87cSbRDKjg|{?;mwAppX4?m~WNBZlFtTs+9dm1&@D+uBIlT#~L@L z;W~O{A4Fq9dbPstr|UY&Ym6_NC+vX@ex{|NKID9bJxJFvEsY`0)AWioc>e+8d3n+K zOq<8}v0h(FW6|@g*}POe<;lm!FHqP^biFL)nd8)#5HBNMX641&Dz%!+$kZ$B$@;tu za~x%|nx{A7=b-!(qR&Jd_;j-zU%o&$%HPQ6CY3baR>-) zhpr~=8P60PGsVRo$Qs*yb6OHIF}5$Dv7N?unh#a~I6t-zXk|h3g&?i{?xw3+>M+MK zPMCS-%q?Sc!)LO&O^exFnooJ+Vr)Fxg7#0~t1a5NDV~{?uVqJ-Cf4D~vPFhxV2=@7 z@NojlF&aCHS=mFPZR_=Qu8Z_kFgMLj{9V+3=$dR1Hk#w)C*orkzD3L6`*QL<&3ATs z_#DdLD&D2w{@+TG(koe7d4w%mQ%-I147M!1kS(Ki+p?2lhR65+hz&1v@Vs45k*fEz zJ(Qo1D;wBc*LV3BKXc9~XJ?Q<&Nw->UmS0h<^A{27hrGCQuc~{6c43YCiYJ(^F!_V zMo~4&a5j};6_sHnt4@eAoFnHW6>U^jQJ4N42UNzvv)rTScGuuaZ)M(9TARm3{-9$H5pv7OUqh^>K&qvnfrbAEdzJ6F_$ z^d{>2tJdG~A)40x6M;2*hp8d_gZEN}-RM4vS`sShK=5qI;|fxoQ_N$^7kJp|-3;WF zoU!t=JSY|XrH_{IsM1x6@WI)S@-S4^RmSOM{%;m54X%OG&F-V+w^b}vT)UO|3tX;u z7Orwte|m9I@xqD4H!plkaowlhSnL{{``Hyw7rSV(IaKVbIk&_0H&v>)V`0sbx@8@% znw9c7Qo!~((x)lAN%G<77wP5{U1xWY)626H3JbY90u(&xYRfl^8x4CHMa5JYJIDT+ zI!+~z9rJ0!_!DU&6}jH$Qd}#~WhA!r3@?sE>Qo;2u!ns$Cf2LFk9gSQSIRQse`)ap3-2mB_tuqFKXS88*i6o^q{i-GeArdxDAL-QD_6cd@YaX zcjP8`nT3>xM6g>C;fC@1NtCAprrlqG^xBD~p${Q3ETkTltEzqPe)H zxn#xD%IYhMeY?w;Z$&k;l-B?$Sd}2~ak|E;M0pi?)-U*owCHXiLZ0;xebiWhl_)@? zoN-OgKR`}tOZm!*%HncujY?~ro#r)ame^`uB=9a>?h5hR$veoz1U5B=N7HpbJ^(1c--~UE(wD}w9=3dAVb~Q|@#k7D3>>)|+ZW==Nl=62UMcul| zwr)K_$>F2XAJNTK7ge&4(A82k2D=^{)7pRW`d2t?g_u$0%W&I(?)mY1#n$X({T^>fX6)n83J?nYt9z;4W6LoEz*R}d$?+tSY<{K+pdvQ%k$%;*@>GpnC-Sx#a zAs1D>2D+iDx5c|+?tA7}tXOENe=m^I=t%+#{rUQLqi6lZJ;wU?tY`hu$Bgx_$Xfq= zekrHJFY4dwiXzlMF_v$qv3!H=SUyPX*iRc6p_}Xd+IvvGwyHbWQ_4~o+wN96*e2zc zVolao$LA- zHjkS_5v5D4Pd%l~^L07<35a>7uT##E+QIj68!w_cQWNG$Ve$N^sBaeQ3#)8F(+Zj&EWvX={*Hin4!N9V9#)v|5rvIO z`Nnurg$wU|A$PthaTEOWM?_wb1UNW!DY<2K3IOl z#g06`l;ka8@e>NWg|3-uuT#Rb+|cr|aInx!vh> zI!z~}Lnm}%h;1fhLZ->Y4CbXHVq^l_WC8Q>dQI_Ff?Ij3A_7*wNMP%G(9qm{>RMAvFO!?iNSx1w8JE9yElo|K1Zlc`)OCsxMS z=P@gO19{7{4ECbyH@?xT^7y}@dsmh*G;Yqr<;1W|8b5V6%5}gD1ZLl8@Gv#%0$jAw z+T$S=9+G`Dcna@??Z>iUz9{<7Qpq1tf?eT<#?8j*E z;kwd?>q@iS;gOrtU^$J!69^34l(c5I z!Xg5@(R*nM(TpCVP9JQPYrcJsd!Ujvt6^<7gFMZfuY();7B})O?oKWR6s5j-cZ%dU zK0?5HGwn-;^A+SbqQq&GO`<*u+i%B7!e*;J{SLUwTBYn}xmLLzfhjlB{wi@SHJoD! zYs;Zg5nc|i#8)UUwAuFaL@1-E`#UKmw zS~xG}z<4TTl_z*HF8|vp<$rG`nuOj-s*^LiNm6k3IAa;=#b@_;~XdN7jtWNd`~JJ z2J!v4YZQ2`&KU1QpFvVw?DZt}*{D3aIy=Ll^$lV_W6~|ymp7qTe+!*amo3EMtTn(q z+9&0_!{TJ#;Z91w1ihc!LOe@9^}X|9IhLdIN)dG257jKDR%*?9ZG6t`D^lR~qQsmr z$Iav52$g>Vz5ZM1-_|^AjDy=5heNmr|K4(OZwM3!M|o%r2rr>trm1FVxhVyBTUr7Z!euH?EzV9gT{Yi-P>m?1ucXVG+@^d!AGf0jPDc4`Ez%Qzk z^Cv%pMj$uq!kNP!LLu672P{2r3xV&3DN$9Y2Yp36T^OXGK(2gVaH zjc~rUkdC?hwBFTMuuEzk%wpn9X*tgK9)DE}r6ZfeD0b4W%0&4IK@fghsVF-@LP93tK%4a*(+4wB<0 zU5>6g!hgyzU5@1EkQBG1X^_@{D-?11Stjab1t*<@H98R$Ax|+Can*F=?1but|6|xY zNQ%oj*^-}zyhu#v`&KRARp1_U8)W+AIPKf(d@sxV+~Qwdk&^)F( z4o+9#^XZAUCdU(XOnPqcSU5E2giSn_DSkD4s)r>$%|xIG9ih$Ka2#!RTU`ecZSK={ zsO8!MHDIrHfcd<$40)D%bjEpSay)U~X?||jVOou!3ak%{vj-=lLO(~|VWQ*S3>`9% z7t2^2mzd{uK0tMT9lc}d2ErsqO;UPcAx?fe%n|6lh(NVf>=hMhPO3t4i0@Ggz6JRr z>_e^xG)ILwhTc^^=?6`KbW3rPOeH@n^`kmmVFjvRtBTXYGS0)!*9WyewTHEkOatPv^CVAd#dV&* zwfnG)!oOF*(_q52F`C-~*CxM*q_{ZyPXkZ+@H4Ir4a6taq`@Nyuw`5}){}4OP=TK;Oyp0FC-Nsf=RA)NZU0??o#;yBIj1@94d{^5 znh80$UdjoMB6;3~+?w1sh_C-LG#uM@$Y|hep0L+TJf@4}{W$&E@x3&lMMdBV1Wuuo zCm8*k4e6%$5Gtm1NE=^=bUawPB^A;b`Hs1;Ne$~!N7O}p&d{=6MOe(u(i&1v{ zmLX+7$jc^wgz~~hd2^D>>x!4RcW8MZ@bW&8I3Q>ru|8>?d?%0Nz#h!L^iA|mpnGQ~$zbzJRgwty*_j-F_v7c!TG{K2$-Ufi zG0(o3X_6&vG4@G)Vqal|ebTa7a*yG91Zrj(a=C5#YPig9bHEWQ{~M{`ZS;dTIF{=; zC8&(lf5B|~sf_y&cw`pI7{LzW+g<2~?+{9k97%QYy^DU=?FyV^i(#qyI)g&3M6b3d z%Nb_GDR{e|eya9Z-u z_Y)1t`#$f$RrvHU)8Bx3Y8CUV=02>!6xU5fuNhs7Jqg>&hV<{@zVl8tTMcLdy^0mv ztEf^*^zZvb|Ij;&E>F&zZSi>%hYrM{BXQ_I;?U(dWPLVn)@I^-e^%I)+Hj_%Lwvf+{%p*j-6_T}r+<|95%hNOyk$>gUiAcHFA=?P zCGQi)dA`SSIf8EQ9Le*U<5D)K596268M3@daam4yrvfcI6XhhuWjXyA|9oen9CJLw zYsdNT#rdBN-pk26=ACniuA{dco$Bb?MR>9cTNl-uVGdKzv61)PcFi^IyFHB&Z6`FV z^Tpa@G1r3X;cH>H2JYkd4C|<4-wy7^j@zTa3v=b#1K*MS5e$0=NpXuw4l5sdt?^e> z2%NV<4(7KXO5y9R@GlkEiq7=|*-uGvpEnYi!o=p3NI$oJ28D4 zrgy~Uh5nX~?d*uuxx5ttZM{nRuQwnC%o}zI{Y-k6`3kOKBa&Cg z=gH3?IWJ$g%C-8Ca>f3M4Ki^pk%?;w+CSm?pN+Y=&hkN)B@4uUwxoZzroncDKHY~A zCS<M``#yd$m^V4kGKHUzGn7ndRD)|w)&;NNe|Iu4BkJf6OOA`ka+_x~j9JaASB$6QI0<(qQGud>Ia)JAdGG3(mPJ#Cs ztA;$0X(+$eKTq;&7w0AO&X2}<=SPR~&W~~4`LPlC+p-@T{NE3g`Q^vr{PJT%`DI?- zgCm#MW|X%kxxB7;d3%SJ_W>{OgU9|RzkKG0l3%{?!(@KB>wke??i$W7cX58XYh?aE zYViNjWd67-&L4LT<&V2Ke=N((wL+?;2+Z;wJFuv4;CgoH(+KpUI~L_Mo0J>6%HdT7 zhYhzO@p_cAYM)|JR-68!!uF_P?W~wvTz+Koi1H(9QyPpS`LPTH3ebJ4DPBG{n}5LC zMjt3{;vcB&PKBA%^^1AT�rQk{cX+)tUTa|k01 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%0DK&8qb|miPDV0rP}pL4T;oQHyydBoAG;OuvA^;y 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 qaYl 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 z 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 z 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 Ml_c;j!8VTcbuvFG#QY5d)sEFlRA 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 JO#$Y|{U6^(_Mrd( diff --git a/windows/xdpdrop/README.md b/windows/xdpdrop/README.md new file mode 100644 index 0000000..3a53538 --- /dev/null +++ b/windows/xdpdrop/README.md @@ -0,0 +1,24 @@ +# XDP DropPacket + +## Compile and Load + +```sh +clang -I 'C:\ebpf-for-windows\include' -target bpf -Werror -O2 -g -c xdpdrop.c -o xdpdrop.o +netsh ebpf add prog xdpdrop.o xdp # interface="xxx" +``` + +## Start http server and curl from a different machine + +```sh +# Run http server on local machine +python.exe -m http.server 80 + +# Curl from a different machine +curl.exe -v http:// +``` + +## Unload + +```sh +netsh ebpf delete program id=65540 +``` diff --git a/windows/xdpdrop/drop-win.c b/windows/xdpdrop/drop-win.c deleted file mode 100644 index 30961ff..0000000 --- a/windows/xdpdrop/drop-win.c +++ /dev/null @@ -1,40 +0,0 @@ -#include "bpf_endian.h" -#include "bpf_helpers.h" -#include "net/if_ether.h" -#include "net/ip.h" -#include "net/tcp.h" - -SEC("xdp") -int DropPacket(xdp_md_t *ctx) -{ - /* abort on illegal packets */ - if ((char*)ctx->data + sizeof(ETHERNET_HEADER) > (char*)ctx->data_end) { - return XDP_DROP; - } - - ETHERNET_HEADER* ethernet_header = (ETHERNET_HEADER *)ctx->data; - if (ethernet_header->Type == bpf_htons(ETHERNET_TYPE_IPV4)) - { - if ((char*)ctx->data + sizeof(ETHERNET_HEADER) + sizeof(IPV4_HEADER) > (char*)ctx->data_end) - { - return XDP_PASS; - } - - IPV4_HEADER* ipv4_header = (IPV4_HEADER*)(ethernet_header + 1); - if (ipv4_header->Protocol == IPPROTO_TCP) { - char* next_header = (char*)ipv4_header + sizeof(uint32_t) * ipv4_header->HeaderLength; - if ((char*)next_header + sizeof(struct tcphdr) > (char*)ctx->data_end) { - return XDP_PASS; - } - - struct tcphdr* tcp_header = (struct tcphdr*)((char*)ipv4_header + sizeof(uint32_t) * ipv4_header->HeaderLength); - /* drop packets to TCP port 80 */ - if (bpf_ntohs(tcp_header->dest) == 80) - { - return XDP_DROP; - } - } - } - - return XDP_PASS; -} diff --git a/windows/xdpdrop/drop.c b/windows/xdpdrop/drop.c index 678c542..2561b8f 100644 --- a/windows/xdpdrop/drop.c +++ b/windows/xdpdrop/drop.c @@ -5,7 +5,7 @@ #include "net/tcp.h" SEC("xdp") -int DropPacket(xdp_md_t *ctx) +int drop_tcp_80(xdp_md_t *ctx) { void *data = (void *)(long)ctx->data; void *data_end = (void *)(long)ctx->data_end; @@ -18,9 +18,9 @@ int DropPacket(xdp_md_t *ctx) } /* do nothing for non-IP packets */ - if (eth->h_proto != bpf_htons(ETH_P_IP)) - { - return XDP_PASS; + if (eth->h_proto != bpf_htons(ETH_P_IP) && eth->Type != bpf_htons(ETHERNET_TYPE_IPV4)) + { + return XDP_PASS; } struct iphdr *iph = data + sizeof(struct ethhdr); @@ -38,7 +38,7 @@ int DropPacket(xdp_md_t *ctx) struct tcphdr *tcph = data + sizeof(struct ethhdr) + sizeof(struct iphdr); /* abort on illegal packets */ - if (data + sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr) > data_end) // ((void *)(tcph + 1) > data_end) + if (data + sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr) > data_end) { return XDP_DROP; } diff --git a/windows/xdpdrop/drop1.c b/windows/xdpdrop/drop1.c deleted file mode 100644 index 678c542..0000000 --- a/windows/xdpdrop/drop1.c +++ /dev/null @@ -1,53 +0,0 @@ -#include "bpf_endian.h" -#include "bpf_helpers.h" -#include "net/if_ether.h" -#include "net/ip.h" -#include "net/tcp.h" - -SEC("xdp") -int DropPacket(xdp_md_t *ctx) -{ - void *data = (void *)(long)ctx->data; - void *data_end = (void *)(long)ctx->data_end; - - struct ethhdr *eth = data; - /* abort on illegal packets */ - if (data + sizeof(struct ethhdr) > data_end) - { - return XDP_DROP; - } - - /* do nothing for non-IP packets */ - if (eth->h_proto != bpf_htons(ETH_P_IP)) - { - return XDP_PASS; - } - - struct iphdr *iph = data + sizeof(struct ethhdr); - /* abort on illegal packets */ - if (data + sizeof(struct ethhdr) + sizeof(struct iphdr) > data_end) - { - return XDP_DROP; - } - - /* do nothing for non-TCP packets */ - if (iph->protocol != IPPROTO_TCP) - { - return XDP_PASS; - } - - struct tcphdr *tcph = data + sizeof(struct ethhdr) + sizeof(struct iphdr); - /* abort on illegal packets */ - if (data + sizeof(struct ethhdr) + sizeof(struct iphdr) + sizeof(struct tcphdr) > data_end) // ((void *)(tcph + 1) > data_end) - { - return XDP_DROP; - } - - /* drop packets to TCP port 80 */ - if (bpf_ntohs(tcph->dest) == 80) - { - return XDP_DROP; - } - - return XDP_PASS; -} diff --git a/windows/xdpdrop/packages.config b/windows/xdpdrop/packages.config deleted file mode 100644 index a802d15..0000000 --- a/windows/xdpdrop/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/windows/xdpdrop/xdpdrop.sln b/windows/xdpdrop/xdpdrop.sln deleted file mode 100644 index f5b5cb7..0000000 --- a/windows/xdpdrop/xdpdrop.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.32630.194 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xdpdrop", "xdpdrop.vcxproj", "{D293D511-3498-414C-AC48-4097B9D92759}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D293D511-3498-414C-AC48-4097B9D92759}.Debug|x64.ActiveCfg = Debug|x64 - {D293D511-3498-414C-AC48-4097B9D92759}.Debug|x64.Build.0 = Debug|x64 - {D293D511-3498-414C-AC48-4097B9D92759}.Debug|x86.ActiveCfg = Debug|Win32 - {D293D511-3498-414C-AC48-4097B9D92759}.Debug|x86.Build.0 = Debug|Win32 - {D293D511-3498-414C-AC48-4097B9D92759}.Release|x64.ActiveCfg = Release|x64 - {D293D511-3498-414C-AC48-4097B9D92759}.Release|x64.Build.0 = Release|x64 - {D293D511-3498-414C-AC48-4097B9D92759}.Release|x86.ActiveCfg = Release|Win32 - {D293D511-3498-414C-AC48-4097B9D92759}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {C49B54D2-1DB5-496E-B984-4FBCF0043C96} - EndGlobalSection -EndGlobal diff --git a/windows/xdpdrop/xdpdrop.vcxproj b/windows/xdpdrop/xdpdrop.vcxproj deleted file mode 100644 index 7fefcb2..0000000 --- a/windows/xdpdrop/xdpdrop.vcxproj +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {d293d511-3498-414c-ac48-4097b9d92759} - conn_track - 10.0 - xdpdrop - - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - Application - true - v142 - Unicode - - - Application - false - v142 - true - Unicode - - - - - - - - - - - - - - - - - - - - - false - - - false - - - true - - - false - - - - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - $(SolutionDir)include;$(SolutionDir)include\user - - - Console - true - - - - - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - $(SolutionDir)include;$(SolutionDir)include\user - - - Console - true - true - true - - - - - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - stdcpp20 - Level4 - true - - - Console - true - - - - - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - Level4 - true - stdcpp20 - - - Console - true - true - true - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - \ No newline at end of file diff --git a/windows/xdpdrop/xdpdrop.vcxproj.user b/windows/xdpdrop/xdpdrop.vcxproj.user deleted file mode 100644 index 0f14913..0000000 --- a/windows/xdpdrop/xdpdrop.vcxproj.user +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/windows/xdpdrop/xdpdrop_user.cpp b/windows/xdpdrop/xdpdrop_user.cpp deleted file mode 100644 index b533d99..0000000 --- a/windows/xdpdrop/xdpdrop_user.cpp +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) Microsoft Corporation -// SPDX-License-Identifier: MIT - -// Windows.h needs to be the first include to prevent failures in subsequent headers. -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#pragma comment(lib, "ebpfapi.lib") -#pragma comment(lib, "Iphlpapi.lib") -#pragma comment(lib, "ntdll.lib") -#pragma comment(lib, "ws2_32.lib") - - -bool _shutdown = false; -std::condition_variable _wait_for_shutdown; -std::mutex _wait_for_shutdown_mutex; - -int control_handler(unsigned long control_type) -{ - if (control_type != CTRL_C_EVENT) { - return false; - } - std::unique_lock lock(_wait_for_shutdown_mutex); - _shutdown = true; - _wait_for_shutdown.notify_all(); - return true; -} - -int -main(int argc, char** argv) -{ - UNREFERENCED_PARAMETER(argc); - UNREFERENCED_PARAMETER(argv); - if (!SetConsoleCtrlHandler(control_handler, true)) { - std::cerr << "SetConsoleCtrlHandler: " << GetLastError() << std::endl; - return 1; - } - - std::cerr << "Press Ctrl-C to shutdown" << std::endl; - - // Load eBPF program. - struct bpf_object* object = bpf_object__open("drop.o"); - if (!object) { - std::cerr << "bpf_object__open for drop.o failed: " << errno << std::endl; - return 1; - } - - if (bpf_object__load(object) < 0) { - std::cerr << "bpf_object__load for drop.o failed: " << errno << std::endl; - return 1; - } - - // Attach program to xdp attach point. - auto program = bpf_object__find_program_by_name(object, "DropPacket"); - if (!program) { - std::cerr << "bpf_object__find_program_by_name for \"DropPacket\" failed: " << errno << std::endl; - return 1; - } - - auto link = bpf_program__attach(program); - if (!link) { - std::cerr << "BPF program conn_track.sys failed to attach: " << errno << std::endl; - return 1; - } - - // Wait for Ctrl-C. - { - std::unique_lock lock(_wait_for_shutdown_mutex); - _wait_for_shutdown.wait(lock, []() { return _shutdown; }); - } - - // Detach from the attach point. - int link_fd = bpf_link__fd(link); - bpf_link_detach(link_fd); - bpf_link__destroy(link); - - // Free the BPF object. - bpf_object__close(object); - return 0; -}