Peer link restructured to support multi-interface
authorKirill Andreev <andreev@iitp.ru>
Thu, 02 Apr 2009 13:38:38 +0400
changeset 4933 72f0481cfb2d
parent 4932 41c61361ccbd
child 4934 345b49df838b
Peer link restructured to support multi-interface
examples/mesh.cc
src/devices/mesh/dot11s/hwmp-mac-plugin.cc
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/mesh-l2-routing-protocol.h
--- a/examples/mesh.cc	Wed Apr 01 20:48:05 2009 +0400
+++ b/examples/mesh.cc	Thu Apr 02 13:38:38 2009 +0400
@@ -39,8 +39,8 @@
 main (int argc, char *argv[])
 {
   // Creating square topology with nNodes x nNodes grid
-  int      xSize       = 6;
-  int      ySize       = 6;
+  int      xSize       = 2;
+  int      ySize       = 2;
   double   step        = 100.0; // Grid with one-hop edge
   double   randomStart = 0.1;   // One beacon interval
   uint32_t nIfaces     = 1;
--- a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc	Thu Apr 02 13:38:38 2009 +0400
@@ -74,7 +74,8 @@
       return false;
     tag.SetTtl (meshHdr.GetMeshTtl () - 1);
     tag.SetAddress (header.GetAddr2 ());
-    packet->AddPacketTag(tag);
+    if(!m_protocol->RemoveTags(destination))
+      packet->AddPacketTag(tag);
     if (destination == Mac48Address::GetBroadcast ())
       if(m_protocol->DropDataFrame (meshHdr.GetMeshSeqno (), header.GetAddr4 ()) )
         return false;
@@ -140,6 +141,7 @@
   meshHdr.SetMeshTtl(tag.GetTtl());
   packet->AddHeader(meshHdr);
   header.SetAddr1(tag.GetAddress());
+  NS_LOG_UNCOND("Broadcast sent");
   return true;
 }
 void
--- a/src/devices/mesh/dot11s/hwmp-protocol.cc	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-protocol.cc	Thu Apr 02 13:38:38 2009 +0400
@@ -183,7 +183,10 @@
     tag.DecrementTtl ();
   }
   if (destination == Mac48Address::GetBroadcast ())
+  {
+    NS_LOG_UNCOND("BROADCAS");
     routeReply (true, packet, source, destination, protocolType, HwmpRtable::INTERFACE_ANY);
+  }
   else
     return ForwardUnicast(sourceIface, source, destination, packet, protocolType, routeReply);
   return true;
@@ -248,13 +251,12 @@
   return true;
 }
 bool
-HwmpProtocol::HandleIncomingFrame (Ptr<Packet> packet, Mac48Address src, Mac48Address dst, uint16_t protocol)
+HwmpProtocol::RemoveTags (Mac48Address dst)
 {
-  //Handle only incoming frames:
-  NS_ASSERT(dst == m_address);
-  HwmpTag tag;
-  NS_ASSERT(packet->RemovePacketTag(tag));
-  return true;
+  //Check that dst is my address
+  if(dst == m_address)
+    return true;
+  return false;
 }
 void
 HwmpProtocol::ReceivePreq (IePreq preq, Mac48Address from, uint32_t interface)
@@ -493,10 +495,17 @@
   return true;
 }
 void
