summaryrefslogtreecommitdiff
path: root/progs
diff options
context:
space:
mode:
authorMaciej Żenczykowski <maze@google.com>2020-02-19 14:23:59 -0800
committerMaciej Żenczykowski <maze@google.com>2020-02-19 15:46:23 -0800
commit07375e26a376107b564a3f3837345b6c0fbce5be (patch)
treec5043bd1554dd62c7fdd3cf8fd9edfc9a93d4795 /progs
parentcd994cd63768ff79ae5c13c136a54887dd6c2701 (diff)
downloadbpf-07375e26a376107b564a3f3837345b6c0fbce5be.tar.gz
add support for marking ebpf programs as being only for some kernel versions
Some ebpf code cannot be loaded on too old kernels. Sometimes we want a different - more advanced - version of an ebpf program to be loaded on a newer kernel. Test: build, atest Signed-off-by: Maciej Żenczykowski <maze@google.com> Change-Id: I9e93e7246951916e6d60544575337a7a19c82886
Diffstat (limited to 'progs')
-rw-r--r--progs/include/bpf_helpers.h27
-rw-r--r--progs/include/bpf_map_def.h3
2 files changed, 24 insertions, 6 deletions
diff --git a/progs/include/bpf_helpers.h b/progs/include/bpf_helpers.h
index fbdcb2f..09c3373 100644
--- a/progs/include/bpf_helpers.h
+++ b/progs/include/bpf_helpers.h
@@ -98,10 +98,25 @@ static unsigned long long (*bpf_get_current_pid_tgid)(void) = (void*) BPF_FUNC_g
static unsigned long long (*bpf_get_current_uid_gid)(void) = (void*) BPF_FUNC_get_current_uid_gid;
static unsigned long long (*bpf_get_smp_processor_id)(void) = (void*) BPF_FUNC_get_smp_processor_id;
-#define DEFINE_BPF_PROG(SECTION_NAME, prog_uid, prog_gid, the_prog) \
- const struct bpf_prog_def SEC("progs") the_prog##_def = { \
- .uid = (prog_uid), \
- .gid = (prog_gid), \
- }; \
- SEC(SECTION_NAME) \
+#define KVER_NONE 0
+#define KVER(a, b, c) ((a)*65536 + (b)*256 + (c))
+#define KVER_INF 0xFFFFFFFF
+
+// programs requiring a kernel version >= min_kv && < max_kv
+#define DEFINE_BPF_PROG_KVER_RANGE(SECTION_NAME, prog_uid, prog_gid, the_prog, min_kv, max_kv) \
+ const struct bpf_prog_def SEC("progs") the_prog##_def = { \
+ .uid = (prog_uid), \
+ .gid = (prog_gid), \
+ .min_kver = (min_kv), \
+ .max_kver = (max_kv), \
+ }; \
+ SEC(SECTION_NAME) \
int the_prog
+
+// programs requiring a kernel version >= min_kv
+#define DEFINE_BPF_PROG_KVER(SECTION_NAME, prog_uid, prog_gid, the_prog, min_kv) \
+ DEFINE_BPF_PROG_KVER_RANGE(SECTION_NAME, prog_uid, prog_gid, the_prog, min_kv, KVER_INF)
+
+// programs with no kernel version requirements
+#define DEFINE_BPF_PROG(SECTION_NAME, prog_uid, prog_gid, the_prog) \
+ DEFINE_BPF_PROG_KVER_RANGE(SECTION_NAME, prog_uid, prog_gid, the_prog, 0, KVER_INF)
diff --git a/progs/include/bpf_map_def.h b/progs/include/bpf_map_def.h
index 03ca73b..01d9b8e 100644
--- a/progs/include/bpf_map_def.h
+++ b/progs/include/bpf_map_def.h
@@ -57,4 +57,7 @@ struct bpf_map_def {
struct bpf_prog_def {
unsigned int uid;
unsigned int gid;
+
+ unsigned int min_kver; // KERNEL_MAJOR * 65536 + KERNEL_MINOR * 256 + KERNEL_SUB
+ unsigned int max_kver; // ie. 0x40900 for Linux 4.9 - but beware of hexadecimal for >= 10
};