Skip to content

Commit c935e24

Browse files
jmartinez-silabsarkqrestyled-commits
authored andcommitted
[THREAD] Bring clear all Srp Client host and Services to the GenericThreadStackManagerImpl (project-chip#32215)
* Bring the functionality to clear all Srp Client host and Services to the GenericThreadStackManagerImpl * Fix Tizen build * Update src/platform/Tizen/ThreadStackManagerImpl.cpp Co-authored-by: Arkadiusz Bokowy <arkadiusz.bokowy@gmail.com> * Add method documentation and address comments * Restyled by whitespace --------- Co-authored-by: Arkadiusz Bokowy <arkadiusz.bokowy@gmail.com> Co-authored-by: Restyled.io <commits@restyled.io>
1 parent bfaa466 commit c935e24

20 files changed

+248
-64
lines changed

src/include/platform/ThreadStackManager.h

+35
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,26 @@ class ThreadStackManager
121121
CHIP_ERROR RemoveSrpService(const char * aInstanceName, const char * aName);
122122
CHIP_ERROR InvalidateAllSrpServices(); ///< Mark all SRP services as invalid
123123
CHIP_ERROR RemoveInvalidSrpServices(); ///< Remove SRP services marked as invalid
124+
125+
/*
126+
* @brief Utility function to clear all thread SRP host and services established between the SRP server and client.
127+
* It is expected that a transaction is done between the SRP server and client so the clear request is applied on both ends
128+
*
129+
* A generic implementation is provided in `GenericThreadStackManagerImpl_OpenThread` with the SoC OT stack
130+
*/
131+
CHIP_ERROR ClearAllSrpHostAndServices();
132+
133+
/*
134+
* @brief Used to synchronize on the SRP server response confirming the clearing of the host and service entries
135+
* Should be called in ClearAllSrpHostAndServices once the request is sent.
136+
*/
137+
void WaitOnSrpClearAllComplete();
138+
139+
/*
140+
* @brief Notify that the SRP server confirmed the clearing of the host and service entries
141+
* Should be called in the SRP Client set callback in the removal confirmation.
142+
*/
143+
void NotifySrpClearAllComplete();
124144
CHIP_ERROR SetupSrpHost(const char * aHostName);
125145
CHIP_ERROR ClearSrpHost(const char * aHostName);
126146
CHIP_ERROR SetSrpDnsCallbacks(DnsAsyncReturnCallback aInitCallback, DnsAsyncReturnCallback aErrorCallback, void * aContext);
@@ -289,6 +309,21 @@ inline CHIP_ERROR ThreadStackManager::RemoveInvalidSrpServices()
289309
return static_cast<ImplClass *>(this)->_RemoveInvalidSrpServices();
290310
}
291311

312+
inline CHIP_ERROR ThreadStackManager::ClearAllSrpHostAndServices()
313+
{
314+
return static_cast<ImplClass *>(this)->_ClearAllSrpHostAndServices();
315+
}
316+
317+
inline void ThreadStackManager::WaitOnSrpClearAllComplete()
318+
{
319+
return static_cast<ImplClass *>(this)->_WaitOnSrpClearAllComplete();
320+
}
321+
322+
inline void ThreadStackManager::NotifySrpClearAllComplete()
323+
{
324+
return static_cast<ImplClass *>(this)->_NotifySrpClearAllComplete();
325+
}
326+
292327
inline CHIP_ERROR ThreadStackManager::SetupSrpHost(const char * aHostName)
293328
{
294329
return static_cast<ImplClass *>(this)->_SetupSrpHost(aHostName);

src/platform/ESP32/ThreadStackManagerImpl.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,30 @@ void ThreadStackManagerImpl::_UnlockThreadStack()
7777
esp_openthread_lock_release();
7878
}
7979

