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