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"
42 m_ifIndex (ifIndex), m_protocol (protocol)
63 NS_FATAL_ERROR (
"HWMP tag is not supposed to be received by network");
73 switch (meshHdr.GetAddressExt ())
81 "6-address scheme is not yet supported and 4-address extension is not supposed to be used for data frames.");
83 tag.
SetSeqno (meshHdr.GetMeshSeqno ());
84 tag.
SetTtl (meshHdr.GetMeshTtl ());
108 std::vector<HwmpProtocol::FailedDestination> failedDestinations;
120 if (preq->GetOriginatorAddress () ==
m_protocol->GetAddress ())
124 if (preq->GetTtl () == 0)
128 preq->DecrementTtl ();
137 if (prep->GetTtl () == 0)
141 prep->DecrementTtl ();
150 std::vector<HwmpProtocol::FailedDestination> destinations = perr->GetAddressUnitVector ();
151 for (std::vector<HwmpProtocol::FailedDestination>::const_iterator i = destinations.begin (); i
152 != destinations.end (); i++)
154 failedDestinations.push_back (*i);
158 if (failedDestinations.size () > 0)
222 std::vector<IePreq> preq_vector;
223 preq_vector.push_back (preq);
231 for (std::vector<IePreq>::iterator i = preq.begin (); i != preq.end (); i++)
246 for (std::vector<Mac48Address>::const_iterator i = receivers.begin (); i != receivers.end (); i++)
252 m_parent->SendManagementFrame (packet, hdr);
259 for (std::vector<IePreq>::iterator i =
m_myPreq.begin (); i !=
m_myPreq.end (); i++)
266 i->AddDestinationAddressElement (
m_protocol->GetDoFlag (),
m_protocol->GetRfFlag (), dst, dst_seqno);
319 m_parent->SendManagementFrame (packet, hdr);
329 for (std::vector<HwmpProtocol::FailedDestination>::const_iterator i = failedDestinations.begin (); i
330 != failedDestinations.end (); i++)
332 if (!perr->IsFull ())
334 perr->AddAddressUnit (*i);
342 if (perr->GetNumOfDest () > 0)
344 elements.AddInformationElement (perr);
355 if (receivers.size () >=
m_protocol->GetUnicastPerrThreshold ())
361 for (std::vector<Mac48Address>::const_iterator i = receivers.begin (); i != receivers.end (); i++)
372 m_parent->SendManagementFrame (packet, hdr);
382 std::vector<Mac48Address>::const_iterator end = receivers.end ();
383 for (std::vector<Mac48Address>::const_iterator i = receivers.begin (); i != end; i++)
385 bool should_add =
true;
386 for (std::vector<Mac48Address>::const_iterator j =
m_myPerr.
receivers.begin (); j
401 std::vector<HwmpProtocol::FailedDestination>::const_iterator end = failedDestinations.end ();
402 for (std::vector<HwmpProtocol::FailedDestination>::const_iterator i = failedDestinations.begin (); i != end; i++)
404 bool should_add =
true;
405 for (std::vector<HwmpProtocol::FailedDestination>::const_iterator j =
m_myPerr.
destinations.begin (); j
408 if (((*i).destination == (*j).destination) && ((*j).seqnum > (*i).seqnum))
437 return m_parent->GetLinkMetric (peerAddress);
442 return m_parent->GetFrequencyChannel ();
445 txPreq (0), rxPreq (0), txPrep (0), rxPrep (0), txPerr (0), rxPerr (0), txMgt (0), txMgtBytes (0),
446 rxMgt (0), rxMgtBytes (0), txData (0), txDataBytes (0), rxData (0), rxDataBytes (0)
453 "txPreq= \"" << txPreq <<
"\"" << std::endl <<
454 "txPrep=\"" << txPrep <<
"\"" << std::endl <<
455 "txPerr=\"" << txPerr <<
"\"" << std::endl <<
456 "rxPreq=\"" << rxPreq <<
"\"" << std::endl <<
457 "rxPrep=\"" << rxPrep <<
"\"" << std::endl <<
458 "rxPerr=\"" << rxPerr <<
"\"" << std::endl <<
459 "txMgt=\"" << txMgt <<
"\"" << std::endl <<
460 "txMgtBytes=\"" << txMgtBytes <<
"\"" << std::endl <<
461 "rxMgt=\"" << rxMgt <<
"\"" << std::endl <<
462 "rxMgtBytes=\"" << rxMgtBytes <<
"\"" << std::endl <<
463 "txData=\"" << txData <<
"\"" << std::endl <<
464 "txDataBytes=\"" << txDataBytes <<
"\"" << std::endl <<
465 "rxData=\"" << rxData <<
"\"" << std::endl <<
466 "rxDataBytes=\"" << rxDataBytes <<
"\"/>" << std::endl;
471 os <<
"<HwmpProtocolMac" << std::endl <<
472 "address =\"" <<
m_parent->GetAddress () <<
"\">" << std::endl;
474 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)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
See 7.3.2.97 of 802.11s draft 2.07.
uint32_t GetSize(void) const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
std::vector< IePreq > m_myPreq
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
bool IsRunning(void) const
This method is syntactic sugar for !IsExpired().
#define NS_LOG_FUNCTION_NOARGS()
Output the name of the function.
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()
static EventId Schedule(Time const &delay, MEM mem_ptr, OBJ obj)
Schedule an event to expire after delay.
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.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
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