mirror of
https://github.com/espressif/openthread.git
synced 2026-09-25 02:17:39 +00:00
[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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user