check whether the network interface exists before using it

Some build targets of the cuttlefish project don't have the
ethernet interface. This CL checks whether the network interface
exists before setting it as Thread simulation local interface.

Bug: b/378777255
Test: acloudw create --branch git_main --build-id P85047583 --build-target cf_x86_64_auto-trunk_staging-userdebug
Change-Id: Ifb1e316f59fac7babf34a7c290d5234853de8653
diff --git a/threadnetwork/aidl/default/main.cpp b/threadnetwork/aidl/default/main.cpp
index 6514184..1df455e 100644
--- a/threadnetwork/aidl/default/main.cpp
+++ b/threadnetwork/aidl/default/main.cpp
@@ -18,11 +18,11 @@
 #include <android-base/logging.h>
 #include <android/binder_manager.h>
 #include <android/binder_process.h>
-#include <netinet/in.h>
-#include <net/if.h>
-#include <utils/Log.h>
 #include <cutils/properties.h>
+#include <net/if.h>
+#include <netinet/in.h>
 #include <sys/stat.h>
+#include <utils/Log.h>
 
 #include "service.hpp"
 #include "thread_chip.hpp"
@@ -30,13 +30,19 @@
 using aidl::android::hardware::threadnetwork::IThreadChip;
 using aidl::android::hardware::threadnetwork::ThreadChip;
 
-#define THREADNETWORK_COPROCESSOR_SIMULATION_PATH "/apex/com.android.hardware.threadnetwork/bin/ot-rcp"
+#define THREADNETWORK_COPROCESSOR_SIMULATION_PATH \
+    "/apex/com.android.hardware.threadnetwork/bin/ot-rcp"
 
 namespace {
+
+bool isInterfaceExists(const char* interfaceName) {
+    return if_nametoindex(interfaceName) != 0;
+}
+
 void addThreadChip(int id, const char* url) {
     binder_status_t status;
     const std::string serviceName(std::string() + IThreadChip::descriptor + "/chip" +
-            std::to_string(id));
+                                  std::to_string(id));
 
     ALOGI("ServiceName: %s, Url: %s", serviceName.c_str(), url);
 
@@ -50,19 +56,24 @@
 
 void addSimulatedThreadChip() {
     char local_interface[PROP_VALUE_MAX];
-
-    CHECK_GT(property_get("persist.vendor.otsim.local_interface",
-                local_interface, "eth1"), 0);
-
     int node_id = property_get_int32("ro.boot.openthread_node_id", 0);
-    CHECK_GT(node_id,0);
 
-    std::string url = std::string("spinel+hdlc+forkpty://" \
-            THREADNETWORK_COPROCESSOR_SIMULATION_PATH "?forkpty-arg=-L") \
-                      + local_interface + "&forkpty-arg=" + std::to_string(node_id);
+    CHECK_GT(node_id, 0);
+
+    std::string url = std::string("spinel+hdlc+forkpty://" THREADNETWORK_COPROCESSOR_SIMULATION_PATH
+                                  "?forkpty-arg=") +
+                      std::to_string(node_id);
+
+    CHECK_GT(property_get("persist.vendor.otsim.local_interface", local_interface, "eth1"), 0);
+    if (isInterfaceExists(local_interface)) {
+        url += std::string("&forkpty-arg=-L") + local_interface;
+    } else {
+        ALOGI("Interface %s doesn't exist!", local_interface);
+    }
+
     addThreadChip(0, url.c_str());
 }
-}
+}  // namespace
 
 int main(int argc, char* argv[]) {
     aidl::android::hardware::threadnetwork::Service service;