Make netd wait for BPF programs to get loaded

BPF programs are being loaded by bpfloader started by init. Since there
is a possible race where bpfloader starts before netd starts, because make sure
netd waits if bpfloader started too soon.

Test: force bpfloader to start later and see netd wait.

Bug: 112334572
Change-Id: I1cff053f228cc8ee852d5e2de79cafb5d42d6aff
Signed-off-by: Joel Fernandes <joelaf@google.com>
diff --git a/server/main.cpp b/server/main.cpp
index b9ff33f..4b06ada 100644
--- a/server/main.cpp
+++ b/server/main.cpp
@@ -14,6 +14,7 @@
  * limitations under the License.
  */
 
+#include <chrono>
 #include <stdio.h>
 #include <stdlib.h>
 #include <signal.h>
@@ -31,6 +32,7 @@
 
 #include "log/log.h"
 
+#include <android-base/properties.h>
 #include <binder/IPCThreadState.h>
 #include <binder/IServiceManager.h>
 #include <binder/ProcessState.h>
@@ -90,6 +92,12 @@
     // Before we start any threads, populate the resolver stub pointers.
     resolv_stub_init();
 
+    // Make sure BPF programs are loaded before doing anything
+    while (!android::base::WaitForProperty("bpf.progs_loaded", "1",
+           std::chrono::seconds(5))) {
+        ALOGD("netd waited 5s for bpf.progs_loaded, still waiting...");
+    }
+
     NetlinkManager *nm = NetlinkManager::Instance();
     if (nm == nullptr) {
         ALOGE("Unable to create NetlinkManager");