bug 641: CwMin setting for 802.11b
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Fri, 14 Aug 2009 12:21:39 +0200
changeset 4720 15221757964f
parent 4716 055af17f7225
child 4721 16e0fdcef6f8
bug 641: CwMin setting for 802.11b
bindings/python/ns3_module_helper.py
bindings/python/ns3_module_wifi.py
src/devices/wifi/adhoc-wifi-mac.cc
src/devices/wifi/adhoc-wifi-mac.h
src/devices/wifi/dca-txop.cc
src/devices/wifi/dca-txop.h
src/devices/wifi/edca-txop-n.cc
src/devices/wifi/edca-txop-n.h
src/devices/wifi/nqap-wifi-mac.cc
src/devices/wifi/nqap-wifi-mac.h
src/devices/wifi/nqsta-wifi-mac.cc
src/devices/wifi/nqsta-wifi-mac.h
src/devices/wifi/qadhoc-wifi-mac.cc
src/devices/wifi/qadhoc-wifi-mac.h
src/devices/wifi/qap-wifi-mac.cc
src/devices/wifi/qap-wifi-mac.h
src/devices/wifi/qos-utils.h
src/devices/wifi/qsta-wifi-mac.cc
src/devices/wifi/qsta-wifi-mac.h
src/devices/wifi/wifi-mac.cc
src/devices/wifi/wifi-mac.h
src/devices/wifi/wifi-phy.h
src/devices/wifi/wifi-test.cc
src/devices/wifi/wscript
src/devices/wifi/yans-wifi-phy.cc
src/devices/wifi/yans-wifi-phy.h
src/helper/nqos-wifi-mac-helper.cc
src/helper/nqos-wifi-mac-helper.h
src/helper/qos-wifi-mac-helper.cc
src/helper/qos-wifi-mac-helper.h
src/helper/wifi-helper.cc
src/helper/wifi-helper.h
--- a/bindings/python/ns3_module_helper.py	Thu Aug 13 13:39:23 2009 +0200
+++ b/bindings/python/ns3_module_helper.py	Fri Aug 14 12:21:39 2009 +0200
@@ -1121,6 +1121,10 @@
                    '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 @@
     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::WifiMac> ns3::NqosWifiMacHelper::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
@@ -1339,10 +1339,6 @@
     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::WifiMac> ns3::QosWifiMacHelper::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::WifiMac >', 
--- a/bindings/python/ns3_module_wifi.py	Thu Aug 13 13:39:23 2009 +0200
+++ b/bindings/python/ns3_module_wifi.py	Fri Aug 14 12:21:39 2009 +0200
@@ -2286,10 +2286,15 @@
     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 @@
                    '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::WifiChannel> ns3::WifiPhy::GetChannel() const [member function]
     cls.add_method('GetChannel', 
                    'ns3::Ptr< ns3::WifiChannel >', 
@@ -3160,10 +3170,6 @@
     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 @@
                    '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 @@
                    '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 @@
                    '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 @@
                    '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 @@
                    '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 @@
                    '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 @@
                    '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):
--- a/src/devices/wifi/adhoc-wifi-mac.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/adhoc-wifi-mac.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -46,8 +46,7 @@
     .AddConstructor<AdhocWifiMac> ()
     .AddAttribute ("DcaTxop", "The DcaTxop object",
                    PointerValue (),
-                   MakePointerAccessor (&AdhocWifiMac::GetDcaTxop,
-                                        &AdhocWifiMac::SetDcaTxop),
+                   MakePointerAccessor (&AdhocWifiMac::GetDcaTxop),
                    MakePointerChecker<DcaTxop> ()) 
     ;
   return tid;
@@ -64,6 +63,10 @@
 
   m_dcfManager = new DcfManager ();
   m_dcfManager->SetupLowListener (m_low);
+
+  m_dca = CreateObject<DcaTxop> ();
+  m_dca->SetLow (m_low);
+  m_dca->SetManager (m_dcfManager);
 }
 AdhocWifiMac::~AdhocWifiMac ()
 {}
@@ -251,12 +254,27 @@
   return m_dca;
 }
 
-void
-AdhocWifiMac::SetDcaTxop (Ptr<DcaTxop> 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;
+    }
 }
 
 
--- a/src/devices/wifi/adhoc-wifi-mac.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/adhoc-wifi-mac.h	Fri Aug 14 12:21:39 2009 +0200
@@ -87,7 +87,7 @@
   AdhocWifiMac (const AdhocWifiMac & ctor_arg);
   AdhocWifiMac &operator = (const AdhocWifiMac &o);
   Ptr<DcaTxop> GetDcaTxop(void) const;
