diff --git a/src/devices/wifi/arf-mac-stations.cc b/src/devices/wifi/arf-mac-stations.cc index a8c913931..3802cee9a 100644 --- a/src/devices/wifi/arf-mac-stations.cc +++ b/src/devices/wifi/arf-mac-stations.cc @@ -165,12 +165,12 @@ void ArfMacStation::ReportDataOk (double ackSnr, WifiMode ackMode, double dataSn } } WifiMode -ArfMacStation::GetDataMode (uint32_t size) +ArfMacStation::DoGetDataMode (uint32_t size) { return GetSupportedMode (m_rate); } WifiMode -ArfMacStation::GetRtsMode (void) +ArfMacStation::DoGetRtsMode (void) { // XXX: we could/should implement the Arf algorithm for // RTS only by picking a single rate within the BasicRateSet. diff --git a/src/devices/wifi/arf-mac-stations.h b/src/devices/wifi/arf-mac-stations.h index 8325a1138..52987dcdc 100644 --- a/src/devices/wifi/arf-mac-stations.h +++ b/src/devices/wifi/arf-mac-stations.h @@ -63,11 +63,11 @@ public: virtual void ReportDataFailed (void); virtual void ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr); virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr); - virtual WifiMode GetDataMode (uint32_t size); - virtual WifiMode GetRtsMode (void); private: virtual ArfMacStations *GetStations (void) const; + virtual WifiMode DoGetDataMode (uint32_t size); + virtual WifiMode DoGetRtsMode (void); uint32_t m_timer; uint32_t m_success; diff --git a/src/devices/wifi/cr-mac-stations.cc b/src/devices/wifi/cr-mac-stations.cc index 36b14d542..41c60d6a5 100644 --- a/src/devices/wifi/cr-mac-stations.cc +++ b/src/devices/wifi/cr-mac-stations.cc @@ -47,12 +47,12 @@ void CrMacStation::ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) {} WifiMode -CrMacStation::GetDataMode (uint32_t size) +CrMacStation::DoGetDataMode (uint32_t size) { return m_stations->GetDataMode (); } WifiMode -CrMacStation::GetRtsMode (void) +CrMacStation::DoGetRtsMode (void) { return m_stations->GetCtlMode (); } diff --git a/src/devices/wifi/cr-mac-stations.h b/src/devices/wifi/cr-mac-stations.h index 9337d8bbe..501593fd0 100644 --- a/src/devices/wifi/cr-mac-stations.h +++ b/src/devices/wifi/cr-mac-stations.h @@ -54,18 +54,15 @@ public: CrMacStation (CrMacStations *stations); virtual ~CrMacStation (); - WifiMode GetDataMode (void) const; - WifiMode GetCtlMode (void) const; - virtual void ReportRxOk (double rxSnr, WifiMode txMode); virtual void ReportRtsFailed (void); virtual void ReportDataFailed (void); virtual void ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr); virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr); - virtual WifiMode GetDataMode (uint32_t size); - virtual WifiMode GetRtsMode (void); private: virtual CrMacStations *GetStations (void) const; + virtual WifiMode DoGetDataMode (uint32_t size); + virtual WifiMode DoGetRtsMode (void); CrMacStations *m_stations; }; diff --git a/src/devices/wifi/dca-txop.cc b/src/devices/wifi/dca-txop.cc index 0bffb0c35..bf3fc6341 100644 --- a/src/devices/wifi/dca-txop.cc +++ b/src/devices/wifi/dca-txop.cc @@ -31,6 +31,8 @@ #include "mac-low.h" #include "wifi-mac-queue.h" #include "mac-tx-middle.h" +#include "wifi-mac-trailer.h" +#include "mac-stations.h" #include "wifi-phy.h" #include "random-stream.h" @@ -132,6 +134,11 @@ DcaTxop::SetParameters (MacParameters *parameters) { m_parameters = parameters; } +void +DcaTxop::SetStations (MacStations *stations) +{ + m_stations = stations; +} void DcaTxop::SetTxMiddle (MacTxMiddle *txMiddle) { @@ -162,6 +169,10 @@ DcaTxop::SetMaxQueueDelay (Time delay) void DcaTxop::Queue (Ptr packet, WifiMacHeader const &hdr) { + WifiMacTrailer fcs; + uint32_t fullPacketSize = hdr.GetSerializedSize () + packet->GetSize () + fcs.GetSerializedSize (); + MacStation *station = m_stations->Lookup (hdr.GetAddr1 ()); + station->PrepareForQueue (packet, fullPacketSize); m_queue->Enqueue (packet, hdr); StartAccessIfNeeded (); } diff --git a/src/devices/wifi/dca-txop.h b/src/devices/wifi/dca-txop.h index 066dc95fa..4b94b7936 100644 --- a/src/devices/wifi/dca-txop.h +++ b/src/devices/wifi/dca-txop.h @@ -38,6 +38,7 @@ class MacLow; class MacParameters; class MacTxMiddle; class RandomStream; +class MacStations; /** * \brief handle packet fragmentation and retransmissions. @@ -80,6 +81,7 @@ public: void SetLow (MacLow *low); void SetParameters (MacParameters *parameters); + void SetStations (MacStations *stations); void SetTxMiddle (MacTxMiddle *txMiddle); /** * \param callback the callback to invoke when a @@ -147,6 +149,7 @@ private: WifiMacQueue *m_queue; MacTxMiddle *m_txMiddle; MacLow *m_low; + MacStations *m_stations; MacParameters *m_parameters; TransmissionListener *m_transmissionListener; RandomStream *m_rng; diff --git a/src/devices/wifi/ideal-mac-stations.cc b/src/devices/wifi/ideal-mac-stations.cc index e0d50b12e..8a6244575 100644 --- a/src/devices/wifi/ideal-mac-stations.cc +++ b/src/devices/wifi/ideal-mac-stations.cc @@ -94,7 +94,7 @@ IdealMacStation::ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) m_lastSnr = dataSnr; } WifiMode -IdealMacStation::GetDataMode (uint32_t size) +IdealMacStation::DoGetDataMode (uint32_t size) { // We search within the Supported rate set the mode with the // highest snr threshold possible which is smaller than m_lastSnr @@ -115,7 +115,7 @@ IdealMacStation::GetDataMode (uint32_t size) return maxMode; } WifiMode -IdealMacStation::GetRtsMode (void) +IdealMacStation::DoGetRtsMode (void) { // We search within the Basic rate set the mode with the highest // snr threshold possible which is smaller than m_lastSnr to diff --git a/src/devices/wifi/ideal-mac-stations.h b/src/devices/wifi/ideal-mac-stations.h index e0deb8dce..52f2eca5b 100644 --- a/src/devices/wifi/ideal-mac-stations.h +++ b/src/devices/wifi/ideal-mac-stations.h @@ -72,11 +72,12 @@ public: virtual void ReportDataFailed (void); virtual void ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr); virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr); - virtual WifiMode GetDataMode (uint32_t size); - virtual WifiMode GetRtsMode (void); private: virtual IdealMacStations *GetStations (void) const; + virtual WifiMode DoGetDataMode (uint32_t size); + virtual WifiMode DoGetRtsMode (void); + IdealMacStations *m_stations; double m_lastSnr; }; diff --git a/src/devices/wifi/mac-low.cc b/src/devices/wifi/mac-low.cc index f6b23f20f..50c1d5d61 100644 --- a/src/devices/wifi/mac-low.cc +++ b/src/devices/wifi/mac-low.cc @@ -366,7 +366,8 @@ MacLow::StartTransmission (Ptr packet, //NS_ASSERT (m_phy->IsStateIdle ()); - MY_DEBUG ("startTx size="<< GetCurrentSize () << ", to=" << m_currentHdr.GetAddr1()<<", listener="<GetBasicMode (0); NS_LOG_DEBUG ("non-unicast size="< packet, uint32_t fullPacketSize); + WifiMode GetDataMode (Ptr packet, uint32_t fullPacketSize); + WifiMode GetRtsMode (Ptr packet); + // reception-related method virtual void ReportRxOk (double rxSnr, WifiMode txMode) = 0; @@ -102,8 +110,6 @@ public: virtual void ReportDataFailed (void) = 0; virtual void ReportRtsOk (double ctsSnr, WifiMode ctsMode, double rtsSnr) = 0; virtual void ReportDataOk (double ackSnr, WifiMode ackMode, double dataSnr) = 0; - virtual WifiMode GetDataMode (uint32_t size) = 0; - virtual WifiMode GetRtsMode (void) = 0; WifiMode GetCtsMode (WifiMode rtsMode); WifiMode GetAckMode (WifiMode dataMode); @@ -111,6 +117,8 @@ public: private: typedef std::vector SupportedModes; virtual MacStations *GetStations (void) const = 0; + virtual WifiMode DoGetDataMode (uint32_t size) = 0; + virtual WifiMode DoGetRtsMode (void) = 0; protected: uint32_t GetNSupportedModes (void) const; WifiMode GetSupportedMode (uint32_t i) const; diff --git a/src/devices/wifi/wifi-default-parameters.cc b/src/devices/wifi/wifi-default-parameters.cc index e5ee38090..4752e5a09 100644 --- a/src/devices/wifi/wifi-default-parameters.cc +++ b/src/devices/wifi/wifi-default-parameters.cc @@ -161,7 +161,10 @@ static NumericDefaultValue g_idealBer ("WifiIdealRateControlBerThreshold", "The maximum Bit Error Rate acceptable at any transmission mode", 10e-6); - +static BooleanDefaultValue g_isLowLatency +("WifiMacPhyIsLowLatency", + "Is the communication latency between the MAC and PHY low ?", + true); uint32_t @@ -294,7 +297,11 @@ GetSsid (void) { return Ssid (g_ssid.GetValue ().c_str ()); } - +bool +GetIsLowLatency (void) +{ + return g_isLowLatency.GetValue (); +} } // namespace WifiDefaultParameters diff --git a/src/devices/wifi/wifi-default-parameters.h b/src/devices/wifi/wifi-default-parameters.h index 407432ddd..33c7d0e1f 100644 --- a/src/devices/wifi/wifi-default-parameters.h +++ b/src/devices/wifi/wifi-default-parameters.h @@ -75,6 +75,8 @@ double GetPhyRxGainDb (void); Ssid GetSsid (void); +bool GetIsLowLatency (void); + } // namespace WifiDefaultParameters } // namespace ns3 diff --git a/src/devices/wifi/wifi-net-device.cc b/src/devices/wifi/wifi-net-device.cc index ce8df3abf..62098d538 100644 --- a/src/devices/wifi/wifi-net-device.cc +++ b/src/devices/wifi/wifi-net-device.cc @@ -264,6 +264,7 @@ WifiNetDevice::CreateDca (uint32_t minCw, uint32_t maxCw, uint32_t aifsn) const dca->SetParameters (m_parameters); dca->SetTxMiddle (m_txMiddle); dca->SetLow (m_low); + dca->SetStations (m_stations); dca->SetMaxQueueSize (400); dca->SetMaxQueueDelay (Seconds (10)); return dca;