From d365379e455f3f7e4b0b6a62cc8aefde0eb399a8 Mon Sep 17 00:00:00 2001 From: Mathieu Lacage Date: Fri, 14 Aug 2009 12:21:39 +0200 Subject: [PATCH] bug 641: CwMin setting for 802.11b --- bindings/python/ns3_module_helper.py | 12 +-- bindings/python/ns3_module_wifi.py | 53 ++++++++++-- src/devices/wifi/adhoc-wifi-mac.cc | 32 +++++-- src/devices/wifi/adhoc-wifi-mac.h | 2 +- src/devices/wifi/dca-txop.cc | 15 ---- src/devices/wifi/dca-txop.h | 15 ++-- src/devices/wifi/edca-txop-n.cc | 15 ---- src/devices/wifi/edca-txop-n.h | 15 ++-- src/devices/wifi/nqap-wifi-mac.cc | 37 ++++++-- src/devices/wifi/nqap-wifi-mac.h | 2 +- src/devices/wifi/nqsta-wifi-mac.cc | 37 ++++++-- src/devices/wifi/nqsta-wifi-mac.h | 2 +- src/devices/wifi/qadhoc-wifi-mac.cc | 108 ++++++++++++------------ src/devices/wifi/qadhoc-wifi-mac.h | 8 +- src/devices/wifi/qap-wifi-mac.cc | 122 ++++++++++++--------------- src/devices/wifi/qap-wifi-mac.h | 22 ++--- src/devices/wifi/qos-utils.h | 1 + src/devices/wifi/qsta-wifi-mac.cc | 103 +++++++++++----------- src/devices/wifi/qsta-wifi-mac.h | 18 +--- src/devices/wifi/wifi-mac.cc | 50 ++++++++--- src/devices/wifi/wifi-mac.h | 17 +++- src/devices/wifi/wifi-phy.h | 2 + src/devices/wifi/wifi-test.cc | 4 +- src/devices/wifi/wscript | 5 +- src/devices/wifi/yans-wifi-phy.cc | 12 +-- src/devices/wifi/yans-wifi-phy.h | 3 +- src/helper/nqos-wifi-mac-helper.cc | 18 +--- src/helper/nqos-wifi-mac-helper.h | 15 ---- src/helper/qos-wifi-mac-helper.cc | 112 +++++------------------- src/helper/qos-wifi-mac-helper.h | 20 +---- src/helper/wifi-helper.cc | 9 ++ src/helper/wifi-helper.h | 4 + 32 files changed, 419 insertions(+), 471 deletions(-) diff --git a/bindings/python/ns3_module_helper.py b/bindings/python/ns3_module_helper.py index 7da39dd99..eed28c7a9 100644 --- a/bindings/python/ns3_module_helper.py +++ b/bindings/python/ns3_module_helper.py @@ -1121,6 +1121,10 @@ def register_Ns3WifiHelper_methods(root_module, cls): 'ns3::NetDeviceContainer', [param('ns3::WifiPhyHelper const &', 'phy'), param('ns3::WifiMacHelper const &', 'mac'), param('std::string', 'nodeName')], is_const=True) + ## wifi-helper.h: void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('SetStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')]) ## wifi-helper.h: static void ns3::WifiHelper::EnableLogComponents() [member function] cls.add_method('EnableLogComponents', 'void', @@ -1310,10 +1314,6 @@ def register_Ns3NqosWifiMacHelper_methods(root_module, cls): cls.add_method('SetType', 'void', [param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n4', default_value='""'), param('ns3::AttributeValue const &', 'v4', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n5', default_value='""'), param('ns3::AttributeValue const &', 'v5', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n6', default_value='""'), param('ns3::AttributeValue const &', 'v6', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n7', default_value='""'), param('ns3::AttributeValue const &', 'v7', default_value='ns3::EmptyAttributeValue()')]) - ## nqos-wifi-mac-helper.h: void ns3::NqosWifiMacHelper::SetDcaParameters(std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue()) [member function] - cls.add_method('SetDcaParameters', - 'void', - [param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()')]) ## nqos-wifi-mac-helper.h: ns3::Ptr ns3::NqosWifiMacHelper::Create() const [member function] cls.add_method('Create', 'ns3::Ptr< ns3::WifiMac >', @@ -1339,10 +1339,6 @@ def register_Ns3QosWifiMacHelper_methods(root_module, cls): cls.add_method('SetMsduAggregatorForAc', 'void', [param('ns3::AccessClass', 'accessClass'), param('std::string', 'type'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()')]) - ## qos-wifi-mac-helper.h: void ns3::QosWifiMacHelper::SetEdcaParametersForAc(ns3::AccessClass accessClass, std::string n0="", ns3::AttributeValue const & v0=ns3::EmptyAttributeValue(), std::string n1="", ns3::AttributeValue const & v1=ns3::EmptyAttributeValue(), std::string n2="", ns3::AttributeValue const & v2=ns3::EmptyAttributeValue(), std::string n3="", ns3::AttributeValue const & v3=ns3::EmptyAttributeValue()) [member function] - cls.add_method('SetEdcaParametersForAc', - 'void', - [param('ns3::AccessClass', 'accessClass'), param('std::string', 'n0', default_value='""'), param('ns3::AttributeValue const &', 'v0', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n1', default_value='""'), param('ns3::AttributeValue const &', 'v1', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n2', default_value='""'), param('ns3::AttributeValue const &', 'v2', default_value='ns3::EmptyAttributeValue()'), param('std::string', 'n3', default_value='""'), param('ns3::AttributeValue const &', 'v3', default_value='ns3::EmptyAttributeValue()')]) ## qos-wifi-mac-helper.h: ns3::Ptr ns3::QosWifiMacHelper::Create() const [member function] cls.add_method('Create', 'ns3::Ptr< ns3::WifiMac >', diff --git a/bindings/python/ns3_module_wifi.py b/bindings/python/ns3_module_wifi.py index dc44fbdc1..06aa9f6e5 100644 --- a/bindings/python/ns3_module_wifi.py +++ b/bindings/python/ns3_module_wifi.py @@ -2286,10 +2286,15 @@ def register_Ns3WifiMac_methods(root_module, cls): cls.add_method('NotifyRxDrop', 'void', [param('ns3::Ptr< ns3::Packet const >', 'packet')]) - ## wifi-mac.h: void ns3::WifiMac::SetStandard(ns3::WifiPhyStandard standard) [member function] - cls.add_method('SetStandard', + ## wifi-mac.h: void ns3::WifiMac::ConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('ConfigureStandard', 'void', [param('ns3::WifiPhyStandard', 'standard')]) + ## wifi-mac.h: void ns3::WifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('FinishConfigureStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')], + is_pure_virtual=True, visibility='private', is_virtual=True) return def register_Ns3WifiMacHeader_methods(root_module, cls): @@ -2836,6 +2841,11 @@ def register_Ns3WifiPhy_methods(root_module, cls): 'uint16_t', [], is_pure_virtual=True, is_const=True, is_virtual=True) + ## wifi-phy.h: void ns3::WifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('ConfigureStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')], + is_pure_virtual=True, is_virtual=True) ## wifi-phy.h: ns3::Ptr ns3::WifiPhy::GetChannel() const [member function] cls.add_method('GetChannel', 'ns3::Ptr< ns3::WifiChannel >', @@ -3160,10 +3170,6 @@ def register_Ns3YansWifiPhy_methods(root_module, cls): cls.add_method('StartReceivePacket', 'void', [param('ns3::Ptr< ns3::Packet >', 'packet'), param('double', 'rxPowerDbm'), param('ns3::WifiMode', 'mode'), param('ns3::WifiPreamble', 'preamble')]) - ## yans-wifi-phy.h: void ns3::YansWifiPhy::SetStandard(ns3::WifiPhyStandard standard) [member function] - cls.add_method('SetStandard', - 'void', - [param('ns3::WifiPhyStandard', 'standard')]) ## yans-wifi-phy.h: void ns3::YansWifiPhy::SetRxNoiseFigure(double noiseFigureDb) [member function] cls.add_method('SetRxNoiseFigure', 'void', @@ -3347,6 +3353,11 @@ def register_Ns3YansWifiPhy_methods(root_module, cls): 'ns3::Ptr< ns3::WifiChannel >', [], is_const=True, is_virtual=True) + ## yans-wifi-phy.h: void ns3::YansWifiPhy::ConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('ConfigureStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')], + is_virtual=True) ## yans-wifi-phy.h: void ns3::YansWifiPhy::DoDispose() [member function] cls.add_method('DoDispose', 'void', @@ -3514,6 +3525,11 @@ def register_Ns3AdhocWifiMac_methods(root_module, cls): 'void', [], visibility='private', is_virtual=True) + ## adhoc-wifi-mac.h: void ns3::AdhocWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('FinishConfigureStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')], + visibility='private', is_virtual=True) return def register_Ns3AmrrWifiManager_methods(root_module, cls): @@ -4450,6 +4466,11 @@ def register_Ns3NqapWifiMac_methods(root_module, cls): 'void', [], visibility='private', is_virtual=True) + ## nqap-wifi-mac.h: void ns3::NqapWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('FinishConfigureStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')], + visibility='private', is_virtual=True) return def register_Ns3NqstaWifiMac_methods(root_module, cls): @@ -4606,6 +4627,11 @@ def register_Ns3NqstaWifiMac_methods(root_module, cls): 'void', [], visibility='private', is_virtual=True) + ## nqsta-wifi-mac.h: void ns3::NqstaWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('FinishConfigureStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')], + visibility='private', is_virtual=True) return def register_Ns3OnoeWifiManager_methods(root_module, cls): @@ -4763,6 +4789,11 @@ def register_Ns3QadhocWifiMac_methods(root_module, cls): 'void', [], visibility='private', is_virtual=True) + ## qadhoc-wifi-mac.h: void ns3::QadhocWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('FinishConfigureStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')], + visibility='private', is_virtual=True) return def register_Ns3QapWifiMac_methods(root_module, cls): @@ -4916,6 +4947,11 @@ def register_Ns3QapWifiMac_methods(root_module, cls): 'void', [], visibility='private', is_virtual=True) + ## qap-wifi-mac.h: void ns3::QapWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('FinishConfigureStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')], + visibility='private', is_virtual=True) return def register_Ns3QstaWifiMac_methods(root_module, cls): @@ -5072,6 +5108,11 @@ def register_Ns3QstaWifiMac_methods(root_module, cls): 'void', [], visibility='private', is_virtual=True) + ## qsta-wifi-mac.h: void ns3::QstaWifiMac::FinishConfigureStandard(ns3::WifiPhyStandard standard) [member function] + cls.add_method('FinishConfigureStandard', + 'void', + [param('ns3::WifiPhyStandard', 'standard')], + visibility='private', is_virtual=True) return def register_Ns3RraaWifiManager_methods(root_module, cls): diff --git a/src/devices/wifi/adhoc-wifi-mac.cc b/src/devices/wifi/adhoc-wifi-mac.cc index 2baceceff..3c11aa718 100644 --- a/src/devices/wifi/adhoc-wifi-mac.cc +++ b/src/devices/wifi/adhoc-wifi-mac.cc @@ -46,8 +46,7 @@ AdhocWifiMac::GetTypeId (void) .AddConstructor () .AddAttribute ("DcaTxop", "The DcaTxop object", PointerValue (), - MakePointerAccessor (&AdhocWifiMac::GetDcaTxop, - &AdhocWifiMac::SetDcaTxop), + MakePointerAccessor (&AdhocWifiMac::GetDcaTxop), MakePointerChecker ()) ; return tid; @@ -64,6 +63,10 @@ AdhocWifiMac::AdhocWifiMac () m_dcfManager = new DcfManager (); m_dcfManager->SetupLowListener (m_low); + + m_dca = CreateObject (); + m_dca->SetLow (m_low); + m_dca->SetManager (m_dcfManager); } AdhocWifiMac::~AdhocWifiMac () {} @@ -251,12 +254,27 @@ AdhocWifiMac::GetDcaTxop(void) const return m_dca; } -void -AdhocWifiMac::SetDcaTxop (Ptr dcaTxop) +void +AdhocWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard) { - m_dca = dcaTxop; - m_dca->SetLow (m_low); - m_dca->SetManager (m_dcfManager); + switch (standard) + { + case WIFI_PHY_STANDARD_holland: + // fall through + case WIFI_PHY_STANDARD_80211_10Mhz: + // fall through + case WIFI_PHY_STANDARD_80211_5Mhz: + // fall through + case WIFI_PHY_STANDARD_80211a: + ConfigureDcf (m_dca, 15, 1023, AC_BE_NQOS); + break; + case WIFI_PHY_STANDARD_80211b: + ConfigureDcf (m_dca, 31, 1023, AC_BE_NQOS); + break; + default: + NS_ASSERT (false); + break; + } } diff --git a/src/devices/wifi/adhoc-wifi-mac.h b/src/devices/wifi/adhoc-wifi-mac.h index 3c56182c1..21bd2d8f2 100644 --- a/src/devices/wifi/adhoc-wifi-mac.h +++ b/src/devices/wifi/adhoc-wifi-mac.h @@ -87,7 +87,7 @@ private: AdhocWifiMac (const AdhocWifiMac & ctor_arg); AdhocWifiMac &operator = (const AdhocWifiMac &o); Ptr GetDcaTxop(void) const; - void SetDcaTxop (Ptr dcaTxop); + virtual void FinishConfigureStandard (enum WifiPhyStandard standard); Ptr m_dca; Callback, Mac48Address, Mac48Address> m_upCallback; diff --git a/src/devices/wifi/dca-txop.cc b/src/devices/wifi/dca-txop.cc index 0aff87242..6b4a64f43 100644 --- a/src/devices/wifi/dca-txop.cc +++ b/src/devices/wifi/dca-txop.cc @@ -101,21 +101,6 @@ DcaTxop::GetTypeId (void) static TypeId tid = TypeId ("ns3::DcaTxop") .SetParent () .AddConstructor () - .AddAttribute ("MinCw", "The minimum value of the contention window.", - UintegerValue (15), - MakeUintegerAccessor (&DcaTxop::SetMinCw, - &DcaTxop::GetMinCw), - MakeUintegerChecker ()) - .AddAttribute ("MaxCw", "The maximum value of the contention window.", - UintegerValue (1023), - MakeUintegerAccessor (&DcaTxop::SetMaxCw, - &DcaTxop::GetMaxCw), - MakeUintegerChecker ()) - .AddAttribute ("Aifsn", "The AIFSN: the default value conforms to simple DCA.", - UintegerValue (2), - MakeUintegerAccessor (&DcaTxop::SetAifsn, - &DcaTxop::GetAifsn), - MakeUintegerChecker ()) ; return tid; } diff --git a/src/devices/wifi/dca-txop.h b/src/devices/wifi/dca-txop.h index 7c4e2bb91..4fd697230 100644 --- a/src/devices/wifi/dca-txop.h +++ b/src/devices/wifi/dca-txop.h @@ -29,6 +29,7 @@ #include "wifi-mac-header.h" #include "wifi-mode.h" #include "wifi-remote-station-manager.h" +#include "dcf.h" namespace ns3 { @@ -62,7 +63,7 @@ class MacStations; * The rts/cts policy is similar to the fragmentation policy: when * a packet is bigger than a threshold, the rts/cts protocol is used. */ -class DcaTxop : public Object +class DcaTxop : public Dcf { public: static TypeId GetTypeId (void); @@ -90,12 +91,12 @@ public: void SetMaxQueueSize (uint32_t size); void SetMaxQueueDelay (Time delay); - void SetMinCw (uint32_t minCw); - void SetMaxCw (uint32_t maxCw); - void SetAifsn (uint32_t aifsn); - uint32_t GetMinCw (void) const; - uint32_t GetMaxCw (void) const; - uint32_t GetAifsn (void) const; + virtual void SetMinCw (uint32_t minCw); + virtual void SetMaxCw (uint32_t maxCw); + virtual void SetAifsn (uint32_t aifsn); + virtual uint32_t GetMinCw (void) const; + virtual uint32_t GetMaxCw (void) const; + virtual uint32_t GetAifsn (void) const; /** * \param packet packet to send diff --git a/src/devices/wifi/edca-txop-n.cc b/src/devices/wifi/edca-txop-n.cc index 5c751ecef..2fb1ada8b 100644 --- a/src/devices/wifi/edca-txop-n.cc +++ b/src/devices/wifi/edca-txop-n.cc @@ -98,21 +98,6 @@ EdcaTxopN::GetTypeId (void) static TypeId tid = TypeId ("ns3::EdcaTxopN") .SetParent () .AddConstructor () - .AddAttribute ("MinCw", "The minimun value of the contention window.", - UintegerValue (31), - MakeUintegerAccessor (&EdcaTxopN::SetMinCw, - &EdcaTxopN::GetMinCw), - MakeUintegerChecker ()) - .AddAttribute ("MaxCw", "The maximum value of the contention window.", - UintegerValue (1023), - MakeUintegerAccessor (&EdcaTxopN::SetMaxCw, - &EdcaTxopN::GetMaxCw), - MakeUintegerChecker ()) - .AddAttribute ("Aifsn", "The AIFSN: the default value conforms to simple DCA.", - UintegerValue (3), - MakeUintegerAccessor (&EdcaTxopN::SetAifsn, - &EdcaTxopN::GetAifsn), - MakeUintegerChecker ()) ; return tid; } diff --git a/src/devices/wifi/edca-txop-n.h b/src/devices/wifi/edca-txop-n.h index a89b5292d..216c77bb1 100644 --- a/src/devices/wifi/edca-txop-n.h +++ b/src/devices/wifi/edca-txop-n.h @@ -30,6 +30,7 @@ #include "wifi-mac.h" #include "wifi-mac-header.h" #include "qos-utils.h" +#include "dcf.h" #include #include @@ -62,7 +63,7 @@ enum TypeOfStation ADHOC_STA }; -class EdcaTxopN : public Object +class EdcaTxopN : public Dcf { public: @@ -85,12 +86,12 @@ public: void SetMaxQueueSize (uint32_t size); void SetMaxQueueDelay (Time delay); - void SetMinCw (uint32_t minCw); - void SetMaxCw (uint32_t maxCw); - void SetAifsn (uint32_t aifsn); - uint32_t GetMinCw (void) const; - uint32_t GetMaxCw (void) const; - uint32_t GetAifsn (void) const; + virtual void SetMinCw (uint32_t minCw); + virtual void SetMaxCw (uint32_t maxCw); + virtual void SetAifsn (uint32_t aifsn); + virtual uint32_t GetMinCw (void) const; + virtual uint32_t GetMaxCw (void) const; + virtual uint32_t GetAifsn (void) const; Ptr Low (void); Ptr GetMsduAggregator (void) const; diff --git a/src/devices/wifi/nqap-wifi-mac.cc b/src/devices/wifi/nqap-wifi-mac.cc index 4b9c8ce0b..07e5ec7b1 100644 --- a/src/devices/wifi/nqap-wifi-mac.cc +++ b/src/devices/wifi/nqap-wifi-mac.cc @@ -60,8 +60,7 @@ NqapWifiMac::GetTypeId (void) MakeBooleanChecker ()) .AddAttribute ("DcaTxop", "The DcaTxop object", PointerValue (), - MakePointerAccessor (&NqapWifiMac::GetDcaTxop, - &NqapWifiMac::SetDcaTxop), + MakePointerAccessor (&NqapWifiMac::GetDcaTxop), MakePointerChecker ()) ; return tid; @@ -85,6 +84,12 @@ NqapWifiMac::NqapWifiMac () m_beaconDca->SetMaxCw(0); m_beaconDca->SetLow (m_low); m_beaconDca->SetManager (m_dcfManager); + + m_dca = CreateObject (); + m_dca->SetLow (m_low); + m_dca->SetManager (m_dcfManager); + m_dca->SetTxOkCallback (MakeCallback (&NqapWifiMac::TxOk, this)); + m_dca->SetTxFailedCallback (MakeCallback (&NqapWifiMac::TxFailed, this)); } NqapWifiMac::~NqapWifiMac () { @@ -565,14 +570,28 @@ NqapWifiMac::GetDcaTxop(void) const return m_dca; } -void -NqapWifiMac::SetDcaTxop (Ptr dcaTxop) +void +NqapWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard) { - m_dca = dcaTxop; - m_dca->SetLow (m_low); - m_dca->SetManager (m_dcfManager); - m_dca->SetTxOkCallback (MakeCallback (&NqapWifiMac::TxOk, this)); - m_dca->SetTxFailedCallback (MakeCallback (&NqapWifiMac::TxFailed, this)); + switch (standard) + { + case WIFI_PHY_STANDARD_holland: + // fall through + case WIFI_PHY_STANDARD_80211_10Mhz: + // fall through + case WIFI_PHY_STANDARD_80211_5Mhz: + // fall through + case WIFI_PHY_STANDARD_80211a: + ConfigureDcf (m_dca, 15, 1023, AC_BE_NQOS); + break; + case WIFI_PHY_STANDARD_80211b: + ConfigureDcf (m_dca, 31, 1023, AC_BE_NQOS); + break; + default: + NS_ASSERT (false); + break; + } } + } // namespace ns3 diff --git a/src/devices/wifi/nqap-wifi-mac.h b/src/devices/wifi/nqap-wifi-mac.h index 998bc0d61..414248571 100644 --- a/src/devices/wifi/nqap-wifi-mac.h +++ b/src/devices/wifi/nqap-wifi-mac.h @@ -115,7 +115,7 @@ private: NqapWifiMac (const NqapWifiMac & ctor_arg); NqapWifiMac &operator = (const NqapWifiMac &o); Ptr GetDcaTxop (void) const; - void SetDcaTxop (Ptr dcaTxop); + virtual void FinishConfigureStandard (enum WifiPhyStandard standard); Ptr m_dca; Ptr m_beaconDca; diff --git a/src/devices/wifi/nqsta-wifi-mac.cc b/src/devices/wifi/nqsta-wifi-mac.cc index e7bceba8f..26ade167a 100644 --- a/src/devices/wifi/nqsta-wifi-mac.cc +++ b/src/devices/wifi/nqsta-wifi-mac.cc @@ -89,8 +89,7 @@ NqstaWifiMac::GetTypeId (void) MakeBooleanChecker ()) .AddAttribute ("DcaTxop", "The DcaTxop object", PointerValue (), - MakePointerAccessor (&NqstaWifiMac::GetDcaTxop, - &NqstaWifiMac::SetDcaTxop), + MakePointerAccessor (&NqstaWifiMac::GetDcaTxop), MakePointerChecker ()) .AddTraceSource ("Assoc", "Associated with an access point.", MakeTraceSourceAccessor (&NqstaWifiMac::m_assocLogger)) @@ -115,6 +114,10 @@ NqstaWifiMac::NqstaWifiMac () m_dcfManager = new DcfManager (); m_dcfManager->SetupLowListener (m_low); + + m_dca = CreateObject (); + m_dca->SetLow (m_low); + m_dca->SetManager (m_dcfManager); } NqstaWifiMac::~NqstaWifiMac () @@ -208,13 +211,6 @@ NqstaWifiMac::GetDcaTxop(void) const { return m_dca; } -void -NqstaWifiMac::SetDcaTxop (Ptr dcaTxop) -{ - m_dca = dcaTxop; - m_dca->SetLow (m_low); - m_dca->SetManager (m_dcfManager); -} void NqstaWifiMac::SetWifiPhy (Ptr phy) { @@ -668,4 +664,27 @@ NqstaWifiMac::SetState (MacState value) m_state = value; } +void +NqstaWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard) +{ + switch (standard) + { + case WIFI_PHY_STANDARD_holland: + // fall through + case WIFI_PHY_STANDARD_80211_10Mhz: + // fall through + case WIFI_PHY_STANDARD_80211_5Mhz: + // fall through + case WIFI_PHY_STANDARD_80211a: + ConfigureDcf (m_dca, 15, 1023, AC_BE_NQOS); + break; + case WIFI_PHY_STANDARD_80211b: + ConfigureDcf (m_dca, 31, 1023, AC_BE_NQOS); + break; + default: + NS_ASSERT (false); + break; + } +} + } // namespace ns3 diff --git a/src/devices/wifi/nqsta-wifi-mac.h b/src/devices/wifi/nqsta-wifi-mac.h index def5fc23d..88c10e463 100644 --- a/src/devices/wifi/nqsta-wifi-mac.h +++ b/src/devices/wifi/nqsta-wifi-mac.h @@ -139,8 +139,8 @@ private: NqstaWifiMac (const NqstaWifiMac & ctor_arg); NqstaWifiMac &operator = (const NqstaWifiMac & ctor_arg); Ptr GetDcaTxop(void) const; - void SetDcaTxop (Ptr dcaTxop); void SetState (enum MacState value); + virtual void FinishConfigureStandard (enum WifiPhyStandard standard); enum MacState m_state; Time m_probeRequestTimeout; diff --git a/src/devices/wifi/qadhoc-wifi-mac.cc b/src/devices/wifi/qadhoc-wifi-mac.cc index 66793e4fa..d795d2263 100644 --- a/src/devices/wifi/qadhoc-wifi-mac.cc +++ b/src/devices/wifi/qadhoc-wifi-mac.cc @@ -50,26 +50,22 @@ QadhocWifiMac::GetTypeId (void) .AddAttribute ("VO_EdcaTxopN", "Queue that manages packets belonging to AC_VO access class", PointerValue (), - MakePointerAccessor(&QadhocWifiMac::GetVOQueue, - &QadhocWifiMac::SetVOQueue), + MakePointerAccessor(&QadhocWifiMac::GetVOQueue), MakePointerChecker ()) .AddAttribute ("VI_EdcaTxopN", "Queue that manages packets belonging to AC_VI access class", PointerValue (), - MakePointerAccessor(&QadhocWifiMac::GetVIQueue, - &QadhocWifiMac::SetVIQueue), + MakePointerAccessor(&QadhocWifiMac::GetVIQueue), MakePointerChecker ()) .AddAttribute ("BE_EdcaTxopN", "Queue that manages packets belonging to AC_BE access class", PointerValue (), - MakePointerAccessor(&QadhocWifiMac::GetBEQueue, - &QadhocWifiMac::SetBEQueue), + MakePointerAccessor(&QadhocWifiMac::GetBEQueue), MakePointerChecker ()) .AddAttribute ("BK_EdcaTxopN", "Queue that manages packets belonging to AC_BK access class", PointerValue (), - MakePointerAccessor(&QadhocWifiMac::GetBKQueue, - &QadhocWifiMac::SetBKQueue), + MakePointerAccessor(&QadhocWifiMac::GetBKQueue), MakePointerChecker ()) ; return tid; @@ -88,6 +84,11 @@ QadhocWifiMac::QadhocWifiMac () m_dcfManager = new DcfManager (); m_dcfManager->SetupLowListener (m_low); + + SetQueue (AC_VO); + SetQueue (AC_VI); + SetQueue (AC_BE); + SetQueue (AC_BK); } QadhocWifiMac::~QadhocWifiMac () @@ -112,10 +113,9 @@ QadhocWifiMac::DoDispose (void) m_beEdca = 0; m_bkEdca = 0; m_stationManager = 0; - std::map >::iterator it = m_queues.begin (); - for (;it != m_queues.end (); it++) + for (Queues::iterator i = m_queues.begin (); i != m_queues.end (); ++i) { - it->second = 0; + (*i).second = 0; } WifiMac::DoDispose (); } @@ -208,10 +208,10 @@ QadhocWifiMac::SetWifiRemoteStationManager (Ptr statio { NS_LOG_FUNCTION (this << stationManager); m_stationManager = stationManager; - m_voEdca->SetWifiRemoteStationManager (stationManager); - m_viEdca->SetWifiRemoteStationManager (stationManager); - m_beEdca->SetWifiRemoteStationManager (stationManager); - m_bkEdca->SetWifiRemoteStationManager (stationManager); + for (Queues::iterator i = m_queues.begin (); i != m_queues.end (); ++i) + { + (*i).second->SetWifiRemoteStationManager (stationManager); + } m_low->SetWifiRemoteStationManager (stationManager); } @@ -373,69 +373,65 @@ QadhocWifiMac::DeaggregateAmsduAndForward (Ptr aggregatedPacket, Ptr QadhocWifiMac::GetVOQueue (void) const { - return m_voEdca; + return m_queues.find (AC_VO)->second; } Ptr QadhocWifiMac::GetVIQueue (void) const { - return m_viEdca; + return m_queues.find (AC_VI)->second; } Ptr QadhocWifiMac::GetBEQueue (void) const { - return m_beEdca; + return m_queues.find (AC_BE)->second; } Ptr QadhocWifiMac::GetBKQueue (void) const { - return m_bkEdca; + return m_queues.find (AC_BK)->second; } void -QadhocWifiMac::SetVOQueue (Ptr voQueue) +QadhocWifiMac::SetQueue (enum AccessClass ac) { - m_voEdca = voQueue; - m_queues.insert (std::make_pair(AC_VO, m_voEdca)); - m_queues[AC_VO]->SetLow (m_low); - m_queues[AC_VO]->SetManager (m_dcfManager); - m_queues[AC_VO]->SetTypeOfStation (ADHOC_STA); - m_queues[AC_VO]->SetTxMiddle (m_txMiddle); + Ptr edca = CreateObject (); + edca->SetLow (m_low); + edca->SetManager (m_dcfManager); + edca->SetTypeOfStation (ADHOC_STA); + edca->SetTxMiddle (m_txMiddle); + m_queues.insert (std::make_pair(ac, edca)); } -void -QadhocWifiMac::SetVIQueue (Ptr viQueue) +void +QadhocWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard) { - m_viEdca = viQueue; - m_queues.insert (std::make_pair(AC_VI, m_viEdca)); - m_queues[AC_VI]->SetLow (m_low); - m_queues[AC_VI]->SetManager (m_dcfManager); - m_queues[AC_VI]->SetTypeOfStation (ADHOC_STA); - m_queues[AC_VI]->SetTxMiddle (m_txMiddle); -} - -void -QadhocWifiMac::SetBEQueue (Ptr beQueue) -{ - m_beEdca = beQueue; - m_queues.insert (std::make_pair(AC_BE, m_beEdca)); - m_queues[AC_BE]->SetLow (m_low); - m_queues[AC_BE]->SetManager (m_dcfManager); - m_queues[AC_BE]->SetTypeOfStation (ADHOC_STA); - m_queues[AC_BE]->SetTxMiddle (m_txMiddle); -} - -void -QadhocWifiMac::SetBKQueue (Ptr bkQueue) -{ - m_bkEdca = bkQueue; - m_queues.insert (std::make_pair(AC_BK, m_bkEdca)); - m_queues[AC_BK]->SetLow (m_low); - m_queues[AC_BK]->SetManager (m_dcfManager); - m_queues[AC_BK]->SetTypeOfStation (ADHOC_STA); - m_queues[AC_BK]->SetTxMiddle (m_txMiddle); + switch (standard) + { + case WIFI_PHY_STANDARD_holland: + // fall through + case WIFI_PHY_STANDARD_80211a: + // fall through + case WIFI_PHY_STANDARD_80211_10Mhz: + // fall through + case WIFI_PHY_STANDARD_80211_5Mhz: + ConfigureDcf (m_queues[AC_BK], 15, 1023, AC_BK); + ConfigureDcf (m_queues[AC_BE], 15, 1023, AC_BE); + ConfigureDcf (m_queues[AC_VI], 15, 1023, AC_VI); + ConfigureDcf (m_queues[AC_VO], 15, 1023, AC_VO); + break; + case WIFI_PHY_STANDARD_80211b: + ConfigureDcf (m_queues[AC_BK], 31, 1023, AC_BK); + ConfigureDcf (m_queues[AC_BE], 31, 1023, AC_BE); + ConfigureDcf (m_queues[AC_VI], 31, 1023, AC_VI); + ConfigureDcf (m_queues[AC_VO], 31, 1023, AC_VO); + break; + default: + NS_ASSERT (false); + break; + } } } //namespace ns3 diff --git a/src/devices/wifi/qadhoc-wifi-mac.h b/src/devices/wifi/qadhoc-wifi-mac.h index a5b16a3f1..9e3e28eec 100644 --- a/src/devices/wifi/qadhoc-wifi-mac.h +++ b/src/devices/wifi/qadhoc-wifi-mac.h @@ -74,6 +74,7 @@ public: virtual void SetSsid (Ssid ssid); virtual Mac48Address GetBssid (void) const; + private: Callback, Mac48Address, Mac48Address> m_forwardUp; virtual void DoDispose (void); @@ -92,16 +93,13 @@ private: typedef std::list, AmsduSubframeHeader> > DeaggregatedMsdus; typedef std::list, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI; + virtual void FinishConfigureStandard (enum WifiPhyStandard standard); + void SetQueue (enum AccessClass ac); Ptr GetVOQueue (void) const; Ptr GetVIQueue (void) const; Ptr GetBEQueue (void) const; Ptr GetBKQueue (void) const; - void SetVOQueue (Ptr voQueue); - void SetVIQueue (Ptr viQueue); - void SetBEQueue (Ptr beQueue); - void SetBKQueue (Ptr bkQueue); - Queues m_queues; Ptr m_voEdca; Ptr m_viEdca; diff --git a/src/devices/wifi/qap-wifi-mac.cc b/src/devices/wifi/qap-wifi-mac.cc index af9bb6938..7c5e51c29 100644 --- a/src/devices/wifi/qap-wifi-mac.cc +++ b/src/devices/wifi/qap-wifi-mac.cc @@ -63,26 +63,22 @@ QapWifiMac::GetTypeId (void) .AddAttribute ("VO_EdcaTxopN", "Queue that manages packets belonging to AC_VO access class", PointerValue (), - MakePointerAccessor(&QapWifiMac::GetVOQueue, - &QapWifiMac::SetVOQueue), + MakePointerAccessor(&QapWifiMac::GetVOQueue), MakePointerChecker ()) .AddAttribute ("VI_EdcaTxopN", "Queue that manages packets belonging to AC_VI access class", PointerValue (), - MakePointerAccessor(&QapWifiMac::GetVIQueue, - &QapWifiMac::SetVIQueue), + MakePointerAccessor(&QapWifiMac::GetVIQueue), MakePointerChecker ()) .AddAttribute ("BE_EdcaTxopN", "Queue that manages packets belonging to AC_BE access class", PointerValue (), - MakePointerAccessor(&QapWifiMac::GetBEQueue, - &QapWifiMac::SetBEQueue), + MakePointerAccessor(&QapWifiMac::GetBEQueue), MakePointerChecker ()) .AddAttribute ("BK_EdcaTxopN", "Queue that manages packets belonging to AC_BK access class", PointerValue (), - MakePointerAccessor(&QapWifiMac::GetBKQueue, - &QapWifiMac::SetBKQueue), + MakePointerAccessor(&QapWifiMac::GetBKQueue), MakePointerChecker ()) ; return tid; @@ -108,6 +104,11 @@ QapWifiMac::QapWifiMac () m_beaconDca->SetMaxCw(0); m_beaconDca->SetLow (m_low); m_beaconDca->SetManager (m_dcfManager); + + SetQueue (AC_VO); + SetQueue (AC_VI); + SetQueue (AC_BE); + SetQueue (AC_BK); } QapWifiMac::~QapWifiMac () @@ -129,15 +130,10 @@ QapWifiMac::DoDispose () m_phy = 0; m_beaconDca = 0; m_beaconEvent.Cancel (); - m_voEdca = 0; - m_viEdca = 0; - m_beEdca = 0; - m_bkEdca = 0; m_stationManager = 0; - std::map >::iterator it = m_queues.begin (); - for (;it != m_queues.end (); it++) + for (Queues::iterator i = m_queues.begin (); i != m_queues.end (); ++i) { - it->second = 0; + (*i).second = 0; } WifiMac::DoDispose (); } @@ -259,10 +255,10 @@ QapWifiMac::SetWifiRemoteStationManager (Ptr stationMa { NS_LOG_FUNCTION (this << stationManager); m_stationManager = stationManager; - m_voEdca->SetWifiRemoteStationManager (stationManager); - m_viEdca->SetWifiRemoteStationManager (stationManager); - m_beEdca->SetWifiRemoteStationManager (stationManager); - m_bkEdca->SetWifiRemoteStationManager (stationManager); + for (Queues::iterator i = m_queues.begin (); i != m_queues.end (); ++i) + { + (*i).second->SetWifiRemoteStationManager (stationManager); + } m_beaconDca->SetWifiRemoteStationManager (stationManager); m_low->SetWifiRemoteStationManager (stationManager); } @@ -713,77 +709,67 @@ QapWifiMac::DeaggregateAmsduAndForward (Ptr aggregatedPacket, WifiMacHea Ptr QapWifiMac::GetVOQueue (void) const { - return m_voEdca; + return m_queues.find (AC_VO)->second; } Ptr QapWifiMac::GetVIQueue (void) const { - return m_viEdca; + return m_queues.find (AC_VI)->second; } Ptr QapWifiMac::GetBEQueue (void) const { - return m_beEdca; + return m_queues.find (AC_BE)->second; } Ptr QapWifiMac::GetBKQueue (void) const { - return m_bkEdca; + return m_queues.find (AC_BK)->second; } void -QapWifiMac::SetVOQueue (Ptr voQueue) +QapWifiMac::SetQueue (enum AccessClass ac) { - m_voEdca = voQueue; - m_queues.insert (std::make_pair(AC_VO, m_voEdca)); - m_queues[AC_VO]->SetLow (m_low); - m_queues[AC_VO]->SetManager (m_dcfManager); - m_queues[AC_VO]->SetTypeOfStation (AP); - m_queues[AC_VO]->SetTxMiddle (m_txMiddle); - m_queues[AC_VO]->SetTxOkCallback (MakeCallback (&QapWifiMac::TxOk, this)); - m_queues[AC_VO]->SetTxFailedCallback (MakeCallback (&QapWifiMac::TxFailed, this)); + Ptr edca = CreateObject (); + edca->SetLow (m_low); + edca->SetManager (m_dcfManager); + edca->SetTypeOfStation (AP); + edca->SetTxMiddle (m_txMiddle); + edca->SetTxOkCallback (MakeCallback (&QapWifiMac::TxOk, this)); + edca->SetTxFailedCallback (MakeCallback (&QapWifiMac::TxFailed, this)); + m_queues.insert (std::make_pair(ac, edca)); } -void -QapWifiMac::SetVIQueue (Ptr viQueue) +void +QapWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard) { - m_viEdca = viQueue; - m_queues.insert (std::make_pair(AC_VI, m_viEdca)); - m_queues[AC_VI]->SetLow (m_low); - m_queues[AC_VI]->SetManager (m_dcfManager); - m_queues[AC_VI]->SetTypeOfStation (AP); - m_queues[AC_VI]->SetTxMiddle (m_txMiddle); - m_queues[AC_VI]->SetTxOkCallback (MakeCallback (&QapWifiMac::TxOk, this)); - m_queues[AC_VI]->SetTxFailedCallback (MakeCallback (&QapWifiMac::TxFailed, this)); -} - -void -QapWifiMac::SetBEQueue (Ptr beQueue) -{ - m_beEdca = beQueue; - m_queues.insert (std::make_pair(AC_BE, m_beEdca)); - m_queues[AC_BE]->SetLow (m_low); - m_queues[AC_BE]->SetManager (m_dcfManager); - m_queues[AC_BE]->SetTypeOfStation (AP); - m_queues[AC_BE]->SetTxMiddle (m_txMiddle); - m_queues[AC_BE]->SetTxOkCallback (MakeCallback (&QapWifiMac::TxOk, this)); - m_queues[AC_BE]->SetTxFailedCallback (MakeCallback (&QapWifiMac::TxFailed, this)); -} - -void -QapWifiMac::SetBKQueue (Ptr bkQueue) -{ - m_bkEdca = bkQueue; - m_queues.insert (std::make_pair(AC_BK, m_bkEdca)); - m_queues[AC_BK]->SetLow (m_low); - m_queues[AC_BK]->SetManager (m_dcfManager); - m_queues[AC_BK]->SetTypeOfStation (AP); - m_queues[AC_BK]->SetTxMiddle (m_txMiddle); - m_queues[AC_BK]->SetTxOkCallback (MakeCallback (&QapWifiMac::TxOk, this)); - m_queues[AC_BK]->SetTxFailedCallback (MakeCallback (&QapWifiMac::TxFailed, this)); + switch (standard) + { + case WIFI_PHY_STANDARD_holland: + // fall through + case WIFI_PHY_STANDARD_80211a: + // fall through + case WIFI_PHY_STANDARD_80211_10Mhz: + // fall through + case WIFI_PHY_STANDARD_80211_5Mhz: + ConfigureDcf (m_queues[AC_BK], 15, 1023, AC_BK); + ConfigureDcf (m_queues[AC_BE], 15, 1023, AC_BE); + ConfigureDcf (m_queues[AC_VI], 15, 1023, AC_VI); + ConfigureDcf (m_queues[AC_VO], 15, 1023, AC_VO); + break; + case WIFI_PHY_STANDARD_80211b: + ConfigureDcf (m_queues[AC_BK], 31, 1023, AC_BK); + ConfigureDcf (m_queues[AC_BE], 31, 1023, AC_BE); + ConfigureDcf (m_queues[AC_VI], 31, 1023, AC_VI); + ConfigureDcf (m_queues[AC_VO], 31, 1023, AC_VO); + break; + default: + NS_ASSERT (false); + break; + } } } //namespace ns3 diff --git a/src/devices/wifi/qap-wifi-mac.h b/src/devices/wifi/qap-wifi-mac.h index c906a14a5..1c789e96f 100644 --- a/src/devices/wifi/qap-wifi-mac.h +++ b/src/devices/wifi/qap-wifi-mac.h @@ -87,6 +87,10 @@ public: void StartBeaconing (void); private: + typedef std::map > Queues; + typedef std::list, AmsduSubframeHeader> > DeaggregatedMsdus; + typedef std::list, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI; + virtual void DoDispose (void); void Receive (Ptr packet, WifiMacHeader const*hdr); void ForwardUp (Ptr packet, Mac48Address from, Mac48Address to); @@ -107,28 +111,15 @@ private: QapWifiMac &operator = (const QapWifiMac &); QapWifiMac (const QapWifiMac &); - typedef std::map > Queues; - typedef std::list, AmsduSubframeHeader> > DeaggregatedMsdus; - typedef std::list, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI; - - Callback, Mac48Address, Mac48Address> m_forwardUp; - Ptr GetVOQueue (void) const; Ptr GetVIQueue (void) const; Ptr GetBEQueue (void) const; Ptr GetBKQueue (void) const; + void SetQueue (enum AccessClass ac); - void SetVOQueue (Ptr voQueue); - void SetVIQueue (Ptr viQueue); - void SetBEQueue (Ptr beQueue); - void SetBKQueue (Ptr bkQueue); + virtual void FinishConfigureStandard (enum WifiPhyStandard standard); - /*Next map is used only for an esay access to a specific queue*/ Queues m_queues; - Ptr m_voEdca; - Ptr m_viEdca; - Ptr m_beEdca; - Ptr m_bkEdca; Ptr m_beaconDca; Ptr m_low; Ptr m_phy; @@ -139,6 +130,7 @@ private: Ssid m_ssid; EventId m_beaconEvent; Time m_beaconInterval; + Callback, Mac48Address, Mac48Address> m_forwardUp; }; } //namespace ns3 diff --git a/src/devices/wifi/qos-utils.h b/src/devices/wifi/qos-utils.h index b54a60fe4..184759ed4 100644 --- a/src/devices/wifi/qos-utils.h +++ b/src/devices/wifi/qos-utils.h @@ -31,6 +31,7 @@ enum AccessClass { AC_VI = 1, AC_BE = 2, AC_BK = 3, + AC_BE_NQOS = 4, AC_UNDEF }; diff --git a/src/devices/wifi/qsta-wifi-mac.cc b/src/devices/wifi/qsta-wifi-mac.cc index e3c3fed5a..ba8f2f1f5 100644 --- a/src/devices/wifi/qsta-wifi-mac.cc +++ b/src/devices/wifi/qsta-wifi-mac.cc @@ -69,26 +69,22 @@ QstaWifiMac::GetTypeId (void) .AddAttribute ("VO_EdcaTxopN", "Queue that manages packets belonging to AC_VO access class", PointerValue (), - MakePointerAccessor(&QstaWifiMac::GetVOQueue, - &QstaWifiMac::SetVOQueue), + MakePointerAccessor(&QstaWifiMac::GetVOQueue), MakePointerChecker ()) .AddAttribute ("VI_EdcaTxopN", "Queue that manages packets belonging to AC_VI access class", PointerValue (), - MakePointerAccessor(&QstaWifiMac::GetVIQueue, - &QstaWifiMac::SetVIQueue), + MakePointerAccessor(&QstaWifiMac::GetVIQueue), MakePointerChecker ()) .AddAttribute ("BE_EdcaTxopN", "Queue that manages packets belonging to AC_BE access class", PointerValue (), - MakePointerAccessor(&QstaWifiMac::GetBEQueue, - &QstaWifiMac::SetBEQueue), + MakePointerAccessor(&QstaWifiMac::GetBEQueue), MakePointerChecker ()) .AddAttribute ("BK_EdcaTxopN", "Queue that manages packets belonging to AC_BK access class", PointerValue (), - MakePointerAccessor(&QstaWifiMac::GetBKQueue, - &QstaWifiMac::SetBKQueue), + MakePointerAccessor(&QstaWifiMac::GetBKQueue), MakePointerChecker ()) ; return tid; @@ -111,6 +107,11 @@ QstaWifiMac::QstaWifiMac () m_dcfManager = new DcfManager (); m_dcfManager->SetupLowListener (m_low); + + SetQueue (AC_VO); + SetQueue (AC_VI); + SetQueue (AC_BE); + SetQueue (AC_BK); } QstaWifiMac::~QstaWifiMac () @@ -131,15 +132,10 @@ QstaWifiMac::DoDispose () m_low = 0; m_phy = 0; m_dcfManager = 0; - m_voEdca = 0; - m_viEdca = 0; - m_beEdca = 0; - m_bkEdca = 0; m_stationManager = 0; - std::map >::iterator it = m_queues.begin (); - for (;it != m_queues.end (); it++) + for (Queues::iterator i = m_queues.begin (); i != m_queues.end (); ++i) { - it->second = 0; + (*i).second = 0; } WifiMac::DoDispose (); } @@ -706,69 +702,66 @@ QstaWifiMac::DeaggregateAmsduAndForward (Ptr aggregatedPacket, WifiMacHe Ptr QstaWifiMac::GetVOQueue (void) const { - return m_voEdca; + return m_queues.find (AC_VO)->second; } Ptr QstaWifiMac::GetVIQueue (void) const { - return m_viEdca; + return m_queues.find (AC_VI)->second; } Ptr QstaWifiMac::GetBEQueue (void) const { - return m_beEdca; + return m_queues.find (AC_BE)->second; } Ptr QstaWifiMac::GetBKQueue (void) const { - return m_bkEdca; + return m_queues.find (AC_BK)->second; } void -QstaWifiMac::SetVOQueue (Ptr voQueue) +QstaWifiMac::SetQueue (enum AccessClass ac) { - m_voEdca = voQueue; - m_queues.insert (std::make_pair(AC_VO, m_voEdca)); - m_queues[AC_VO]->SetLow (m_low); - m_queues[AC_VO]->SetManager (m_dcfManager); - m_queues[AC_VO]->SetTypeOfStation (STA); - m_queues[AC_VO]->SetTxMiddle (m_txMiddle); + Ptr edca = CreateObject (); + edca->SetLow (m_low); + edca->SetManager (m_dcfManager); + edca->SetTypeOfStation (STA); + edca->SetTxMiddle (m_txMiddle); + m_queues.insert (std::make_pair(ac, edca)); } -void -QstaWifiMac::SetVIQueue (Ptr viQueue) +void +QstaWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard) { - m_viEdca = viQueue; - m_queues.insert (std::make_pair(AC_VI, m_viEdca)); - m_queues[AC_VI]->SetLow (m_low); - m_queues[AC_VI]->SetManager (m_dcfManager); - m_queues[AC_VI]->SetTypeOfStation (STA); - m_queues[AC_VI]->SetTxMiddle (m_txMiddle); + switch (standard) + { + case WIFI_PHY_STANDARD_holland: + // fall through + case WIFI_PHY_STANDARD_80211a: + // fall through + case WIFI_PHY_STANDARD_80211_10Mhz: + // fall through + case WIFI_PHY_STANDARD_80211_5Mhz: + ConfigureDcf (m_queues[AC_BK], 15, 1023, AC_BK); + ConfigureDcf (m_queues[AC_BE], 15, 1023, AC_BE); + ConfigureDcf (m_queues[AC_VI], 15, 1023, AC_VI); + ConfigureDcf (m_queues[AC_VO], 15, 1023, AC_VO); + break; + case WIFI_PHY_STANDARD_80211b: + ConfigureDcf (m_queues[AC_BK], 31, 1023, AC_BK); + ConfigureDcf (m_queues[AC_BE], 31, 1023, AC_BE); + ConfigureDcf (m_queues[AC_VI], 31, 1023, AC_VI); + ConfigureDcf (m_queues[AC_VO], 31, 1023, AC_VO); + break; + default: + NS_ASSERT (false); + break; + } } -void -QstaWifiMac::SetBEQueue (Ptr beQueue) -{ - m_beEdca = beQueue; - m_queues.insert (std::make_pair(AC_BE, m_beEdca)); - m_queues[AC_BE]->SetLow (m_low); - m_queues[AC_BE]->SetManager (m_dcfManager); - m_queues[AC_BE]->SetTypeOfStation (STA); - m_queues[AC_BE]->SetTxMiddle (m_txMiddle); -} - -void -QstaWifiMac::SetBKQueue (Ptr bkQueue) -{ - m_bkEdca = bkQueue; - m_queues.insert (std::make_pair(AC_BK, m_bkEdca)); - m_queues[AC_BK]->SetLow (m_low); - m_queues[AC_BK]->SetManager (m_dcfManager); - m_queues[AC_BK]->SetTypeOfStation (STA); - m_queues[AC_BK]->SetTxMiddle (m_txMiddle); -} } //namespace ns3 diff --git a/src/devices/wifi/qsta-wifi-mac.h b/src/devices/wifi/qsta-wifi-mac.h index 1d80e1383..ea87db875 100644 --- a/src/devices/wifi/qsta-wifi-mac.h +++ b/src/devices/wifi/qsta-wifi-mac.h @@ -111,19 +111,15 @@ private: */ void DeaggregateAmsduAndForward (Ptr aggregatedPacket, WifiMacHeader const *hdr); + QstaWifiMac &operator = (const QstaWifiMac &); + QstaWifiMac (const QstaWifiMac &); + virtual void FinishConfigureStandard (enum WifiPhyStandard standard); + void SetQueue (enum AccessClass ac); Ptr GetVOQueue (void) const; Ptr GetVIQueue (void) const; Ptr GetBEQueue (void) const; Ptr GetBKQueue (void) const; - void SetVOQueue (Ptr voQueue); - void SetVIQueue (Ptr viQueue); - void SetBEQueue (Ptr beQueue); - void SetBKQueue (Ptr bkQueue); - - QstaWifiMac &operator = (const QstaWifiMac &); - QstaWifiMac (const QstaWifiMac &); - typedef std::map > Queues; typedef std::list, AmsduSubframeHeader> > DeaggregatedMsdus; typedef std::list, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI; @@ -136,13 +132,7 @@ private: REFUSED } m_state; - /*Next map is used only for an esay access to a specific queue*/ Queues m_queues; - Ptr m_voEdca; - Ptr m_viEdca; - Ptr m_beEdca; - Ptr m_bkEdca; - Ptr m_low; Ptr m_phy; Ptr m_stationManager; diff --git a/src/devices/wifi/wifi-mac.cc b/src/devices/wifi/wifi-mac.cc index 8f9bca897..8448e5e9d 100644 --- a/src/devices/wifi/wifi-mac.cc +++ b/src/devices/wifi/wifi-mac.cc @@ -18,6 +18,7 @@ * Author: Mathieu Lacage */ #include "wifi-mac.h" +#include "dcf.h" #include "ns3/uinteger.h" #include "ns3/trace-source-accessor.h" @@ -117,14 +118,6 @@ WifiMac::GetTypeId (void) MakeSsidAccessor (&WifiMac::GetSsid, &WifiMac::SetSsid), MakeSsidChecker ()) - .AddAttribute ("Standard", "The standard chosen configures some MAC-specific constants", - EnumValue (WIFI_PHY_STANDARD_80211a), - MakeEnumAccessor (&WifiMac::SetStandard), - MakeEnumChecker (WIFI_PHY_STANDARD_80211a, "802.11a", - WIFI_PHY_STANDARD_80211b, "802.11b", - WIFI_PHY_STANDARD_80211_10Mhz,"802.11_10Mhz", - WIFI_PHY_STANDARD_80211_5Mhz,"802-11_5Mhz", - WIFI_PHY_STANDARD_holland, "holland")) .AddTraceSource ("MacTx", "A packet has been received from higher layers and is being processed in preparation for " "queueing for transmission.", @@ -209,9 +202,8 @@ WifiMac::NotifyRxDrop (Ptr packet) } void -WifiMac::SetStandard (enum WifiPhyStandard standard) +WifiMac::ConfigureStandard (enum WifiPhyStandard standard) { - m_standard = standard; switch (standard) { case WIFI_PHY_STANDARD_80211a: Configure80211a (); @@ -232,6 +224,7 @@ WifiMac::SetStandard (enum WifiPhyStandard standard) NS_ASSERT (false); break; } + FinishConfigureStandard (standard); } void @@ -278,4 +271,41 @@ WifiMac::Configure80211_5Mhz (void) SetAckTimeout(MicroSeconds(64+176+21+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); } +void +WifiMac::ConfigureDcf (Ptr dcf, uint32_t cwmin, uint32_t cwmax, enum AccessClass ac) +{ + /* see IEE802.11 section 7.3.2.29 */ + switch (ac) { + case AC_VO: + dcf->SetMinCw ((cwmin+1)/4-1); + dcf->SetMaxCw ((cwmin+1)/2-1); + dcf->SetAifsn (2); + break; + case AC_VI: + dcf->SetMinCw ((cwmin+1)/2-1); + dcf->SetMaxCw (cwmin); + dcf->SetAifsn (2); + break; + case AC_BE: + dcf->SetMinCw (cwmin); + dcf->SetMaxCw (cwmax); + dcf->SetAifsn (3); + break; + case AC_BK: + dcf->SetMinCw (cwmin); + dcf->SetMaxCw (cwmax); + dcf->SetAifsn (7); + break; + case AC_BE_NQOS: + dcf->SetMinCw (cwmin); + dcf->SetMaxCw (cwmax); + dcf->SetAifsn (2); + break; + case AC_UNDEF: + NS_FATAL_ERROR ("I don't know what to do with this"); + break; + } +} + + } // namespace ns3 diff --git a/src/devices/wifi/wifi-mac.h b/src/devices/wifi/wifi-mac.h index 5a3d3d97a..0a59acd59 100644 --- a/src/devices/wifi/wifi-mac.h +++ b/src/devices/wifi/wifi-mac.h @@ -26,9 +26,12 @@ #include "wifi-phy.h" #include "wifi-remote-station-manager.h" #include "ssid.h" +#include "qos-utils.h" namespace ns3 { +class Dcf; + /** * \brief base class for all MAC-level wifi objects. * @@ -209,8 +212,10 @@ public: /** * \param standard the wifi standard to be configured */ - void SetStandard (enum WifiPhyStandard standard); + void ConfigureStandard (enum WifiPhyStandard standard); +protected: + void ConfigureDcf (Ptr dcf, uint32_t cwmin, uint32_t cwmax, enum AccessClass ac); private: static Time GetDefaultMaxPropagationDelay (void); static Time GetDefaultSlot (void); @@ -218,10 +223,18 @@ private: static Time GetDefaultEifsNoDifs (void); static Time GetDefaultCtsAckDelay (void); static Time GetDefaultCtsAckTimeout (void); + /** + * \param standard the phy standard to be used + * + * This method is called by ns3::WifiMac::ConfigureStandard to complete + * the configuration process for a requested phy standard. Subclasses should + * implement this method to configure their dcf queues according to the + * requested standard. + */ + virtual void FinishConfigureStandard (enum WifiPhyStandard standard) = 0; Time m_maxPropagationDelay; uint32_t m_maxMsduSize; - WifiPhyStandard m_standard; void Configure80211a (void); void Configure80211b (void); diff --git a/src/devices/wifi/wifi-phy.h b/src/devices/wifi/wifi-phy.h index b9519a812..222ff8ccf 100644 --- a/src/devices/wifi/wifi-phy.h +++ b/src/devices/wifi/wifi-phy.h @@ -253,6 +253,8 @@ public: virtual void SetChannelNumber (uint16_t id) = 0; /// Return current channel number, see SetChannelNumber() virtual uint16_t GetChannelNumber () const = 0; + + virtual void ConfigureStandard (enum WifiPhyStandard standard) = 0; virtual Ptr GetChannel (void) const = 0; diff --git a/src/devices/wifi/wifi-test.cc b/src/devices/wifi/wifi-test.cc index c2a9ba532..1e2d8893b 100644 --- a/src/devices/wifi/wifi-test.cc +++ b/src/devices/wifi/wifi-test.cc @@ -71,9 +71,8 @@ WifiTest::CreateOne (Vector pos, Ptr channel) Ptr node = CreateObject (); Ptr dev = CreateObject (); - Ptr queue = CreateObject (); Ptr mac = m_mac.Create (); - mac->SetAttribute("DcaTxop", PointerValue (queue)); + mac->ConfigureStandard (WIFI_PHY_STANDARD_80211a); Ptr mobility = CreateObject (); Ptr phy = CreateObject (); Ptr error = CreateObject (); @@ -81,6 +80,7 @@ WifiTest::CreateOne (Vector pos, Ptr channel) phy->SetChannel (channel); phy->SetDevice (dev); phy->SetMobility (node); + phy->ConfigureStandard (WIFI_PHY_STANDARD_80211a); Ptr manager = m_manager.Create (); mobility->SetPosition (pos); diff --git a/src/devices/wifi/wscript b/src/devices/wifi/wscript index e265afaf6..7df865e15 100644 --- a/src/devices/wifi/wscript +++ b/src/devices/wifi/wscript @@ -64,6 +64,7 @@ def build(bld): 'amsdu-subframe-header.cc', 'msdu-standard-aggregator.cc', 'minstrel-wifi-manager.cc', + 'dcf.cc', ] headers = bld.new_task_gen('ns3header') headers.module = 'wifi' @@ -107,14 +108,14 @@ def build(bld): 'msdu-aggregator.h', 'amsdu-subframe-header.h', 'qos-tag.h', -# Need this for module devices/mesh 'mgt-headers.h', 'status-code.h', 'capability-information.h', 'dcf-manager.h', 'mac-rx-middle.h', 'mac-low.h', - 'minstrel-wifi-manager.h' + 'minstrel-wifi-manager.h', + 'dcf.h', ] if bld.env['ENABLE_GSL']: diff --git a/src/devices/wifi/yans-wifi-phy.cc b/src/devices/wifi/yans-wifi-phy.cc index 6d2a36867..eead8afae 100644 --- a/src/devices/wifi/yans-wifi-phy.cc +++ b/src/devices/wifi/yans-wifi-phy.cc @@ -105,15 +105,6 @@ YansWifiPhy::GetTypeId (void) MakeDoubleAccessor (&YansWifiPhy::SetRxNoiseFigure, &YansWifiPhy::GetRxNoiseFigure), MakeDoubleChecker ()) - .AddAttribute ("Standard", "The standard chosen configures a set of transmission modes" - " and some PHY-specific constants.", - EnumValue (WIFI_PHY_STANDARD_80211a), - MakeEnumAccessor (&YansWifiPhy::SetStandard), - MakeEnumChecker (WIFI_PHY_STANDARD_80211a, "802.11a", - WIFI_PHY_STANDARD_80211b, "802.11b", - WIFI_PHY_STANDARD_80211_10Mhz,"802.11_10Mhz", - WIFI_PHY_STANDARD_80211_5Mhz,"802.11_5Mhz", - WIFI_PHY_STANDARD_holland, "holland")) .AddAttribute ("State", "The state of the PHY layer", PointerValue (), MakePointerAccessor (&YansWifiPhy::m_state), @@ -151,10 +142,9 @@ YansWifiPhy::DoDispose (void) } void -YansWifiPhy::SetStandard (enum WifiPhyStandard standard) +YansWifiPhy::ConfigureStandard (enum WifiPhyStandard standard) { NS_LOG_FUNCTION (this << standard); - m_standard = standard; switch (standard) { case WIFI_PHY_STANDARD_80211a: Configure80211a (); diff --git a/src/devices/wifi/yans-wifi-phy.h b/src/devices/wifi/yans-wifi-phy.h index a2efeba4e..34c3313e7 100644 --- a/src/devices/wifi/yans-wifi-phy.h +++ b/src/devices/wifi/yans-wifi-phy.h @@ -89,7 +89,6 @@ public: WifiMode mode, WifiPreamble preamble); - void SetStandard (enum WifiPhyStandard standard); void SetRxNoiseFigure (double noiseFigureDb); void SetTxPowerStart (double start); void SetTxPowerEnd (double end); @@ -133,6 +132,7 @@ public: virtual WifiMode GetMode (uint32_t mode) const; virtual double CalculateSnr (WifiMode txMode, double ber) const; virtual Ptr GetChannel (void) const; + virtual void ConfigureStandard (enum WifiPhyStandard standard); private: typedef std::vector Modes; @@ -170,7 +170,6 @@ private: Modes m_modes; EventId m_endSyncEvent; UniformVariable m_random; - WifiPhyStandard m_standard; /// Standard-dependent center frequency of 0-th channel, MHz double m_channelStartingFrequency; Ptr m_state; diff --git a/src/helper/nqos-wifi-mac-helper.cc b/src/helper/nqos-wifi-mac-helper.cc index fbe904ab9..ccc4c2f3a 100644 --- a/src/helper/nqos-wifi-mac-helper.cc +++ b/src/helper/nqos-wifi-mac-helper.cc @@ -25,9 +25,7 @@ namespace ns3 { NqosWifiMacHelper::NqosWifiMacHelper () -{ - m_queue.SetTypeId ("ns3::DcaTxop"); -} +{} NqosWifiMacHelper::~NqosWifiMacHelper () {} @@ -62,24 +60,10 @@ NqosWifiMacHelper::SetType (std::string type, m_mac.Set (n7, v7); } -void -NqosWifiMacHelper::SetDcaParameters (std::string n0, const AttributeValue &v0, - std::string n1, const AttributeValue &v1, - std::string n2, const AttributeValue &v2, - std::string n3, const AttributeValue &v3) -{ - m_queue.Set (n0, v0); - m_queue.Set (n1, v1); - m_queue.Set (n2, v2); - m_queue.Set (n3, v3); -} - Ptr NqosWifiMacHelper::Create (void) const { Ptr mac = m_mac.Create (); - Ptr queue = m_queue.Create (); - mac->SetAttribute ("DcaTxop", PointerValue (queue)); return mac; } diff --git a/src/helper/nqos-wifi-mac-helper.h b/src/helper/nqos-wifi-mac-helper.h index 032d783ba..14446e647 100644 --- a/src/helper/nqos-wifi-mac-helper.h +++ b/src/helper/nqos-wifi-mac-helper.h @@ -69,20 +69,6 @@ public: std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (), std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (), std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ()); - /** - * \param n0 the name of the attribute to set - * \param v0 the value of the attribute to set - * \param n1 the name of the attribute to set - * \param v1 the value of the attribute to set - * \param n2 the name of the attribute to set - * \param v2 the value of the attribute to set - * \param n3 the name of the attribute to set - * \param v3 the value of the attribute to set - */ - void SetDcaParameters (std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (), - std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (), - std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (), - std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue ()); private: /** * \returns a newly-created MAC object. @@ -92,7 +78,6 @@ private: virtual Ptr Create (void) const; ObjectFactory m_mac; - ObjectFactory m_queue; }; } //namespace ns3 diff --git a/src/helper/qos-wifi-mac-helper.cc b/src/helper/qos-wifi-mac-helper.cc index 634c80cd0..4f1a08444 100644 --- a/src/helper/qos-wifi-mac-helper.cc +++ b/src/helper/qos-wifi-mac-helper.cc @@ -28,20 +28,12 @@ namespace ns3 { QosWifiMacHelper::QosWifiMacHelper () { - m_aggregators.insert (std::make_pair (AC_VO, ObjectFactory ())); - m_aggregators.insert (std::make_pair (AC_VI, ObjectFactory ())); - m_aggregators.insert (std::make_pair (AC_BE, ObjectFactory ())); - m_aggregators.insert (std::make_pair (AC_BK, ObjectFactory ())); - - m_queues.insert (std::make_pair (AC_VO, ObjectFactory ())); - m_queues.insert (std::make_pair (AC_VI, ObjectFactory ())); - m_queues.insert (std::make_pair (AC_BE, ObjectFactory ())); - m_queues.insert (std::make_pair (AC_BK, ObjectFactory ())); - - m_queues[AC_VO].SetTypeId ("ns3::EdcaTxopN"); - m_queues[AC_VI].SetTypeId ("ns3::EdcaTxopN"); - m_queues[AC_BE].SetTypeId ("ns3::EdcaTxopN"); - m_queues[AC_BK].SetTypeId ("ns3::EdcaTxopN"); + ObjectFactory defaultAggregator; + defaultAggregator.SetTypeId ("ns3::MsduStandardAggregator"); + m_aggregators.insert (std::make_pair (AC_VO, defaultAggregator)); + m_aggregators.insert (std::make_pair (AC_VI, defaultAggregator)); + m_aggregators.insert (std::make_pair (AC_BE, defaultAggregator)); + m_aggregators.insert (std::make_pair (AC_BK, defaultAggregator)); } QosWifiMacHelper::~QosWifiMacHelper () @@ -52,19 +44,7 @@ QosWifiMacHelper::Default (void) { QosWifiMacHelper helper; helper.SetType ("ns3::QstaWifiMac"); - /* For more details about this default parameters see IEE802.11 section 7.3.2.29 */ - helper.SetEdcaParametersForAc (AC_VO,"MinCw", UintegerValue (3), - "MaxCw", UintegerValue (7), - "Aifsn", UintegerValue (2)); - helper.SetEdcaParametersForAc (AC_VI,"MinCw", UintegerValue (7), - "MaxCw", UintegerValue (15), - "Aifsn", UintegerValue (2)); - helper.SetEdcaParametersForAc (AC_BE,"MinCw", UintegerValue (15), - "MaxCw", UintegerValue (1023), - "Aifsn", UintegerValue (3)); - helper.SetEdcaParametersForAc (AC_BK,"MinCw", UintegerValue (15), - "MaxCw", UintegerValue (1023), - "Aifsn", UintegerValue (7)); + return helper; } @@ -110,80 +90,26 @@ QosWifiMacHelper::SetMsduAggregatorForAc (AccessClass accessClass, std::string t } void -QosWifiMacHelper::SetEdcaParametersForAc (AccessClass accessClass, - std::string n0, const AttributeValue &v0, - std::string n1, const AttributeValue &v1, - std::string n2, const AttributeValue &v2, - std::string n3, const AttributeValue &v3) +QosWifiMacHelper::Setup (Ptr mac, enum AccessClass ac, std::string dcaAttrName) const { - std::map::iterator it; - it = m_queues.find (accessClass); - if (it != m_queues.end ()) - { - it->second.Set (n0, v0); - it->second.Set (n1, v1); - it->second.Set (n2, v2); - it->second.Set (n3, v3); - } + ObjectFactory factory = m_aggregators.find (ac)->second; + PointerValue ptr; + mac->GetAttribute (dcaAttrName, ptr); + Ptr edca = ptr.Get (); + Ptr aggregator = factory.Create (); + edca->SetMsduAggregator (aggregator); } + Ptr QosWifiMacHelper::Create (void) const { Ptr mac = m_mac.Create (); - Ptr edcaQueue; - Ptr aggregator; - std::map::const_iterator itQueue; - std::map::const_iterator itAggr; - - /* Setting for VO queue */ - itQueue = m_queues.find (AC_VO); - itAggr = m_aggregators.find (AC_VO); - - edcaQueue = itQueue->second.Create (); - if (itAggr->second.GetTypeId ().GetUid () != 0) - { - aggregator = itAggr->second.Create (); - edcaQueue->SetMsduAggregator (aggregator); - } - mac->SetAttribute ("VO_EdcaTxopN", PointerValue (edcaQueue)); - - /* Setting for VI queue */ - itQueue = m_queues.find (AC_VI); - itAggr = m_aggregators.find (AC_VI); - - edcaQueue = itQueue->second.Create (); - if (itAggr->second.GetTypeId ().GetUid () != 0) - { - aggregator = itAggr->second.Create (); - edcaQueue->SetMsduAggregator (aggregator); - } - mac->SetAttribute ("VI_EdcaTxopN", PointerValue (edcaQueue)); - - /* Setting for BE queue */ - itQueue = m_queues.find (AC_BE); - itAggr = m_aggregators.find (AC_BE); - - edcaQueue = itQueue->second.Create (); - if (itAggr->second.GetTypeId ().GetUid () != 0) - { - aggregator = itAggr->second.Create (); - edcaQueue->SetMsduAggregator (aggregator); - } - mac->SetAttribute ("BE_EdcaTxopN", PointerValue (edcaQueue)); - - /* Setting for BK queue */ - itQueue = m_queues.find (AC_BK); - itAggr = m_aggregators.find (AC_BK); - - edcaQueue = itQueue->second.Create (); - if (itAggr->second.GetTypeId ().GetUid () != 0) - { - aggregator = itAggr->second.Create (); - edcaQueue->SetMsduAggregator (aggregator); - } - mac->SetAttribute ("BK_EdcaTxopN", PointerValue (edcaQueue)); + Setup (mac, AC_VO, "VO_EdcaTxopN"); + Setup (mac, AC_VI, "VI_EdcaTxopN"); + Setup (mac, AC_BE, "BE_EdcaTxopN"); + Setup (mac, AC_BK, "BK_EdcaTxopN"); return mac; } diff --git a/src/helper/qos-wifi-mac-helper.h b/src/helper/qos-wifi-mac-helper.h index cfe1cb84f..f0bb26e30 100644 --- a/src/helper/qos-wifi-mac-helper.h +++ b/src/helper/qos-wifi-mac-helper.h @@ -92,23 +92,6 @@ public: std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (), std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (), std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue ()); - /** - * \param accessClass access class for which we are setting edca params. Possibilities - * are: AC_BK, AC_BE, AC_VI, AC_VO. - * \param n0 the name of the attribute to set - * \param v0 the value of the attribute to set - * \param n1 the name of the attribute to set - * \param v1 the value of the attribute to set - * \param n2 the name of the attribute to set - * \param v2 the value of the attribute to set - * \param n3 the name of the attribute to set - * \param v3 the value of the attribute to set - */ - void SetEdcaParametersForAc (AccessClass accessClass, - std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (), - std::string n1 = "", const AttributeValue &v1 = EmptyAttributeValue (), - std::string n2 = "", const AttributeValue &v2 = EmptyAttributeValue (), - std::string n3 = "", const AttributeValue &v3 = EmptyAttributeValue ()); private: /** * \returns a newly-created MAC object. @@ -116,9 +99,10 @@ private: * This method implements the pure virtual method defined in \ref ns3::WifiMacHelper. */ virtual Ptr Create (void) const; + void Setup (Ptr mac, enum AccessClass ac, std::string dcaAttrName) const; + ObjectFactory m_mac; - std::map m_queues; std::map m_aggregators; }; diff --git a/src/helper/wifi-helper.cc b/src/helper/wifi-helper.cc index 0b0ebe959..8254f497b 100644 --- a/src/helper/wifi-helper.cc +++ b/src/helper/wifi-helper.cc @@ -46,6 +46,7 @@ WifiMacHelper::~WifiMacHelper () {} WifiHelper::WifiHelper () + : m_standard (WIFI_PHY_STANDARD_80211a) {} WifiHelper @@ -79,6 +80,12 @@ WifiHelper::SetRemoteStationManager (std::string type, m_stationManager.Set (n7, v7); } +void +WifiHelper::SetStandard (enum WifiPhyStandard standard) +{ + m_standard = standard; +} + NetDeviceContainer WifiHelper::Install (const WifiPhyHelper &phyHelper, const WifiMacHelper &macHelper, NodeContainer c) const @@ -92,6 +99,8 @@ WifiHelper::Install (const WifiPhyHelper &phyHelper, Ptr mac = macHelper.Create (); Ptr phy = phyHelper.Create (node, device); mac->SetAddress (Mac48Address::Allocate ()); + mac->ConfigureStandard (m_standard); + phy->ConfigureStandard (m_standard); device->SetMac (mac); device->SetPhy (phy); device->SetRemoteStationManager (manager); diff --git a/src/helper/wifi-helper.h b/src/helper/wifi-helper.h index 04648dfa8..4c2ccfbb8 100644 --- a/src/helper/wifi-helper.h +++ b/src/helper/wifi-helper.h @@ -27,6 +27,7 @@ #include "ns3/object-factory.h" #include "ns3/node-container.h" #include "ns3/net-device-container.h" +#include "ns3/wifi-phy-standard.h" namespace ns3 { @@ -155,6 +156,8 @@ public: NetDeviceContainer Install (const WifiPhyHelper &phy, const WifiMacHelper &mac, std::string nodeName) const; + void SetStandard (enum WifiPhyStandard standard); + /** * Helper to enable all WifiNetDevice log components with one statement */ @@ -162,6 +165,7 @@ public: private: ObjectFactory m_stationManager; + enum WifiPhyStandard m_standard; }; } // namespace ns3