-HwmpProtocol::PeerLinkStatus(Mac48Address peerAddress, uint32_t interface, bool status)
+HwmpProtocol::PeerLinkStatus(Mac48Address meshPointAddress, Mac48Address peerAddress, uint32_t interface, bool status)
 {
   if(status)
-    m_rtable->AddReactivePath(peerAddress, peerAddress, interface, 1, Seconds (0), 0);
+  {
+    HwmpRtable::LookupResult result = m_rtable->LookupReactive(meshPointAddress);
+    if(result.retransmitter == Mac48Address::GetBroadcast ())
+    {
+      NS_LOG_UNCOND("I am"<<m_address<<" MP:"<<meshPointAddress<<"accessible through interface"<<interface<<", ra = "<<peerAddress);
+      m_rtable->AddReactivePath(meshPointAddress, peerAddress, interface, 1, Seconds (0), 0);
+    }
+  }
   else
   {
     std::vector<IePerr::FailedDestination> destinations = m_rtable->GetUnreachableDestinations (peerAddress);
@@ -696,7 +705,10 @@
       return;
     }
   for(HwmpPluginMap::iterator i = m_interfaces.begin (); i != m_interfaces.end (); i ++)
+  {
+    //i->second->RequestDestination(Mac48Address("00:00:00:00:00:04"));
     i->second->RequestDestination(dst);
+  }
   m_preqTimeouts[dst] = Simulator::Schedule (
       MilliSeconds (2*(m_dot11MeshHWMPnetDiameterTraversalTime.GetMilliSeconds())),
       &HwmpProtocol::RetryPathDiscovery, this, dst, numOfRetry);
--- a/src/devices/mesh/dot11s/hwmp-protocol.h	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/hwmp-protocol.h	Thu Apr 02 13:38:38 2009 +0400
@@ -54,7 +54,6 @@
   /// Route request, inherited from MeshL2RoutingProtocol
   bool RequestRoute (uint32_t  sourceIface, const Mac48Address source, const Mac48Address destination,
       Ptr<Packet>  packet, uint16_t  protocolType, RouteReplyCallback  routeReply);
-  bool HandleIncomingFrame (Ptr<Packet> packet, Mac48Address src, Mac48Address dst, uint16_t protocol);
   /** 
    * \brief Install HWMP on given mesh point. 
    * 
@@ -64,7 +63,7 @@
    * via MeshPointDevice::GetObject<dot11s::HwmpProtocol>();
    */
   bool Install (Ptr<MeshPointDevice>);
-  void PeerLinkStatus(Mac48Address peerAddress, uint32_t interface,bool status);
+  void PeerLinkStatus(Mac48Address meshPontAddress, Mac48Address peerAddress, uint32_t interface,bool status);
   ///\brief This callback is used to obtain active neighbours on a
   //given interface
   ///\param interface is the interface ID
@@ -108,7 +107,8 @@
    */
   bool DropDataFrame(uint32_t, Mac48Address);
   //\}
-  
+  ///\brief if the packet is ours - plugins should remove tag
+  bool RemoveTags (Mac48Address dst);
 private:
   ///\name Methods related to Queue/Dequeue procedures
   //\{
--- a/src/devices/mesh/dot11s/peer-link.cc	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-link.cc	Thu Apr 02 13:38:38 2009 +0400
@@ -70,19 +70,24 @@
 // PeerLink public interface
 //-----------------------------------------------------------------------------
 PeerLink::PeerLink ():
-    m_localLinkId (0),
-    m_peerLinkId (0),
-    m_state (IDLE),
-    m_retryCounter (0)
+  m_peerAddress (Mac48Address::GetBroadcast ()),
+  m_peerMeshPointAddress (Mac48Address::GetBroadcast ()),
+  m_localLinkId (0),
+  m_peerLinkId (0),
+  m_state (IDLE),
+  m_retryCounter (0)
 {
 }
-
 void
 PeerLink::SetPeerAddress (Mac48Address macaddr)
 {
   m_peerAddress = macaddr;
 }
-
+void
+PeerLink::SetPeerMeshPointAddress(Mac48Address macaddr)
+{
+  m_peerMeshPointAddress = macaddr;
+}
 void
 PeerLink::SetInterface (uint32_t interface)
 {
@@ -93,13 +98,11 @@
 {
   m_localLinkId = id;
 }
-
 void
 PeerLink::SetLocalAid (uint16_t aid)
 {
   m_assocId = aid;
 }
-
 void
 PeerLink::SetBeaconInformation (Time lastBeacon, Time beaconInterval)
 {
@@ -110,82 +113,73 @@
   NS_ASSERT (delay.GetMicroSeconds() != 0);
   m_beaconLossTimer = Simulator::Schedule (delay, &PeerLink::BeaconLoss, this);
 }
-
 void
 PeerLink::MLMESetSignalStatusCallback (PeerLink::SignalStatusCallback cb)
 {
   m_linkStatusCallback = cb;
 }
-
 void
 PeerLink::BeaconLoss ()
 {
   StateMachine (CNCL);
 }
-
 void
 PeerLink::SetBeaconTimingElement (IeBeaconTiming beaconTiming)
 {
   m_beaconTiming = beaconTiming;
 }
-
 Mac48Address
 PeerLink::GetPeerAddress () const
 {
   return m_peerAddress;
 }
-
 uint16_t
 PeerLink::GetLocalAid () const
 {
   return m_assocId;
 }
-
 Time
 PeerLink::GetLastBeacon () const
 {
   return m_lastBeacon;
 }
-
 Time
 PeerLink::GetBeaconInterval () const
 {
   return m_beaconInterval;
 }
-
 IeBeaconTiming
 PeerLink::GetBeaconTimingElement () const
 {
   return m_beaconTiming;
 }
-
 void
 PeerLink::ClearTimingElement ()
 {
   m_beaconTiming.ClearTimingElement ();
 }
-
-void PeerLink::MLMECancelPeerLink (PmpReasonCode reason)
+void
+PeerLink::MLMECancelPeerLink (PmpReasonCode reason)
 {
   StateMachine (CNCL,reason);
 }
-
-void PeerLink::MLMEPassivePeerLinkOpen ()
+void
+PeerLink::MLMEPassivePeerLinkOpen ()
 {
   StateMachine (PASOPN);
 }
-
-void PeerLink::MLMEActivePeerLinkOpen ()
+void
+PeerLink::MLMEActivePeerLinkOpen ()
 {
   StateMachine (ACTOPN);
 }
-
-void PeerLink::MLMEPeeringRequestReject ()
+void
+PeerLink::MLMEPeeringRequestReject ()
 {
   StateMachine (REQ_RJCT, REASON11S_PEER_LINK_CANCELLED);
 }
-
-void PeerLink::Close (uint16_t localLinkId, uint16_t peerLinkId, PmpReasonCode reason)
+void
+PeerLink::Close (uint16_t localLinkId, uint16_t peerLinkId, PmpReasonCode reason)
 {
   if (peerLinkId != 0 && m_localLinkId != peerLinkId)
     return;
@@ -195,25 +189,32 @@
     return;
   StateMachine (CLS_ACPT, reason);
 }
-
-void PeerLink::OpenAccept (uint16_t localLinkId, IeConfiguration  conf)
+void
+PeerLink::OpenAccept (uint16_t localLinkId, IeConfiguration  conf, Mac48Address peerMp)
 {
   if (m_peerLinkId == 0)
     m_peerLinkId = localLinkId;
   m_configuration = conf;
+  if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ())
+    NS_ASSERT(m_peerMeshPointAddress == peerMp);
+  else
+    m_peerMeshPointAddress = peerMp;
   StateMachine (OPN_ACPT);
 }
-
-void PeerLink::OpenReject (uint16_t localLinkId, IeConfiguration  conf,PmpReasonCode reason)
+void
+PeerLink::OpenReject (uint16_t localLinkId, IeConfiguration  conf, Mac48Address peerMp, PmpReasonCode reason)
 {
   if ( m_peerLinkId == 0)
     m_peerLinkId = localLinkId;
   m_configuration = conf;
+  if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ())
+    NS_ASSERT(m_peerMeshPointAddress == peerMp);
+  else
+    m_peerMeshPointAddress = peerMp;
   StateMachine (OPN_RJCT, reason);
 }
