View | Details | Raw Unified | Return to bug 2075
Collapse All | Expand All

(-)a/src/wifi/model/edca-txop-n.cc (-1 / +27 lines)
 Lines 646-654    Link Here 
646
      if (GetAmpduExist())
646
      if (GetAmpduExist())
647
        {
647
        {
648
          m_low->FlushAggregateQueue ();
648
          m_low->FlushAggregateQueue ();
649
          
650
          NS_LOG_DEBUG ("Transmit Block Ack Request");
651
          CtrlBAckRequestHeader reqHdr;
652
          reqHdr.SetType (COMPRESSED_BLOCK_ACK);
653
          uint8_t tid = m_currentHdr.GetQosTid ();
654
          reqHdr.SetStartingSequence (m_txMiddle->PeekNextSequenceNumberfor (&m_currentHdr));
655
          reqHdr.SetTidInfo (tid);
656
          reqHdr.SetHtImmediateAck(true);
657
          Ptr<Packet> bar = Create<Packet> ();
658
          bar->AddHeader (reqHdr);
659
          Bar request (bar, m_currentHdr.GetAddr1 (), tid, reqHdr.MustSendHtImmediateAck());
660
          m_currentBar = request;
661
          WifiMacHeader hdr;
662
          hdr.SetType (WIFI_MAC_CTL_BACKREQ);
663
          hdr.SetAddr1 (request.recipient);
664
          hdr.SetAddr2 (m_low->GetAddress ());
665
          hdr.SetAddr3 (m_low->GetBssid ());
666
          hdr.SetDsNotTo ();
667
          hdr.SetDsNotFrom ();
668
          hdr.SetNoRetry ();
669
          hdr.SetNoMoreFragments ();
670
          m_currentPacket = request.bar;
671
          m_currentHdr = hdr;
672
        }
673
      else
674
        {
675
          m_currentPacket = 0;
649
        }
676
        }
650
      // to reset the dcf.
677
      // to reset the dcf.
651
      m_currentPacket = 0;
652
      m_dcf->ResetCw ();
678
      m_dcf->ResetCw ();
653
    }
679
    }
654
  else
680
  else
(-)a/src/wifi/model/mac-low.cc (-1 / +45 lines)
 Lines 898-903    Link Here 
898
      m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
898
      m_stationManager->ReportDataOk (m_currentHdr.GetAddr1 (), &m_currentHdr,
899
                                      rxSnr, txMode, tag.Get ());
899
                                      rxSnr, txMode, tag.Get ());
900
        
900
        
901
      FlushAggregateQueue();
901
      bool gotAck = false;
902
      bool gotAck = false;
902
      if (m_txParams.MustWaitNormalAck ()
903
      if (m_txParams.MustWaitNormalAck ()
903
          && m_normalAckTimeoutEvent.IsRunning ())
904
          && m_normalAckTimeoutEvent.IsRunning ())
 Lines 935-940    Link Here 
935
      m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (),txMode);
936
      m_listener->GotBlockAck (&blockAck, hdr.GetAddr2 (),txMode);
936
      m_sentMpdus = 0;
937
      m_sentMpdus = 0;
937
      m_ampdu = false;
938
      m_ampdu = false;
939
      FlushAggregateQueue();
938
    }
940
    }
939
  else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self)
941
  else if (hdr.IsBlockAckReq () && hdr.GetAddr1 () == m_self)
940
    {
942
    {
 Lines 1560-1565    Link Here 
1560
  m_listener = 0;
1562
  m_listener = 0;
1561
  m_sentMpdus = 0;
1563
  m_sentMpdus = 0;
1562
  m_ampdu = false;
1564
  m_ampdu = false;
1565
  FlushAggregateQueue();
1563
  listener->MissedAck ();
1566
  listener->MissedAck ();
1564
}
1567
}
1565
void
1568
void
 Lines 1590-1595    Link Here 
1590
  m_listener = 0;
1593
  m_listener = 0;
1591
  m_sentMpdus = 0;
1594
  m_sentMpdus = 0;
1592
  m_ampdu = false;
1595
  m_ampdu = false;
1596
  FlushAggregateQueue();
1593
  listener->MissedBlockAck ();
1597
  listener->MissedBlockAck ();
1594
}
1598
}
1595
void
1599
void
 Lines 1976-1981    Link Here 
1976
  NS_ASSERT (m_currentPacket != 0);
1980
  NS_ASSERT (m_currentPacket != 0);
1977
  WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
1981
  WifiTxVector dataTxVector = GetDataTxVector (m_currentPacket, &m_currentHdr);
1978
  
1982
  
1983
  if (m_aggregateQueue->GetSize () != 0)
1984
  {
1985
    for(int i = 0; i < m_txPackets.size(); i++)
1986
    {
1987
      uint8_t tid = GetTid (m_txPackets.at(i).packet, m_txPackets.at(i).hdr);
1988
      AcIndex ac = QosUtilsMapTidToAc (tid);
1989
      std::map<AcIndex, MacLowBlockAckEventListener*>::const_iterator listenerIt= m_edcaListeners.find(ac);
1990
      
1991
      listenerIt->second->CompleteMpduTx (m_txPackets.at(i).packet, m_txPackets.at(i).hdr, m_txPackets.at(i).timestamp);
1992
    }
1993
    m_txPackets.clear ();
1994
  }
1995
  
1979
  WifiPreamble preamble;       
1996
  WifiPreamble preamble;       
