diff options
author | jinran-google <jinran@google.com> | 2022-06-10 12:00:16 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-09 21:00:16 -0700 |
commit | 18d9fe01ca1505b944e413e99f747151f9ea677e (patch) | |
tree | 68306749b3ea5639263a25aa190962f36ed92c7e /src/agent | |
parent | 9cfb91e73fe50886f50e63e8271474cf37d993f1 (diff) | |
download | ot-br-posix-18d9fe01ca1505b944e413e99f747151f9ea677e.tar.gz |
[agent] add command-line arg to disable auto attach (#1402)
Diffstat (limited to 'src/agent')
-rw-r--r-- | src/agent/application.cpp | 5 | ||||
-rw-r--r-- | src/agent/application.hpp | 8 | ||||
-rw-r--r-- | src/agent/main.cpp | 74 |
3 files changed, 77 insertions, 10 deletions
diff --git a/src/agent/application.cpp b/src/agent/application.cpp index 5ce4bd20..35540ef0 100644 --- a/src/agent/application.cpp +++ b/src/agent/application.cpp @@ -48,10 +48,11 @@ const struct timeval Application::kPollTimeout = {10, 0}; Application::Application(const std::string & aInterfaceName, const std::string & aBackboneInterfaceName, - const std::vector<const char *> &aRadioUrls) + const std::vector<const char *> &aRadioUrls, + bool aEnableAutoAttach) : mInterfaceName(aInterfaceName) , mBackboneInterfaceName(aBackboneInterfaceName) - , mNcp(mInterfaceName.c_str(), aRadioUrls, mBackboneInterfaceName.c_str(), /* aDryRun */ false) + , mNcp(mInterfaceName.c_str(), aRadioUrls, mBackboneInterfaceName.c_str(), /* aDryRun */ false, aEnableAutoAttach) #if OTBR_ENABLE_BORDER_AGENT , mBorderAgent(mNcp) #endif diff --git a/src/agent/application.hpp b/src/agent/application.hpp index 08f1558e..185b6a88 100644 --- a/src/agent/application.hpp +++ b/src/agent/application.hpp @@ -80,12 +80,16 @@ public: /** * This constructor initializes the Application instance. * - * @param[in] aOpenThread A reference to the OpenThread instance. + * @param[in] aInterfaceName Name of the Thread network interface. + * @param[in] aBackboneInterfaceName Name of the backbone network interface. + * @param[in] aRadioUrls The radio URLs (can be IEEE802.15.4 or TREL radio). + * @param[in] aEnableAutoAttach Whether or not to automatically attach to the saved network. * */ explicit Application(const std::string & aInterfaceName, const std::string & aBackboneInterfaceName, - const std::vector<const char *> &aRadioUrls); + const std::vector<const char *> &aRadioUrls, + bool aEnableAutoAttach); /** * This method initializes the Application instance. diff --git a/src/agent/main.cpp b/src/agent/main.cpp index b90d5fa4..39a8a8d6 100644 --- a/src/agent/main.cpp +++ b/src/agent/main.cpp @@ -30,9 +30,12 @@ #include <openthread-br/config.h> +#include <algorithm> #include <fstream> #include <mutex> #include <sstream> +#include <string> +#include <vector> #include <getopt.h> #include <stdio.h> @@ -68,6 +71,7 @@ enum OTBR_OPT_VERSION = 'V', OTBR_OPT_SHORTMAX = 128, OTBR_OPT_RADIO_VERSION, + OTBR_OPT_AUTO_ATTACH, }; static jmp_buf sResetJump; @@ -82,11 +86,51 @@ static const struct option kOptions[] = { {"verbose", no_argument, nullptr, OTBR_OPT_VERBOSE}, {"version", no_argument, nullptr, OTBR_OPT_VERSION}, {"radio-version", no_argument, nullptr, OTBR_OPT_RADIO_VERSION}, + {"auto-attach", optional_argument, nullptr, OTBR_OPT_AUTO_ATTACH}, {0, 0, 0, 0}}; +static bool ParseInteger(const char *aStr, long &aOutResult) +{ + bool successful = true; + char *strEnd; + long result; + + VerifyOrExit(aStr != nullptr, successful = false); + errno = 0; + result = strtol(aStr, &strEnd, 0); + VerifyOrExit(errno != ERANGE, successful = false); + VerifyOrExit(aStr != strEnd, successful = false); + + aOutResult = result; + +exit: + return successful; +} + +static constexpr char kAutoAttachDisableArg[] = "--auto-attach=0"; +static char sAutoAttachDisableArgStorage[sizeof(kAutoAttachDisableArg)]; + +static std::vector<char *> AppendAutoAttachDisableArg(int argc, char *argv[]) +{ + std::vector<char *> args(argv, argv + argc); + + args.erase(std::remove_if( + args.begin(), args.end(), + [](const char *arg) { return arg != nullptr && std::string(arg).rfind("--auto-attach", 0) == 0; }), + args.end()); + strcpy(sAutoAttachDisableArgStorage, kAutoAttachDisableArg); + args.push_back(sAutoAttachDisableArgStorage); + args.push_back(nullptr); + + return args; +} + static void PrintHelp(const char *aProgramName) { - fprintf(stderr, "Usage: %s [-I interfaceName] [-B backboneIfName] [-d DEBUG_LEVEL] [-v] RADIO_URL [RADIO_URL]\n", + fprintf(stderr, + "Usage: %s [-I interfaceName] [-B backboneIfName] [-d DEBUG_LEVEL] [-v] [--auto-attach[=0/1]] RADIO_URL " + "[RADIO_URL]\n" + " --auto-attach defaults to 1\n", aProgramName); fprintf(stderr, "%s", otSysGetRadioUrlHelpString()); } @@ -122,7 +166,7 @@ static otbrLogLevel GetDefaultLogLevel(void) static void PrintRadioVersionAndExit(const std::vector<const char *> &aRadioUrls) { otbr::Ncp::ControllerOpenThread ncpOpenThread{/* aInterfaceName */ "", aRadioUrls, /* aBackboneInterfaceName */ "", - /* aDryRun */ true}; + /* aDryRun */ true, /* aEnableAutoAttach */ false}; const char * radioVersion; ncpOpenThread.Init(); @@ -145,7 +189,9 @@ static int realmain(int argc, char *argv[]) const char * backboneInterfaceName = ""; bool verbose = false; bool printRadioVersion = false; + bool enableAutoAttach = true; std::vector<const char *> radioUrls; + long parseResult; std::set_new_handler(OnAllocateFailed); @@ -158,8 +204,9 @@ static int realmain(int argc, char *argv[]) break; case OTBR_OPT_DEBUG_LEVEL: - logLevel = static_cast<otbrLogLevel>(atoi(optarg)); - VerifyOrExit(logLevel >= OTBR_LOG_EMERG && logLevel <= OTBR_LOG_DEBUG, ret = EXIT_FAILURE); + VerifyOrExit(ParseInteger(optarg, parseResult), ret = EXIT_FAILURE); + VerifyOrExit(OTBR_LOG_EMERG <= parseResult && parseResult <= OTBR_LOG_DEBUG, ret = EXIT_FAILURE); + logLevel = static_cast<otbrLogLevel>(parseResult); break; case OTBR_OPT_INTERFACE_NAME: @@ -184,6 +231,18 @@ static int realmain(int argc, char *argv[]) printRadioVersion = true; break; + case OTBR_OPT_AUTO_ATTACH: + if (optarg == nullptr) + { + enableAutoAttach = true; + } + else + { + VerifyOrExit(ParseInteger(optarg, parseResult), ret = EXIT_FAILURE); + enableAutoAttach = parseResult; + } + break; + default: PrintHelp(argv[0]); ExitNow(ret = EXIT_FAILURE); @@ -210,7 +269,7 @@ static int realmain(int argc, char *argv[]) } { - otbr::Application app(interfaceName, backboneInterfaceName, radioUrls); + otbr::Application app(interfaceName, backboneInterfaceName, radioUrls, enableAutoAttach); gApp = &app; app.Init(); @@ -244,11 +303,14 @@ int main(int argc, char *argv[]) { if (setjmp(sResetJump)) { + std::vector<char *> args = AppendAutoAttachDisableArg(argc, argv); + alarm(0); #if OPENTHREAD_ENABLE_COVERAGE __gcov_flush(); #endif - execvp(argv[0], argv); + + execvp(args[0], args.data()); } return realmain(argc, argv); |