Added interface helper
authorKirill Andreev <andreev@iitp.ru>
Tue, 09 Jun 2009 20:13:11 +0400
changeset 5054 49851228eec9
parent 5053 87648432f1ca
child 5055 903fb7d81b97
Added interface helper
examples/mesh.cc
src/devices/mesh/dot11s/dot11s-helper.cc
src/devices/mesh/dot11s/dot11s-helper.h
src/devices/mesh/dot11s/dot11s-interface-helper.cc
src/devices/mesh/dot11s/dot11s-interface-helper.h
src/devices/mesh/dot11s/hwmp-protocol.cc
src/devices/mesh/dot11s/wscript
src/devices/mesh/mesh-wifi-interface-mac.cc
src/devices/mesh/mesh-wifi-interface-mac.h
--- a/examples/mesh.cc	Mon Jun 08 16:30:52 2009 +0400
+++ b/examples/mesh.cc	Tue Jun 09 20:13:11 2009 +0400
@@ -28,6 +28,7 @@
 #include "ns3/mesh-module.h"
 #include "ns3/mobility-module.h"
 #include "ns3/dot11s-helper.h"
+#include "ns3/dot11s-interface-helper.h"
 
 #include <iostream>
 #include <sstream>
@@ -123,9 +124,12 @@
   MeshWifiHelper mesh;
   mesh.SetSpreadInterfaceChannels (chan);
   std::vector<uint32_t> roots;
-  //roots.push_back(xSize-1);
-  //roots.push_back(xSize*ySize-xSize);
-  meshDevices = mesh.Install (wifiPhy, nodes, roots, nIfaces);
+  roots.push_back(xSize-1);
+  roots.push_back(xSize*ySize-xSize);
+  MeshInterfaceHelper interface = MeshInterfaceHelper::Default ();
+  interface.SetType ("RandomStart", TimeValue (Seconds(randomStart)));
+
+  meshDevices = mesh.Install (wifiPhy, interface, nodes, roots, nIfaces);
   // Setup mobility
   MobilityHelper mobility;
   mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
--- a/src/devices/mesh/dot11s/dot11s-helper.cc	Mon Jun 08 16:30:52 2009 +0400
+++ b/src/devices/mesh/dot11s/dot11s-helper.cc	Tue Jun 09 20:13:11 2009 +0400
@@ -18,66 +18,24 @@
  * Author: Kirill Andreev <andreev@iitp.ru>
  *         Pavel Boyko <boyko@iitp.ru>
  */
-
-
 #include "dot11s-helper.h"
 #include "ns3/simulator.h"
 #include "ns3/mesh-point-device.h"
 #include "ns3/wifi-net-device.h"
