diff --git a/CHANGES.md b/CHANGES.md index 472c882eb..ab6535100 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -18,7 +18,7 @@ This file is a best-effort approach to solving this issue; we will do our best b ### Changes to existing API -* (lr-wpan) Debloat MAC PD-DATA.indication +* (lr-wpan) Debloat MAC PD-DATA.indication and reduce packet copies. ### Changes to build system diff --git a/src/lr-wpan/model/lr-wpan-mac.cc b/src/lr-wpan/model/lr-wpan-mac.cc index 87bd416de..8d1079c07 100644 --- a/src/lr-wpan/model/lr-wpan-mac.cc +++ b/src/lr-wpan/model/lr-wpan-mac.cc @@ -15,7 +15,6 @@ #include "lr-wpan-constants.h" #include "lr-wpan-csmaca.h" -#include "lr-wpan-mac-header.h" #include "lr-wpan-mac-pl-headers.h" #include "lr-wpan-mac-trailer.h" @@ -1030,13 +1029,12 @@ LrWpanMac::MlmeGetRequest(MacPibAttributeIdentifier id) } void -LrWpanMac::ReceiveInPromiscuousMode(uint8_t lqi, Ptr p) +LrWpanMac::ReceiveInPromiscuousMode(uint8_t lqi, + const LrWpanMacHeader& receivedMacHdr, + Ptr p) { NS_LOG_FUNCTION(this); - LrWpanMacHeader receivedMacHdr; - p->RemoveHeader(receivedMacHdr); - NS_LOG_DEBUG("promiscuous mode, forwarding up"); // TODO: Fix here, this should trigger different Indication Callbacks @@ -1804,7 +1802,7 @@ LrWpanMac::BeaconSearchTimeout() } void -LrWpanMac::ReceiveBeacon(uint8_t lqi, Ptr p) +LrWpanMac::ReceiveBeacon(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr p) { NS_LOG_FUNCTION(this << lqi << p); // The received beacon size in symbols @@ -1821,13 +1819,7 @@ LrWpanMac::ReceiveBeacon(uint8_t lqi, Ptr p) NS_LOG_DEBUG("Beacon Received; forwarding up (m_macBeaconRxTime: " << m_macBeaconRxTime.As(Time::S) << ")"); - // Strip the MAC header, the trailer and the Beacon Payload - LrWpanMacTrailer receivedMacTrailer; - p->RemoveTrailer(receivedMacTrailer); - - LrWpanMacHeader receivedMacHdr; - p->RemoveHeader(receivedMacHdr); - + // Strip the Beacon Payload BeaconPayloadHeader receivedMacPayload; p->RemoveHeader(receivedMacPayload); @@ -2008,18 +2000,12 @@ LrWpanMac::ReceiveBeacon(uint8_t lqi, Ptr p) } void -LrWpanMac::ReceiveCommand(uint8_t lqi, Ptr p) +LrWpanMac::ReceiveCommand(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr p) { NS_LOG_FUNCTION(this << lqi << p); auto symbolRate = (uint64_t)m_phy->GetDataOrSymbolRate(false); // symbols per second - LrWpanMacTrailer receivedMacTrailer; - p->RemoveTrailer(receivedMacTrailer); - - LrWpanMacHeader receivedMacHdr; - p->RemoveHeader(receivedMacHdr); - CommandPayloadHeader receivedMacPayload; p->RemoveHeader(receivedMacPayload); @@ -2091,16 +2077,10 @@ LrWpanMac::ReceiveCommand(uint8_t lqi, Ptr p) } void -LrWpanMac::ReceiveData(uint8_t lqi, Ptr p) +LrWpanMac::ReceiveData(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr p) { NS_LOG_FUNCTION(this << lqi << p); - LrWpanMacTrailer receivedMacTrailer; - p->RemoveTrailer(receivedMacTrailer); - - LrWpanMacHeader receivedMacHdr; - p->RemoveHeader(receivedMacHdr); - NS_LOG_DEBUG("Data Packet is for me; forwarding up"); if (!m_mcpsDataIndicationCallback.IsNull()) @@ -2143,7 +2123,7 @@ LrWpanMac::ReceiveData(uint8_t lqi, Ptr p) } void -LrWpanMac::ReceiveAcknowledgment(Ptr p) +LrWpanMac::ReceiveAcknowledgment(const LrWpanMacHeader& receivedMacHdr, Ptr p) { NS_LOG_FUNCTION(this << p); @@ -2153,16 +2133,9 @@ LrWpanMac::ReceiveAcknowledgment(Ptr p) LrWpanMacHeader txMacHdr; txPkt->RemoveHeader(txMacHdr); - // Extract the MAC header of the ACK packet. - LrWpanMacHeader rxMacHdr; - p->RemoveHeader(rxMacHdr); - - LrWpanMacTrailer receivedMacTrailer; - p->RemoveTrailer(receivedMacTrailer); - // If it is an ACK with an unexpected sequence number, mark the current // transmission as failed and start a retransmit. (cf 7.5.6.4.3) - if (rxMacHdr.GetSeqNum() != txMacHdr.GetSeqNum()) + if (receivedMacHdr.GetSeqNum() != txMacHdr.GetSeqNum()) { m_ackWaitTimeout.Cancel(); if (!PrepareRetransmission()) @@ -2302,32 +2275,31 @@ LrWpanMac::ReceiveAcknowledgment(Ptr p) } void -LrWpanMac::PrintPacket(Ptr p) +LrWpanMac::PrintReceivedPacket(const LrWpanMacHeader& receivedMacHdr) { - LrWpanMacHeader peekedMacHdr; - p->PeekHeader(peekedMacHdr); - - if (peekedMacHdr.GetSrcAddrMode() == SHORT_ADDR && peekedMacHdr.GetDstAddrMode() == SHORT_ADDR) + if (receivedMacHdr.GetSrcAddrMode() == SHORT_ADDR && + receivedMacHdr.GetDstAddrMode() == SHORT_ADDR) { - NS_LOG_DEBUG("Packet from [" << peekedMacHdr.GetShortSrcAddr() << "] to [" - << peekedMacHdr.GetShortDstAddr() << "]"); + NS_LOG_DEBUG("Packet from [" << receivedMacHdr.GetShortSrcAddr() << "] to [" + << receivedMacHdr.GetShortDstAddr() << "]"); } - else if (peekedMacHdr.GetSrcAddrMode() == EXT_ADDR && peekedMacHdr.GetDstAddrMode() == EXT_ADDR) + else if (receivedMacHdr.GetSrcAddrMode() == EXT_ADDR && + receivedMacHdr.GetDstAddrMode() == EXT_ADDR) { - NS_LOG_DEBUG("Packet from [" << peekedMacHdr.GetExtSrcAddr() << "] to [" - << peekedMacHdr.GetExtDstAddr() << "]"); + NS_LOG_DEBUG("Packet from [" << receivedMacHdr.GetExtSrcAddr() << "] to [" + << receivedMacHdr.GetExtDstAddr() << "]"); } - else if (peekedMacHdr.GetSrcAddrMode() == SHORT_ADDR && - peekedMacHdr.GetDstAddrMode() == EXT_ADDR) + else if (receivedMacHdr.GetSrcAddrMode() == SHORT_ADDR && + receivedMacHdr.GetDstAddrMode() == EXT_ADDR) { - NS_LOG_DEBUG("Packet from [" << peekedMacHdr.GetShortSrcAddr() << "] to [" - << peekedMacHdr.GetExtDstAddr() << "]"); + NS_LOG_DEBUG("Packet from [" << receivedMacHdr.GetShortSrcAddr() << "] to [" + << receivedMacHdr.GetExtDstAddr() << "]"); } - else if (peekedMacHdr.GetSrcAddrMode() == EXT_ADDR && - peekedMacHdr.GetDstAddrMode() == SHORT_ADDR) + else if (receivedMacHdr.GetSrcAddrMode() == EXT_ADDR && + receivedMacHdr.GetDstAddrMode() == SHORT_ADDR) { - NS_LOG_DEBUG("Packet from [" << peekedMacHdr.GetExtSrcAddr() << "] to [" - << peekedMacHdr.GetShortDstAddr() << "]"); + NS_LOG_DEBUG("Packet from [" << receivedMacHdr.GetExtSrcAddr() << "] to [" + << receivedMacHdr.GetShortDstAddr() << "]"); } } @@ -2427,7 +2399,7 @@ LrWpanMac::PdDataIndication(uint32_t psduLength, Ptr p, uint8_t lqi) Ptr originalPkt = p->Copy(); - // If active, pass the packet to the traces + // If active, pass the complete packet to the traces if (!m_promiscSnifferTrace.IsEmpty()) { m_promiscSnifferTrace(p->Copy()); @@ -2437,17 +2409,19 @@ LrWpanMac::PdDataIndication(uint32_t psduLength, Ptr p, uint8_t lqi) m_macPromiscRxTrace(p->Copy()); } + // Extract the MAC trailer LrWpanMacTrailer receivedMacTrailer; p->RemoveTrailer(receivedMacTrailer); + // Extract the MAC Header from the packet + LrWpanMacHeader receivedMacHdr; + p->RemoveHeader(receivedMacHdr); + if (Node::ChecksumEnabled()) { receivedMacTrailer.EnableFcs(true); } - LrWpanMacHeader receivedMacHdr; - p->RemoveHeader(receivedMacHdr); - // From section 7.5.6.2 Reception and rejection, IEEE 802.15.4-2006 // - Level 1 filtering: Test FCS field and reject if frame fails. // - Level 2 filtering: If promiscuous mode pass frame to higher layer @@ -2468,8 +2442,8 @@ LrWpanMac::PdDataIndication(uint32_t psduLength, Ptr p, uint8_t lqi) // Level 2 filtering if (m_macPromiscuousMode) { - PrintPacket(originalPkt); - ReceiveInPromiscuousMode(lqi, p); + PrintReceivedPacket(receivedMacHdr); + ReceiveInPromiscuousMode(lqi, receivedMacHdr, p); return; } @@ -2660,23 +2634,23 @@ LrWpanMac::PdDataIndication(uint32_t psduLength, Ptr p, uint8_t lqi) Simulator::ScheduleNow(&LrWpanMac::SendAck, this, receivedMacHdr.GetSeqNum()); } - PrintPacket(originalPkt); + PrintReceivedPacket(receivedMacHdr); if (receivedMacHdr.IsBeacon()) { - ReceiveBeacon(lqi, originalPkt); + ReceiveBeacon(lqi, receivedMacHdr, p); } else if (receivedMacHdr.IsCommand()) { - ReceiveCommand(lqi, originalPkt); + ReceiveCommand(lqi, receivedMacHdr, p); } else if (receivedMacHdr.IsData()) { - ReceiveData(lqi, originalPkt); + ReceiveData(lqi, receivedMacHdr, p); } else if (receivedMacHdr.IsAcknowledgment() && m_txPkt && m_macState == MAC_ACK_PENDING) { - ReceiveAcknowledgment(originalPkt); + ReceiveAcknowledgment(receivedMacHdr, p); } } diff --git a/src/lr-wpan/model/lr-wpan-mac.h b/src/lr-wpan/model/lr-wpan-mac.h index cc6d37677..382378aad 100644 --- a/src/lr-wpan/model/lr-wpan-mac.h +++ b/src/lr-wpan/model/lr-wpan-mac.h @@ -16,6 +16,7 @@ #include "lr-wpan-fields.h" #include "lr-wpan-mac-base.h" +#include "lr-wpan-mac-header.h" #include "lr-wpan-phy.h" #include "ns3/event-id.h" @@ -762,9 +763,12 @@ class LrWpanMac : public LrWpanMacBase * Process a frame when promiscuous mode is active. * * @param lqi The LQI value of the received packet - * @param p The frame with the MPDU + * @param receivedMacHdr The reference to the received MAC header + * @param p The packet containing the MAC payload */ - void ReceiveInPromiscuousMode(uint8_t lqi, Ptr p); + void ReceiveInPromiscuousMode(uint8_t lqi, + const LrWpanMacHeader& receivedMacHdr, + Ptr p); /** * Called to send a single beacon frame. @@ -866,41 +870,45 @@ class LrWpanMac : public LrWpanMacBase /** * Used to process the reception of a beacon packet. * - * @param lqi The value of the link quality indicator (LQI) of the received packet - * @param p The packet containing the MAC header and the beacon payload information + * @param lqi The value of the link quality indicator (LQI) of the received packet. + * @param receivedMacHdr The reference to the received MAC header. + * @param p The packet containing the beacon payload information. */ - void ReceiveBeacon(uint8_t lqi, Ptr p); + void ReceiveBeacon(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr p); /** * Used to process the reception of a command packet. * - * @param lqi The value of the link quality indicator (LQI) of the received packet - * @param p The packet containing the MAC header and the beacon payload information + * @param lqi The value of the link quality indicator (LQI) of the received packet. + * @param receivedMacHdr The reference to the received MAC header. + * @param p The packet containing the command payload information. */ - void ReceiveCommand(uint8_t lqi, Ptr p); + void ReceiveCommand(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr p); /** * Used to process the reception of data. * - * @param lqi The value of the link quality indicator (LQI) of the received packet - * @param p The packet containing the MAC header and the data payload. + * @param lqi The value of the link quality indicator (LQI) of the received packet. + * @param receivedMacHdr The reference to the received MAC header. + * @param p The packet containing the data payload. */ - void ReceiveData(uint8_t lqi, Ptr p); + void ReceiveData(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr p); /** * Used to process an acknowledgment packet. * + * @param receivedMacHdr The reference to the received MAC header. * @param p The packet containing the MAC header and the data payload. */ - void ReceiveAcknowledgment(Ptr p); + void ReceiveAcknowledgment(const LrWpanMacHeader& receivedMacHdr, Ptr p); /** * Display the MAC header contents of a successfully received packet when * logs are active. * - * @param p The packet containing the MAC header + * @param receivedMacHdr The reference of the received MAC header */ - void PrintPacket(Ptr p); + void PrintReceivedPacket(const LrWpanMacHeader& receivedMacHdr); /** * Send an acknowledgment packet for the given sequence number.