lr-wpan: Pass headers by references in PD-DATA.indication to subfunctions to reduce wasteful copies

This commit is contained in:
Alberto Gallegos Ramonet
2025-06-16 18:14:01 +09:00
parent a0d3f50f59
commit 2e880016c2
3 changed files with 62 additions and 80 deletions

View File

@@ -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

View File

@@ -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<Packet> p)
LrWpanMac::ReceiveInPromiscuousMode(uint8_t lqi,
const LrWpanMacHeader& receivedMacHdr,
Ptr<Packet> 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<Packet> p)
LrWpanMac::ReceiveBeacon(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr<Packet> p)
{
NS_LOG_FUNCTION(this << lqi << p);
// The received beacon size in symbols
@@ -1821,13 +1819,7 @@ LrWpanMac::ReceiveBeacon(uint8_t lqi, Ptr<Packet> 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<Packet> p)
}
void
LrWpanMac::ReceiveCommand(uint8_t lqi, Ptr<Packet> p)
LrWpanMac::ReceiveCommand(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr<Packet> 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<Packet> p)
}
void
LrWpanMac::ReceiveData(uint8_t lqi, Ptr<Packet> p)
LrWpanMac::ReceiveData(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr<Packet> 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<Packet> p)
}
void
LrWpanMac::ReceiveAcknowledgment(Ptr<Packet> p)
LrWpanMac::ReceiveAcknowledgment(const LrWpanMacHeader& receivedMacHdr, Ptr<Packet> p)
{
NS_LOG_FUNCTION(this << p);
@@ -2153,16 +2133,9 @@ LrWpanMac::ReceiveAcknowledgment(Ptr<Packet> 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<Packet> p)
}
void
LrWpanMac::PrintPacket(Ptr<Packet> 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<Packet> p, uint8_t lqi)
Ptr<Packet> 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<Packet> 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<Packet> 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<Packet> 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);
}
}

View File

@@ -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<Packet> p);
void ReceiveInPromiscuousMode(uint8_t lqi,
const LrWpanMacHeader& receivedMacHdr,
Ptr<Packet> 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<Packet> p);
void ReceiveBeacon(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr<Packet> 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<Packet> p);
void ReceiveCommand(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr<Packet> 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<Packet> p);
void ReceiveData(uint8_t lqi, const LrWpanMacHeader& receivedMacHdr, Ptr<Packet> 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<Packet> p);
void ReceiveAcknowledgment(const LrWpanMacHeader& receivedMacHdr, Ptr<Packet> 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<Packet> p);
void PrintReceivedPacket(const LrWpanMacHeader& receivedMacHdr);
/**
* Send an acknowledgment packet for the given sequence number.