From b489c357694db148439bc22c7a207ccbcd9212a1 Mon Sep 17 00:00:00 2001 From: Eduardo Montoya Date: Wed, 30 Mar 2022 07:13:07 +0200 Subject: [PATCH] [mle] avoid setting mode `D` flag on MTD builds (#7519) When building with `OPENTHREAD_MTD` make sure that the device is not configured as Full Thread Device, whether by the API or by the stored settings. --- src/core/thread/mle.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index 82d112e23..cff7228df 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -327,7 +327,12 @@ void Mle::Restore(void) Get().SetCurrentKeySequence(networkInfo.GetKeySequence()); Get().SetMleFrameCounter(networkInfo.GetMleFrameCounter()); Get().SetAllMacFrameCounters(networkInfo.GetMacFrameCounter()); + +#if OPENTHREAD_MTD + mDeviceMode.Set(networkInfo.GetDeviceMode() & ~DeviceMode::kModeFullThreadDevice); +#else mDeviceMode.Set(networkInfo.GetDeviceMode()); +#endif // force re-attach when version mismatch. VerifyOrExit(networkInfo.GetVersion() == kThreadVersion); @@ -343,7 +348,12 @@ void Mle::Restore(void) ExitNow(); } - Get().SetShortAddress(networkInfo.GetRloc16()); +#if OPENTHREAD_MTD + if (!IsActiveRouter(networkInfo.GetRloc16())) +#endif + { + Get().SetShortAddress(networkInfo.GetRloc16()); + } Get().SetExtAddress(networkInfo.GetExtAddress()); mMeshLocal64.GetAddress().SetIid(networkInfo.GetMeshLocalIid()); @@ -755,6 +765,10 @@ Error Mle::SetDeviceMode(DeviceMode aDeviceMode) Error error = kErrorNone; DeviceMode oldMode = mDeviceMode; +#if OPENTHREAD_MTD + VerifyOrExit(!aDeviceMode.IsFullThreadDevice(), error = kErrorInvalidArgs); +#endif + VerifyOrExit(aDeviceMode.IsValid(), error = kErrorInvalidArgs); VerifyOrExit(mDeviceMode != aDeviceMode); mDeviceMode = aDeviceMode;