-  void SetDcaTxop (Ptr<DcaTxop> dcaTxop);
+  virtual void FinishConfigureStandard (enum WifiPhyStandard standard);
 
   Ptr<DcaTxop> m_dca;
   Callback<void,Ptr<Packet>, Mac48Address, Mac48Address> m_upCallback;
--- a/src/devices/wifi/dca-txop.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/dca-txop.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -101,21 +101,6 @@
   static TypeId tid = TypeId ("ns3::DcaTxop")
     .SetParent<Object> ()
     .AddConstructor<DcaTxop> ()
-    .AddAttribute ("MinCw", "The minimum value of the contention window.",
-                   UintegerValue (15),
-                   MakeUintegerAccessor (&DcaTxop::SetMinCw,
-                                         &DcaTxop::GetMinCw),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("MaxCw", "The maximum value of the contention window.",
-                   UintegerValue (1023),
-                   MakeUintegerAccessor (&DcaTxop::SetMaxCw,
-                                         &DcaTxop::GetMaxCw),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("Aifsn", "The AIFSN: the default value conforms to simple DCA.",
-                   UintegerValue (2),
-                   MakeUintegerAccessor (&DcaTxop::SetAifsn,
-                                         &DcaTxop::GetAifsn),
-                   MakeUintegerChecker<uint32_t> ())
     ;
   return tid;
 }
--- a/src/devices/wifi/dca-txop.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/dca-txop.h	Fri Aug 14 12:21:39 2009 +0200
@@ -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 @@
  * 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 @@
 
   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
--- a/src/devices/wifi/edca-txop-n.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/edca-txop-n.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -98,21 +98,6 @@
   static TypeId tid = TypeId ("ns3::EdcaTxopN")
     .SetParent<Object> ()
     .AddConstructor<EdcaTxopN> ()
-    .AddAttribute ("MinCw", "The minimun value of the contention window.",
-                   UintegerValue (31),
-                   MakeUintegerAccessor (&EdcaTxopN::SetMinCw,
-                                         &EdcaTxopN::GetMinCw),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("MaxCw", "The maximum value of the contention window.",
-                   UintegerValue (1023),
-                   MakeUintegerAccessor (&EdcaTxopN::SetMaxCw,
-                                         &EdcaTxopN::GetMaxCw),
-                   MakeUintegerChecker<uint32_t> ())
-    .AddAttribute ("Aifsn", "The AIFSN: the default value conforms to simple DCA.",
-                   UintegerValue (3),
-                   MakeUintegerAccessor (&EdcaTxopN::SetAifsn,
-                                         &EdcaTxopN::GetAifsn),
-                   MakeUintegerChecker<uint32_t> ())
     ;
   return tid;
 }
--- a/src/devices/wifi/edca-txop-n.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/edca-txop-n.h	Fri Aug 14 12:21:39 2009 +0200
@@ -30,6 +30,7 @@
 #include "wifi-mac.h"
 #include "wifi-mac-header.h"
 #include "qos-utils.h"
+#include "dcf.h"
 
 #include <map>
 #include <list>
@@ -62,7 +63,7 @@
   ADHOC_STA
 };
 
-class EdcaTxopN : public Object
+class EdcaTxopN : public Dcf
 {
 public:
 
@@ -85,12 +86,12 @@
 
   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<MacLow> Low (void);
   Ptr<MsduAggregator> GetMsduAggregator (void) const;
--- a/src/devices/wifi/nqap-wifi-mac.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/nqap-wifi-mac.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -60,8 +60,7 @@
                    MakeBooleanChecker ())
     .AddAttribute ("DcaTxop", "The DcaTxop object",
                    PointerValue (),
-                   MakePointerAccessor (&NqapWifiMac::GetDcaTxop,
-                                        &NqapWifiMac::SetDcaTxop),
+                   MakePointerAccessor (&NqapWifiMac::GetDcaTxop),
                    MakePointerChecker<DcaTxop> ()) 
     ;
   return tid;
@@ -85,6 +84,12 @@
   m_beaconDca->SetMaxCw(0);
   m_beaconDca->SetLow (m_low);
   m_beaconDca->SetManager (m_dcfManager);
+
+  m_dca = CreateObject<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));
 }
 NqapWifiMac::~NqapWifiMac ()
 {
@@ -565,14 +570,28 @@
   return m_dca;
 }
 