-#include "ns3/wifi-phy.h"
-#include "ns3/wifi-channel.h"
-#include "ns3/wifi-remote-station-manager.h"
-#include "ns3/mesh-wifi-interface-mac.h"
-#include "ns3/aarf-wifi-manager.h"
-#include "airtime-metric.h"
 namespace ns3 {
 namespace dot11s {
 
 MeshWifiHelper::MeshWifiHelper () : 
-    m_randomStartDelay (Seconds (0)),
     m_spreadInterfaceChannels (false)
 {
 }
 void 
-MeshWifiHelper::SetRandomStartDelay (Time t)
-{
-  m_randomStartDelay = t;
-}
-
-void 
 MeshWifiHelper::SetSpreadInterfaceChannels (bool s)
 {
   m_spreadInterfaceChannels = s;
 }
-
-
-Ptr<WifiNetDevice> 
-MeshWifiHelper::CreateInterface (const WifiPhyHelper &phyHelper, Ptr<Node> node) const
-{
-  Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
-  
-  // Creating MAC for this interface
-  Ptr<MeshWifiInterfaceMac> mac = CreateObject<MeshWifiInterfaceMac> ();
-  mac->SetSsid (Ssid ());
-  if (m_randomStartDelay > Seconds (0))
-    mac->SetRandomStartDelay (m_randomStartDelay);
-  Ptr<WifiRemoteStationManager> manager = CreateObject<AarfWifiManager> ();
-  Ptr<WifiPhy> phy = phyHelper.Create (node, device);
-  mac->SetAddress (Mac48Address::Allocate ());
-  device->SetMac (mac);
-  device->SetPhy (phy);
-  device->SetRemoteStationManager (manager);
-  Ptr<AirtimeLinkMetricCalculator> metric = CreateObject <AirtimeLinkMetricCalculator> ();
-  mac->SetLinkMetricCallback (MakeCallback(&AirtimeLinkMetricCalculator::CalculateMetric, metric));
-  /*
-  if (channel > 0)
-    mac->SwitchFrequencyChannel (channel);
-  */
-  return device;
-}
-  
 NetDeviceContainer
-MeshWifiHelper::Install (const WifiPhyHelper &phyHelper, NodeContainer c,  std::vector<uint32_t> roots, uint32_t nInterfaces) const
+MeshWifiHelper::Install (const WifiPhyHelper &phyHelper, const MeshInterfaceHelper &interfaceHelper, NodeContainer c,  std::vector<uint32_t> roots, uint32_t nInterfaces) const
 {
   NetDeviceContainer devices;
   uint32_t node_index = 0;
@@ -92,29 +50,10 @@
     // Create wifi interfaces (single interface by default)
     for (uint32_t i = 0; i < nInterfaces; ++i)
       {
-        Ptr<WifiNetDevice> iface = CreateInterface (phyHelper, node);
-        
-        node->AddDevice (iface);
+        uint32_t channel = i * 5;
+        Ptr<WifiNetDevice> iface = interfaceHelper.CreateInterface (phyHelper,node, (m_spreadInterfaceChannels ? channel : 0));
         mp->AddInterface (iface);
       }
-    
-    // Set different channels on different ifaces
-    if (m_spreadInterfaceChannels)
-      {
-        std::vector<Ptr<NetDevice> > ifaces = mp->GetInterfaces ();
-        for (size_t i = 0; i < ifaces.size(); ++i)
-          {
-            uint32_t channel = i * 5;
-            
-            Ptr<WifiNetDevice> iface = ifaces[i]->GetObject<WifiNetDevice> ();
-            NS_ASSERT (iface);
-            Ptr<MeshWifiInterfaceMac> mac = iface->GetMac ()->GetObject<MeshWifiInterfaceMac> ();
-            NS_ASSERT (mac);
-            
-            mac->SwitchFrequencyChannel (channel);
-          }
-      }
-    
     // Install 802.11s protocols
     Ptr<PeerManagementProtocol> pmp = CreateObject<PeerManagementProtocol> ();
     pmp->SetMeshId("mesh");
@@ -139,9 +78,9 @@
 }
 
 NetDeviceContainer
-MeshWifiHelper::Install (const WifiPhyHelper &phy, Ptr<Node> node,  std::vector<uint32_t> roots, uint32_t nInterfaces) const
+MeshWifiHelper::Install (const WifiPhyHelper &phy, const MeshInterfaceHelper &interfaceHelper, Ptr<Node> node,  std::vector<uint32_t> roots, uint32_t nInterfaces) const
 {
-  return Install (phy, NodeContainer (node), roots, nInterfaces);
+  return Install (phy, interfaceHelper, NodeContainer (node), roots, nInterfaces);
 }
 void
 MeshWifiHelper::Report (const ns3::Ptr<ns3::NetDevice>& device, std::ostream& os)
@@ -154,9 +93,7 @@
   {
     Ptr<WifiNetDevice> device = (*i)->GetObject<WifiNetDevice> ();
     NS_ASSERT (device != 0);
-    Ptr<MeshWifiInterfaceMac> mac = device->GetMac()->GetObject<MeshWifiInterfaceMac> ();
-    NS_ASSERT (mac != 0);
-    mac->Report(os);
+    MeshInterfaceHelper::Report(device, os);
   }
   Ptr <HwmpProtocol> hwmp = mp->GetObject<HwmpProtocol> ();
   NS_ASSERT(hwmp != 0);
@@ -177,9 +114,7 @@
   {
     Ptr<WifiNetDevice> device = (*i)->GetObject<WifiNetDevice> ();
     NS_ASSERT (device != 0);
-    Ptr<MeshWifiInterfaceMac> mac = device->GetMac()->GetObject<MeshWifiInterfaceMac> ();
-    NS_ASSERT (mac != 0);
-    mac->ResetStats ();
+    MeshInterfaceHelper::ResetStats (device);
   }
   Ptr <HwmpProtocol> hwmp = mp->GetObject<HwmpProtocol> ();
   NS_ASSERT(hwmp != 0);
--- a/src/devices/mesh/dot11s/dot11s-helper.h	Mon Jun 08 16:30:52 2009 +0400
+++ b/src/devices/mesh/dot11s/dot11s-helper.h	Tue Jun 09 20:13:11 2009 +0400
@@ -28,6 +28,7 @@
 #include "ns3/peer-management-protocol.h"
 #include "ns3/hwmp-protocol.h"
 #include "ie-dot11s-id.h"
+#include "ns3/dot11s-interface-helper.h"
 
 namespace ns3 {
 namespace dot11s {
@@ -43,8 +44,6 @@
 {
 public:
   MeshWifiHelper (); 
-  /// Set maximum random start delay
-  void SetRandomStartDelay (Time delay);
   /** 
    *  \brief Spread/not spread frequency channels of MP interfaces. 
    * 
@@ -63,7 +62,7 @@
    * 
    * \return list of created mesh point devices, see MeshPointDevice
    */
-  NetDeviceContainer Install (const WifiPhyHelper &phyHelper, NodeContainer c, std::vector<uint32_t> roots = std::vector<uint32_t> (), uint32_t nInterfaces = 1) const;
+  NetDeviceContainer Install (const WifiPhyHelper &phyHelper, const MeshInterfaceHelper &interfaceHelper, NodeContainer c, std::vector<uint32_t> roots = std::vector<uint32_t> (), uint32_t nInterfaces = 1) const;
   /** 
    * \brief Install 802.11s mesh device & protocols on given node
    * 
@@ -74,16 +73,11 @@
    * 
    * \return list of created mesh point devices, see MeshPointDevice
    */ 
-  NetDeviceContainer Install (const WifiPhyHelper &phy, Ptr<Node> node,  std::vector<uint32_t> roots = std::vector<uint32_t> (), uint32_t nInterfaces = 1) const;
+  NetDeviceContainer Install (const WifiPhyHelper &phy, const MeshInterfaceHelper &interfaceHelper, Ptr<Node> node,  std::vector<uint32_t> roots = std::vector<uint32_t> (), uint32_t nInterfaces = 1) const;
   static void Report (const ns3::Ptr<ns3::NetDevice>&, std::ostream&);
   static void ResetStats (const ns3::Ptr<ns3::NetDevice>&);
 private:
-  Time m_randomStartDelay;
   bool m_spreadInterfaceChannels;
-  
-  /// Create single mesh interface NIC
-  Ptr<WifiNetDevice> CreateInterface (const WifiPhyHelper &phyHelper, Ptr<Node> node) const;
-  
 };
 } // namespace dot11s
 } //namespace ns3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/mesh/dot11s/dot11s-interface-helper.cc	Tue Jun 09 20:13:11 2009 +0400
@@ -0,0 +1,162 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008,2009 IITP RAS
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Kirill Andreev <andreev@iitp.ru>
+ */
+
+
+#include "dot11s-interface-helper.h"
+#include "ns3/wifi-mac.h"
+#include "ns3/pointer.h"
+#include "ns3/dca-txop.h"
+#include "ns3/wifi-remote-station-manager.h"
+namespace ns3 {
+
+MeshInterfaceHelper::MeshInterfaceHelper ()
+{
+  m_Be.SetTypeId ("ns3::DcaTxop");
+  m_Vo.SetTypeId ("ns3::DcaTxop");
+}
+
+MeshInterfaceHelper::~MeshInterfaceHelper ()
+{}
+
+MeshInterfaceHelper
+MeshInterfaceHelper::Default (void)
+{
+  MeshInterfaceHelper helper;
+  helper.SetType ();
+  helper.SetBeParameters (
+      "MinCw", UintegerValue (15),
+      "MaxCw", UintegerValue (255),
+      "Aifsn", UintegerValue (2));
+  helper.SetVoParameters (
+      "MinCw", UintegerValue (3),
+      "MaxCw", UintegerValue (7),
+      "Aifsn", UintegerValue (2));
+  helper.SetRemoteStationManager ("ns3::ArfWifiManager");
+  return helper;
+}
+
+void
+MeshInterfaceHelper::SetType (std::string n0, const AttributeValue &v0,
+                              std::string n1, const AttributeValue &v1,
+                              std::string n2, const AttributeValue &v2,
+                              std::string n3, const AttributeValue &v3,
+                              std::string n4, const AttributeValue &v4,
+                              std::string n5, const AttributeValue &v5,
+                              std::string n6, const AttributeValue &v6,
+                              std::string n7, const AttributeValue &v7)
+{
+  m_mac.SetTypeId ("ns3::MeshWifiInterfaceMac");
+  m_mac.Set (n0, v0);
+  m_mac.Set (n1, v1);
+  m_mac.Set (n2, v2);
+  m_mac.Set (n3, v3);
+  m_mac.Set (n4, v4);
+  m_mac.Set (n5, v5);
+  m_mac.Set (n6, v6);
+  m_mac.Set (n7, v7);
+}
+void
+MeshInterfaceHelper::SetBeParameters (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_Be.Set (n0, v0);
+  m_Be.Set (n1, v1);
+  m_Be.Set (n2, v2);
+  m_Be.Set (n3, v3);
+}
+void
+MeshInterfaceHelper::SetVoParameters (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_Vo.Set (n0, v0);
+  m_Vo.Set (n1, v1);
+  m_Vo.Set (n2, v2);
+  m_Vo.Set (n3, v3);
+}
+void 
+MeshInterfaceHelper::SetRemoteStationManager (std::string type,
+                                     std::string n0, const AttributeValue &v0,
+                                     std::string n1, const AttributeValue &v1,
+                                     std::string n2, const AttributeValue &v2,
+                                     std::string n3, const AttributeValue &v3,
+                                     std::string n4, const AttributeValue &v4,
+                                     std::string n5, const AttributeValue &v5,
+                                     std::string n6, const AttributeValue &v6,
+                                     std::string n7, const AttributeValue &v7)
+{
+  m_stationManager = ObjectFactory ();
+  m_stationManager.SetTypeId (type);
+  m_stationManager.Set (n0, v0);
+  m_stationManager.Set (n1, v1);
+  m_stationManager.Set (n2, v2);
+  m_stationManager.Set (n3, v3);
+  m_stationManager.Set (n4, v4);
+  m_stationManager.Set (n5, v5);
+  m_stationManager.Set (n6, v6);
+  m_stationManager.Set (n7, v7);
+}
+Ptr<WifiNetDevice>
+MeshInterfaceHelper::CreateInterface (const WifiPhyHelper &phyHelper, Ptr<Node> node, uint16_t channelId) const
+{
+  Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
+  
+  Ptr<MeshWifiInterfaceMac> mac = Create ();
+  mac->SetSsid (Ssid ());
+  Ptr<WifiRemoteStationManager> manager = m_stationManager.Create<WifiRemoteStationManager> ();
+  Ptr<WifiPhy> phy = phyHelper.Create (node, device);
+  mac->SetAddress (Mac48Address::Allocate ());
+  device->SetMac (mac);
+  device->SetPhy (phy);
+  device->SetRemoteStationManager (manager);
+  node->AddDevice (device);
+  mac->SwitchFrequencyChannel (channelId);
+  return device;
+}
+Ptr<MeshWifiInterfaceMac>
+MeshInterfaceHelper::Create (void) const
+{
+  Ptr<MeshWifiInterfaceMac> mac = m_mac.Create<MeshWifiInterfaceMac> ();
+  Ptr<DcaTxop> be = m_Be.Create<DcaTxop> ();
+  Ptr<DcaTxop> vo = m_Vo.Create<DcaTxop> ();
+  mac->SetAttribute ("BE", PointerValue (be));
+  mac->SetAttribute ("VO", PointerValue (vo));
+  return mac;
+}
+void
+MeshInterfaceHelper::Report (const Ptr<WifiNetDevice>& device, std::ostream& os)
+{
+  Ptr<MeshWifiInterfaceMac> mac = device->GetMac()->GetObject<MeshWifiInterfaceMac> ();
+  NS_ASSERT (mac != 0);
+  mac->Report(os);
+}
+void
+MeshInterfaceHelper::ResetStats (const Ptr<WifiNetDevice>& device)
+{
+  Ptr<MeshWifiInterfaceMac> mac = device->GetMac()->GetObject<MeshWifiInterfaceMac> ();
+  NS_ASSERT (mac != 0);
+  mac->ResetStats ();
+}
+
+} //namespace ns3
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/devices/mesh/dot11s/dot11s-interface-helper.h	Tue Jun 09 20:13:11 2009 +0400
@@ -0,0 +1,114 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 IITP RAS
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Kirill Andreev <andreev@iitp.ru>
+ */
+
+#ifndef MESH_INTERFACE_HELPER_H
+#define MESH_INTERFACE_HELPER_H
+#include "ns3/wifi-helper.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/mesh-wifi-interface-mac.h"
+namespace ns3 {
+
+class MeshInterfaceHelper
+{
+public:
+  MeshInterfaceHelper ();
+  virtual ~MeshInterfaceHelper ();
+  /**
+   * Create a mac helper in a default working state.
+   */
+  static MeshInterfaceHelper Default (void);
+  /**
+   * \param type the type of ns3::WifiMac to create.
+   * \param n%d the name of the attribute to set
+   * \param v%d the value of the attribute to set
+   *
+   * All the attributes specified in this method should exist
+   * in the requested mac.
+   */
+  void SetType (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 (),
+                std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
+                std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
+                std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
+                std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
+  /**
+   * \param type the type of ns3::WifiMac to create.
+   * \param n%d the name of the attribute to set
+   * \param v%d the value of the attribute to set
+   */
+  void SetBeParameters ( 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 ());
+  /**
+   * \param type the type of ns3::WifiMac to create.
+   * \param n%d the name of the attribute to set
+   * \param v%d the value of the attribute to set
+   */
+  void SetVoParameters ( 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 ());
+  /**
+   * \param type the type of ns3::WifiRemoteStationManager to create.
+   * \param n%d the name of the attribute to set
+   * \param v%d the value of the attribute to set
+   *
+   * All the attributes specified in this method should exist
+   * in the requested station manager.
+   */
+  void SetRemoteStationManager (std::string type,
+                                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 (),
+                                std::string n4 = "", const AttributeValue &v4 = EmptyAttributeValue (),
+                                std::string n5 = "", const AttributeValue &v5 = EmptyAttributeValue (),
+                                std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
+                                std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ());
+  void SetMeshId (std::string s);
+  /**
+   * \returns a WifiNetDevice with ready-to-use interface
+   */
+  Ptr<WifiNetDevice> CreateInterface (const WifiPhyHelper &phyHelper, Ptr<Node> node, uint16_t channelId) const;
+  /**
+   * \brief Report statistics:
+   */
+  static void Report (const Ptr<WifiNetDevice>& device, std::ostream& os);
+  static void ResetStats (const Ptr<WifiNetDevice>& device);
+private:
+  /**
+   * \returns a newly-created MAC object.
+   *
+   * This method implements the pure virtual method defined in \ref ns3::WifiMacHelper.
+   */
+  Ptr<MeshWifiInterfaceMac> Create (void) const;
+
+  ObjectFactory m_mac;
+  ObjectFactory m_Be;
+  ObjectFactory m_Vo;
+  ObjectFactory m_stationManager;
+};
+
+} //namespace ns3
+
+#endif /* MESH_INTERFACE_HELPER */
--- a/src/devices/mesh/dot11s/hwmp-protocol.cc	Mon Jun 08 16:30:52 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-protocol.cc	Tue Jun 09 20:13:11 2009 +0400
@@ -31,6 +31,7 @@
 #include "ns3/mesh-point-device.h"
 #include "ns3/mesh-wifi-interface-mac.h"
 #include "ns3/random-variable.h"
+#include "airtime-metric.h"
 #include "ie-dot11s-preq.h"
 #include "ie-dot11s-prep.h"
 #include "ie-dot11s-perr.h"
@@ -613,6 +614,9 @@
       Ptr<HwmpMacPlugin> hwmpMac = Create<HwmpMacPlugin> (wifiNetDev->GetIfIndex (), this);
       m_interfaces[wifiNetDev->GetIfIndex ()] = hwmpMac;
       mac->InstallPlugin (hwmpMac);
+      //Installing airtime link metric:
+      Ptr<AirtimeLinkMetricCalculator> metric = CreateObject <AirtimeLinkMetricCalculator> ();
+      mac->SetLinkMetricCallback (MakeCallback(&AirtimeLinkMetricCalculator::CalculateMetric, metric));
     }
   mp->SetRoutingProtocol (this);
   // Mesh point aggregates all installed protocols
--- a/src/devices/mesh/dot11s/wscript	Mon Jun 08 16:30:52 2009 +0400
+++ b/src/devices/mesh/dot11s/wscript	Tue Jun 09 20:13:11 2009 +0400
@@ -23,6 +23,7 @@
         'hwmp-mac-plugin.cc',
         'hwmp-protocol.cc',
         'airtime-metric.cc',
+        'dot11s-interface-helper.cc',
         'dot11s-helper.cc',
         ]
     headers = bld.new_task_gen('ns3header')
@@ -35,5 +36,6 @@
         'ie-dot11s-perr.h',
         'hwmp-protocol.h',
         'dot11s-helper.h',
+        'dot11s-interface-helper.h',
         'dot11s-mac-header.h',
         ]
