src/wifi/model/mac-low.cc
changeset 11450 9f4ae69f12b7
parent 11440 af3a3d5dcc21
child 11479 a3dcf66928f3
equal deleted inserted replaced
11449:99300a162f1c 11450:9f4ae69f12b7
    75 {
    75 {
    76 }
    76 }
    77 void MacLowAggregationCapableTransmissionListener::SetAmpdu (bool ampdu)
    77 void MacLowAggregationCapableTransmissionListener::SetAmpdu (bool ampdu)
    78 {
    78 {
    79 }
    79 }
    80 void MacLowAggregationCapableTransmissionListener::CompleteTransfer(Mac48Address address, uint8_t tid)
    80 void MacLowAggregationCapableTransmissionListener::CompleteTransfer (Mac48Address address, uint8_t tid)
    81 {
    81 {
    82 }
    82 }
    83 void
    83 void
    84 MacLowAggregationCapableTransmissionListener::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
    84 MacLowAggregationCapableTransmissionListener::CompleteMpduTx (Ptr<const Packet> packet, WifiMacHeader hdr, Time tstamp)
    85 {
    85 {
    86 }
    86 }
    87 uint16_t 
    87 uint16_t
    88 MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor (WifiMacHeader *hdr)
    88 MacLowAggregationCapableTransmissionListener::GetNextSequenceNumberfor (WifiMacHeader *hdr)
    89 {
    89 {
    90  return 0;
    90   return 0;
    91 }
    91 }
    92 uint16_t 
    92 uint16_t
    93 MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor (WifiMacHeader *hdr)
    93 MacLowAggregationCapableTransmissionListener::PeekNextSequenceNumberfor (WifiMacHeader *hdr)
    94 {
    94 {
    95  return 0;
    95   return 0;
    96 }
    96 }
    97 Ptr<const Packet> 
    97 Ptr<const Packet>
    98 MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp)
    98 MacLowAggregationCapableTransmissionListener::PeekNextPacketInBaQueue (WifiMacHeader &header, Mac48Address recipient, uint8_t tid, Time *timestamp)
    99 {
    99 {
   100  return 0;
   100   return 0;
   101 }
   101 }
   102 void 
   102 void
   103 MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
   103 MacLowAggregationCapableTransmissionListener::RemoveFromBaQueue (uint8_t tid, Mac48Address recipient, uint16_t seqnumber)
   104 {
   104 {
   105 }
   105 }
   106 uint32_t 
   106 uint32_t
   107 MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets (Mac48Address recipient, uint8_t tid)
   107 MacLowAggregationCapableTransmissionListener::GetNOutstandingPackets (Mac48Address recipient, uint8_t tid)
   108 {
   108 {
   109   return 0;
   109   return 0;
   110 }
   110 }
   111 uint32_t 
   111 uint32_t
   112 MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const
   112 MacLowAggregationCapableTransmissionListener::GetNRetryNeededPackets (Mac48Address recipient, uint8_t tid) const
   113 {
   113 {
   114   return 0;
   114   return 0;
   115 }
   115 }
   116 Ptr<MsduAggregator>
   116 Ptr<MsduAggregator>
   265 }
   265 }
   266 
   266 
   267 std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params)
   267 std::ostream &operator << (std::ostream &os, const MacLowTransmissionParameters &params)
   268 {
   268 {
   269   os << "["
   269   os << "["
   270   << "send rts=" << params.m_sendRts << ", "
   270      << "send rts=" << params.m_sendRts << ", "
   271   << "next size=" << params.m_nextSize << ", "
   271      << "next size=" << params.m_nextSize << ", "
   272   << "dur=" << params.m_overrideDurationId << ", "
   272      << "dur=" << params.m_overrideDurationId << ", "
   273   << "ack=";
   273      << "ack=";
   274   switch (params.m_waitAck)
   274   switch (params.m_waitAck)
   275     {
   275     {
   276     case MacLowTransmissionParameters::ACK_NONE:
   276     case MacLowTransmissionParameters::ACK_NONE:
   277       os << "none";
   277       os << "none";
   278       break;
   278       break;
   388 {
   388 {
   389   static TypeId tid = TypeId ("ns3::MacLow")
   389   static TypeId tid = TypeId ("ns3::MacLow")
   390     .SetParent<Object> ()
   390     .SetParent<Object> ()
   391     .SetGroupName ("Wifi")
   391     .SetGroupName ("Wifi")
   392     .AddConstructor<MacLow> ()
   392     .AddConstructor<MacLow> ()
   393     ;
   393   ;
   394   return tid;
   394   return tid;
   395 }
   395 }
   396 
   396 
   397 void
   397 void
   398 MacLow::SetupPhyMacLowListener (Ptr<WifiPhy> phy)
   398 MacLow::SetupPhyMacLowListener (Ptr<WifiPhy> phy)
   425   m_sendCtsEvent.Cancel ();
   425   m_sendCtsEvent.Cancel ();
   426   m_sendAckEvent.Cancel ();
   426   m_sendAckEvent.Cancel ();
   427   m_sendDataEvent.Cancel ();
   427   m_sendDataEvent.Cancel ();
   428   m_waitSifsEvent.Cancel ();
   428   m_waitSifsEvent.Cancel ();
   429   m_endTxNoAckEvent.Cancel ();
   429   m_endTxNoAckEvent.Cancel ();
   430   m_waitRifsEvent.Cancel();
   430   m_waitRifsEvent.Cancel ();
   431   m_phy = 0;
   431   m_phy = 0;
   432   m_stationManager = 0;
   432   m_stationManager = 0;
   433   if (m_phyMacLowListener != 0)
   433   if (m_phyMacLowListener != 0)
   434     {
   434     {
   435 	  delete m_phyMacLowListener;
   435       delete m_phyMacLowListener;
   436 	  m_phyMacLowListener = 0;
   436       m_phyMacLowListener = 0;
   437     }
   437     }
   438   m_mpduAggregator = 0;
   438   m_mpduAggregator = 0;
   439   m_sentMpdus = 0;
   439   m_sentMpdus = 0;
   440   m_aggregateQueue = 0;
   440   m_aggregateQueue = 0;
   441   m_ampdu = false;
   441   m_ampdu = false;
   499   if (m_waitRifsEvent.IsRunning ())
   499   if (m_waitRifsEvent.IsRunning ())
   500     {
   500     {
   501       m_waitRifsEvent.Cancel ();
   501       m_waitRifsEvent.Cancel ();
   502       oneRunning = true;
   502       oneRunning = true;
   503     }
   503     }
   504   if (m_endTxNoAckEvent.IsRunning ()) 
   504   if (m_endTxNoAckEvent.IsRunning ())
   505     {
   505     {
   506       m_endTxNoAckEvent.Cancel ();
   506       m_endTxNoAckEvent.Cancel ();
   507       oneRunning = true;
   507       oneRunning = true;
   508     }
   508     }
   509   if (oneRunning && m_listener != 0)
   509   if (oneRunning && m_listener != 0)
   704 {
   704 {
   705   uint32_t size, actualSize;
   705   uint32_t size, actualSize;
   706   WifiMacTrailer fcs;
   706   WifiMacTrailer fcs;
   707   size = packet->GetSize () + hdr.GetSize () + fcs.GetSerializedSize ();
   707   size = packet->GetSize () + hdr.GetSize () + fcs.GetSerializedSize ();
   708   Ptr<Packet> p = AggregateToAmpdu (packet, hdr);
   708   Ptr<Packet> p = AggregateToAmpdu (packet, hdr);
   709   actualSize = p->GetSize();
   709   actualSize = p->GetSize ();
   710   if (actualSize > size)
   710   if (actualSize > size)
   711     {
   711     {
   712       m_currentPacket = p;
   712       m_currentPacket = p;
   713       return true;
   713       return true;
   714     }
   714     }
   715   else
   715   else
       
   716     {
   716       return false;
   717       return false;
       
   718     }
   717 }
   719 }
   718 
   720 
   719 void
   721 void
   720 MacLow::StartTransmission (Ptr<const Packet> packet,
   722 MacLow::StartTransmission (Ptr<const Packet> packet,
   721                            const WifiMacHeader* hdr,
   723                            const WifiMacHeader* hdr,
   740   m_currentHdr = *hdr;
   742   m_currentHdr = *hdr;
   741   CancelAllEvents ();
   743   CancelAllEvents ();
   742   m_listener = listener;
   744   m_listener = listener;
   743   m_txParams = params;
   745   m_txParams = params;
   744 
   746 
   745   if(m_aggregateQueue->GetSize () == 0)
   747   if (m_aggregateQueue->GetSize () == 0)
   746   {
   748     {
   747     m_currentPacket = packet->Copy ();
   749       m_currentPacket = packet->Copy ();
   748     m_ampdu = IsAmpdu (m_currentPacket, m_currentHdr);
   750       m_ampdu = IsAmpdu (m_currentPacket, m_currentHdr);
   749   }
   751     }
   750   else
   752   else
   751   {
   753     {
   752    /*m_aggregateQueue > 0 occurs when a RTS/CTS exchange failed before an A-MPDU transmission.
   754       /*m_aggregateQueue > 0 occurs when a RTS/CTS exchange failed before an A-MPDU transmission.
   753     *In that case, we transmit the same A-MPDU as previously.
   755        *In that case, we transmit the same A-MPDU as previously.
   754     */
   756        */
   755     m_sentMpdus = m_aggregateQueue->GetSize ();
   757       m_sentMpdus = m_aggregateQueue->GetSize ();
   756     m_ampdu = true;
   758       m_ampdu = true;
   757   }
   759     }
   758 
   760 
   759   NS_LOG_DEBUG ("startTx size=" << GetSize (m_currentPacket, &m_currentHdr) <<
   761   NS_LOG_DEBUG ("startTx size=" << GetSize (m_currentPacket, &m_currentHdr) <<
   760                 ", to=" << m_currentHdr.GetAddr1 () << ", listener=" << m_listener);
   762                 ", to=" << m_currentHdr.GetAddr1 () << ", listener=" << m_listener);
   761 
   763 
   762   if (m_ampdu)
   764   if (m_ampdu)
       
   765     {
   763       m_txParams.EnableCompressedBlockAck ();
   766       m_txParams.EnableCompressedBlockAck ();
       
   767     }
   764 
   768 
   765   if (m_txParams.MustSendRts ())
   769   if (m_txParams.MustSendRts ())
   766     {
   770     {
   767       SendRtsForPacket ();
   771       SendRtsForPacket ();
   768     }
   772     }
   769   else
   773   else
   770     {
   774     {
   771      if (NeedCtsToSelf() && m_ctsToSelfSupported)
   775       if (NeedCtsToSelf () && m_ctsToSelfSupported)
   772         {
   776         {
   773           SendCtsToSelf();
   777           SendCtsToSelf ();
   774         }
   778         }
   775       else
   779       else
   776         {
   780         {
   777           SendDataPacket ();
   781           SendDataPacket ();
   778        }
   782         }
   779     }
   783     }
   780 
   784 
   781   /* When this method completes, we have taken ownership of the medium. */
   785   /* When this method completes, we have taken ownership of the medium. */
   782   NS_ASSERT (m_phy->IsStateTx ());
   786   NS_ASSERT (m_phy->IsStateTx ());
   783 }
   787 }
   793 MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr)
   797 MacLow::ReceiveError (Ptr<const Packet> packet, double rxSnr)
   794 {
   798 {
   795   NS_LOG_FUNCTION (this << packet << rxSnr);
   799   NS_LOG_FUNCTION (this << packet << rxSnr);
   796   NS_LOG_DEBUG ("rx failed ");
   800   NS_LOG_DEBUG ("rx failed ");
   797   AmpduTag ampdu;
   801   AmpduTag ampdu;
   798   Ptr<Packet> pkt = packet->Copy();
   802   Ptr<Packet> pkt = packet->Copy ();
   799   bool isInAmpdu = pkt->RemovePacketTag(ampdu);
   803   bool isInAmpdu = pkt->RemovePacketTag (ampdu);
   800 
   804 
   801   if(isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus() == 1))
   805   if (isInAmpdu && m_receivedAtLeastOneMpdu && (ampdu.GetNoOfMpdus () == 1))
   802     {
   806     {
   803       MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (pkt);
   807       MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (pkt);
   804       MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
   808       MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
   805       WifiMacHeader hdr;
   809       WifiMacHeader hdr;
   806       (*n).first->PeekHeader(hdr);
   810       (*n).first->PeekHeader (hdr);
   807       if(hdr.IsQosData())
   811       if (hdr.IsQosData ())
   808         {
   812         {
   809           NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << hdr.GetAddr2 ());
   813           NS_LOG_DEBUG ("last a-mpdu subframe detected/sendImmediateBlockAck from=" << hdr.GetAddr2 ());
   810           m_sendAckEvent = Simulator::Schedule (GetSifs (),
   814           m_sendAckEvent = Simulator::Schedule (GetSifs (),
   811                                                 &MacLow::SendBlockAckAfterAmpdu, this,
   815                                                 &MacLow::SendBlockAckAfterAmpdu, this,
   812                                                 hdr.GetQosTid (),
   816                                                 hdr.GetQosTid (),
   813                                                 hdr.GetAddr2 (),
   817                                                 hdr.GetAddr2 (),
   814                                                 hdr.GetDuration (),
   818                                                 hdr.GetDuration (),
   815                                                 m_currentTxVector);
   819                                                 m_currentTxVector);
   816         }
   820         }
   817       else if (hdr.IsBlockAckReq())
   821       else if (hdr.IsBlockAckReq ())
   818         {
   822         {
   819  	      NS_LOG_DEBUG("last a-mpdu subframe is BAR");
   823           NS_LOG_DEBUG ("last a-mpdu subframe is BAR");
   820      	}
   824         }
   821       m_receivedAtLeastOneMpdu = false;
   825       m_receivedAtLeastOneMpdu = false;
   822     }
   826     }
   823   else if (m_txParams.MustWaitFastAck ())
   827   else if (m_txParams.MustWaitFastAck ())
   824     {
   828     {
   825       NS_ASSERT (m_fastAckFailedTimeoutEvent.IsExpired ());
   829       NS_ASSERT (m_fastAckFailedTimeoutEvent.IsExpired ());
   916     {
   920     {
   917       if (ampduSubframe)
   921       if (ampduSubframe)
   918         {
   922         {
   919           NS_FATAL_ERROR ("Received CTS as part of an A-MPDU");
   923           NS_FATAL_ERROR ("Received CTS as part of an A-MPDU");
   920         }
   924         }
   921         
   925 
   922       NS_LOG_DEBUG ("receive cts from=" << m_currentHdr.GetAddr1 ());
   926       NS_LOG_DEBUG ("receive cts from=" << m_currentHdr.GetAddr1 ());
   923       
   927 
   924       SnrTag tag;
   928       SnrTag tag;
   925       packet->RemovePacketTag (tag);
   929       packet->RemovePacketTag (tag);
   926       m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
   930       m_stationManager->ReportRxOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
   927                                     rxSnr, txVector.GetMode ());
   931                                     rxSnr, txVector.GetMode ());
   928       m_stationManager->ReportRtsOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
   932       m_stationManager->ReportRtsOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
   952       m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
   956       m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
   953                                       rxSnr, txVector.GetMode (), tag.Get ());
   957                                       rxSnr, txVector.GetMode (), tag.Get ());
   954 
   958 
   955       FlushAggregateQueue ();
   959       FlushAggregateQueue ();
   956       bool gotAck = false;
   960       bool gotAck = false;
   957       
   961 
   958       if (m_txParams.MustWaitNormalAck ()
   962       if (m_txParams.MustWaitNormalAck ()
   959           && m_normalAckTimeoutEvent.IsRunning ())
   963           && m_normalAckTimeoutEvent.IsRunning ())
   960         {
   964         {
   961           m_normalAckTimeoutEvent.Cancel ();
   965           m_normalAckTimeoutEvent.Cancel ();
   962           NotifyAckTimeoutResetNow ();
   966           NotifyAckTimeoutResetNow ();
  1050         {
  1054         {
  1051           /* From section 9.10.4 in IEEE 802.11:
  1055           /* From section 9.10.4 in IEEE 802.11:
  1052              Upon the receipt of a QoS data frame from the originator for which
  1056              Upon the receipt of a QoS data frame from the originator for which
  1053              the Block Ack agreement exists, the recipient shall buffer the MSDU
  1057              the Block Ack agreement exists, the recipient shall buffer the MSDU
  1054              regardless of the value of the Ack Policy subfield within the
  1058              regardless of the value of the Ack Policy subfield within the
  1055              QoS Control field of the QoS data frame. */;
  1059              QoS Control field of the QoS data frame. */
  1056           if (hdr.IsQosAck () && !ampduSubframe)
  1060           if (hdr.IsQosAck () && !ampduSubframe)
  1057             {
  1061             {
  1058               NS_LOG_DEBUG ("rx QoS unicast/sendAck from=" << hdr.GetAddr2 ());
  1062               NS_LOG_DEBUG ("rx QoS unicast/sendAck from=" << hdr.GetAddr2 ());
  1059               AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
  1063               AgreementsI it = m_bAckAgreements.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
  1060 
  1064 
  1092           m_edcaListeners[ac]->BlockAckInactivityTimeout (hdr.GetAddr2 (), hdr.GetQosTid ());
  1096           m_edcaListeners[ac]->BlockAckInactivityTimeout (hdr.GetAddr2 (), hdr.GetQosTid ());
  1093           return;
  1097           return;
  1094         }
  1098         }
  1095       else if (hdr.IsQosData () && hdr.IsQosNoAck ())
  1099       else if (hdr.IsQosData () && hdr.IsQosNoAck ())
  1096         {
  1100         {
  1097            if (ampduSubframe)
  1101           if (ampduSubframe)
  1098                {
  1102             {
  1099                  NS_LOG_DEBUG ("rx Ampdu with No Ack Policy from=" << hdr.GetAddr2 ());
  1103               NS_LOG_DEBUG ("rx Ampdu with No Ack Policy from=" << hdr.GetAddr2 ());
  1100                }
  1104             }
  1101              else
  1105           else
  1102                {
  1106             {
  1103                  NS_LOG_DEBUG ("rx unicast/noAck from=" << hdr.GetAddr2 ());
  1107               NS_LOG_DEBUG ("rx unicast/noAck from=" << hdr.GetAddr2 ());
  1104                }
  1108             }
  1105         }
  1109         }
  1106       else if (hdr.IsData () || hdr.IsMgt ())
  1110       else if (hdr.IsData () || hdr.IsMgt ())
  1107         {
  1111         {
  1108           if (hdr.IsMgt () && ampduSubframe)
  1112           if (hdr.IsMgt () && ampduSubframe)
  1109             {
  1113             {
  1165 
  1169 
  1166 uint8_t
  1170 uint8_t
  1167 MacLow::GetTid (Ptr<const Packet> packet, const WifiMacHeader hdr) const
  1171 MacLow::GetTid (Ptr<const Packet> packet, const WifiMacHeader hdr) const
  1168 {
  1172 {
  1169   uint8_t tid = 0;
  1173   uint8_t tid = 0;
  1170   if (hdr.IsQosData ()) 
  1174   if (hdr.IsQosData ())
  1171     tid = hdr.GetQosTid ();
  1175     {
       
  1176       tid = hdr.GetQosTid ();
       
  1177     }
  1172   else if (hdr.IsBlockAckReq ())
  1178   else if (hdr.IsBlockAckReq ())
  1173     {
  1179     {
  1174       CtrlBAckRequestHeader baReqHdr;
  1180       CtrlBAckRequestHeader baReqHdr;
  1175       packet->PeekHeader (baReqHdr);
  1181       packet->PeekHeader (baReqHdr);
  1176       tid = baReqHdr.GetTidInfo ();
  1182       tid = baReqHdr.GetTidInfo ();
  1177      }
  1183     }
  1178   else if (hdr.IsBlockAck ())
  1184   else if (hdr.IsBlockAck ())
  1179     {
  1185     {
  1180       CtrlBAckResponseHeader baRespHdr;
  1186       CtrlBAckResponseHeader baRespHdr;
  1181       packet->PeekHeader (baRespHdr);
  1187       packet->PeekHeader (baRespHdr);
  1182       tid = baRespHdr.GetTidInfo ();
  1188       tid = baRespHdr.GetTidInfo ();
  1183     }   
  1189     }
  1184   return tid;
  1190   return tid;
  1185 }
  1191 }
  1186 
  1192 
  1187 uint32_t
  1193 uint32_t
  1188 MacLow::GetAckSize (void) const
  1194 MacLow::GetAckSize (void) const
  1231 
  1237 
  1232 Time
  1238 Time
  1233 MacLow::GetAckDuration (WifiTxVector ackTxVector) const
  1239 MacLow::GetAckDuration (WifiTxVector ackTxVector) const
  1234 {
  1240 {
  1235   NS_ASSERT (ackTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); // ACK should always use non-HT PPDU (HT PPDU cases not supported yet)
  1241   NS_ASSERT (ackTxVector.GetMode ().GetModulationClass () != WIFI_MOD_CLASS_HT); // ACK should always use non-HT PPDU (HT PPDU cases not supported yet)
  1236   return m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency(), 0, 0);
  1242   return m_phy->CalculateTxDuration (GetAckSize (), ackTxVector, WIFI_PREAMBLE_LONG, m_phy->GetFrequency (), 0, 0);
  1237 }
  1243 }
  1238 
  1244 
  1239 Time
  1245 Time
  1240 MacLow::GetBlockAckDuration (Mac48Address to, WifiTxVector blockAckReqTxVector, enum BlockAckType type) const
  1246 MacLow::GetBlockAckDuration (Mac48Address to, WifiTxVector blockAckReqTxVector, enum BlockAckType type) const
  1241 {
  1247 {
  1243    * For immediate Basic BlockAck we should transmit the frame with the same WifiMode
  1249    * For immediate Basic BlockAck we should transmit the frame with the same WifiMode
  1244    * as the BlockAckReq.
  1250    * as the BlockAckReq.
  1245    */
  1251    */
  1246   WifiPreamble preamble;
  1252   WifiPreamble preamble;
  1247   if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && type == BASIC_BLOCK_ACK)
  1253   if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT && type == BASIC_BLOCK_ACK)
  1248     preamble = WIFI_PREAMBLE_HT_MF;
  1254     {
       
  1255       preamble = WIFI_PREAMBLE_HT_MF;
       
  1256     }
  1249   else
  1257   else
  1250     preamble = WIFI_PREAMBLE_LONG;
  1258     {
       
  1259       preamble = WIFI_PREAMBLE_LONG;
       
  1260     }
  1251   return m_phy->CalculateTxDuration (GetBlockAckSize (type), blockAckReqTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1261   return m_phy->CalculateTxDuration (GetBlockAckSize (type), blockAckReqTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1252 }
  1262 }
  1253 
  1263 
  1254 Time
  1264 Time
  1255 MacLow::GetCtsDuration (Mac48Address to, WifiTxVector rtsTxVector) const
  1265 MacLow::GetCtsDuration (Mac48Address to, WifiTxVector rtsTxVector) const
  1277 MacLow::GetSize (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
  1287 MacLow::GetSize (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
  1278 {
  1288 {
  1279   uint32_t size;
  1289   uint32_t size;
  1280   WifiMacTrailer fcs;
  1290   WifiMacTrailer fcs;
  1281   if (m_ampdu)
  1291   if (m_ampdu)
  1282      size = packet->GetSize ();
  1292     {
       
  1293       size = packet->GetSize ();
       
  1294     }
  1283   else
  1295   else
  1284      size= packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
  1296     {
       
  1297       size = packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
       
  1298     }
  1285   return size;
  1299   return size;
  1286 }
  1300 }
  1287 
  1301 
  1288 WifiTxVector
  1302 WifiTxVector
  1289 MacLow::GetCtsToSelfTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
  1303 MacLow::GetCtsToSelfTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
  1301 WifiTxVector
  1315 WifiTxVector
  1302 MacLow::GetDataTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
  1316 MacLow::GetDataTxVector (Ptr<const Packet> packet, const WifiMacHeader *hdr) const
  1303 {
  1317 {
  1304   Mac48Address to = hdr->GetAddr1 ();
  1318   Mac48Address to = hdr->GetAddr1 ();
  1305   WifiMacTrailer fcs;
  1319   WifiMacTrailer fcs;
  1306   uint32_t size =  packet->GetSize ()+ hdr->GetSize () + fcs.GetSerializedSize ();
  1320   uint32_t size =  packet->GetSize () + hdr->GetSize () + fcs.GetSerializedSize ();
  1307   //size is not used in anything!! will not worry about aggregation
  1321   //size is not used in anything!! will not worry about aggregation
  1308   return m_stationManager->GetDataTxVector (to, hdr, packet, size);
  1322   return m_stationManager->GetDataTxVector (to, hdr, packet, size);
  1309 }
  1323 }
  1310 
  1324 
  1311 WifiTxVector
  1325 WifiTxVector
  1362       txTime += GetCtsDuration (hdr->GetAddr1 (), rtsTxVector);
  1376       txTime += GetCtsDuration (hdr->GetAddr1 (), rtsTxVector);
  1363       txTime += Time (GetSifs () * 2);
  1377       txTime += Time (GetSifs () * 2);
  1364     }
  1378     }
  1365   WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
  1379   WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
  1366   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1380   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1367     preamble = WIFI_PREAMBLE_HT_GF;
  1381     {
       
  1382       preamble = WIFI_PREAMBLE_HT_GF;
       
  1383     }
  1368   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  1384   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  1369     preamble = WIFI_PREAMBLE_HT_MF;
  1385     {
       
  1386       preamble = WIFI_PREAMBLE_HT_MF;
       
  1387     }
  1370   else
  1388   else
  1371     preamble = WIFI_PREAMBLE_LONG;
  1389     {
       
  1390       preamble = WIFI_PREAMBLE_LONG;
       
  1391     }
  1372   uint32_t dataSize = GetSize (packet, hdr);
  1392   uint32_t dataSize = GetSize (packet, hdr);
  1373   txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1393   txTime += m_phy->CalculateTxDuration (dataSize, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1374   if (params.MustWaitAck ())
  1394   if (params.MustWaitAck ())
  1375     {
  1395     {
  1376       txTime += GetSifs ();
  1396       txTime += GetSifs ();
  1388   if (params.HasNextPacket ())
  1408   if (params.HasNextPacket ())
  1389     {
  1409     {
  1390       WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
  1410       WifiTxVector dataTxVector = GetDataTxVector (packet, hdr);
  1391       WifiPreamble preamble;
  1411       WifiPreamble preamble;
  1392       if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1412       if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1393          preamble = WIFI_PREAMBLE_HT_GF;
  1413         {
  1394       else if (dataTxVector.GetMode().GetModulationClass () == WIFI_MOD_CLASS_HT)
  1414           preamble = WIFI_PREAMBLE_HT_GF;
  1395         preamble = WIFI_PREAMBLE_HT_MF;
  1415         }
       
  1416       else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
       
  1417         {
       
  1418           preamble = WIFI_PREAMBLE_HT_MF;
       
  1419         }
  1396       else
  1420       else
  1397         preamble = WIFI_PREAMBLE_LONG;
  1421         {
       
  1422           preamble = WIFI_PREAMBLE_LONG;
       
  1423         }
  1398       txTime += GetSifs ();
  1424       txTime += GetSifs ();
  1399       txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1425       txTime += m_phy->CalculateTxDuration (params.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1400     }
  1426     }
  1401   return txTime;
  1427   return txTime;
  1402 }
  1428 }
  1430            * be calculated using the length of the CTS frame and the data rate at which the RTS frame
  1456            * be calculated using the length of the CTS frame and the data rate at which the RTS frame
  1431            * used for the most recent NAV update was received.
  1457            * used for the most recent NAV update was received.
  1432            */
  1458            */
  1433           WifiMacHeader cts;
  1459           WifiMacHeader cts;
  1434           cts.SetType (WIFI_MAC_CTL_CTS);
  1460           cts.SetType (WIFI_MAC_CTL_CTS);
  1435           WifiTxVector txVector=GetRtsTxVector (packet, &hdr);
  1461           WifiTxVector txVector = GetRtsTxVector (packet, &hdr);
  1436           Time navCounterResetCtsMissedDelay =
  1462           Time navCounterResetCtsMissedDelay =
  1437             m_phy->CalculateTxDuration (cts.GetSerializedSize (), txVector, preamble, m_phy->GetFrequency (), 0, 0) +
  1463             m_phy->CalculateTxDuration (cts.GetSerializedSize (), txVector, preamble, m_phy->GetFrequency (), 0, 0) +
  1438             Time (2 * GetSifs ()) + Time (2 * GetSlotTime ());
  1464             Time (2 * GetSifs ()) + Time (2 * GetSlotTime ());
  1439           m_navCounterResetCtsMissed = Simulator::Schedule (navCounterResetCtsMissedDelay,
  1465           m_navCounterResetCtsMissed = Simulator::Schedule (navCounterResetCtsMissedDelay,
  1440                                                             &MacLow::NavCounterResetCtsMissed, this,
  1466                                                             &MacLow::NavCounterResetCtsMissed, this,
  1543       uint8_t packetType = 0;
  1569       uint8_t packetType = 0;
  1544       //Add packet tag
  1570       //Add packet tag
  1545       AmpduTag ampdutag;
  1571       AmpduTag ampdutag;
  1546       ampdutag.SetAmpdu (true);
  1572       ampdutag.SetAmpdu (true);
  1547       Time delay = Seconds (0);
  1573       Time delay = Seconds (0);
  1548       for ( ; queueSize > 0; queueSize--)
  1574       for (; queueSize > 0; queueSize--)
  1549         {
  1575         {
  1550           dequeuedPacket = m_aggregateQueue->Dequeue (&newHdr);
  1576           dequeuedPacket = m_aggregateQueue->Dequeue (&newHdr);
  1551           newPacket = dequeuedPacket->Copy ();
  1577           newPacket = dequeuedPacket->Copy ();
  1552           newHdr.SetDuration (hdr->GetDuration ());
  1578           newHdr.SetDuration (hdr->GetDuration ());
  1553           newPacket->AddHeader (newHdr);
  1579           newPacket->AddHeader (newHdr);
  1557               last = true;
  1583               last = true;
  1558               packetType = 2;
  1584               packetType = 2;
  1559             }
  1585             }
  1560           m_mpduAggregator->AddHeaderAndPad (newPacket, last);
  1586           m_mpduAggregator->AddHeaderAndPad (newPacket, last);
  1561 
  1587 
  1562           ampdutag.SetNoOfMpdus(queueSize);
  1588           ampdutag.SetNoOfMpdus (queueSize);
  1563           newPacket->AddPacketTag(ampdutag);
  1589           newPacket->AddPacketTag (ampdutag);
  1564           if (delay == Seconds (0))
  1590           if (delay == Seconds (0))
  1565             {
  1591             {
  1566               NS_LOG_DEBUG("Sending MPDU as part of A-MPDU");
  1592               NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU");
  1567               packetType = 1;
  1593               packetType = 1;
  1568               m_phy->SendPacket (newPacket, txVector, preamble, packetType);
  1594               m_phy->SendPacket (newPacket, txVector, preamble, packetType);
  1569             }
  1595             }
  1570           else
  1596           else
  1571             {
  1597             {
  1572               Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType);
  1598               Simulator::Schedule (delay, &MacLow::SendPacket, this, newPacket, txVector, preamble, packetType);
  1573             }
  1599             }
  1574           if(queueSize > 1)
  1600           if (queueSize > 1)
  1575             delay = delay + m_phy->CalculateTxDuration (GetSize (newPacket, &newHdr), txVector, preamble, m_phy->GetFrequency (), packetType, 0);
  1601             {
       
  1602               delay = delay + m_phy->CalculateTxDuration (GetSize (newPacket, &newHdr), txVector, preamble, m_phy->GetFrequency (), packetType, 0);
       
  1603             }
  1576           preamble = WIFI_PREAMBLE_NONE;
  1604           preamble = WIFI_PREAMBLE_NONE;
  1577         }
  1605         }
  1578     }
  1606     }
  1579 }
  1607 }
  1580 
  1608 
  1581 void
  1609 void
  1582 MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
  1610 MacLow::SendPacket (Ptr<const Packet> packet, WifiTxVector txVector, WifiPreamble preamble, uint8_t packetType)
  1583 {
  1611 {
  1584   NS_LOG_DEBUG("Sending MPDU as part of A-MPDU");
  1612   NS_LOG_DEBUG ("Sending MPDU as part of A-MPDU");
  1585   m_phy->SendPacket (packet, txVector, preamble, packetType); 
  1613   m_phy->SendPacket (packet, txVector, preamble, packetType);
  1586 }
  1614 }
  1587 
  1615 
  1588 void
  1616 void
  1589 MacLow::CtsTimeout (void)
  1617 MacLow::CtsTimeout (void)
  1590 {
  1618 {
  1592   NS_LOG_DEBUG ("cts timeout");
  1620   NS_LOG_DEBUG ("cts timeout");
  1593   /// \todo should check that there was no rx start before now.
  1621   /// \todo should check that there was no rx start before now.
  1594   /// we should restart a new cts timeout now until the expected
  1622   /// we should restart a new cts timeout now until the expected
  1595   /// end of rx if there was a rx start before now.
  1623   /// end of rx if there was a rx start before now.
  1596   m_stationManager->ReportRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
  1624   m_stationManager->ReportRtsFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
  1597   if(m_sentMpdus == 0)
  1625   if (m_sentMpdus == 0)
  1598     {
  1626     {
  1599       m_currentPacket = 0;
  1627       m_currentPacket = 0;
  1600     }
  1628     }
  1601   MacLowTransmissionListener *listener = m_listener;
  1629   MacLowTransmissionListener *listener = m_listener;
  1602   m_listener = 0;
  1630   m_listener = 0;
  1649   m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
  1677   m_stationManager->ReportDataFailed (m_currentHdr.GetAddr1 (), &m_currentHdr);
  1650   MacLowTransmissionListener *listener = m_listener;
  1678   MacLowTransmissionListener *listener = m_listener;
  1651   m_listener = 0;
  1679   m_listener = 0;
  1652   m_sentMpdus = 0;
  1680   m_sentMpdus = 0;
  1653   m_ampdu = false;
  1681   m_ampdu = false;
  1654   FlushAggregateQueue();
  1682   FlushAggregateQueue ();
  1655   listener->MissedBlockAck ();
  1683   listener->MissedBlockAck ();
  1656 }
  1684 }
  1657 
  1685 
  1658 void
  1686 void
  1659 MacLow::SuperFastAckTimeout ()
  1687 MacLow::SuperFastAckTimeout ()
  1691   Time duration = Seconds (0);
  1719   Time duration = Seconds (0);
  1692 
  1720 
  1693   WifiPreamble preamble;
  1721   WifiPreamble preamble;
  1694   //standard says RTS packets can have GF format sec 9.6.0e.1 page 110 bullet b 2
  1722   //standard says RTS packets can have GF format sec 9.6.0e.1 page 110 bullet b 2
  1695   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1723   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1696     preamble = WIFI_PREAMBLE_HT_GF;
  1724     {
       
  1725       preamble = WIFI_PREAMBLE_HT_GF;
       
  1726     }
  1697   else //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
  1727   else //Otherwise, RTS should always use non-HT PPDU (HT PPDU cases not supported yet)
  1698     preamble = WIFI_PREAMBLE_LONG;
  1728     {
       
  1729       preamble = WIFI_PREAMBLE_LONG;
       
  1730     }
  1699 
  1731 
  1700   if (m_txParams.HasDurationId ())
  1732   if (m_txParams.HasDurationId ())
  1701     {
  1733     {
  1702       duration += m_txParams.GetDurationId ();
  1734       duration += m_txParams.GetDurationId ();
  1703     }
  1735     }
  1754 
  1786 
  1755 void
  1787 void
  1756 MacLow::StartDataTxTimers (WifiTxVector dataTxVector)
  1788 MacLow::StartDataTxTimers (WifiTxVector dataTxVector)
  1757 {
  1789 {
  1758   WifiPreamble preamble;
  1790   WifiPreamble preamble;
  1759  
  1791 
  1760   //Since it is data then it can have format = GF
  1792   //Since it is data then it can have format = GF
  1761   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1793   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1762     preamble = WIFI_PREAMBLE_HT_GF;
  1794     {
       
  1795       preamble = WIFI_PREAMBLE_HT_GF;
       
  1796     }
  1763   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  1797   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  1764     preamble = WIFI_PREAMBLE_HT_MF;
  1798     {
       
  1799       preamble = WIFI_PREAMBLE_HT_MF;
       
  1800     }
  1765   else
  1801   else
  1766     preamble = WIFI_PREAMBLE_LONG;
  1802     {
  1767  
  1803       preamble = WIFI_PREAMBLE_LONG;
       
  1804     }
       
  1805 
  1768   Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1806   Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1769   if (m_txParams.MustWaitNormalAck ())
  1807   if (m_txParams.MustWaitNormalAck ())
  1770     {
  1808     {
  1771       Time timerDelay = txDuration + GetAckTimeout ();
  1809       Time timerDelay = txDuration + GetAckTimeout ();
  1772       NS_ASSERT (m_normalAckTimeoutEvent.IsExpired ());
  1810       NS_ASSERT (m_normalAckTimeoutEvent.IsExpired ());
  1802       NotifyAckTimeoutStartNow (timerDelay);
  1840       NotifyAckTimeoutStartNow (timerDelay);
  1803       m_blockAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::BlockAckTimeout, this);
  1841       m_blockAckTimeoutEvent = Simulator::Schedule (timerDelay, &MacLow::BlockAckTimeout, this);
  1804     }
  1842     }
  1805   else if (m_txParams.HasNextPacket ())
  1843   else if (m_txParams.HasNextPacket ())
  1806     {
  1844     {
  1807      if (m_stationManager->HasHtSupported())
  1845       if (m_stationManager->HasHtSupported ())
  1808        {
  1846         {
  1809           Time delay = txDuration + GetRifs ();
  1847           Time delay = txDuration + GetRifs ();
  1810           NS_ASSERT (m_waitRifsEvent.IsExpired ());
  1848           NS_ASSERT (m_waitRifsEvent.IsExpired ());
  1811           m_waitRifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this); 
  1849           m_waitRifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
  1812        }
  1850         }
  1813      else
  1851       else
  1814        {
  1852         {
  1815           Time delay = txDuration + GetSifs ();
  1853           Time delay = txDuration + GetSifs ();
  1816           NS_ASSERT (m_waitSifsEvent.IsExpired ());
  1854           NS_ASSERT (m_waitSifsEvent.IsExpired ());
  1817           m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
  1855           m_waitSifsEvent = Simulator::Schedule (delay, &MacLow::WaitSifsAfterEndTx, this);
  1818        }
  1856         }
  1819     }
  1857     }
  1820   else
  1858   else
  1821     {
  1859     {
  1822       // since we do not expect any timer to be triggered.
  1860       // since we do not expect any timer to be triggered.
  1823       Simulator::Schedule(txDuration, &MacLow::EndTxNoAck, this);
  1861       Simulator::Schedule (txDuration, &MacLow::EndTxNoAck, this);
  1824     }
  1862     }
  1825 }
  1863 }
  1826 
  1864 
  1827 void
  1865 void
  1828 MacLow::SendDataPacket (void)
  1866 MacLow::SendDataPacket (void)
  1829 {
  1867 {
  1830   NS_LOG_FUNCTION (this);
  1868   NS_LOG_FUNCTION (this);
  1831   /* send this packet directly. No RTS is needed. */
  1869   /* send this packet directly. No RTS is needed. */
  1832   WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
  1870   WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
  1833   WifiPreamble preamble;
  1871   WifiPreamble preamble;
  1834           
  1872 
  1835   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1873   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  1836      //In the future has to make sure that receiver has greenfield enabled
  1874     {
  1837      preamble = WIFI_PREAMBLE_HT_GF;
  1875       //In the future has to make sure that receiver has greenfield enabled
       
  1876       preamble = WIFI_PREAMBLE_HT_GF;
       
  1877     }
  1838   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  1878   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  1839     preamble = WIFI_PREAMBLE_HT_MF;
  1879     {
       
  1880       preamble = WIFI_PREAMBLE_HT_MF;
       
  1881     }
  1840   else
  1882   else
  1841      preamble = WIFI_PREAMBLE_LONG;
  1883     {
  1842   
  1884       preamble = WIFI_PREAMBLE_LONG;
       
  1885     }
       
  1886 
  1843   StartDataTxTimers (dataTxVector);
  1887   StartDataTxTimers (dataTxVector);
  1844 
  1888 
  1845   Time duration = Seconds (0.0);
  1889   Time duration = Seconds (0.0);
  1846   if (m_txParams.HasDurationId ())
  1890   if (m_txParams.HasDurationId ())
  1847     {
  1891     {
  1912   cts.SetDsNotFrom ();
  1956   cts.SetDsNotFrom ();
  1913   cts.SetDsNotTo ();
  1957   cts.SetDsNotTo ();
  1914   cts.SetNoMoreFragments ();
  1958   cts.SetNoMoreFragments ();
  1915   cts.SetNoRetry ();
  1959   cts.SetNoRetry ();
  1916   cts.SetAddr1 (m_self);
  1960   cts.SetAddr1 (m_self);
  1917  
  1961 
  1918   WifiTxVector ctsTxVector = GetCtsToSelfTxVector (m_currentPacket, &m_currentHdr);
  1962   WifiTxVector ctsTxVector = GetCtsToSelfTxVector (m_currentPacket, &m_currentHdr);
  1919 
  1963 
  1920   WifiPreamble preamble;
  1964   WifiPreamble preamble;
  1921   if (ctsTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  1965   if (ctsTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  1922     preamble = WIFI_PREAMBLE_HT_MF;
  1966     {
       
  1967       preamble = WIFI_PREAMBLE_HT_MF;
       
  1968     }
  1923   else
  1969   else
  1924     preamble = WIFI_PREAMBLE_LONG;
  1970     {
  1925   
  1971       preamble = WIFI_PREAMBLE_LONG;
       
  1972     }
       
  1973 
  1926   Time duration = Seconds (0);
  1974   Time duration = Seconds (0);
  1927 
  1975 
  1928   if (m_txParams.HasDurationId ())
  1976   if (m_txParams.HasDurationId ())
  1929     {
  1977     {
  1930       duration += m_txParams.GetDurationId ();
  1978       duration += m_txParams.GetDurationId ();
  1935       duration += GetSifs ();
  1983       duration += GetSifs ();
  1936       duration += m_phy->CalculateTxDuration (GetSize (m_currentPacket,&m_currentHdr),
  1984       duration += m_phy->CalculateTxDuration (GetSize (m_currentPacket,&m_currentHdr),
  1937                                               dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1985                                               dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1938       if (m_txParams.MustWaitBasicBlockAck ())
  1986       if (m_txParams.MustWaitBasicBlockAck ())
  1939         {
  1987         {
  1940           
  1988 
  1941           duration += GetSifs ();
  1989           duration += GetSifs ();
  1942           WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
  1990           WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
  1943           duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
  1991           duration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, BASIC_BLOCK_ACK);
  1944         }
  1992         }
  1945       else if (m_txParams.MustWaitCompressedBlockAck ())
  1993       else if (m_txParams.MustWaitCompressedBlockAck ())
  1982   ForwardDown (packet, &cts, ctsTxVector,preamble);
  2030   ForwardDown (packet, &cts, ctsTxVector,preamble);
  1983 
  2031 
  1984   Time txDuration = m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  2032   Time txDuration = m_phy->CalculateTxDuration (GetCtsSize (), ctsTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  1985   txDuration += GetSifs ();
  2033   txDuration += GetSifs ();
  1986   NS_ASSERT (m_sendDataEvent.IsExpired ());
  2034   NS_ASSERT (m_sendDataEvent.IsExpired ());
  1987   
  2035 
  1988   m_sendDataEvent = Simulator::Schedule (txDuration,
  2036   m_sendDataEvent = Simulator::Schedule (txDuration,
  1989                                          &MacLow::SendDataAfterCts, this,
  2037                                          &MacLow::SendDataAfterCts, this,
  1990                                          cts.GetAddr1 (),
  2038                                          cts.GetAddr1 (),
  1991                                          duration);
  2039                                          duration);
  1992 }
  2040 }
  2031   /* send the third step in a
  2079   /* send the third step in a
  2032    * RTS/CTS/DATA/ACK hanshake
  2080    * RTS/CTS/DATA/ACK hanshake
  2033    */
  2081    */
  2034   NS_ASSERT (m_currentPacket != 0);
  2082   NS_ASSERT (m_currentPacket != 0);
  2035   WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
  2083   WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
  2036   
  2084 
  2037   if (m_aggregateQueue->GetSize () != 0)
  2085   if (m_aggregateQueue->GetSize () != 0)
  2038   {
  2086     {
  2039     for (std::vector<Item>::size_type i = 0; i != m_txPackets.size(); i++)
  2087       for (std::vector<Item>::size_type i = 0; i != m_txPackets.size (); i++)
  2040     {
  2088         {
  2041       uint8_t tid = GetTid (m_txPackets.at(i).packet, m_txPackets.at(i).hdr);
  2089           uint8_t tid = GetTid (m_txPackets.at (i).packet, m_txPackets.at (i).hdr);
  2042       AcIndex ac = QosUtilsMapTidToAc (tid);
  2090           AcIndex ac = QosUtilsMapTidToAc (tid);
  2043       std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
  2091           std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
  2044       
  2092 
  2045       listenerIt->second->CompleteMpduTx (m_txPackets.at(i).packet, m_txPackets.at(i).hdr, m_txPackets.at(i).timestamp);
  2093           listenerIt->second->CompleteMpduTx (m_txPackets.at (i).packet, m_txPackets.at (i).hdr, m_txPackets.at (i).timestamp);
  2046     }
  2094         }
  2047     m_txPackets.clear ();
  2095       m_txPackets.clear ();
  2048   }
  2096     }
  2049   
  2097 
  2050   WifiPreamble preamble;       
  2098   WifiPreamble preamble;
  2051   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  2099   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  2052      //In the future has to make sure that receiver has greenfield enabled
  2100     {
  2053      preamble = WIFI_PREAMBLE_HT_GF;
  2101       //In the future has to make sure that receiver has greenfield enabled
       
  2102       preamble = WIFI_PREAMBLE_HT_GF;
       
  2103     }
  2054   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  2104   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  2055     preamble = WIFI_PREAMBLE_HT_MF;
  2105     {
       
  2106       preamble = WIFI_PREAMBLE_HT_MF;
       
  2107     }
  2056   else
  2108   else
  2057      preamble = WIFI_PREAMBLE_LONG;
  2109     {
  2058   
  2110       preamble = WIFI_PREAMBLE_LONG;
       
  2111     }
       
  2112 
  2059   StartDataTxTimers (dataTxVector);
  2113   StartDataTxTimers (dataTxVector);
  2060   Time newDuration = Seconds (0);
  2114   Time newDuration = Seconds (0);
  2061   if (m_txParams.MustWaitBasicBlockAck ())
  2115   if (m_txParams.MustWaitBasicBlockAck ())
  2062     {
  2116     {
  2063       newDuration += GetSifs ();
  2117       newDuration += GetSifs ();
  2079     {
  2133     {
  2080       newDuration += GetSifs ();
  2134       newDuration += GetSifs ();
  2081       newDuration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  2135       newDuration += m_phy->CalculateTxDuration (m_txParams.GetNextPacketSize (), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  2082       if (m_txParams.MustWaitCompressedBlockAck ())
  2136       if (m_txParams.MustWaitCompressedBlockAck ())
  2083         {
  2137         {
  2084            newDuration += GetSifs ();
  2138           newDuration += GetSifs ();
  2085            WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
  2139           WifiTxVector blockAckReqTxVector = GetBlockAckTxVector (m_currentHdr.GetAddr2 (), dataTxVector.GetMode ());
  2086            newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
  2140           newDuration += GetBlockAckDuration (m_currentHdr.GetAddr1 (), blockAckReqTxVector, COMPRESSED_BLOCK_ACK);
  2087         }
  2141         }
  2088       else if (m_txParams.MustWaitAck ())
  2142       else if (m_txParams.MustWaitAck ())
  2089         {
  2143         {
  2090            newDuration += GetSifs ();
  2144           newDuration += GetSifs ();
  2091            newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
  2145           newDuration += GetAckDuration (m_currentHdr.GetAddr1 (), dataTxVector);
  2092         }
  2146         }
  2093     }
  2147     }
  2094 
  2148 
  2095   Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  2149   Time txDuration = m_phy->CalculateTxDuration (GetSize (m_currentPacket, &m_currentHdr), dataTxVector, preamble, m_phy->GetFrequency (), 0, 0);
  2096   duration -= txDuration;
  2150   duration -= txDuration;
  2099   duration = std::max (duration, newDuration);
  2153   duration = std::max (duration, newDuration);
  2100   NS_ASSERT (duration >= MicroSeconds (0));
  2154   NS_ASSERT (duration >= MicroSeconds (0));
  2101   m_currentHdr.SetDuration (duration);
  2155   m_currentHdr.SetDuration (duration);
  2102 
  2156 
  2103   if (!m_ampdu)
  2157   if (!m_ampdu)
  2104   {
  2158     {
  2105     m_currentPacket->AddHeader (m_currentHdr);
  2159       m_currentPacket->AddHeader (m_currentHdr);
  2106     WifiMacTrailer fcs;
  2160       WifiMacTrailer fcs;
  2107     m_currentPacket->AddTrailer (fcs);
  2161       m_currentPacket->AddTrailer (fcs);
  2108   }
  2162     }
  2109 
  2163 
  2110   ForwardDown (m_currentPacket, &m_currentHdr, dataTxVector, preamble);
  2164   ForwardDown (m_currentPacket, &m_currentHdr, dataTxVector, preamble);
  2111   m_currentPacket = 0;
  2165   m_currentPacket = 0;
  2112 }
  2166 }
  2113 
  2167 
  2115 MacLow::WaitSifsAfterEndTx (void)
  2169 MacLow::WaitSifsAfterEndTx (void)
  2116 {
  2170 {
  2117   m_listener->StartNext ();
  2171   m_listener->StartNext ();
  2118 }
  2172 }
  2119 
  2173 
  2120 void 
  2174 void
  2121 MacLow::EndTxNoAck (void)
  2175 MacLow::EndTxNoAck (void)
  2122 {
  2176 {
  2123   MacLowTransmissionListener *listener = m_listener;
  2177   MacLowTransmissionListener *listener = m_listener;
  2124   m_listener = 0;
  2178   m_listener = 0;
  2125   listener->EndTxNoAck ();
  2179   listener->EndTxNoAck ();
  2172 MacLow::IsInWindow (uint16_t seq, uint16_t winstart, uint16_t winsize)
  2226 MacLow::IsInWindow (uint16_t seq, uint16_t winstart, uint16_t winsize)
  2173 {
  2227 {
  2174   return ((seq - winstart + 4096) % 4096) < winsize;
  2228   return ((seq - winstart + 4096) % 4096) < winsize;
  2175 }
  2229 }
  2176 
  2230 
  2177 bool 
  2231 bool
  2178 MacLow::ReceiveMpdu (Ptr<Packet> packet, WifiMacHeader hdr)
  2232 MacLow::ReceiveMpdu (Ptr<Packet> packet, WifiMacHeader hdr)
  2179  {
  2233 {
  2180   if (m_stationManager->HasHtSupported ())
  2234   if (m_stationManager->HasHtSupported ())
  2181     {
  2235     {
  2182       Mac48Address originator = hdr.GetAddr2 ();
  2236       Mac48Address originator = hdr.GetAddr2 ();
  2183       uint8_t tid = 0;
  2237       uint8_t tid = 0;
  2184       if (hdr.IsQosData ())
  2238       if (hdr.IsQosData ())
  2185         tid = hdr.GetQosTid ();
  2239         {
       
  2240           tid = hdr.GetQosTid ();
       
  2241         }
  2186       uint16_t seqNumber = hdr.GetSequenceNumber ();
  2242       uint16_t seqNumber = hdr.GetSequenceNumber ();
  2187       AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
  2243       AgreementsI it = m_bAckAgreements.find (std::make_pair (originator, tid));
  2188       if (it != m_bAckAgreements.end ())
  2244       if (it != m_bAckAgreements.end ())
  2189         {
  2245         {
  2190           //Implement HT immediate Block Ack support for HT Delayed Block Ack is not added yet
  2246           //Implement HT immediate Block Ack support for HT Delayed Block Ack is not added yet
  2191           if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), seqNumber))
  2247           if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), seqNumber))
  2192             { 
  2248             {
  2193               StoreMpduIfNeeded (packet, hdr);
  2249               StoreMpduIfNeeded (packet, hdr);
  2194               if (!IsInWindow(hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ()))
  2250               if (!IsInWindow (hdr.GetSequenceNumber (), (*it).second.first.GetStartingSequence (), (*it).second.first.GetBufferSize ()))
  2195                 {
  2251                 {
  2196                   uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd() + 4096) % 4096;
  2252                   uint16_t delta = (seqNumber - (*it).second.first.GetWinEnd () + 4096) % 4096;
  2197                   if (delta > 1)
  2253                   if (delta > 1)
  2198                     {
  2254                     {
  2199                      (*it).second.first.SetWinEnd (seqNumber);
  2255                       (*it).second.first.SetWinEnd (seqNumber);
  2200                      int16_t winEnd = (*it).second.first.GetWinEnd ();
  2256                       int16_t winEnd = (*it).second.first.GetWinEnd ();
  2201                      int16_t bufferSize = (*it).second.first.GetBufferSize ();
  2257                       int16_t bufferSize = (*it).second.first.GetBufferSize ();
  2202                      uint16_t sum = ((uint16_t)(std::abs(winEnd - bufferSize + 1))) % 4096;
  2258                       uint16_t sum = ((uint16_t)(std::abs (winEnd - bufferSize + 1))) % 4096;
  2203                      (*it).second.first.SetStartingSequence (sum);
  2259                       (*it).second.first.SetStartingSequence (sum);
  2204                      RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequence (), originator, tid);
  2260                       RxCompleteBufferedPacketsWithSmallerSequence ((*it).second.first.GetStartingSequence (), originator, tid);
  2205                    } 
  2261                     }
  2206                }
  2262                 }
  2207               RxCompleteBufferedPacketsUntilFirstLost (originator, tid); //forwards up packets starting from winstart and set winstart to last +1
  2263               RxCompleteBufferedPacketsUntilFirstLost (originator, tid); //forwards up packets starting from winstart and set winstart to last +1
  2208              (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize() - 1) % 4096);
  2264               (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096);
  2209            }
  2265             }
  2210           return true;
  2266           return true;
  2211         }  
  2267         }
  2212       return false;
  2268       return false;
  2213     }
  2269     }
  2214  else
  2270   else
  2215    return StoreMpduIfNeeded (packet, hdr);
  2271     {
       
  2272       return StoreMpduIfNeeded (packet, hdr);
       
  2273     }
  2216 }
  2274 }
  2217 
  2275 
  2218 bool
  2276 bool
  2219 MacLow::StoreMpduIfNeeded (Ptr<Packet> packet, WifiMacHeader hdr)
  2277 MacLow::StoreMpduIfNeeded (Ptr<Packet> packet, WifiMacHeader hdr)
  2220 {
  2278 {
  2230 
  2288 
  2231       BufferedPacketI i = (*it).second.second.begin ();
  2289       BufferedPacketI i = (*it).second.second.begin ();
  2232       for (; i != (*it).second.second.end ()
  2290       for (; i != (*it).second.second.end ()
  2233            && QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceControl (), endSequence) < mappedSeqControl; i++)
  2291            && QosUtilsMapSeqControlToUniqueInteger ((*i).second.GetSequenceControl (), endSequence) < mappedSeqControl; i++)
  2234         {
  2292         {
  2235           ;
       
  2236         }
  2293         }
  2237       (*it).second.second.insert (i, bufferedPacket);
  2294       (*it).second.second.insert (i, bufferedPacket);
  2238 
  2295 
  2239       //Update block ack cache
  2296       //Update block ack cache
  2240       BlockAckCachesI j = m_bAckCaches.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
  2297       BlockAckCachesI j = m_bAckCaches.find (std::make_pair (hdr.GetAddr2 (), hdr.GetQosTid ()));
  2454   packet->AddHeader (hdr);
  2511   packet->AddHeader (hdr);
  2455   WifiMacTrailer fcs;
  2512   WifiMacTrailer fcs;
  2456   packet->AddTrailer (fcs);
  2513   packet->AddTrailer (fcs);
  2457   WifiPreamble preamble;
  2514   WifiPreamble preamble;
  2458   if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  2515   if (blockAckReqTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  2459     preamble = WIFI_PREAMBLE_HT_MF;
  2516     {
       
  2517       preamble = WIFI_PREAMBLE_HT_MF;
       
  2518     }
  2460   else
  2519   else
  2461     preamble = WIFI_PREAMBLE_LONG;
  2520     {
       
  2521       preamble = WIFI_PREAMBLE_LONG;
       
  2522     }
  2462   ForwardDown (packet, &hdr, blockAckReqTxVector, preamble);
  2523   ForwardDown (packet, &hdr, blockAckReqTxVector, preamble);
  2463   m_currentPacket = 0;
  2524   m_currentPacket = 0;
  2464 }
  2525 }
  2465 
  2526 
  2466 void 
  2527 void
  2467 MacLow::SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator, Time duration, WifiTxVector blockAckReqTxVector)
  2528 MacLow::SendBlockAckAfterAmpdu (uint8_t tid, Mac48Address originator, Time duration, WifiTxVector blockAckReqTxVector)
  2468 {
  2529 {
  2469   NS_LOG_FUNCTION (this);
  2530   NS_LOG_FUNCTION (this);
  2470   CtrlBAckResponseHeader blockAck;
  2531   CtrlBAckResponseHeader blockAck;
  2471   uint16_t seqNumber = 0;
  2532   uint16_t seqNumber = 0;
  2478   blockAck.SetStartingSequence (seqNumber);
  2539   blockAck.SetStartingSequence (seqNumber);
  2479   blockAck.SetTidInfo (tid);
  2540   blockAck.SetTidInfo (tid);
  2480   immediate = (*it).second.first.IsImmediateBlockAck ();
  2541   immediate = (*it).second.first.IsImmediateBlockAck ();
  2481   blockAck.SetType (COMPRESSED_BLOCK_ACK);
  2542   blockAck.SetType (COMPRESSED_BLOCK_ACK);
  2482   NS_LOG_DEBUG ("Got Implicit block Ack Req with seq " << seqNumber);
  2543   NS_LOG_DEBUG ("Got Implicit block Ack Req with seq " << seqNumber);
  2483   (*i).second.FillBlockAckBitmap (&blockAck);  
  2544   (*i).second.FillBlockAckBitmap (&blockAck);
  2484 
  2545 
  2485   SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxVector.GetMode  ());
  2546   SendBlockAckResponse (&blockAck, originator, immediate, duration, blockAckReqTxVector.GetMode  ());
  2486 }
  2547 }
  2487 
  2548 
  2488 void
  2549 void
  2513           BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid));
  2574           BlockAckCachesI i = m_bAckCaches.find (std::make_pair (originator, tid));
  2514           NS_ASSERT (i != m_bAckCaches.end ());
  2575           NS_ASSERT (i != m_bAckCaches.end ());
  2515           (*i).second.FillBlockAckBitmap (&blockAck);
  2576           (*i).second.FillBlockAckBitmap (&blockAck);
  2516           NS_LOG_DEBUG ("Got block Ack Req with seq " << reqHdr.GetStartingSequence ());
  2577           NS_LOG_DEBUG ("Got block Ack Req with seq " << reqHdr.GetStartingSequence ());
  2517 
  2578 
  2518           if (!m_stationManager->HasHtSupported())
  2579           if (!m_stationManager->HasHtSupported ())
  2519             {
  2580             {
  2520               /* All packets with smaller sequence than starting sequence control must be passed up to Wifimac
  2581               /* All packets with smaller sequence than starting sequence control must be passed up to Wifimac
  2521                * See 9.10.3 in IEEE 802.11e standard.
  2582                * See 9.10.3 in IEEE 802.11e standard.
  2522                */
  2583                */
  2523               RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid);
  2584               RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid);
  2524               RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
  2585               RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
  2525             }
  2586             }
  2526           else
  2587           else
  2527             {
  2588             {
  2528               if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence(), reqHdr.GetStartingSequence ()))
  2589               if (!QosUtilsIsOldPacket ((*it).second.first.GetStartingSequence (), reqHdr.GetStartingSequence ()))
  2529                 { 
  2590                 {
  2530                   (*it).second.first.SetStartingSequence (reqHdr.GetStartingSequence ());
  2591                   (*it).second.first.SetStartingSequence (reqHdr.GetStartingSequence ());
  2531                   (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize() - 1) % 4096);
  2592                   (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096);
  2532                   RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid);
  2593                   RxCompleteBufferedPacketsWithSmallerSequence (reqHdr.GetStartingSequence (), originator, tid);
  2533                   RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
  2594                   RxCompleteBufferedPacketsUntilFirstLost (originator, tid);
  2534                   (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence()+(*it).second.first.GetBufferSize() - 1) % 4096);
  2595                   (*it).second.first.SetWinEnd (((*it).second.first.GetStartingSequence () + (*it).second.first.GetBufferSize () - 1) % 4096);
  2535                 }
  2596                 }
  2536             }
  2597             }
  2537         }
  2598         }
  2538       else
  2599       else
  2539         {
  2600         {
  2582 {
  2643 {
  2583   m_currentTxVector = txVector;
  2644   m_currentTxVector = txVector;
  2584   AmpduTag ampdu;
  2645   AmpduTag ampdu;
  2585   bool normalAck = false;
  2646   bool normalAck = false;
  2586   bool ampduSubframe = false;
  2647   bool ampduSubframe = false;
  2587   if (aggregatedPacket->RemovePacketTag(ampdu))
  2648   if (aggregatedPacket->RemovePacketTag (ampdu))
  2588     {
  2649     {
  2589       ampduSubframe = true;
  2650       ampduSubframe = true;
  2590       MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (aggregatedPacket);
  2651       MpduAggregator::DeaggregatedMpdus packets = MpduAggregator::Deaggregate (aggregatedPacket);
  2591       MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
  2652       MpduAggregator::DeaggregatedMpdusCI n = packets.begin ();
  2592 
  2653 
  2593       WifiMacHeader firsthdr;
  2654       WifiMacHeader firsthdr;
  2594       (*n).first->PeekHeader (firsthdr);
  2655       (*n).first->PeekHeader (firsthdr);
  2595       NS_LOG_DEBUG ("duration/id=" << firsthdr.GetDuration ());
  2656       NS_LOG_DEBUG ("duration/id=" << firsthdr.GetDuration ());
  2596       NotifyNav ((*n).first, firsthdr, preamble);
  2657       NotifyNav ((*n).first, firsthdr, preamble);
  2597       
  2658 
  2598       if (firsthdr.GetAddr1 () == m_self)
  2659       if (firsthdr.GetAddr1 () == m_self)
  2599         {
  2660         {
  2600           m_receivedAtLeastOneMpdu = true;
  2661           m_receivedAtLeastOneMpdu = true;
  2601           if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ())
  2662           if (firsthdr.IsAck () || firsthdr.IsBlockAck () || firsthdr.IsBlockAckReq ())
       
  2663             {
  2602               ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
  2664               ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
       
  2665             }
  2603           else if (firsthdr.IsData () || firsthdr.IsQosData ())
  2666           else if (firsthdr.IsData () || firsthdr.IsQosData ())
  2604             {
  2667             {
  2605               NS_LOG_DEBUG ("Deaggregate packet with sequence=" << firsthdr.GetSequenceNumber ());
  2668               NS_LOG_DEBUG ("Deaggregate packet with sequence=" << firsthdr.GetSequenceNumber ());
  2606               ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
  2669               ReceiveOk ((*n).first, rxSnr, txVector, preamble, ampduSubframe);
  2607               if (firsthdr.IsQosAck ())
  2670               if (firsthdr.IsQosAck ())
  2608                 {
  2671                 {
  2609                   NS_LOG_DEBUG ("Normal Ack");
  2672                   NS_LOG_DEBUG ("Normal Ack");
  2610                   normalAck = true;
  2673                   normalAck = true;
  2611                 }
  2674                 }
  2612             } 
  2675             }
  2613           else
  2676           else
       
  2677             {
  2614               NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type");
  2678               NS_FATAL_ERROR ("Received A-MPDU with invalid first MPDU type");
       
  2679             }
  2615         }
  2680         }
  2616 
  2681 
  2617       if (normalAck && (ampdu.GetNoOfMpdus () == 1))
  2682       if (normalAck && (ampdu.GetNoOfMpdus () == 1))
  2618         { 
  2683         {
  2619           //send block Ack
  2684           //send block Ack
  2620           if (firsthdr.IsBlockAckReq ())
  2685           if (firsthdr.IsBlockAckReq ())
  2621             {
  2686             {
  2622               NS_FATAL_ERROR ("Sending a BlockAckReq with QosPolicy equal to Normal Ack");
  2687               NS_FATAL_ERROR ("Sending a BlockAckReq with QosPolicy equal to Normal Ack");
  2623             }
  2688             }
  2624           uint8_t tid = firsthdr.GetQosTid ();
  2689           uint8_t tid = firsthdr.GetQosTid ();
  2625           AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid));
  2690           AgreementsI it = m_bAckAgreements.find (std::make_pair (firsthdr.GetAddr2 (), tid));
  2626           if (it != m_bAckAgreements.end ())
  2691           if (it != m_bAckAgreements.end ())
  2627             { 
  2692             {
  2628               NS_ASSERT (m_sendAckEvent.IsExpired ());
  2693               NS_ASSERT (m_sendAckEvent.IsExpired ());
  2629               /* See section 11.5.3 in IEEE 802.11 for mean of this timer */
  2694               /* See section 11.5.3 in IEEE 802.11 for mean of this timer */
  2630               ResetBlockAckInactivityTimerIfNeeded (it->second.first);
  2695               ResetBlockAckInactivityTimerIfNeeded (it->second.first);
  2631               NS_LOG_DEBUG ("rx A-MPDU/sendImmediateBlockAck from=" << firsthdr.GetAddr2 ());
  2696               NS_LOG_DEBUG ("rx A-MPDU/sendImmediateBlockAck from=" << firsthdr.GetAddr2 ());
  2632               m_sendAckEvent = Simulator::Schedule (GetSifs (),
  2697               m_sendAckEvent = Simulator::Schedule (GetSifs (),
  2633                                                     &MacLow::SendBlockAckAfterAmpdu, this,
  2698                                                     &MacLow::SendBlockAckAfterAmpdu, this,
  2634                                                     firsthdr.GetQosTid (),
  2699                                                     firsthdr.GetQosTid (),
  2635                                                     firsthdr.GetAddr2 (),
  2700                                                     firsthdr.GetAddr2 (),
  2636                                                     firsthdr.GetDuration (),
  2701                                                     firsthdr.GetDuration (),
  2637                                                     txVector);
  2702                                                     txVector);
  2638             } 
  2703             }
  2639           else
  2704           else
  2640             { 
  2705             {
  2641               NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
  2706               NS_LOG_DEBUG ("There's not a valid agreement for this block ack request.");
  2642             }
  2707             }
  2643           m_receivedAtLeastOneMpdu = false;
  2708           m_receivedAtLeastOneMpdu = false;
  2644         }
  2709         }
  2645     }
  2710     }
  2646   else
  2711   else
  2647     {     
  2712     {
  2648           ReceiveOk (aggregatedPacket, rxSnr, txVector, preamble, ampduSubframe);
  2713       ReceiveOk (aggregatedPacket, rxSnr, txVector, preamble, ampduSubframe);
  2649     }
  2714     }
  2650 }
  2715 }
  2651 
  2716 
  2652 bool 
  2717 bool
  2653 MacLow::StopMpduAggregation(Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const
  2718 MacLow::StopMpduAggregation (Ptr<const Packet> peekedPacket, WifiMacHeader peekedHdr, Ptr<Packet> aggregatedPacket, uint16_t size) const
  2654 {
  2719 {
  2655     WifiPreamble preamble;
  2720   WifiPreamble preamble;
  2656     WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
  2721   WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
  2657     if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  2722   if (m_phy->GetGreenfield () && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
  2658         preamble = WIFI_PREAMBLE_HT_GF;
  2723     {
  2659     else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  2724       preamble = WIFI_PREAMBLE_HT_GF;
  2660         preamble = WIFI_PREAMBLE_HT_MF;
  2725     }
  2661     else
  2726   else if (dataTxVector.GetMode ().GetModulationClass () == WIFI_MOD_CLASS_HT)
  2662         preamble = WIFI_PREAMBLE_LONG;
  2727     {
  2663     
  2728       preamble = WIFI_PREAMBLE_HT_MF;
  2664     if (peekedPacket == 0)
  2729     }
  2665         return true;
  2730   else
  2666     
  2731     {
  2667     //An HT STA shall not transmit a PPDU that has a duration that is greater than aPPDUMaxTime (10 milliseconds)
  2732       preamble = WIFI_PREAMBLE_LONG;
  2668     if(m_phy->CalculateTxDuration (aggregatedPacket->GetSize () + peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0) > MilliSeconds(10))
  2733     }
  2669         return true;
  2734 
  2670     
  2735   if (peekedPacket == 0)
  2671     if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, size))
  2736     {
  2672         return true;
  2737       return true;
  2673     
  2738     }
  2674     return false;
  2739 
       
  2740   //An HT STA shall not transmit a PPDU that has a duration that is greater than aPPDUMaxTime (10 milliseconds)
       
  2741   if (m_phy->CalculateTxDuration (aggregatedPacket->GetSize () + peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, dataTxVector, preamble, m_phy->GetFrequency (), 0, 0) > MilliSeconds (10))
       
  2742     {
       
  2743       return true;
       
  2744     }
       
  2745 
       
  2746   if (!m_mpduAggregator->CanBeAggregated (peekedPacket->GetSize () + peekedHdr.GetSize () + WIFI_MAC_FCS_LENGTH, aggregatedPacket, size))
       
  2747     {
       
  2748       return true;
       
  2749     }
       
  2750 
       
  2751   return false;
  2675 }
  2752 }
  2676 
  2753 
  2677 Ptr<Packet>
  2754 Ptr<Packet>
  2678 MacLow::AggregateToAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr)
  2755 MacLow::AggregateToAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr)
  2679 {
  2756 {
  2680   NS_ASSERT (m_aggregateQueue->GetSize () == 0);
  2757   NS_ASSERT (m_aggregateQueue->GetSize () == 0);
  2681   bool isAmpdu = false;
  2758   bool isAmpdu = false;
  2682   Ptr<Packet> newPacket, tempPacket;
  2759   Ptr<Packet> newPacket, tempPacket;
  2683   WifiMacHeader peekedHdr;
  2760   WifiMacHeader peekedHdr;
  2684   newPacket = packet->Copy();
  2761   newPacket = packet->Copy ();
  2685   //missing hdr.IsAck() since we have no means of knowing the Tid of the Ack yet
  2762   //missing hdr.IsAck() since we have no means of knowing the Tid of the Ack yet
  2686   if (hdr.IsQosData() || hdr.IsBlockAck()|| hdr.IsBlockAckReq())
  2763   if (hdr.IsQosData () || hdr.IsBlockAck ()|| hdr.IsBlockAckReq ())
  2687     {
  2764     {
  2688       Time tstamp;
  2765       Time tstamp;
  2689       uint8_t tid = GetTid (packet, hdr);
  2766       uint8_t tid = GetTid (packet, hdr);
  2690       Ptr<WifiMacQueue> queue;
  2767       Ptr<WifiMacQueue> queue;
  2691       AcIndex ac = QosUtilsMapTidToAc (tid);
  2768       AcIndex ac = QosUtilsMapTidToAc (tid);
  2692       //since a blockack agreement always preceeds mpdu aggregation there should always exist blockAck listener
  2769       //since a blockack agreement always preceeds mpdu aggregation there should always exist blockAck listener
  2693       std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
  2770       std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
  2694       NS_ASSERT (listenerIt != m_edcaListeners.end ());
  2771       NS_ASSERT (listenerIt != m_edcaListeners.end ());
  2695       queue = listenerIt->second->GetQueue();
  2772       queue = listenerIt->second->GetQueue ();
  2696       
  2773 
  2697       if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator!= 0)
  2774       if (!hdr.GetAddr1 ().IsBroadcast () && m_mpduAggregator != 0)
  2698         {
  2775         {
  2699           //Have to make sure that their exist a block Ack agreement before sending an AMPDU (BlockAck Manager)
  2776           //Have to make sure that their exist a block Ack agreement before sending an AMPDU (BlockAck Manager)
  2700           if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1(), tid))
  2777           if (listenerIt->second->GetBlockAckAgreementExists (hdr.GetAddr1 (), tid))
  2701             {
  2778             {
  2702               /* here is performed mpdu aggregation */
  2779               /* here is performed mpdu aggregation */
  2703               /* MSDU aggregation happened in edca if the user asked for it so m_currentPacket may contains a normal packet or a A-MSDU*/
  2780               /* MSDU aggregation happened in edca if the user asked for it so m_currentPacket may contains a normal packet or a A-MSDU*/
  2704               Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
  2781               Ptr<Packet> currentAggregatedPacket = Create<Packet> ();
  2705               peekedHdr = hdr;
  2782               peekedHdr = hdr;
  2709               uint16_t blockAckSize = 0;
  2786               uint16_t blockAckSize = 0;
  2710               bool aggregated = false;
  2787               bool aggregated = false;
  2711               int i = 0;
  2788               int i = 0;
  2712               Ptr<Packet> aggPacket = newPacket->Copy ();
  2789               Ptr<Packet> aggPacket = newPacket->Copy ();
  2713 
  2790 
  2714               if (!hdr.IsBlockAckReq())
  2791               if (!hdr.IsBlockAckReq ())
  2715                 {
  2792                 {
  2716                   if (!hdr.IsBlockAck())
  2793                   if (!hdr.IsBlockAck ())
  2717                     {
  2794                     {
  2718                        startingSequenceNumber = peekedHdr.GetSequenceNumber();
  2795                       startingSequenceNumber = peekedHdr.GetSequenceNumber ();
  2719                        peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
  2796                       peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
  2720                     }
  2797                     }
  2721                   currentSequenceNumber = peekedHdr.GetSequenceNumber();
  2798                   currentSequenceNumber = peekedHdr.GetSequenceNumber ();
  2722                   newPacket->AddHeader (peekedHdr);
  2799                   newPacket->AddHeader (peekedHdr);
  2723                   WifiMacTrailer fcs;
  2800                   WifiMacTrailer fcs;
  2724                   newPacket->AddTrailer (fcs);
  2801                   newPacket->AddTrailer (fcs);
  2725 
  2802 
  2726                   aggregated=m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
  2803                   aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
  2727 
  2804 
  2728                   if (aggregated)
  2805                   if (aggregated)
  2729                     {
  2806                     {
  2730                       NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
  2807                       NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber () << " to A-MPDU, packet size = " << newPacket->GetSize () << ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
  2731                       i++;
  2808                       i++;
  2732                       m_sentMpdus++;
  2809                       m_sentMpdus++;
  2733                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
  2810                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
  2734                     }
  2811                     }
  2735                 } 
  2812                 }
  2736               else if (hdr.IsBlockAckReq())
  2813               else if (hdr.IsBlockAckReq ())
  2737                 {
  2814                 {
  2738                   blockAckSize = packet->GetSize() + hdr.GetSize() + WIFI_MAC_FCS_LENGTH;
  2815                   blockAckSize = packet->GetSize () + hdr.GetSize () + WIFI_MAC_FCS_LENGTH;
  2739                   qosPolicy = 3; //if the last subrame is block ack req then set ack policy of all frames to blockack
  2816                   qosPolicy = 3; //if the last subrame is block ack req then set ack policy of all frames to blockack
  2740                   CtrlBAckRequestHeader blockAckReq;
  2817                   CtrlBAckRequestHeader blockAckReq;
  2741                   packet->PeekHeader (blockAckReq);
  2818                   packet->PeekHeader (blockAckReq);
  2742                   startingSequenceNumber = blockAckReq.GetStartingSequence ();
  2819                   startingSequenceNumber = blockAckReq.GetStartingSequence ();
  2743                 }
  2820                 }
  2749                 {
  2826                 {
  2750                   peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
  2827                   peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
  2751                                                              WifiMacHeader::ADDR1,
  2828                                                              WifiMacHeader::ADDR1,
  2752                                                              hdr.GetAddr1 (), &tstamp);
  2829                                                              hdr.GetAddr1 (), &tstamp);
  2753                   currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
  2830                   currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
  2754                     
  2831 
  2755                   /* here is performed MSDU aggregation (two-level aggregation) */
  2832                   /* here is performed MSDU aggregation (two-level aggregation) */
  2756                   if (peekedPacket != 0 && listenerIt->second->GetMsduAggregator () != 0)
  2833                   if (peekedPacket != 0 && listenerIt->second->GetMsduAggregator () != 0)
  2757                     {
  2834                     {
  2758                        tempPacket = PerformMsduAggregation(peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
  2835                       tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
  2759                        if (tempPacket != 0) //MSDU aggregation
  2836                       if (tempPacket != 0)  //MSDU aggregation
  2760                          peekedPacket = tempPacket->Copy();
  2837                         {
       
  2838                           peekedPacket = tempPacket->Copy ();
       
  2839                         }
  2761                     }
  2840                     }
  2762                 }
  2841                 }
  2763               else
  2842               else
  2764                 {
  2843                 {
  2765                   retry = true;
  2844                   retry = true;
  2766                   currentSequenceNumber = peekedHdr.GetSequenceNumber(); 
  2845                   currentSequenceNumber = peekedHdr.GetSequenceNumber ();
  2767                 }
  2846                 }
  2768 
  2847 
  2769                while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize))
  2848               while (IsInWindow (currentSequenceNumber, startingSequenceNumber, 64) && !StopMpduAggregation (peekedPacket, peekedHdr, currentAggregatedPacket, blockAckSize))
  2770                 {
  2849                 {
  2771                   //for now always send AMPDU with normal ACK
  2850                   //for now always send AMPDU with normal ACK
  2772                   if (retry == false)
  2851                   if (retry == false)
  2773                     {
  2852                     {
  2774                       currentSequenceNumber = listenerIt->second->GetNextSequenceNumberfor (&peekedHdr);
  2853                       currentSequenceNumber = listenerIt->second->GetNextSequenceNumberfor (&peekedHdr);
  2775                       peekedHdr.SetSequenceNumber (currentSequenceNumber);
  2854                       peekedHdr.SetSequenceNumber (currentSequenceNumber);
  2776                       peekedHdr.SetFragmentNumber (0);
  2855                       peekedHdr.SetFragmentNumber (0);
  2777                       peekedHdr.SetNoMoreFragments ();
  2856                       peekedHdr.SetNoMoreFragments ();
  2778                       peekedHdr.SetNoRetry ();
  2857                       peekedHdr.SetNoRetry ();
  2779                     }                      
  2858                     }
  2780                   if (qosPolicy == 0)
  2859                   if (qosPolicy == 0)
       
  2860                     {
  2781                       peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
  2861                       peekedHdr.SetQosAckPolicy (WifiMacHeader::NORMAL_ACK);
       
  2862                     }
  2782                   else
  2863                   else
       
  2864                     {
  2783                       peekedHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
  2865                       peekedHdr.SetQosAckPolicy (WifiMacHeader::BLOCK_ACK);
       
  2866                     }
  2784 
  2867 
  2785                   newPacket = peekedPacket->Copy ();
  2868                   newPacket = peekedPacket->Copy ();
  2786                   Ptr<Packet> aggPacket = newPacket->Copy ();
  2869                   Ptr<Packet> aggPacket = newPacket->Copy ();
  2787                  
  2870 
  2788                   newPacket->AddHeader (peekedHdr);
  2871                   newPacket->AddHeader (peekedHdr);
  2789                   WifiMacTrailer fcs;
  2872                   WifiMacTrailer fcs;
  2790                   newPacket->AddTrailer (fcs);
  2873                   newPacket->AddTrailer (fcs);
  2791                   aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
  2874                   aggregated = m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
  2792                   if (aggregated)
  2875                   if (aggregated)
  2793                     {
  2876                     {
  2794                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
  2877                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
  2795                       if (i == 1 && hdr.IsQosData ())
  2878                       if (i == 1 && hdr.IsQosData ())
  2796                       {
       
  2797                         if (!m_txParams.MustSendRts ())
       
  2798                         {
  2879                         {
  2799                            listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
  2880                           if (!m_txParams.MustSendRts ())
       
  2881                             {
       
  2882                               listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
       
  2883                             }
       
  2884                           else
       
  2885                             {
       
  2886                               InsertInTxQueue (packet, hdr, tstamp);
       
  2887                             }
  2800                         }
  2888                         }
  2801                         else
  2889                       NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber () << " to A-MPDU, packet size = " << newPacket->GetSize () << ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
  2802                         {
       
  2803                           InsertInTxQueue (packet, hdr, tstamp);
       
  2804                         }
       
  2805                       }
       
  2806                       NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber () <<" to A-MPDU, packet size = " << newPacket->GetSize ()<< ", A-MPDU size = " << currentAggregatedPacket->GetSize ());
       
  2807                       i++;
  2890                       i++;
  2808                       isAmpdu = true;
  2891                       isAmpdu = true;
  2809                       m_sentMpdus++;
  2892                       m_sentMpdus++;
  2810                       if (!m_txParams.MustSendRts ())
  2893                       if (!m_txParams.MustSendRts ())
  2811                       {
  2894                         {
  2812                         listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
  2895                           listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
  2813                       }
  2896                         }
  2814                       else
  2897                       else
  2815                       {
  2898                         {
  2816                         InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
  2899                           InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
  2817                       }
  2900                         }
  2818                       if (retry)
  2901                       if (retry)
       
  2902                         {
  2819                           listenerIt->second->RemoveFromBaQueue (tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
  2903                           listenerIt->second->RemoveFromBaQueue (tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
       
  2904                         }
  2820                       else
  2905                       else
       
  2906                         {
  2821                           queue->Remove (peekedPacket);
  2907                           queue->Remove (peekedPacket);
       
  2908                         }
  2822                       newPacket = 0;
  2909                       newPacket = 0;
  2823                     }
  2910                     }
  2824                   else
  2911                   else
       
  2912                     {
  2825                       break;
  2913                       break;
       
  2914                     }
  2826                   if (retry == true)
  2915                   if (retry == true)
  2827                     {
  2916                     {
  2828                       peekedPacket = listenerIt->second->PeekNextPacketInBaQueue(peekedHdr, hdr.GetAddr1(), tid, &tstamp);
  2917                       peekedPacket = listenerIt->second->PeekNextPacketInBaQueue (peekedHdr, hdr.GetAddr1 (), tid, &tstamp);
  2829                       if (peekedPacket == 0)
  2918                       if (peekedPacket == 0)
  2830                         {
  2919                         {
  2831                           //I reached the first packet that I added to this A-MPDU
  2920                           //I reached the first packet that I added to this A-MPDU
  2832                           retry = false;
  2921                           retry = false;
  2833                           peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
  2922                           peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
  2834                                                                      WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp);
  2923                                                                      WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp);
  2835                           if (peekedPacket != 0)
  2924                           if (peekedPacket != 0)
  2836                             {
  2925                             {
  2837                               //find what will the sequence number be so that we don't send more than 64 packets apart
  2926                               //find what will the sequence number be so that we don't send more than 64 packets apart
  2838                               currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
  2927                               currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
  2839                               
  2928 
  2840                               if (listenerIt->second->GetMsduAggregator () != 0)
  2929                               if (listenerIt->second->GetMsduAggregator () != 0)
  2841                               {
  2930                                 {
  2842                                 tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
  2931                                   tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
  2843                                 if (tempPacket != 0) //MSDU aggregation
  2932                                   if (tempPacket != 0) //MSDU aggregation
  2844                                   peekedPacket = tempPacket->Copy();
  2933                                     {
  2845                               }
  2934                                       peekedPacket = tempPacket->Copy ();
  2846                             }   
  2935                                     }
       
  2936                                 }
       
  2937                             }
  2847                         }
  2938                         }
  2848                       else
  2939                       else
  2849                           currentSequenceNumber = peekedHdr.GetSequenceNumber();
  2940                         {
       
  2941                           currentSequenceNumber = peekedHdr.GetSequenceNumber ();
       
  2942                         }
  2850                     }
  2943                     }
  2851                   else
  2944                   else
  2852                     {
  2945                     {
  2853                       peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
  2946                       peekedPacket = queue->PeekByTidAndAddress (&peekedHdr, tid,
  2854                                                                  WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp);
  2947                                                                  WifiMacHeader::ADDR1, hdr.GetAddr1 (), &tstamp);
  2855                       if (peekedPacket != 0)
  2948                       if (peekedPacket != 0)
  2856                         {
  2949                         {
  2857                           //find what will the sequence number be so that we don't send more than 64 packets apart
  2950                           //find what will the sequence number be so that we don't send more than 64 packets apart
  2858                           currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
  2951                           currentSequenceNumber = listenerIt->second->PeekNextSequenceNumberfor (&peekedHdr);
  2859                           
  2952 
  2860                           if (listenerIt->second->GetMsduAggregator () != 0 && IsInWindow (currentSequenceNumber, startingSequenceNumber, 64))
  2953                           if (listenerIt->second->GetMsduAggregator () != 0 && IsInWindow (currentSequenceNumber, startingSequenceNumber, 64))
  2861                           {
  2954                             {
  2862                             tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
  2955                               tempPacket = PerformMsduAggregation (peekedPacket, &peekedHdr, &tstamp, currentAggregatedPacket, blockAckSize);
  2863                             if (tempPacket != 0) //MSDU aggregation
  2956                               if (tempPacket != 0) //MSDU aggregation
  2864                               peekedPacket = tempPacket->Copy();
  2957                                 {
  2865                           }
  2958                                   peekedPacket = tempPacket->Copy ();
  2866                         }   
  2959                                 }
       
  2960                             }
       
  2961                         }
  2867                     }
  2962                     }
  2868                 }
  2963                 }
  2869               if (isAmpdu)
  2964               if (isAmpdu)
  2870                 {
  2965                 {
  2871                   if (hdr.IsBlockAckReq())
  2966                   if (hdr.IsBlockAckReq ())
  2872                     {
  2967                     {
  2873                       newPacket = packet->Copy();
  2968                       newPacket = packet->Copy ();
  2874                       peekedHdr = hdr;
  2969                       peekedHdr = hdr;
  2875                       Ptr<Packet> aggPacket = newPacket->Copy();
  2970                       Ptr<Packet> aggPacket = newPacket->Copy ();
  2876                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
  2971                       m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
  2877                       newPacket->AddHeader (peekedHdr);
  2972                       newPacket->AddHeader (peekedHdr);
  2878                       WifiMacTrailer fcs;
  2973                       WifiMacTrailer fcs;
  2879                       newPacket->AddTrailer (fcs);
  2974                       newPacket->AddTrailer (fcs);
  2880                       m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
  2975                       m_mpduAggregator->Aggregate (newPacket, currentAggregatedPacket);
  2881                     }
  2976                     }
  2882                   if (qosPolicy==0)
  2977                   if (qosPolicy == 0)
  2883                     {
  2978                     {
  2884                          listenerIt->second->CompleteTransfer (hdr.GetAddr1 (), tid);
  2979                       listenerIt->second->CompleteTransfer (hdr.GetAddr1 (), tid);
  2885                     }
  2980                     }
  2886                   //Add packet tag
  2981                   //Add packet tag
  2887                   AmpduTag ampdutag;
  2982                   AmpduTag ampdutag;
  2888                   ampdutag.SetAmpdu (true);
  2983                   ampdutag.SetAmpdu (true);
  2889                   ampdutag.SetNoOfMpdus(i);
  2984                   ampdutag.SetNoOfMpdus (i);
  2890                   newPacket = currentAggregatedPacket;
  2985                   newPacket = currentAggregatedPacket;
  2891                   newPacket->AddPacketTag(ampdutag);
  2986                   newPacket->AddPacketTag (ampdutag);
  2892                   currentAggregatedPacket = 0;
  2987                   currentAggregatedPacket = 0;
  2893                   NS_LOG_DEBUG ("tx unicast A-MPDU");
  2988                   NS_LOG_DEBUG ("tx unicast A-MPDU");
  2894                   listenerIt->second->SetAmpdu(true);
  2989                   listenerIt->second->SetAmpdu (true);
  2895                 }
  2990                 }
  2896               else
  2991               else
  2897                 {
  2992                 {
  2898                   uint32_t queueSize = m_aggregateQueue->GetSize ();
  2993                   uint32_t queueSize = m_aggregateQueue->GetSize ();
  2899                   NS_ASSERT (queueSize <= 2); //since it is not an A-MPDU then only 2 packets should have been added to the queue no more
  2994                   NS_ASSERT (queueSize <= 2); //since it is not an A-MPDU then only 2 packets should have been added to the queue no more
  2911 
  3006 
  2912 void
  3007 void
  2913 MacLow::FlushAggregateQueue (void)
  3008 MacLow::FlushAggregateQueue (void)
  2914 {
  3009 {
  2915   if (m_aggregateQueue->GetSize () > 0)
  3010   if (m_aggregateQueue->GetSize () > 0)
  2916   {
  3011     {
  2917     NS_LOG_DEBUG("Flush aggregate queue");
  3012       NS_LOG_DEBUG ("Flush aggregate queue");
  2918     m_aggregateQueue->Flush ();
  3013       m_aggregateQueue->Flush ();
  2919   }
  3014     }
  2920   m_txPackets.clear ();
  3015   m_txPackets.clear ();
  2921 }
  3016 }
  2922 
  3017 
  2923 void
  3018 void
  2924 MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp)
  3019 MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp)
  2925 {
  3020 {
  2926   Item item;
  3021   Item item;
  2927   
  3022 
  2928   item.packet = packet;
  3023   item.packet = packet;
  2929   item.hdr = hdr;
  3024   item.hdr = hdr;
  2930   item.timestamp = tStamp;
  3025   item.timestamp = tStamp;
  2931 
  3026 
  2932   m_txPackets.push_back (item);
  3027   m_txPackets.push_back (item);
  2933 }
  3028 }
  2934 
  3029 
  2935 Ptr<Packet>
  3030 Ptr<Packet>
  2936 MacLow::PerformMsduAggregation(Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize)
  3031 MacLow::PerformMsduAggregation (Ptr<const Packet> packet, WifiMacHeader *hdr, Time *tstamp, Ptr<Packet> currentAmpduPacket, uint16_t blockAckSize)
  2937 {
  3032 {
  2938   bool msduAggregation = false;
  3033   bool msduAggregation = false;
  2939   bool isAmsdu = false;
  3034   bool isAmsdu = false;
  2940   Ptr<Packet> currentAmsduPacket = Create<Packet> ();
  3035   Ptr<Packet> currentAmsduPacket = Create<Packet> ();
  2941   Ptr<Packet> tempPacket = Create<Packet> ();
  3036   Ptr<Packet> tempPacket = Create<Packet> ();
  2942 
  3037 
  2943   Ptr<WifiMacQueue> queue;
  3038   Ptr<WifiMacQueue> queue;
  2944   AcIndex ac = QosUtilsMapTidToAc (GetTid (packet, *hdr));
  3039   AcIndex ac = QosUtilsMapTidToAc (GetTid (packet, *hdr));
  2945   std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
  3040   std::map<AcIndex, MacLowAggregationCapableTransmissionListener*>::const_iterator listenerIt = m_edcaListeners.find (ac);
  2946   NS_ASSERT (listenerIt != m_edcaListeners.end ());
  3041   NS_ASSERT (listenerIt != m_edcaListeners.end ());
  2947   queue = listenerIt->second->GetQueue();
  3042   queue = listenerIt->second->GetQueue ();
  2948     
  3043 
  2949   listenerIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket,
  3044   listenerIt->second->GetMsduAggregator ()->Aggregate (packet, currentAmsduPacket,
  2950                                                listenerIt->second->GetSrcAddressForAggregation (*hdr),
  3045                                                        listenerIt->second->GetSrcAddressForAggregation (*hdr),
  2951                                                listenerIt->second->GetDestAddressForAggregation (*hdr));
  3046                                                        listenerIt->second->GetDestAddressForAggregation (*hdr));
  2952 
  3047 
  2953   Ptr<const Packet> peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (),
  3048   Ptr<const Packet> peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (),
  2954                                                                WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
  3049                                                                WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
  2955   while (peekedPacket != 0)
  3050   while (peekedPacket != 0)
  2956   {
  3051     {
  2957     tempPacket = currentAmsduPacket;
  3052       tempPacket = currentAmsduPacket;
  2958    
  3053 
  2959     msduAggregation = listenerIt->second->GetMsduAggregator ()->Aggregate (peekedPacket, tempPacket,
  3054       msduAggregation = listenerIt->second->GetMsduAggregator ()->Aggregate (peekedPacket, tempPacket,
  2960                                                         listenerIt->second->GetSrcAddressForAggregation (*hdr),
  3055                                                                              listenerIt->second->GetSrcAddressForAggregation (*hdr),
  2961                                                         listenerIt->second->GetDestAddressForAggregation (*hdr));
  3056                                                                              listenerIt->second->GetDestAddressForAggregation (*hdr));
  2962       
  3057 
  2963     if (msduAggregation && !StopMpduAggregation (tempPacket, *hdr, currentAmpduPacket, blockAckSize))
  3058       if (msduAggregation && !StopMpduAggregation (tempPacket, *hdr, currentAmpduPacket, blockAckSize))
  2964     {
  3059         {
  2965       isAmsdu = true;
  3060           isAmsdu = true;
  2966       currentAmsduPacket = tempPacket;
  3061           currentAmsduPacket = tempPacket;
  2967       queue->Remove (peekedPacket);
  3062           queue->Remove (peekedPacket);
  2968     }
  3063         }
  2969     else
  3064       else
  2970     {
  3065         {
  2971       break;
  3066           break;
  2972     }
  3067         }
  2973     peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
  3068       peekedPacket = queue->PeekByTidAndAddress (hdr, hdr->GetQosTid (), WifiMacHeader::ADDR1, hdr->GetAddr1 (), tstamp);
  2974   }
  3069     }
  2975   
  3070 
  2976   if (isAmsdu)
  3071   if (isAmsdu)
  2977   {
  3072     {
  2978     NS_LOG_DEBUG ("A-MSDU with size = " << currentAmsduPacket->GetSize ());
  3073       NS_LOG_DEBUG ("A-MSDU with size = " << currentAmsduPacket->GetSize ());
  2979     hdr->SetQosAmsdu ();
  3074       hdr->SetQosAmsdu ();
  2980     hdr->SetAddr3 (GetBssid ());
  3075       hdr->SetAddr3 (GetBssid ());
  2981     return currentAmsduPacket;
  3076       return currentAmsduPacket;
  2982   }
  3077     }
  2983   else
  3078   else
  2984   {
  3079     {
  2985     return 0;
  3080       return 0;
  2986   }
  3081     }
  2987 }
  3082 }
  2988 
  3083 
  2989 } // namespace ns3
  3084 } //namespace ns3