1980
  if (m_phy->GetGreenfield() && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1997
  if (m_phy->GetGreenfield() && m_stationManager->GetGreenfieldSupported (m_currentHdr.GetAddr1 ()))
1981
     //In the future has to make sure that receiver has greenfield enabled
1998
     //In the future has to make sure that receiver has greenfield enabled
 Lines 2719-2731    Link Here 
2719
                      m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
2736
                      m_aggregateQueue->Enqueue (aggPacket, peekedHdr);
2720
                      if (i == 1 && hdr.IsQosData ())
2737
                      if (i == 1 && hdr.IsQosData ())
2721
                      {
2738
                      {
2739
                        if (!m_txParams.MustSendRts ())
2740
                        {
2722
                          listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
2741
                          listenerIt->second->CompleteMpduTx (packet, hdr, tstamp);
2742
                        }
2743
                        else
2744
                        {
2745
                          InsertInTxQueue (packet, hdr, tstamp);
2746
                        }
2723
                      }
2747
                      }
2724
                      NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU");
2748
                      NS_LOG_DEBUG ("Adding packet with Sequence number " << peekedHdr.GetSequenceNumber()<<" to A-MPDU");
2725
                      i++;
2749
                      i++;
2726
                      isAmpdu = true;
2750
                      isAmpdu = true;
2727
                      m_sentMpdus++;
2751
                      m_sentMpdus++;
2728
                      listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
2752
                      if (!m_txParams.MustSendRts ())
2753
                      {
2754
                        listenerIt->second->CompleteMpduTx (peekedPacket, peekedHdr, tstamp);
2755
                      }
2756
                      else
2757
                      {
2758
                        InsertInTxQueue (peekedPacket, peekedHdr, tstamp);
2759
                      }
2729
                      if (retry)
2760
                      if (retry)
2730
                          listenerIt->second->RemoveFromBaQueue(tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
2761
                          listenerIt->second->RemoveFromBaQueue(tid, hdr.GetAddr1 (), peekedHdr.GetSequenceNumber ());
2731
                      else
2762
                      else
 Lines 2811-2816    Link Here 
2811
{
2842
{
2812
  NS_LOG_DEBUG("Flush aggregate queue");
2843
  NS_LOG_DEBUG("Flush aggregate queue");
2813
  m_aggregateQueue->Flush ();
2844
  m_aggregateQueue->Flush ();
2845
  m_txPackets.clear ();
2846
}
2847
2848
void
2849
MacLow::InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp)
2850
{
2851
  Item item;
2852
  
2853
  item.packet = packet;
2854
  item.hdr = hdr;
2855
  item.timestamp = tStamp;
2856
2857
  m_txPackets.push_back (item);
2814
}
2858
}
2815
2859
2816
} // namespace ns3
2860
} // namespace ns3
(-)a/src/wifi/model/mac-low.h (+17 lines)
 Lines 1242-1251    Link Here 
1242
   *
1242
   *
1243
   */
1243
   */
1244
  bool IsAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr);
1244
  bool IsAmpdu (Ptr<const Packet> packet, const WifiMacHeader hdr);
1245
  /**
1246
   * Insert in a temporary queue.
1247
   * It is only used with a RTS/CTS exchange for an A-MPDU transmission.
1248
   */
1249
  void InsertInTxQueue (Ptr<const Packet> packet, const WifiMacHeader &hdr, Time tStamp);
1245
1250
1246
  Ptr<WifiPhy> m_phy; //!< Pointer to WifiPhy (actually send/receives frames)
1251
  Ptr<WifiPhy> m_phy; //!< Pointer to WifiPhy (actually send/receives frames)
1247
  Ptr<WifiRemoteStationManager> m_stationManager; //!< Pointer to WifiRemoteStationManager (rate control)
1252
  Ptr<WifiRemoteStationManager> m_stationManager; //!< Pointer to WifiRemoteStationManager (rate control)
1248
  MacLowRxCallback m_rxCallback; //!< Callback to pass packet up
1253
  MacLowRxCallback m_rxCallback; //!< Callback to pass packet up
1254
  
1255
  /**
1256
   * A struct for packet, Wifi header, and timestamp.
1257
   */
1258
  typedef struct
1259
  {
1260
    Ptr<const Packet> packet;
1261
    WifiMacHeader hdr;
1262
    Time timestamp;
1263
  } Item;
1264
  
1249
  /**
1265
  /**
1250
   * typedef for an iterator for a list of MacLowDcfListener.
1266
   * typedef for an iterator for a list of MacLowDcfListener.
1251
   */
1267
   */
 Lines 1320-1325    Link Here 
1320
  Ptr<WifiMacQueue> m_aggregateQueue; //!< Queue used for MPDU aggregation
1336
  Ptr<WifiMacQueue> m_aggregateQueue; //!< Queue used for MPDU aggregation
1321
  WifiMode m_currentMode;             //!< mode used for the current packet transmission
1337
  WifiMode m_currentMode;             //!< mode used for the current packet transmission
1322
  bool m_receivedAtLeastOneMpdu;      //!< Flag whether an MPDU has already been successfully received while receiving an A-MPDU
1338
  bool m_receivedAtLeastOneMpdu;      //!< Flag whether an MPDU has already been successfully received while receiving an A-MPDU
1339
  std::vector<Item> m_txPackets;      //!< Contain temporary items to be sent with the next A-MPDU transmission, once RTS/CTS exchange has succeeded. It is not used in other cases.
1323
};
1340
};
1324
1341
1325
} // namespace ns3
1342
} // namespace ns3

Return to bug 2075