From c85a1c3c7153510e89e5a89a87fbf094f4046c50 Mon Sep 17 00:00:00 2001 From: "Duda, Lukasz" Date: Sun, 9 Feb 2020 01:18:18 +0100 Subject: [PATCH] [address-resolver] dequeue message from resolving queue before invalidate the entry (#4540) --- src/core/thread/address_resolver.cpp | 22 ++++++++++++++++++++-- src/core/thread/address_resolver.hpp | 1 + 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/core/thread/address_resolver.cpp b/src/core/thread/address_resolver.cpp index e024a0018..cb2e987d4 100644 --- a/src/core/thread/address_resolver.cpp +++ b/src/core/thread/address_resolver.cpp @@ -60,7 +60,7 @@ AddressResolver::AddressResolver(Instance &aInstance) , mIcmpHandler(&AddressResolver::HandleIcmpReceive, this) , mTimer(aInstance, &AddressResolver::HandleTimer, this) { - Clear(); + Init(); Get().AddResource(mAddressError); Get().AddResource(mAddressQuery); @@ -69,7 +69,7 @@ AddressResolver::AddressResolver(Instance &aInstance) Get().RegisterHandler(mIcmpHandler); } -void AddressResolver::Clear(void) +void AddressResolver::Init(void) { memset(&mCache, 0, sizeof(mCache)); @@ -79,11 +79,27 @@ void AddressResolver::Clear(void) } } +void AddressResolver::Clear(void) +{ + for (uint8_t i = 0; i < kCacheEntries; i++) + { + if (mCache[i].mState != Cache::kStateQuery) + { + continue; + } + + Get().HandleResolved(mCache[i].mTarget, OT_ERROR_DROP); + } + + Init(); +} + otError AddressResolver::GetEntry(uint8_t aIndex, otEidCacheEntry &aEntry) const { otError error = OT_ERROR_NONE; VerifyOrExit(aIndex < kCacheEntries, error = OT_ERROR_INVALID_ARGS); + aEntry.mTarget = mCache[aIndex].mTarget; aEntry.mRloc16 = mCache[aIndex].mRloc16; aEntry.mAge = mCache[aIndex].mAge; @@ -220,6 +236,8 @@ void AddressResolver::InvalidateCacheEntry(Cache &aEntry, InvalidationReason aRe otLogNoteArp("Cache entry (query mode) removed: %s, timeout:%d, retry:%d - %s", aEntry.mTarget.ToString().AsCString(), aEntry.mTimeout, aEntry.mRetryTimeout, InvalidationReasonToString(aReason)); + + Get().HandleResolved(aEntry.mTarget, OT_ERROR_DROP); break; default: diff --git a/src/core/thread/address_resolver.hpp b/src/core/thread/address_resolver.hpp index 0c3b5bf0d..5b91f9393 100644 --- a/src/core/thread/address_resolver.hpp +++ b/src/core/thread/address_resolver.hpp @@ -210,6 +210,7 @@ private: static const char *InvalidationReasonToString(InvalidationReason aReason); + void Init(void); Cache *NewCacheEntry(void); void MarkCacheEntryAsUsed(Cache &aEntry); void InvalidateCacheEntry(Cache &aEntry, InvalidationReason aReason);