Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Telink] Block device role changing into Router if commissioning window opened and device not yet Router #25395

22 changes: 22 additions & 0 deletions src/app/server/CommissioningWindowManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@
#include <platform/CommissionableDataProvider.h>
#include <platform/DeviceControlServer.h>

#if CHIP_DEVICE_CONFIG_ENABLE_THREAD && CHIP_DEVICE_CONFIG_THREAD_FTD
#include <openthread/thread_ftd.h>
using namespace chip::DeviceLayer;
#endif

using namespace chip::app::Clusters;
using namespace chip::System::Clock;

Expand Down Expand Up @@ -547,6 +552,23 @@ void CommissioningWindowManager::UpdateWindowStatus(CommissioningWindowStatusEnu
MatterReportingAttributeChangeCallback(kRootEndpointId, AdministratorCommissioning::Id,
AdministratorCommissioning::Attributes::WindowStatus::Id);
}

#if CHIP_DEVICE_CONFIG_ENABLE_THREAD && CHIP_DEVICE_CONFIG_THREAD_FTD
// Block device role changing into Router if commissioning window opened and device not yet Router.
if (mWindowStatus == CommissioningWindowStatusEnum::kEnhancedWindowOpen &&
s07641069 marked this conversation as resolved.
Show resolved Hide resolved
ConnectivityManagerImpl().GetThreadDeviceType() == ConnectivityManager::kThreadDeviceType_Router &&
otThreadGetDeviceRole(DeviceLayer::ThreadStackMgrImpl().OTInstance()) != OT_DEVICE_ROLE_ROUTER)
{
otThreadSetRouterEligible(DeviceLayer::ThreadStackMgrImpl().OTInstance(), false);
mRecoverRouterDeviceRole = true;
}
// Recover Router device role.
else if (mWindowStatus == CommissioningWindowStatusEnum::kWindowNotOpen && mRecoverRouterDeviceRole)
{
otThreadSetRouterEligible(DeviceLayer::ThreadStackMgrImpl().OTInstance(), true);
mRecoverRouterDeviceRole = false;
}
#endif
}

void CommissioningWindowManager::UpdateOpenerVendorId(Nullable<VendorId> aNewOpenerVendorId)
Expand Down
4 changes: 4 additions & 0 deletions src/app/server/CommissioningWindowManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,10 @@ class CommissioningWindowManager : public Messaging::UnsolicitedMessageHandler,
bool mSEDActiveModeEnabled = false;
#endif

#if CHIP_DEVICE_CONFIG_ENABLE_THREAD && CHIP_DEVICE_CONFIG_THREAD_FTD
bool mRecoverRouterDeviceRole = false;
#endif

// For tests only, so that we can test the commissioning window timeout
// without having to wait 3 minutes.
Optional<System::Clock::Seconds16> mMinCommissioningTimeoutOverride;
Expand Down