[cli] return error from 'Process{Cmd}()' methods, adding 'OT_ERROR_PENDING' (#5540)

This commit changes the CLI `Process{Cmd}()` handler methods to return
an `otError` (instead of outputting the result). This helps harmonize
the `Process{Cmd}()` handlers in different CLI modules. It also
enables the result of CLI command to be outputted from `ProcessLine()`
after the command is looked up in the table and the corresponding
`Process{Cmd}()` handler is invoked.

This commit also adds a new error code `OT_ERROR_PENDING`. This
special error code indicates the success or error status of an
operation is not yet known and is pending. This is then used by some
of the CLI `Process{Cmd}()` methods which perform an async operation,
e.g., `ProcessDiscover()` returns `OT_ERROR_PENDING` if the discover
scan starts successfully, and later the final result is outputted from
scan callback. The `OutputResult(aError)` method is changed to output
nothing if the error is `OT_ERROR_PENDING`.
This commit is contained in:
Abtin Keshavarzian
2020-09-20 21:46:08 -07:00
committed by GitHub
parent 0d8a99bd05
commit eabb34fc26
6 changed files with 316 additions and 311 deletions
+8
View File
@@ -109,6 +109,7 @@ void otCliUartInit(otInstance *aInstance);
*
* @param[in] aUserCommands A pointer to an array with user commands.
* @param[in] aLength @p aUserCommands length.
*
*/
void otCliSetUserCommands(const otCliCommand *aUserCommands, uint8_t aLength);
@@ -117,6 +118,7 @@ void otCliSetUserCommands(const otCliCommand *aUserCommands, uint8_t aLength);
*
* @param[in] aBytes A pointer to data which should be printed.
* @param[in] aLength @p aBytes length.
*
*/
void otCliOutputBytes(const uint8_t *aBytes, uint8_t aLength);
@@ -125,6 +127,7 @@ void otCliOutputBytes(const uint8_t *aBytes, uint8_t aLength);
*
* @param[in] aFmt A pointer to the format string.
* @param[in] ... A matching list of arguments.
*
*/
void otCliOutputFormat(const char *aFmt, ...);
@@ -133,13 +136,17 @@ void otCliOutputFormat(const char *aFmt, ...);
*
* @param[in] aString A pointer to the string, which may not be null-terminated.
* @param[in] aLength Number of bytes.
*
*/
void otCliOutput(const char *aString, uint16_t aLength);
/**
* Write error code to the CLI console
*
* If the @p aError is `OT_ERROR_PENDING` nothing will be outputted.
*
* @param[in] aError Error code value.
*
*/
void otCliAppendResult(otError aError);
@@ -150,6 +157,7 @@ void otCliAppendResult(otError aError);
* @param[in] aLogRegion The log region.
* @param[in] aFormat A pointer to the format string.
* @param[in] aArgs va_list matching aFormat.
*
*/
void otCliPlatLogv(otLogLevel aLogLevel, otLogRegion aLogRegion, const char *aFormat, va_list aArgs);
+6
View File
@@ -228,6 +228,12 @@ typedef enum OT_MUST_USE_RESULT otError
*/
OT_ERROR_INVALID_COMMAND = 35,
/**
* Special error code used to indicate success/error status is pending and not yet known.
*
*/
OT_ERROR_PENDING = 36,
/**
* The number of defined errors.
*/
+1 -1
View File
@@ -53,7 +53,7 @@ extern "C" {
* @note This number versions both OpenThread platform and user APIs.
*
*/
#define OPENTHREAD_API_VERSION (28)
#define OPENTHREAD_API_VERSION (29)
/**
* @addtogroup api-instance
+201 -213
View File
File diff suppressed because it is too large Load Diff
+99 -97
View File
@@ -236,6 +236,8 @@ public:
/**
* This method delivers a success or error message the client.
*
* If the @p aError is `OT_ERROR_PENDING` nothing will be outputted.
*
* @param[in] aError The error code.
*
*/
@@ -270,17 +272,17 @@ private:
struct Command
{
const char *mName;
void (Interpreter::*mCommand)(uint8_t aArgsLength, char *aArgs[]);
otError (Interpreter::*mCommand)(uint8_t aArgsLength, char *aArgs[]);
};
const Command *FindCommand(const char *aName) const;
otError ParsePingInterval(const char *aString, uint32_t &aInterval);
static otError ParseJoinerDiscerner(char *aString, otJoinerDiscerner &aJoinerDiscerner);
void ProcessHelp(uint8_t aArgsLength, char *aArgs[]);
void ProcessBufferInfo(uint8_t aArgsLength, char *aArgs[]);
void ProcessChannel(uint8_t aArgsLength, char *aArgs[]);
otError ProcessHelp(uint8_t aArgsLength, char *aArgs[]);
otError ProcessBufferInfo(uint8_t aArgsLength, char *aArgs[]);
otError ProcessChannel(uint8_t aArgsLength, char *aArgs[]);
#if (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
void ProcessBackboneRouter(uint8_t aArgsLength, char *aArgs[]);
otError ProcessBackboneRouter(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BACKBONE_ROUTER_ENABLE
otError ProcessBackboneRouterLocal(uint8_t aArgsLength, char *aArgs[]);
@@ -290,84 +292,84 @@ private:
#endif
#endif
void ProcessDomainName(uint8_t aArgsLength, char *aArgs[]);
otError ProcessDomainName(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_DUA_ENABLE
void ProcessDua(uint8_t aArgsLength, char *aArgs[]);
otError ProcessDua(uint8_t aArgsLength, char *aArgs[]);
#endif
#endif // (OPENTHREAD_CONFIG_THREAD_VERSION >= OT_THREAD_VERSION_1_2)
#if OPENTHREAD_FTD
void ProcessChild(uint8_t aArgsLength, char *aArgs[]);
void ProcessChildIp(uint8_t aArgsLength, char *aArgs[]);
void ProcessChildMax(uint8_t aArgsLength, char *aArgs[]);
otError ProcessChild(uint8_t aArgsLength, char *aArgs[]);
otError ProcessChildIp(uint8_t aArgsLength, char *aArgs[]);
otError ProcessChildMax(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessChildTimeout(uint8_t aArgsLength, char *aArgs[]);
otError ProcessChildTimeout(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_COAP_API_ENABLE
void ProcessCoap(uint8_t aArgsLength, char *aArgs[]);
otError ProcessCoap(uint8_t aArgsLength, char *aArgs[]);
#endif
#if OPENTHREAD_CONFIG_COAP_SECURE_API_ENABLE
void ProcessCoapSecure(uint8_t aArgsLength, char *aArgs[]);
otError ProcessCoapSecure(uint8_t aArgsLength, char *aArgs[]);
#endif
#if OPENTHREAD_CONFIG_PLATFORM_RADIO_COEX_ENABLE
void ProcessCoexMetrics(uint8_t aArgsLength, char *aArgs[]);
otError ProcessCoexMetrics(uint8_t aArgsLength, char *aArgs[]);
#endif
#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE && OPENTHREAD_FTD
void ProcessCommissioner(uint8_t aArgsLength, char *aArgs[]);
otError ProcessCommissioner(uint8_t aArgsLength, char *aArgs[]);
#endif
#if OPENTHREAD_FTD
void ProcessContextIdReuseDelay(uint8_t aArgsLength, char *aArgs[]);
otError ProcessContextIdReuseDelay(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessCounters(uint8_t aArgsLength, char *aArgs[]);
void ProcessCsl(uint8_t aArgsLength, char *argv[]);
otError ProcessCounters(uint8_t aArgsLength, char *aArgs[]);
otError ProcessCsl(uint8_t aArgsLength, char *argv[]);
#if OPENTHREAD_FTD
void ProcessDelayTimerMin(uint8_t aArgsLength, char *aArgs[]);
otError ProcessDelayTimerMin(uint8_t aArgsLength, char *aArgs[]);
#endif
#if OPENTHREAD_CONFIG_DIAG_ENABLE
void ProcessDiag(uint8_t aArgsLength, char *aArgs[]);
otError ProcessDiag(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessDiscover(uint8_t aArgsLength, char *aArgs[]);
otError ProcessDiscover(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_DNS_CLIENT_ENABLE
void ProcessDns(uint8_t aArgsLength, char *aArgs[]);
otError ProcessDns(uint8_t aArgsLength, char *aArgs[]);
#endif
#if OPENTHREAD_FTD
void ProcessEidCache(uint8_t aArgsLength, char *aArgs[]);
otError ProcessEidCache(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessEui64(uint8_t aArgsLength, char *aArgs[]);
otError ProcessEui64(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_POSIX
void ProcessExit(uint8_t aArgsLength, char *aArgs[]);
otError ProcessExit(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessLog(uint8_t aArgsLength, char *aArgs[]);
void ProcessExtAddress(uint8_t aArgsLength, char *aArgs[]);
void ProcessExtPanId(uint8_t aArgsLength, char *aArgs[]);
void ProcessFactoryReset(uint8_t aArgsLength, char *aArgs[]);
void ProcessIfconfig(uint8_t aArgsLength, char *aArgs[]);
void ProcessIpAddr(uint8_t aArgsLength, char *aArgs[]);
otError ProcessLog(uint8_t aArgsLength, char *aArgs[]);
otError ProcessExtAddress(uint8_t aArgsLength, char *aArgs[]);
otError ProcessExtPanId(uint8_t aArgsLength, char *aArgs[]);
otError ProcessFactoryReset(uint8_t aArgsLength, char *aArgs[]);
otError ProcessIfconfig(uint8_t aArgsLength, char *aArgs[]);
otError ProcessIpAddr(uint8_t aArgsLength, char *aArgs[]);
otError ProcessIpAddrAdd(uint8_t aArgsLength, char *aArgs[]);
otError ProcessIpAddrDel(uint8_t aArgsLength, char *aArgs[]);
void ProcessIpMulticastAddr(uint8_t aArgsLength, char *aArgs[]);
otError ProcessIpMulticastAddr(uint8_t aArgsLength, char *aArgs[]);
otError ProcessIpMulticastAddrAdd(uint8_t aArgsLength, char *aArgs[]);
otError ProcessIpMulticastAddrDel(uint8_t aArgsLength, char *aArgs[]);
otError ProcessMulticastPromiscuous(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_JOINER_ENABLE
void ProcessJoiner(uint8_t aArgsLength, char *aArgs[]);
otError ProcessJoiner(uint8_t aArgsLength, char *aArgs[]);
#endif
#if OPENTHREAD_FTD
void ProcessJoinerPort(uint8_t aArgsLength, char *aArgs[]);
otError ProcessJoinerPort(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessKeySequence(uint8_t aArgsLength, char *aArgs[]);
void ProcessLeaderData(uint8_t aArgsLength, char *aArgs[]);
otError ProcessKeySequence(uint8_t aArgsLength, char *aArgs[]);
otError ProcessLeaderData(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_FTD
void ProcessLeaderPartitionId(uint8_t aArgsLength, char *aArgs[]);
void ProcessLeaderWeight(uint8_t aArgsLength, char *aArgs[]);
otError ProcessLeaderPartitionId(uint8_t aArgsLength, char *aArgs[]);
otError ProcessLeaderWeight(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessMasterKey(uint8_t aArgsLength, char *aArgs[]);
otError ProcessMasterKey(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_TMF_PROXY_MLR_ENABLE
void ProcessMlr(uint8_t aArgsLength, char *aArgs[]);
otError ProcessMlr(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
void ProcessMlrReg(uint8_t aArgsLength, char *aArgs[]);
otError ProcessMlrReg(uint8_t aArgsLength, char *aArgs[]);
static void HandleMlrRegResult(void * aContext,
otError aError,
@@ -380,102 +382,102 @@ private:
uint8_t aFailedAddressNum);
#endif
#endif
void ProcessMode(uint8_t aArgsLength, char *aArgs[]);
otError ProcessMode(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_FTD
void ProcessNeighbor(uint8_t aArgsLength, char *aArgs[]);
otError ProcessNeighbor(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessNetworkData(uint8_t aArgsLength, char *aArgs[]);
void ProcessNetworkDataPrefix(void);
void ProcessNetworkDataRoute(void);
void ProcessNetworkDataService(void);
void OutputPrefix(const otBorderRouterConfig &aConfig);
void OutputRoute(const otExternalRouteConfig &aConfig);
void OutputService(const otServiceConfig &aConfig);
otError ProcessNetworkData(uint8_t aArgsLength, char *aArgs[]);
otError ProcessNetworkDataPrefix(void);
otError ProcessNetworkDataRoute(void);
otError ProcessNetworkDataService(void);
void OutputPrefix(const otBorderRouterConfig &aConfig);
void OutputRoute(const otExternalRouteConfig &aConfig);
void OutputService(const otServiceConfig &aConfig);
#if OPENTHREAD_CONFIG_PLATFORM_NETIF_ENABLE
void ProcessNetif(uint8_t aArgsLength, char *aArgs[]);
otError ProcessNetif(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessNetstat(uint8_t aArgsLength, char *aArgs[]);
int OutputSocketAddress(const otSockAddr &aAddress);
otError ProcessNetstat(uint8_t aArgsLength, char *aArgs[]);
int OutputSocketAddress(const otSockAddr &aAddress);
#if OPENTHREAD_CONFIG_TMF_NETDATA_SERVICE_ENABLE
void ProcessService(uint8_t aArgsLength, char *aArgs[]);
otError ProcessService(uint8_t aArgsLength, char *aArgs[]);
otError ProcessServiceList(void);
#endif
#if OPENTHREAD_FTD || OPENTHREAD_CONFIG_TMF_NETWORK_DIAG_MTD_ENABLE
void ProcessNetworkDiagnostic(uint8_t aArgsLength, char *aArgs[]);
otError ProcessNetworkDiagnostic(uint8_t aArgsLength, char *aArgs[]);
#endif
#if OPENTHREAD_FTD
void ProcessNetworkIdTimeout(uint8_t aArgsLength, char *aArgs[]);
otError ProcessNetworkIdTimeout(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessNetworkName(uint8_t aArgsLength, char *aArgs[]);
otError ProcessNetworkName(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_TIME_SYNC_ENABLE
void ProcessNetworkTime(uint8_t aArgsLength, char *aArgs[]);
otError ProcessNetworkTime(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessPanId(uint8_t aArgsLength, char *aArgs[]);
void ProcessParent(uint8_t aArgsLength, char *aArgs[]);
otError ProcessPanId(uint8_t aArgsLength, char *aArgs[]);
otError ProcessParent(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_FTD
void ProcessParentPriority(uint8_t aArgsLength, char *aArgs[]);
otError ProcessParentPriority(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessPing(uint8_t aArgsLength, char *aArgs[]);
void ProcessPollPeriod(uint8_t aArgsLength, char *aArgs[]);
void SignalPingRequest(const Ip6::Address &aPeerAddress,
uint16_t aPingLength,
uint32_t aTimestamp,
uint8_t aHopLimit);
void SignalPingReply(const Ip6::Address &aPeerAddress,
uint16_t aPingLength,
uint32_t aTimestamp,
uint8_t aHopLimit);
otError ProcessPing(uint8_t aArgsLength, char *aArgs[]);
otError ProcessPollPeriod(uint8_t aArgsLength, char *aArgs[]);
void SignalPingRequest(const Ip6::Address &aPeerAddress,
uint16_t aPingLength,
uint32_t aTimestamp,
uint8_t aHopLimit);
void SignalPingReply(const Ip6::Address &aPeerAddress,
uint16_t aPingLength,
uint32_t aTimestamp,
uint8_t aHopLimit);
#if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE
void ProcessPrefix(uint8_t aArgsLength, char *aArgs[]);
otError ProcessPrefix(uint8_t aArgsLength, char *aArgs[]);
otError ProcessPrefixAdd(uint8_t aArgsLength, char *aArgs[]);
otError ProcessPrefixRemove(uint8_t aArgsLength, char *aArgs[]);
otError ProcessPrefixList(void);
#endif
void ProcessPromiscuous(uint8_t aArgsLength, char *aArgs[]);
otError ProcessPromiscuous(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_FTD
void ProcessPreferRouterId(uint8_t aArgsLength, char *aArgs[]);
void ProcessPskc(uint8_t aArgsLength, char *aArgs[]);
otError ProcessPreferRouterId(uint8_t aArgsLength, char *aArgs[]);
otError ProcessPskc(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessRcp(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRcp(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_FTD
void ProcessReleaseRouterId(uint8_t aArgsLength, char *aArgs[]);
otError ProcessReleaseRouterId(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessReset(uint8_t aArgsLength, char *aArgs[]);
otError ProcessReset(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE
void ProcessRoute(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRoute(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRouteAdd(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRouteRemove(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRouteList(void);
#endif
#if OPENTHREAD_FTD
void ProcessRouter(uint8_t aArgsLength, char *aArgs[]);
void ProcessRouterDowngradeThreshold(uint8_t aArgsLength, char *aArgs[]);
void ProcessRouterEligible(uint8_t aArgsLength, char *aArgs[]);
void ProcessRouterSelectionJitter(uint8_t aArgsLength, char *aArgs[]);
void ProcessRouterUpgradeThreshold(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRouter(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRouterDowngradeThreshold(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRouterEligible(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRouterSelectionJitter(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRouterUpgradeThreshold(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessRloc16(uint8_t aArgsLength, char *aArgs[]);
void ProcessScan(uint8_t aArgsLength, char *aArgs[]);
void ProcessSingleton(uint8_t aArgsLength, char *aArgs[]);
otError ProcessRloc16(uint8_t aArgsLength, char *aArgs[]);
otError ProcessScan(uint8_t aArgsLength, char *aArgs[]);
otError ProcessSingleton(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_SNTP_CLIENT_ENABLE
void ProcessSntp(uint8_t aArgsLength, char *aArgs[]);
otError ProcessSntp(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessState(uint8_t aArgsLength, char *aArgs[]);
void ProcessThread(uint8_t aArgsLength, char *aArgs[]);
void ProcessDataset(uint8_t aArgsLength, char *aArgs[]);
void ProcessTxPower(uint8_t aArgsLength, char *aArgs[]);
void ProcessUdp(uint8_t aArgsLength, char *aArgs[]);
void ProcessUnsecurePort(uint8_t aArgsLength, char *aArgs[]);
void ProcessVersion(uint8_t aArgsLength, char *aArgs[]);
otError ProcessState(uint8_t aArgsLength, char *aArgs[]);
otError ProcessThread(uint8_t aArgsLength, char *aArgs[]);
otError ProcessDataset(uint8_t aArgsLength, char *aArgs[]);
otError ProcessTxPower(uint8_t aArgsLength, char *aArgs[]);
otError ProcessUdp(uint8_t aArgsLength, char *aArgs[]);
otError ProcessUnsecurePort(uint8_t aArgsLength, char *aArgs[]);
otError ProcessVersion(uint8_t aArgsLength, char *aArgs[]);
#if OPENTHREAD_CONFIG_MAC_FILTER_ENABLE
void ProcessMacFilter(uint8_t aArgsLength, char *aArgs[]);
otError ProcessMacFilter(uint8_t aArgsLength, char *aArgs[]);
void PrintMacFilter(void);
otError ProcessMacFilterAddress(uint8_t aArgsLength, char *aArgs[]);
otError ProcessMacFilterRss(uint8_t aArgsLength, char *aArgs[]);
#endif
void ProcessMac(uint8_t aArgsLength, char *aArgs[]);
otError ProcessMac(uint8_t aArgsLength, char *aArgs[]);
otError ProcessMacRetries(uint8_t aArgsLength, char *aArgs[]);
static void HandleIcmpReceive(void * aContext,
+1
View File
@@ -192,6 +192,7 @@ static const char *const sThreadErrorStrings[OT_NUM_ERRORS] = {
"ReservedError33", // otError 33 is reserved
"LinkMarginLow", // OT_ERROR_LINK_MARGIN_LOW = 34
"InvalidCommand", // OT_ERROR_INVALID_COMMAND = 35
"Pending", // OT_ERROR_PENDING = 36
};
const char *otThreadErrorToString(otError aError)