Warn loudly and do not set bpf.progs_loaded property on critical bpf load failure.

Reasoning: critical load failures for netd bpf programs will just result
in unpredictable behaviour later on.  For example netd/systemserver
crash loops.

Test: builds
Bug: 150040815
Signed-off-by: Maciej Żenczykowski <maze@google.com>
Change-Id: Iefa01e60cd0a9a223e96411726a199bfb4857a5a
diff --git a/bpfloader/BpfLoader.cpp b/bpfloader/BpfLoader.cpp
index 9e348e5..e67c469 100644
--- a/bpfloader/BpfLoader.cpp
+++ b/bpfloader/BpfLoader.cpp
@@ -53,7 +53,8 @@
 
 #define BPF_PROG_PATH "/system/etc/bpf/"
 
-void loadAllElfObjects(void) {
+int loadAllElfObjects(void) {
+    int retVal = 0;
     DIR* dir;
     struct dirent* ent;
 
@@ -64,21 +65,35 @@
 
             string progPath = BPF_PROG_PATH + s;
 
-            int ret = android::bpf::loadProg(progPath.c_str());
-            ALOGI("Attempted load object: %s, ret: %s", progPath.c_str(), std::strerror(-ret));
+            bool critical;
+            int ret = android::bpf::loadProg(progPath.c_str(), &critical);
+            if (ret) {
+                if (critical) retVal = ret;
+                ALOGE("Failed to load object: %s, ret: %s", progPath.c_str(), std::strerror(-ret));
+            } else {
+                ALOGI("Loaded object: %s", progPath.c_str());
+            }
         }
         closedir(dir);
     }
+    return retVal;
 }
 
 int main() {
     if (!android::bpf::isBpfSupported()) return 0;
 
     // Load all ELF objects, create programs and maps, and pin them
-    loadAllElfObjects();
+    if (loadAllElfObjects() != 0) {
+        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 ---");
+        return 2;
+    }
 
     if (android::base::SetProperty("bpf.progs_loaded", "1") == false) {
-        ALOGE("Failed to set bpf.progs_loaded property\n");
+        ALOGE("Failed to set bpf.progs_loaded property");
         return 1;
     }