80+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
81+
void ThreadStackManagerImpl::_WaitOnSrpClearAllComplete()
82+
{
83+
// Only 1 task can be blocked on a srpClearAll request
84+
if (mSrpClearAllRequester == nullptr)
85+
{
86+
mSrpClearAllRequester = xTaskGetCurrentTaskHandle();
87+
// Wait on OnSrpClientNotification which confirms the clearing is done.
88+
// It will notify this current task with NotifySrpClearAllComplete.
89+
// However, we won't wait more than 2s.
90+
ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(2000));
91+
mSrpClearAllRequester = nullptr;
92+
}
93+
}
94+
95+
void ThreadStackManagerImpl::_NotifySrpClearAllComplete()
96+
{
97+
if (mSrpClearAllRequester)
98+
{
99+
xTaskNotifyGive(mSrpClearAllRequester);
100+
}
101+
}
102+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
103+
80104
void ThreadStackManagerImpl::_ProcessThreadActivity()
81105
{
82106
// Intentionally empty.

src/platform/ESP32/ThreadStackManagerImpl.h

+11
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,21 @@ class ThreadStackManagerImpl final : public ThreadStackManager,
6868
void _OnCHIPoBLEAdvertisingStart();
6969
void _OnCHIPoBLEAdvertisingStop();
7070

71+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
72+
void _WaitOnSrpClearAllComplete();
73+
void _NotifySrpClearAllComplete();
74+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
75+
// ===== Methods that override the GenericThreadStackMa
76+
7177
private:
7278
friend ThreadStackManager & ::chip::DeviceLayer::ThreadStackMgr(void);
7379
friend ThreadStackManagerImpl & ::chip::DeviceLayer::ThreadStackMgrImpl(void);
7480
static ThreadStackManagerImpl sInstance;
81+
82+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
83+
TaskHandle_t mSrpClearAllRequester = nullptr;
84+
#endif
85+
7586
ThreadStackManagerImpl() = default;
7687
};
7788

src/platform/FreeRTOS/GenericThreadStackManagerImpl_FreeRTOS.h

+8
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ class GenericThreadStackManagerImpl_FreeRTOS
6464
bool _TryLockThreadStack(void);
6565
void _UnlockThreadStack(void);
6666

67+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
68+
void _WaitOnSrpClearAllComplete();
69+
void _NotifySrpClearAllComplete();
70+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
6771
// ===== Members available to the implementation subclass.
6872

6973
SemaphoreHandle_t mThreadStackLock;
@@ -88,6 +92,10 @@ class GenericThreadStackManagerImpl_FreeRTOS
8892
#if defined(CHIP_CONFIG_FREERTOS_USE_STATIC_SEMAPHORE) && CHIP_CONFIG_FREERTOS_USE_STATIC_SEMAPHORE
8993
StaticSemaphore_t mThreadStackLockMutex;
9094
#endif
95+
96+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
97+
TaskHandle_t mSrpClearAllRequester = nullptr;
98+
#endif
9199
};
92100

93101
// Instruct the compiler to instantiate the template only when explicitly told to do so.

src/platform/FreeRTOS/GenericThreadStackManagerImpl_FreeRTOS.hpp

+26
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,32 @@ void GenericThreadStackManagerImpl_FreeRTOS<ImplClass>::_UnlockThreadStack(void)
101101
xSemaphoreGive(mThreadStackLock);
102102
}
103103

