aboutsummaryrefslogtreecommitdiff
path: root/src/agent
diff options
context:
space:
mode:
authorjinran-google <jinran@google.com>2022-06-10 12:00:16 +0800
committerGitHub <noreply@github.com>2022-06-09 21:00:16 -0700
commit18d9fe01ca1505b944e413e99f747151f9ea677e (patch)
tree68306749b3ea5639263a25aa190962f36ed92c7e /src/agent
parent9cfb91e73fe50886f50e63e8271474cf37d993f1 (diff)
downloadot-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.cpp5
-rw-r--r--src/agent/application.hpp8
-rw-r--r--src/agent/main.cpp74
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);