-void
-NqapWifiMac::SetDcaTxop (Ptr<DcaTxop> 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
--- a/src/devices/wifi/nqap-wifi-mac.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/nqap-wifi-mac.h	Fri Aug 14 12:21:39 2009 +0200
@@ -115,7 +115,7 @@
   NqapWifiMac (const NqapWifiMac & ctor_arg);
   NqapWifiMac &operator = (const NqapWifiMac &o);
   Ptr<DcaTxop> GetDcaTxop (void) const;
-  void SetDcaTxop (Ptr<DcaTxop> dcaTxop);
+  virtual void FinishConfigureStandard (enum WifiPhyStandard standard);
 
   Ptr<DcaTxop> m_dca;
   Ptr<DcaTxop> m_beaconDca;
--- a/src/devices/wifi/nqsta-wifi-mac.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/nqsta-wifi-mac.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -89,8 +89,7 @@
                    MakeBooleanChecker ())
     .AddAttribute ("DcaTxop", "The DcaTxop object",
                    PointerValue (),
-                   MakePointerAccessor (&NqstaWifiMac::GetDcaTxop,
-                                        &NqstaWifiMac::SetDcaTxop),
+                   MakePointerAccessor (&NqstaWifiMac::GetDcaTxop),
                    MakePointerChecker<DcaTxop> ()) 
     .AddTraceSource ("Assoc", "Associated with an access point.",
                      MakeTraceSourceAccessor (&NqstaWifiMac::m_assocLogger))
@@ -115,6 +114,10 @@
 
   m_dcfManager = new DcfManager ();
   m_dcfManager->SetupLowListener (m_low);
+
+  m_dca = CreateObject<DcaTxop> ();
+  m_dca->SetLow (m_low);
+  m_dca->SetManager (m_dcfManager);
 }
 
 NqstaWifiMac::~NqstaWifiMac ()
@@ -208,13 +211,6 @@
 {
   return m_dca;
 }
