bpf: change how we detect device bpf support level
Now that we're developing Android R and we know upgrades
will only be supported from Android P & Q, we no longer
need to check for Android pre-P (ie. O) - so we can remove
that check.
We also take the opportunity to slightly refactor the code
to make it more readable.
Note: it's not appropriate to backport this into any 'normal'
Q branch, since it *will* break 4.9-O devices upgrading to Q
userspace without upgrading the kernel to at least 4.9-P.
Test: builds, atest
Bug: 139501958
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Iacb3c2db489061b3f278d8e971e44dd1a5c4c1e6
diff --git a/libbpf_android/BpfUtils.cpp b/libbpf_android/BpfUtils.cpp
index b3ff108..4a4761b 100644
--- a/libbpf_android/BpfUtils.cpp
+++ b/libbpf_android/BpfUtils.cpp
@@ -265,28 +265,22 @@
int kernel_version_major;
int kernel_version_minor;
- uint64_t api_level = GetUintProperty<uint64_t>("ro.product.first_api_level", 0);
- if (api_level == 0) {
- ALOGE("Cannot determine initial API level of the device");
- api_level = GetUintProperty<uint64_t>("ro.build.version.sdk", 0);
- }
-
- // Check if the device is shipped originally with android P.
- if (api_level < MINIMUM_API_REQUIRED) return BpfLevel::NONE;
-
+ // Check the device kernel version
int ret = uname(&buf);
- if (ret) {
- return BpfLevel::NONE;
- }
+ if (ret) return BpfLevel::NONE;
char dummy;
ret = sscanf(buf.release, "%d.%d%c", &kernel_version_major, &kernel_version_minor, &dummy);
- // Check the device kernel version
if (ret < 2) return BpfLevel::NONE;
- if (kernel_version_major > 4 || (kernel_version_major == 4 && kernel_version_minor >= 14))
+ if (kernel_version_major > 4) // 5.4+ R+
return BpfLevel::EXTENDED;
- if (kernel_version_major == 4 && kernel_version_minor >= 9) return BpfLevel::BASIC;
+ if (kernel_version_major == 4 && kernel_version_minor >= 19) // 4.19 Q+
+ return BpfLevel::EXTENDED;
+ if (kernel_version_major == 4 && kernel_version_minor >= 14) // 4.14 P+
+ return BpfLevel::EXTENDED;
+ if (kernel_version_major == 4 && kernel_version_minor >= 9) // 4.9 P+
+ return BpfLevel::BASIC;
- return BpfLevel::NONE;
+ return BpfLevel::NONE; // 4.4-P
}
} // namespace bpf