[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()`.
This commit is contained in:
Abtin Keshavarzian
2020-01-13 10:57:42 -08:00
committed by Jonathan Hui
parent 086753c08d
commit 2ec0d2f8d4
3 changed files with 3 additions and 24 deletions
-17
View File
@@ -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
-1
View File
@@ -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,
+3 -6
View File
@@ -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<Mac::Mac>().GetShortAddress() ||
Get<Mle::MleRouter>().IsMinimalChild(meshDest.GetShort()))
{
aFrame += headerLength;
aFrameLength -= headerLength;
if (reinterpret_cast<Lowpan::FragmentHeader *>(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<MessagePool>().New(Message::kType6lowpan, priority);
VerifyOrExit(message != NULL, error = OT_ERROR_NO_BUFS);