From d0a68752eb2580b757314acb0ea40e4a3c381dc3 Mon Sep 17 00:00:00 2001 From: Kirill Andreev Date: Thu, 2 Apr 2009 13:38:38 +0400 Subject: [PATCH] Peer link restructured to support multi-interface --- examples/mesh.cc | 4 +- src/devices/mesh/dot11s/hwmp-mac-plugin.cc | 4 +- src/devices/mesh/dot11s/hwmp-protocol.cc | 28 +++- src/devices/mesh/dot11s/hwmp-protocol.h | 6 +- src/devices/mesh/dot11s/peer-link.cc | 148 +++++++++--------- src/devices/mesh/dot11s/peer-link.h | 36 +++-- .../mesh/dot11s/peer-management-plugin.cc | 9 +- .../mesh/dot11s/peer-management-plugin.h | 1 + .../mesh/dot11s/peer-management-protocol.cc | 51 ++++-- .../mesh/dot11s/peer-management-protocol.h | 23 ++- src/devices/mesh/mesh-l2-routing-protocol.h | 5 - 11 files changed, 187 insertions(+), 128 deletions(-) diff --git a/examples/mesh.cc b/examples/mesh.cc index c89ab9daf..609d1dd85 100644 --- a/examples/mesh.cc +++ b/examples/mesh.cc @@ -39,8 +39,8 @@ int 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; diff --git a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc index 581cc0bce..e3bae6766 100644 --- a/src/devices/mesh/dot11s/hwmp-mac-plugin.cc +++ b/src/devices/mesh/dot11s/hwmp-mac-plugin.cc @@ -74,7 +74,8 @@ HwmpMacPlugin::Receive (Ptr packet, const WifiMacHeader & header) 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 @@ HwmpMacPlugin::UpdateOutcomingFrame (Ptr packet, WifiMacHeader & header, meshHdr.SetMeshTtl(tag.GetTtl()); packet->AddHeader(meshHdr); header.SetAddr1(tag.GetAddress()); + NS_LOG_UNCOND("Broadcast sent"); return true; } void diff --git a/src/devices/mesh/dot11s/hwmp-protocol.cc b/src/devices/mesh/dot11s/hwmp-protocol.cc index de8cf6761..5d65fb309 100644 --- a/src/devices/mesh/dot11s/hwmp-protocol.cc +++ b/src/devices/mesh/dot11s/hwmp-protocol.cc @@ -183,7 +183,10 @@ HwmpProtocol::RequestRoute ( 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 @@ HwmpProtocol::ForwardUnicast(uint32_t sourceIface, const Mac48Address source, c return true; } bool -HwmpProtocol::HandleIncomingFrame (Ptr 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 @@ HwmpProtocol::Install (Ptr mp) 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"<second->RequestDestination(dst); + } m_preqTimeouts[dst] = Simulator::Schedule ( MilliSeconds (2*(m_dot11MeshHWMPnetDiameterTraversalTime.GetMilliSeconds())), &HwmpProtocol::RetryPathDiscovery, this, dst, numOfRetry); diff --git a/src/devices/mesh/dot11s/hwmp-protocol.h b/src/devices/mesh/dot11s/hwmp-protocol.h index 21ff18de3..b06299640 100644 --- a/src/devices/mesh/dot11s/hwmp-protocol.h +++ b/src/devices/mesh/dot11s/hwmp-protocol.h @@ -54,7 +54,6 @@ public: /// Route request, inherited from MeshL2RoutingProtocol bool RequestRoute (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination, Ptr packet, uint16_t protocolType, RouteReplyCallback routeReply); - bool HandleIncomingFrame (Ptr packet, Mac48Address src, Mac48Address dst, uint16_t protocol); /** * \brief Install HWMP on given mesh point. * @@ -64,7 +63,7 @@ public: * via MeshPointDevice::GetObject(); */ bool Install (Ptr); - 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 @@ private: */ 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 //\{ diff --git a/src/devices/mesh/dot11s/peer-link.cc b/src/devices/mesh/dot11s/peer-link.cc index 526b8ab88..8e75b09f9 100644 --- a/src/devices/mesh/dot11s/peer-link.cc +++ b/src/devices/mesh/dot11s/peer-link.cc @@ -70,19 +70,24 @@ PeerLink::GetTypeId() // 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 @@ PeerLink::SetLocalLinkId (uint16_t id) { m_localLinkId = id; } - void PeerLink::SetLocalAid (uint16_t aid) { m_assocId = aid; } - void PeerLink::SetBeaconInformation (Time lastBeacon, Time beaconInterval) { @@ -110,82 +113,73 @@ PeerLink::SetBeaconInformation (Time lastBeacon, Time beaconInterval) 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 @@ void PeerLink::Close (uint16_t localLinkId, uint16_t peerLinkId, PmpReasonCode r 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 @@ PeerLink::ConfirmAccept (uint16_t localLinkId, uint16_t peerLinkId, uint16_t pee 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 @@ PeerLink::ConfirmReject (uint16_t localLinkId, uint16_t peerLinkId, 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 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode) 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 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode) 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 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode) 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 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode) 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 @@ PeerLink::StateMachine (PeerEvent event,PmpReasonCode reasoncode) 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 diff --git a/src/devices/mesh/dot11s/peer-link.h b/src/devices/mesh/dot11s/peer-link.h index 83b311608..b7244e2e9 100644 --- a/src/devices/mesh/dot11s/peer-link.h +++ b/src/devices/mesh/dot11s/peer-link.h @@ -58,21 +58,22 @@ public: * \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 @@ public: /// MLME-PeeringRequestReject void MLMEPeeringRequestReject (); /// Callback type for MLME-SignalPeerLinkStatus event - typedef Callback SignalStatusCallback; + typedef Callback SignalStatusCallback; /// Set callback void MLMESetSignalStatusCallback (SignalStatusCallback); //\} @@ -106,21 +107,23 @@ private: /// 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 @@ private: Ptr 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 diff --git a/src/devices/mesh/dot11s/peer-management-plugin.cc b/src/devices/mesh/dot11s/peer-management-plugin.cc index 53e884bc3..deb43cb3c 100644 --- a/src/devices/mesh/dot11s/peer-management-plugin.cc +++ b/src/devices/mesh/dot11s/peer-management-plugin.cc @@ -88,8 +88,8 @@ PeerManagerMacPlugin::Receive (Ptr const_packet, const WifiMacHeader & h 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 @@ PeerManagerMacPlugin::Receive (Ptr const_packet, const WifiMacHeader & h 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 @@ PeerManagerMacPlugin::UpdateBeacon (MeshWifiBeacon & beacon) const void PeerManagerMacPlugin::SendPeerLinkManagementFrame( Mac48Address peerAddress, + Mac48Address peerMpAddress, uint16_t aid, IePeerManagement peerElement, IeConfiguration meshConfig @@ -204,14 +205,14 @@ PeerManagerMacPlugin::SendPeerLinkManagementFrame( 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); diff --git a/src/devices/mesh/dot11s/peer-management-plugin.h b/src/devices/mesh/dot11s/peer-management-plugin.h index c7f478804..f38eea771 100644 --- a/src/devices/mesh/dot11s/peer-management-plugin.h +++ b/src/devices/mesh/dot11s/peer-management-plugin.h @@ -66,6 +66,7 @@ private: void SetPeerManagerProtcol(Ptr protocol); void SendPeerLinkManagementFrame( Mac48Address peerAddress, + Mac48Address peerMpAddress, uint16_t aid, IePeerManagement peerElement, IeConfiguration meshConfig diff --git a/src/devices/mesh/dot11s/peer-management-protocol.cc b/src/devices/mesh/dot11s/peer-management-protocol.cc index adaf2fca7..5e8355001 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol.cc +++ b/src/devices/mesh/dot11s/peer-management-protocol.cc @@ -118,6 +118,8 @@ PeerManagementProtocol::Install(Ptr mp) m_peerLinks[(*i)->GetIfIndex()] = newmap; } // Mesh point aggregates all installed protocols + m_address = Mac48Address::ConvertFrom(mp->GetAddress ()); + NS_LOG_UNCOND("MP address:"<AggregateObject(this); return true; } @@ -200,6 +202,10 @@ PeerManagementProtocol::UpdatePeerBeaconTiming( 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 = FindPeerLink(interface, peerAddress); if(peerLink !=0) { @@ -208,7 +214,7 @@ PeerManagementProtocol::UpdatePeerBeaconTiming( } 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 @@ void PeerManagementProtocol::ReceivePeerLinkFrame ( uint32_t interface, Mac48Address peerAddress, + Mac48Address peerMeshPointAddress, uint16_t aid, IePeerManagement peerManagementElement, IeConfiguration meshConfig @@ -230,19 +237,24 @@ PeerManagementProtocol::ReceivePeerLinkFrame ( 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 @@ Ptr PeerManagementProtocol::InitiateLink ( uint32_t interface, Mac48Address peerAddress, + Mac48Address peerMeshPointAddress, Time lastBeacon, Time beaconInterval) { @@ -289,6 +302,7 @@ PeerManagementProtocol::InitiateLink ( 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 @@ PeerManagementProtocol::FindPeerLink(uint32_t interface, Mac48Address peerAddres return 0; } void -PeerManagementProtocol::SetPeerLinkStatusCallback(Callback cb) +PeerManagementProtocol::SetPeerLinkStatusCallback(Callback cb) { m_peerStatusCallback = cb; } @@ -364,7 +378,10 @@ PeerManagementProtocol::ShouldSendOpen (uint32_t interface, Mac48Address peerAdd 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 @@ PeerManagementProtocol::GetNextBeaconShift (uint32_t interface) 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:"<second->GetAddress() << - " and peer:"<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 diff --git a/src/devices/mesh/dot11s/peer-management-protocol.h b/src/devices/mesh/dot11s/peer-management-protocol.h index 132162def..81b8cdae6 100644 --- a/src/devices/mesh/dot11s/peer-management-protocol.h +++ b/src/devices/mesh/dot11s/peer-management-protocol.h @@ -101,6 +101,8 @@ public: * \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 @@ public: void ReceivePeerLinkFrame( uint32_t interface, Mac48Address peerAddress, + Mac48Address peerMeshPointAddress, uint16_t aid, IePeerManagement peerManagementElement, IeConfiguration meshConfig @@ -126,8 +129,10 @@ public: //\} ///\brief Needed by external module to do MLME Ptr FindPeerLink(uint32_t interface, Mac48Address peerAddress); - void SetPeerLinkStatusCallback (Callback cb); + void SetPeerLinkStatusCallback (Callback cb); std::vector GetActiveLinks(uint32_t interface); + ///\brief needed by plugins to set global source address + Mac48Address GetAddress (); private: /** \name Private structures * \{ @@ -158,7 +163,13 @@ private: * Return a position in beacon-storage for a given remote station */ void FillBeaconInfo(uint32_t interface, Mac48Address peerAddress, Time receivingTime, Time beaconInterval); - Ptr InitiateLink (uint32_t interface, Mac48Address peerAddress, Time lastBeacon, Time beaconInterval); + Ptr InitiateLink ( + uint32_t interface, + Mac48Address peerAddress, + Mac48Address peerMeshPointAddress, + Time lastBeacon, + Time beaconInterval + ); /** * \name External peer-chooser * \{ @@ -169,7 +180,7 @@ private: * \} * \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 @@ private: Time GetNextBeaconShift (uint32_t interface); private: PeerManagerPluginMap m_plugins; + Mac48Address m_address; /** * \name Information related to beacons: * \{ @@ -205,11 +217,12 @@ private: 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 m_peerStatusCallback; + Callback m_peerStatusCallback; }; } // namespace dot11s diff --git a/src/devices/mesh/mesh-l2-routing-protocol.h b/src/devices/mesh/mesh-l2-routing-protocol.h index 302167ae2..7d2e4e59a 100644 --- a/src/devices/mesh/mesh-l2-routing-protocol.h +++ b/src/devices/mesh/mesh-l2-routing-protocol.h @@ -95,11 +95,6 @@ public: */ virtual bool RequestRoute (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination, Ptr 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, Mac48Address src, Mac48Address dst, uint16_t protocol) = 0; /// Set host mesh point, analog of SetNode (...) methods for upper layer protocols. void SetMeshPoint (Ptr mp); /// Each mesh protocol must be installed on the mesh point to work.