diff --git a/include/openthread/backbone_router_ftd.h b/include/openthread/backbone_router_ftd.h index 535b06b0d..4eca8f6f6 100644 --- a/include/openthread/backbone_router_ftd.h +++ b/include/openthread/backbone_router_ftd.h @@ -115,13 +115,16 @@ void otBackboneRouterGetConfig(otInstance *aInstance, otBackboneRouterConfig *aC * @param[in] aInstance A pointer to an OpenThread instance. * @param[in] aConfig A pointer to the Backbone Router configuration to take effect. * + * @retval OT_ERROR_NONE Successfully updated configuration. + * @retval OT_ERROR_INVALID_ARGS The configuration in @p aConfig is invalid. + * * @sa otBackboneRouterSetEnabled * @sa otBackboneRouterGetState * @sa otBackboneRouterGetConfig * @sa otBackboneRouterRegister * */ -void otBackboneRouterSetConfig(otInstance *aInstance, const otBackboneRouterConfig *aConfig); +otError otBackboneRouterSetConfig(otInstance *aInstance, const otBackboneRouterConfig *aConfig); /** * This function explicitly registers local Backbone Router configuration. diff --git a/include/openthread/instance.h b/include/openthread/instance.h index 6621bb498..af9f2d9b5 100644 --- a/include/openthread/instance.h +++ b/include/openthread/instance.h @@ -53,7 +53,7 @@ extern "C" { * @note This number versions both OpenThread platform and user APIs. * */ -#define OPENTHREAD_API_VERSION (13) +#define OPENTHREAD_API_VERSION (14) /** * @addtogroup api-instance diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 0d916bc8d..1187e6a57 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -582,7 +582,7 @@ otError Interpreter::ProcessBackboneRouterLocal(uint8_t aArgsLength, char *aArgs } } - otBackboneRouterSetConfig(mInstance, &config); + SuccessOrExit(error = otBackboneRouterSetConfig(mInstance, &config)); } } else diff --git a/src/core/api/backbone_router_ftd_api.cpp b/src/core/api/backbone_router_ftd_api.cpp index 71032493e..738aea56f 100644 --- a/src/core/api/backbone_router_ftd_api.cpp +++ b/src/core/api/backbone_router_ftd_api.cpp @@ -64,13 +64,13 @@ void otBackboneRouterGetConfig(otInstance *aInstance, otBackboneRouterConfig *aC instance.Get().GetConfig(*aConfig); } -void otBackboneRouterSetConfig(otInstance *aInstance, const otBackboneRouterConfig *aConfig) +otError otBackboneRouterSetConfig(otInstance *aInstance, const otBackboneRouterConfig *aConfig) { Instance &instance = *static_cast(aInstance); OT_ASSERT(aConfig != nullptr); - instance.Get().SetConfig(*aConfig); + return instance.Get().SetConfig(*aConfig); } otError otBackboneRouterRegister(otInstance *aInstance) diff --git a/src/core/backbone_router/local.cpp b/src/core/backbone_router/local.cpp index d253c4638..f82cbb665 100644 --- a/src/core/backbone_router/local.cpp +++ b/src/core/backbone_router/local.cpp @@ -137,9 +137,18 @@ void Local::GetConfig(BackboneRouterConfig &aConfig) const aConfig.mMlrTimeout = mMlrTimeout; } -void Local::SetConfig(const BackboneRouterConfig &aConfig) +otError Local::SetConfig(const BackboneRouterConfig &aConfig) { - bool update = false; + otError error = OT_ERROR_NONE; + bool update = false; + + VerifyOrExit(aConfig.mMlrTimeout >= Mle::kMlrTimeoutMin, error = OT_ERROR_INVALID_ARGS); + // Validate configuration according to Thread 1.2.1 Specification 5.21.3.3: + // "The Reregistration Delay in seconds MUST be lower than (0.5 * MLR Timeout). It MUST be at least 1." + VerifyOrExit(aConfig.mReregistrationDelay >= 1, error = OT_ERROR_INVALID_ARGS); + static_assert(sizeof(aConfig.mReregistrationDelay) < sizeof(aConfig.mMlrTimeout), + "the calculation below might overflow"); + VerifyOrExit(aConfig.mReregistrationDelay * 2 < aConfig.mMlrTimeout, error = OT_ERROR_INVALID_ARGS); if (aConfig.mReregistrationDelay != mReregistrationDelay) { @@ -169,7 +178,9 @@ void Local::SetConfig(const BackboneRouterConfig &aConfig) } } - LogBackboneRouterService("Set", OT_ERROR_NONE); +exit: + LogBackboneRouterService("Set", error); + return error; } otError Local::AddService(bool aForce) diff --git a/src/core/backbone_router/local.hpp b/src/core/backbone_router/local.hpp index 3451981d7..b80a8478c 100644 --- a/src/core/backbone_router/local.hpp +++ b/src/core/backbone_router/local.hpp @@ -104,8 +104,11 @@ public: * * @param[in] aConfig The configuration to set. * + * @retval OT_ERROR_NONE Successfully updated configuration. + * @retval OT_ERROR_INVALID_ARGS The configuration in @p aConfig is invalid. + * */ - void SetConfig(const BackboneRouterConfig &aConfig); + otError SetConfig(const BackboneRouterConfig &aConfig); /** * This method registers Backbone Router Dataset to Leader. diff --git a/src/core/thread/mle_types.hpp b/src/core/thread/mle_types.hpp index 1a61a35f7..c6ade3337 100644 --- a/src/core/thread/mle_types.hpp +++ b/src/core/thread/mle_types.hpp @@ -258,9 +258,13 @@ enum { kRegistrationDelayDefault = 1200, //< In seconds. kMlrTimeoutDefault = 3600, //< In seconds. + kMlrTimeoutMin = 300, //< In seconds. kBackboneRouterRegistrationJitter = 5, //< In seconds. }; +static_assert(kMlrTimeoutDefault >= kMlrTimeoutMin, + "kMlrTimeoutDefault must be larger than or equal to kMlrTimeoutMin"); + #endif /**