From 2ec0d2f8d495a0404a11fec294534e8dafb50ed2 Mon Sep 17 00:00:00 2001 From: Abtin Keshavarzian Date: Mon, 6 Jan 2020 15:57:07 -0800 Subject: [PATCH] [mesh-forwarder] skip mesh header immediately after parsing it (#4453) This commit updates `HandleMesh()` method to skip the mesh header in the frame immediately after parsing it. This in turn removes the need for other methods (`CheckReachability` or `UpdateRoutes()` calling through `GetIp6Header()` to `DecompressIp6Header()`) to redo the parsing to skip the mesh header. With this change we can also remove the now unused `SkipMeshHeader()`. --- src/core/thread/mesh_forwarder.cpp | 17 ----------------- src/core/thread/mesh_forwarder.hpp | 1 - src/core/thread/mesh_forwarder_ftd.cpp | 9 +++------ 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 41aa70d74..e12b5b8d1 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -389,21 +389,6 @@ void MeshForwarder::GetMacDestinationAddress(const Ip6::Address &aIp6Addr, Mac:: } } -otError MeshForwarder::SkipMeshHeader(const uint8_t *&aFrame, uint16_t &aFrameLength) -{ - otError error = OT_ERROR_NONE; - Lowpan::MeshHeader meshHeader; - uint16_t headerLength; - - VerifyOrExit(Lowpan::MeshHeader::IsMeshHeader(aFrame, aFrameLength)); - SuccessOrExit(error = meshHeader.ParseFrom(aFrame, aFrameLength, headerLength)); - aFrame += headerLength; - aFrameLength -= headerLength; - -exit: - return error; -} - otError MeshForwarder::GetFragmentHeader(const uint8_t * aFrame, uint16_t aFrameLength, Lowpan::FragmentHeader &aFragmentHeader) @@ -432,8 +417,6 @@ otError MeshForwarder::DecompressIp6Header(const uint8_t * aFrame, Lowpan::FragmentHeader fragmentHeader; int headerLength; - SuccessOrExit(error = SkipMeshHeader(aFrame, aFrameLength)); - if (GetFragmentHeader(aFrame, aFrameLength, fragmentHeader) == OT_ERROR_NONE) { // only the first fragment header is followed by a LOWPAN_IPHC header diff --git a/src/core/thread/mesh_forwarder.hpp b/src/core/thread/mesh_forwarder.hpp index ce8e915da..ed9300a40 100644 --- a/src/core/thread/mesh_forwarder.hpp +++ b/src/core/thread/mesh_forwarder.hpp @@ -345,7 +345,6 @@ private: const Mac::Address &aMeshSource, const Mac::Address &aMeshDest); - otError SkipMeshHeader(const uint8_t *&aFrame, uint16_t &aFrameLength); otError DecompressIp6Header(const uint8_t * aFrame, uint16_t aFrameLength, const Mac::Address &aMacSource, diff --git a/src/core/thread/mesh_forwarder_ftd.cpp b/src/core/thread/mesh_forwarder_ftd.cpp index 5604b9675..67ddf360f 100644 --- a/src/core/thread/mesh_forwarder_ftd.cpp +++ b/src/core/thread/mesh_forwarder_ftd.cpp @@ -516,14 +516,14 @@ void MeshForwarder::HandleMesh(uint8_t * aFrame, meshSource.SetShort(meshHeader.GetSource()); meshDest.SetShort(meshHeader.GetDestination()); + aFrame += headerLength; + aFrameLength -= headerLength; + UpdateRoutes(aFrame, aFrameLength, meshSource, meshDest); if (meshDest.GetShort() == Get().GetShortAddress() || Get().IsMinimalChild(meshDest.GetShort())) { - aFrame += headerLength; - aFrameLength -= headerLength; - if (reinterpret_cast(aFrame)->IsFragmentHeader()) { HandleFragment(aFrame, aFrameLength, meshSource, meshDest, aLinkInfo); @@ -548,9 +548,6 @@ void MeshForwarder::HandleMesh(uint8_t * aFrame, meshHeader.DecrementHopsLeft(); - aFrame += headerLength; - aFrameLength -= headerLength; - GetForwardFramePriority(aFrame, aFrameLength, meshSource, meshDest, priority); message = Get().New(Message::kType6lowpan, priority); VerifyOrExit(message != NULL, error = OT_ERROR_NO_BUFS);