--- a/src/devices/mesh/mesh-wifi-interface-mac.cc	Mon Jun 08 16:30:52 2009 +0400
+++ b/src/devices/mesh/mesh-wifi-interface-mac.cc	Tue Jun 09 20:13:11 2009 +0400
@@ -30,6 +30,8 @@
 #include "ns3/random-variable.h"
 #include "ns3/simulator.h"
 #include "ns3/yans-wifi-phy.h"
+#include "ns3/pointer.h"
+
 
 NS_LOG_COMPONENT_DEFINE ("MeshWifiInterfaceMac");
 
@@ -60,7 +62,18 @@
           &MeshWifiInterfaceMac::GetBeaconGeneration
           ),
         MakeBooleanChecker ()
-        );
+        )
+        
+    .AddAttribute ("BE", "The DcaTxop object",
+                   PointerValue (),
+                   MakePointerAccessor (&MeshWifiInterfaceMac::GetBE,
+                                        &MeshWifiInterfaceMac::SetBE),
+                   MakePointerChecker<DcaTxop> ())
+    .AddAttribute ("VO", "The DcaTxop object",
+                   PointerValue (),
+                   MakePointerAccessor (&MeshWifiInterfaceMac::GetVO,
+                                        &MeshWifiInterfaceMac::SetVO),
+                   MakePointerChecker<DcaTxop> ());
   return tid;
 }
 
