Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a5faa56a authored by Zhanglong Xia's avatar Zhanglong Xia
Browse files

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
parent 2764f622
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -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,9 +30,15 @@
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" +
@@ -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);
    addThreadChip(0, url.c_str());
    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;