21 #include "ns3/mesh-wifi-interface-mac.h" 
   22 #include "ns3/packet.h" 
   23 #include "ns3/simulator.h" 
   24 #include "ns3/nstime.h" 
   26 #include "ns3/mgt-headers.h" 
   40   m_ifIndex (ifIndex), m_protocol (protocol)
 
   61       NS_FATAL_ERROR (
"HWMP tag is not supposed to be received by network");
 
   71   switch (meshHdr.GetAddressExt ())
 
   79         "6-address scheme is not yet supported and 4-address extension is not supposed to be used for data frames.");
 
   81   tag.
SetSeqno (meshHdr.GetMeshSeqno ());
 
   82   tag.
SetTtl (meshHdr.GetMeshTtl ());
 
  106   std::vector<HwmpProtocol::FailedDestination> failedDestinations;
 
  118           if (preq->GetOriginatorAddress () == 
m_protocol->GetAddress ())
 
  122           if (preq->GetTtl () == 0)
 
  126           preq->DecrementTtl ();
 
  135           if (prep->GetTtl () == 0)
 
  139           prep->DecrementTtl ();
 
  148           std::vector<HwmpProtocol::FailedDestination> destinations = perr->GetAddressUnitVector ();
 
  149           for (std::vector<HwmpProtocol::FailedDestination>::const_iterator i = destinations.begin (); i
 
  150                != destinations.end (); i++)
 
  152               failedDestinations.push_back (*i);
 
  156   if (failedDestinations.size () > 0)
 
  219   std::vector<IePreq> preq_vector;
 
  220   preq_vector.push_back (preq);
 
  228   for (std::vector<IePreq>::iterator i = preq.begin (); i != preq.end (); i++)
 
  243   for (std::vector<Mac48Address>::const_iterator i = receivers.begin (); i != receivers.end (); i++)
 
  249       m_parent->SendManagementFrame (packet, hdr);
 
  256   for (std::vector<IePreq>::iterator i = 
m_myPreq.begin (); i != 
m_myPreq.end (); i++)
 
  263       i->AddDestinationAddressElement (
m_protocol->GetDoFlag (), 
m_protocol->GetRfFlag (), dst, dst_seqno);
 
  316   m_parent->SendManagementFrame (packet, hdr);
 
  326   for (std::vector<HwmpProtocol::FailedDestination>::const_iterator i = failedDestinations.begin (); i
 
  327        != failedDestinations.end (); i++)
 
  329       if (!perr->IsFull ())
 
  331           perr->AddAddressUnit (*i);
 
  339   if (perr->GetNumOfDest () > 0)
 
  341       elements.AddInformationElement (perr);
 
  352   if (receivers.size () >= 
m_protocol->GetUnicastPerrThreshold ())
 
  358   for (std::vector<Mac48Address>::const_iterator i = receivers.begin (); i != receivers.end (); i++)
 
  369       m_parent->SendManagementFrame (packet, hdr);
 
  379     std::vector<Mac48Address>::const_iterator end = receivers.end ();
 
  380     for (std::vector<Mac48Address>::const_iterator i = receivers.begin (); i != end; i++)
 
  382         bool should_add = 
