HWMP is attached to mesh point device and MAC layer with zero functionality
authorKirill Andreev <andreev@iitp.ru>
Thu, 26 Mar 2009 14:00:46 +0300
changeset 4887 cbf02c77d5c1
parent 4886 bdbf21835837
child 4888 dec245c213ab
HWMP is attached to mesh point device and MAC layer with zero functionality
examples/mesh.cc
src/devices/mesh/dot11s/dot11s-helper.cc
src/devices/mesh/dot11s/dot11s-helper.h
src/devices/mesh/dot11s/hwmp-mac-plugin.cc
src/devices/mesh/dot11s/hwmp-mac-plugin.h
src/devices/mesh/dot11s/hwmp-protocol.cc
src/devices/mesh/dot11s/hwmp-protocol.h
src/devices/mesh/dot11s/peer-link.cc
src/devices/mesh/dot11s/peer-link.h
src/devices/mesh/dot11s/peer-management-plugin.cc
src/devices/mesh/dot11s/peer-management-plugin.h
src/devices/mesh/dot11s/peer-management-protocol.cc
src/devices/mesh/dot11s/peer-management-protocol.h
src/devices/mesh/dot11s/wscript
--- a/examples/mesh.cc	Wed Mar 25 23:19:27 2009 +0300
+++ b/examples/mesh.cc	Thu Mar 26 14:00:46 2009 +0300
@@ -70,7 +70,7 @@
                "Ssid", SsidValue (ssid),
                "RandomStart", TimeValue (Seconds (randomStart))
               );
-  //wifi.SetPeerManager("ns3::WifiPeerManager");
+  wifi.SetRouting("ns3::HwmpProtocol");
   wifi.SetPeerManager("ns3::PeerManagerProtocol");
   wifi.SetL2RoutingNetDevice ("ns3::MeshPointDevice");
   meshDevices = wifi.Install (wifiPhy,nodes);
--- a/src/devices/mesh/dot11s/dot11s-helper.cc	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/dot11s-helper.cc	Thu Mar 26 14:00:46 2009 +0300
@@ -107,8 +107,29 @@
   m_peerMan.Set (n6, v6);
   m_peerMan.Set (n7, v7);
 }
