From c5d4fc5cbec29e54592022510a81da5f1eba01e4 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 16 Sep 2019 18:31:34 -0700 Subject: [PATCH] [topology] adding Child:Clear() and Router::Clear() (#4195) --- src/core/thread/child_table.cpp | 12 ++++++++++-- src/core/thread/child_table.hpp | 2 +- src/core/thread/mle.cpp | 9 ++++----- src/core/thread/mle_router.cpp | 4 +--- src/core/thread/router_table.cpp | 4 ++-- src/core/thread/topology.cpp | 12 ++++++++++++ src/core/thread/topology.hpp | 12 ++++++++++++ 7 files changed, 42 insertions(+), 13 deletions(-) diff --git a/src/core/thread/child_table.cpp b/src/core/thread/child_table.cpp index 5f4639ba7..2f9c14875 100644 --- a/src/core/thread/child_table.cpp +++ b/src/core/thread/child_table.cpp @@ -102,7 +102,15 @@ ChildTable::ChildTable(Instance &aInstance) : InstanceLocator(aInstance) , mMaxChildrenAllowed(kMaxChildren) { - memset(mChildren, 0, sizeof(mChildren)); + Clear(); +} + +void ChildTable::Clear(void) +{ + for (Child *child = &mChildren[0]; child < OT_ARRAY_END(mChildren); child++) + { + child->Clear(); + } } Child *ChildTable::GetChildAtIndex(uint16_t aChildIndex) @@ -124,7 +132,7 @@ Child *ChildTable::GetNewChild(void) { if (child->GetState() == Child::kStateInvalid) { - memset(child, 0, sizeof(Child)); + child->Clear(); ExitNow(); } } diff --git a/src/core/thread/child_table.hpp b/src/core/thread/child_table.hpp index eaf2714fc..ccee55c8f 100644 --- a/src/core/thread/child_table.hpp +++ b/src/core/thread/child_table.hpp @@ -170,7 +170,7 @@ public: * This method clears the child table. * */ - void Clear(void) { memset(mChildren, 0, sizeof(mChildren)); } + void Clear(void); /** * This method returns the child table index for a given `Child` instance. diff --git a/src/core/thread/mle.cpp b/src/core/thread/mle.cpp index d037e8f7f..b4d89257a 100644 --- a/src/core/thread/mle.cpp +++ b/src/core/thread/mle.cpp @@ -117,7 +117,7 @@ Mle::Mle(Instance &aInstance) memset(&mLeaderData, 0, sizeof(mLeaderData)); memset(&mParentLeaderData, 0, sizeof(mParentLeaderData)); - memset(&mParent, 0, sizeof(mParent)); + mParent.Clear(); memset(&mChildIdRequest, 0, sizeof(mChildIdRequest)); memset(&mLinkLocal64, 0, sizeof(mLinkLocal64)); memset(&mMeshLocal64, 0, sizeof(mMeshLocal64)); @@ -125,7 +125,7 @@ Mle::Mle(Instance &aInstance) memset(&mLinkLocalAllThreadNodes, 0, sizeof(mLinkLocalAllThreadNodes)); memset(&mRealmLocalAllThreadNodes, 0, sizeof(mRealmLocalAllThreadNodes)); memset(&mLeaderAloc, 0, sizeof(mLeaderAloc)); - memset(&mParentCandidate, 0, sizeof(mParentCandidate)); + mParentCandidate.Clear(); ResetCounters(); // link-local 64 @@ -423,7 +423,7 @@ otError Mle::Restore(void) ExitNow(); } - memset(&mParent, 0, sizeof(mParent)); + mParent.Clear(); mParent.SetExtAddress(*static_cast(&parentInfo.mExtAddress)); mParent.SetDeviceMode(DeviceMode(DeviceMode::kModeFullThreadDevice | DeviceMode::kModeRxOnWhenIdle | DeviceMode::kModeFullNetworkData | DeviceMode::kModeSecureDataRequest)); @@ -3175,8 +3175,7 @@ exit: void Mle::ResetParentCandidate(void) { - memset(&mParentCandidate, 0, sizeof(mParentCandidate)); - mParentCandidate.SetState(Neighbor::kStateInvalid); + mParentCandidate.Clear(); } otError Mle::HandleParentResponse(const Message &aMessage, const Ip6::MessageInfo &aMessageInfo, uint32_t aKeySequence) diff --git a/src/core/thread/mle_router.cpp b/src/core/thread/mle_router.cpp index 28420e7c9..1ab6979ce 100644 --- a/src/core/thread/mle_router.cpp +++ b/src/core/thread/mle_router.cpp @@ -1650,8 +1650,6 @@ otError MleRouter::HandleParentRequest(const Message &aMessage, const Ip6::Messa { VerifyOrExit((child = mChildTable.GetNewChild()) != NULL); - memset(child, 0, sizeof(*child)); - // MAC Address child->SetExtAddress(macAddr); child->GetLinkInfo().Clear(); @@ -3531,7 +3529,7 @@ void MleRouter::RestoreChildren(void) foundDuplicate = true; } - memset(child, 0, sizeof(*child)); + child->Clear(); child->SetExtAddress(*static_cast(&childInfo.mExtAddress)); child->GetLinkInfo().Clear(); diff --git a/src/core/thread/router_table.cpp b/src/core/thread/router_table.cpp index b98bcae3c..5b08384ec 100644 --- a/src/core/thread/router_table.cpp +++ b/src/core/thread/router_table.cpp @@ -183,7 +183,7 @@ void RouterTable::UpdateAllocation(void) if (router.GetRouterId() != routerId) { - memset(&router, 0, sizeof(router)); + router.Clear(); router.SetRloc16(Mle::Mle::GetRloc16(routerId)); router.SetNextHop(Mle::kInvalidRouterId); } @@ -194,7 +194,7 @@ void RouterTable::UpdateAllocation(void) for (uint8_t index = mActiveRouterCount; index < Mle::kMaxRouters; index++) { Router &router = mRouters[index]; - memset(&router, 0, sizeof(router)); + router.Clear(); router.SetRloc16(0xffff); } } diff --git a/src/core/thread/topology.cpp b/src/core/thread/topology.cpp index 01a245f0f..d99fd237b 100644 --- a/src/core/thread/topology.cpp +++ b/src/core/thread/topology.cpp @@ -46,6 +46,12 @@ void Neighbor::GenerateChallenge(void) Random::NonCrypto::FillBuffer(mValidPending.mPending.mChallenge, sizeof(mValidPending.mPending.mChallenge)); } +void Child::Clear(void) +{ + memset(reinterpret_cast(this), 0, sizeof(Child)); + SetState(kStateInvalid); +} + bool Child::IsStateValidOrAttaching(void) const { bool rval = false; @@ -240,4 +246,10 @@ void Child::GenerateChallenge(void) Random::NonCrypto::FillBuffer(mAttachChallenge, sizeof(mAttachChallenge)); } +void Router::Clear(void) +{ + memset(reinterpret_cast(this), 0, sizeof(Router)); + SetState(kStateInvalid); +} + } // namespace ot diff --git a/src/core/thread/topology.hpp b/src/core/thread/topology.hpp index ba2a0c3cb..5956a83bb 100644 --- a/src/core/thread/topology.hpp +++ b/src/core/thread/topology.hpp @@ -434,6 +434,12 @@ public: otChildIp6AddressIterator mIndex; }; + /** + * This method clears the child entry. + * + */ + void Clear(void); + /** * This method indicates if the child state is valid or being attached or being restored. * @@ -654,6 +660,12 @@ private: class Router : public Neighbor { public: + /** + * This method clears the router entry. + * + */ + void Clear(void); + /** * This method gets the router ID of the next hop to this router. *