[child-table] detect child move by inspecting messages (#2600)

This commit is contained in:
Jonathan Hui
2018-03-01 22:20:10 +00:00
committed by GitHub
parent 17db74dc8b
commit 0e9c0cd6b7
2 changed files with 12 additions and 17 deletions
+1 -8
View File
@@ -1370,14 +1370,7 @@ void MeshForwarder::HandleLowpanHC(uint8_t * aFrame,
int headerLength;
#if OPENTHREAD_FTD
if (!aMacDest.IsBroadcast() && aMacSource.IsShort())
{
Ip6::Header ip6header;
VerifyOrExit(netif.GetLowpan().DecompressBaseHeader(ip6header, aMacSource, aMacDest, aFrame, aFrameLength) > 0,
error = OT_ERROR_PARSE);
netif.GetAddressResolver().UpdateCacheEntry(ip6header.GetSource(), aMacSource.GetShort());
}
UpdateRoutes(aFrame, aFrameLength, aMacSource, aMacDest);
#endif
VerifyOrExit((message = GetInstance().GetMessagePool().New(Message::kTypeIp6, 0)) != NULL,
+11 -9
View File
@@ -953,16 +953,18 @@ void MeshForwarder::UpdateRoutes(uint8_t * aFrame,
const Mac::Address &aMeshSource,
const Mac::Address &aMeshDest)
{
ThreadNetif & netif = GetNetif();
Lowpan::MeshHeader meshHeader;
Ip6::Header ip6Header;
Neighbor * neighbor;
ThreadNetif &netif = GetNetif();
Ip6::Header ip6Header;
Neighbor * neighbor;
VerifyOrExit(meshHeader.Init(aFrame, aFrameLength) == OT_ERROR_NONE);
VerifyOrExit(!aMeshDest.IsBroadcast() && aMeshSource.IsShort());
// skip mesh header
aFrame += meshHeader.GetHeaderLength();
aFrameLength -= meshHeader.GetHeaderLength();
if (aFrameLength >= 1 && reinterpret_cast<Lowpan::MeshHeader *>(aFrame)->IsMeshHeader())
{
aFrame += reinterpret_cast<Lowpan::MeshHeader *>(aFrame)->GetHeaderLength();
aFrameLength -= reinterpret_cast<Lowpan::MeshHeader *>(aFrame)->GetHeaderLength();
}
// skip fragment header
if (aFrameLength >= 1 && reinterpret_cast<Lowpan::FragmentHeader *>(aFrame)->IsFragmentHeader())
@@ -979,12 +981,12 @@ void MeshForwarder::UpdateRoutes(uint8_t * aFrame,
VerifyOrExit(netif.GetLowpan().DecompressBaseHeader(ip6Header, aMeshSource, aMeshDest, aFrame, aFrameLength) > 0);
netif.GetAddressResolver().UpdateCacheEntry(ip6Header.GetSource(), meshHeader.GetSource());
netif.GetAddressResolver().UpdateCacheEntry(ip6Header.GetSource(), aMeshSource.GetShort());
neighbor = netif.GetMle().GetNeighbor(ip6Header.GetSource());
VerifyOrExit(neighbor != NULL && !neighbor->IsFullThreadDevice());
if (Mle::Mle::GetRouterId(meshHeader.GetSource()) != Mle::Mle::GetRouterId(GetNetif().GetMac().GetShortAddress()))
if (Mle::Mle::GetRouterId(aMeshSource.GetShort()) != Mle::Mle::GetRouterId(GetNetif().GetMac().GetShortAddress()))
{
netif.GetMle().RemoveNeighbor(*neighbor);
}