mirror of
https://github.com/espressif/openthread.git
synced 2026-10-06 07:47:41 +00:00
[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:
committed by
Jonathan Hui
parent
086753c08d
commit
2ec0d2f8d4
@@ -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,
|
otError MeshForwarder::GetFragmentHeader(const uint8_t * aFrame,
|
||||||
uint16_t aFrameLength,
|
uint16_t aFrameLength,
|
||||||
Lowpan::FragmentHeader &aFragmentHeader)
|
Lowpan::FragmentHeader &aFragmentHeader)
|
||||||
@@ -432,8 +417,6 @@ otError MeshForwarder::DecompressIp6Header(const uint8_t * aFrame,
|
|||||||
Lowpan::FragmentHeader fragmentHeader;
|
Lowpan::FragmentHeader fragmentHeader;
|
||||||
int headerLength;
|
int headerLength;
|
||||||
|
|
||||||
SuccessOrExit(error = SkipMeshHeader(aFrame, aFrameLength));
|
|
||||||
|
|
||||||
if (GetFragmentHeader(aFrame, aFrameLength, fragmentHeader) == OT_ERROR_NONE)
|
if (GetFragmentHeader(aFrame, aFrameLength, fragmentHeader) == OT_ERROR_NONE)
|
||||||
{
|
{
|
||||||
// only the first fragment header is followed by a LOWPAN_IPHC header
|
// only the first fragment header is followed by a LOWPAN_IPHC header
|
||||||
|
|||||||
@@ -345,7 +345,6 @@ private:
|
|||||||
const Mac::Address &aMeshSource,
|
const Mac::Address &aMeshSource,
|
||||||
const Mac::Address &aMeshDest);
|
const Mac::Address &aMeshDest);
|
||||||
|
|
||||||
otError SkipMeshHeader(const uint8_t *&aFrame, uint16_t &aFrameLength);
|
|
||||||
otError DecompressIp6Header(const uint8_t * aFrame,
|
otError DecompressIp6Header(const uint8_t * aFrame,
|
||||||
uint16_t aFrameLength,
|
uint16_t aFrameLength,
|
||||||
const Mac::Address &aMacSource,
|
const Mac::Address &aMacSource,
|
||||||
|
|||||||
@@ -516,14 +516,14 @@ void MeshForwarder::HandleMesh(uint8_t * aFrame,
|
|||||||
meshSource.SetShort(meshHeader.GetSource());
|
meshSource.SetShort(meshHeader.GetSource());
|
||||||
meshDest.SetShort(meshHeader.GetDestination());
|
meshDest.SetShort(meshHeader.GetDestination());
|
||||||
|
|
||||||
|
aFrame += headerLength;
|
||||||
|
aFrameLength -= headerLength;
|
||||||
|
|
||||||
UpdateRoutes(aFrame, aFrameLength, meshSource, meshDest);
|
UpdateRoutes(aFrame, aFrameLength, meshSource, meshDest);
|
||||||
|
|
||||||
if (meshDest.GetShort() == Get<Mac::Mac>().GetShortAddress() ||
|
if (meshDest.GetShort() == Get<Mac::Mac>().GetShortAddress() ||
|
||||||
Get<Mle::MleRouter>().IsMinimalChild(meshDest.GetShort()))
|
Get<Mle::MleRouter>().IsMinimalChild(meshDest.GetShort()))
|
||||||
{
|
{
|
||||||
aFrame += headerLength;
|
|
||||||
aFrameLength -= headerLength;
|
|
||||||
|
|
||||||
if (reinterpret_cast<Lowpan::FragmentHeader *>(aFrame)->IsFragmentHeader())
|
if (reinterpret_cast<Lowpan::FragmentHeader *>(aFrame)->IsFragmentHeader())
|
||||||
{
|
{
|
||||||
HandleFragment(aFrame, aFrameLength, meshSource, meshDest, aLinkInfo);
|
HandleFragment(aFrame, aFrameLength, meshSource, meshDest, aLinkInfo);
|
||||||
@@ -548,9 +548,6 @@ void MeshForwarder::HandleMesh(uint8_t * aFrame,
|
|||||||
|
|
||||||
meshHeader.DecrementHopsLeft();
|
meshHeader.DecrementHopsLeft();
|
||||||
|
|
||||||
aFrame += headerLength;
|
|
||||||
aFrameLength -= headerLength;
|
|
||||||
|
|
||||||
GetForwardFramePriority(aFrame, aFrameLength, meshSource, meshDest, priority);
|
GetForwardFramePriority(aFrame, aFrameLength, meshSource, meshDest, priority);
|
||||||
message = Get<MessagePool>().New(Message::kType6lowpan, priority);
|
message = Get<MessagePool>().New(Message::kType6lowpan, priority);
|
||||||
VerifyOrExit(message != NULL, error = OT_ERROR_NO_BUFS);
|
VerifyOrExit(message != NULL, error = OT_ERROR_NO_BUFS);
|
||||||
|
|||||||
Reference in New Issue
Block a user