Merge "Rename time_in_state.o to timeInState.o"
diff --git a/libbpf_android/TEST_MAPPING b/TEST_MAPPING
similarity index 64%
rename from libbpf_android/TEST_MAPPING
rename to TEST_MAPPING
index b6a940b..6a65edc 100644
--- a/libbpf_android/TEST_MAPPING
+++ b/TEST_MAPPING
@@ -8,5 +8,10 @@
{
"name": "libbpf_load_test"
}
+ ],
+ "imports": [
+ {
+ "path": "packages/modules/Connectivity"
+ }
]
}
diff --git a/bpfloader/BpfLoader.cpp b/bpfloader/BpfLoader.cpp
index 64e4de3..b8dd504 100644
--- a/bpfloader/BpfLoader.cpp
+++ b/bpfloader/BpfLoader.cpp
@@ -54,6 +54,30 @@
using android::bpf::domain;
using std::string;
+bool exists(const char* const path) {
+ int v = access(path, F_OK);
+ if (!v) {
+ ALOGI("%s exists.", path);
+ return true;
+ }
+ if (errno == ENOENT) return false;
+ ALOGE("FATAL: access(%s, F_OK) -> %d [%d:%s]", path, v, errno, strerror(errno));
+ abort(); // can only hit this if permissions (likely selinux) are screwed up
+}
+
+bool isInProcessTethering() {
+ bool in = exists("/apex/com.android.tethering/etc/flag/in-process");
+ bool out = exists("/apex/com.android.tethering/etc/flag/out-of-process");
+ if (in && out) abort(); // bad build
+
+ // Handle cases where the module explicitly tells us
+ if (in) return true;
+ if (out) return false;
+
+ ALOGE("FATAL: cannot determine if Tethering is in or out of process.");
+ abort();
+}
+
constexpr unsigned long long kTetheringApexDomainBitmask =
domainToBitmask(domain::tethering) |
domainToBitmask(domain::net_private) |
@@ -203,7 +227,7 @@
errno = 0;
int ret = mkdir(s.c_str(), S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO);
if (ret && errno != EEXIST) {
- ALOGW("Failed to create directory: %s, ret: %s", s.c_str(), std::strerror(errno));
+ ALOGE("Failed to create directory: %s, ret: %s", s.c_str(), std::strerror(errno));
}
umask(prevUmask);
@@ -214,6 +238,21 @@
(void)argc;
android::base::InitLogging(argv, &android::base::KernelLogger);
+ // This is ugly... but this allows InProcessTethering which runs as system_server,
+ // instead of as network_stack to access /sys/fs/bpf/tethering, which would otherwise
+ // (due to genfscon rules) have fs_bpf_tethering selinux context, which is restricted
+ // to the network_stack process only (which is where out of process tethering runs)
+ if (isInProcessTethering() && !exists("/sys/fs/bpf/tethering")) {
+ createSysFsBpfSubDir(/* /sys/fs/bpf/ */ "net_shared");
+ createSysFsBpfSubDir(/* /sys/fs/bpf/ */ "net_shared/tethering");
+
+ /* /sys/fs/bpf/tethering -> net_shared/tethering */
+ if (symlink("net_shared/tethering", "/sys/fs/bpf/tethering")) {
+ ALOGE("symlink(net_shared/tethering, /sys/fs/bpf/tethering) -> %s", strerror(errno));
+ return 1;
+ }
+ }
+
// Create all the pin subdirectories
// (this must be done first to allow selinux_context and pin_subdir functionality,
// which could otherwise fail with ENOENT during object pinning or renaming,
diff --git a/libbpf_android/Loader.cpp b/libbpf_android/Loader.cpp
index 859d1c5..ad20176 100644
--- a/libbpf_android/Loader.cpp
+++ b/libbpf_android/Loader.cpp
@@ -30,9 +30,9 @@
#include <sys/wait.h>
#include <unistd.h>
-// This is BpfLoader v0.25
+// This is BpfLoader v0.27
#define BPFLOADER_VERSION_MAJOR 0u
-#define BPFLOADER_VERSION_MINOR 25u
+#define BPFLOADER_VERSION_MINOR 27u
#define BPFLOADER_VERSION ((BPFLOADER_VERSION_MAJOR << 16) | BPFLOADER_VERSION_MINOR)
#include "bpf/BpfUtils.h"
@@ -1078,7 +1078,7 @@
for (const auto& line : lines) ALOGW("%s", line.c_str());
ALOGW("bpf_prog_load - END log_buf contents.");
- if (cs[i].prog_def->optional) {
+ if (cs[i].prog_def.has_value() && cs[i].prog_def->optional) {
ALOGW("failed program is marked optional - continuing...");
continue;
}