From f27a3c7b2a1a3ab413a0bc89369b7bbcb3f9a1de Mon Sep 17 00:00:00 2001 From: suveshpratapa <66088488+suveshpratapa@users.noreply.github.com> Date: Wed, 16 Jun 2021 16:02:00 -0400 Subject: [PATCH] [mesh-forwarder] calculate PAN ID compression according to 802.15.4-2015 (#6739) --- src/core/thread/mesh_forwarder.cpp | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/src/core/thread/mesh_forwarder.cpp b/src/core/thread/mesh_forwarder.cpp index 53aa1ac99..7711a0947 100644 --- a/src/core/thread/mesh_forwarder.cpp +++ b/src/core/thread/mesh_forwarder.cpp @@ -666,9 +666,32 @@ start: break; } - if (dstpan == Get().GetPanId()) + // Handle special case in 15.4-2015: + // Dest Address: Extended + // Source Address: Extended + // Dest PanId: Present + // Src Panid: Not Present + // Pan ID Compression: 0 + if (dstpan == Get().GetPanId() && + ((fcf & Mac::Frame::kFcfFrameVersionMask) == Mac::Frame::kFcfFrameVersion2006 || + (fcf & Mac::Frame::kFcfDstAddrMask) != Mac::Frame::kFcfDstAddrExt || + (fcf & Mac::Frame::kFcfSrcAddrMask) != Mac::Frame::kFcfSrcAddrExt)) { - fcf |= Mac::Frame::kFcfPanidCompression; +#if OPENTHREAD_CONFIG_MAC_HEADER_IE_SUPPORT + // Handle a special case in IEEE 802.15.4-2015, when Pan ID Compression is 0, but Src Pan ID is not present: + // Dest Address: Extended + // Src Address: Extended + // Dest Pan ID: Present + // Src Pan ID: Not Present + // Pan ID Compression: 0 + + if ((fcf & Mac::Frame::kFcfFrameVersionMask) != Mac::Frame::kFcfFrameVersion2015 || + (fcf & Mac::Frame::kFcfDstAddrMask) != Mac::Frame::kFcfDstAddrExt || + (fcf & Mac::Frame::kFcfSrcAddrMask) != Mac::Frame::kFcfSrcAddrExt) +#endif + { + fcf |= Mac::Frame::kFcfPanidCompression; + } } aFrame.InitMacHeader(fcf, secCtl);