From 4b471719ce58ec8bc5e7442cb69b560e39c0c027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Tue, 21 Jan 2025 11:20:28 -0800 Subject: [PATCH] bpf_helpers: infra for per sdk level bpf programs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will allow build time compiling versions of an ebpf program with sdk level specific behaviour. The mainline bpfloader already supports loading programs based on the sdk level, so this builds on that. Test: TreeHugger Signed-off-by: Maciej Żenczykowski Change-Id: I97078c6bdf4cef143cdfeed6ea8e2594bd1f5cd6 --- bpf/headers/include/bpf_helpers.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/bpf/headers/include/bpf_helpers.h b/bpf/headers/include/bpf_helpers.h index 01e0f6aa59..5751f85f55 100644 --- a/bpf/headers/include/bpf_helpers.h +++ b/bpf/headers/include/bpf_helpers.h @@ -141,6 +141,27 @@ struct kver_uint { unsigned int kver; }; #define KVER_IS_AT_LEAST(kver, a, b, c) ((kver).kver >= KVER(a, b, c).kver) +// Helpers for writing sdk level specific bpf programs +// +// Note: we choose to follow sdk api level values, but there is no real need for this: +// These just need to be monotonically increasing. We could also use values ten or even +// a hundred times larger to leave room for quarters or months. We may also just use +// dates or something (2502 or 202506 for 25Q2) or even the mainline bpfloader version... +// For now this easily suffices for our use case. + +struct sdk_level_uint { unsigned int sdk_level; }; +#define SDK_LEVEL_(v) ((struct sdk_level_uint){ .sdk_level = (v) }) +#define SDK_LEVEL_NONE SDK_LEVEL_(0) +#define SDK_LEVEL_S SDK_LEVEL_(31) // Android 12 +#define SDK_LEVEL_Sv2 SDK_LEVEL_(32) // Android 12L +#define SDK_LEVEL_T SDK_LEVEL_(33) // Android 13 +#define SDK_LEVEL_U SDK_LEVEL_(34) // Android 14 +#define SDK_LEVEL_V SDK_LEVEL_(35) // Android 15 +#define SDK_LEVEL_24Q3 SDK_LEVEL_V +#define SDK_LEVEL_25Q2 SDK_LEVEL_(36) // Android 16 + +#define SDK_LEVEL_IS_AT_LEAST(lvl, v) ((lvl).sdk_level >= (SDK_LEVEL_##v).sdk_level) + /* * BPFFS (ie. /sys/fs/bpf) labelling is as follows: * subdirectory selinux context mainline usecase / usable by