diff options
author | Maciej Żenczykowski <maze@google.com> | 2021-07-05 15:20:34 -0700 |
---|---|---|
committer | Maciej Żenczykowski <maze@google.com> | 2021-07-05 18:02:16 -0700 |
commit | 36c53ba91e54ac2786aa2bd4865970dc42dbe04d (patch) | |
tree | 3a8021a617e59df89614369eed5ea479ae040794 /libbpf_android | |
parent | df91d2b5b265849eb59fea3721a0d68f4f77edfe (diff) | |
download | bpf-36c53ba91e54ac2786aa2bd4865970dc42dbe04d.tar.gz |
bpf - struct bpf_map_def - add min/max kernel version.
This is also bpfloader v0.2.
Some newer map types (for example DEVMAP) are unusable
on older kernel versions.
Bug: 190519702
Test: atest, TreeHugger
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: I085cc723ff1c19d8acc8972a391f894e16dd1875
Diffstat (limited to 'libbpf_android')
-rw-r--r-- | libbpf_android/Loader.cpp | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/libbpf_android/Loader.cpp b/libbpf_android/Loader.cpp index b1af34f..aa1f3c0 100644 --- a/libbpf_android/Loader.cpp +++ b/libbpf_android/Loader.cpp @@ -28,10 +28,9 @@ #include <sys/utsname.h> #include <unistd.h> -// This is BpfLoader 0.1, we need to define this prior to including bpf_map_def.h -// to get the 0.1 struct definitions +// This is BpfLoader v0.2 #define BPFLOADER_VERSION_MAJOR 0u -#define BPFLOADER_VERSION_MINOR 1u +#define BPFLOADER_VERSION_MINOR 2u #define BPFLOADER_VERSION ((BPFLOADER_VERSION_MAJOR << 16) | BPFLOADER_VERSION_MINOR) #include "../progs/include/bpf_map_def.h" @@ -494,6 +493,7 @@ static int createMaps(const char* elfPath, ifstream& elfFile, vector<unique_fd>& memset(&m, 0, sizeof(m)); // Then we set non-zero defaults m.bpfloader_max_ver = DEFAULT_BPFLOADER_MAX_VER; // v1.0 + m.max_kver = 0xFFFFFFFFu; // matches KVER_INF from bpf_helpers.h // Then we copy over the structure prefix from the ELF file. memcpy(&m, dataPtr, trimmedSize); // Move to next struct in the ELF file @@ -503,14 +503,9 @@ static int createMaps(const char* elfPath, ifstream& elfFile, vector<unique_fd>& ret = getSectionSymNames(elfFile, "maps", mapNames); if (ret) return ret; - for (int i = 0; i < (int)mapNames.size(); i++) { - unique_fd fd; - int saved_errno; - // Format of pin location is /sys/fs/bpf/<prefix>map_<filename>_<mapname> - string mapPinLoc = - string(BPF_FS_PATH) + prefix + "map_" + fname + "_" + string(mapNames[i]); - bool reuse = false; + unsigned kvers = kernelVersion(); + for (int i = 0; i < (int)mapNames.size(); i++) { if (BPFLOADER_VERSION < md[i].bpfloader_min_ver) { ALOGI("skipping map %s which requires bpfloader min ver 0x%05x\n", mapNames[i].c_str(), md[i].bpfloader_min_ver); @@ -525,6 +520,27 @@ static int createMaps(const char* elfPath, ifstream& elfFile, vector<unique_fd>& continue; } + if (kvers < md[i].min_kver) { + ALOGI("skipping map %s which requires kernel version 0x%x >= 0x%x\n", + mapNames[i].c_str(), kvers, md[i].min_kver); + mapFds.push_back(unique_fd()); + continue; + } + + if (kvers >= md[i].max_kver) { + ALOGI("skipping map %s which requires kernel version 0x%x < 0x%x\n", + mapNames[i].c_str(), kvers, md[i].max_kver); + mapFds.push_back(unique_fd()); + continue; + } + + // Format of pin location is /sys/fs/bpf/<prefix>map_<filename>_<mapname> + string mapPinLoc = + string(BPF_FS_PATH) + prefix + "map_" + fname + "_" + string(mapNames[i]); + bool reuse = false; + unique_fd fd; + int saved_errno; + if (access(mapPinLoc.c_str(), F_OK) == 0) { fd.reset(bpf_obj_get(mapPinLoc.c_str())); saved_errno = errno; |