-void
-NqstaWifiMac::SetDcaTxop (Ptr<DcaTxop> dcaTxop)
-{
-  m_dca = dcaTxop;
-  m_dca->SetLow (m_low);
-  m_dca->SetManager (m_dcfManager);
-}
 void 
 NqstaWifiMac::SetWifiPhy (Ptr<WifiPhy> phy)
 {
@@ -668,4 +664,27 @@
   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
--- a/src/devices/wifi/nqsta-wifi-mac.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/nqsta-wifi-mac.h	Fri Aug 14 12:21:39 2009 +0200
@@ -139,8 +139,8 @@
   NqstaWifiMac (const NqstaWifiMac & ctor_arg);
   NqstaWifiMac &operator = (const NqstaWifiMac & ctor_arg);
   Ptr<DcaTxop> GetDcaTxop(void) const;
-  void SetDcaTxop (Ptr<DcaTxop> dcaTxop);
   void SetState (enum MacState value);
+  virtual void FinishConfigureStandard (enum WifiPhyStandard standard);
 
   enum MacState m_state;
   Time m_probeRequestTimeout;
--- a/src/devices/wifi/qadhoc-wifi-mac.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/qadhoc-wifi-mac.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -50,26 +50,22 @@
     .AddAttribute ("VO_EdcaTxopN",
                    "Queue that manages packets belonging to AC_VO access class",
                    PointerValue (),
-                   MakePointerAccessor(&QadhocWifiMac::GetVOQueue,
-                                       &QadhocWifiMac::SetVOQueue),
+                   MakePointerAccessor(&QadhocWifiMac::GetVOQueue),
                    MakePointerChecker<EdcaTxopN> ())
     .AddAttribute ("VI_EdcaTxopN",
                    "Queue that manages packets belonging to AC_VI access class",
                    PointerValue (),
-                   MakePointerAccessor(&QadhocWifiMac::GetVIQueue,
-                                       &QadhocWifiMac::SetVIQueue),
+                   MakePointerAccessor(&QadhocWifiMac::GetVIQueue),
                    MakePointerChecker<EdcaTxopN> ())
     .AddAttribute ("BE_EdcaTxopN",
                    "Queue that manages packets belonging to AC_BE access class",
                    PointerValue (),
-                   MakePointerAccessor(&QadhocWifiMac::GetBEQueue,
-                                       &QadhocWifiMac::SetBEQueue),
+                   MakePointerAccessor(&QadhocWifiMac::GetBEQueue),
                    MakePointerChecker<EdcaTxopN> ())
     .AddAttribute ("BK_EdcaTxopN",
                    "Queue that manages packets belonging to AC_BK access class",
                    PointerValue (),
-                   MakePointerAccessor(&QadhocWifiMac::GetBKQueue,
-                                       &QadhocWifiMac::SetBKQueue),
+                   MakePointerAccessor(&QadhocWifiMac::GetBKQueue),
                    MakePointerChecker<EdcaTxopN> ())
     ;
   return tid;
@@ -88,6 +84,11 @@
 
   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 @@
   m_beEdca = 0;
   m_bkEdca = 0;
   m_stationManager = 0;
-  std::map<AccessClass, Ptr<EdcaTxopN> >::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 @@
 {
   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 @@
 Ptr<EdcaTxopN>
 QadhocWifiMac::GetVOQueue (void) const
 {
-  return m_voEdca;
+  return m_queues.find (AC_VO)->second;
 }
 
 Ptr<EdcaTxopN>
 QadhocWifiMac::GetVIQueue (void) const
 {
-  return m_viEdca;
+  return m_queues.find (AC_VI)->second;
 }
 
 Ptr<EdcaTxopN>
 QadhocWifiMac::GetBEQueue (void) const
 {
-  return m_beEdca;
+  return m_queues.find (AC_BE)->second;
 }
 
 Ptr<EdcaTxopN>
 QadhocWifiMac::GetBKQueue (void) const
 {
-  return m_bkEdca;
-}
-
-void
-QadhocWifiMac::SetVOQueue (Ptr<EdcaTxopN> voQueue)
-{
-  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);
+  return m_queues.find (AC_BK)->second;
 }
 
 void
-QadhocWifiMac::SetVIQueue (Ptr<EdcaTxopN> viQueue)
+QadhocWifiMac::SetQueue (enum AccessClass ac)
 {
-  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);
+  Ptr<EdcaTxopN> edca = CreateObject<EdcaTxopN> ();
+  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::SetBEQueue (Ptr<EdcaTxopN> beQueue)
+void 
+QadhocWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard)
 {
-  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<EdcaTxopN> 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
--- a/src/devices/wifi/qadhoc-wifi-mac.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/qadhoc-wifi-mac.h	Fri Aug 14 12:21:39 2009 +0200
@@ -74,6 +74,7 @@
   virtual void SetSsid (Ssid ssid);
   virtual Mac48Address GetBssid (void) const;
 
+
 private:
   Callback<void, Ptr<Packet>, Mac48Address, Mac48Address> m_forwardUp;
   virtual void DoDispose (void);
@@ -92,16 +93,13 @@
   typedef std::list<std::pair<Ptr<Packet>, AmsduSubframeHeader> > DeaggregatedMsdus;
   typedef std::list<std::pair<Ptr<Packet>, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI;
 
+  virtual void FinishConfigureStandard (enum WifiPhyStandard standard);
+  void SetQueue (enum AccessClass ac);
   Ptr<EdcaTxopN> GetVOQueue (void) const;
   Ptr<EdcaTxopN> GetVIQueue (void) const;
   Ptr<EdcaTxopN> GetBEQueue (void) const;
   Ptr<EdcaTxopN> GetBKQueue (void) const;
 
-  void SetVOQueue (Ptr<EdcaTxopN> voQueue);
-  void SetVIQueue (Ptr<EdcaTxopN> viQueue);
-  void SetBEQueue (Ptr<EdcaTxopN> beQueue);
-  void SetBKQueue (Ptr<EdcaTxopN> bkQueue);
-
   Queues m_queues;
   Ptr<EdcaTxopN> m_voEdca;
   Ptr<EdcaTxopN> m_viEdca;
--- a/src/devices/wifi/qap-wifi-mac.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/qap-wifi-mac.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -63,26 +63,22 @@
     .AddAttribute ("VO_EdcaTxopN",
                    "Queue that manages packets belonging to AC_VO access class",
                    PointerValue (),
-                   MakePointerAccessor(&QapWifiMac::GetVOQueue,
-                                       &QapWifiMac::SetVOQueue),
+                   MakePointerAccessor(&QapWifiMac::GetVOQueue),
                    MakePointerChecker<EdcaTxopN> ())
     .AddAttribute ("VI_EdcaTxopN",
                    "Queue that manages packets belonging to AC_VI access class",
                    PointerValue (),
-                   MakePointerAccessor(&QapWifiMac::GetVIQueue,
-                                       &QapWifiMac::SetVIQueue),
+                   MakePointerAccessor(&QapWifiMac::GetVIQueue),
                    MakePointerChecker<EdcaTxopN> ())
     .AddAttribute ("BE_EdcaTxopN",
                    "Queue that manages packets belonging to AC_BE access class",
                    PointerValue (),
-                   MakePointerAccessor(&QapWifiMac::GetBEQueue,
-                                       &QapWifiMac::SetBEQueue),
+                   MakePointerAccessor(&QapWifiMac::GetBEQueue),
                    MakePointerChecker<EdcaTxopN> ())
     .AddAttribute ("BK_EdcaTxopN",
                    "Queue that manages packets belonging to AC_BK access class",
                    PointerValue (),
-                   MakePointerAccessor(&QapWifiMac::GetBKQueue,
-                                       &QapWifiMac::SetBKQueue),
+                   MakePointerAccessor(&QapWifiMac::GetBKQueue),
                    MakePointerChecker<EdcaTxopN> ())
     ;  
   return tid;
@@ -108,6 +104,11 @@
   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 @@
   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<AccessClass, Ptr<EdcaTxopN> >::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 @@
 {
   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 @@
 Ptr<EdcaTxopN>
 QapWifiMac::GetVOQueue (void) const
 {
-  return m_voEdca;
+  return m_queues.find (AC_VO)->second;
 }
 
 Ptr<EdcaTxopN>
 QapWifiMac::GetVIQueue (void) const
 {
-  return m_viEdca;
+  return m_queues.find (AC_VI)->second;
 }
 
 Ptr<EdcaTxopN>
 QapWifiMac::GetBEQueue (void) const
 {
-  return m_beEdca;
+  return m_queues.find (AC_BE)->second;
 }
 
 Ptr<EdcaTxopN>
 QapWifiMac::GetBKQueue (void) const
 {
-  return m_bkEdca;
-}
-
-void
-QapWifiMac::SetVOQueue (Ptr<EdcaTxopN> voQueue)
-{
-  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));
+  return m_queues.find (AC_BK)->second;
 }
 
 void
