mirror of
https://github.com/espressif/openthread.git
synced 2026-07-31 08:07:47 +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,
|
||||
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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user