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");