-QapWifiMac::SetVIQueue (Ptr<EdcaTxopN> viQueue)
+QapWifiMac::SetQueue (enum AccessClass ac)
 {
-  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));
+  Ptr<EdcaTxopN> edca = CreateObject<EdcaTxopN> ();
+  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::SetBEQueue (Ptr<EdcaTxopN> beQueue)
+void 
+QapWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard)
 {
-  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<EdcaTxopN> 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
--- a/src/devices/wifi/qap-wifi-mac.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/qap-wifi-mac.h	Fri Aug 14 12:21:39 2009 +0200
@@ -87,6 +87,10 @@
   void StartBeaconing (void);
 
 private:
+  typedef std::map<AccessClass, Ptr<EdcaTxopN> > Queues;
+  typedef std::list<std::pair<Ptr<Packet>, AmsduSubframeHeader> > DeaggregatedMsdus;
+  typedef std::list<std::pair<Ptr<Packet>, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI;
+  
   virtual void DoDispose (void);
   void Receive (Ptr<Packet> packet, WifiMacHeader const*hdr);
   void ForwardUp (Ptr<Packet> packet, Mac48Address from, Mac48Address to);
@@ -107,28 +111,15 @@
   QapWifiMac &operator = (const QapWifiMac &);
   QapWifiMac (const QapWifiMac &);
 
-  typedef std::map<AccessClass, Ptr<EdcaTxopN> > Queues;
-  typedef std::list<std::pair<Ptr<Packet>, AmsduSubframeHeader> > DeaggregatedMsdus;
-  typedef std::list<std::pair<Ptr<Packet>, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI;
-
-  Callback<void,Ptr<Packet>, Mac48Address, Mac48Address> m_forwardUp;
-  
   Ptr<EdcaTxopN> GetVOQueue (void) const;
   Ptr<EdcaTxopN> GetVIQueue (void) const;
   Ptr<EdcaTxopN> GetBEQueue (void) const;
   Ptr<EdcaTxopN> GetBKQueue (void) const;
-
-  void SetVOQueue (Ptr<EdcaTxopN> voQueue);
-  void SetVIQueue (Ptr<EdcaTxopN> viQueue);
-  void SetBEQueue (Ptr<EdcaTxopN> beQueue);
-  void SetBKQueue (Ptr<EdcaTxopN> bkQueue);
+  void SetQueue (enum AccessClass ac);
 
-  /*Next map is used only for an esay access to a specific queue*/
+  virtual void FinishConfigureStandard (enum WifiPhyStandard standard);
+
   Queues m_queues;
-  Ptr<EdcaTxopN> m_voEdca;
-  Ptr<EdcaTxopN> m_viEdca;
-  Ptr<EdcaTxopN> m_beEdca;
-  Ptr<EdcaTxopN> m_bkEdca;
   Ptr<DcaTxop> m_beaconDca;
   Ptr<MacLow> m_low;
   Ptr<WifiPhy> m_phy;
@@ -139,6 +130,7 @@
   Ssid m_ssid;
   EventId m_beaconEvent;
   Time m_beaconInterval;
+  Callback<void,Ptr<Packet>, Mac48Address, Mac48Address> m_forwardUp;
 };
 
 }  //namespace ns3
--- a/src/devices/wifi/qos-utils.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/qos-utils.h	Fri Aug 14 12:21:39 2009 +0200
@@ -31,6 +31,7 @@
   AC_VI = 1,
   AC_BE = 2,
   AC_BK = 3,
+  AC_BE_NQOS = 4,
   AC_UNDEF
 };
 
