22 #include "ns3/uinteger.h"
36 .SetGroupName (
"Wifi")
70 uint32_t actualSize = aggregatedPacket->
GetSize ();
82 currentPacket = packet->
Copy ();
85 aggregatedPacket->
AddAtEnd (currentPacket);
109 currentPacket = packet->
Copy ();
112 aggregatedPacket->
AddAtEnd (currentPacket);
134 if (padding && !last)
145 uint32_t actualSize = aggregatedPacket->
GetSize ();
146 if (blockAckSize > 0)
148 blockAckSize = blockAckSize + 4 + padding;
150 if ((4 + packetSize + actualSize + padding + blockAckSize) <=
m_maxAmpduLength)
163 return (4 - (packet->
GetSize () % 4 )) % 4;
174 uint32_t maxSize = aggregatedPacket->
GetSize ();
175 uint16_t extractedLength;
177 uint32_t deserialized = 0;
179 while (deserialized < maxSize)
183 extractedMpdu = aggregatedPacket->
CreateFragment (0, static_cast<uint32_t> (extractedLength));
185 deserialized += extractedLength;
187 padding = (4 - (extractedLength % 4 )) % 4;
189 if (padding > 0 && deserialized < maxSize)
192 deserialized += padding;
196 set.push_back (packetHdr);
198 NS_LOG_INFO (
"Deaggreated A-MPDU: extracted " << set.size () <<
" MPDUs");
Aggregator used to construct A-MPDUs.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
static DeaggregatedMpdus Deaggregate(Ptr< Packet > aggregatedPacket)
Deaggregates an A-MPDU by removing the A-MPDU subframe header and padding.
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
Ptr< Packet > CreateFragment(uint32_t start, uint32_t length) const
Create a new packet which contains a fragment of the original packet.
void AggregateSingleMpdu(Ptr< const Packet > packet, Ptr< Packet > aggregatedPacket) const
bool Aggregate(Ptr< const Packet > packet, Ptr< Packet > aggregatedPacket) const
void AddAtEnd(Ptr< const Packet > packet)
Concatenate the input packet at the end of the current packet.
void RemoveAtStart(uint32_t size)
Remove size bytes from the start of the current packet.
virtual ~MpduAggregator()
void AddHeaderAndPad(Ptr< Packet > packet, bool last, bool isSingleMpdu) const
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void SetMaxAmpduSize(uint16_t maxSize)
Sets the maximum A-MPDU size in bytes.
bool CanBeAggregated(uint32_t packetSize, Ptr< Packet > aggregatedPacket, uint8_t blockAckSize) const
static TypeId GetTypeId(void)
Get the type ID.
uint16_t GetMaxAmpduSize(void) const
Returns the maximum A-MPDU size in bytes.
std::list< std::pair< Ptr< Packet >, AmpduSubframeHeader > > DeaggregatedMpdus
A list of deaggregated packets and their A-MPDU subframe headers.
uint8_t CalculatePadding(Ptr< const Packet > packet) const
static const uint32_t packetSize
A base class which provides memory management and object aggregation.
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
void AddHeader(const Header &header)
Add header to this packet.
uint16_t m_maxAmpduLength
Maximum length in bytes of A-MPDUs.