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     .SetGroupName (
"Mesh")
 
   56     .AddAttribute ( 
"MaxNumberOfPeerLinks",
 
   57                     "Maximum number of peer links",
 
   61                     MakeUintegerChecker<uint8_t> ()
 
   63     .AddAttribute ( 
"MaxBeaconShiftValue",
 
   64                     "Maximum number of TUs for beacon shifting",
 
   68                     MakeUintegerChecker<uint16_t> ()
 
   70     .AddAttribute ( 
"EnableBeaconCollisionAvoidance",
 
   71                     "Enable/Disable Beacon collision avoidance.",
 
   77     .AddTraceSource (
"LinkOpen",
 
   78                      "New peer link opened",
 
   80                      "ns3::PeerManagementProtocol::LinkOpenCloseTracedCallback" 
   82     .AddTraceSource (
"LinkClose",
 
   83                      "New peer link closed",
 
   85                      "ns3::PeerManagementProtocol::LinkOpenCloseTracedCallback" 
   92   m_lastAssocId (0), m_lastLocalLinkId (1), m_enableBca (true), m_maxBeaconShift (15)
 
  107       for (PeerLinksOnInterface::iterator i = j->second.begin (); i != j->second.end (); i++)
 
  120   std::vector<Ptr<NetDevice> > 
interfaces = mp->GetInterfaces ();
 
  121   for (std::vector<
Ptr<NetDevice> >::iterator i = interfaces.begin (); i != interfaces.end (); i++)
 
  134       mac->InstallPlugin (plugin);
 
  141   mp->AggregateObject (
this);
 
  153   PeerLinksMap::iterator iface = 
m_peerLinks.find (interface);
 
  155   for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end (); i++)
 
  159       if ((*i)->GetBeaconInterval () == 
Seconds (0))
 
  164       retval->AddNeighboursTimingElementUnit ((*i)->GetLocalAid (), (*i)->GetLastBeacon (),
 
  165                                               (*i)->GetBeaconInterval ());
 
  174   for (PeerManagementProtocolMacMap::const_iterator i = 
m_plugins.begin (); i != 
m_plugins.end (); i++)
 
  176       if (i->second->GetAddress () == peerAddress)
 
  187           peerLink->MLMEActivePeerLinkOpen ();
 
  194   peerLink->SetBeaconInformation (
Simulator::Now (), beaconInterval);
 
  197       peerLink->SetBeaconTimingElement (*
PeekPointer (timingElement));
 
  213           peerLink = 
InitiateLink (interface, peerAddress, peerMeshPointAddress);
 
  217           peerLink->OpenAccept (peerManagementElement.
GetLocalLinkId (), meshConfig, peerMeshPointAddress);
 
  221           peerLink->OpenReject (peerManagementElement.
GetLocalLinkId (), meshConfig, peerMeshPointAddress,
 
  232                                peerManagementElement.
GetPeerLinkId (), aid, meshConfig, peerMeshPointAddress);
 
  252   NS_LOG_DEBUG (
"transmission failed between "<<
GetAddress () << 
" and " << peerAddress << 
" failed, link will be closed");
 
  256       peerLink->TransmissionFailure ();
 
  266       peerLink->TransmissionSuccess ();
 
  280   PeerManagementProtocolMacMap::iterator plugin = 
m_plugins.find (interface);
 
  282   PeerLinksMap::iterator iface = 
m_peerLinks.find (interface);
 
  285   new_link->SetInterface (interface);
 
  287   new_link->SetPeerAddress (peerAddress);
 
  288   new_link->SetPeerMeshPointAddress (peerMeshPointAddress);
 
  289   new_link->SetMacPlugin (plugin->second);
 
  291   iface->second.push_back (new_link);
 
  298   PeerLinksMap::iterator iface = 
m_peerLinks.find (interface);
 
  300   for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end (); i++)
 
  302       if ((*i)->GetPeerAddress () == peerAddress)
 
  304           if ((*i)->LinkIsIdle ())
 
  307               (iface->second).erase (i);
 
  325 std::vector<Mac48Address>
 
  328   std::vector<Mac48Address> retval;
 
  329   PeerLinksMap::const_iterator iface = 
m_peerLinks.find (interface);
 
  331   for (PeerLinksOnInterface::const_iterator i = iface->second.begin (); i != iface->second.end (); i++)
 
  333       if ((*i)->LinkIsEstab ())
 
  335           retval.push_back ((*i)->GetPeerAddress ());
 
  341 std::vector< Ptr<PeerLink> >
 
  344   std::vector< Ptr<PeerLink> > links;
 
  348       for (PeerLinksOnInterface::const_iterator i = iface->second.begin ();
 
  349            i != iface->second.end (); i++)
 
  350         if ((*i)->LinkIsEstab ())
 
  351           links.push_back (*i);
 
  361       return (peerLink->LinkIsEstab ());
 
  390   PeerLinksMap::iterator iface = 
m_peerLinks.find (interface);
 
  394   std::map<uint32_t, Time>::const_iterator lastBeacon = 
m_lastBeacon.find (interface);
 
  395   std::map<uint32_t, Time>::const_iterator beaconInterval = 
m_beaconInterval.find (interface);
 
  401   uint16_t lastBeaconInTimeElement = (uint16_t) ((lastBeacon->second.GetMicroSeconds () >> 8) & 0xffff);
 
  405   if (iface->second.size () == 0)
 
  413   for (PeerLinksOnInterface::iterator i = iface->second.begin (); i != iface->second.end (); i++)
 
  415       bool myBeaconExists = 
false;
 
  417       for (IeBeaconTiming::NeighboursTimingUnitsList::const_iterator j = neighbors.begin (); j != neighbors.end (); j++)
 
  419           if ((*i)->GetPeerAid () == (*j)->GetAid ())
 
  422               myBeaconExists = 
true;
 
  426             ((int16_t) ((*j)->GetLastBeacon () - lastBeaconInTimeElement) >= 0) &&
 
  427             (((*j)->GetLastBeacon () - lastBeaconInTimeElement) % (4 * 
TimeToTu (beaconInterval->second)) == 0)
 
  453   PeerManagementProtocolMacMap::iterator plugin = 
m_plugins.find (interface);
 
  455   plugin->second->SetBeaconShift (
TuToTime (shift));
 
  472   NS_LOG_LOGIC (
"link_open " << myIface << 
" " << peerIface);
 
  485   NS_LOG_LOGIC (
"link_close " << myIface << 
" " << peerIface);
 
  499   PeerManagementProtocolMacMap::iterator plugin = 
m_plugins.find (interface);
 
  502                     << plugin->second->GetAddress ()
 
  503                     << 
" and peer mesh point:" << peerMeshPointAddress << 
" and its interface:" << peerAddress
 
  504                     << 
", at my interface ID:" << 
interface << ". State movement:" << PeerLink::PeerStateNames[ostate] 
 
  505                     << " -> " << PeerLink::PeerStateNames[nstate]);
 
  506   if ((nstate == PeerLink::ESTAB) && (ostate != PeerLink::ESTAB))
 
  508       NotifyLinkOpen (peerMeshPointAddress, peerAddress, plugin->second->GetAddress (), interface);
 
  510   if ((ostate == PeerLink::ESTAB) && (nstate != PeerLink::ESTAB))
 
  512       NotifyLinkClose (peerMeshPointAddress, peerAddress, plugin->second->GetAddress (), interface);
 
  514   if (nstate == PeerLink::IDLE)
 
  549   linksTotal (t), linksOpened (0), linksClosed (0)
 
  556   "linksTotal=\"" << linksTotal << 
"\" " 
  557   "linksOpened=\"" << linksOpened << 
"\" " 
  558   "linksClosed=\"" << linksClosed << 
"\"/>" << std::endl;
 
  563   os << 
"<PeerManagementProtocol>" << std::endl;
 
  572       for (PeerLinksOnInterface::const_iterator i = iface->second.begin (); i != iface->second.end (); i++)
 
  577   os << 
"</PeerManagementProtocol>" << std::endl;
 
  585       plugins->second->ResetStats ();
 
PeerLinksMap m_peerLinks
Simple link open/close trace source type. Addresses are: src interface, dst interface. 
 
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 the RngStream. 
 
AttributeValue implementation for Boolean. 
 
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system. 
 
uint16_t GetLocalLinkId() const 
Get local link ID function. 
 
uint8_t m_maxNumberOfPeerLinks
maimum number of peer links 
 
Ptr< IeMeshId > m_meshId
mesh ID 
 
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)
Report a fatal error with a message and terminate. 
 
Ptr< UniformRandomVariable > m_beaconShift
Add randomness to beacon shift. 
 
static TypeId GetTypeId()
Get the type ID. 
 
Ptr< PeerLink > FindPeerLink(uint32_t interface, Mac48Address peerAddress)
Find active peer link by my interface and peer interface MAC. 
 
void Report(std::ostream &os) const 
: Report statistics 
 
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. 
 
uint16_t linksClosed
links closed 
 
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
last local link ID 
 
bool SubtypeIsOpen() const 
Subtype is open function. 
 
bool IsActiveLink(uint32_t interface, Mac48Address peerAddress)
Checks if there is established link. 
 
NS_ASSERT_MSG(false,"Ipv4AddressGenerator::MaskToIndex(): Impossible")
 
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. 
 
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay. 
 
according to IEEE 802.11 - 2012 
 
int64_t GetMicroSeconds(void) const 
Get an approximation of the time stored in this instance in the indicated unit. 
 
int TimeToTu(Time x)
plugins 
 
Mac48Address m_address
addresss 
 
Hold an unsigned integer type. 
 
void SetMeshId(std::string s)
Set mesh ID to a string value. 
 
uint16_t linksTotal
total links 
 
void Print(std::ostream &os) const 
Print function. 
 
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. 
 
std::vector< Ptr< PeerLink > > GetPeerLinks() const 
Get list of all active peer links. 
 
static Mac48Address ConvertFrom(const Address &address)
 
uint8_t GetNumberOfLinks()
Get number of links. 
 
~PeerManagementProtocol()
 
Ptr< IeMeshId > GetMeshId() const 
Get mesh ID information element. 
 
Every class exported by the ns3 library is enclosed in the ns3 namespace. 
 
uint16_t GetPeerLinkId() const 
Get peer link ID function. 
 
Ptr< const AttributeChecker > MakeBooleanChecker(void)
 
PeerManagementProtocolMacMap m_plugins
plugins 
 
uint16_t m_lastAssocId
last associated ID 
 
Statistics(uint16_t t=0)
Constructor. 
 
LinkEventCallback m_linkOpenTraceSrc
LinkOpen trace source. 
 
static Time Now(void)
Return the current simulation virtual time. 
 
void ShiftOwnBeacon(uint32_t interface)
Shift own beacon function. 
 
NS_LOG_LOGIC("Net device "<< nd<< " is not bridged")
 
void ReceivePeerLinkFrame(uint32_t interface, Mac48Address peerAddress, Mac48Address peerMeshPointAddress, uint16_t aid, IePeerManagement peerManagementElement, IeConfiguration meshConfig)
Methods that handle Peer link management frames interaction: 
 
void ResetStats()
Reset statistics function. 
 
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. 
 
bool ShouldSendOpen(uint32_t interface, Mac48Address peerAddress)
Indicates changes in peer links. 
 
void ConfigurationMismatch(uint32_t interface, Mac48Address peerAddress)
Cancels peer link due to broken configuration (Mesh ID or Supported rates) 
 
struct Statistics m_stats
statistics 
 
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 
Get beacon collision avoidance. 
 
bool SubtypeIsClose() const 
Subtype is close function. 
 
PmpReasonCode
Codes used by 802.11s Peer Management Protocol. 
 
bool ShouldAcceptOpen(uint32_t interface, Mac48Address peerAddress, PmpReasonCode &reasonCode)
Indicates changes in peer links. 
 
#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. 
 
Time TuToTime(int x)
plugins 
 
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. 
 
uint16_t linksOpened
opened links 
 
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)
Initiate link functon. 
 
TypeId SetParent(TypeId tid)
Set the parent TypeId. 
 
Basic MAC of mesh point Wi-Fi interface. 
 
bool Install(Ptr< MeshPointDevice >)
Install PMP on given mesh point. 
 
PmpReasonCode GetReasonCode() const 
Get reason code function. 
 
void TransmissionSuccess(uint32_t interface, const Mac48Address peerAddress)
resets transmission failure statistics 
 
802.11s Peer Management Protocol model 
 
bool SubtypeIsConfirm() const 
Subtype is confirm function.