104+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
105+
template <class ImplClass>
106+
void GenericThreadStackManagerImpl_FreeRTOS<ImplClass>::_WaitOnSrpClearAllComplete()
107+
{
108+
// Only 1 task can be blocked on a srpClearAll request
109+
if (mSrpClearAllRequester == nullptr)
110+
{
111+
mSrpClearAllRequester = xTaskGetCurrentTaskHandle();
112+
// Wait on OnSrpClientNotification which confirms the slearing is done.
113+
// It will notify this current task with NotifySrpClearAllComplete.
114+
// However, we won't wait more than 2s.
115+
ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(2000));
116+
mSrpClearAllRequester = nullptr;
117+
}
118+
}
119+
120+
template <class ImplClass>
121+
void GenericThreadStackManagerImpl_FreeRTOS<ImplClass>::_NotifySrpClearAllComplete()
122+
{
123+
if (mSrpClearAllRequester)
124+
{
125+
xTaskNotifyGive(mSrpClearAllRequester);
126+
}
127+
}
128+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
129+
104130
template <class ImplClass>
105131
void GenericThreadStackManagerImpl_FreeRTOS<ImplClass>::SignalThreadActivityPending()
106132
{

src/platform/Infineon/CYW30739/ThreadStackManagerImpl.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ CHIP_ERROR ThreadStackManagerImpl::_InitThreadStack()
5454
VerifyOrExit(result == WICED_SUCCESS, err = CHIP_ERROR_INTERNAL);
5555
otSysInit(0, NULL);
5656

57+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
58+
mSrpClearAllSemaphore = wiced_rtos_create_mutex();
59+
VerifyOrExit(mSrpClearAllSemaphore != nullptr, err = CHIP_ERROR_NO_MEMORY);
60+
61+
result = wiced_rtos_init_mutex(mSrpClearAllSemaphore);
62+
VerifyOrExit(result == WICED_SUCCESS, err = CHIP_ERROR_INTERNAL);
63+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
64+
5765
err = GenericThreadStackManagerImpl_OpenThread<ThreadStackManagerImpl>::DoInit(NULL);
5866

5967
exit:
@@ -95,6 +103,21 @@ void ThreadStackManagerImpl::_UnlockThreadStack()
95103
VerifyOrReturn(result == WICED_SUCCESS || result == WICED_NOT_OWNED, ChipLogError(DeviceLayer, "%s %x", __func__, result));
96104
}
97105

106+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
107+
void ThreadStackManagerImpl::_WaitOnSrpClearAllComplete()
108+
{
109+
const wiced_result_t result = wiced_rtos_lock_mutex(mSrpClearAllSemaphore);
110+
VerifyOrReturn(result == WICED_SUCCESS, ChipLogError(DeviceLayer, "%s %x", __func__, result));
111+
}
112+
113+
void ThreadStackManagerImpl::_NotifySrpClearAllComplete()
114+
{
115+
const wiced_result_t result = wiced_rtos_unlock_mutex(mSrpClearAllSemaphore);
116+
VerifyOrReturn(result == WICED_SUCCESS || result == WICED_NOT_OWNED, ChipLogError(DeviceLayer, "%s %x", __func__, result));
117+
}
118+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
119+
// ===== Methods that override the GenericThreadStackMa
120+
98121
void ThreadStackManagerImpl::ThreadTaskMain(void)
99122
{
100123
while (true)

src/platform/Infineon/CYW30739/ThreadStackManagerImpl.h

+8
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,11 @@ class ThreadStackManagerImpl final : public ThreadStackManager,
5858
bool _TryLockThreadStack();
5959
void _UnlockThreadStack();
6060

61+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
62+
void _WaitOnSrpClearAllComplete();
63+
void _NotifySrpClearAllComplete();
64+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
65+
// ===== Methods that override the GenericThreadStackMa
6166
private:
6267
// ===== Members for internal use by the following friends.
6368

@@ -67,6 +72,9 @@ class ThreadStackManagerImpl final : public ThreadStackManager,
6772
wiced_thread_t * mThread;
6873
EventFlags mEventFlags;
6974
wiced_mutex_t * mMutex;
75+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
76+
wiced_mutex_t * mSrpClearAllSemaphore;
77+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
7078
static ThreadStackManagerImpl sInstance;
7179

7280
// ===== Private members for use by this class only.

src/platform/Linux/ThreadStackManagerImpl.h

+5
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class ThreadStackManagerImpl : public ThreadStackManager
5757
bool _TryLockThreadStack() { return false; } // Intentionally left blank
5858
void _UnlockThreadStack() {} // Intentionally left blank
5959

60+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
61+
void _WaitOnSrpClearAllComplete() {}
62+
void _NotifySrpClearAllComplete() {}
63+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
64+
6065
bool _HaveRouteToAddress(const Inet::IPAddress & destAddr);
6166

6267
void _OnPlatformEvent(const ChipDeviceEvent * event);

src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.h

+3
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ class GenericThreadStackManagerImpl_OpenThread
121121
CHIP_ERROR _RemoveSrpService(const char * aInstanceName, const char * aName);
122122
CHIP_ERROR _InvalidateAllSrpServices();
123123
CHIP_ERROR _RemoveInvalidSrpServices();
124+
CHIP_ERROR _ClearAllSrpHostAndServices();
124125

125126
CHIP_ERROR _SetupSrpHost(const char * aHostName);
126127
CHIP_ERROR _ClearSrpHost(const char * aHostName);
@@ -203,6 +204,8 @@ class GenericThreadStackManagerImpl_OpenThread
203204

204205
SrpClient mSrpClient;
205206

207+
bool mIsSrpClearAllRequested = false;
208+
206209
static void OnSrpClientNotification(otError aError, const otSrpClientHostInfo * aHostInfo, const otSrpClientService * aServices,
207210
const otSrpClientService * aRemovedServices, void * aContext);
208211
static void OnSrpClientStateChange(const otSockAddr * aServerSockAddr, void * aContext);

src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp

+35
Original file line numberDiff line numberDiff line change
@@ -1307,6 +1307,12 @@ void GenericThreadStackManagerImpl_OpenThread<ImplClass>::OnSrpClientNotificatio
13071307
ThreadStackMgrImpl().mSrpClient.mIsInitialized = true;
13081308
ThreadStackMgrImpl().mSrpClient.mInitializedCallback(ThreadStackMgrImpl().mSrpClient.mCallbackContext,
13091309
CHIP_NO_ERROR);
1310+
1311+
if (ThreadStackMgrImpl().mIsSrpClearAllRequested)
1312+
{
1313+
ThreadStackMgrImpl().NotifySrpClearAllComplete();
1314+
ThreadStackMgrImpl().mIsSrpClearAllRequested = false;
1315+
}
13101316
}
13111317
}
13121318

