diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index a9c0356ce..5eb8ff96f 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -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, diff --git a/src/core/thread/mesh_forwarder_ftd.cpp b/src/core/thread/mesh_forwarder_ftd.cpp index a5829238f..99b57dfe2 100644 --- a/src/core/thread/mesh_forwarder_ftd.cpp +++ b/src/core/thread/mesh_forwarder_ftd.cpp @@ -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(aFrame)->IsMeshHeader()) + { + aFrame += reinterpret_cast(aFrame)->GetHeaderLength(); + aFrameLength -= reinterpret_cast(aFrame)->GetHeaderLength(); + } // skip fragment header if (aFrameLength >= 1 && reinterpret_cast(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); }