[network-data] simplify code, user helper methods (#4780)

This commit contains the following changes in `NetworkData::Leader`:

- Simplify methods (`RemoveContext()`, `UpdateContextsAfterReset(),
 `FindServiceById()`, `RemoveRloc()`, etc) to use `FindTlv` when
  searching for TLVs of a given type.
- Removes redundant checks in `RlocLookup()`.
- Uses pointer to iterate through `BoderRouterTlv` or `HasRouteTlv`
  entries.
- Move simple getter/setter methods to header file (to be inline).
- Move variable decelerations into inner scopes when possible.
This commit is contained in:
Abtin Keshavarzian
2020-04-03 23:15:58 -07:00
committed by GitHub
parent 159dc8877c
commit 6f95f43b6f
4 changed files with 129 additions and 268 deletions
+8 -8
View File
@@ -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<HasRouteTlv *>(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;
+43 -93
View File
@@ -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<Leader>().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<ServerTlv>(start, serviceTlv->GetNext())) != NULL; start = serverTlv->GetNext())
{
ServerTlv * serverTlv = static_cast<ServerTlv *>(subCur);
const BackboneRouterServerData *serverData =
reinterpret_cast<const BackboneRouterServerData *>(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<PrefixTlv>(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<PrefixTlv *>(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<PrefixTlv>(start, GetTlvsEnd())) != NULL;
start = prefix->GetNext())
{
if (cur->GetType() != NetworkDataTlv::kTypePrefix)
{
continue;
}
ContextTlv *contextTlv = FindContext(*prefix);
prefix = static_cast<PrefixTlv *>(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<PrefixTlv>(start, GetTlvsEnd())) != NULL;
start = prefix->GetNext())
{
if (cur->GetType() != NetworkDataTlv::kTypePrefix)
{
continue;
}
prefix = static_cast<PrefixTlv *>(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<HasRouteTlv>(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<Mle::MleRouter>().GetRloc16() ||
(rvalRoute->GetRloc() != Get<Mle::MleRouter>().GetRloc16() &&
Get<Mle::MleRouter>().GetCost(entry->GetRloc()) <
Get<Mle::MleRouter>().GetCost(rvalRoute->GetRloc())))))
{
continue;
}
hasRoute = static_cast<HasRouteTlv *>(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<Mle::MleRouter>().GetRloc16() ||
(rvalRoute->GetRloc() != Get<Mle::MleRouter>().GetRloc16() &&
Get<Mle::MleRouter>().GetCost(entry->GetRloc()) <
Get<Mle::MleRouter>().GetCost(rvalRoute->GetRloc())))))
{
rvalRoute = entry;
rval_plen = static_cast<uint8_t>(plen);
}
rvalRoute = entry;
rval_plen = static_cast<uint8_t>(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<BorderRouterTlv>(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<BorderRouterTlv *>(cur);
for (uint8_t i = 0; i < borderRouter->GetNumEntries(); i++)
{
entry = borderRouter->GetEntry(i);
if (!entry->IsDefaultRoute())
{
continue;
+76 -165
View File
@@ -117,16 +117,6 @@ void Leader::IncrementVersions(bool aIncludeStable)
Get<Notifier>().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<NetworkDataTlv *>(aTlvs);
NetworkDataTlv * end = reinterpret_cast<NetworkDataTlv *>(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<NetworkDataTlv *>(aTlvs + aTlvsLength);
aIn = false;
aStable = false;
while (cur < end)
for (NetworkDataTlv *cur = reinterpret_cast<NetworkDataTlv *>(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<PrefixTlv *>(cur);
PrefixTlv * prefix = static_cast<PrefixTlv *>(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<BorderRouterTlv *>(subCur);
{
BorderRouterTlv *borderRouter = static_cast<BorderRouterTlv *>(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<HasRouteTlv *>(subCur);
{
HasRouteTlv *hasRoute = static_cast<HasRouteTlv *>(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<ServiceTlv *>(cur);
ServiceTlv * service = static_cast<ServiceTlv *>(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<ServerTlv *>(subCur);
{
ServerTlv *server = static_cast<ServerTlv *>(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<NetworkDataTlv *>(aTlvs);
NetworkDataTlv *end = reinterpret_cast<NetworkDataTlv *>(aTlvs + aTlvsLength);
ServiceTlv * service;
while (cur < end)
for (NetworkDataTlv *cur = reinterpret_cast<NetworkDataTlv *>(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<ServiceTlv *>(cur);
{
ServiceTlv *service = static_cast<ServiceTlv *>(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<NetworkDataTlv *>(aTlvs);
NetworkDataTlv *end = reinterpret_cast<NetworkDataTlv *>(aTlvs + aTlvsLength);
while (cur < end)
for (NetworkDataTlv *cur = reinterpret_cast<NetworkDataTlv *>(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<ServiceTlv>(start, GetTlvsEnd())) != NULL)
{
VerifyOrExit((cur + 1) <= end && cur->GetNext() <= end);
if (cur->GetType() == NetworkDataTlv::kTypeService)
if (service->GetServiceId() == aServiceId)
{
compare = static_cast<ServiceTlv *>(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<ServerTlv>(start, aService.GetNext())) != NULL)
{
switch (cur->GetType())
if (RlocMatch(server->GetServer16(), aRloc16, aMatchMode))
{
case NetworkDataTlv::kTypeServer:
server = static_cast<ServerTlv *>(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<PrefixTlv>(start, GetTlvsEnd())) != NULL)
{
switch (cur->GetType())
RemoveContext(*prefix, aContextId);
if (prefix->GetSubTlvsLength() == 0)
{
case NetworkDataTlv::kTypePrefix:
{
PrefixTlv *prefix = static_cast<PrefixTlv *>(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<ContextTlv>(start, aPrefix.GetNext())) != NULL)
{
switch (cur->GetType())
if (context->GetContextId() == aContextId)
{
case NetworkDataTlv::kTypeContext:
{
// remove context tlv
ContextTlv *context = static_cast<ContextTlv *>(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<PrefixTlv>(start, GetTlvsEnd())) != NULL; start = prefix->GetNext())
{
if (cur->GetType() != NetworkDataTlv::kTypePrefix)
ContextTlv *context = FindContext(*prefix);
if (context == NULL)
{
continue;
}
prefix = static_cast<PrefixTlv *>(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());
}
}
}
+2 -2
View File
@@ -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.