From a5faa56a62399725859681d14fcf98e4f95000ef Mon Sep 17 00:00:00 2001 From: Zhanglong Xia Date: Mon, 18 Nov 2024 14:15:03 +0800 Subject: [PATCH] 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 --- threadnetwork/aidl/default/main.cpp | 39 ++++++++++++++++++----------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/threadnetwork/aidl/default/main.cpp b/threadnetwork/aidl/default/main.cpp index 6514184f77..1df455eb0f 100644 --- a/threadnetwork/aidl/default/main.cpp +++ b/threadnetwork/aidl/default/main.cpp @@ -18,11 +18,11 @@ #include #include #include -#include -#include -#include #include +#include +#include #include +#include #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 addThreadChip(int id, const char* url) { 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;