[mle] new API to trigger search for better parent (#8018)

This commit adds `otThreadSearchForBetterParent()` to start the
process on a child to search for a better parent while staying
attached to its current parent. This commit also adds a related CLI
command `parent search`.
This commit is contained in:
Abtin Keshavarzian
2022-08-12 16:05:53 -07:00
committed by GitHub
parent d1d8c6fecd
commit f33a586530
6 changed files with 71 additions and 14 deletions
+1 -1
View File
@@ -53,7 +53,7 @@ extern "C" {
* @note This number versions both OpenThread platform and user APIs.
*
*/
#define OPENTHREAD_API_VERSION (234)
#define OPENTHREAD_API_VERSION (235)
/**
* @addtogroup api-instance
+11
View File
@@ -855,6 +855,17 @@ otError otThreadGetParentAverageRssi(otInstance *aInstance, int8_t *aParentRssi)
*/
otError otThreadGetParentLastRssi(otInstance *aInstance, int8_t *aLastRssi);
/**
* Starts the process for child to search for a better parent while staying attached to its current parent.
*
* Must be used when device is attached as a child.
*
* @retval OT_ERROR_NONE Successfully started the process to search for a better parent.
* @retval OT_ERROR_INVALID_STATE Device role is not child.
*
*/
otError otThreadSearchForBetterParent(otInstance *aInstance);
/**
* Gets the IPv6 counters.
*
+33 -13
View File
@@ -4253,23 +4253,43 @@ template <> otError Interpreter::Process<Cmd("panid")>(Arg aArgs[])
template <> otError Interpreter::Process<Cmd("parent")>(Arg aArgs[])
{
OT_UNUSED_VARIABLE(aArgs);
otError error = OT_ERROR_NONE;
otError error = OT_ERROR_NONE;
otRouterInfo parentInfo;
if (aArgs[0].IsEmpty())
{
otRouterInfo parentInfo;
SuccessOrExit(error = otThreadGetParentInfo(GetInstancePtr(), &parentInfo));
OutputFormat("Ext Addr: ");
OutputExtAddressLine(parentInfo.mExtAddress);
OutputLine("Rloc: %x", parentInfo.mRloc16);
OutputLine("Link Quality In: %d", parentInfo.mLinkQualityIn);
OutputLine("Link Quality Out: %d", parentInfo.mLinkQualityOut);
OutputLine("Age: %d", parentInfo.mAge);
OutputLine("Version: %d", parentInfo.mVersion);
SuccessOrExit(error = otThreadGetParentInfo(GetInstancePtr(), &parentInfo));
OutputFormat("Ext Addr: ");
OutputExtAddressLine(parentInfo.mExtAddress);
OutputLine("Rloc: %x", parentInfo.mRloc16);
OutputLine("Link Quality In: %d", parentInfo.mLinkQualityIn);
OutputLine("Link Quality Out: %d", parentInfo.mLinkQualityOut);
OutputLine("Age: %d", parentInfo.mAge);
OutputLine("Version: %d", parentInfo.mVersion);
#if OPENTHREAD_CONFIG_MAC_CSL_RECEIVER_ENABLE
OutputLine("CSL clock accuracy: %d", parentInfo.mCslClockAccuracy);
OutputLine("CSL uncertainty: %d", parentInfo.mCslUncertainty);
OutputLine("CSL clock accuracy: %d", parentInfo.mCslClockAccuracy);
OutputLine("CSL uncertainty: %d", parentInfo.mCslUncertainty);
#endif
}
/**
* @cli parent search
* @code
* parent search
* Done
* @endcode
* @par api_copy
* #otThreadSearchForBetterParent
*/
else if (aArgs[0] == "search")
{
error = otThreadSearchForBetterParent(GetInstancePtr());
}
else
{
error = OT_ERROR_INVALID_ARGS;
}
exit:
return error;
}
+5
View File
@@ -377,6 +377,11 @@ exit:
return error;
}
otError otThreadSearchForBetterParent(otInstance *aInstance)
{
return AsCoreType(aInstance).Get<Mle::Mle>().SearchForBetterParent();
}
otError otThreadSetEnabled(otInstance *aInstance, bool aEnabled)
{
Error error = kErrorNone;
+11
View File
@@ -524,6 +524,17 @@ exit:
return error;
}
Error Mle::SearchForBetterParent(void)
{
Error error = kErrorNone;
VerifyOrExit(IsChild(), error = kErrorInvalidState);
Attach(kBetterParent);
exit:
return error;
}
void Mle::Attach(AttachMode aMode)
{
VerifyOrExit(!IsDisabled() && !IsAttaching());
+10
View File
@@ -436,6 +436,16 @@ public:
*/
Router &GetParentCandidate(void) { return mParentCandidate; }
/**
* This method starts the process for child to search for a better parent while staying attached to its current
* parent
*
* @retval kErrorNone Successfully started the process to search for a better parent.
* @retval kErrorInvalidState Device role is not child.
*
*/
Error SearchForBetterParent(void);
/**
* This method indicates whether or not an IPv6 address is an RLOC.
*