diff --git a/Tethering/apex/Android.bp b/Tethering/apex/Android.bp index de9017ae57..c5d3a94302 100644 --- a/Tethering/apex/Android.bp +++ b/Tethering/apex/Android.bp @@ -117,8 +117,9 @@ apex { "ServiceConnectivityResources", ], prebuilts: [ - "ot-daemon.init.34rc", "current_sdkinfo", + "netbpfload.mainline.rc", + "ot-daemon.init.34rc", ], manifest: "manifest.json", key: "com.android.tethering.key", diff --git a/netbpfload/Android.bp b/netbpfload/Android.bp index 1f92374b83..69bbf12b36 100644 --- a/netbpfload/Android.bp +++ b/netbpfload/Android.bp @@ -49,3 +49,16 @@ cc_binary { init_rc: ["netbpfload.rc"], required: ["bpfloader"], } + +// Versioned netbpfload init rc: init system will process it only on api V/35+ devices +// (TODO: consider reducing to T/33+ - adjust the comment up above in line 43 as well) +// Note: S[31] Sv2[32] T[33] U[34] V[35]) +// +// For details of versioned rc files see: +// https://android.googlesource.com/platform/system/core/+/HEAD/init/README.md#versioned-rc-files-within-apexs +prebuilt_etc { + name: "netbpfload.mainline.rc", + src: "netbpfload.mainline.rc", + filename: "netbpfload.35rc", + installable: false, +} diff --git a/netbpfload/NetBpfLoad.cpp b/netbpfload/NetBpfLoad.cpp index 6152287e45..cbd14ec7e5 100644 --- a/netbpfload/NetBpfLoad.cpp +++ b/netbpfload/NetBpfLoad.cpp @@ -173,11 +173,40 @@ int main(int argc, char** argv, char * const envp[]) { (void)argc; android::base::InitLogging(argv, &android::base::KernelLogger); - const int device_api_level = android_get_device_api_level(); - const bool isAtLeastU = (device_api_level >= __ANDROID_API_U__); + ALOGI("NetBpfLoad '%s' starting...", argv[0]); - if (!android::bpf::isAtLeastKernelVersion(4, 19, 0)) { - ALOGE("Android U QPR2 requires kernel 4.19."); + // true iff we are running from the module + const bool is_mainline = !strcmp(argv[0], "/apex/com.android.tethering/bin/netbpfload"); + + // true iff we are running from the platform + const bool is_platform = !strcmp(argv[0], "/system/bin/netbpfload"); + + const int device_api_level = android_get_device_api_level(); + const bool isAtLeastT = (device_api_level >= __ANDROID_API_T__); + const bool isAtLeastU = (device_api_level >= __ANDROID_API_U__); + const bool isAtLeastV = (device_api_level >= __ANDROID_API_V__); + + ALOGI("NetBpfLoad api:%d/%d kver:%07x platform:%d mainline:%d", + android_get_application_target_sdk_version(), device_api_level, + android::bpf::kernelVersion(), is_platform, is_mainline); + + if (!is_platform && !is_mainline) { + ALOGE("Unable to determine if we're platform or mainline netbpfload."); + return 1; + } + + if (isAtLeastT && !android::bpf::isAtLeastKernelVersion(4, 9, 0)) { + ALOGE("Android T requires kernel 4.9."); + return 1; + } + + if (isAtLeastU && !android::bpf::isAtLeastKernelVersion(4, 14, 0)) { + ALOGE("Android U requires kernel 4.14."); + return 1; + } + + if (isAtLeastV && !android::bpf::isAtLeastKernelVersion(4, 19, 0)) { + ALOGE("Android V requires kernel 4.19."); return 1; } diff --git a/netbpfload/netbpfload.mainline.rc b/netbpfload/netbpfload.mainline.rc new file mode 100644 index 0000000000..0ac5de8b97 --- /dev/null +++ b/netbpfload/netbpfload.mainline.rc @@ -0,0 +1,8 @@ +service bpfloader /apex/com.android.tethering/bin/netbpfload + capabilities CHOWN SYS_ADMIN NET_ADMIN + group root graphics network_stack net_admin net_bw_acct net_bw_stats net_raw system + user root + rlimit memlock 1073741824 1073741824 + oneshot + reboot_on_failure reboot,bpfloader-failed + override