src/helper/qos-wifi-mac-helper.cc
changeset 4720 15221757964f
parent 4408 76a169b3db3d
child 5467 c7aa69502cdd
--- 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;
 }