move V+ kernel/arch/bitness checks from BpfHandler to NetBpfLoad
Mainline netbpfload is mandatory on V+, so it matters little whether we perform the checks in it, or in BpfHandler (which runs as part of netd startup via libnetd_updatable.so), and this avoids the need to reimplement isTV() opt-out. Bug: 333970930 Test: TreeHugger Signed-off-by: Maciej Żenczykowski <maze@google.com> Change-Id: I599f2c9d6710f0caa2cd71f0946459d43ddbfc17
This commit is contained in:
parent
d1c52e3eb0
commit
c834fdb760
2 changed files with 17 additions and 26 deletions
|
|
@ -286,22 +286,34 @@ static int doLoad(char** argv, char * const envp[]) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
// both S and T require kernel 4.9 (and eBpf support)
|
||||
if (isAtLeastT && !isAtLeastKernelVersion(4, 9, 0)) {
|
||||
ALOGE("Android T requires kernel 4.9.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// U bumps the kernel requirement up to 4.14
|
||||
if (isAtLeastU && !isAtLeastKernelVersion(4, 14, 0)) {
|
||||
ALOGE("Android U requires kernel 4.14.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// V bumps the kernel requirement up to 4.19
|
||||
// see also: //system/netd/tests/kernel_test.cpp TestKernel419
|
||||
if (isAtLeastV && !isAtLeastKernelVersion(4, 19, 0)) {
|
||||
ALOGE("Android V requires kernel 4.19.");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (isAtLeastV && isX86() && !isKernel64Bit()) {
|
||||
// Technically already required by U, but only enforce on V+
|
||||
// see also: //system/netd/tests/kernel_test.cpp TestKernel64Bit
|
||||
if (isAtLeastV && isKernel32Bit() && isAtLeastKernelVersion(5, 16, 0)) {
|
||||
ALOGE("Android V+ platform with 32 bit kernel version >= 5.16.0 is unsupported");
|
||||
if (!isTV()) return 1;
|
||||
}
|
||||
|
||||
// Various known ABI layout issues, particularly wrt. bpf and ipsec/xfrm.
|
||||
if (isAtLeastV && isKernel32Bit() && isX86()) {
|
||||
ALOGE("Android V requires X86 kernel to be 64-bit.");
|
||||
if (!isTV()) return 1;
|
||||
}
|
||||
|
|
@ -350,6 +362,10 @@ static int doLoad(char** argv, char * const envp[]) {
|
|||
* Some of these have userspace or kernel workarounds/hacks.
|
||||
* Some of them don't...
|
||||
* We're going to be removing the hacks.
|
||||
* (for example "ANDROID: xfrm: remove in_compat_syscall() checks").
|
||||
* Note: this check/enforcement only applies to *system* userspace code,
|
||||
* it does not affect unprivileged apps, the 32-on-64 compatibility
|
||||
* problems are AFAIK limited to various CAP_NET_ADMIN protected interfaces.
|
||||
*
|
||||
* Additionally the 32-bit kernel jit support is poor,
|
||||
* and 32-bit userspace on 64-bit kernel bpf ringbuffer compatibility is broken.
|
||||
|
|
|
|||
|
|
@ -85,31 +85,6 @@ static Status initPrograms(const char* cg2_path) {
|
|||
return Status("U+ platform with kernel version < 4.14.0 is unsupported");
|
||||
}
|
||||
|
||||
if (modules::sdklevel::IsAtLeastV()) {
|
||||
// V bumps the kernel requirement up to 4.19
|
||||
// see also: //system/netd/tests/kernel_test.cpp TestKernel419
|
||||
if (!bpf::isAtLeastKernelVersion(4, 19, 0)) {
|
||||
return Status("V+ platform with kernel version < 4.19.0 is unsupported");
|
||||
}
|
||||
|
||||
// Technically already required by U, but only enforce on V+
|
||||
// see also: //system/netd/tests/kernel_test.cpp TestKernel64Bit
|
||||
if (bpf::isKernel32Bit() && bpf::isAtLeastKernelVersion(5, 16, 0)) {
|
||||
return Status("V+ platform with 32 bit kernel, version >= 5.16.0 is unsupported");
|
||||
}
|
||||
}
|
||||
|
||||
// Linux 6.1 is highest version supported by U, starting with V new kernels,
|
||||
// ie. 6.2+ we are dropping various kernel/system userspace 32-on-64 hacks
|
||||
// (for example "ANDROID: xfrm: remove in_compat_syscall() checks").
|
||||
// Note: this check/enforcement only applies to *system* userspace code,
|
||||
// it does not affect unprivileged apps, the 32-on-64 compatibility
|
||||
// problems are AFAIK limited to various CAP_NET_ADMIN protected interfaces.
|
||||
// see also: //system/bpf/bpfloader/BpfLoader.cpp main()
|
||||
if (bpf::isUserspace32bit() && bpf::isAtLeastKernelVersion(6, 2, 0)) {
|
||||
return Status("32 bit userspace with Kernel version >= 6.2.0 is unsupported");
|
||||
}
|
||||
|
||||
// U mandates this mount point (though it should also be the case on T)
|
||||
if (modules::sdklevel::IsAtLeastU() && !!strcmp(cg2_path, "/sys/fs/cgroup")) {
|
||||
return Status("U+ platform with cg2_path != /sys/fs/cgroup is unsupported");
|
||||
|
|
|
|||
Loading…
Reference in a new issue