@@ -1618,6 +1624,35 @@ CHIP_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::_RemoveInvalidSr
16181624
return error;
16191625
}
16201626

1627+
/*
1628+
* @brief This is a utility function to remove all Thread client srp host and services
1629+
* established between the device and the srp server (in most cases the OTBR).
1630+
* The calling task is blocked until OnSrpClientNotification which confims the client received the request.
1631+
* The blocking mechanism is defined by the platform implementation of `WaitOnSrpClearAllComplete` and `NotifySrpClearAllComplete`
1632+
*
1633+
* Note: This function is meant to be used during the factory reset sequence.
1634+
*
1635+
*/
1636+
template <class ImplClass>
1637+
CHIP_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::_ClearAllSrpHostAndServices()
1638+
{
1639+
CHIP_ERROR error = CHIP_NO_ERROR;
1640+
Impl()->LockThreadStack();
1641+
if (!mIsSrpClearAllRequested)
1642+
{
1643+
error =
1644+
MapOpenThreadError(otSrpClientRemoveHostAndServices(mOTInst, true /*aRemoveKeyLease*/, true /*aSendUnregToServer*/));
1645+
mIsSrpClearAllRequested = true;
1646+
Impl()->UnlockThreadStack();
1647+
Impl()->WaitOnSrpClearAllComplete();
1648+
}
1649+
else
1650+
{
1651+
Impl()->UnlockThreadStack();
1652+
}
1653+
return error;
1654+
}
1655+
16211656
template <class ImplClass>
16221657
CHIP_ERROR GenericThreadStackManagerImpl_OpenThread<ImplClass>::_SetupSrpHost(const char * aHostName)
16231658
{

src/platform/Tizen/ThreadStackManagerImpl.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,16 @@ CHIP_ERROR ThreadStackManagerImpl::_RemoveInvalidSrpServices()
646646
return CHIP_NO_ERROR;
647647
}
648648