-
 void
-PeerLink::ConfirmAccept (uint16_t localLinkId, uint16_t peerLinkId, uint16_t peerAid, IeConfiguration conf)
+PeerLink::ConfirmAccept (uint16_t localLinkId, uint16_t peerLinkId, uint16_t peerAid, IeConfiguration conf, Mac48Address peerMp)
 {
   if ( m_localLinkId != peerLinkId)
     return;
@@ -223,12 +224,15 @@
     return;
   m_configuration = conf;
   m_peerAssocId = peerAid;
+  if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ())
+    NS_ASSERT(m_peerMeshPointAddress == peerMp);
+  else
+    m_peerMeshPointAddress = peerMp;
   StateMachine (CNF_ACPT);
 }
-
 void
 PeerLink::ConfirmReject (uint16_t localLinkId, uint16_t peerLinkId,
-    IeConfiguration  conf,PmpReasonCode reason)
+    IeConfiguration  conf, Mac48Address peerMp, PmpReasonCode reason)
 {
   if (m_localLinkId != peerLinkId)
     return;
@@ -237,15 +241,16 @@
   else if (m_peerLinkId != localLinkId)
     return;
   m_configuration = conf;
+  if(m_peerMeshPointAddress != Mac48Address::GetBroadcast ())
+    NS_ASSERT(m_peerMeshPointAddress == peerMp);
+  m_peerMeshPointAddress = peerMp;
   StateMachine (CNF_RJCT, reason);
 }
-
 bool
 PeerLink::LinkIsEstab () const
 {
   return (m_state == ESTAB);
 }
-
 bool
 PeerLink::LinkIsIdle () const
 {
@@ -360,7 +365,8 @@
           m_state = ESTAB;
           ClearConfirmTimer ();
           SendPeerLinkConfirm ();
-          m_linkStatusCallback (m_interface, m_peerAddress, true);
+          NS_ASSERT(m_peerMeshPointAddress != Mac48Address::GetBroadcast ());
+          m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, true);
           // TODO Callback MLME-SignalPeerLinkStatus
           break;
         case CLS_ACPT:
