diff --git a/src/core/thread/network_data.cpp b/src/core/thread/network_data.cpp index ab9e90a22..a2a069962 100644 --- a/src/core/thread/network_data.cpp +++ b/src/core/thread/network_data.cpp @@ -517,17 +517,16 @@ void NetworkData::RemoveTemporaryData(uint8_t *aData, uint8_t &aDataLength, Pref ContextTlv * context = FindContext(aPrefix); // Replace p_border_router_16 - for (uint8_t i = 0; i < borderRouter->GetNumEntries(); i++) + for (BorderRouterEntry *entry = borderRouter->GetFirstEntry(); entry <= borderRouter->GetLastEntry(); + entry = entry->GetNext()) { - BorderRouterEntry *borderRouterEntry = borderRouter->GetEntry(i); - - if ((borderRouterEntry->IsDhcp() || borderRouterEntry->IsConfigure()) && (context != NULL)) + if ((entry->IsDhcp() || entry->IsConfigure()) && (context != NULL)) { - borderRouterEntry->SetRloc(0xfc00 | context->GetContextId()); + entry->SetRloc(0xfc00 | context->GetContextId()); } else { - borderRouterEntry->SetRloc(0xfffe); + entry->SetRloc(0xfffe); } } @@ -539,9 +538,10 @@ void NetworkData::RemoveTemporaryData(uint8_t *aData, uint8_t &aDataLength, Pref HasRouteTlv *hasRoute = static_cast(cur); // Replace r_border_router_16 - for (uint8_t j = 0; j < hasRoute->GetNumEntries(); j++) + for (HasRouteEntry *entry = hasRoute->GetFirstEntry(); entry <= hasRoute->GetLastEntry(); + entry = entry->GetNext()) { - hasRoute->GetEntry(j)->SetRloc(0xfffe); + entry->SetRloc(0xfffe); } break; diff --git a/src/core/thread/network_data_leader.cpp b/src/core/thread/network_data_leader.cpp index 1032311b3..83d54bc8b 100644 --- a/src/core/thread/network_data_leader.cpp +++ b/src/core/thread/network_data_leader.cpp @@ -101,19 +101,15 @@ otError LeaderBase::GetBackboneRouterPrimary(BackboneRouter::BackboneRouterConfi ServerTlv * rvalServerTlv = NULL; const BackboneRouterServerData *rvalServerData = NULL; ServiceTlv * serviceTlv; - NetworkDataTlv * subCur; - NetworkDataTlv * subEnd; + ServerTlv * serverTlv; serviceTlv = Get().FindService(THREAD_ENTERPRISE_NUMBER, &serviceData, sizeof(serviceData)); VerifyOrExit(serviceTlv != NULL, aConfig.mServer16 = Mac::kShortAddrInvalid); - subCur = serviceTlv->GetSubTlvs(); - subEnd = serviceTlv->GetNext(); - - while ((subCur = FindTlv(subCur, subEnd, NetworkDataTlv::kTypeServer)) != NULL) + for (NetworkDataTlv *start = serviceTlv->GetSubTlvs(); + (serverTlv = FindTlv(start, serviceTlv->GetNext())) != NULL; start = serverTlv->GetNext()) { - ServerTlv * serverTlv = static_cast(subCur); const BackboneRouterServerData *serverData = reinterpret_cast(serverTlv->GetServerData()); @@ -126,8 +122,6 @@ otError LeaderBase::GetBackboneRouterPrimary(BackboneRouter::BackboneRouterConfi rvalServerTlv = serverTlv; rvalServerData = serverData; } - - subCur = subCur->GetNext(); } VerifyOrExit(rvalServerTlv != NULL); @@ -146,28 +140,17 @@ exit: PrefixTlv *LeaderBase::FindNextMatchingPrefix(const Ip6::Address &aAddress, PrefixTlv *aPrevTlv) { - PrefixTlv * prefix; - NetworkDataTlv *start = (aPrevTlv == NULL) ? GetTlvsStart() : aPrevTlv->GetNext(); + PrefixTlv *prefix; - for (NetworkDataTlv *cur = start; cur < GetTlvsEnd(); cur = cur->GetNext()) + for (NetworkDataTlv *start = (aPrevTlv == NULL) ? GetTlvsStart() : aPrevTlv->GetNext(); + (prefix = FindTlv(start, GetTlvsEnd())) != NULL; start = prefix->GetNext()) { - if (cur->GetType() != NetworkDataTlv::kTypePrefix) + if (PrefixMatch(prefix->GetPrefix(), aAddress.mFields.m8, prefix->GetPrefixLength()) >= 0) { - continue; + ExitNow(); } - - prefix = static_cast(cur); - - if (PrefixMatch(prefix->GetPrefix(), aAddress.mFields.m8, prefix->GetPrefixLength()) < 0) - { - continue; - } - - ExitNow(); } - prefix = NULL; - exit: return prefix; } @@ -210,9 +193,8 @@ otError LeaderBase::GetContext(const Ip6::Address &aAddress, Lowpan::Context &aC otError LeaderBase::GetContext(uint8_t aContextId, Lowpan::Context &aContext) { - otError error = OT_ERROR_NOT_FOUND; - PrefixTlv * prefix; - ContextTlv *contextTlv; + otError error = OT_ERROR_NOT_FOUND; + PrefixTlv *prefix; if (aContextId == Mle::kMeshLocalPrefixContextId) { @@ -223,22 +205,12 @@ otError LeaderBase::GetContext(uint8_t aContextId, Lowpan::Context &aContext) ExitNow(error = OT_ERROR_NONE); } - for (NetworkDataTlv *cur = GetTlvsStart(); cur < GetTlvsEnd(); cur = cur->GetNext()) + for (NetworkDataTlv *start = GetTlvsStart(); (prefix = FindTlv(start, GetTlvsEnd())) != NULL; + start = prefix->GetNext()) { - if (cur->GetType() != NetworkDataTlv::kTypePrefix) - { - continue; - } + ContextTlv *contextTlv = FindContext(*prefix); - prefix = static_cast(cur); - contextTlv = FindContext(*prefix); - - if (contextTlv == NULL) - { - continue; - } - - if (contextTlv->GetContextId() != aContextId) + if ((contextTlv == NULL) || (contextTlv->GetContextId() != aContextId)) { continue; } @@ -335,24 +307,16 @@ otError LeaderBase::ExternalRouteLookup(uint8_t aDomainId, uint8_t * aPrefixMatch, uint16_t * aRloc16) { - otError error = OT_ERROR_NO_ROUTE; - PrefixTlv * prefix; - HasRouteTlv * hasRoute; - HasRouteEntry * entry; - HasRouteEntry * rvalRoute = NULL; - uint8_t rval_plen = 0; - int8_t plen; - NetworkDataTlv *cur; - NetworkDataTlv *subCur; + otError error = OT_ERROR_NO_ROUTE; + PrefixTlv * prefix; + HasRouteEntry *rvalRoute = NULL; + uint8_t rval_plen = 0; - for (cur = GetTlvsStart(); cur < GetTlvsEnd(); cur = cur->GetNext()) + for (NetworkDataTlv *start = GetTlvsStart(); (prefix = FindTlv(start, GetTlvsEnd())) != NULL; + start = prefix->GetNext()) { - if (cur->GetType() != NetworkDataTlv::kTypePrefix) - { - continue; - } - - prefix = static_cast(cur); + HasRouteTlv *hasRoute; + int8_t plen; if (prefix->GetDomainId() != aDomainId) { @@ -361,32 +325,26 @@ otError LeaderBase::ExternalRouteLookup(uint8_t aDomainId, plen = PrefixMatch(prefix->GetPrefix(), aDestination.mFields.m8, prefix->GetPrefixLength()); - if (plen > rval_plen) + if (plen <= rval_plen) { - // select border router - for (subCur = prefix->GetSubTlvs(); subCur < prefix->GetNext(); subCur = subCur->GetNext()) + continue; + } + + for (NetworkDataTlv *subStart = prefix->GetSubTlvs(); + (hasRoute = FindTlv(subStart, prefix->GetNext())) != NULL; subStart = hasRoute->GetNext()) + { + for (HasRouteEntry *entry = hasRoute->GetFirstEntry(); entry <= hasRoute->GetLastEntry(); + entry = entry->GetNext()) { - if (subCur->GetType() != NetworkDataTlv::kTypeHasRoute) + if (rvalRoute == NULL || entry->GetPreference() > rvalRoute->GetPreference() || + (entry->GetPreference() == rvalRoute->GetPreference() && + (entry->GetRloc() == Get().GetRloc16() || + (rvalRoute->GetRloc() != Get().GetRloc16() && + Get().GetCost(entry->GetRloc()) < + Get().GetCost(rvalRoute->GetRloc()))))) { - continue; - } - - hasRoute = static_cast(subCur); - - for (uint8_t i = 0; i < hasRoute->GetNumEntries(); i++) - { - entry = hasRoute->GetEntry(i); - - if (rvalRoute == NULL || entry->GetPreference() > rvalRoute->GetPreference() || - (entry->GetPreference() == rvalRoute->GetPreference() && - (entry->GetRloc() == Get().GetRloc16() || - (rvalRoute->GetRloc() != Get().GetRloc16() && - Get().GetCost(entry->GetRloc()) < - Get().GetCost(rvalRoute->GetRloc()))))) - { - rvalRoute = entry; - rval_plen = static_cast(plen); - } + rvalRoute = entry; + rval_plen = static_cast(plen); } } } @@ -414,22 +372,14 @@ otError LeaderBase::DefaultRouteLookup(PrefixTlv &aPrefix, uint16_t *aRloc16) { otError error = OT_ERROR_NO_ROUTE; BorderRouterTlv * borderRouter; - BorderRouterEntry *entry; BorderRouterEntry *route = NULL; - for (NetworkDataTlv *cur = aPrefix.GetSubTlvs(); cur < aPrefix.GetNext(); cur = cur->GetNext()) + for (NetworkDataTlv *start = aPrefix.GetSubTlvs(); + (borderRouter = FindTlv(start, aPrefix.GetNext())) != NULL; start = borderRouter->GetNext()) { - if (cur->GetType() != NetworkDataTlv::kTypeBorderRouter) + for (BorderRouterEntry *entry = borderRouter->GetFirstEntry(); entry <= borderRouter->GetLastEntry(); + entry = entry->GetNext()) { - continue; - } - - borderRouter = static_cast(cur); - - for (uint8_t i = 0; i < borderRouter->GetNumEntries(); i++) - { - entry = borderRouter->GetEntry(i); - if (!entry->IsDefaultRoute()) { continue; diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index 8ea1acd6d..809308ec8 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -117,16 +117,6 @@ void Leader::IncrementVersions(bool aIncludeStable) Get().Signal(OT_CHANGED_THREAD_NETDATA); } -uint32_t Leader::GetContextIdReuseDelay(void) const -{ - return mContextIdReuseDelay; -} - -void Leader::SetContextIdReuseDelay(uint32_t aDelay) -{ - mContextIdReuseDelay = aDelay; -} - void Leader::RemoveBorderRouter(uint16_t aRloc16, MatchMode aMatchMode) { bool rlocIn; @@ -423,23 +413,13 @@ otError Leader::RlocLookup(uint16_t aRloc16, MatchMode aMatchMode, bool aAllowOtherEntries) { - otError error = OT_ERROR_NONE; - NetworkDataTlv * cur = reinterpret_cast(aTlvs); - NetworkDataTlv * end = reinterpret_cast(aTlvs + aTlvsLength); - NetworkDataTlv * subCur; - NetworkDataTlv * subEnd; - PrefixTlv * prefix; - BorderRouterTlv * borderRouter; - HasRouteTlv * hasRoute; - BorderRouterEntry *borderRouterEntry; - HasRouteEntry * hasRouteEntry; - ServiceTlv * service; - ServerTlv * server; + otError error = OT_ERROR_NONE; + NetworkDataTlv *end = reinterpret_cast(aTlvs + aTlvsLength); aIn = false; aStable = false; - while (cur < end) + for (NetworkDataTlv *cur = reinterpret_cast(aTlvs); cur < end; cur = cur->GetNext()) { VerifyOrExit((cur + 1) <= end && cur->GetNext() <= end, error = OT_ERROR_PARSE); @@ -447,27 +427,27 @@ otError Leader::RlocLookup(uint16_t aRloc16, { case NetworkDataTlv::kTypePrefix: { - prefix = static_cast(cur); + PrefixTlv * prefix = static_cast(cur); + NetworkDataTlv *subEnd; + VerifyOrExit(prefix->IsValid(), error = OT_ERROR_PARSE); - subCur = prefix->GetSubTlvs(); subEnd = prefix->GetNext(); - VerifyOrExit(subEnd <= end, error = OT_ERROR_PARSE); - - while (subCur < subEnd) + for (NetworkDataTlv *subCur = prefix->GetSubTlvs(); subCur < subEnd; subCur = subCur->GetNext()) { VerifyOrExit((subCur + 1) <= subEnd && subCur->GetNext() <= subEnd, error = OT_ERROR_PARSE); switch (subCur->GetType()) { case NetworkDataTlv::kTypeBorderRouter: - borderRouter = static_cast(subCur); + { + BorderRouterTlv *borderRouter = static_cast(subCur); - for (uint8_t i = 0; i < borderRouter->GetNumEntries(); i++) + for (BorderRouterEntry *borderRouterEntry = borderRouter->GetFirstEntry(); + borderRouterEntry <= borderRouter->GetLastEntry(); + borderRouterEntry = borderRouterEntry->GetNext()) { - borderRouterEntry = borderRouter->GetEntry(i); - if (RlocMatch(borderRouterEntry->GetRloc(), aRloc16, aMatchMode)) { aIn = true; @@ -484,14 +464,15 @@ otError Leader::RlocLookup(uint16_t aRloc16, } break; + } case NetworkDataTlv::kTypeHasRoute: - hasRoute = static_cast(subCur); + { + HasRouteTlv *hasRoute = static_cast(subCur); - for (uint8_t i = 0; i < hasRoute->GetNumEntries(); i++) + for (HasRouteEntry *hasRouteEntry = hasRoute->GetFirstEntry(); + hasRouteEntry <= hasRoute->GetLastEntry(); hasRouteEntry = hasRouteEntry->GetNext()) { - hasRouteEntry = hasRoute->GetEntry(i); - if (RlocMatch(hasRouteEntry->GetRloc(), aRloc16, aMatchMode)) { aIn = true; @@ -508,6 +489,7 @@ otError Leader::RlocLookup(uint16_t aRloc16, } break; + } default: break; @@ -517,30 +499,29 @@ otError Leader::RlocLookup(uint16_t aRloc16, { ExitNow(); } - - subCur = subCur->GetNext(); } } break; case NetworkDataTlv::kTypeService: { - service = static_cast(cur); + ServiceTlv * service = static_cast(cur); + NetworkDataTlv *subEnd; + VerifyOrExit(service->IsValid(), error = OT_ERROR_PARSE); - subCur = service->GetSubTlvs(); subEnd = service->GetNext(); - VerifyOrExit(subEnd <= end, error = OT_ERROR_PARSE); - - while (subCur < subEnd) + for (NetworkDataTlv *subCur = service->GetSubTlvs(); subCur < subEnd; subCur = subCur->GetNext()) { VerifyOrExit((subCur + 1) <= subEnd && subCur->GetNext() <= subEnd, error = OT_ERROR_PARSE); switch (subCur->GetType()) { case NetworkDataTlv::kTypeServer: - server = static_cast(subCur); + { + ServerTlv *server = static_cast(subCur); + VerifyOrExit(server->IsValid(), error = OT_ERROR_PARSE); if (RlocMatch(server->GetServer16(), aRloc16, aMatchMode)) @@ -558,6 +539,7 @@ otError Leader::RlocLookup(uint16_t aRloc16, } break; + } default: break; @@ -567,8 +549,6 @@ otError Leader::RlocLookup(uint16_t aRloc16, { ExitNow(); } - - subCur = subCur->GetNext(); } break; @@ -577,8 +557,6 @@ otError Leader::RlocLookup(uint16_t aRloc16, default: break; } - - cur = cur->GetNext(); } exit: @@ -588,11 +566,9 @@ exit: bool Leader::IsStableUpdated(uint8_t *aTlvs, uint8_t aTlvsLength, uint8_t *aTlvsBase, uint8_t aTlvsBaseLength) { bool rval = false; - NetworkDataTlv *cur = reinterpret_cast(aTlvs); NetworkDataTlv *end = reinterpret_cast(aTlvs + aTlvsLength); - ServiceTlv * service; - while (cur < end) + for (NetworkDataTlv *cur = reinterpret_cast(aTlvs); cur < end; cur = cur->GetNext()) { VerifyOrExit((cur + 1) <= end && cur->GetNext() <= end); @@ -642,7 +618,8 @@ bool Leader::IsStableUpdated(uint8_t *aTlvs, uint8_t aTlvsLength, uint8_t *aTlvs } case NetworkDataTlv::kTypeService: - service = static_cast(cur); + { + ServiceTlv *service = static_cast(cur); if (cur->IsStable()) { @@ -713,12 +690,11 @@ bool Leader::IsStableUpdated(uint8_t *aTlvs, uint8_t aTlvsLength, uint8_t *aTlvs } break; + } default: break; } - - cur = cur->GetNext(); } exit: @@ -770,10 +746,9 @@ exit: otError Leader::AddNetworkData(uint8_t *aTlvs, uint8_t aTlvsLength, uint8_t *aOldTlvs, uint8_t aOldTlvsLength) { otError error = OT_ERROR_NONE; - NetworkDataTlv *cur = reinterpret_cast(aTlvs); NetworkDataTlv *end = reinterpret_cast(aTlvs + aTlvsLength); - while (cur < end) + for (NetworkDataTlv *cur = reinterpret_cast(aTlvs); cur < end; cur = cur->GetNext()) { VerifyOrExit((cur + 1) <= end && cur->GetNext() <= end, error = OT_ERROR_PARSE); @@ -792,8 +767,6 @@ otError Leader::AddNetworkData(uint8_t *aTlvs, uint8_t aTlvsLength, uint8_t *aOl default: break; } - - cur = cur->GetNext(); } otDumpDebgNetData("add done", mTlvs, mLength); @@ -805,14 +778,12 @@ exit: otError Leader::AddPrefix(PrefixTlv &aPrefix) { otError error = OT_ERROR_NONE; - NetworkDataTlv *cur; NetworkDataTlv *end; VerifyOrExit(aPrefix.IsValid(), error = OT_ERROR_PARSE); - cur = aPrefix.GetSubTlvs(); end = aPrefix.GetNext(); - while (cur < end) + for (NetworkDataTlv *cur = aPrefix.GetSubTlvs(); cur < end; cur = cur->GetNext()) { VerifyOrExit((cur + 1) <= end && cur->GetNext() <= end, error = OT_ERROR_PARSE); @@ -829,8 +800,6 @@ otError Leader::AddPrefix(PrefixTlv &aPrefix) default: break; } - - cur = cur->GetNext(); } exit: @@ -840,14 +809,12 @@ exit: otError Leader::AddService(ServiceTlv &aService, uint8_t *aOldTlvs, uint8_t aOldTlvsLength) { otError error = OT_ERROR_NONE; - NetworkDataTlv *cur; NetworkDataTlv *end; VerifyOrExit(aService.IsValid(), error = OT_ERROR_PARSE); - cur = aService.GetSubTlvs(); end = aService.GetNext(); - while (cur < end) + for (NetworkDataTlv *cur = aService.GetSubTlvs(); cur < end; cur = cur->GetNext()) { VerifyOrExit((cur + 1) <= end && cur->GetNext() <= end, error = OT_ERROR_PARSE); @@ -860,8 +827,6 @@ otError Leader::AddService(ServiceTlv &aService, uint8_t *aOldTlvs, uint8_t aOld default: break; } - - cur = cur->GetNext(); } exit: @@ -1016,31 +981,21 @@ exit: ServiceTlv *Leader::FindServiceById(uint8_t aServiceId) { - NetworkDataTlv *cur = GetTlvsStart(); - NetworkDataTlv *end = GetTlvsEnd(); - ServiceTlv * compare = NULL; + NetworkDataTlv *start = GetTlvsStart(); + ServiceTlv * service; - while (cur < end) + while ((service = FindTlv(start, GetTlvsEnd())) != NULL) { - VerifyOrExit((cur + 1) <= end && cur->GetNext() <= end); - - if (cur->GetType() == NetworkDataTlv::kTypeService) + if (service->GetServiceId() == aServiceId) { - compare = static_cast(cur); - - if (compare->GetServiceId() == aServiceId) - { - ExitNow(); - } + ExitNow(); } - cur = cur->GetNext(); + start = service->GetNext(); } - compare = NULL; - exit: - return compare; + return service; } otError Leader::AddBorderRouter(PrefixTlv &aPrefix, BorderRouterTlv &aBorderRouter) @@ -1300,31 +1255,20 @@ void Leader::RemoveRloc(PrefixTlv &aPrefix, uint16_t aRloc16, MatchMode aMatchMo void Leader::RemoveRloc(ServiceTlv &aService, uint16_t aRloc16, MatchMode aMatchMode) { - NetworkDataTlv *cur = aService.GetSubTlvs(); + NetworkDataTlv *start = aService.GetSubTlvs(); ServerTlv * server; - while (cur < aService.GetNext()) + while ((server = FindTlv(start, aService.GetNext())) != NULL) { - switch (cur->GetType()) + if (RlocMatch(server->GetServer16(), aRloc16, aMatchMode)) { - case NetworkDataTlv::kTypeServer: - server = static_cast(cur); - - if (RlocMatch(server->GetServer16(), aRloc16, aMatchMode)) - { - uint8_t subTlvSize = server->GetSize(); - RemoveTlv(server); - aService.SetSubTlvsLength(aService.GetSubTlvsLength() - subTlvSize); - continue; - } - - break; - - default: - break; + uint8_t subTlvSize = server->GetSize(); + RemoveTlv(server); + aService.SetSubTlvsLength(aService.GetSubTlvsLength() - subTlvSize); + continue; } - cur = cur->GetNext(); + start = server->GetNext(); } } @@ -1366,33 +1310,20 @@ void Leader::RemoveRloc(PrefixTlv &aPrefix, BorderRouterTlv &aBorderRouter, uint void Leader::RemoveContext(uint8_t aContextId) { - NetworkDataTlv *cur = GetTlvsStart(); + NetworkDataTlv *start = GetTlvsStart(); + PrefixTlv * prefix; - while (cur < GetTlvsEnd()) + while ((prefix = FindTlv(start, GetTlvsEnd())) != NULL) { - switch (cur->GetType()) + RemoveContext(*prefix, aContextId); + + if (prefix->GetSubTlvsLength() == 0) { - case NetworkDataTlv::kTypePrefix: - { - PrefixTlv *prefix = static_cast(cur); - - RemoveContext(*prefix, aContextId); - - if (prefix->GetSubTlvsLength() == 0) - { - RemoveTlv(prefix); - continue; - } - - otDumpDebgNetData("remove prefix done", mTlvs, mLength); - break; + RemoveTlv(prefix); + continue; } - default: - break; - } - - cur = cur->GetNext(); + start = prefix->GetNext(); } otDumpDebgNetData("remove done", mTlvs, mLength); @@ -1400,66 +1331,46 @@ void Leader::RemoveContext(uint8_t aContextId) void Leader::RemoveContext(PrefixTlv &aPrefix, uint8_t aContextId) { - NetworkDataTlv *cur = aPrefix.GetSubTlvs(); + NetworkDataTlv *start = aPrefix.GetSubTlvs(); + ContextTlv * context; - while (cur < aPrefix.GetNext()) + while ((context = FindTlv(start, aPrefix.GetNext())) != NULL) { - switch (cur->GetType()) + if (context->GetContextId() == aContextId) { - case NetworkDataTlv::kTypeContext: - { - // remove context tlv - ContextTlv *context = static_cast(cur); - - if (context->GetContextId() == aContextId) - { - uint8_t subTlvSize = context->GetSize(); - RemoveTlv(context); - aPrefix.SetSubTlvsLength(aPrefix.GetSubTlvsLength() - subTlvSize); - continue; - } - - break; + uint8_t subTlvSize = context->GetSize(); + RemoveTlv(context); + aPrefix.SetSubTlvsLength(aPrefix.GetSubTlvsLength() - subTlvSize); + continue; } - default: - break; - } - - cur = cur->GetNext(); + start = context->GetNext(); } } void Leader::UpdateContextsAfterReset(void) { - PrefixTlv * prefix; - ContextTlv *contextTlv; + NetworkDataTlv *start; + PrefixTlv * prefix; - // Iterate through Network Data and synchronize missing contexts. - for (NetworkDataTlv *cur = GetTlvsStart(); cur < GetTlvsEnd(); cur = cur->GetNext()) + for (start = GetTlvsStart(); (prefix = FindTlv(start, GetTlvsEnd())) != NULL; start = prefix->GetNext()) { - if (cur->GetType() != NetworkDataTlv::kTypePrefix) + ContextTlv *context = FindContext(*prefix); + + if (context == NULL) { continue; } - prefix = static_cast(cur); - contextTlv = FindContext(*prefix); + mContextUsed |= 1 << context->GetContextId(); - if (contextTlv == NULL) + if (context->IsCompress()) { - continue; - } - - mContextUsed |= 1 << contextTlv->GetContextId(); - - if (contextTlv->IsCompress()) - { - StopContextReuseTimer(contextTlv->GetContextId()); + StopContextReuseTimer(context->GetContextId()); } else { - StartContextReuseTimer(contextTlv->GetContextId()); + StartContextReuseTimer(context->GetContextId()); } } } diff --git a/src/core/thread/network_data_leader_ftd.hpp b/src/core/thread/network_data_leader_ftd.hpp index 66151c47b..8aa9f7fd1 100644 --- a/src/core/thread/network_data_leader_ftd.hpp +++ b/src/core/thread/network_data_leader_ftd.hpp @@ -119,7 +119,7 @@ public: * @returns The CONTEXT_ID_REUSE_DELAY value. * */ - uint32_t GetContextIdReuseDelay(void) const; + uint32_t GetContextIdReuseDelay(void) const { return mContextIdReuseDelay; } /** * This method sets CONTEXT_ID_RESUSE_DELAY value. @@ -129,7 +129,7 @@ public: * @param[in] aDelay The CONTEXT_ID_REUSE_DELAY value. * */ - void SetContextIdReuseDelay(uint32_t aDelay); + void SetContextIdReuseDelay(uint32_t aDelay) { mContextIdReuseDelay = aDelay; } /** * This method removes Network Data entries matching with a given RLOC16.