diff --git a/bpf/loader/NetBpfLoad.cpp b/bpf/loader/NetBpfLoad.cpp index ac0b5a81d5..29c6042709 100644 --- a/bpf/loader/NetBpfLoad.cpp +++ b/bpf/loader/NetBpfLoad.cpp @@ -1005,7 +1005,7 @@ static int pinProg(const borrowed_fd& fd, const struct bpf_prog_def& progDef, return 0; } -static int validateProg(const borrowed_fd& fd, string& progPinLoc, +static int validateProg(const borrowed_fd& fd, const char* const progPinLoc, const unsigned int bpfloader_ver) { if (!isAtLeastKernelVersion(4, 14, 0)) { return 0; @@ -1030,10 +1030,10 @@ static int validateProg(const borrowed_fd& fd, string& progPinLoc, ALOGE("bpfGetFdXlatProgLen failed, ret: %d", err); return -err; } - ALOGI("prog %s id %d len jit:%d xlat:%d", progPinLoc.c_str(), progId, jitLen, xlatLen); + ALOGI("prog %s id %d len jit:%d xlat:%d", progPinLoc, progId, jitLen, xlatLen); if (!jitLen && bpfloader_ver >= BPFLOADER_MAINLINE_25Q2_VERSION) { - ALOGE("Kernel eBPF JIT failure for %s", progPinLoc.c_str()); + ALOGE("Kernel eBPF JIT failure for %s", progPinLoc); return -ENOTSUP; } return 0; @@ -1079,10 +1079,9 @@ static int loadCodeSections(ElfObject& elfObj, vector& cs, const st name = name.substr(0, name.find_last_of('$')); bool reuse = false; - string progPinLoc = string(cs[i].prog_def->pin_prefix) + name; - if (access(progPinLoc.c_str(), F_OK) == 0) { - fd.reset(retrieveProgram(progPinLoc.c_str())); - ALOGD("New bpf prog load reusing prog %s, ret: %d (%s)", progPinLoc.c_str(), fd.get(), + if (access(cs[i].prog_def->pin_location, F_OK) == 0) { + fd.reset(retrieveProgram(cs[i].prog_def->pin_location)); + ALOGD("New bpf prog load reusing prog %s, ret: %d (%s)", cs[i].prog_def->pin_location, fd.get(), !fd.ok() ? std::strerror(errno) : "ok"); reuse = true; } else { @@ -1137,10 +1136,10 @@ static int loadCodeSections(ElfObject& elfObj, vector& cs, const st if (!fd.ok()) return fd.get(); if (!reuse) { - ret = pinProg(fd, cs[i].prog_def.value(), progPinLoc); + ret = pinProg(fd, cs[i].prog_def.value(), cs[i].prog_def->pin_location); if (ret) return ret; } - ret = validateProg(fd, progPinLoc, bpfloader_ver); + ret = validateProg(fd, cs[i].prog_def->pin_location, bpfloader_ver); if (ret) return ret; } @@ -1269,17 +1268,16 @@ static int pinProgs(const struct bpf_object * obj, string name = cs[i].name; name = name.substr(0, name.find_last_of('$')); - string progPinLoc = string(cs[i].prog_def->pin_prefix) + name; - if (access(progPinLoc.c_str(), F_OK) == 0) { + if (access(cs[i].prog_def->pin_location, F_OK) == 0) { // TODO: Skip loading lower priority program ALOGI("Higher priority program is already pinned, skip pinning %s", cs[i].name.c_str()); continue; } int fd = bpf_program__fd(prog); - ret = pinProg(fd, cs[i].prog_def.value(), progPinLoc); + ret = pinProg(fd, cs[i].prog_def.value(), cs[i].prog_def->pin_location); if (ret) return ret; - ret = validateProg(fd, progPinLoc, bpfloader_ver); + ret = validateProg(fd, cs[i].prog_def->pin_location, bpfloader_ver); if (ret) return ret; } return 0; diff --git a/bpf/progs/include/bpf_helpers.h b/bpf/progs/include/bpf_helpers.h index b200960faf..4a2ad1454e 100644 --- a/bpf/progs/include/bpf_helpers.h +++ b/bpf/progs/include/bpf_helpers.h @@ -244,26 +244,26 @@ static long (*bpf_sk_storage_delete_unsafe) (const void* sk_storage, type == BPF_MAP_TYPE_SK_STORAGE) ? BPF_F_NO_PREALLOC : 0) \ ) -#define DEFINE_BPF_MAP_BASE(the_map, TYPE, keysize, valuesize, num_entries, usr, grp, md, \ - selinux, pindir, minkver, maxkver, minloader, maxloader, mapflags) \ - VALIDATE_SELINUX_CONTEXT(minloader, selinux); \ - VALIDATE_PIN_DIR(minloader, pindir); \ - const struct bpf_map_def SECTION(".android_maps") the_map##_def = { \ - .type = BPF_MAP_TYPE_##TYPE, \ - .key_size = (keysize), \ - .value_size = (valuesize), \ - .max_entries = ABSOLUTE(num_entries), \ - .map_flags = DEFAULT_BPF_MAP_FLAGS(BPF_MAP_TYPE_##TYPE, num_entries, mapflags), \ - .uid = (usr), \ - .gid = (grp), \ - .mode = (md), \ - .bpfloader_min_ver = (minloader), \ - .bpfloader_max_ver = (maxloader), \ - .min_kver = (minkver).kver, \ - .max_kver = (maxkver).kver, \ - .create_location = CREATE_LOCATION(selinux), \ - .pin_location = "/sys/fs/bpf/" pindir "/map_" BPF_OBJ_NAME "_" #the_map, \ - .name_idx = __builtin_strlen("/sys/fs/bpf/" pindir "/map_" BPF_OBJ_NAME "_"), \ +#define DEFINE_BPF_MAP_BASE(the_map, TYPE, keysize, valuesize, num_entries, usr, grp, md, \ + selinux, pindir, minkver, maxkver, minloader, maxloader, mapflags) \ + VALIDATE_SELINUX_CONTEXT(minloader, selinux); \ + VALIDATE_PIN_DIR(minloader, pindir); \ + const struct bpf_map_def SECTION(".android_maps") the_map##_def = { \ + .type = BPF_MAP_TYPE_##TYPE, \ + .key_size = (keysize), \ + .value_size = (valuesize), \ + .max_entries = ABSOLUTE(num_entries), \ + .map_flags = DEFAULT_BPF_MAP_FLAGS(BPF_MAP_TYPE_##TYPE, num_entries, mapflags), \ + .uid = (usr), \ + .gid = (grp), \ + .mode = (md), \ + .bpfloader_min_ver = (minloader), \ + .bpfloader_max_ver = (maxloader), \ + .min_kver = (minkver).kver, \ + .max_kver = (maxkver).kver, \ + .create_location = CREATE_LOCATION(selinux), \ + .pin_location = "/sys/fs/bpf/" pindir "/map_" BPF_OBJ_NAME "_" #the_map "\0", \ + .name_idx = __builtin_strlen("/sys/fs/bpf/" pindir "/map_" BPF_OBJ_NAME "_"), \ }; #define __uint(name, val) int (*name)[val] @@ -531,24 +531,24 @@ static long (*bpf_trace_printk)(const char* fmt, int fmt_size, ...) = (void*) BP #define BPF_PROG_ATTACH_TYPE_sysctl BPF_CGROUP_SYSCTL #define BPF_PROG_ATTACH_TYPE_xdp BPF_PROG_ATTACH_TYPE_DEFAULT -#define DEFINE_BPF_PROG_EXT(TYPE, NAME, VER, prog_uid, prog_gid, min_kv, max_kv, \ - min_loader, max_loader, opt, selinux, pindir) \ - VALIDATE_SELINUX_CONTEXT(min_loader, selinux); \ - VALIDATE_PIN_DIR(min_loader, pindir); \ - const struct bpf_prog_def SECTION(".android_progs") TYPE##_##NAME##_##VER##_def = { \ - .type = BPF_PROG_TYPE_##TYPE, \ - .attach_type = BPF_PROG_ATTACH_TYPE_##TYPE, \ - .uid = (prog_uid), \ - .gid = (prog_gid), \ - .min_kver = (min_kv).kver, \ - .max_kver = (max_kv).kver, \ - .optional = (opt).optional, \ - .bpfloader_min_ver = (min_loader), \ - .bpfloader_max_ver = (max_loader), \ - .create_location = CREATE_LOCATION(selinux), \ - .pin_prefix = "/sys/fs/bpf/" pindir "/prog_" BPF_OBJ_NAME "_", \ - }; \ - SECTION(#TYPE "/" #NAME "$" #VER) \ +#define DEFINE_BPF_PROG_EXT(TYPE, NAME, VER, prog_uid, prog_gid, min_kv, max_kv, \ + min_loader, max_loader, opt, selinux, pindir) \ + VALIDATE_SELINUX_CONTEXT(min_loader, selinux); \ + VALIDATE_PIN_DIR(min_loader, pindir); \ + const struct bpf_prog_def SECTION(".android_progs") TYPE##_##NAME##_##VER##_def = { \ + .type = BPF_PROG_TYPE_##TYPE, \ + .attach_type = BPF_PROG_ATTACH_TYPE_##TYPE, \ + .uid = (prog_uid), \ + .gid = (prog_gid), \ + .min_kver = (min_kv).kver, \ + .max_kver = (max_kv).kver, \ + .optional = (opt).optional, \ + .bpfloader_min_ver = (min_loader), \ + .bpfloader_max_ver = (max_loader), \ + .create_location = CREATE_LOCATION(selinux), \ + .pin_location = "/sys/fs/bpf/" pindir "/prog_" BPF_OBJ_NAME "_" #TYPE "_" #NAME "\0", \ + }; \ + SECTION(#TYPE "/" #NAME "$" #VER) \ long TYPE##_##NAME##_##VER #define DEFINE_BPF_PROG_KVER_RANGE_OPT(TYPE, NAME, VER, prog_uid, prog_gid, min_kv, max_kv, \ diff --git a/bpf/progs/include/bpf_map_def.h b/bpf/progs/include/bpf_map_def.h index 5a92765a06..f3e04b8da7 100644 --- a/bpf/progs/include/bpf_map_def.h +++ b/bpf/progs/include/bpf_map_def.h @@ -109,7 +109,7 @@ struct optional_bool { bool optional; }; // Length of strings (incl. selinux_context and pin_subdir) // in the bpf_map_def and bpf_prog_def structs. -#define BPF_DEF_CHAR_ARRAY_SIZE 66 // must be even for alignment sanity +#define BPF_DEF_CHAR_ARRAY_SIZE 70 // must be even for alignment sanity /* * Map structure to be used by Android eBPF C programs. The Android eBPF loader @@ -185,7 +185,7 @@ struct bpf_prog_def { unsigned int bpfloader_max_ver; char create_location[BPF_DEF_CHAR_ARRAY_SIZE]; - char pin_prefix[BPF_DEF_CHAR_ARRAY_SIZE]; + char pin_location[BPF_DEF_CHAR_ARRAY_SIZE]; }; // This needs to be updated whenever the above structure definition is expanded.