@@ -402,7 +408,8 @@
         case CNF_ACPT:
           m_state = ESTAB;
           ClearRetryTimer ();
-          m_linkStatusCallback (m_interface, m_peerAddress, true);
+          NS_ASSERT(m_peerMeshPointAddress != Mac48Address::GetBroadcast ());
+          m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, true);
           // TODO Callback MLME-SignalPeerLinkStatus
           break;
         case CLS_ACPT:
@@ -444,7 +451,7 @@
           m_state = HOLDING;
           SendPeerLinkClose (REASON11S_MESH_CLOSE_RCVD);
           SetHoldingTimer ();
-          m_linkStatusCallback (m_interface, m_peerAddress, false);
+          m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, false);
           break;
         case OPN_RJCT:
         case CNF_RJCT:
@@ -452,13 +459,13 @@
           ClearRetryTimer ();
           SendPeerLinkClose (reasoncode);
           SetHoldingTimer ();
-          m_linkStatusCallback (m_interface, m_peerAddress, false);
+          m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, false);
           break;
         case CNCL:
           m_state = HOLDING;
           SendPeerLinkClose (REASON11S_PEER_LINK_CANCELLED);
           SetHoldingTimer ();
-          m_linkStatusCallback (m_interface, m_peerAddress, false);
+          m_linkStatusCallback (m_interface, m_peerAddress, m_peerMeshPointAddress, false);
           break;
         default:
         {}
@@ -490,80 +497,79 @@
       break;
     }
 }
-
-void PeerLink::ClearRetryTimer ()
+void
+PeerLink::ClearRetryTimer ()
 {
   m_retryTimer.Cancel ();
 }
-
-void PeerLink::ClearConfirmTimer ()
+void
+PeerLink::ClearConfirmTimer ()
 {
   m_confirmTimer.Cancel ();
 }
-
-void PeerLink::ClearHoldingTimer ()
+void
+PeerLink::ClearHoldingTimer ()
 {
   m_holdingTimer.Cancel ();
 }
-
-void PeerLink::SendPeerLinkClose (PmpReasonCode reasoncode)
+void
+PeerLink::SendPeerLinkClose (PmpReasonCode reasoncode)
 {
   IePeerManagement peerElement;
   peerElement.SetPeerClose (m_localLinkId, m_peerLinkId, reasoncode);
-  m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_assocId, peerElement, m_configuration);
+  m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_peerMeshPointAddress, m_assocId, peerElement, m_configuration);
 }
-
-void PeerLink::SendPeerLinkOpen ()
+void
+PeerLink::SendPeerLinkOpen ()
 {
   IePeerManagement peerElement;
   peerElement.SetPeerOpen (m_localLinkId);
   NS_ASSERT (m_macPlugin != NULL);
-  m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_assocId, peerElement, m_configuration);
+  m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_peerMeshPointAddress, m_assocId, peerElement, m_configuration);
 }
-
-void PeerLink::SendPeerLinkConfirm ()
+void
+PeerLink::SendPeerLinkConfirm ()
 {
   IePeerManagement peerElement;
   peerElement.SetPeerConfirm (m_localLinkId, m_peerLinkId);
-  m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_assocId, peerElement, m_configuration);
+  m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_peerMeshPointAddress, m_assocId, peerElement, m_configuration);
 }
-
-void PeerLink::SetHoldingTimer ()
+void
+PeerLink::SetHoldingTimer ()
 {
   NS_ASSERT(m_dot11MeshHoldingTimeout.GetMicroSeconds() !=0);
   m_holdingTimer = Simulator::Schedule (m_dot11MeshHoldingTimeout, &PeerLink::HoldingTimeout, this);
 }
-
-void PeerLink::HoldingTimeout ()
+void
+PeerLink::HoldingTimeout ()
 {
   StateMachine (TOH);
 }
-
-void PeerLink::SetRetryTimer ()
+void
+PeerLink::SetRetryTimer ()
 {
   NS_ASSERT(m_dot11MeshRetryTimeout.GetMicroSeconds() !=0);
   m_retryTimer = Simulator::Schedule (m_dot11MeshRetryTimeout, &PeerLink::RetryTimeout, this);
 }
-
-void PeerLink::RetryTimeout ()
+void
+PeerLink::RetryTimeout ()
 {
   if ( m_retryCounter < m_dot11MeshMaxRetries)
     StateMachine (TOR1);
   else
     StateMachine (TOR2);
 }
