From 9699d319af4b7d09e52d7701c72abbff7af1472a Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Wed, 24 Aug 2022 10:44:48 -0700 Subject: [PATCH] [takelet] add template `TaskeltIn` to simplify handler functions (#8064) This class adds a template sub-class of `Tasklet` which allows us to directly specify an `Owner` of tasklet along with handler callback as a member method of `Owner`. This helps simplify the use of `Tasklet` in core module. --- src/core/border_router/routing_manager.cpp | 7 +----- src/core/border_router/routing_manager.hpp | 8 +++--- src/core/common/locator_getters.hpp | 7 ++++++ src/core/common/notifier.cpp | 7 +----- src/core/common/notifier.hpp | 7 +++--- src/core/common/tasklet.hpp | 27 ++++++++++++++++++++ src/core/mac/mac.cpp | 7 +----- src/core/mac/mac.hpp | 5 ++-- src/core/net/ip6.cpp | 7 +----- src/core/net/ip6.hpp | 7 +++--- src/core/net/tcp6.cpp | 9 +------ src/core/net/tcp6.hpp | 7 +++--- src/core/radio/trel_interface.cpp | 7 +----- src/core/radio/trel_interface.hpp | 29 +++++++++++----------- src/core/radio/trel_link.cpp | 7 +----- src/core/radio/trel_link.hpp | 7 +++--- src/core/thread/dua_manager.cpp | 7 +----- src/core/thread/dua_manager.hpp | 12 ++++----- src/core/thread/mesh_forwarder.cpp | 7 +----- src/core/thread/mesh_forwarder.hpp | 9 ++++--- src/core/thread/network_data_notifier.cpp | 7 +----- src/core/thread/network_data_notifier.hpp | 12 ++++----- 22 files changed, 100 insertions(+), 109 deletions(-) diff --git a/src/core/border_router/routing_manager.cpp b/src/core/border_router/routing_manager.cpp index 6bc67b802..61a5bca04 100644 --- a/src/core/border_router/routing_manager.cpp +++ b/src/core/border_router/routing_manager.cpp @@ -1288,7 +1288,7 @@ void RoutingManager::ResetDiscoveredPrefixStaleTimer(void) RoutingManager::DiscoveredPrefixTable::DiscoveredPrefixTable(Instance &aInstance) : InstanceLocator(aInstance) , mTimer(aInstance, HandleTimer) - , mSignalTask(aInstance, HandleSignalTask) + , mSignalTask(aInstance) , mAllowDefaultRouteInNetData(false) { } @@ -1823,11 +1823,6 @@ void RoutingManager::DiscoveredPrefixTable::SignalTableChanged(void) mSignalTask.Post(); } -void RoutingManager::DiscoveredPrefixTable::HandleSignalTask(Tasklet &aTasklet) -{ - aTasklet.Get().HandleDiscoveredPrefixTableChanged(); -} - void RoutingManager::DiscoveredPrefixTable::InitIterator(PrefixTableIterator &aIterator) const { Iterator &iterator = static_cast(aIterator); diff --git a/src/core/border_router/routing_manager.hpp b/src/core/border_router/routing_manager.hpp index 7e137c336..4d5869a76 100644 --- a/src/core/border_router/routing_manager.hpp +++ b/src/core/border_router/routing_manager.hpp @@ -349,6 +349,8 @@ private: kAdvPrefixesFromNetData, }; + void HandleDiscoveredPrefixTableChanged(void); // Declare early so we can use in `mSignalTask` + class DiscoveredPrefixTable : public InstanceLocator { // This class maintains the discovered on-link and route prefixes @@ -517,12 +519,13 @@ private: void HandleTimer(void); void RemoveExpiredEntries(void); void SignalTableChanged(void); - static void HandleSignalTask(Tasklet &aTasklet); + + using SignalTask = TaskletIn; Array mRouters; Pool mEntryPool; TimerMilli mTimer; - Tasklet mSignalTask; + SignalTask mSignalTask; bool mAllowDefaultRouteInNetData; }; @@ -672,7 +675,6 @@ private: bool ShouldProcessPrefixInfoOption(const Ip6::Nd::PrefixInfoOption &aPio, const Ip6::Prefix &aPrefix); bool ShouldProcessRouteInfoOption(const Ip6::Nd::RouteInfoOption &aRio, const Ip6::Prefix &aPrefix); void UpdateDiscoveredPrefixTableOnNetDataChange(void); - void HandleDiscoveredPrefixTableChanged(void); bool NetworkDataContainsOmrPrefix(const Ip6::Prefix &aPrefix) const; void UpdateRouterAdvertHeader(const Ip6::Nd::RouterAdvertMessage *aRouterAdvertMessage); bool IsReceivedRouterAdvertFromManager(const Ip6::Nd::RouterAdvertMessage &aRaMessage) const; diff --git a/src/core/common/locator_getters.hpp b/src/core/common/locator_getters.hpp index e1c68855c..cda56119a 100644 --- a/src/core/common/locator_getters.hpp +++ b/src/core/common/locator_getters.hpp @@ -39,6 +39,7 @@ #include "common/instance.hpp" #include "common/locator.hpp" +#include "common/tasklet.hpp" namespace ot { @@ -49,6 +50,12 @@ inline Type &GetProvider::Get(void) const return static_cast(this)->GetInstance().template Get(); } +template +void TaskletIn::HandleTasklet(Tasklet &aTasklet) +{ + (aTasklet.Get().*HandleTaskletPtr)(); +} + } // namespace ot #endif // LOCATOR_GETTERS_HPP_ diff --git a/src/core/common/notifier.cpp b/src/core/common/notifier.cpp index 7fd2831a6..a2c18bda0 100644 --- a/src/core/common/notifier.cpp +++ b/src/core/common/notifier.cpp @@ -46,7 +46,7 @@ RegisterLogModule("Notifier"); Notifier::Notifier(Instance &aInstance) : InstanceLocator(aInstance) - , mTask(aInstance, Notifier::EmitEvents) + , mTask(aInstance) { for (ExternalCallback &callback : mExternalCallbacks) { @@ -118,11 +118,6 @@ void Notifier::SignalIfFirst(Event aEvent) } } -void Notifier::EmitEvents(Tasklet &aTasklet) -{ - aTasklet.Get().EmitEvents(); -} - void Notifier::EmitEvents(void) { Events events; diff --git a/src/core/common/notifier.hpp b/src/core/common/notifier.hpp index 8887671af..a8678203a 100644 --- a/src/core/common/notifier.hpp +++ b/src/core/common/notifier.hpp @@ -313,15 +313,16 @@ private: void * mContext; }; - static void EmitEvents(Tasklet &aTasklet); - void EmitEvents(void); + void EmitEvents(void); void LogEvents(Events aEvents) const; const char *EventToString(Event aEvent) const; + using EmitEventsTask = TaskletIn; + Events mEventsToSignal; Events mSignaledEvents; - Tasklet mTask; + EmitEventsTask mTask; ExternalCallback mExternalCallbacks[kMaxExternalHandlers]; }; diff --git a/src/core/common/tasklet.hpp b/src/core/common/tasklet.hpp index 6899e57d7..3694eab83 100644 --- a/src/core/common/tasklet.hpp +++ b/src/core/common/tasklet.hpp @@ -149,6 +149,33 @@ private: Tasklet *mNext; }; +/** + * This template class defines a tasklet owned by specific type and using a method on owner type as the callback. + * + * @tparam Owner The type of owner of this tasklet. + * @tparam HandleTaskletPtr A pointer to a non-static member method of `Owner` to use as tasklet handler. + * + * The `Owner` MUST be a type that is accessible using `InstanceLocator::Get()`. + * + */ +template class TaskletIn : public Tasklet +{ +public: + /** + * This constructor initializes the tasklet. + * + * @param[in] aInstance The OpenThread instance. + * + */ + explicit TaskletIn(Instance &aInstance) + : Tasklet(aInstance, HandleTasklet) + { + } + +private: + static void HandleTasklet(Tasklet &aTasklet); // Implemented in `locator_getters.hpp` +}; + /** * This class defines a tasklet that also maintains a user context pointer. * diff --git a/src/core/mac/mac.cpp b/src/core/mac/mac.cpp index b5b5de355..a0bf6b52e 100644 --- a/src/core/mac/mac.cpp +++ b/src/core/mac/mac.cpp @@ -100,7 +100,7 @@ Mac::Mac(Instance &aInstance) , mActiveScanHandler(nullptr) // Initialize `mActiveScanHandler` and `mEnergyScanHandler` union , mScanHandlerContext(nullptr) , mLinks(aInstance) - , mOperationTask(aInstance, Mac::HandleOperationTask) + , mOperationTask(aInstance) , mTimer(aInstance, Mac::HandleTimer) , mKeyIdMode2FrameCounter(0) , mCcaSampleCount(0) @@ -608,11 +608,6 @@ void Mac::StartOperation(Operation aOperation) } } -void Mac::HandleOperationTask(Tasklet &aTasklet) -{ - aTasklet.Get().PerformNextOperation(); -} - void Mac::PerformNextOperation(void) { VerifyOrExit(mOperation == kOperationIdle); diff --git a/src/core/mac/mac.hpp b/src/core/mac/mac.hpp index 3ed8935a0..cce66168d 100644 --- a/src/core/mac/mac.hpp +++ b/src/core/mac/mac.hpp @@ -763,7 +763,6 @@ private: static void HandleTimer(Timer &aTimer); void HandleTimer(void); - static void HandleOperationTask(Tasklet &aTasklet); void Scan(Operation aScanOperation, uint32_t aScanChannels, uint16_t aScanDuration); Error UpdateScanChannel(void); @@ -789,6 +788,8 @@ private: #endif static const char *OperationToString(Operation aOperation); + using OperationTask = TaskletIn; + static const otExtAddress sMode2ExtAddress; bool mEnabled : 1; @@ -835,7 +836,7 @@ private: void *mScanHandlerContext; Links mLinks; - Tasklet mOperationTask; + OperationTask mOperationTask; TimerMilli mTimer; otMacCounters mCounters; uint32_t mKeyIdMode2FrameCounter; diff --git a/src/core/net/ip6.cpp b/src/core/net/ip6.cpp index 83fc73833..a0aa0ad7f 100644 --- a/src/core/net/ip6.cpp +++ b/src/core/net/ip6.cpp @@ -75,7 +75,7 @@ Ip6::Ip6(Instance &aInstance) , mReceiveIp4DatagramCallback(nullptr) , mReceiveIp4DatagramCallbackContext(nullptr) #endif - , mSendQueueTask(aInstance, Ip6::HandleSendQueue) + , mSendQueueTask(aInstance) , mIcmp(aInstance) , mUdp(aInstance) , mMpl(aInstance) @@ -543,11 +543,6 @@ exit: return error; } -void Ip6::HandleSendQueue(Tasklet &aTasklet) -{ - aTasklet.Get().HandleSendQueue(); -} - void Ip6::HandleSendQueue(void) { Message *message; diff --git a/src/core/net/ip6.hpp b/src/core/net/ip6.hpp index 7106b5d97..34e63c37f 100644 --- a/src/core/net/ip6.hpp +++ b/src/core/net/ip6.hpp @@ -343,8 +343,7 @@ private: static constexpr uint16_t kMinimalMtu = 1280; - static void HandleSendQueue(Tasklet &aTasklet); - void HandleSendQueue(void); + void HandleSendQueue(void); static uint8_t PriorityToDscp(Message::Priority aPriority); static Error GetDatagramPriority(const uint8_t *aData, uint16_t aDataLen, Message::Priority &aPriority); @@ -383,6 +382,8 @@ private: bool ShouldForwardToThread(const MessageInfo &aMessageInfo, MessageOrigin aOrigin) const; bool IsOnLink(const Address &aAddress) const; + using SendQueueTask = TaskletIn; + bool mForwardingEnabled; bool mIsReceiveIp6FilterEnabled; otIp6ReceiveCallback mReceiveIp6DatagramCallback; @@ -394,7 +395,7 @@ private: #endif PriorityQueue mSendQueue; - Tasklet mSendQueueTask; + SendQueueTask mSendQueueTask; Icmp mIcmp; Udp mUdp; diff --git a/src/core/net/tcp6.cpp b/src/core/net/tcp6.cpp index 0567b68dd..0cd9c2f72 100644 --- a/src/core/net/tcp6.cpp +++ b/src/core/net/tcp6.cpp @@ -73,7 +73,7 @@ static_assert(offsetof(Tcp::Listener, mTcbListen) == 0, "mTcbListen field in otT Tcp::Tcp(Instance &aInstance) : InstanceLocator(aInstance) , mTimer(aInstance, Tcp::HandleTimer) - , mTasklet(aInstance, Tcp::HandleTasklet) + , mTasklet(aInstance) , mEphemeralPort(kDynamicPortMin) { OT_UNUSED_VARIABLE(mEphemeralPort); @@ -918,13 +918,6 @@ restart: } } -void Tcp::HandleTasklet(Tasklet &aTasklet) -{ - OT_ASSERT(&aTasklet == &aTasklet.Get().mTasklet); - LogDebg("TCP tasklet invoked"); - aTasklet.Get().ProcessCallbacks(); -} - void Tcp::ProcessCallbacks(void) { for (Endpoint &endpoint : mEndpoints) diff --git a/src/core/net/tcp6.hpp b/src/core/net/tcp6.hpp index 501fd5ae1..3eb6d134f 100644 --- a/src/core/net/tcp6.hpp +++ b/src/core/net/tcp6.hpp @@ -680,11 +680,12 @@ private: static void HandleTimer(Timer &aTimer); void ProcessTimers(void); - static void HandleTasklet(Tasklet &aTasklet); - void ProcessCallbacks(void); + void ProcessCallbacks(void); + + using TcpTasklet = TaskletIn; TimerMilli mTimer; - Tasklet mTasklet; + TcpTasklet mTasklet; LinkedList mEndpoints; LinkedList mListeners; diff --git a/src/core/radio/trel_interface.cpp b/src/core/radio/trel_interface.cpp index 68825e9c4..40a008182 100644 --- a/src/core/radio/trel_interface.cpp +++ b/src/core/radio/trel_interface.cpp @@ -59,7 +59,7 @@ Interface::Interface(Instance &aInstance) , mInitialized(false) , mEnabled(false) , mFiltered(false) - , mRegisterServiceTask(aInstance, HandleRegisterServiceTask) + , mRegisterServiceTask(aInstance) { } @@ -127,11 +127,6 @@ exit: return; } -void Interface::HandleRegisterServiceTask(Tasklet &aTasklet) -{ - aTasklet.Get().RegisterService(); -} - void Interface::RegisterService(void) { // TXT data consists of two entries: the length fields, the diff --git a/src/core/radio/trel_interface.hpp b/src/core/radio/trel_interface.hpp index b80bf1b78..4d9f86e6a 100644 --- a/src/core/radio/trel_interface.hpp +++ b/src/core/radio/trel_interface.hpp @@ -242,21 +242,22 @@ private: void HandleReceived(uint8_t *aBuffer, uint16_t aLength); void HandleDiscoveredPeerInfo(const Peer::Info &aInfo); - static void HandleRegisterServiceTask(Tasklet &aTasklet); - void RegisterService(void); - Error ParsePeerInfoTxtData(const Peer::Info & aInfo, - Mac::ExtAddress & aExtAddress, - MeshCoP::ExtendedPanId &aExtPanId) const; - Peer * GetNewPeerEntry(void); - void RemovePeerEntry(Peer &aEntry); + void RegisterService(void); + Error ParsePeerInfoTxtData(const Peer::Info & aInfo, + Mac::ExtAddress & aExtAddress, + MeshCoP::ExtendedPanId &aExtPanId) const; + Peer *GetNewPeerEntry(void); + void RemovePeerEntry(Peer &aEntry); - bool mInitialized : 1; - bool mEnabled : 1; - bool mFiltered : 1; - Tasklet mRegisterServiceTask; - uint16_t mUdpPort; - Packet mRxPacket; - PeerTable mPeerTable; + using RegsiterServiceTask = TaskletIn; + + bool mInitialized : 1; + bool mEnabled : 1; + bool mFiltered : 1; + RegsiterServiceTask mRegisterServiceTask; + uint16_t mUdpPort; + Packet mRxPacket; + PeerTable mPeerTable; }; } // namespace Trel diff --git a/src/core/radio/trel_link.cpp b/src/core/radio/trel_link.cpp index 549633b0c..be68dfb62 100644 --- a/src/core/radio/trel_link.cpp +++ b/src/core/radio/trel_link.cpp @@ -51,7 +51,7 @@ Link::Link(Instance &aInstance) , mRxChannel(0) , mPanId(Mac::kPanIdBroadcast) , mTxPacketNumber(0) - , mTxTasklet(aInstance, HandleTxTasklet) + , mTxTasklet(aInstance) , mTimer(aInstance, HandleTimer) , mInterface(aInstance) { @@ -116,11 +116,6 @@ void Link::Send(void) mTxTasklet.Post(); } -void Link::HandleTxTasklet(Tasklet &aTasklet) -{ - aTasklet.Get().HandleTxTasklet(); -} - void Link::HandleTxTasklet(void) { BeginTransmit(); diff --git a/src/core/radio/trel_link.hpp b/src/core/radio/trel_link.hpp index fd00ac501..ba3367051 100644 --- a/src/core/radio/trel_link.hpp +++ b/src/core/radio/trel_link.hpp @@ -174,19 +174,20 @@ private: void HandleTimer(Neighbor &aNeighbor); void HandleNotifierEvents(Events aEvents); - static void HandleTxTasklet(Tasklet &aTasklet); - void HandleTxTasklet(void); + void HandleTxTasklet(void); static void HandleTimer(Timer &aTimer); void HandleTimer(void); static const char *StateToString(State aState); + using TxTasklet = TaskletIn; + State mState; uint8_t mRxChannel; Mac::PanId mPanId; uint32_t mTxPacketNumber; - Tasklet mTxTasklet; + TxTasklet mTxTasklet; TimerMilli mTimer; Interface mInterface; Mac::RxFrame mRxFrame; diff --git a/src/core/thread/dua_manager.cpp b/src/core/thread/dua_manager.cpp index 108f07a73..132d9f9dd 100644 --- a/src/core/thread/dua_manager.cpp +++ b/src/core/thread/dua_manager.cpp @@ -54,7 +54,7 @@ RegisterLogModule("DuaManager"); DuaManager::DuaManager(Instance &aInstance) : InstanceLocator(aInstance) - , mRegistrationTask(aInstance, DuaManager::HandleRegistrationTask) + , mRegistrationTask(aInstance) , mDuaNotification(UriPath::kDuaRegistrationNotify, &DuaManager::HandleDuaNotification, this) , mIsDuaPending(false) #if OPENTHREAD_CONFIG_DUA_ENABLE @@ -402,11 +402,6 @@ void DuaManager::HandleTimeTick(void) UpdateTimeTickerRegistration(); } -void DuaManager::HandleRegistrationTask(Tasklet &aTasklet) -{ - aTasklet.Get().PerformNextRegistration(); -} - void DuaManager::UpdateTimeTickerRegistration(void) { if (mDelay.mValue == 0) diff --git a/src/core/thread/dua_manager.hpp b/src/core/thread/dua_manager.hpp index 45d780797..587ad38db 100644 --- a/src/core/thread/dua_manager.hpp +++ b/src/core/thread/dua_manager.hpp @@ -195,8 +195,6 @@ private: void HandleTimeTick(void); - static void HandleRegistrationTask(Tasklet &aTasklet); - void UpdateTimeTickerRegistration(void); static void HandleDuaResponse(void * aContext, @@ -214,10 +212,12 @@ private: void UpdateReregistrationDelay(void); void UpdateCheckDelay(uint8_t aDelay); - Tasklet mRegistrationTask; - Coap::Resource mDuaNotification; - Ip6::Address mRegisteringDua; - bool mIsDuaPending : 1; + using RegistrationTask = TaskletIn; + + RegistrationTask mRegistrationTask; + Coap::Resource mDuaNotification; + Ip6::Address mRegisteringDua; + bool mIsDuaPending : 1; #if OPENTHREAD_CONFIG_DUA_ENABLE enum DuaState : uint8_t diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 5668d7e7f..8cdfa0165 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -105,7 +105,7 @@ MeshForwarder::MeshForwarder(Instance &aInstance) , mDelayNextTx(false) , mTxDelayTimer(aInstance, HandleTxDelayTimer) #endif - , mScheduleTransmissionTask(aInstance, MeshForwarder::ScheduleTransmissionTask) + , mScheduleTransmissionTask(aInstance) #if OPENTHREAD_FTD , mIndirectSender(aInstance) #endif @@ -521,11 +521,6 @@ exit: #endif // (OPENTHREAD_CONFIG_MAX_FRAMES_IN_DIRECT_TX_QUEUE > 0) -void MeshForwarder::ScheduleTransmissionTask(Tasklet &aTasklet) -{ - aTasklet.Get().ScheduleTransmissionTask(); -} - void MeshForwarder::ScheduleTransmissionTask(void) { VerifyOrExit(!mSendBusy && !mTxPaused); diff --git a/src/core/thread/mesh_forwarder.hpp b/src/core/thread/mesh_forwarder.hpp index 4f00766f7..77059d009 100644 --- a/src/core/thread/mesh_forwarder.hpp +++ b/src/core/thread/mesh_forwarder.hpp @@ -487,9 +487,8 @@ private: void UpdateSendMessage(Error aFrameTxError, Mac::Address &aMacDest, Neighbor *aNeighbor); void RemoveMessageIfNoPendingTx(Message &aMessage); - void HandleTimeTick(void); - static void ScheduleTransmissionTask(Tasklet &aTasklet); - void ScheduleTransmissionTask(void); + void HandleTimeTick(void); + void ScheduleTransmissionTask(void); Error GetFramePriority(const FrameData &aFrameData, const Mac::Addresses &aMacAddrs, Message::Priority &aPriority); Error GetFragmentPriority(Lowpan::FragmentHeader &aFragmentHeader, @@ -555,6 +554,8 @@ private: LogLevel aLogLevel); #endif // #if OT_SHOULD_LOG_AT(OT_LOG_LEVEL_NOTE) + using TxTask = TaskletIn; + PriorityQueue mSendQueue; MessageQueue mReassemblyList; uint16_t mFragTag; @@ -574,7 +575,7 @@ private: TimerMilli mTxDelayTimer; #endif - Tasklet mScheduleTransmissionTask; + TxTask mScheduleTransmissionTask; otIpCounters mIpCounters; diff --git a/src/core/thread/network_data_notifier.cpp b/src/core/thread/network_data_notifier.cpp index 00b15ce4c..ac9cd274d 100644 --- a/src/core/thread/network_data_notifier.cpp +++ b/src/core/thread/network_data_notifier.cpp @@ -50,7 +50,7 @@ RegisterLogModule("NetworkData"); Notifier::Notifier(Instance &aInstance) : InstanceLocator(aInstance) , mTimer(aInstance, HandleTimer) - , mSynchronizeDataTask(aInstance, HandleSynchronizeDataTask) + , mSynchronizeDataTask(aInstance) , mNextDelay(0) , mWaitingForResponse(false) #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE && OPENTHREAD_CONFIG_BORDER_ROUTER_REQUEST_ROUTER_ROLE @@ -71,11 +71,6 @@ void Notifier::HandleServerDataUpdated(void) mSynchronizeDataTask.Post(); } -void Notifier::HandleSynchronizeDataTask(Tasklet &aTasklet) -{ - aTasklet.Get().SynchronizeServerData(); -} - void Notifier::SynchronizeServerData(void) { Error error = kErrorNotFound; diff --git a/src/core/thread/network_data_notifier.hpp b/src/core/thread/network_data_notifier.hpp index 2388da739..dabb34634 100644 --- a/src/core/thread/network_data_notifier.hpp +++ b/src/core/thread/network_data_notifier.hpp @@ -115,18 +115,18 @@ private: Error aResult); void HandleCoapResponse(Error aResult); - static void HandleSynchronizeDataTask(Tasklet &aTasklet); - void SynchronizeServerData(void); #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE && OPENTHREAD_CONFIG_BORDER_ROUTER_REQUEST_ROUTER_ROLE void ScheduleRouterRoleUpgradeIfEligible(void); void HandleTimeTick(void); #endif - TimerMilli mTimer; - Tasklet mSynchronizeDataTask; - uint32_t mNextDelay; - bool mWaitingForResponse : 1; + using SynchronizeDataTask = TaskletIn; + + TimerMilli mTimer; + SynchronizeDataTask mSynchronizeDataTask; + uint32_t mNextDelay; + bool mWaitingForResponse : 1; #if OPENTHREAD_FTD && OPENTHREAD_CONFIG_BORDER_ROUTER_ENABLE && OPENTHREAD_CONFIG_BORDER_ROUTER_REQUEST_ROUTER_ROLE bool mDidRequestRouterRoleUpgrade : 1;