55 { |
55 { |
56 NS_LOG_FUNCTION (this); |
56 NS_LOG_FUNCTION (this); |
57 Ptr<Packet> currentPacket; |
57 Ptr<Packet> currentPacket; |
58 AmsduSubframeHeader currentHdr; |
58 AmsduSubframeHeader currentHdr; |
59 |
59 |
60 uint32_t padding = CalculatePadding (packet); |
60 uint32_t padding = CalculatePadding (aggregatedPacket); |
61 uint32_t actualSize = aggregatedPacket->GetSize (); |
61 uint32_t actualSize = aggregatedPacket->GetSize (); |
62 |
62 |
63 if ((14 + packet->GetSize () + actualSize + padding) <= m_maxAmsduLength) |
63 if ((14 + packet->GetSize () + actualSize + padding) <= m_maxAmsduLength) |
64 { |
64 { |
|
65 if (padding) |
|
66 { |
|
67 aggregatedPacket->AddPaddingAtEnd (padding); |
|
68 } |
65 currentHdr.SetDestinationAddr (dest); |
69 currentHdr.SetDestinationAddr (dest); |
66 currentHdr.SetSourceAddr (src); |
70 currentHdr.SetSourceAddr (src); |
67 currentHdr.SetLength (packet->GetSize ()); |
71 currentHdr.SetLength (packet->GetSize ()); |
68 currentPacket = packet->Copy (); |
72 currentPacket = packet->Copy (); |
69 if (padding) |
73 |
70 { |
|
71 currentPacket->AddPaddingAtEnd (padding); |
|
72 } |
|
73 currentPacket->AddHeader (currentHdr); |
74 currentPacket->AddHeader (currentHdr); |
74 aggregatedPacket->AddAtEnd (currentPacket); |
75 aggregatedPacket->AddAtEnd (currentPacket); |
75 return true; |
76 return true; |
76 } |
77 } |
77 return false; |
78 return false; |
78 } |
79 } |
79 |
80 |
80 uint32_t |
81 uint32_t |
81 MsduStandardAggregator::CalculatePadding (Ptr<const Packet> packet) |
82 MsduStandardAggregator::CalculatePadding (Ptr<const Packet> packet) |
82 { |
83 { |
83 return (4 - ((packet->GetSize() + 14) %4 )) % 4; |
84 return (4 - (packet->GetSize() %4 )) % 4; |
84 } |
85 } |
85 |
86 |
86 } //namespace ns3 |
87 } //namespace ns3 |