From 11141da6239c1b99300f65d6f742dcccce4841fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20=C5=BBenczykowski?= Date: Fri, 15 Mar 2024 18:21:33 -0700 Subject: [PATCH] NetBpfLoad: enable mainline on T+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Note: 2 == BPFLOADER_S_VERSION 19 == BPFLOADER_T_VERSION 25 == BPFLOADER_OBJ_AT_VER_VERSION 33 == BPFLOADER_IGNORED_ON_VERSION 37 == BPFLOADER_U_VERSION [*] 41 == BPFLOADER_V_VERSION [**] and currently we have: 42 == BPFLOADER_MAINLINE_VERSION 43 == BPFLOADER_MAINLINE_T_VERSION 44 == BPFLOADER_MAINLINE_U_VERSION 45 == BPFLOADER_MAINLINE_V_VERSION [*] udc-dev/udc-release are actually 38, as 37 was some earlier udc beta2 (2.1 ifirc), and beta3+ switched to 38 [**] 24Q{1,2}-release (ie. U QPR2+) are technically actually 41, but their platform bpfloader no longer even looks in /apex/com.android.tethering/etc/bpf/... so it doesn't really matter (although 24Q1's platform netbpfload still does, however that is obsoleted by this change) Thus we need to (as minimum for NetBpfLoad): BPFLOADER_T_VERSION -> BPFLOADER_MAINLINE_T_VERSION BPFLOADER_IGNORED_ON_VERSION -> BPFLOADER_MAINLINE_U_VERSION to cause these to load appropriately from mainline. One would perhaps also expect (as minimum for NetBpfLoad): BPFLOADER_OBJ_AT_VERSION -> BPFLOADER_MAINLINE_U_VERSION but (as maximum for platform bpfloader): BPFLOADER_OBJ_AT_VERSION -> BPFLOADER_MAINLINE_U_VERSION However, since the goal is actually for those to load via mainline on T+, (with the 'old' version of the .o's loading on S via platform bpfloader) thus one actually needs (as minimum for NetBpfLoad): BPFLOADER_OBJ_AT_VERSION -> BPFLOADER_MAINLINE_T_VERSION and (as maximum for platform bpfloader): BPFLOADER_OBJ_AT_VERSION -> BPFLOADER_T_VERSION Test: TreeHugger Signed-off-by: Maciej Żenczykowski Change-Id: I4b688692ffca0db7ead20cefd9e7e892ca92c70a --- bpf_progs/block.c | 4 ++-- bpf_progs/clatd.c | 4 ++-- bpf_progs/dscpPolicy.c | 4 ++-- bpf_progs/netd.c | 16 ++++++++-------- bpf_progs/offload.c | 4 ++-- bpf_progs/test.c | 4 ++-- netbpfload/NetBpfLoad.cpp | 7 ++++--- .../native/bpf_headers/include/bpf/bpf_helpers.h | 6 +++--- 8 files changed, 25 insertions(+), 24 deletions(-) diff --git a/bpf_progs/block.c b/bpf_progs/block.c index 0a2b0b8728..152dda64a9 100644 --- a/bpf_progs/block.c +++ b/bpf_progs/block.c @@ -19,8 +19,8 @@ #include #include -// The resulting .o needs to load on the Android T bpfloader -#define BPFLOADER_MIN_VER BPFLOADER_T_VERSION +// The resulting .o needs to load on Android T+ +#define BPFLOADER_MIN_VER BPFLOADER_MAINLINE_T_VERSION #include "bpf_helpers.h" diff --git a/bpf_progs/clatd.c b/bpf_progs/clatd.c index addb02fe8b..e515b41650 100644 --- a/bpf_progs/clatd.c +++ b/bpf_progs/clatd.c @@ -30,8 +30,8 @@ #define __kernel_udphdr udphdr #include -// The resulting .o needs to load on the Android T bpfloader -#define BPFLOADER_MIN_VER BPFLOADER_T_VERSION +// The resulting .o needs to load on Android T+ +#define BPFLOADER_MIN_VER BPFLOADER_MAINLINE_T_VERSION #include "bpf_helpers.h" #include "bpf_net_helpers.h" diff --git a/bpf_progs/dscpPolicy.c b/bpf_progs/dscpPolicy.c index e845a699e9..ed114e4fbd 100644 --- a/bpf_progs/dscpPolicy.c +++ b/bpf_progs/dscpPolicy.c @@ -27,8 +27,8 @@ #include #include -// The resulting .o needs to load on the Android T bpfloader -#define BPFLOADER_MIN_VER BPFLOADER_T_VERSION +// The resulting .o needs to load on Android T+ +#define BPFLOADER_MIN_VER BPFLOADER_MAINLINE_T_VERSION #include "bpf_helpers.h" #include "dscpPolicy.h" diff --git a/bpf_progs/netd.c b/bpf_progs/netd.c index 5e401aa745..dfc769917a 100644 --- a/bpf_progs/netd.c +++ b/bpf_progs/netd.c @@ -14,8 +14,8 @@ * limitations under the License. */ -// The resulting .o needs to load on the Android T bpfloader -#define BPFLOADER_MIN_VER BPFLOADER_T_VERSION +// The resulting .o needs to load on Android T+ +#define BPFLOADER_MIN_VER BPFLOADER_MAINLINE_T_VERSION #include #include @@ -103,13 +103,13 @@ DEFINE_BPF_MAP_NO_NETD(iface_index_name_map, HASH, uint32_t, IfaceValue, IFACE_I // A single-element configuration array, packet tracing is enabled when 'true'. DEFINE_BPF_MAP_EXT(packet_trace_enabled_map, ARRAY, uint32_t, bool, 1, AID_ROOT, AID_SYSTEM, 0060, "fs_bpf_net_shared", "", PRIVATE, - BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, LOAD_ON_ENG, + BPFLOADER_MAINLINE_U_VERSION, BPFLOADER_MAX_VER, LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG) // A ring buffer on which packet information is pushed. DEFINE_BPF_RINGBUF_EXT(packet_trace_ringbuf, PacketTrace, PACKET_TRACE_BUF_SIZE, AID_ROOT, AID_SYSTEM, 0060, "fs_bpf_net_shared", "", PRIVATE, - BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, LOAD_ON_ENG, + BPFLOADER_MAINLINE_U_VERSION, BPFLOADER_MAX_VER, LOAD_ON_ENG, LOAD_ON_USER, LOAD_ON_USERDEBUG); DEFINE_BPF_MAP_RO_NETD(data_saver_enabled_map, ARRAY, uint32_t, bool, @@ -516,7 +516,7 @@ static __always_inline inline int bpf_traffic_account(struct __sk_buff* skb, // This program is optional, and enables tracing on Android U+, 5.8+ on user builds. DEFINE_BPF_PROG_EXT("cgroupskb/ingress/stats$trace_user", AID_ROOT, AID_SYSTEM, bpf_cgroup_ingress_trace_user, KVER_5_8, KVER_INF, - BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, OPTIONAL, + BPFLOADER_MAINLINE_U_VERSION, BPFLOADER_MAX_VER, OPTIONAL, "fs_bpf_netd_readonly", "", IGNORE_ON_ENG, LOAD_ON_USER, IGNORE_ON_USERDEBUG) (struct __sk_buff* skb) { @@ -526,7 +526,7 @@ DEFINE_BPF_PROG_EXT("cgroupskb/ingress/stats$trace_user", AID_ROOT, AID_SYSTEM, // This program is required, and enables tracing on Android U+, 5.8+, userdebug/eng. DEFINE_BPF_PROG_EXT("cgroupskb/ingress/stats$trace", AID_ROOT, AID_SYSTEM, bpf_cgroup_ingress_trace, KVER_5_8, KVER_INF, - BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, MANDATORY, + BPFLOADER_MAINLINE_U_VERSION, BPFLOADER_MAX_VER, MANDATORY, "fs_bpf_netd_readonly", "", LOAD_ON_ENG, IGNORE_ON_USER, LOAD_ON_USERDEBUG) (struct __sk_buff* skb) { @@ -548,7 +548,7 @@ DEFINE_NETD_BPF_PROG_KVER_RANGE("cgroupskb/ingress/stats$4_14", AID_ROOT, AID_SY // This program is optional, and enables tracing on Android U+, 5.8+ on user builds. DEFINE_BPF_PROG_EXT("cgroupskb/egress/stats$trace_user", AID_ROOT, AID_SYSTEM, bpf_cgroup_egress_trace_user, KVER_5_8, KVER_INF, - BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, OPTIONAL, + BPFLOADER_MAINLINE_U_VERSION, BPFLOADER_MAX_VER, OPTIONAL, "fs_bpf_netd_readonly", "", IGNORE_ON_ENG, LOAD_ON_USER, IGNORE_ON_USERDEBUG) (struct __sk_buff* skb) { @@ -558,7 +558,7 @@ DEFINE_BPF_PROG_EXT("cgroupskb/egress/stats$trace_user", AID_ROOT, AID_SYSTEM, // This program is required, and enables tracing on Android U+, 5.8+, userdebug/eng. DEFINE_BPF_PROG_EXT("cgroupskb/egress/stats$trace", AID_ROOT, AID_SYSTEM, bpf_cgroup_egress_trace, KVER_5_8, KVER_INF, - BPFLOADER_IGNORED_ON_VERSION, BPFLOADER_MAX_VER, MANDATORY, + BPFLOADER_MAINLINE_U_VERSION, BPFLOADER_MAX_VER, MANDATORY, "fs_bpf_netd_readonly", "", LOAD_ON_ENG, IGNORE_ON_USER, LOAD_ON_USERDEBUG) (struct __sk_buff* skb) { diff --git a/bpf_progs/offload.c b/bpf_progs/offload.c index dd59dcaa31..4f152bf6c3 100644 --- a/bpf_progs/offload.c +++ b/bpf_progs/offload.c @@ -28,11 +28,11 @@ // BTF is incompatible with bpfloaders < v0.10, hence for S (v0.2) we must // ship a different file than for later versions, but we need bpfloader v0.25+ // for obj@ver.o support -#define BPFLOADER_MIN_VER BPFLOADER_OBJ_AT_VER_VERSION +#define BPFLOADER_MIN_VER BPFLOADER_MAINLINE_T_VERSION #else /* MAINLINE */ // The resulting .o needs to load on the Android S bpfloader #define BPFLOADER_MIN_VER BPFLOADER_S_VERSION -#define BPFLOADER_MAX_VER BPFLOADER_OBJ_AT_VER_VERSION +#define BPFLOADER_MAX_VER BPFLOADER_T_VERSION #endif /* MAINLINE */ // Warning: values other than AID_ROOT don't work for map uid on BpfLoader < v0.21 diff --git a/bpf_progs/test.c b/bpf_progs/test.c index e2b8ea515b..fff3512333 100644 --- a/bpf_progs/test.c +++ b/bpf_progs/test.c @@ -22,11 +22,11 @@ // BTF is incompatible with bpfloaders < v0.10, hence for S (v0.2) we must // ship a different file than for later versions, but we need bpfloader v0.25+ // for obj@ver.o support -#define BPFLOADER_MIN_VER BPFLOADER_OBJ_AT_VER_VERSION +#define BPFLOADER_MIN_VER BPFLOADER_MAINLINE_T_VERSION #else /* MAINLINE */ // The resulting .o needs to load on the Android S bpfloader #define BPFLOADER_MIN_VER BPFLOADER_S_VERSION -#define BPFLOADER_MAX_VER BPFLOADER_OBJ_AT_VER_VERSION +#define BPFLOADER_MAX_VER BPFLOADER_T_VERSION #endif /* MAINLINE */ // Warning: values other than AID_ROOT don't work for map uid on BpfLoader < v0.21 diff --git a/netbpfload/NetBpfLoad.cpp b/netbpfload/NetBpfLoad.cpp index 196b687311..9651a3b29c 100644 --- a/netbpfload/NetBpfLoad.cpp +++ b/netbpfload/NetBpfLoad.cpp @@ -261,9 +261,10 @@ int main(int argc, char** argv, char * const envp[]) { // Tethering apex shipped initrc file causes us to reach here // but we're not ready to correctly handle anything before U QPR2 // in which the 'bpfloader' vs 'netbpfload' split happened - const char * args[] = { platformBpfLoader, NULL, }; - execve(args[0], (char**)args, envp); - ALOGE("exec '%s' fail: %d[%s]", platformBpfLoader, errno, strerror(errno)); + } + + if (!isAtLeastT) { + ALOGE("Impossible - not reachable on Android