From bd6dc43f03f9a42e75935385c2b6f2fffe3e8ea5 Mon Sep 17 00:00:00 2001 From: Kirill Andreev Date: Fri, 20 Mar 2009 13:46:50 +0300 Subject: [PATCH] Neighbours are attached --- .../mesh/802.11s/ie-dot11s-beacon-timing.cc | 4 +- .../mesh/802.11s/peer-manager-plugin.cc | 35 +-- .../mesh/802.11s/peer-manager-plugin.h | 38 ++-- .../mesh/802.11s/peer-manager-protocol.cc | 211 +++++++++++------- .../mesh/802.11s/peer-manager-protocol.h | 61 +++-- src/devices/mesh/wifi-information-element.cc | 10 +- 6 files changed, 216 insertions(+), 143 deletions(-) diff --git a/src/devices/mesh/802.11s/ie-dot11s-beacon-timing.cc b/src/devices/mesh/802.11s/ie-dot11s-beacon-timing.cc index de16eb2af..3f692eadf 100644 --- a/src/devices/mesh/802.11s/ie-dot11s-beacon-timing.cc +++ b/src/devices/mesh/802.11s/ie-dot11s-beacon-timing.cc @@ -152,7 +152,9 @@ IeDot11sBeaconTiming::GetInformationSize () const void IeDot11sBeaconTiming::PrintInformation (std::ostream& os) const { - //TODO + for (NeighboursTimingUnitsList::const_iterator j = m_neighbours.begin (); j != m_neighbours.end(); j++) + os << "AID=" << (*j)->GetAid () << ", Last beacon was at " + << (*j)->GetLastBeacon ()<<", with beacon interval " << (*j)->GetBeaconInterval () << "\n"; } void diff --git a/src/devices/mesh/802.11s/peer-manager-plugin.cc b/src/devices/mesh/802.11s/peer-manager-plugin.cc index 7ee43b4d3..58b92a2c8 100644 --- a/src/devices/mesh/802.11s/peer-manager-plugin.cc +++ b/src/devices/mesh/802.11s/peer-manager-plugin.cc @@ -22,12 +22,15 @@ #include "ie-dot11s-configuration.h" #include "ie-dot11s-peer-management.h" #include "peer-manager-plugin.h" +#include "ns3/simulator.h" #include "ns3/log.h" NS_LOG_COMPONENT_DEFINE("PeerManager"); namespace ns3 { -Dot11sPeerManagerMacPlugin::Dot11sPeerManagerMacPlugin () +Dot11sPeerManagerMacPlugin::Dot11sPeerManagerMacPlugin (uint32_t interface, Ptr protocol) { + m_ifIndex = interface; + m_protocol = protocol; } Dot11sPeerManagerMacPlugin::~Dot11sPeerManagerMacPlugin () @@ -49,14 +52,22 @@ Dot11sPeerManagerMacPlugin::Receive (Ptr packet, const WifiMacHeader & h { NS_LOG_UNCOND("Beacon recevied by PM from"< myBeacon = packet->Copy(); MgtBeaconHeader beacon_hdr; myBeacon->RemoveHeader(beacon_hdr); if(myBeacon->GetSize () == 0) NS_LOG_UNCOND("Empty"); + bool meshBeacon = false; if(beaconTiming.FindMyInformationElement(myBeacon)) - NS_LOG_UNCOND("BEACON TIMING"); + meshBeacon = true; + m_protocol->ReceiveBeacon( + m_ifIndex, + meshBeacon, + beaconTiming, + header.GetAddr2(), + Simulator::Now(), + MicroSeconds(beacon_hdr.GetBeaconIntervalUs()) + ); #if 0 packet->RemoveHeader (beacon); @@ -81,17 +92,15 @@ Dot11sPeerManagerMacPlugin::UpdateOutcomingFrame (Ptr packet, WifiMacHea void Dot11sPeerManagerMacPlugin::UpdateBeacon (MeshWifiBeacon & beacon) const { +#if 0 NS_LOG_UNCOND("I am sending a beacon"); - Ptr beaconTiming = Create (); - beacon.AddInformationElement(beaconTiming); Ptr prep = Create (); - beacon.AddInformationElement(prep); +#endif + Ptr beaconTiming = + m_protocol->SendBeacon( + m_ifIndex, + Simulator::Now(), + MicroSeconds(beacon.BeaconHeader().GetBeaconIntervalUs())); + beacon.AddInformationElement(beaconTiming); } -bool -Dot11sPeerManagerMacPlugin::BindWithProtocol(Ptr protocol) -{ - m_protocol = protocol; - return true; -} - }//namespace ns3 diff --git a/src/devices/mesh/802.11s/peer-manager-plugin.h b/src/devices/mesh/802.11s/peer-manager-plugin.h index 246d18e23..08c033654 100644 --- a/src/devices/mesh/802.11s/peer-manager-plugin.h +++ b/src/devices/mesh/802.11s/peer-manager-plugin.h @@ -29,6 +29,7 @@ class MeshWifiInterfaceMac; class IeDot11sConfiguration; class IeDot11sPeerManagement; class Dot11sPeerManagerProtocol; +class Dot11sPeerManagerProtocol; /** * \ingroup dot11s * @@ -41,7 +42,7 @@ class Dot11sPeerManagerProtocol; class Dot11sPeerManagerMacPlugin : public MeshWifiInterfaceMacPlugin { public: - Dot11sPeerManagerMacPlugin (); + Dot11sPeerManagerMacPlugin (uint32_t interface, Ptr protocol); ~Dot11sPeerManagerMacPlugin (); /** * \brief Inherited from plugin abstract class @@ -54,34 +55,25 @@ public: /** * \} */ - bool BindWithProtocol(Ptr); void SetPeerManagerProtcol(Ptr protocol); - /** - * Deliver Peer link management information to the protocol-part - * \param void is returning value - we pass a frame and forget - * about it - * \param uint32_t - is a port ID of a given MAC (portID rather - * than MAC address, beacause many ports may have the same MAC) - * \param Mac48Address is address of peer - * \param uint16_t is association ID, which peer has assigned to - * us - * \param IeDot11sConfiguration is mesh configuration element - * taken from the peer management frame - * \param IeDot11sPeerManagement is peer link management element - */ - void SetDeliverPeerLinkFrameCallbback ( - Callback + void SendPeerLinkManagementFrame( + Mac48Address peerAddress, + uint16_t aid, + IeDot11sPeerManagement peerElement, + IeDot11sConfiguration meshConfig ); - /** - * \brief Forms and sends peer link management frame. - */ - void SendPeerLinkManagementFrame(Mac48Address peerAddress, uint16_t aid, IeDot11sPeerManagement peerElement, IeDot11sConfiguration meshConfig); IeDot11sConfiguration AskPeerLinkManagementElement(); private: - Callback m_deliverPeerManFrame; - Callback m_beaconCallback; + /** + * Information about MAC and protocol: + * \{ + */ Ptr m_parent; + uint32_t m_ifIndex; Ptr m_protocol; + /** + * \} + */ /** * Create peer link management frames: * \{ diff --git a/src/devices/mesh/802.11s/peer-manager-protocol.cc b/src/devices/mesh/802.11s/peer-manager-protocol.cc index 745539543..40c51254b 100644 --- a/src/devices/mesh/802.11s/peer-manager-protocol.cc +++ b/src/devices/mesh/802.11s/peer-manager-protocol.cc @@ -580,9 +580,10 @@ Dot11sPeerManagerProtocol::GetTypeId (void) return tid; } -Dot11sPeerManagerProtocol::Dot11sPeerManagerProtocol () +Dot11sPeerManagerProtocol::Dot11sPeerManagerProtocol (): + m_lastAssocId(0), + m_lastLocalLinkId(1) { -// m_assocId = 0; // m_numberOfActivePeers = 0; // // firs peerLinkId is 1, because 0 means "unknown" // m_localLinkId = 1; @@ -616,45 +617,93 @@ Dot11sPeerManagerProtocol::~Dot11sPeerManagerProtocol () // UNFINISHED //----------------------------------------------------- bool -Dot11sPeerManagerProtocol::AttachPorts(std::vector > ports) +Dot11sPeerManagerProtocol::AttachPorts(std::vector > interfaces) { - NS_LOG_UNCOND("Peer manager attach ports started!"); - for(std::vector >::iterator i = ports.begin(); i != ports.end(); i ++) + NS_LOG_UNCOND("Peer manager attach interfaces started!"); + for(std::vector >::iterator i = interfaces.begin(); i != interfaces.end(); i ++) { MeshWifiInterfaceMac * mac = dynamic_cast (PeekPointer ((*i)->GetMac ())); if (mac == NULL) return false; - Ptr peerPlugin = Create(); + Ptr peerPlugin = Create ((*i)->GetIfIndex(), this); mac->InstallPlugin(peerPlugin); - NS_ASSERT(peerPlugin->BindWithProtocol(this)); + m_plugins[(*i)->GetIfIndex()] = peerPlugin; } return true; } -IeDot11sBeaconTiming -Dot11sPeerManagerProtocol::SendBeacon(uint32_t port, Time currentTbtt, Time beaconInterval) +Ptr +Dot11sPeerManagerProtocol::SendBeacon(uint32_t interface, Time currentTbtt, Time beaconInterval) { - IeDot11sBeaconTiming retval; + Ptr retval = Create (); + NS_LOG_UNCOND("I am sending a beacon"); + 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++) + { + //check beacon loss and make a timing element + if( + (j->second.referenceTbtt.GetMicroSeconds() + + (j->second.beaconInterval.GetMicroSeconds()* m_maxBeaconLoss)) + < + Simulator::Now().GetMicroSeconds() + ) + continue; + retval->AddNeighboursTimingElementUnit(j->second.aid, j->second.referenceTbtt, j->second.beaconInterval); + } return retval; } void Dot11sPeerManagerProtocol::ReceiveBeacon( - uint32_t port, + uint32_t interface, + bool meshBeacon, IeDot11sBeaconTiming timingElement, Mac48Address peerAddress, Time receivingTime, Time beaconInterval) { + 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++; + 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; + //TODO: PM STATE Machine } void Dot11sPeerManagerProtocol::ReceivePeerLinkFrame( - uint32_t port, + uint32_t interface, Mac48Address peerAddress, uint16_t aid, - IeDot11sConfiguration meshConfig, - IeDot11sPeerManagement peerManagementElement + IeDot11sPeerManagement peerManagementElement, + IeDot11sConfiguration meshConfig ) { } @@ -662,12 +711,12 @@ Dot11sPeerManagerProtocol::ReceivePeerLinkFrame( #if 0 void Dot11sPeerManagerProtocol::SetSentBeaconTimers ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Time ReferenceTbtt, Time BeaconInterval ) { - BeaconInfoMap::iterator myBeacon = m_myBeaconInfo.find (portAddress); + BeaconInfoMap::iterator myBeacon = m_myBeaconInfo.find (interfaceAddress); NS_ASSERT (myBeacon != m_myBeaconInfo.end()); myBeacon->second.referenceTbtt = ReferenceTbtt; myBeacon->second.beaconInterval = BeaconInterval; @@ -676,16 +725,16 @@ Dot11sPeerManagerProtocol::SetSentBeaconTimers ( void Dot11sPeerManagerProtocol::SetReceivedBeaconTimers ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Mac48Address peerAddress, Time lastBeacon, Time beaconInterval, IeDot11sBeaconTiming beaconTiming ) { - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); - for (std::vector >::iterator i = port->second.begin (); i != port->second.end(); i++) + 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) { @@ -695,15 +744,15 @@ Dot11sPeerManagerProtocol::SetReceivedBeaconTimers ( } } Ptr new_descriptor = - AddDescriptor (portAddress, peerAddress, Simulator::Now(), beaconInterval); + AddDescriptor (interfaceAddress, peerAddress, Simulator::Now(), beaconInterval); new_descriptor->SetBeaconTimingElement (beaconTiming); } bool -Dot11sPeerManagerProtocol::AttachPorts (std::vector > ports) +Dot11sPeerManagerProtocol::AttachPorts (std::vector > interfaces) { - NS_ASSERT (ports.size() != 0); - for (std::vector >::iterator i = ports.begin (); i != ports.end(); i++) + NS_ASSERT (interfaces.size() != 0); + for (std::vector >::iterator i = interfaces.begin (); i != interfaces.end(); i++) { MeshWifiMac * meshWifiMac = dynamic_cast (PeekPointer ((*i)->GetMac ())); if (meshWifiMac == NULL) @@ -721,14 +770,14 @@ Dot11sPeerManagerProtocol::AttachPorts (std::vector > ports) return true; } void -Dot11sPeerManagerProtocol::AskIfOpenNeeded (Mac48Address portAddress, Mac48Address peerAddress) +Dot11sPeerManagerProtocol::AskIfOpenNeeded (Mac48Address interfaceAddress, Mac48Address peerAddress) { - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); - for (std::vector >::iterator i = port->second.begin (); i != port->second.end(); i++) + 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 (portAddress, peerAddress)) + if (ShouldSendOpen (interfaceAddress, peerAddress)) (*i)->MLMEActivePeerLinkOpen (); break; } @@ -736,27 +785,27 @@ Dot11sPeerManagerProtocol::AskIfOpenNeeded (Mac48Address portAddress, Mac48Addre void Dot11sPeerManagerProtocol::SetOpenReceived ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Mac48Address peerAddress, IeDot11sPeerManagement peerMan, IeDot11sConfiguration conf ) { dot11sReasonCode reasonCode; - if (!ShouldAcceptOpen (portAddress, peerAddress,reasonCode)) + if (!ShouldAcceptOpen (interfaceAddress, peerAddress,reasonCode)) return; - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); - for (std::vector >::iterator i = port->second.begin (); i != port->second.end(); i++) + 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) { (*i)->PeerLinkOpenAccept (peerMan.GetLocalLinkId(), conf); return; } - BeaconInfoMap::iterator myBeacon = m_myBeaconInfo.find (portAddress); + BeaconInfoMap::iterator myBeacon = m_myBeaconInfo.find (interfaceAddress); NS_ASSERT (myBeacon != m_myBeaconInfo.end()); Ptrnew_descriptor = AddDescriptor ( - portAddress, + interfaceAddress, peerAddress, Simulator::Now (), myBeacon->second.beaconInterval @@ -765,30 +814,30 @@ Dot11sPeerManagerProtocol::SetOpenReceived ( } void Dot11sPeerManagerProtocol::SetConfirmReceived ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Mac48Address peerAddress, uint16_t peerAid, IeDot11sPeerManagement peerMan, IeDot11sConfiguration meshConfig ) { - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); - for (std::vector >::iterator i = port->second.begin (); i != port->second.end(); i++) + 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) (*i)->PeerLinkConfirmAccept (peerMan.GetLocalLinkId(), peerMan.GetPeerLinkId(), peerAid, meshConfig); } void Dot11sPeerManagerProtocol::SetCloseReceived ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Mac48Address peerAddress, IeDot11sPeerManagement peerMan ) { - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); - for (std::vector >::iterator i = port->second.begin (); i != port->second.end(); i++) + 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) { (*i)->PeerLinkClose (peerMan.GetLocalLinkId(), peerMan.GetPeerLinkId(), peerMan.GetReasonCode()); @@ -798,13 +847,13 @@ Dot11sPeerManagerProtocol::SetCloseReceived ( void Dot11sPeerManagerProtocol::ConfigurationMismatch ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Mac48Address peerAddress ) { - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); - for (std::vector >::iterator i = port->second.begin (); i != port->second.end(); i++) + 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) { (*i)->MLMECancelPeerLink (REASON11S_MESH_CONFIGURATION_POLICY_VIOLATION); @@ -814,12 +863,12 @@ Dot11sPeerManagerProtocol::ConfigurationMismatch ( } IeDot11sBeaconTiming -Dot11sPeerManagerProtocol::GetIeDot11sBeaconTimingForMyBeacon (Mac48Address portAddress) +Dot11sPeerManagerProtocol::GetIeDot11sBeaconTimingForMyBeacon (Mac48Address interfaceAddress) { - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); + PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); + NS_ASSERT (interface != m_peerDescriptors.end()); IeDot11sBeaconTiming return_val; - for (std::vector >::iterator i = port->second.begin (); i != port->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 ( @@ -833,20 +882,20 @@ Dot11sPeerManagerProtocol::GetIeDot11sBeaconTimingForMyBeacon (Mac48Address port } IeDot11sBeaconTiming Dot11sPeerManagerProtocol::GetIeDot11sBeaconTimingForAddress ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Mac48Address addr) { - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); + PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); + NS_ASSERT (interface != m_peerDescriptors.end()); IeDot11sBeaconTiming return_val; - for (std::vector >::iterator i = port->second.begin (); i != port->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 portAddress, + Mac48Address interfaceAddress, Mac48Address peerAddress, Time lastBeacon, Time beaconInterval) @@ -861,18 +910,18 @@ Dot11sPeerManagerProtocol::AddDescriptor ( new_descriptor->SetPeerAddress (peerAddress); new_descriptor->SetBeaconInformation (lastBeacon, beaconInterval); //DEBUG ONLY: - new_descriptor->SetLocalAddress (portAddress); - //check if port address is wrong - MeshMacMap::iterator pos = m_macPointers.find (portAddress); + 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 port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); + 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 (port != m_peerDescriptors.end()); - m_peerDescriptors[portAddress].push_back (new_descriptor); + NS_ASSERT (interface != m_peerDescriptors.end()); + m_peerDescriptors[interfaceAddress].push_back (new_descriptor); return new_descriptor; } @@ -902,29 +951,29 @@ Dot11sPeerManagerProtocol::PeerCleanup () } std::vector -Dot11sPeerManagerProtocol::GetNeighbourAddressList (Mac48Address portAddress, Mac48Address peerAddress) +Dot11sPeerManagerProtocol::GetNeighbourAddressList (Mac48Address interfaceAddress, Mac48Address peerAddress) { - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); + PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); + NS_ASSERT (interface != m_peerDescriptors.end()); std::vector return_value; - for (std::vector >::iterator i = port->second.begin (); i != port->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; } bool -Dot11sPeerManagerProtocol::IsActiveLink (Mac48Address portAddress, Mac48Address peerAddress) +Dot11sPeerManagerProtocol::IsActiveLink (Mac48Address interfaceAddress, Mac48Address peerAddress) { - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); - for (std::vector >::iterator i = port->second.begin (); i != port->second.end(); i++) + 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) return ((*i)->LinkIsEstab ()); return false; } bool -Dot11sPeerManagerProtocol::ShouldSendOpen (Mac48Address portAddress, Mac48Address peerAddress) +Dot11sPeerManagerProtocol::ShouldSendOpen (Mac48Address interfaceAddress, Mac48Address peerAddress) { if (m_numberOfActivePeers > m_maxNumberOfPeerLinks) return false; @@ -932,7 +981,7 @@ Dot11sPeerManagerProtocol::ShouldSendOpen (Mac48Address portAddress, Mac48Addres } bool -Dot11sPeerManagerProtocol::ShouldAcceptOpen (Mac48Address portAddress, Mac48Address peerAddress,dot11sReasonCode & reasonCode) +Dot11sPeerManagerProtocol::ShouldAcceptOpen (Mac48Address interfaceAddress, Mac48Address peerAddress,dot11sReasonCode & reasonCode) { if (m_numberOfActivePeers > m_maxNumberOfPeerLinks) { @@ -944,7 +993,7 @@ Dot11sPeerManagerProtocol::ShouldAcceptOpen (Mac48Address portAddress, Mac48Addr Time Dot11sPeerManagerProtocol::GetNextBeaconShift ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Time myNextTBTT ) { @@ -956,11 +1005,11 @@ Dot11sPeerManagerProtocol::GetNextBeaconShift ( uint32_t myNextTBTTInTimeUnits = 0; uint32_t futureBeaconInTimeUnits = 0; //Going through all my timing elements and detecting future beacon collisions - PeerDescriptorsMap::iterator port = m_peerDescriptors.find (portAddress); - NS_ASSERT (port != m_peerDescriptors.end()); - BeaconInfoMap::iterator myBeacon = m_myBeaconInfo.find (portAddress); + PeerDescriptorsMap::iterator interface = m_peerDescriptors.find (interfaceAddress); + NS_ASSERT (interface != m_peerDescriptors.end()); + BeaconInfoMap::iterator myBeacon = m_myBeaconInfo.find (interfaceAddress); NS_ASSERT (myBeacon != m_myBeaconInfo.end()); - for (std::vector >::iterator i = port->second.begin (); i != port->second.end(); i++) + for (std::vector >::iterator i = interface->second.begin (); i != interface->second.end(); i++) { IeDot11sBeaconTiming::NeighboursTimingUnitsList neighbours; neighbours = (*i)->GetBeaconTimingElement ().GetNeighboursTimingElementsList(); @@ -1025,9 +1074,9 @@ Dot11sPeerManagerProtocol::GetNextBeaconShift ( } void -Dot11sPeerManagerProtocol::PeerLinkStatus (Mac48Address portAddress, Mac48Address peerAddress, bool status) +Dot11sPeerManagerProtocol::PeerLinkStatus (Mac48Address interfaceAddress, Mac48Address peerAddress, bool status) { - MeshMacMap::iterator pos = m_macPointers.find (portAddress); + MeshMacMap::iterator pos = m_macPointers.find (interfaceAddress); NS_ASSERT (pos != m_macPointers.end()); pos->second->PeerLinkStatus (peerAddress, status); } diff --git a/src/devices/mesh/802.11s/peer-manager-protocol.h b/src/devices/mesh/802.11s/peer-manager-protocol.h index 70100013b..809b6a9de 100644 --- a/src/devices/mesh/802.11s/peer-manager-protocol.h +++ b/src/devices/mesh/802.11s/peer-manager-protocol.h @@ -200,20 +200,27 @@ public: * it and remember the time, when we sent a beacon (for BCA) * \param IeDot11sBeaconTiming is a beacon timing element that * should be present in beacon - * \param port is a port sending a beacon + * \param interface is a interface sending a beacon * \param currentTbtt is a time of beacon sending - * \param beaconInterval is a beacon interval on this port + * \param beaconInterval is a beacon interval on this interface */ - IeDot11sBeaconTiming SendBeacon(uint32_t port, Time currentTbtt, Time beaconInterval); + Ptr SendBeacon(uint32_t interface, Time currentTbtt, Time beaconInterval); /** * \brief When we receive a beacon from peer-station, we remember * its beacon timing element (needed for peer choosing mechanism), * and remember beacon timers - last beacon and beacon interval to * detect beacon loss and cancel links - * \param port is a port on which beacon was received + * \param interface is a interface on which beacon was received * \param timingElement is a timing element of remote beacon */ - void ReceiveBeacon(uint32_t port, IeDot11sBeaconTiming timingElement, Mac48Address peerAddress, Time receivingTime, Time beaconInterval); + void ReceiveBeacon( + uint32_t interface, + bool meshBeacon, + IeDot11sBeaconTiming timingElement, + Mac48Address peerAddress, + Time receivingTime, + Time beaconInterval + ); /** * \} */ @@ -226,8 +233,8 @@ public: * Deliver Peer link management information to the protocol-part * \param void is returning value - we pass a frame and forget * about it - * \param uint32_t - is a port ID of a given MAC (portID rather - * than MAC address, beacause many ports may have the same MAC) + * \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 uint16_t is association ID, which peer has assigned to * us @@ -236,11 +243,11 @@ public: * \param IeDot11sPeerManagement is peer link management element */ void ReceivePeerLinkFrame( - uint32_t port, + uint32_t interface, Mac48Address peerAddress, uint16_t aid, - IeDot11sConfiguration meshConfig, - IeDot11sPeerManagement peerManagementElement + IeDot11sPeerManagement peerManagementElement, + IeDot11sConfiguration meshConfig ); /** * \} @@ -253,18 +260,30 @@ private: * * pointers to proper plugins * \{ */ -// struct BeaconInfo -// { -// Time referenceTbtt; //When one of my station's beacons was put into a beacon queue; -// Time beaconInterval; //Beacon interval of my station; - // uint16_t aid; //Assoc ID - //}; + struct BeaconInfo + { + uint16_t aid; //Assoc ID + 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 BeaconInfoMap; + typedef std::map BeaconInterfaceInfoMap; + typedef std::map BeaconInfoMap; typedef std::map > PeerManagerPluginMap; + + PeerManagerPluginMap m_plugins; + /** + * Information related to beacons: + * \{ + */ + BeaconInfoMap m_neighbourBeacons; + static const uint8_t m_maxBeaconLoss = 3; /** + * \} * \} */ + uint16_t m_lastAssocId; + uint16_t m_lastLocalLinkId; #if 0 //Maximum peers that may be opened: uint8_t m_maxNumberOfPeerLinks; @@ -291,16 +310,16 @@ private: Time m_peerLinkCleanupPeriod; EventId m_cleanupEvent; Ptr AddDescriptor ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Mac48Address peerAddress, Time lastBeacon, Time beaconInterval ); void PeerCleanup (); //Mechanism of choosing PEERs: - bool ShouldSendOpen (Mac48Address portAddress, Mac48Address peerAddress); + bool ShouldSendOpen (Mac48Address interfaceAddress, Mac48Address peerAddress); bool ShouldAcceptOpen ( - Mac48Address portAddress, + Mac48Address interfaceAddress, Mac48Address peerAddress, dot11sReasonCode & reasonCode ); @@ -315,7 +334,7 @@ private: * \param status true - peer link opened, peer * link closed otherwise */ - void PeerLinkStatus (Mac48Address portAddress, Mac48Address peerAddress, bool status); + void PeerLinkStatus (Mac48Address interfaceAddress, Mac48Address peerAddress, bool status); #endif }; } //namespace ns3 diff --git a/src/devices/mesh/wifi-information-element.cc b/src/devices/mesh/wifi-information-element.cc index e64b0806a..d556d9296 100644 --- a/src/devices/mesh/wifi-information-element.cc +++ b/src/devices/mesh/wifi-information-element.cc @@ -64,6 +64,7 @@ void WifiInformationElement::Print (std::ostream &os) const PrintInformation (os); os << "\n"; } + bool WifiInformationElement::FindMyInformationElement(Ptr packet) { const uint8_t * data = packet->PeekData(); @@ -72,15 +73,16 @@ bool WifiInformationElement::FindMyInformationElement(Ptr packet) { if(data[position] == ElementId()) { - + Ptr myIe = packet->CreateFragment(position, data[position+1]+2); + NS_ASSERT(myIe->GetSize() == (uint32_t)(data[position+1]+2)); + myIe->RemoveHeader(*this); return true; } else { - NS_LOG_UNCOND("not found"<<(uint16_t)data[position]); + if(data[position] > ElementId()) + return false; position +=data[position+1]+2; - //if(data[position + 1] == 0) - // return false; } } return false;