From 5c01da8e1969bd03f41382604ce99c6328dc5069 Mon Sep 17 00:00:00 2001 From: Sarup Dalwani Date: Tue, 7 Jan 2025 21:22:57 +0000 Subject: [PATCH] Adding mapFlags parameter while created BPF maps. This will allow BPF maps to be created with flag options that are supported e.g BPF_F_NO_PREALLOC, BPF_F_MMAPABLE and others. Bug: 387984935 Test: Modified NetBpfLoader to dump the map flags. Change-Id: Ia13ca5a861e8275e831c2b96f4759d1e8f111963 --- bpf/headers/include/bpf_helpers.h | 14 +++++++------- bpf/progs/netd.c | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/bpf/headers/include/bpf_helpers.h b/bpf/headers/include/bpf_helpers.h index 0bd3421d19..073a3494f6 100644 --- a/bpf/headers/include/bpf_helpers.h +++ b/bpf/headers/include/bpf_helpers.h @@ -234,13 +234,13 @@ static void (*bpf_ringbuf_submit_unsafe)(const void* data, __u64 flags) = (void* #define DEFINE_BPF_MAP_BASE(the_map, TYPE, keysize, valuesize, num_entries, \ usr, grp, md, selinux, pindir, share, minkver, \ maxkver, minloader, maxloader, ignore_eng, \ - ignore_user, ignore_userdebug) \ + ignore_user, ignore_userdebug, mapflags) \ const struct bpf_map_def SECTION("maps") the_map = { \ .type = BPF_MAP_TYPE_##TYPE, \ .key_size = (keysize), \ .value_size = (valuesize), \ .max_entries = (num_entries), \ - .map_flags = 0, \ + .map_flags = (mapflags), \ .uid = (usr), \ .gid = (grp), \ .mode = (md), \ @@ -269,7 +269,7 @@ static void (*bpf_ringbuf_submit_unsafe)(const void* data, __u64 flags) = (void* DEFINE_BPF_MAP_BASE(the_map, RINGBUF, 0, 0, size_bytes, usr, grp, md, \ selinux, pindir, share, KVER_5_8, KVER_INF, \ min_loader, max_loader, ignore_eng, ignore_user, \ - ignore_userdebug); \ + ignore_userdebug, 0); \ \ _Static_assert((size_bytes) >= 4096, "min 4 kiB ringbuffer size"); \ _Static_assert((size_bytes) <= 0x10000000, "max 256 MiB ringbuffer size"); \ @@ -317,11 +317,11 @@ static void (*bpf_ringbuf_submit_unsafe)(const void* data, __u64 flags) = (void* /* type safe macro to declare a map and related accessor functions */ #define DEFINE_BPF_MAP_EXT(the_map, TYPE, KeyType, ValueType, num_entries, usr, grp, md, \ selinux, pindir, share, min_loader, max_loader, ignore_eng, \ - ignore_user, ignore_userdebug) \ + ignore_user, ignore_userdebug, mapFlags) \ DEFINE_BPF_MAP_BASE(the_map, TYPE, sizeof(KeyType), sizeof(ValueType), \ num_entries, usr, grp, md, selinux, pindir, share, \ KVER_NONE, KVER_INF, min_loader, max_loader, \ - ignore_eng, ignore_user, ignore_userdebug); \ + ignore_eng, ignore_user, ignore_userdebug, mapFlags); \ BPF_MAP_ASSERT_OK(BPF_MAP_TYPE_##TYPE, (num_entries), (md)); \ _Static_assert(sizeof(KeyType) < 1024, "aosp/2370288 requires < 1024 byte keys"); \ _Static_assert(sizeof(ValueType) < 65536, "aosp/2370288 requires < 65536 byte values"); \ @@ -359,13 +359,13 @@ static void (*bpf_ringbuf_submit_unsafe)(const void* data, __u64 flags) = (void* #define DEFINE_BPF_MAP_KERNEL_INTERNAL(the_map, TYPE, KeyType, ValueType, num_entries) \ DEFINE_BPF_MAP_EXT(the_map, TYPE, KeyType, ValueType, num_entries, AID_ROOT, AID_ROOT, \ 0000, "fs_bpf_loader", "", PRIVATE, BPFLOADER_MIN_VER, BPFLOADER_MAX_VER, \ - LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG) + LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG, 0) #define DEFINE_BPF_MAP_UGM(the_map, TYPE, KeyType, ValueType, num_entries, usr, grp, md) \ DEFINE_BPF_MAP_EXT(the_map, TYPE, KeyType, ValueType, num_entries, usr, grp, md, \ DEFAULT_BPF_MAP_SELINUX_CONTEXT, DEFAULT_BPF_MAP_PIN_SUBDIR, \ PRIVATE, BPFLOADER_MIN_VER, BPFLOADER_MAX_VER, \ - LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG) + LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG, 0) #define DEFINE_BPF_MAP(the_map, TYPE, KeyType, ValueType, num_entries) \ DEFINE_BPF_MAP_UGM(the_map, TYPE, KeyType, ValueType, num_entries, \ diff --git a/bpf/progs/netd.c b/bpf/progs/netd.c index ed0eed519a..9244350239 100644 --- a/bpf/progs/netd.c +++ b/bpf/progs/netd.c @@ -46,14 +46,14 @@ static const bool TRACE_OFF = false; DEFINE_BPF_MAP_EXT(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, \ AID_ROOT, AID_NET_BW_ACCT, 0060, "fs_bpf_net_shared", "", \ PRIVATE, BPFLOADER_MIN_VER, BPFLOADER_MAX_VER, \ - LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG) + LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG, 0) // For maps netd only needs read only access to #define DEFINE_BPF_MAP_RO_NETD(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries) \ DEFINE_BPF_MAP_EXT(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries, \ AID_ROOT, AID_NET_BW_ACCT, 0460, "fs_bpf_netd_readonly", "", \ PRIVATE, BPFLOADER_MIN_VER, BPFLOADER_MAX_VER, \ - LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG) + LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG, 0) // For maps netd needs to be able to read and write #define DEFINE_BPF_MAP_RW_NETD(the_map, TYPE, TypeOfKey, TypeOfValue, num_entries) \ @@ -92,7 +92,7 @@ DEFINE_BPF_MAP_NO_NETD(iface_index_name_map, HASH, uint32_t, IfaceValue, IFACE_I DEFINE_BPF_MAP_EXT(packet_trace_enabled_map, ARRAY, uint32_t, bool, 1, AID_ROOT, AID_SYSTEM, 0060, "fs_bpf_net_shared", "", PRIVATE, BPFLOADER_MAINLINE_U_VERSION, BPFLOADER_MAX_VER, LOAD_ON_ENG, - LOAD_ON_USER, LOAD_ON_USERDEBUG) + LOAD_ON_USER, LOAD_ON_USERDEBUG, 0) // A ring buffer on which packet information is pushed. DEFINE_BPF_RINGBUF_EXT(packet_trace_ringbuf, PacketTrace, PACKET_TRACE_BUF_SIZE,