-
-void PeerLink::SetConfirmTimer ()
+void
+PeerLink::SetConfirmTimer ()
 {
   NS_ASSERT(m_dot11MeshConfirmTimeout.GetMicroSeconds() !=0);
   m_confirmTimer = Simulator::Schedule (m_dot11MeshConfirmTimeout, &PeerLink::ConfirmTimeout, this);
 }
-
-void PeerLink::ConfirmTimeout ()
+void
+PeerLink::ConfirmTimeout ()
 {
   StateMachine (TOC);
-}
-  
+}  
 } // namespace dot11s
 } //namespace ns3
 
--- a/src/devices/mesh/dot11s/peer-link.h	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-link.h	Thu Apr 02 13:38:38 2009 +0400
@@ -58,21 +58,22 @@
    * \name Peer link geeters/setters
    * \{
    */
-  void  SetPeerAddress (Mac48Address macaddr);
-  void  SetInterface (uint32_t interface);
-  void  SetLocalLinkId (uint16_t id);
-  void  SetPeerLinkId (uint16_t id);
-  void  SetLocalAid (uint16_t aid);
-  void  SetPeerAid (uint16_t aid);
-  void  SetBeaconTimingElement (IeBeaconTiming beaconTiming);
-  void  SetPeerLinkDescriptorElement (IePeerManagement peerLinkElement);
+  void SetPeerAddress (Mac48Address macaddr);
+  void SetPeerMeshPointAddress (Mac48Address macaddr);
+  void SetInterface (uint32_t interface);
+  void SetLocalLinkId (uint16_t id);
+  void SetPeerLinkId (uint16_t id);
+  void SetLocalAid (uint16_t aid);
+  void SetPeerAid (uint16_t aid);
+  void SetBeaconTimingElement (IeBeaconTiming beaconTiming);
+  void SetPeerLinkDescriptorElement (IePeerManagement peerLinkElement);
   Mac48Address GetPeerAddress () const;
   uint16_t GetLocalAid () const;
-  Time  GetLastBeacon () const;
-  Time  GetBeaconInterval () const;
+  Time GetLastBeacon () const;
+  Time GetBeaconInterval () const;
   IeBeaconTiming GetBeaconTimingElement ()const;
   IePeerManagement GetPeerLinkDescriptorElement ()const;
-  void  ClearTimingElement ();
+  void ClearTimingElement ();
   //\}
   
   /**
@@ -88,7 +89,7 @@
   /// MLME-PeeringRequestReject
   void MLMEPeeringRequestReject ();
   /// Callback type for MLME-SignalPeerLinkStatus event
-  typedef Callback<void, uint32_t, Mac48Address, bool> SignalStatusCallback; 
+  typedef Callback<void, uint32_t, Mac48Address, Mac48Address, bool> SignalStatusCallback; 
   /// Set callback
   void MLMESetSignalStatusCallback (SignalStatusCallback);
   //\}
@@ -106,21 +107,23 @@
   /// Close link
   void Close (uint16_t localLinkID, uint16_t peerLinkID, PmpReasonCode reason);
   /// Accept open link
-  void OpenAccept (uint16_t localLinkId, IeConfiguration conf);
+  void OpenAccept (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp);
   /// Reject open link 
-  void OpenReject (uint16_t localLinkId, IeConfiguration conf, PmpReasonCode reason);
+  void OpenReject (uint16_t localLinkId, IeConfiguration conf, Mac48Address peerMp, PmpReasonCode reason);
   /// Confirm accept
   void ConfirmAccept (
     uint16_t localLinkId,
     uint16_t peerLinkId,
     uint16_t peerAid,
-    IeConfiguration conf
+    IeConfiguration conf,
+    Mac48Address peerMp
   );
   /// Confirm reject
   void  ConfirmReject (
     uint16_t localLinkId,
     uint16_t peerLinkId,
     IeConfiguration  conf,
+    Mac48Address peerMp,
     PmpReasonCode reason
   );
   //\}
@@ -204,6 +207,9 @@
   Ptr<PeerManagerMacPlugin> m_macPlugin;
   /// Peer address
   Mac48Address m_peerAddress;
+  /// Mesh point address, equal to peer address in case of single
+  //interface mesh point
+  Mac48Address m_peerMeshPointAddress;
   /// My ID of this link
   uint16_t m_localLinkId;
   /// Peer ID of this link
--- a/src/devices/mesh/dot11s/peer-management-plugin.cc	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-plugin.cc	Thu Apr 02 13:38:38 2009 +0400
@@ -88,8 +88,8 @@
       return true;
     NS_ASSERT(meshHdr.GetMeshTtl () == 1);
     NS_ASSERT(meshHdr.GetAddressExt () == 1);
-    NS_ASSERT(meshHdr.GetAddr4 () == header.GetAddr2 ());
     Mac48Address peerAddress = header.GetAddr2 ();
+    Mac48Address peerMpAddress = meshHdr.GetAddr4 ();
     PeerLinkFrameStart::PlinkFrameStartFields fields;
     {
       PeerLinkFrameStart peerFrame;
@@ -136,7 +136,7 @@
         return true;
     }
     //Deliver Peer link management frame to protocol:
-    m_protocol->ReceivePeerLinkFrame(m_ifIndex, peerAddress, fields.aid, peerElement, meshConfig);
+    m_protocol->ReceivePeerLinkFrame(m_ifIndex, peerAddress, peerMpAddress, fields.aid, peerElement, meshConfig);
     // if we can handle a frame - drop it
     return false;
   }
@@ -159,6 +159,7 @@
 void
 PeerManagerMacPlugin::SendPeerLinkManagementFrame(
       Mac48Address peerAddress,
+      Mac48Address peerMpAddress,
       uint16_t aid,
       IePeerManagement peerElement,
       IeConfiguration meshConfig
@@ -204,14 +205,14 @@
   meshHdr.SetMeshTtl (1);
   meshHdr.SetMeshSeqno (0);
   meshHdr.SetAddressExt(1);
-  meshHdr.SetAddr4(m_parent->GetAddress ());
+  meshHdr.SetAddr4(m_protocol->GetAddress ());
   packet->AddHeader (meshHdr);
   //Wifi Mac header:
   WifiMacHeader hdr;
   hdr.SetMultihopAction ();
   hdr.SetAddr1 (peerAddress);
   hdr.SetAddr2 (m_parent->GetAddress ());
-  hdr.SetAddr3 (peerAddress);
+  hdr.SetAddr3 (peerMpAddress);
   hdr.SetDsNotFrom ();
   hdr.SetDsNotTo ();
   m_parent->SendManagementFrame(packet, hdr);
--- a/src/devices/mesh/dot11s/peer-management-plugin.h	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-plugin.h	Thu Apr 02 13:38:38 2009 +0400
@@ -66,6 +66,7 @@
   void SetPeerManagerProtcol(Ptr<PeerManagementProtocol> protocol);
   void SendPeerLinkManagementFrame(
       Mac48Address peerAddress,
+      Mac48Address peerMpAddress,
       uint16_t aid,
       IePeerManagement peerElement,
       IeConfiguration meshConfig
--- a/src/devices/mesh/dot11s/peer-management-protocol.cc	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-protocol.cc	Thu Apr 02 13:38:38 2009 +0400
@@ -118,6 +118,8 @@
     m_peerLinks[(*i)->GetIfIndex()] = newmap;
   }
   // Mesh point aggregates all installed protocols
+  m_address = Mac48Address::ConvertFrom(mp->GetAddress ());
+  NS_LOG_UNCOND("MP address:"<<m_address);
   mp->AggregateObject(this);
   return true;
 }
@@ -200,6 +202,10 @@
    NS_ASSERT(plugin != m_plugins.end ());
    plugin->second->SetBeaconShift(GetNextBeaconShift(interface));
    //PM STATE Machine
+   //Check that a given beacon is not from our interface
+   for(PeerManagerPluginMap::const_iterator i = m_plugins.begin (); i != m_plugins.end (); i ++)
+     if(i->second->GetAddress () == peerAddress)
+       return;
    Ptr<PeerLink> peerLink = FindPeerLink(interface, peerAddress);
    if(peerLink !=0)  
    {
@@ -208,7 +214,7 @@
    }
    else
    {
-     peerLink = InitiateLink (interface, peerAddress, receivingTime, beaconInterval);
+     peerLink = InitiateLink (interface, peerAddress, Mac48Address::GetBroadcast (), receivingTime, beaconInterval);
      peerLink->SetBeaconTimingElement (timingElement);
      if (ShouldSendOpen (interface, peerAddress))
        peerLink->MLMEActivePeerLinkOpen ();
@@ -219,6 +225,7 @@
 PeerManagementProtocol::ReceivePeerLinkFrame (
     uint32_t interface,
     Mac48Address peerAddress,
+    Mac48Address peerMeshPointAddress,
     uint16_t aid,
     IePeerManagement peerManagementElement,
     IeConfiguration meshConfig
@@ -230,19 +237,24 @@
     PmpReasonCode reasonCode;
     bool reject = ! (ShouldAcceptOpen (interface, peerAddress,reasonCode));
     if (peerLink == 0)
-      peerLink = InitiateLink (interface, peerAddress, Simulator::Now (), Seconds(1.0));
+      peerLink = InitiateLink (interface, peerAddress, peerMeshPointAddress, Simulator::Now (), Seconds(1.0));
     if(!reject)
     {
       peerLink->MLMEPassivePeerLinkOpen ();
-      peerLink->OpenAccept (peerManagementElement.GetLocalLinkId(), meshConfig);
+      peerLink->OpenAccept (peerManagementElement.GetLocalLinkId(), meshConfig, peerMeshPointAddress);
     }
     else
-      peerLink->OpenReject (peerManagementElement.GetLocalLinkId(), meshConfig, reasonCode);
+      peerLink->OpenReject (peerManagementElement.GetLocalLinkId(), meshConfig, peerMeshPointAddress, reasonCode);
   }
   if (peerLink == 0)
     return;
   if (peerManagementElement.SubtypeIsConfirm ())
-    peerLink->ConfirmAccept (peerManagementElement.GetLocalLinkId(), peerManagementElement.GetPeerLinkId(), aid, meshConfig);
+    peerLink->ConfirmAccept (
+        peerManagementElement.GetLocalLinkId(),
+        peerManagementElement.GetPeerLinkId(),
+        aid,
+        meshConfig,
+        peerMeshPointAddress);
   if (peerManagementElement.SubtypeIsClose ())
     peerLink->Close (
         peerManagementElement.GetLocalLinkId(),
@@ -263,6 +275,7 @@
 PeerManagementProtocol::InitiateLink (
   uint32_t interface,
   Mac48Address peerAddress,
+  Mac48Address peerMeshPointAddress,
   Time lastBeacon,
   Time beaconInterval)
 {
@@ -289,6 +302,7 @@
   new_link->SetInterface (interface);
   new_link->SetLocalLinkId (m_lastLocalLinkId++);
   new_link->SetPeerAddress (peerAddress);
+  new_link->SetPeerMeshPointAddress (peerMeshPointAddress);
   new_link->SetBeaconInformation (lastBeacon, beaconInterval);
   new_link->SetMacPlugin (plugin->second);
   new_link->MLMESetSignalStatusCallback (MakeCallback(&PeerManagementProtocol::PeerLinkStatus, this));
@@ -306,7 +320,7 @@
   return 0;
 }
 void
-PeerManagementProtocol::SetPeerLinkStatusCallback(Callback <void, Mac48Address, uint32_t, bool> cb)
+PeerManagementProtocol::SetPeerLinkStatusCallback(Callback <void, Mac48Address, Mac48Address, uint32_t, bool> cb)
 {
   m_peerStatusCallback = cb;
 }
@@ -364,7 +378,10 @@
   return true;
 }
 bool
-PeerManagementProtocol::ShouldAcceptOpen (uint32_t interface, Mac48Address peerAddress, PmpReasonCode & reasonCode)
+PeerManagementProtocol::ShouldAcceptOpen (
+    uint32_t interface,
+    Mac48Address peerAddress,
+    PmpReasonCode & reasonCode)
 {
   if (m_numberOfActivePeers > m_maxNumberOfPeerLinks)
     {
@@ -450,23 +467,29 @@
     return MicroSeconds (0);
 }
 void
-PeerManagementProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, bool status)
+PeerManagementProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddress, bool status)
 {
    PeerManagerPluginMap::iterator plugin = m_plugins.find (interface);
    NS_ASSERT(plugin != m_plugins.end());
    NS_LOG_DEBUG(
-       "LINK between me:"<<plugin->second->GetAddress() <<
-       " and peer:"<<peerAddress<<
-       ", at interface "<<interface<<
-       "Status(1 - opened, 0 - closed)"<<status);
+       "Link between me:" << m_address <<
+       " my interface:" << plugin->second->GetAddress() <<
+       " and peer mesh point:" << peerMeshPointAddress <<
+       " and its interface:" << peerAddress <<
+       ", at my interface ID:" << interface <<
+       ". Status:" << status);
    if(status)
      m_numberOfActivePeers ++;
    else
      m_numberOfActivePeers --;
    if(!m_peerStatusCallback.IsNull ())
-     m_peerStatusCallback (peerAddress, interface, status);
+     m_peerStatusCallback (peerMeshPointAddress, peerAddress, interface, status);
 }
-  
+Mac48Address
+PeerManagementProtocol::GetAddress ()
+{
+  return m_address;
+}
 } // namespace dot11s
 } //namespace ns3
 
--- a/src/devices/mesh/dot11s/peer-management-protocol.h	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/dot11s/peer-management-protocol.h	Thu Apr 02 13:38:38 2009 +0400
@@ -101,6 +101,8 @@
    * \param uint32_t - is a interface ID of a given MAC (interfaceID rather
    * than MAC address, beacause many interfaces may have the same MAC)
    * \param Mac48Address is address of peer
+   * \param Mac48Address is address of peer mesh point device (equal
+   * to peer address when only one interface)
    * \param uint16_t is association ID, which peer has assigned to
    * us
    * \param IeConfiguration is mesh configuration element
@@ -110,6 +112,7 @@
   void ReceivePeerLinkFrame(
       uint32_t interface,
       Mac48Address peerAddress,
+      Mac48Address peerMeshPointAddress,
       uint16_t aid,
       IePeerManagement peerManagementElement,
       IeConfiguration meshConfig
@@ -126,8 +129,10 @@
   //\}
   ///\brief Needed by external module to do MLME
   Ptr<PeerLink> FindPeerLink(uint32_t interface, Mac48Address peerAddress);
-  void SetPeerLinkStatusCallback (Callback<void, Mac48Address, uint32_t, bool> cb);
+  void SetPeerLinkStatusCallback (Callback<void, Mac48Address, Mac48Address, uint32_t, bool> cb);
   std::vector<Mac48Address> GetActiveLinks(uint32_t interface);
+  ///\brief needed by plugins to set global source address
+  Mac48Address GetAddress ();
 private:
   /** \name Private structures
    * \{
@@ -158,7 +163,13 @@
    * Return a position in beacon-storage for a given remote station
    */
   void FillBeaconInfo(uint32_t interface, Mac48Address peerAddress, Time receivingTime, Time beaconInterval);
-  Ptr<PeerLink> InitiateLink (uint32_t interface, Mac48Address peerAddress, Time lastBeacon, Time beaconInterval);
+  Ptr<PeerLink> InitiateLink (
+      uint32_t interface,
+      Mac48Address peerAddress,
+      Mac48Address peerMeshPointAddress,
+      Time lastBeacon,
+      Time beaconInterval
+      );
   /**
    * \name External peer-chooser
    * \{
@@ -169,7 +180,7 @@
    * \}
    * \brief Indicates changes in peer links
    */
-  void PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, bool status);
+  void PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddres, bool status);
   /**
    * Removes all links which are idle
    */