@@ -83,7 +96,7 @@
   m_beaconDca->SetMaxCw (0);
   m_beaconDca->SetAifsn (1);
   m_beaconDca->SetManager (m_dcfManager);
-
+# if 0
   m_VO = CreateObject<DcaTxop> ();
   m_VO->SetLow (m_low);
   m_VO->SetMinCw (3);
@@ -93,6 +106,7 @@
   m_BE = CreateObject<DcaTxop> ();
   m_BE->SetLow (m_low);
   m_BE->SetManager (m_dcfManager);
+#endif
 }
 
 MeshWifiInterfaceMac::~MeshWifiInterfaceMac ()
@@ -198,7 +212,9 @@
 {
   NS_LOG_FUNCTION (this << stationManager);
   m_stationManager = stationManager;
+  NS_ASSERT(m_BE != 0);
   m_BE->SetWifiRemoteStationManager (stationManager);
+  NS_ASSERT(m_VO != 0);
   m_VO->SetWifiRemoteStationManager (stationManager);
   m_beaconDca->SetWifiRemoteStationManager (stationManager);
   m_low->SetWifiRemoteStationManager (stationManager);
@@ -666,5 +682,29 @@
 {
   m_stats = Statistics::Statistics ();
 }
+void
+MeshWifiInterfaceMac::SetBE (Ptr<DcaTxop> dcaTxop)
+{
+  m_BE = dcaTxop;
+  m_BE->SetLow (m_low);
+  m_BE->SetManager (m_dcfManager);
+}
+void
+MeshWifiInterfaceMac::SetVO (Ptr<DcaTxop> dcaTxop)
+{
+  m_VO = dcaTxop;
+  m_VO->SetLow (m_low);
+  m_VO->SetManager (m_dcfManager);
+}
+Ptr<DcaTxop>
+MeshWifiInterfaceMac::GetBE () const
+{
+  return m_BE;
+}
+Ptr<DcaTxop>
+MeshWifiInterfaceMac::GetVO () const
+{
+  return m_VO;
+}
 } // namespace ns3
 
--- a/src/devices/mesh/mesh-wifi-interface-mac.h	Mon Jun 08 16:30:52 2009 +0400
+++ b/src/devices/mesh/mesh-wifi-interface-mac.h	Tue Jun 09 20:13:11 2009 +0400
@@ -159,6 +159,10 @@
   void Report (std::ostream &) const;
   void ResetStats ();
 private:
+  Ptr<DcaTxop> GetBE(void) const;
+  void SetBE (Ptr<DcaTxop> dcaTxop);
+  Ptr<DcaTxop> GetVO(void) const;
+  void SetVO (Ptr<DcaTxop> dcaTxop);
   /// Frame receive handler
   void  Receive (Ptr<Packet> packet, WifiMacHeader const *hdr);
   /// Forward frame to mesh point