LeOS-GSI/patches/LeOS-V/legacy/0001-packages_modules_conec...

202 lines
8.7 KiB
Diff

From f3daae6f1d4aaea8ba6bc7cf64454131e4213c45 Mon Sep 17 00:00:00 2001
From: harvey186 <harvey186@hotmail.com>
Date: Wed, 16 Oct 2024 08:39:51 +0200
Subject: [PATCH] packages_modules_conectivity_legacy
Change-Id: Ib38a920e949092e1f7fcb2d25331c3da7ac8effa
---
.../src/android/net/BpfNetMapsUtils.java | 4 +++
.../android/net/NetworkStackBpfNetMaps.java | 6 ++--
netbpfload/NetBpfLoad.cpp | 36 +++++++++----------
.../src/com/android/server/BpfNetMaps.java | 4 +++
.../native/bpf_headers/include/bpf/BpfMap.h | 3 +-
5 files changed, 29 insertions(+), 24 deletions(-)
diff --git a/framework/src/android/net/BpfNetMapsUtils.java b/framework/src/android/net/BpfNetMapsUtils.java
index 282a11e..a788407 100644
--- a/framework/src/android/net/BpfNetMapsUtils.java
+++ b/framework/src/android/net/BpfNetMapsUtils.java
@@ -212,6 +212,8 @@ public class BpfNetMapsUtils {
public static boolean isChainEnabled(
final IBpfMap<S32, U32> configurationMap, final int chain) {
throwIfPreT("isChainEnabled is not available on pre-T devices");
+
+ if (configurationMap == null) return false;
final long match = getMatchByFirewallChain(chain);
try {
@@ -237,6 +239,8 @@ public class BpfNetMapsUtils {
public static int getUidRule(final IBpfMap<S32, UidOwnerValue> uidOwnerMap,
final int chain, final int uid) {
throwIfPreT("getUidRule is not available on pre-T devices");
+
+ if (uidOwnerMap == null) return FIREWALL_RULE_ALLOW;
final long match = getMatchByFirewallChain(chain);
final boolean isAllowList = isFirewallAllowList(chain);
diff --git a/framework/src/android/net/NetworkStackBpfNetMaps.java b/framework/src/android/net/NetworkStackBpfNetMaps.java
index b7c4e34..750490a 100644
--- a/framework/src/android/net/NetworkStackBpfNetMaps.java
+++ b/framework/src/android/net/NetworkStackBpfNetMaps.java
@@ -97,7 +97,7 @@ public class NetworkStackBpfNetMaps {
return new BpfMap<>(CONFIGURATION_MAP_PATH, BpfMap.BPF_F_RDONLY,
S32.class, U32.class);
} catch (ErrnoException e) {
- throw new IllegalStateException("Cannot open configuration map", e);
+ return null;
}
}
@@ -107,7 +107,7 @@ public class NetworkStackBpfNetMaps {
return new BpfMap<>(UID_OWNER_MAP_PATH, BpfMap.BPF_F_RDONLY,
S32.class, UidOwnerValue.class);
} catch (ErrnoException e) {
- throw new IllegalStateException("Cannot open uid owner map", e);
+ return null;
}
}
@@ -117,7 +117,7 @@ public class NetworkStackBpfNetMaps {
return new BpfMap<>(DATA_SAVER_ENABLED_MAP_PATH, BpfMap.BPF_F_RDONLY, S32.class,
U8.class);
} catch (ErrnoException e) {
- throw new IllegalStateException("Cannot open data saver enabled map", e);
+ return null;
}
}
}
diff --git a/netbpfload/NetBpfLoad.cpp b/netbpfload/NetBpfLoad.cpp
index 8a3fe04..b293a98 100644
--- a/netbpfload/NetBpfLoad.cpp
+++ b/netbpfload/NetBpfLoad.cpp
@@ -282,6 +282,7 @@ static int doLoad(char** argv, char * const envp[]) {
const bool isAtLeastT = (effective_api_level >= __ANDROID_API_T__);
const bool isAtLeastU = (effective_api_level >= __ANDROID_API_U__);
const bool isAtLeastV = (effective_api_level >= __ANDROID_API_V__);
+ bool failed = false;
// last in U QPR2 beta1
const bool has_platform_bpfloader_rc = exists("/system/etc/init/bpfloader.rc");
@@ -320,20 +321,20 @@ static int doLoad(char** argv, char * const envp[]) {
// 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;
+ failed = true;
}
// U bumps the kernel requirement up to 4.14
if (isAtLeastU && !isAtLeastKernelVersion(4, 14, 0)) {
ALOGE("Android U requires kernel 4.14.");
- return 1;
+ failed = true;
}
// 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;
+ failed = true;
}
// Technically already required by U, but only enforce on V+
@@ -402,14 +403,14 @@ static int doLoad(char** argv, char * const envp[]) {
* and 32-bit userspace on 64-bit kernel bpf ringbuffer compatibility is broken.
*/
ALOGE("64-bit userspace required on 6.2+ kernels.");
- if (!isTV()) return 1;
+ failed = true;
}
// Ensure we can determine the Android build type.
if (!isEng() && !isUser() && !isUserdebug()) {
ALOGE("Failed to determine the build type: got %s, want 'eng', 'user', or 'userdebug'",
getBuildType().c_str());
- return 1;
+ failed = true;
}
if (runningAsRoot) {
@@ -447,7 +448,9 @@ static int doLoad(char** argv, char * const envp[]) {
// which could otherwise fail with ENOENT during object pinning or renaming,
// due to ordering issues)
for (const auto& location : locations) {
- if (createSysFsBpfSubDir(location.prefix)) return 1;
+ if (createSysFsBpfSubDir(location.prefix)) {
+ failed = true;
+ }
}
// Note: there's no actual src dir for fs_bpf_loader .o's,
@@ -460,23 +463,16 @@ static int doLoad(char** argv, char * const envp[]) {
// Load all ELF objects, create programs and maps, and pin them
for (const auto& location : locations) {
if (loadAllElfObjects(bpfloader_ver, location) != 0) {
- ALOGE("=== CRITICAL FAILURE LOADING BPF PROGRAMS FROM %s ===", location.dir);
- ALOGE("If this triggers reliably, you're probably missing kernel options or patches.");
- ALOGE("If this triggers randomly, you might be hitting some memory allocation "
- "problems or startup script race.");
- ALOGE("--- DO NOT EXPECT SYSTEM TO BOOT SUCCESSFULLY ---");
- sleep(20);
- return 2;
+ failed = true;
}
}
- int key = 1;
- int value = 123;
- base::unique_fd map(
- createMap(BPF_MAP_TYPE_ARRAY, sizeof(key), sizeof(value), 2, 0));
- if (writeToMapEntry(map, &key, &value, BPF_ANY)) {
- ALOGE("Critical kernel bug - failure to write into index 1 of 2 element bpf map array.");
- return 1;
+ if (failed) {
+ ALOGE("=== CRITICAL FAILURE LOADING BPF PROGRAMS ===");
+ ALOGE("If this triggers reliably, you're probably missing kernel options or patches.");
+ ALOGE("If this triggers randomly, you might be hitting some memory allocation "
+ "problems or startup script race.");
+ ALOGE("--- DO NOT EXPECT SYSTEM TO BOOT SUCCESSFULLY ---");
}
// leave a flag that we're done
diff --git a/service/src/com/android/server/BpfNetMaps.java b/service/src/com/android/server/BpfNetMaps.java
index b3e7d8c..58160ff 100644
--- a/service/src/com/android/server/BpfNetMaps.java
+++ b/service/src/com/android/server/BpfNetMaps.java
@@ -745,6 +745,8 @@ public class BpfNetMaps {
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
public void swapActiveStatsMap() {
throwIfPreT("swapActiveStatsMap is not available on pre-T devices");
+
+ if (sConfigurationMap == null) return;
try {
synchronized (sCurrentStatsMapConfigLock) {
@@ -786,6 +788,8 @@ public class BpfNetMaps {
return;
}
+ if (sUidPermissionMap == null) return;
+
// Remove the entry if package is uninstalled or uid has only INTERNET permission.
if (permissions == PERMISSION_UNINSTALLED || permissions == PERMISSION_INTERNET) {
for (final int uid : uids) {
diff --git a/staticlibs/native/bpf_headers/include/bpf/BpfMap.h b/staticlibs/native/bpf_headers/include/bpf/BpfMap.h
index 1037beb..c70f90b 100644
--- a/staticlibs/native/bpf_headers/include/bpf/BpfMap.h
+++ b/staticlibs/native/bpf_headers/include/bpf/BpfMap.h
@@ -65,7 +65,8 @@ class BpfMapRO {
int flags = bpfGetFdMapFlags(mMapFd);
if (flags < 0) abort();
if (flags & BPF_F_WRONLY) abort();
- if (writable && (flags & BPF_F_RDONLY)) abort();
+ (void) writable;
+// if (writable && (flags & BPF_F_RDONLY)) abort();
if (bpfGetFdKeySize(mMapFd) != sizeof(Key)) abort();
if (bpfGetFdValueSize(mMapFd) != sizeof(Value)) abort();
}
--
2.34.1