@@ -178,6 +189,7 @@
   Time GetNextBeaconShift (uint32_t interface);
 private:
   PeerManagerPluginMap m_plugins;
+  Mac48Address m_address;
   /**
    * \name Information related to beacons:
    * \{
@@ -205,11 +217,12 @@
   EventId  m_cleanupEvent;
   ///\}
   ///\brief Callback to notify about peer link changes:
-  ///\param Mac48Address is peer address
+  ///\param Mac48Address is peer address of mesh point
+  ///\param Mac48Address is peer address of interface
   ///\param uint32_t - interface ID
   ///\param bool is staus - true when new link has appeared, false -
   //when link was closed
-  Callback <void, Mac48Address, uint32_t, bool> m_peerStatusCallback;
+  Callback <void, Mac48Address, Mac48Address, uint32_t, bool> m_peerStatusCallback;
 };
   
 } // namespace dot11s
--- a/src/devices/mesh/mesh-l2-routing-protocol.h	Wed Apr 01 20:48:05 2009 +0400
+++ b/src/devices/mesh/mesh-l2-routing-protocol.h	Thu Apr 02 13:38:38 2009 +0400
@@ -95,11 +95,6 @@
    */
   virtual bool RequestRoute (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination, 
       Ptr<Packet> packet, uint16_t  protocolType, RouteReplyCallback routeReply ) = 0;
-  ///\return false if packet should be dropeed
-  ///\details If incoming frame is our frame - we pass a packet
-  //through protocol, because protocol needs to remove all tags and
-  //check TTL
-  virtual bool HandleIncomingFrame (Ptr<Packet> packet, Mac48Address src, Mac48Address dst, uint16_t protocol) = 0;
   /// Set host mesh point, analog of SetNode (...) methods for upper layer protocols.
   void SetMeshPoint (Ptr<MeshPointDevice> mp);
   /// Each mesh protocol must be installed on the mesh point to work.