From 149a32afe2594bd4ec98cebafdf5b6a76143ec1f Mon Sep 17 00:00:00 2001 From: Kirill Andreev Date: Sun, 22 Mar 2009 17:05:45 +0300 Subject: [PATCH] First management frame goes through new archotecture --- .../mesh/802.11s/ie-dot11s-peer-management.h | 15 +- src/devices/mesh/802.11s/peer-link-frame.cc | 18 +- src/devices/mesh/802.11s/peer-link-frame.h | 11 +- src/devices/mesh/802.11s/peer-link.cc | 38 ++- src/devices/mesh/802.11s/peer-link.h | 17 +- .../mesh/802.11s/peer-manager-plugin.cc | 177 +++++++------ .../mesh/802.11s/peer-manager-protocol.cc | 236 +++++++++--------- .../mesh/802.11s/peer-manager-protocol.h | 35 ++- 8 files changed, 291 insertions(+), 256 deletions(-) diff --git a/src/devices/mesh/802.11s/ie-dot11s-peer-management.h b/src/devices/mesh/802.11s/ie-dot11s-peer-management.h index c26212da3..3635394be 100644 --- a/src/devices/mesh/802.11s/ie-dot11s-peer-management.h +++ b/src/devices/mesh/802.11s/ie-dot11s-peer-management.h @@ -34,13 +34,12 @@ namespace ns3 { class IeDot11sPeerManagement : public WifiInformationElement { public: - enum Subtype { - PEER_OPEN = 0, - PEER_CLOSE = 1, - PEER_CONFIRM = 2, - }; - IeDot11sPeerManagement (); - + IeDot11sPeerManagement (); + enum Subtype { + PEER_OPEN = 0, + PEER_CLOSE = 1, + PEER_CONFIRM = 2, + }; void SetPeerOpen (uint16_t localLinkId); void SetPeerClose (uint16_t localLinkID, uint16_t peerLinkId, dot11sReasonCode reasonCode); void SetPeerConfirm (uint16_t localLinkID, uint16_t peerLinkId); @@ -51,6 +50,7 @@ public: bool SubtypeIsOpen () const; bool SubtypeIsClose () const; bool SubtypeIsConfirm () const ; + uint8_t GetSubtype() const { return m_subtype;}; private: WifiElementId ElementId () const{ return IE11S_PEER_LINK_MANAGEMENT; @@ -59,6 +59,7 @@ private: void SerializeInformation (Buffer::Iterator i) const; uint8_t DeserializeInformation (Buffer::Iterator i, uint8_t length); void PrintInformation (std::ostream& os) const; +private: uint8_t m_length; uint8_t m_subtype; uint16_t m_localLinkId; diff --git a/src/devices/mesh/802.11s/peer-link-frame.cc b/src/devices/mesh/802.11s/peer-link-frame.cc index 47aa8add0..cc8e68e16 100644 --- a/src/devices/mesh/802.11s/peer-link-frame.cc +++ b/src/devices/mesh/802.11s/peer-link-frame.cc @@ -25,7 +25,7 @@ NS_OBJECT_ENSURE_REGISTERED (PeerLinkFrameStart); PeerLinkFrameStart::PeerLinkFrameStart () { - m_fields.subtype = PEER_LINK_OPEN; + m_fields.subtype = IeDot11sPeerManagement::PEER_OPEN; m_fields.aid = 0; m_fields.rates = SupportedRates(); m_fields.meshId = Ssid(); @@ -37,7 +37,7 @@ PeerLinkFrameStart::SetPlinkFrameStart(PeerLinkFrameStart::PlinkFrameStartFields } PeerLinkFrameStart::PlinkFrameStartFields -PeerLinkFrameStart::GetPlinkFrameStart () +PeerLinkFrameStart::GetFields () { return m_fields; } @@ -79,9 +79,9 @@ uint32_t PeerLinkFrameStart::GetSerializedSize () const { uint32_t size = 1; //Subtype - if (PEER_LINK_CONFIRM == m_fields.subtype) + if (IeDot11sPeerManagement::PEER_CONFIRM == m_fields.subtype) size += 2; //AID of remote peer - if (PEER_LINK_CLOSE != m_fields.subtype) + if (IeDot11sPeerManagement::PEER_CLOSE != m_fields.subtype) { size += m_fields.rates.GetSerializedSize (); size += 2; @@ -95,9 +95,9 @@ PeerLinkFrameStart::Serialize (Buffer::Iterator start) const { Buffer::Iterator i = start; i.WriteU8 (m_fields.subtype); //Like a Category in Standart - if (PEER_LINK_CONFIRM == m_fields.subtype) + if (IeDot11sPeerManagement::PEER_CONFIRM == m_fields.subtype) i.WriteHtonU16 (m_fields.aid); - if (PEER_LINK_CLOSE != m_fields.subtype) + if (IeDot11sPeerManagement::PEER_CLOSE != m_fields.subtype) { i = m_fields.rates.Serialize (i); i.Next(2); //QoS @@ -109,10 +109,10 @@ uint32_t PeerLinkFrameStart::Deserialize (Buffer::Iterator start) { Buffer::Iterator i = start; - m_fields.subtype = (PeerLinkSubtype)i.ReadU8 (); - if (PEER_LINK_CONFIRM == m_fields.subtype) + m_fields.subtype = (IeDot11sPeerManagement::Subtype)i.ReadU8 (); + if (IeDot11sPeerManagement::PEER_CONFIRM == m_fields.subtype) m_fields.aid = i.ReadNtohU16 (); - if (PEER_LINK_CLOSE != m_fields.subtype) + if (IeDot11sPeerManagement::PEER_CLOSE != m_fields.subtype) { i = m_fields.rates.Deserialize (i); i.Next(2); //QoS diff --git a/src/devices/mesh/802.11s/peer-link-frame.h b/src/devices/mesh/802.11s/peer-link-frame.h index 2e3857534..8436751b1 100644 --- a/src/devices/mesh/802.11s/peer-link-frame.h +++ b/src/devices/mesh/802.11s/peer-link-frame.h @@ -23,27 +23,22 @@ #include "ns3/header.h" #include "ns3/supported-rates.h" #include "ns3/ssid.h" +#include "ns3/ie-dot11s-peer-management.h" namespace ns3 { class MeshWifiInterfaceMac; class PeerLinkFrameStart : public Header { public: - enum PeerLinkSubtype - { - PEER_LINK_OPEN = 0, - PEER_LINK_CONFIRM, - PEER_LINK_CLOSE - }; PeerLinkFrameStart (); struct PlinkFrameStartFields { - PeerLinkSubtype subtype; + uint8_t subtype; uint16_t aid; SupportedRates rates; Ssid meshId; }; void SetPlinkFrameStart(PlinkFrameStartFields); - PlinkFrameStartFields GetPlinkFrameStart (); + PlinkFrameStartFields GetFields (); bool CheckPlinkFrameStart(Ptr mac); /** Inherited from header: * \{ diff --git a/src/devices/mesh/802.11s/peer-link.cc b/src/devices/mesh/802.11s/peer-link.cc index 7f143eb03..7441189c0 100644 --- a/src/devices/mesh/802.11s/peer-link.cc +++ b/src/devices/mesh/802.11s/peer-link.cc @@ -81,12 +81,6 @@ PeerLink::SetPeerAddress (Mac48Address macaddr) m_peerAddress = macaddr; } -void -PeerLink::SetLocalAddress (Mac48Address macaddr) -{ - m_localAddress = macaddr; -} - void PeerLink::SetLocalLinkId (uint16_t id) { @@ -134,12 +128,6 @@ PeerLink::GetPeerAddress () const return m_peerAddress; } -Mac48Address -PeerLink::GetLocalAddress () const -{ - return m_localAddress; -} - uint16_t PeerLink::GetLocalAid () const { @@ -182,6 +170,7 @@ void PeerLink::MLMEPassivePeerLinkOpen () void PeerLink::MLMEActivePeerLinkOpen () { + NS_LOG_UNCOND("Sending OPEN"); StateMachine (ACTOPN); } @@ -256,6 +245,11 @@ PeerLink::LinkIsIdle () const { return (m_state == IDLE); } +void +PeerLink::SetMacPlugin(Ptr plugin) +{ + m_macPlugin = plugin; +} //----------------------------------------------------------------------------- // Private //----------------------------------------------------------------------------- @@ -358,10 +352,9 @@ PeerLink::StateMachine (PeerEvent event,dot11sReasonCode reasoncode) break; case OPN_ACPT: m_state = ESTAB; - NS_LOG_DEBUG ("I am "<SendPeerLinkOpen (peerElement, m_peerAddress); + NS_LOG_UNCOND("sending peer link open"); + NS_ASSERT (m_macPlugin != NULL); + m_macPlugin->SendPeerLinkManagementFrame (m_peerAddress, m_assocId, peerElement, m_configuration); } void PeerLink::SendPeerLinkConfirm () diff --git a/src/devices/mesh/802.11s/peer-link.h b/src/devices/mesh/802.11s/peer-link.h index a5e846c1c..4833f84e2 100644 --- a/src/devices/mesh/802.11s/peer-link.h +++ b/src/devices/mesh/802.11s/peer-link.h @@ -30,6 +30,7 @@ #include "ie-dot11s-beacon-timing.h" #include "ie-dot11s-peer-management.h" #include "ie-dot11s-configuration.h" +#include "peer-manager-plugin.h" namespace ns3 { /** @@ -58,7 +59,6 @@ public: * \{ */ void SetPeerAddress (Mac48Address macaddr); - void SetLocalAddress (Mac48Address macaddr); void SetLocalLinkId (uint16_t id); void SetPeerLinkId (uint16_t id); void SetLocalAid (uint16_t aid); @@ -66,7 +66,6 @@ public: void SetBeaconTimingElement (IeDot11sBeaconTiming beaconTiming); void SetPeerLinkDescriptorElement (IeDot11sPeerManagement peerLinkElement); Mac48Address GetPeerAddress () const; - Mac48Address GetLocalAddress () const; uint16_t GetLocalAid () const; Time GetLastBeacon () const; Time GetBeaconInterval () const; @@ -88,7 +87,7 @@ public: /// MLME-PeeringRequestReject void MLMEPeeringRequestReject (); /// Callback type for MLME-SignalPeerLinkStatus event - typedef Callback SignalStatusCallback; + typedef Callback SignalStatusCallback; /// Set callback void MLMESetSignalStatusCallback (SignalStatusCallback); //\} @@ -129,7 +128,11 @@ public: bool LinkIsEstab () const; /// True if link is idle. Link can be deleted in this state bool LinkIsIdle () const; - + /** + * Set pointer to MAC-plugin, which is responsible for sending peer + * link management frames + */ + void SetMacPlugin(Ptr plugin); private: /// Peer link states, see 802.11s draft 11B.3.3.1 enum PeerState { @@ -194,10 +197,12 @@ private: //\} private: + ///The number of interface I am associated with + uint32_t m_interface; + /// pointer to mac plugin, which is responsible for peer management + Ptr m_macPlugin; /// Peer address Mac48Address m_peerAddress; - /// My own address - Mac48Address m_localAddress; /// My ID of this link uint16_t m_localLinkId; /// Peer ID of this link diff --git a/src/devices/mesh/802.11s/peer-manager-plugin.cc b/src/devices/mesh/802.11s/peer-manager-plugin.cc index 55786e0d3..67e31f383 100644 --- a/src/devices/mesh/802.11s/peer-manager-plugin.cc +++ b/src/devices/mesh/802.11s/peer-manager-plugin.cc @@ -24,6 +24,9 @@ #include "peer-manager-plugin.h" #include "ns3/mesh-wifi-mac-header.h" #include "ns3/simulator.h" +#include "ns3/peer-link-frame.h" +#include "ns3/wifi-mac-header.h" +#include "ns3/mesh-wifi-mac-header.h" #include "ns3/log.h" NS_LOG_COMPONENT_DEFINE("PeerManager"); @@ -69,93 +72,57 @@ Dot11sPeerManagerMacPlugin::Receive (Ptr packet, const WifiMacHeader & h Simulator::Now(), MicroSeconds(beacon_hdr.GetBeaconIntervalUs()) ); - -#if 0 - packet->RemoveHeader (beacon); - m_peerManager->SetReceivedBeaconTimers ( - GetAddress (), - from, - Simulator::Now (), - MicroSeconds (beacon.GetBeaconIntervalUs()), - beacon.GetIeDot11sBeaconTiming () - ); -#endif } if(header.IsMultihopAction()) { + if (header.GetAddr1 () != m_parent->GetAddress ()) + return true; + WifiMeshHeader meshHdr; packet->RemoveHeader (meshHdr); WifiMeshMultihopActionHeader multihopHdr; - //parse multihop action header: - packet->RemoveHeader (multihopHdr); - WifiMeshMultihopActionHeader::ACTION_VALUE actionValue = multihopHdr.GetAction (); if(multihopHdr.GetCategory () != WifiMeshMultihopActionHeader::MESH_PEER_LINK_MGT) return false; -#if 0 - { - case WifiMeshMultihopActionHeader::MESH_PEER_LINK_MGT: - { - Mac48Address peerAddress; - MeshMgtPeerLinkManFrame peer_frame; - if (hdr->GetAddr1 () != GetAddress ()) - return; - peerAddress = hdr->GetAddr2 (); - packet->RemoveHeader (peer_frame); - if (actionValue.peerLink != WifiMeshMultihopActionHeader::PEER_LINK_CLOSE) - { - //check Supported Rates - SupportedRates rates = peer_frame.GetSupportedRates (); - for (uint32_t i = 0; i < m_stationManager->GetNBasicModes (); i++) - { - WifiMode mode = m_stationManager->GetBasicMode (i); - if (!rates.IsSupportedRate (mode.GetDataRate ())) - { - m_peerManager->ConfigurationMismatch (GetAddress(), peerAddress); - return; - } - } - //Check SSID - if (!peer_frame.GetMeshId ().IsEqual(GetSsid())) - { - m_peerManager->ConfigurationMismatch (GetAddress(), peerAddress); - return; - } - } - switch (actionValue.peerLink) - { - case WifiMeshMultihopActionHeader::PEER_LINK_CONFIRM: - m_peerManager->SetConfirmReceived ( - GetAddress (), - peerAddress, - peer_frame.GetAid (), - peer_frame.GetIeDot11sPeerManagement (), - m_meshConfig - ); - return; - case WifiMeshMultihopActionHeader::PEER_LINK_OPEN: - m_peerManager->SetOpenReceived ( - GetAddress (), - peerAddress, - peer_frame.GetIeDot11sPeerManagement (), - m_meshConfig - ); - return; - case WifiMeshMultihopActionHeader::PEER_LINK_CLOSE: - m_peerManager->SetCloseReceived ( - GetAddress (), - peerAddress, - peer_frame.GetIeDot11sPeerManagement () - ); - return; - default: - return; - } - break; -#endif - } + Mac48Address peerAddress = header.GetAddr2 (); + PeerLinkFrameStart::PlinkFrameStartFields fields; + { + PeerLinkFrameStart peerFrame; + packet->RemoveHeader (peerFrame); + fields = peerFrame.GetFields(); + } + if (actionValue.peerLink != WifiMeshMultihopActionHeader::PEER_LINK_CLOSE) + { + if(!(m_parent->CheckSupportedRates(fields.rates))) + { + NS_ASSERT(false); + //m_peerManager->ConfigurationMismatch (GetAddress(), peerAddress); + return true; + } + if (!fields.meshId.IsEqual(m_parent->GetSsid())) + { + NS_ASSERT(false); + //m_peerManager->ConfigurationMismatch (GetAddress(), peerAddress); + return true; + } + } + + switch (actionValue.peerLink) + { + case WifiMeshMultihopActionHeader::PEER_LINK_CONFIRM: + return true; + case WifiMeshMultihopActionHeader::PEER_LINK_OPEN: + NS_LOG_UNCOND("OPEN RECEIVED"); + NS_ASSERT(false); + return true; + case WifiMeshMultihopActionHeader::PEER_LINK_CLOSE: + return true; + default: + return false; + } + } return false; } @@ -179,4 +146,62 @@ Dot11sPeerManagerMacPlugin::UpdateBeacon (MeshWifiBeacon & beacon) const MicroSeconds(beacon.BeaconHeader().GetBeaconIntervalUs())); beacon.AddInformationElement(beaconTiming); } +void +Dot11sPeerManagerMacPlugin::SendPeerLinkManagementFrame( + Mac48Address peerAddress, + uint16_t aid, + IeDot11sPeerManagement peerElement, + IeDot11sConfiguration meshConfig + ) +{ + NS_LOG_UNCOND("sending open"); + //Create a packet: + Ptr packet = Create (); + packet->AddHeader(peerElement); + packet->AddHeader(meshConfig); + PeerLinkFrameStart::PlinkFrameStartFields fields; + fields.subtype = peerElement.GetSubtype(); + fields.aid = aid; + fields.rates = m_parent->GetSupportedRates (); + fields.meshId = m_parent->GetSsid (); + PeerLinkFrameStart plinkFrame; + plinkFrame.SetPlinkFrameStart(fields); + packet->AddHeader(plinkFrame); + //Create an 802.11 frame header: + //Send management frame to MAC: + WifiMeshMultihopActionHeader multihopHdr; + if (peerElement.SubtypeIsOpen ()) + { + WifiMeshMultihopActionHeader::ACTION_VALUE action; + action.peerLink = WifiMeshMultihopActionHeader::PEER_LINK_OPEN; + multihopHdr.SetAction (WifiMeshMultihopActionHeader::MESH_PEER_LINK_MGT, action); + } + if (peerElement.SubtypeIsConfirm ()) + { + WifiMeshMultihopActionHeader::ACTION_VALUE action; + action.peerLink = WifiMeshMultihopActionHeader::PEER_LINK_CONFIRM; + multihopHdr.SetAction (WifiMeshMultihopActionHeader::MESH_PEER_LINK_MGT, action); + } + if (peerElement.SubtypeIsClose ()) + { + WifiMeshMultihopActionHeader::ACTION_VALUE action; + action.peerLink = WifiMeshMultihopActionHeader::PEER_LINK_CLOSE; + multihopHdr.SetAction (WifiMeshMultihopActionHeader::MESH_PEER_LINK_MGT, action); + } + packet->AddHeader (multihopHdr); + //mesh header: + WifiMeshHeader meshHdr; + meshHdr.SetMeshTtl (1); + meshHdr.SetMeshSeqno (0); + packet->AddHeader (meshHdr); + //Wifi Mac header: + WifiMacHeader hdr; + hdr.SetMultihopAction (); + hdr.SetAddr1 (peerAddress); + hdr.SetAddr2 (m_parent->GetAddress ()); + hdr.SetAddr3 (m_parent->GetAddress ()); + hdr.SetDsNotFrom (); + hdr.SetDsNotTo (); + m_parent->SendManagementFrame(packet, hdr); +} }//namespace ns3 diff --git a/src/devices/mesh/802.11s/peer-manager-protocol.cc b/src/devices/mesh/802.11s/peer-manager-protocol.cc index cd2172ec9..3dd85cb9c 100644 --- a/src/devices/mesh/802.11s/peer-manager-protocol.cc +++ b/src/devices/mesh/802.11s/peer-manager-protocol.cc @@ -28,6 +28,7 @@ #include "ns3/log.h" #include "ns3/random-variable.h" #include "ns3/mesh-wifi-interface-mac.h" +#include "ns3/peer-link.h" NS_LOG_COMPONENT_DEFINE ("Dot11sPeerManagerProtocol"); namespace ns3 { @@ -41,7 +42,7 @@ Dot11sPeerManagerProtocol::GetTypeId (void) { static TypeId tid = TypeId ("ns3::Dot11sPeerManagerProtocol") .SetParent () - .AddConstructor (); + .AddConstructor () #if 0 //peerLinkCleanupTimeout. This constant is not specified in Draft 2.0 .AddAttribute ("PeerLinkCleanupPeriod", @@ -56,6 +57,7 @@ Dot11sPeerManagerProtocol::GetTypeId (void) MakeUintegerAccessor (&Dot11sPeerManagerProtocol::m_maxBeaconLoss), MakeUintegerChecker () ) +#endif //maximum number of peer links. .AddAttribute ("MaxNumberOfPeerLinks", "Maximum number of peer links ", @@ -63,7 +65,6 @@ Dot11sPeerManagerProtocol::GetTypeId (void) MakeUintegerAccessor (&Dot11sPeerManagerProtocol::m_maxNumberOfPeerLinks), MakeUintegerChecker () ); -#endif return tid; } @@ -82,12 +83,12 @@ Dot11sPeerManagerProtocol::~Dot11sPeerManagerProtocol () m_cleanupEvent.Cancel (); //TODO: delete a list of descriptors for ( - PeerDescriptorsMap::iterator j = m_peerDescriptors.begin (); - j != m_peerDescriptors.end (); + PeerDescriptorsMap::iterator j = m_peerLinks.begin (); + j != m_peerLinks.end (); j++) { int to_delete = 0; - for (std::vector >::iterator i = j->second.begin (); i != j->second.end(); i++) + for (std::vector >::iterator i = j->second.begin (); i != j->second.end(); i++) { to_delete ++; (*i)->ClearTimingElement (); @@ -97,7 +98,7 @@ Dot11sPeerManagerProtocol::~Dot11sPeerManagerProtocol () j->second.pop_back (); j->second.clear (); } - m_peerDescriptors.clear (); + m_peerLinks.clear (); #endif } //----------------------------------------------------- @@ -115,6 +116,8 @@ Dot11sPeerManagerProtocol::AttachPorts(std::vector > interfac Ptr peerPlugin = Create ((*i)->GetIfIndex(), this); mac->InstallPlugin(peerPlugin); m_plugins[(*i)->GetIfIndex()] = peerPlugin; + PeerLinksOnInterface newmap; + m_peerLinks[(*i)->GetIfIndex()] = newmap; } return true; } @@ -127,7 +130,7 @@ Dot11sPeerManagerProtocol::SendBeacon(uint32_t interface, Time currentTbtt, Time BeaconInfoMap::iterator i = m_neighbourBeacons.find(interface); if(i == m_neighbourBeacons.end()) return retval; - for(BeaconInterfaceInfoMap::iterator j = i->second.begin(); j != i->second.end(); j++) + for(BeaconsOnInterface::iterator j = i->second.begin(); j != i->second.end(); j++) { //check beacon loss and make a timing element if( @@ -154,34 +157,56 @@ Dot11sPeerManagerProtocol::ReceiveBeacon( NS_LOG_UNCOND("Beacon received from "<second.find(peerAddress); + if(j == i->second.end()) + { + NS_LOG_UNCOND("first beacon from this station"); + BeaconInfo newInfo; + newInfo.referenceTbtt = receivingTime; + newInfo.beaconInterval = beaconInterval; + newInfo.aid = m_lastAssocId++; + if(m_lastAssocId == 0xff) + m_lastAssocId = 0; + i->second[peerAddress] = newInfo; + } + else + { + NS_LOG_UNCOND("last beacon was at"<second.referenceTbtt); + j->second.referenceTbtt = receivingTime; + NS_LOG_UNCOND("now beacon is at"<second.referenceTbtt); + j->second.beaconInterval = beaconInterval; + } + if(!meshBeacon) + return; } - i = m_neighbourBeacons.find(interface); - BeaconInterfaceInfoMap::iterator j = i->second.find(peerAddress); - if(j == i->second.end()) + //PM STATE Machine { - NS_LOG_UNCOND("first beacon from this station"); - BeaconInfo newInfo; - newInfo.referenceTbtt = receivingTime; - newInfo.beaconInterval = beaconInterval; - newInfo.aid = m_lastAssocId++; - i->second[peerAddress] = newInfo; + PeerLinksMap::iterator iface = m_peerLinks.find (interface); + NS_ASSERT (iface != m_peerLinks.end()); + for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end(); i++){ + if ((*i)->GetPeerAddress () == peerAddress) + { + (*i)->SetBeaconTimingElement (timingElement); + (*i)->SetBeaconInformation (receivingTime, beaconInterval); + return; + } + } + PeerManagerPluginMap::iterator plugin = m_plugins.find (interface); + NS_ASSERT(plugin != m_plugins.end()); + Ptr new_link = InitiateLink (interface, peerAddress, receivingTime, beaconInterval); + new_link->SetBeaconTimingElement (timingElement); + if (ShouldSendOpen (interface, peerAddress)) + new_link->MLMEActivePeerLinkOpen (); } - else - { - NS_LOG_UNCOND("last beacon was at"<second.referenceTbtt); - j->second.referenceTbtt = receivingTime; - NS_LOG_UNCOND("now beacon is at"<second.referenceTbtt); - j->second.beaconInterval = beaconInterval; - } - if(!meshBeacon) - return; - //TODO: PM STATE Machine } void @@ -220,9 +245,9 @@ Dot11sPeerManagerProtocol::SetReceivedBeaconTimers ( IeDot11sBeaconTiming beaconTiming ) { - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) { if ((*i)->GetPeerAddress () == peerAddress) { @@ -231,9 +256,9 @@ Dot11sPeerManagerProtocol::SetReceivedBeaconTimers ( return; } } - Ptr new_descriptor = + Ptr new_link = AddDescriptor (interfaceAddress, peerAddress, Simulator::Now(), beaconInterval); - new_descriptor->SetBeaconTimingElement (beaconTiming); + new_link->SetBeaconTimingElement (beaconTiming); } bool @@ -249,27 +274,14 @@ Dot11sPeerManagerProtocol::AttachPorts (std::vector > interfa //Add a mac pointer: m_macPointers[meshWifiMac->GetAddress ()] = meshWifiMac; //Add descriptor array: - std::vector > descriptors; - m_peerDescriptors[meshWifiMac->GetAddress ()] = descriptors; + std::vector > descriptors; + m_peerLinks[meshWifiMac->GetAddress ()] = descriptors; //Add beacon timers: struct BeaconInfo myBeacon; m_myBeaconInfo[meshWifiMac->GetAddress ()] = myBeacon; } return true; } -void -Dot11sPeerManagerProtocol::AskIfOpenNeeded (Mac48Address interfaceAddress, Mac48Address peerAddress) -{ - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) - if ((*i)->GetPeerAddress () == peerAddress) - { - if (ShouldSendOpen (interfaceAddress, peerAddress)) - (*i)->MLMEActivePeerLinkOpen (); - break; - } -} void Dot11sPeerManagerProtocol::SetOpenReceived ( @@ -282,9 +294,9 @@ Dot11sPeerManagerProtocol::SetOpenReceived ( dot11sReasonCode reasonCode; if (!ShouldAcceptOpen (interfaceAddress, peerAddress,reasonCode)) return; - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) if ((*i)->GetPeerAddress () == peerAddress) { (*i)->PeerLinkOpenAccept (peerMan.GetLocalLinkId(), conf); @@ -292,13 +304,13 @@ Dot11sPeerManagerProtocol::SetOpenReceived ( } BeaconInfoMap::iterator myBeacon = m_myBeaconInfo.find (interfaceAddress); NS_ASSERT (myBeacon != m_myBeaconInfo.end()); - Ptrnew_descriptor = AddDescriptor ( + Ptrnew_link = AddDescriptor ( interfaceAddress, peerAddress, Simulator::Now (), myBeacon->second.beaconInterval ); - new_descriptor->PeerLinkOpenAccept (peerMan.GetLocalLinkId(), conf); + new_link->PeerLinkOpenAccept (peerMan.GetLocalLinkId(), conf); } void Dot11sPeerManagerProtocol::SetConfirmReceived ( @@ -309,9 +321,9 @@ Dot11sPeerManagerProtocol::SetConfirmReceived ( IeDot11sConfiguration meshConfig ) { - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) if ((*i)->GetPeerAddress () == peerAddress) (*i)->PeerLinkConfirmAccept (peerMan.GetLocalLinkId(), peerMan.GetPeerLinkId(), peerAid, meshConfig); } @@ -323,9 +335,9 @@ Dot11sPeerManagerProtocol::SetCloseReceived ( IeDot11sPeerManagement peerMan ) { - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) if ((*i)->GetPeerAddress () == peerAddress) { (*i)->PeerLinkClose (peerMan.GetLocalLinkId(), peerMan.GetPeerLinkId(), peerMan.GetReasonCode()); @@ -339,9 +351,9 @@ Dot11sPeerManagerProtocol::ConfigurationMismatch ( Mac48Address peerAddress ) { - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) if ((*i)->GetPeerAddress () == peerAddress) { (*i)->MLMECancelPeerLink (REASON11S_MESH_CONFIGURATION_POLICY_VIOLATION); @@ -353,10 +365,10 @@ Dot11sPeerManagerProtocol::ConfigurationMismatch ( IeDot11sBeaconTiming Dot11sPeerManagerProtocol::GetIeDot11sBeaconTimingForMyBeacon (Mac48Address interfaceAddress) { - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); IeDot11sBeaconTiming return_val; - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) { //Just go through all neighbor entries and add it to timing element: return_val.AddNeighboursTimingElementUnit ( @@ -373,52 +385,50 @@ Dot11sPeerManagerProtocol::GetIeDot11sBeaconTimingForAddress ( Mac48Address interfaceAddress, Mac48Address addr) { - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); IeDot11sBeaconTiming return_val; - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) if ((*i)->GetPeerAddress () == addr) return_val = (*i)->GetBeaconTimingElement (); return return_val; } -Ptr -Dot11sPeerManagerProtocol::AddDescriptor ( - Mac48Address interfaceAddress, +#endif +Ptr +Dot11sPeerManagerProtocol::InitiateLink ( + uint32_t interface, Mac48Address peerAddress, Time lastBeacon, Time beaconInterval) { - Ptr new_descriptor = Create (); - if (m_assocId == 0xff) - m_assocId = 0; - if (m_localLinkId == 0xff) - m_localLinkId = 0; - new_descriptor->SetLocalAid (m_assocId++); - new_descriptor->SetLocalLinkId (m_localLinkId++); - new_descriptor->SetPeerAddress (peerAddress); - new_descriptor->SetBeaconInformation (lastBeacon, beaconInterval); - //DEBUG ONLY: - new_descriptor->SetLocalAddress (interfaceAddress); - //check if interface address is wrong - MeshMacMap::iterator pos = m_macPointers.find (interfaceAddress); - NS_ASSERT (pos != m_macPointers.end()); - //check if descriptors array exist - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); - new_descriptor->SetMac (pos->second); - new_descriptor->SetMaxBeaconLoss (m_maxBeaconLoss); - new_descriptor->SetLinkStatusCallback (MakeCallback(&Dot11sPeerManagerProtocol::PeerLinkStatus, this)); - NS_ASSERT (interface != m_peerDescriptors.end()); - m_peerDescriptors[interfaceAddress].push_back (new_descriptor); - return new_descriptor; -} + Ptr new_link = CreateObject (); + if (m_lastLocalLinkId == 0xff) + m_lastLocalLinkId = 0; + //the entry about beacon must exist in beacon map + BeaconInfoMap::iterator beaconsOnInterface = m_neighbourBeacons.find (interface); + NS_ASSERT(beaconsOnInterface != m_neighbourBeacons.end()); + BeaconsOnInterface::iterator beacon = beaconsOnInterface->second.find (peerAddress); + NS_ASSERT(beacon != beaconsOnInterface->second.end ()); + PeerManagerPluginMap::iterator plugin = m_plugins.find (interface); + NS_ASSERT(plugin != m_plugins.end ()); + NS_LOG_UNCOND("Adding a new descriptor"); + new_link->SetLocalAid (beacon->second.aid); + new_link->SetLocalLinkId (m_lastLocalLinkId++); + new_link->SetPeerAddress (peerAddress); + new_link->SetBeaconInformation (lastBeacon, beaconInterval); + new_link->SetMacPlugin (plugin->second); + //new_link->SetLinkStatusCallback (MakeCallback(&Dot11sPeerManagerProtocol::PeerLinkStatus, this)); + m_peerLinks[interface].push_back (new_link); + return new_link; +} +#if 0 void Dot11sPeerManagerProtocol::PeerCleanup () { for ( - PeerDescriptorsMap::iterator j = m_peerDescriptors.begin (); - j != m_peerDescriptors.end (); + PeerDescriptorsMap::iterator j = m_peerLinks.begin (); + j != m_peerLinks.end (); j++) { std::vector to_erase; @@ -441,10 +451,10 @@ Dot11sPeerManagerProtocol::PeerCleanup () std::vector Dot11sPeerManagerProtocol::GetNeighbourAddressList (Mac48Address interfaceAddress, Mac48Address peerAddress) { - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); std::vector return_value; - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) return_value.push_back ((*i)->GetPeerAddress()); return return_value; } @@ -452,22 +462,22 @@ Dot11sPeerManagerProtocol::GetNeighbourAddressList (Mac48Address interfaceAddres bool Dot11sPeerManagerProtocol::IsActiveLink (Mac48Address interfaceAddress, Mac48Address peerAddress) { - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) if ((*i)->GetPeerAddress () == peerAddress) return ((*i)->LinkIsEstab ()); return false; } - +#endif bool -Dot11sPeerManagerProtocol::ShouldSendOpen (Mac48Address interfaceAddress, Mac48Address peerAddress) +Dot11sPeerManagerProtocol::ShouldSendOpen (uint32_t interface, Mac48Address peerAddress) { if (m_numberOfActivePeers > m_maxNumberOfPeerLinks) return false; return true; } - +#if 0 bool Dot11sPeerManagerProtocol::ShouldAcceptOpen (Mac48Address interfaceAddress, Mac48Address peerAddress,dot11sReasonCode & reasonCode) { @@ -493,11 +503,11 @@ Dot11sPeerManagerProtocol::GetNextBeaconShift ( uint32_t myNextTBTTInTimeUnits = 0; uint32_t futureBeaconInTimeUnits = 0; //Going through all my timing elements and detecting future beacon collisions - PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); - NS_ASSERT (interface != m_peerDescriptors.end()); + PeerDescriptorsMap::iterator interface = m_peerLinks.find (interfaceAddress); + NS_ASSERT (interface != m_peerLinks.end()); BeaconInfoMap::iterator myBeacon = m_myBeaconInfo.find (interfaceAddress); NS_ASSERT (myBeacon != m_myBeaconInfo.end()); - for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) { IeDot11sBeaconTiming::NeighboursTimingUnitsList neighbours; neighbours = (*i)->GetBeaconTimingElement ().GetNeighboursTimingElementsList(); @@ -562,7 +572,7 @@ Dot11sPeerManagerProtocol::GetNextBeaconShift ( } void -Dot11sPeerManagerProtocol::PeerLinkStatus (Mac48Address interfaceAddress, Mac48Address peerAddress, bool status) +Dot11sPeerManagerProtocol::PeerLinkStatus (uint32_t interface, Mac48Address peerAddress, bool status) { MeshMacMap::iterator pos = m_macPointers.find (interfaceAddress); NS_ASSERT (pos != m_macPointers.end()); diff --git a/src/devices/mesh/802.11s/peer-manager-protocol.h b/src/devices/mesh/802.11s/peer-manager-protocol.h index 1df4e017c..b9a676c29 100644 --- a/src/devices/mesh/802.11s/peer-manager-protocol.h +++ b/src/devices/mesh/802.11s/peer-manager-protocol.h @@ -29,10 +29,11 @@ #include "ns3/ie-dot11s-beacon-timing.h" #include "ns3/ie-dot11s-configuration.h" #include "ns3/event-id.h" - +//#include "ns3/peer-link.h" #include "peer-manager-plugin.h" #include +#include namespace ns3 { class Dot11sPeerManagerMacPlugin; class PeerLink; @@ -108,6 +109,12 @@ public: /** * \} */ +private: + Ptr InitiateLink (uint32_t interface, Mac48Address peerAddress, Time lastBeacon, Time beaconInterval); + /** + * External peer-chooser + */ + bool ShouldSendOpen(uint32_t interface, Mac48Address peerAddress); private: /** * All private structures: @@ -122,9 +129,10 @@ private: Time referenceTbtt; //When one of my station's beacons was put into a beacon queue; Time beaconInterval; //Beacon interval of my station; }; - typedef std::map > > PeerDescriptorsMap; - typedef std::map BeaconInterfaceInfoMap; - typedef std::map BeaconInfoMap; + typedef std::vector > PeerLinksOnInterface; + typedef std::map PeerLinksMap; + typedef std::map BeaconsOnInterface; + typedef std::map BeaconInfoMap; typedef std::map > PeerManagerPluginMap; PeerManagerPluginMap m_plugins; @@ -140,9 +148,18 @@ private: */ uint16_t m_lastAssocId; uint16_t m_lastLocalLinkId; + uint8_t m_numberOfActivePeers; //number of established peer links + uint8_t m_maxNumberOfPeerLinks; + /** + * Peer Links + * \{ + */ + PeerLinksMap m_peerLinks; + /** + * \} + */ #if 0 //Maximum peers that may be opened: - uint8_t m_maxNumberOfPeerLinks; /** * Peer manager identify interface by address * of MAC. So, for every interface we store @@ -154,7 +171,6 @@ private: * mac */ MeshMacMap m_macPointers; - uint8_t m_numberOfActivePeers; //number of established peer links uint16_t m_assocId; //last stored assoc ID uint16_t m_localLinkId; //last stored local link ID //This Variables used in beacon miss auto-cleanup: @@ -165,15 +181,8 @@ private: //and check if the too many beacons were lost: Time m_peerLinkCleanupPeriod; EventId m_cleanupEvent; - Ptr AddDescriptor ( - Mac48Address interfaceAddress, - Mac48Address peerAddress, - Time lastBeacon, - Time beaconInterval - ); void PeerCleanup (); //Mechanism of choosing PEERs: - bool ShouldSendOpen (Mac48Address interfaceAddress, Mac48Address peerAddress); bool ShouldAcceptOpen ( Mac48Address interfaceAddress, Mac48Address peerAddress,