24Q2: use mainline netbpfload from apex am: 13b5e1ff29

Original change: https://android-review.googlesource.com/c/platform/packages/modules/Connectivity/+/2954707

Change-Id: Id78c598cbdbeeeb12be4cde1360fa8b45ddc3b76
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/netbpfload/netbpfload.rc b/netbpfload/netbpfload.rc
index 14181dc..ffbc33c 100644
--- a/netbpfload/netbpfload.rc
+++ b/netbpfload/netbpfload.rc
@@ -17,7 +17,7 @@
 on load_bpf_programs
     exec_start bpfloader
 
-service bpfloader /system/bin/netbpfload
+service bpfloader /apex/com.android.tethering/bin/netbpfload
     # netbpfload will do network bpf loading, then execute /system/bin/bpfloader
     capabilities CHOWN SYS_ADMIN NET_ADMIN
     # The following group memberships are a workaround for lack of DAC_OVERRIDE
diff --git a/service/src/com/android/server/BpfLoaderRcUtils.java b/service/src/com/android/server/BpfLoaderRcUtils.java
index 293e757..99754d5 100644
--- a/service/src/com/android/server/BpfLoaderRcUtils.java
+++ b/service/src/com/android/server/BpfLoaderRcUtils.java
@@ -72,6 +72,17 @@
             "updatable"
     );
 
+    private static final List<String> BPF_LOADER_RC_UQPR3 = List.of(
+            "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",
+            "updatable"
+    );
+
 
     private static final String BPF_LOADER_RC_FILE_PATH = "/etc/init/bpfloader.rc";
     private static final String NET_BPF_LOAD_RC_FILE_PATH = "/etc/init/netbpfload.rc";
@@ -132,30 +143,31 @@
                                 + " exist.");
                 return false;
             }
-            // Check bpf rc file in U QPR2
-            return compareBpfLoaderRc(bpfRcFile, BPF_LOADER_RC_UQPR2);
+            // Check bpf rc file in U QPR2 and U QPR3
+            return compareBpfLoaderRc(bpfRcFile, List.of(BPF_LOADER_RC_UQPR2, BPF_LOADER_RC_UQPR3));
         }
 
         if (SdkLevel.isAtLeastU()) {
             // Check bpf rc file in U
-            return compareBpfLoaderRc(bpfRcFile, BPF_LOADER_RC_U);
+            return compareBpfLoaderRc(bpfRcFile, List.of(BPF_LOADER_RC_U));
         }
         // Check bpf rc file in S/T
-        return compareBpfLoaderRc(bpfRcFile, BPF_LOADER_RC_S_T);
+        return compareBpfLoaderRc(bpfRcFile, List.of(BPF_LOADER_RC_S_T));
     }
 
     private static boolean compareBpfLoaderRc(@NonNull File bpfRcFile,
-            @NonNull List<String> template) {
+            @NonNull List<List<String>> templates) {
+        List<String> actualContent;
         try {
-            List<String> actualContent = loadExistingBpfRcFile(new FileInputStream(bpfRcFile));
-            if (!actualContent.equals(template)) {
-                Log.wtf(TAG, "BPF rc file is not same as the template files " + actualContent);
-                return false;
-            }
+            actualContent = loadExistingBpfRcFile(new FileInputStream(bpfRcFile));
         } catch (FileNotFoundException e) {
             Log.wtf(bpfRcFile.getPath() + " doesn't exist.", e);
             return false;
         }
-        return true;
+        for (List<String> template : templates) {
+            if (actualContent.equals(template)) return true;
+        }
+        Log.wtf(TAG, "BPF rc file is not same as the template files " + actualContent);
+        return false;
     }
 }