649+
CHIP_ERROR ThreadStackManagerImpl::_ClearAllSrpHostAndServices()
650+
{
651+
for (auto it = mSrpClientServices.begin(); it != mSrpClientServices.end();)
652+
{
653+
ReturnErrorOnFailure(_RemoveSrpService(it->mInstanceName, it->mName));
654+
it = mSrpClientServices.erase(it);
655+
}
656+
return CHIP_NO_ERROR;
657+
}
658+
649659
void ThreadStackManagerImpl::_ThreadIpAddressCb(int index, char * ipAddr, thread_ipaddr_type_e ipAddrType, void * userData)
650660
{
651661
VerifyOrReturn(ipAddr != nullptr, ChipLogError(DeviceLayer, "FAIL: Invalid argument: Thread ipAddr not found"));

src/platform/Tizen/ThreadStackManagerImpl.h

+6
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ class ThreadStackManagerImpl : public ThreadStackManager
5757
bool _TryLockThreadStack() { return false; } // Intentionally left blank
5858
void _UnlockThreadStack() {} // Intentionally left blank
5959

60+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
61+
void _WaitOnSrpClearAllComplete() {}
62+
void _NotifySrpClearAllComplete() {}
63+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
64+
6065
bool _HaveRouteToAddress(const Inet::IPAddress & destAddr);
6166

6267
void _OnPlatformEvent(const ChipDeviceEvent * event);
@@ -115,6 +120,7 @@ class ThreadStackManagerImpl : public ThreadStackManager
115120
CHIP_ERROR _RemoveSrpService(const char * aInstanceName, const char * aName);
116121
CHIP_ERROR _InvalidateAllSrpServices();
117122
CHIP_ERROR _RemoveInvalidSrpServices();
123+
CHIP_ERROR _ClearAllSrpHostAndServices();
118124
CHIP_ERROR _SetupSrpHost(const char * aHostName);
119125
CHIP_ERROR _ClearSrpHost(const char * aHostName);
120126
CHIP_ERROR _SetSrpDnsCallbacks(DnsAsyncReturnCallback aInitCallback, DnsAsyncReturnCallback aErrorCallback, void * aContext);

src/platform/Zephyr/ThreadStackManagerImpl.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ CHIP_ERROR ThreadStackManagerImpl::_InitThreadStack()
6666
return MapOpenThreadError(otError);
6767
});
6868

69+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
70+
k_sem_init(&mSrpClearAllSemaphore, 0, 1);
71+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
72+
6973
return CHIP_NO_ERROR;
7074
}
7175

@@ -85,5 +89,17 @@ void ThreadStackManagerImpl::_UnlockThreadStack()
8589
openthread_api_mutex_unlock(openthread_get_default_context());
8690
}
8791

92+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
93+
void ThreadStackManagerImpl::_WaitOnSrpClearAllComplete()
94+
{
95+
k_sem_take(&mSrpClearAllSemaphore, K_SECONDS(2));
96+
}
97+
98+
void ThreadStackManagerImpl::_NotifySrpClearAllComplete()
99+
{
100+
k_sem_give(&mSrpClearAllSemaphore);
101+
}
102+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
103+
88104
} // namespace DeviceLayer
89105
} // namespace chip

src/platform/Zephyr/ThreadStackManagerImpl.h

+8
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ class ThreadStackManagerImpl final : public ThreadStackManager,
7171
bool _TryLockThreadStack();
7272
void _UnlockThreadStack();
7373

74+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
75+
void _WaitOnSrpClearAllComplete();
76+
void _NotifySrpClearAllComplete();
77+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
7478
// ===== Methods that override the GenericThreadStackManagerImpl_OpenThread abstract interface.
7579

7680
void _ProcessThreadActivity() {}
@@ -83,6 +87,10 @@ class ThreadStackManagerImpl final : public ThreadStackManager,
8387
friend ThreadStackManager & ::chip::DeviceLayer::ThreadStackMgr(void);
8488
friend ThreadStackManagerImpl & ::chip::DeviceLayer::ThreadStackMgrImpl(void);
8589

90+
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
91+
k_sem mSrpClearAllSemaphore;
92+
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
93+
8694
static ThreadStackManagerImpl sInstance;
8795

8896
// ===== Private members for use by this class only.

src/platform/silabs/ConfigurationManagerImpl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ void ConfigurationManagerImpl::DoFactoryReset(intptr_t arg)
272272

273273
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD
274274
#if CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
275-
ThreadStackMgrImpl().RemoveAllSrpServices();
275+
ThreadStackMgr().ClearAllSrpHostAndServices();
276276
#endif // CHIP_DEVICE_CONFIG_ENABLE_THREAD_SRP_CLIENT
277277
ChipLogProgress(DeviceLayer, "Clearing Thread provision");
278278
ThreadStackMgr().ErasePersistentInfo();

0 commit comments

Comments
 (0)