22 #include "ns3/peer-management-protocol.h"
26 #include "ns3/mesh-point-device.h"
27 #include "ns3/simulator.h"
28 #include "ns3/assert.h"
30 #include "ns3/random-variable-stream.h"
31 #include "ns3/mesh-wifi-interface-mac.h"
32 #include "ns3/mesh-wifi-interface-mac-plugin.h"
33 #include "ns3/wifi-net-device.h"
34 #include "ns3/trace-source-accessor.h"
50 static TypeId tid =
TypeId (
"ns3::dot11s::PeerManagementProtocol")
52 .AddConstructor<PeerManagementProtocol> ()
55 .AddAttribute (
"MaxNumberOfPeerLinks",
56 "Maximum number of peer links",
60 MakeUintegerChecker<uint8_t> ()
62 .AddAttribute (
"MaxBeaconShiftValue",
63 "Maximum number of TUs for beacon shifting",
67 MakeUintegerChecker<uint16_t> ()
69 .AddAttribute (
"EnableBeaconCollisionAvoidance",
70 "Enable/Disable Beacon collision avoidance.",
76 .AddTraceSource (
"LinkOpen",
77 "New peer link opened",
79 "ns3::PeerManagementProtocol::LinkOpenCloseTracedCallback"
81 .AddTraceSource (
"LinkClose",
82 "New peer link closed",
84 "ns3::PeerManagementProtocol::LinkOpenCloseTracedCallback"
91 m_lastAssocId (0), m_lastLocalLinkId (1), m_enableBca (true), m_maxBeaconShift (15)
106 for (PeerLinksOnInterface::iterator i = j->second.begin (); i != j->second.end (); i++)
119 std::vector<Ptr<NetDevice> >
interfaces = mp->GetInterfaces ();
120 for (std::vector<
Ptr<NetDevice> >::iterator i = interfaces.begin (); i != interfaces.end (); i++)
133 mac->InstallPlugin (plugin);
140 mp->AggregateObject (
this);
152 PeerLinksMap::iterator iface =
m_peerLinks.find (interface);
154 for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end (); i++)
158 if ((*i)->GetBeaconInterval () ==
Seconds (0))
163 retval->AddNeighboursTimingElementUnit ((*i)->GetLocalAid (), (*i)->GetLastBeacon (),
164 (*i)->GetBeaconInterval ());
173 for (PeerManagementProtocolMacMap::const_iterator i =
m_plugins.begin (); i !=
m_plugins.end (); i++)
175 if (i->second->GetAddress () == peerAddress)
186 peerLink->MLMEActivePeerLinkOpen ();
193 peerLink->SetBeaconInformation (
Simulator::Now (), beaconInterval);
196 peerLink->SetBeaconTimingElement (*
PeekPointer (timingElement));
212 peerLink =
InitiateLink (interface, peerAddress, peerMeshPointAddress);
216 peerLink->OpenAccept (peerManagementElement.
GetLocalLinkId (), meshConfig, peerMeshPointAddress);
220 peerLink->OpenReject (peerManagementElement.
GetLocalLinkId (), meshConfig, peerMeshPointAddress,
231 peerManagementElement.
GetPeerLinkId (), aid, meshConfig, peerMeshPointAddress);
251 NS_LOG_DEBUG (
"transmission failed between "<<
GetAddress () <<
" and " << peerAddress <<
" failed, link will be closed");
255 peerLink->TransmissionFailure ();
265 peerLink->TransmissionSuccess ();
279 PeerManagementProtocolMacMap::iterator plugin =
m_plugins.find (interface);
281 PeerLinksMap::iterator iface =
m_peerLinks.find (interface);
284 new_link->SetInterface (interface);
286 new_link->SetPeerAddress (peerAddress);
287 new_link->SetPeerMeshPointAddress (peerMeshPointAddress);
288 new_link->SetMacPlugin (plugin->second);
290 iface->second.push_back (new_link);
297 PeerLinksMap::iterator iface =
m_peerLinks.find (interface);
299 for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end (); i++)
301 if ((*i)->GetPeerAddress () == peerAddress)
303 if ((*i)->LinkIsIdle ())
306 (iface->second).erase (i);
324 std::vector<Mac48Address>
327 std::vector<Mac48Address> retval;
328 PeerLinksMap::const_iterator iface =
m_peerLinks.find (interface);
330 for (PeerLinksOnInterface::const_iterator i = iface->second.begin (); i != iface->second.end (); i++)
332 if ((*i)->LinkIsEstab ())
334 retval.push_back ((*i)->GetPeerAddress ());
340 std::vector< Ptr<PeerLink> >
343 std::vector< Ptr<PeerLink> > links;
347 for (PeerLinksOnInterface::const_iterator i = iface->second.begin ();
348 i != iface->second.end (); i++)
349 if ((*i)->LinkIsEstab ())
350 links.push_back (*i);
360 return (peerLink->LinkIsEstab ());
389 PeerLinksMap::iterator iface =
m_peerLinks.find (interface);
393 std::map<uint32_t, Time>::const_iterator lastBeacon =
m_lastBeacon.find (interface);
394 std::map<uint32_t, Time>::const_iterator beaconInterval =
m_beaconInterval.find (interface);
400 uint16_t lastBeaconInTimeElement = (uint16_t) ((lastBeacon->second.GetMicroSeconds () >> 8) & 0xffff);
404 if (iface->second.size () == 0)
412 for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end (); i++)
414 bool myBeaconExists =
false;
416 for (IeBeaconTiming::NeighboursTimingUnitsList::const_iterator j = neighbors.begin (); j != neighbors.end (); j++)
418 if ((*i)->GetPeerAid () == (*j)->GetAid ())
421 myBeaconExists =
true;
425 ((int16_t) ((*j)->GetLastBeacon () - lastBeaconInTimeElement) >= 0) &&
426 (((*j)->GetLastBeacon () - lastBeaconInTimeElement) % (4 *
TimeToTu (beaconInterval->second)) == 0)
452 PeerManagementProtocolMacMap::iterator plugin =
m_plugins.find (interface);
454 plugin->second->SetBeaconShift (
TuToTime (shift));
471 NS_LOG_LOGIC (
"link_open " << myIface <<
" " << peerIface);
484 NS_LOG_LOGIC (
"link_close " << myIface <<
" " << peerIface);
498 PeerManagementProtocolMacMap::iterator plugin =
m_plugins.find (interface);
501 <<
" and peer mesh point:" << peerMeshPointAddress <<
" and its interface:" << peerAddress
502 <<
", at my interface ID:" <<
interface << ". State movement:" << ostate << " -> " << nstate);
503 if ((nstate == PeerLink::ESTAB) && (ostate != PeerLink::ESTAB))
505 NotifyLinkOpen (peerMeshPointAddress, peerAddress, plugin->second->GetAddress (), interface);
507 if ((ostate == PeerLink::ESTAB) && (nstate != PeerLink::ESTAB))
509 NotifyLinkClose (peerMeshPointAddress, peerAddress, plugin->second->GetAddress (), interface);
511 if (nstate == PeerLink::IDLE)
546 linksTotal (t), linksOpened (0), linksClosed (0)
553 "linksTotal=\"" << linksTotal <<
"\" "
554 "linksOpened=\"" << linksOpened <<
"\" "
555 "linksClosed=\"" << linksClosed <<
"\"/>" << std::endl;
560 os <<
"<PeerManagementProtocol>" << std::endl;
569 for (PeerLinksOnInterface::const_iterator i = iface->second.begin (); i != iface->second.end (); i++)
574 os <<
"</PeerManagementProtocol>" << std::endl;
582 plugins->second->ResetStats ();
Simulation virtual time values and global simulation resolution.
void NotifyLinkClose(Mac48Address peerMp, Mac48Address peerIface, Mac48Address myIface, uint32_t interface)
Aux. method to register closed links.
virtual void DoInitialize()
Initialize() implementation.
Smart pointer class similar to boost::intrusive_ptr.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by "...
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
AttributeValue implementation for Boolean.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
uint16_t GetLocalLinkId() const
uint8_t m_maxNumberOfPeerLinks
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
U * PeekPointer(const Ptr< U > &p)
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
void NotifyLinkOpen(Mac48Address peerMp, Mac48Address peerIface, Mac48Address myIface, uint32_t interface)
Aux. method to register open links.
#define NS_FATAL_ERROR(msg)
Fatal error handling.
Ptr< UniformRandomVariable > m_beaconShift
Add randomness to beacon shift.
void Report(std::ostream &) const
: Report statistics
static TypeId GetTypeId()
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached.
Ptr< PeerLink > FindPeerLink(uint32_t interface, Mac48Address peerAddress)
Find active peer link by my interface and peer interface MAC.
std::vector< Ptr< IeBeaconTimingUnit > > NeighboursTimingUnitsList
This type is a list of timing elements obtained from neighbours with their beacons: ...
LinkEventCallback m_linkCloseTraceSrc
LinkClose trace source.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
PeerState
Peer Link state:
uint16_t m_lastLocalLinkId
bool SubtypeIsOpen() const
bool IsActiveLink(uint32_t interface, Mac48Address peerAddress)
Checks if there is established link.
std::vector< Ptr< PeerLink > > PeerLinksOnInterface
We keep a vector of pointers to PeerLink class.
std::vector< Mac48Address > GetPeers(uint32_t interface) const
Get list of active peers of my given interface.
See 7.3.2.85 of draft 2.07.
int64_t GetMicroSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
Hold an unsigned integer type.
void SetMeshId(std::string s)
Set peer link status change callback.
void Print(std::ostream &os) const
void DoDispose()
Destructor implementation.
Hold together all Wifi-related objects.
static Mac48Address GetBroadcast(void)
void NotifyBeaconSent(uint32_t interface, Time beaconInterval)
Notify about beacon send event, needed to schedule BCA.
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
Mac48Address GetAddress()
Get mesh point address.
void SetPeerLinkStatusCallback(Callback< void, Mac48Address, Mac48Address, uint32_t, bool > cb)
Set peer link status change callback.
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
std::vector< Ptr< PeerLink > > GetPeerLinks() const
Get list of all active peer links.
static Mac48Address ConvertFrom(const Address &address)
uint8_t GetNumberOfLinks()
Set peer link status change callback.
~PeerManagementProtocol()
Ptr< IeMeshId > GetMeshId() const
Set peer link status change callback.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
uint16_t GetPeerLinkId() const
Ptr< const AttributeChecker > MakeBooleanChecker(void)
PeerManagementProtocolMacMap m_plugins
LinkEventCallback m_linkOpenTraceSrc
LinkOpen trace source.
static Time Now(void)
Return the current simulation virtual time.
void ShiftOwnBeacon(uint32_t interface)
void ReceivePeerLinkFrame(uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddress, uint16_t aid, IePeerManagement peerManagementElement, IeConfiguration meshConfig)
Methods that handle Peer link management frames interaction:
Ptr< IeBeaconTiming > GetBeaconTimingElement(uint32_t interface)
When we are sending a beacon - we fill beacon timing element.
void PeerLinkStatus(uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddres, PeerLink::PeerState ostate, PeerLink::PeerState nstate)
Indicates changes in peer links.
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
bool ShouldSendOpen(uint32_t interface, Mac48Address peerAddress)
void ConfigurationMismatch(uint32_t interface, Mac48Address peerAddress)
Cancels peer link due to broken configuration (Mesh ID or Supported rates)
struct Statistics m_stats
void TransmissionFailure(uint32_t interface, const Mac48Address peerAddress)
Cancels peer link due to successive transmission failures.
void CheckBeaconCollisions(uint32_t interface)
BCA.
std::map< uint32_t, Time > m_lastBeacon
Last beacon at each interface.
bool GetBeaconCollisionAvoidance() const
Set peer link status change callback.
bool SubtypeIsClose() const
PmpReasonCode
Codes used by 802.11s Peer Management Protocol.
bool ShouldAcceptOpen(uint32_t interface, Mac48Address peerAddress, PmpReasonCode &reasonCode)
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
Time Seconds(double value)
Construct a Time in the indicated unit.
bool m_enableBca
Flag which enables BCA.
void ReceiveBeacon(uint32_t interface, Mac48Address peerAddress, Time beaconInterval, Ptr< IeBeaconTiming > beaconTiming)
To initiate peer link we must notify about received beacon.
Describes Mesh Configuration Element see 7.3.2.86 of 802.11s draft 3.0.
std::map< uint32_t, Time > m_beaconInterval
Beacon interval at each interface.
void SetBeaconCollisionAvoidance(bool enable)
Enable or disable beacon collision avoidance.
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
A base class which provides memory management and object aggregation.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
This class can be used to hold variables of floating point type such as 'double' or 'float'...
uint16_t m_maxBeaconShift
Beacon can be shifted at [-m_maxBeaconShift; +m_maxBeaconShift] TUs.
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
Callback< void, Mac48Address, Mac48Address, uint32_t, bool > m_peerStatusCallback
Callback to notify about peer link changes: Mac48Address is peer address of mesh point, Mac48Address is peer address of interface, uint32_t - interface ID, bool is status - true when new link has appeared, false - when link was closed,.
a unique identifier for an interface.
Ptr< PeerLink > InitiateLink(uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddress)
TypeId SetParent(TypeId tid)
Basic MAC of mesh point Wi-Fi interface.
bool Install(Ptr< MeshPointDevice >)
Install PMP on given mesh point.
PmpReasonCode GetReasonCode() const
void TransmissionSuccess(uint32_t interface, const Mac48Address peerAddress)
resets transmission failure statistics
bool SubtypeIsConfirm() const