From fad7f9d8b722c7270e3e3ead31bc43f87101cd9d Mon Sep 17 00:00:00 2001 From: Ken Chen Date: Wed, 10 Nov 2021 22:02:57 +0800 Subject: [NETD-BPF#34] Add a tag for bpf to specify the install folder Currently, the bpf module netd.o (source system/netd/bpf_progs/netd.c) will be built to /system/etc/bpf/netd.o. In Android T, it will be moved to mainline module com.android.tethering. The expected behavior is: - In T device, it uses the netd.o in mainline module. - In pre-T devices, it uses the original netd, built from platform. However, netd.o will be double loaded if the tethering module is installed in Pre-T devices. Because: 1. bpf in apex is packed into /apex/MAINLINE_MODULE/etc/bpf/ 2. bpf in platform is packed into /system/etc/bpf/ 3. bpfloader in pre-T loads ANY bpf modules under /apex/com.android.tethering/etc/bpf/ and /system/etc/bpf/. We can't change the behavior of bpfloader in pre-T devices. We can't delete the /system/etc/bpf/netd.o from pre-T devices. Both of them are not mainline modules. So the mainlined netd.o needs to be packed into a folder other than /apex/com.android.tethering/etc/bpf/ or /system/etc/bpf/. This commit adds a tag 'sub_dir' for bpf module. The installation path of bpf modules will be: - /system/etc/bpf/SUB_DIR/ (for platform code) - /apex/MAINLINE_MODULE/etc/bpf/SUB_DIR/ (for mainline module) Bug: 202086915 Test: add test in apex_test.go and build Change-Id: Icc6619768ab006de9f86620a7df1bb2853eaba13 --- bpf/bpf.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'bpf/bpf.go') diff --git a/bpf/bpf.go b/bpf/bpf.go index fa1a84d04..64d679c80 100644 --- a/bpf/bpf.go +++ b/bpf/bpf.go @@ -54,12 +54,16 @@ type BpfModule interface { android.Module OutputFiles(tag string) (android.Paths, error) + + // Returns the sub install directory if the bpf module is included by apex. + SubDir() string } type BpfProperties struct { Srcs []string `android:"path"` Cflags []string Include_dirs []string + Sub_dir string } type bpf struct { @@ -121,6 +125,10 @@ func (bpf *bpf) AndroidMk() android.AndroidMkData { fmt.Fprintln(w) fmt.Fprintln(w, "LOCAL_PATH :=", moduleDir) fmt.Fprintln(w) + localModulePath := "LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/bpf" + if len(bpf.properties.Sub_dir) > 0 { + localModulePath += "/" + bpf.properties.Sub_dir + } for _, obj := range bpf.objs { objName := name + "_" + obj.Base() names = append(names, objName) @@ -130,7 +138,7 @@ func (bpf *bpf) AndroidMk() android.AndroidMkData { fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", obj.String()) fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", obj.Base()) fmt.Fprintln(w, "LOCAL_MODULE_CLASS := ETC") - fmt.Fprintln(w, "LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/bpf") + fmt.Fprintln(w, localModulePath) fmt.Fprintln(w, "include $(BUILD_PREBUILT)") fmt.Fprintln(w) } @@ -154,6 +162,10 @@ func (bpf *bpf) OutputFiles(tag string) (android.Paths, error) { } } +func (bpf *bpf) SubDir() string { + return bpf.properties.Sub_dir +} + var _ android.OutputFileProducer = (*bpf)(nil) func BpfFactory() android.Module { -- cgit v1.2.3-59-g8ed1b