-
-  void
+void
+MeshWifiHelper::SetRouting (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_routing = ObjectFactory ();
+  m_routing.SetTypeId (type);
+  m_routing.Set (n0, v0);
+  m_routing.Set (n1, v1);
+  m_routing.Set (n2, v2);
+  m_routing.Set (n3, v3);
+  m_routing.Set (n4, v4);
+  m_routing.Set (n5, v5);
+  m_routing.Set (n6, v6);
+  m_routing.Set (n7, v7);
+}
+void
 MeshWifiHelper::SetL2RoutingNetDevice (std::string type,
     std::string n0, const AttributeValue &v0,
     std::string n1, const AttributeValue &v1,
@@ -138,23 +159,30 @@
   for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
   {
     Ptr<Node> node = *i;
+    // Create a mesh point device:
     Ptr<MeshPointDevice> mp = m_deviceFactory.Create<MeshPointDevice> ();
-    std::vector<Ptr<WifiNetDevice> >ports;
+    std::vector<Ptr<NetDevice> >interfaces;
     devices.Add (mp);
+    // Creating interface:
     std::vector<Ptr<WifiNetDevice> > nodeDevices;
     Ptr<WifiNetDevice> device = CreateObject<WifiNetDevice> ();
-    ports.push_back(device);
+    interfaces.push_back(device);
+    //Creating MAC for this interface
     Ptr<MeshWifiInterfaceMac> mac = m_meshMac.Create<MeshWifiInterfaceMac> ();
-   // Ptr<Dot11sPeerManagerMacPlugin> peer_plugin = Create<Dot11sPeerManagerMacPlugin>();
-   // mac->InstallPlugin(peer_plugin);
     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);
+    //Attaching peer manager:
     Ptr<PeerManagerProtocol> peerMan = m_peerMan.Create<PeerManagerProtocol> ();    
-    NS_ASSERT(peerMan->AttachInterfaces(ports));
-    device->SetRemoteStationManager (manager);
+    NS_ASSERT(peerMan->AttachInterfaces(interfaces));
+    //Creating Hwmp:
+    ////TODO: make it using object factory
+    Ptr<HwmpProtocol> hwmp = m_routing.Create<HwmpProtocol> ();
+    NS_ASSERT(hwmp->AttachInterfaces(interfaces));
+    //Attaching interfaces to node:
     node->AddDevice (device);
     nodeDevices.push_back (device);
     node -> AddDevice (mp);
--- a/src/devices/mesh/dot11s/dot11s-helper.h	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/dot11s-helper.h	Thu Mar 26 14:00:46 2009 +0300
@@ -23,6 +23,7 @@
 #define _MESHWIFIHELPER_H
 #include "ns3/wifi-helper.h"
 #include "ns3/peer-management-protocol.h"
+#include "ns3/hwmp-protocol.h"
 
 namespace ns3 {
 namespace dot11s {
@@ -85,6 +86,17 @@
         std::string n6 = "", const AttributeValue &v6 = EmptyAttributeValue (),
         std::string n7 = "", const AttributeValue &v7 = EmptyAttributeValue ()
         );
+    void SetRouting (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 SetL2RoutingNetDevice (std::string type,
         std::string n0 = "", const AttributeValue &v0 = EmptyAttributeValue (),
@@ -102,6 +114,7 @@
     ObjectFactory m_stationManager;
     ObjectFactory m_meshMac;
     ObjectFactory m_peerMan;
+    ObjectFactory m_routing;
     ObjectFactory m_deviceFactory;
 };
 } // namespace dot11s
--- a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc	Thu Mar 26 14:00:46 2009 +0300
@@ -18,16 +18,49 @@
  * Author: Kirill Andreev <andreev@iitp.ru>
  */
 
-
-#include "hwmp-mac-plugin.h"
+#include "ns3/mesh-wifi-interface-mac.h"
+#include "ns3/packet.h"
 #include "ns3/simulator.h"
 #include "ns3/nstime.h"
 #include "ns3/log.h"
+#include "ns3/dot11s-parameters.h"
+
+#include "hwmp-mac-plugin.h"
+#include "hwmp-protocol.h"
+#include "ie-dot11s-preq.h"
+#include "ie-dot11s-prep.h"
+#include "ie-dot11s-perr.h"
 
 namespace ns3 {
 namespace dot11s {
 
 NS_LOG_COMPONENT_DEFINE ("HwmpMacPlugin");
+HwmpMacPlugin::HwmpMacPlugin (uint32_t ifIndex, Ptr<HwmpProtocol> protocol)
+{
+  m_ifIndex = ifIndex;
+  m_protocol = protocol;
+}
+HwmpMacPlugin::~HwmpMacPlugin ()
+{
+}
+void
+HwmpMacPlugin::SetParent (Ptr<MeshWifiInterfaceMac> parent)
+{
+  m_parent = parent;
+}
+bool
+HwmpMacPlugin::Receive (Ptr<Packet> packet, const WifiMacHeader & header)
+{
+  //TODO: here we fix only mesh header
+  return true;
+}
+bool
+HwmpMacPlugin::UpdateOutcomingFrame (Ptr<Packet> packet, WifiMacHeader & header, Mac48Address from, Mac48Address to) const
+{
+  //TODO: add a mesh header and remove a TAG
+  return true;
+}
+#if 0
 TypeId
 HwmpMacPlugin::GetTypeId ()
 {
@@ -537,5 +570,6 @@
   m_perrCallback (m_myPerr, m_myPerrReceivers);
   m_myPerr.ResetPerr ();
 }
+#endif
 } //namespace dot11s
 }//namespace ns3
--- a/src/devices/mesh/dot11s/hwmp-mac-plugin.h	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/hwmp-mac-plugin.h	Thu Mar 26 14:00:46 2009 +0300
@@ -21,31 +21,45 @@
 
 #ifndef HWMP_STATE_H
 #define HWMP_STATE_H
-#include <map>
 
 #include "ns3/mesh-wifi-interface-mac-plugin.h"
 
-#include "hwmp-rtable.h"
-#include "ns3/packet.h"
-#include "ie-dot11s-preq.h"
-#include "ie-dot11s-prep.h"
-#include "ie-dot11s-perr.h"
-#include "ns3/dot11s-parameters.h"
-#include "ns3/wifi-net-device.h"
 namespace ns3 {
+class MeshWifiInterfaceMac;
 namespace dot11s {
+class HwmpProtocol;
+class IePreq;
+class IePrep;
+class IePerr;
 /**
  * \ingroup mesh
- *
- * \brief Handles HWMP state machine at each real interface
- *
- * \details Implements the following:
- *  1. Keep it's own DSN,
- *  2. Keep PREQ and PREP timers adn send this frames in
- *  accordance with HWMP-limitations
- *  3. Deliver routing information to Hwmp main class
- *  4. Notify about broken peers
  */
+class HwmpMacPlugin : public MeshWifiInterfaceMacPlugin
+{
+  public:
+    HwmpMacPlugin (uint32_t, Ptr<HwmpProtocol>);
+    ~HwmpMacPlugin ();
+    ///\name Inherited from MAC plugin
+    //\{
+    void SetParent (Ptr<MeshWifiInterfaceMac> parent);
+    bool Receive (Ptr<Packet> packet, const WifiMacHeader & header);
+    bool UpdateOutcomingFrame (Ptr<Packet> packet, WifiMacHeader & header, Mac48Address from, Mac48Address to) const;
+    ///\brief Update beacon is empty, because HWMP does not know
+    //anything about beacons
+    void UpdateBeacon (MeshWifiBeacon & beacon) const {};
+    //\}
+  private:
+    friend class HwmpProtocol;
+    ///\brief Interaction with protocol:
+    void SendPreq(Ptr<IePreq> preq);
+    void SendPrep(Ptr<IePreq> prep);
+    void SendPerr(Ptr<IePreq> perr);
+  private:
+    Ptr<MeshWifiInterfaceMac> m_parent;
+    uint32_t m_ifIndex;
+    Ptr<HwmpProtocol> m_protocol;
+};
+#if 0
 class HwmpMacPlugin : public MeshWifiInterfaceMacPlugin {
 public:
   static TypeId GetTypeId ();
@@ -178,6 +192,7 @@
   //Configurable parameters:
   uint8_t  m_maxTtl;
 };
+#endif
 } //namespace dot11s
 } //namespace ns3
 #endif
--- a/src/devices/mesh/dot11s/hwmp-protocol.cc	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/hwmp-protocol.cc	Thu Mar 26 14:00:46 2009 +0300
@@ -20,9 +20,13 @@
 
 
 #include "hwmp-protocol.h"
+#include "hwmp-mac-plugin.h"
 #include "ns3/log.h"
 #include "ns3/simulator.h"
+#include "ns3/packet.h"
 #include "ns3/mesh-point-device.h"
+#include "ns3/wifi-net-device.h"
+#include "ns3/mesh-wifi-interface-mac.h"
 
 NS_LOG_COMPONENT_DEFINE ("HwmpProtocol");
 
@@ -231,36 +235,22 @@
   return true;
 }
 bool
-HwmpProtocol::AttachPorts (std::vector<Ptr<NetDevice> > ports)
+HwmpProtocol::AttachInterfaces (std::vector<Ptr<NetDevice> > interfaces)
 {
-#if 0
-  for (std::vector<Ptr<NetDevice> >::iterator i = ports.begin (); i != ports.end(); i++)
+  for (std::vector<Ptr<NetDevice> >::iterator i = interfaces.begin (); i != interfaces.end(); i++)
     {
       //Checking netdevice:
       const WifiNetDevice * wifiNetDev = dynamic_cast<const WifiNetDevice *> (PeekPointer (*i));
       if (wifiNetDev == NULL)
         return false;
-      MeshWifiMac * meshWifiMac = dynamic_cast<MeshWifiMac *> (PeekPointer (wifiNetDev->GetMac ()));
-      if (meshWifiMac == NULL)
+      MeshWifiInterfaceMac * mac = dynamic_cast<MeshWifiInterfaceMac *> (PeekPointer (wifiNetDev->GetMac ()));
+      if (mac == NULL)
         return false;
-      //Adding HWMP-state
-      Ptr<HwmpProtocolState> hwmpState = CreateObject<HwmpProtocolState> ();
-      hwmpState->SetRoutingInfoCallback (MakeCallback(&HwmpProtocol::ObtainRoutingInformation, this));
-      hwmpState->SetMac (meshWifiMac);
-      hwmpState->SetRequestRouteCallback (MakeCallback(&HwmpProtocol::RequestRouteForAddress, this));
-      hwmpState->SetRequestRootPathCallback (MakeCallback(&HwmpProtocol::RequestRootPathForPort, this));
-      hwmpState->SetAssociatedIfaceId (wifiNetDev->GetIfIndex());
-      hwmpState->SetRetransmittersOfPerrCallback (MakeCallback(&HwmpProtocol::GetRetransmittersForFailedDestinations,this));
-      m_hwmpStates.push_back (hwmpState);
-      m_requestCallback.push_back (MakeCallback(&HwmpProtocolState::RequestDestination, hwmpState));
-      m_pathErrorCallback.push_back (MakeCallback(&HwmpProtocolState::SendPathError, hwmpState));
-      //Default mode is reactive, default state is enabled
-      enum DeviceState state = ENABLED;
-      enum DeviceMode  mode  = REACTIVE;
-      m_states.push_back (state);
-      m_modes.push_back (mode);
+      //Installing plugins:
+      Ptr<HwmpMacPlugin> hwmpMac = Create<HwmpMacPlugin> (wifiNetDev->GetIfIndex (), this);
+      m_interfaces[wifiNetDev->GetIfIndex ()] = hwmpMac;
+      mac->InstallPlugin (hwmpMac);
     }
-#endif
   return true;
 }
 #if 0
--- a/src/devices/mesh/dot11s/hwmp-protocol.h	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/hwmp-protocol.h	Thu Mar 26 14:00:46 2009 +0300
@@ -22,15 +22,18 @@
 #ifndef HWMP_H
 #define HWMP_H
 
+#include "ns3/mesh-l2-routing-protocol.h"
 #include <map>
-#include <queue>
-#include "ns3/tag.h"
-#include "ns3/mac48-address.h"
-#include "ns3/mesh-l2-routing-protocol.h"
-#include "ns3/packet.h"
+
 namespace ns3 {
 class NetDevice;
+class Packet;
+class Mac48Address;
 namespace dot11s {
+class HwmpMacPlugin;
+class IePreq;
+class IePrep;
+class IePerr;
 /**
  * \ingroup mesh
  */
@@ -41,24 +44,6 @@
   HwmpProtocol ();
   ~HwmpProtocol ();
   void DoDispose ();
-  //intheritedfrom L2RoutingProtocol
-  /**
-   * \brief L2Routing protocol base class metod
-   *
-   * \details Route resolving procedure consits
-   * of the following steps:
-   * 1. Find reactive route and send a packet.
-   * 2. Find all ports which are operate in
-   * 'Proactive' mode and find a proper default
-   * routes. and send packet to all proactive
-   * 'ports'.
-   * 3. If there are ports which are operate in
-   * reactive mode - queue packet and start
-   * route reactive path discovery
-   *
-   * \bug Now packet is sent to the 'best root'
-   * rather than to the best root at each port
-   */
   bool RequestRoute (
     uint32_t  sourceIface,
     const Mac48Address source,
@@ -67,7 +52,7 @@
     uint16_t  protocolType,
     MeshL2RoutingProtocol::RouteReplyCallback  routeReply
   );
-  bool AttachPorts (std::vector<Ptr<NetDevice> >);
+  bool AttachInterfaces (std::vector<Ptr<NetDevice> >);
 #if 0
   /**
    * \brief Disables port by index.
@@ -124,11 +109,19 @@
   //candidate queue is implemented inside the
   //protocol:
 private:
+  ///\brief interaction with HWMP MAC plugin
+  void ReceivePreq(Ptr<IePreq> preq);
+  void ReceivePrep(Ptr<IePreq> prep);
+  void ReceivePerr(Ptr<IePreq> perr);
+private:
   void  SetMaxQueueSize (int maxPacketsPerDestination);
   int  m_maxQueueSize;
   bool  QueuePacket (MeshL2RoutingProtocol::QueuedPacket packet);
   MeshL2RoutingProtocol::QueuedPacket  DequeuePacket (Mac48Address dst);
   void  SendAllPossiblePackets (Mac48Address dst);
+private:
+  //fields:
+  std::map<uint32_t, Ptr<HwmpMacPlugin> > m_interfaces;
 #if 0
   std::map<Mac48Address, std::queue<QueuedPacket> >  m_rqueue;
   //devices and HWMP states:
--- a/src/devices/mesh/dot11s/peer-link.cc	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/peer-link.cc	Thu Mar 26 14:00:46 2009 +0300
@@ -23,6 +23,7 @@
 #include "peer-link.h"
 #include "ns3/log.h"
 #include "ns3/simulator.h"
+#include "ns3/traced-value.h"
 
 NS_LOG_COMPONENT_DEFINE ("Dot11sPeerManagementProtocol");
 
@@ -35,33 +36,33 @@
 PeerLink::GetTypeId()
 {
   static TypeId tid = TypeId ("ns3::PeerLink")
-                      .SetParent<Object> ()
-                      .AddConstructor<PeerLink> ()
-                      .AddAttribute ("RetryTimeout", "Retry timeout",
-                                     TimeValue (TimeValue (MicroSeconds (40 * 1024))),
-                                     MakeTimeAccessor (&PeerLink::m_retryTimeout),
-                                     MakeTimeChecker ()
-                                    )
-                      .AddAttribute ("HoldingTimeout", "Holding timeout",
-                                     TimeValue (TimeValue (MicroSeconds (40 * 1024))),
-                                     MakeTimeAccessor (&PeerLink::m_holdingTimeout),
-                                     MakeTimeChecker ()
-                                    )
-                      .AddAttribute ("ConfirmTimeout", "Confirm timeout",
-                                     TimeValue (TimeValue (MicroSeconds (40 * 1024))),
-                                     MakeTimeAccessor (&PeerLink::m_confirmTimeout),
-                                     MakeTimeChecker ()
-                                    )
-                      .AddAttribute ("MaxRetries", "Maximum number of retries",
-                                     UintegerValue (4),
-                                     MakeUintegerAccessor (&PeerLink::m_maxRetries),
-                                     MakeUintegerChecker<uint16_t> ()
-                                    )
-                      .AddAttribute ("MaxBeaconLoss", "Maximum number of lost beacons before link will be closed",
-                                     UintegerValue (3),
-                                     MakeUintegerAccessor (&PeerLink::m_maxBeaconLoss),
-                                     MakeUintegerChecker<uint16_t> (1)
-                                    );
+    .SetParent<Object> ()
+    .AddConstructor<PeerLink> ()
+    .AddAttribute ("RetryTimeout", "Retry timeout",
+        TimeValue (TimeValue (MicroSeconds (40 * 1024))),
+        MakeTimeAccessor (&PeerLink::m_retryTimeout),
+        MakeTimeChecker ()
+        )
+    .AddAttribute ("HoldingTimeout", "Holding timeout",
+        TimeValue (TimeValue (MicroSeconds (40 * 1024))),
+        MakeTimeAccessor (&PeerLink::m_holdingTimeout),
+        MakeTimeChecker ()
+        )
+    .AddAttribute ("ConfirmTimeout", "Confirm timeout",
+        TimeValue (TimeValue (MicroSeconds (40 * 1024))),
+        MakeTimeAccessor (&PeerLink::m_confirmTimeout),
+        MakeTimeChecker ()
+        )
+    .AddAttribute ("MaxRetries", "Maximum number of retries",
+        UintegerValue (4),
+        MakeUintegerAccessor (&PeerLink::m_maxRetries),
+        MakeUintegerChecker<uint16_t> ()
+        )
+    .AddAttribute ("MaxBeaconLoss", "Maximum number of lost beacons before link will be closed",
+        UintegerValue (3),
+        MakeUintegerAccessor (&PeerLink::m_maxBeaconLoss),
+        MakeUintegerChecker<uint16_t> (1)
+        );
   return tid;
 }
   
--- a/src/devices/mesh/dot11s/peer-link.h	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/peer-link.h	Thu Mar 26 14:00:46 2009 +0300
@@ -25,6 +25,7 @@
 #include "ns3/nstime.h"
 #include "ns3/callback.h"
 #include "ns3/mac48-address.h"
+#include "ns3/event-id.h"
 #include "ie-dot11s-beacon-timing.h"
 #include "ie-dot11s-peer-management.h"
 #include "ie-dot11s-configuration.h"
--- a/src/devices/mesh/dot11s/peer-management-plugin.cc	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/peer-management-plugin.cc	Thu Mar 26 14:00:46 2009 +0300
@@ -18,11 +18,12 @@
  * Author: Kirill Andreev <andreev@iitp.ru>
  */
 
-#include "ns3/mesh-wifi-interface-mac.h"
 #include "ie-dot11s-configuration.h"
 #include "ie-dot11s-peer-management.h"
 #include "peer-management-plugin.h"
+#include "peer-management-protocol.h"
 #include "peer-link-frame.h"
+#include "ns3/mesh-wifi-interface-mac.h"
 #include "ns3/mesh-wifi-mac-header.h"
 #include "ns3/simulator.h"
 #include "ns3/wifi-mac-header.h"
--- a/src/devices/mesh/dot11s/peer-management-plugin.h	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/peer-management-plugin.h	Thu Mar 26 14:00:46 2009 +0300
@@ -22,11 +22,11 @@
 #define PEER_MANAGER_MAC_PLUGIN_H_
 
 #include "ns3/mesh-wifi-interface-mac-plugin.h"
-#include "peer-management-protocol.h"
 
 namespace ns3 {
 class MeshWifiInterfaceMac;
 namespace dot11s {
+class PeerManagementProtocol;
 class IeConfiguration;
 class IePeerManagement;
 class PeerManagerProtocol;
--- a/src/devices/mesh/dot11s/peer-management-protocol.cc	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/peer-management-protocol.cc	Thu Mar 26 14:00:46 2009 +0300
@@ -22,6 +22,9 @@
 
 #include "peer-management-protocol.h"
 
+#include "ie-dot11s-peer-management.h"
+#include "ie-dot11s-configuration.h"
+
 #include "ns3/dot11s-parameters.h"
 #include "ns3/simulator.h"
 #include "ns3/assert.h"
@@ -29,6 +32,7 @@
 #include "ns3/random-variable.h"
 #include "ns3/mesh-wifi-interface-mac.h"
 #include "ns3/mesh-wifi-interface-mac-plugin.h"
+#include "ns3/wifi-net-device.h"
 #include "peer-link.h"
 #include "peer-management-plugin.h"
 
@@ -96,11 +100,14 @@
 }
 
 bool
-PeerManagerProtocol::AttachInterfaces(std::vector<Ptr<WifiNetDevice> > interfaces)
+PeerManagerProtocol::AttachInterfaces(std::vector<Ptr<NetDevice> > interfaces)
 {
-  for(std::vector<Ptr<WifiNetDevice> >::iterator i = interfaces.begin(); i != interfaces.end(); i ++)
+  for(std::vector<Ptr<NetDevice> >::iterator i = interfaces.begin(); i != interfaces.end(); i ++)
   {
-    MeshWifiInterfaceMac * mac = dynamic_cast<MeshWifiInterfaceMac *> (PeekPointer ((*i)->GetMac ()));
+    const WifiNetDevice * wifiNetDev = dynamic_cast<const WifiNetDevice *> (PeekPointer (*i));
+      if (wifiNetDev == NULL)
+        return false;
+    MeshWifiInterfaceMac * mac = dynamic_cast<MeshWifiInterfaceMac *> (PeekPointer (wifiNetDev->GetMac ()));
     if (mac == NULL)
       return false;
     Ptr<PeerManagerMacPlugin> peerPlugin = Create<PeerManagerMacPlugin> ((*i)->GetIfIndex(), this);
--- a/src/devices/mesh/dot11s/peer-management-protocol.h	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/peer-management-protocol.h	Thu Mar 26 14:00:46 2009 +0300
@@ -24,18 +24,19 @@
 #define DOT11S_PEER_MAN_H
 
 #include "ns3/mac48-address.h"
-#include "ns3/wifi-net-device.h"
+#include "ns3/net-device.h"
 #include "ns3/event-id.h"
-#include "ie-dot11s-peer-management.h"
+#include "ns3/nstime.h"
+#include "ns3/dot11s-codes.h"
 #include "ie-dot11s-beacon-timing.h"
-#include "ie-dot11s-configuration.h"
 
-#include <list>
 #include <map>
 namespace ns3 {
 namespace dot11s {
 class PeerManagerMacPlugin;
 class PeerLink;
+class IePeerManagement;
+class IeConfiguration;
 /**
  * \ingroup dot11s
  * 
@@ -47,7 +48,7 @@
   PeerManagerProtocol ();
   ~PeerManagerProtocol ();
   static TypeId GetTypeId ();
-  bool AttachInterfaces(std::vector<Ptr<WifiNetDevice> >);
+  bool AttachInterfaces(std::vector<Ptr<NetDevice> >);
   /** \brief Methods that handle beacon sending/receiving procedure.
    * This methods interact with MAC_layer plug-in
    * \{
--- a/src/devices/mesh/dot11s/wscript	Wed Mar 25 23:19:27 2009 +0300
+++ b/src/devices/mesh/dot11s/wscript	Thu Mar 26 14:00:46 2009 +0300
@@ -16,7 +16,7 @@
         'peer-management-protocol.cc',
         'hwmp-tag.cc',
         'hwmp-rtable.cc',
-        #'hwmp-mac-plugin.cc',
+        'hwmp-mac-plugin.cc',
         'hwmp-protocol.cc',
         'dot11s-helper.cc',
         ]
@@ -24,7 +24,7 @@
     headers.module = 'dot11s'
     headers.source = [
         'ie-dot11s-beacon-timing.h',
-        'ie-dot11s-configuration.h',
+        #'ie-dot11s-configuration.h',
         'ie-dot11s-peer-management.h',
         #'ie-dot11s-preq.h',
         #'ie-dot11s-prep.h',
@@ -34,6 +34,8 @@
         #'peer-link.h',
         #'peer-management-plugin.h',
         'peer-management-protocol.h',
+        #'hwmp-mac-plugin.h',
+        'hwmp-protocol.h',
         'dot11s-helper.h',
         ]