--- a/src/devices/wifi/qsta-wifi-mac.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/qsta-wifi-mac.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -69,26 +69,22 @@
     .AddAttribute ("VO_EdcaTxopN",
                    "Queue that manages packets belonging to AC_VO access class",
                    PointerValue (),
-                   MakePointerAccessor(&QstaWifiMac::GetVOQueue,
-                                       &QstaWifiMac::SetVOQueue),
+                   MakePointerAccessor(&QstaWifiMac::GetVOQueue),
                    MakePointerChecker<EdcaTxopN> ())
     .AddAttribute ("VI_EdcaTxopN",
                    "Queue that manages packets belonging to AC_VI access class",
                    PointerValue (),
-                   MakePointerAccessor(&QstaWifiMac::GetVIQueue,
-                                       &QstaWifiMac::SetVIQueue),
+                   MakePointerAccessor(&QstaWifiMac::GetVIQueue),
                    MakePointerChecker<EdcaTxopN> ())
     .AddAttribute ("BE_EdcaTxopN",
                    "Queue that manages packets belonging to AC_BE access class",
                    PointerValue (),
-                   MakePointerAccessor(&QstaWifiMac::GetBEQueue,
-                                       &QstaWifiMac::SetBEQueue),
+                   MakePointerAccessor(&QstaWifiMac::GetBEQueue),
                    MakePointerChecker<EdcaTxopN> ())
     .AddAttribute ("BK_EdcaTxopN",
                    "Queue that manages packets belonging to AC_BK access class",
                    PointerValue (),
-                   MakePointerAccessor(&QstaWifiMac::GetBKQueue,
-                                       &QstaWifiMac::SetBKQueue),
+                   MakePointerAccessor(&QstaWifiMac::GetBKQueue),
                    MakePointerChecker<EdcaTxopN> ())
     ;
   return tid;
@@ -111,6 +107,11 @@
 
   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 @@
   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<AccessClass, Ptr<EdcaTxopN> >::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 @@
 Ptr<EdcaTxopN>
 QstaWifiMac::GetVOQueue (void) const
 {
-  return m_voEdca;
+  return m_queues.find (AC_VO)->second;
 }
 
 Ptr<EdcaTxopN>
 QstaWifiMac::GetVIQueue (void) const
 {
-  return m_viEdca;
+  return m_queues.find (AC_VI)->second;
 }
 
 Ptr<EdcaTxopN>
 QstaWifiMac::GetBEQueue (void) const
 {
-  return m_beEdca;
+  return m_queues.find (AC_BE)->second;
 }
 
 Ptr<EdcaTxopN>
 QstaWifiMac::GetBKQueue (void) const
 {
-  return m_bkEdca;
-}
-
-void
-QstaWifiMac::SetVOQueue (Ptr<EdcaTxopN> voQueue)
-{
-  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);
+  return m_queues.find (AC_BK)->second;
 }
 
 void
-QstaWifiMac::SetVIQueue (Ptr<EdcaTxopN> viQueue)
+QstaWifiMac::SetQueue (enum AccessClass ac)
 {
-  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);
+  Ptr<EdcaTxopN> edca = CreateObject<EdcaTxopN> ();
+  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::SetBEQueue (Ptr<EdcaTxopN> beQueue)
+void 
+QstaWifiMac::FinishConfigureStandard (enum WifiPhyStandard standard)
 {
-  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);
+  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::SetBKQueue (Ptr<EdcaTxopN> 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
--- a/src/devices/wifi/qsta-wifi-mac.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/qsta-wifi-mac.h	Fri Aug 14 12:21:39 2009 +0200
@@ -111,19 +111,15 @@
   */
   void DeaggregateAmsduAndForward (Ptr<Packet> aggregatedPacket, WifiMacHeader const *hdr);
 
+  QstaWifiMac &operator = (const QstaWifiMac &);
+  QstaWifiMac (const QstaWifiMac &);
+  virtual void FinishConfigureStandard (enum WifiPhyStandard standard);
+  void SetQueue (enum AccessClass ac);
   Ptr<EdcaTxopN> GetVOQueue (void) const;
   Ptr<EdcaTxopN> GetVIQueue (void) const;
   Ptr<EdcaTxopN> GetBEQueue (void) const;
   Ptr<EdcaTxopN> GetBKQueue (void) const;
 
-  void SetVOQueue (Ptr<EdcaTxopN> voQueue);
-  void SetVIQueue (Ptr<EdcaTxopN> viQueue);
-  void SetBEQueue (Ptr<EdcaTxopN> beQueue);
-  void SetBKQueue (Ptr<EdcaTxopN> bkQueue);
-
-  QstaWifiMac &operator = (const QstaWifiMac &);
-  QstaWifiMac (const QstaWifiMac &);
-
   typedef std::map<AccessClass, Ptr<EdcaTxopN> > Queues;
   typedef std::list<std::pair<Ptr<Packet>, AmsduSubframeHeader> > DeaggregatedMsdus;
   typedef std::list<std::pair<Ptr<Packet>, AmsduSubframeHeader> >::const_iterator DeaggregatedMsdusCI;
@@ -136,13 +132,7 @@
     REFUSED
   } m_state;
 