true;
 
  383         for (std::vector<Mac48Address>::const_iterator j = 
m_myPerr.
receivers.begin (); j
 
  398     std::vector<HwmpProtocol::FailedDestination>::const_iterator end = failedDestinations.end ();
 
  399     for (std::vector<HwmpProtocol::FailedDestination>::const_iterator i = failedDestinations.begin (); i != end; i++)
 
  401         bool should_add = 
true;
 
  402         for (std::vector<HwmpProtocol::FailedDestination>::const_iterator j = 
m_myPerr.
destinations.begin (); j
 
  405             if (((*i).destination == (*j).destination) && ((*j).seqnum > (*i).seqnum))
 
  434   return m_parent->GetLinkMetric (peerAddress);
 
  439   return m_parent->GetFrequencyChannel ();
 
  442   txPreq (0), rxPreq (0), txPrep (0), rxPrep (0), txPerr (0), rxPerr (0), txMgt (0), txMgtBytes (0),
 
  443   rxMgt (0), rxMgtBytes (0), txData (0), txDataBytes (0), rxData (0), rxDataBytes (0)
 
  450   "txPreq= \"" << txPreq << 
"\"" << std::endl <<
 
  451   "txPrep=\"" << txPrep << 
"\"" << std::endl <<
 
  452   "txPerr=\"" << txPerr << 
"\"" << std::endl <<
 
  453   "rxPreq=\"" << rxPreq << 
"\"" << std::endl <<
 
  454   "rxPrep=\"" << rxPrep << 
"\"" << std::endl <<
 
  455   "rxPerr=\"" << rxPerr << 
"\"" << std::endl <<
 
  456   "txMgt=\"" << txMgt << 
"\"" << std::endl <<
 
  457   "txMgtBytes=\"" << txMgtBytes << 
"\"" << std::endl <<
 
  458   "rxMgt=\"" << rxMgt << 
"\"" << std::endl <<
 
  459   "rxMgtBytes=\"" << rxMgtBytes << 
"\"" << std::endl <<
 
  460   "txData=\"" << txData << 
"\"" << std::endl <<
 
  461   "txDataBytes=\"" << txDataBytes << 
"\"" << std::endl <<
 
  462   "rxData=\"" << rxData << 
"\"" << std::endl <<
 
  463   "rxDataBytes=\"" << rxDataBytes << 
"\"/>" << std::endl;
 
  468   os << 
"<HwmpProtocolMac" << std::endl <<
 
  469   "address =\"" << 
m_parent->GetAddress () << 
"\">" << std::endl;
 
  471   os << 
"</HwmpProtocolMac>" << std::endl;
 
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer. 
 
bool ReceiveAction(Ptr< Packet > packet, const WifiMacHeader &header)
Receive action management frame. 
 
void SetPreqID(uint32_t id)
 
uint32_t GetLinkMetric(Mac48Address peerAddress) const 
 
smart pointer class similar to boost::intrusive_ptr 
 
void SetParent(Ptr< MeshWifiInterfaceMac > parent)
Update beacon is empty, because HWMP does not know anything about beacons. 
 
void SendMyPreq()
Sends one PREQ when PreqMinInterval after last PREQ expires (if any PREQ exists in rhe queue) ...
 
Hwmp tag implements interaction between HWMP protocol and MeshWifiMac. 
 
void SendPrep(IePrep prep, Mac48Address receiver)
Request a destination. 
 
void RequestDestination(Mac48Address dest, uint32_t originator_seqno, uint32_t dst_seqno)
Request a destination. 
 
void AddPacketTag(const Tag &tag) const 
Add a packet tag. 
 
#define NS_ASSERT(condition)
 
See 7.3.2.97 of 802.11s draft 2.07. 
 
uint32_t GetSize(void) const 
 
std::vector< IePreq > m_myPreq
 
bool IsRunning(void) const 
This method is syntactic sugar for the ns3::Simulator::isExpired method. 
 
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function. 
 
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
Schedule an event to expire at the relative time "time" is reached. 
 
#define NS_FATAL_ERROR(msg)
fatal error handling 
 
void SetLifetime(uint32_t lifetime)
 
void SendPreq(IePreq preq)
Request a destination. 
 
Mac48Address GetAddress()
 
bool PeekPacketTag(Tag &tag) const 
Search a matching tag and call Tag::Deserialize if it is found. 
 
static WifiActionHeader GetWifiActionHeader()
 
See 7.3.2.96 of 802.11s draft 2.07. 
 
Ptr< MeshWifiInterfaceMac > m_parent
 
static Mac48Address GetBroadcast(void)
 
std::vector< Mac48Address > receivers
 
void SetOriginatorAddress(Mac48Address originator_address)
 
HwmpProtocolMac(uint32_t, Ptr< HwmpProtocol >)
 
void SetOriginatorSeqNumber(uint32_t originator_seq_number)
 
void AddDestinationAddressElement(bool doFlag, bool rfFlag, Mac48Address dest_address, uint32_t dest_seq_number)
Add a destination address unit: flags, destination and sequence number. 
 
void Print(std::ostream &os) const 
 
std::vector< HwmpProtocol::FailedDestination > destinations
 
bool UpdateOutcomingFrame(Ptr< Packet > packet, WifiMacHeader &header, Mac48Address from, Mac48Address to)
Update beacon is empty, because HWMP does not know anything about beacons. 
 
Ptr< HwmpProtocol > m_protocol
 
int64_t AssignStreams(int64_t stream)
Update beacon is empty, because HWMP does not know anything about beacons. 
 
bool ReceiveData(Ptr< Packet > packet, const WifiMacHeader &header)
Receive data frame. 
 
NS_LOG_COMPONENT_DEFINE("HwmpProtocolMac")
 
bool RemovePacketTag(Tag &tag)
Remove a packet tag. 
 
void ForwardPerr(std::vector< HwmpProtocol::FailedDestination > destinations, std::vector< Mac48Address > receivers)
Request a destination. 
 
bool Receive(Ptr< Packet > packet, const WifiMacHeader &header)
Update beacon is empty, because HWMP does not know anything about beacons. 
 
void Report(std::ostream &) const 
Report statistics. 
 
void InitiatePerr(std::vector< HwmpProtocol::FailedDestination > destinations, std::vector< Mac48Address > receivers)
Request a destination. 
 
void SetSeqno(uint32_t seqno)
 
void SetHopcount(uint8_t hopcount)
 
void AddHeader(const Header &header)
Add header to this packet. 
 
uint16_t GetChannelId() const