-  /*Next map is used only for an esay access to a specific queue*/
   Queues m_queues;
-  Ptr<EdcaTxopN> m_voEdca;
-  Ptr<EdcaTxopN> m_viEdca;
-  Ptr<EdcaTxopN> m_beEdca;
-  Ptr<EdcaTxopN> m_bkEdca;
-
   Ptr<MacLow> m_low;
   Ptr<WifiPhy> m_phy;
   Ptr<WifiRemoteStationManager> m_stationManager;
--- a/src/devices/wifi/wifi-mac.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/wifi-mac.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -18,6 +18,7 @@
  * Author: Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
  */
 #include "wifi-mac.h"
+#include "dcf.h"
 #include "ns3/uinteger.h"
 #include "ns3/trace-source-accessor.h"
 
@@ -117,14 +118,6 @@
 		   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 @@
 }
 
 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 @@
     NS_ASSERT (false);
     break;
   }
+  FinishConfigureStandard (standard);
 }
 
 void
@@ -278,4 +271,41 @@
   SetAckTimeout(MicroSeconds(64+176+21+GetDefaultMaxPropagationDelay().GetMicroSeconds ()*2)); 
 }
 
+void
+WifiMac::ConfigureDcf (Ptr<Dcf> 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
--- a/src/devices/wifi/wifi-mac.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/wifi-mac.h	Fri Aug 14 12:21:39 2009 +0200
@@ -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 @@
   /**
    * \param standard the wifi standard to be configured
    */
-  void SetStandard (enum WifiPhyStandard standard);
+  void ConfigureStandard (enum WifiPhyStandard standard);
 
+protected:
+  void ConfigureDcf (Ptr<Dcf> dcf, uint32_t cwmin, uint32_t cwmax, enum AccessClass ac);
 private:
   static Time GetDefaultMaxPropagationDelay (void);
   static Time GetDefaultSlot (void);
@@ -218,10 +223,18 @@
   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);
--- a/src/devices/wifi/wifi-phy.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/wifi-phy.h	Fri Aug 14 12:21:39 2009 +0200
@@ -253,6 +253,8 @@
   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<WifiChannel> GetChannel (void) const = 0;
 
--- a/src/devices/wifi/wifi-test.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/wifi-test.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -71,9 +71,8 @@
   Ptr<Node> node = CreateObject<Node> ();
   Ptr<WifiNetDevice> dev = CreateObject<WifiNetDevice> ();
 
-  Ptr<DcaTxop> queue = CreateObject<DcaTxop> ();
   Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
-  mac->SetAttribute("DcaTxop", PointerValue (queue));
+  mac->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
   Ptr<ConstantPositionMobilityModel> mobility = CreateObject<ConstantPositionMobilityModel> ();
   Ptr<YansWifiPhy> phy = CreateObject<YansWifiPhy> ();
   Ptr<ErrorRateModel> error = CreateObject<YansErrorRateModel> ();
@@ -81,6 +80,7 @@
   phy->SetChannel (channel);
   phy->SetDevice (dev);
   phy->SetMobility (node);
+  phy->ConfigureStandard (WIFI_PHY_STANDARD_80211a);
   Ptr<WifiRemoteStationManager> manager = m_manager.Create<WifiRemoteStationManager> ();
 
   mobility->SetPosition (pos);
--- a/src/devices/wifi/wscript	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/wscript	Fri Aug 14 12:21:39 2009 +0200
@@ -64,6 +64,7 @@
         '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 @@
         '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']:
--- a/src/devices/wifi/yans-wifi-phy.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/yans-wifi-phy.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -105,15 +105,6 @@
                    MakeDoubleAccessor (&YansWifiPhy::SetRxNoiseFigure,
                                        &YansWifiPhy::GetRxNoiseFigure),
                    MakeDoubleChecker<double> ())
-    .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 @@
 }
 
 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 ();
--- a/src/devices/wifi/yans-wifi-phy.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/devices/wifi/yans-wifi-phy.h	Fri Aug 14 12:21:39 2009 +0200
@@ -89,7 +89,6 @@
                            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 @@
   virtual WifiMode GetMode (uint32_t mode) const;
   virtual double CalculateSnr (WifiMode txMode, double ber) const;
   virtual Ptr<WifiChannel> GetChannel (void) const;
+  virtual void ConfigureStandard (enum WifiPhyStandard standard);
 
 private:
   typedef std::vector<WifiMode> Modes;
@@ -170,7 +170,6 @@
   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<WifiPhyStateHelper> m_state;
--- a/src/helper/nqos-wifi-mac-helper.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/helper/nqos-wifi-mac-helper.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -25,9 +25,7 @@
 namespace ns3 {
 
 NqosWifiMacHelper::NqosWifiMacHelper ()
-{
-  m_queue.SetTypeId ("ns3::DcaTxop");
-}
+{}
 
 NqosWifiMacHelper::~NqosWifiMacHelper ()
 {}
@@ -62,24 +60,10 @@
   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<WifiMac>
 NqosWifiMacHelper::Create (void) const
 {
   Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
-  Ptr<DcaTxop> queue = m_queue.Create<DcaTxop> ();
-  mac->SetAttribute ("DcaTxop", PointerValue (queue));
   return mac;
 }
 
--- a/src/helper/nqos-wifi-mac-helper.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/helper/nqos-wifi-mac-helper.h	Fri Aug 14 12:21:39 2009 +0200
@@ -69,20 +69,6 @@
                 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 @@
   virtual Ptr<WifiMac> Create (void) const;
 
   ObjectFactory m_mac;
-  ObjectFactory m_queue;
 };
 
 } //namespace ns3
--- a/src/helper/qos-wifi-mac-helper.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/helper/qos-wifi-mac-helper.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -28,20 +28,12 @@
 
 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 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 @@
 }
 
 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<WifiMac> mac, enum AccessClass ac, std::string dcaAttrName) const
 {
-  std::map<AccessClass, ObjectFactory>::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<EdcaTxopN> edca = ptr.Get<EdcaTxopN> ();
+  Ptr<MsduAggregator> aggregator = factory.Create<MsduAggregator> ();
+  edca->SetMsduAggregator (aggregator);
 }
 
+
 Ptr<WifiMac>
 QosWifiMacHelper::Create (void) const
 {
   Ptr<WifiMac> mac = m_mac.Create<WifiMac> ();
   
-  Ptr<EdcaTxopN> edcaQueue;
-  Ptr<MsduAggregator> aggregator;
-  std::map<AccessClass, ObjectFactory>::const_iterator itQueue;
-  std::map<AccessClass, ObjectFactory>::const_iterator itAggr;
-
-  /* Setting for VO queue */
-  itQueue = m_queues.find (AC_VO);
-  itAggr = m_aggregators.find (AC_VO);
-
-  edcaQueue = itQueue->second.Create<EdcaTxopN> ();
-  if (itAggr->second.GetTypeId ().GetUid () != 0)
-    {
-      aggregator = itAggr->second.Create<MsduAggregator> ();
-      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<EdcaTxopN> ();
-  if (itAggr->second.GetTypeId ().GetUid () != 0)
-    {
-      aggregator = itAggr->second.Create<MsduAggregator> ();
-      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<EdcaTxopN> ();
-  if (itAggr->second.GetTypeId ().GetUid () != 0)
-    {
-      aggregator = itAggr->second.Create<MsduAggregator> ();
-      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<EdcaTxopN> ();
-  if (itAggr->second.GetTypeId ().GetUid () != 0)
-    {
-      aggregator = itAggr->second.Create<MsduAggregator> ();
-      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;
 }
--- a/src/helper/qos-wifi-mac-helper.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/helper/qos-wifi-mac-helper.h	Fri Aug 14 12:21:39 2009 +0200
@@ -92,23 +92,6 @@
                                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 @@
    * This method implements the pure virtual method defined in \ref ns3::WifiMacHelper.
    */
   virtual Ptr<WifiMac> Create (void) const;
+  void Setup (Ptr<WifiMac> mac, enum AccessClass ac, std::string dcaAttrName) const;
+
 
   ObjectFactory m_mac;
-  std::map<AccessClass, ObjectFactory> m_queues;
   std::map<AccessClass, ObjectFactory> m_aggregators;
 };
 
--- a/src/helper/wifi-helper.cc	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/helper/wifi-helper.cc	Fri Aug 14 12:21:39 2009 +0200
@@ -46,6 +46,7 @@
 {}
 
 WifiHelper::WifiHelper ()
+  : m_standard (WIFI_PHY_STANDARD_80211a)
 {}
 
 WifiHelper
@@ -79,6 +80,12 @@
   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 @@
       Ptr<WifiMac> mac = macHelper.Create ();
       Ptr<WifiPhy> 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);
--- a/src/helper/wifi-helper.h	Thu Aug 13 13:39:23 2009 +0200
+++ b/src/helper/wifi-helper.h	Fri Aug 14 12:21:39 2009 +0200
@@ -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 @@
   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 @@
 
 private:
   ObjectFactory m_stationManager;
+  enum WifiPhyStandard m_standard;
 };
 
 } // namespace ns3