26 #include "ns3/simulator.h"
27 #include "ns3/packet.h"
28 #include "ns3/mesh-point-device.h"
29 #include "ns3/wifi-net-device.h"
30 #include "ns3/mesh-point-device.h"
31 #include "ns3/mesh-wifi-interface-mac.h"
32 #include "ns3/random-variable-stream.h"
36 #include "ns3/trace-source-accessor.h"
50 .AddConstructor<HwmpProtocol> ()
51 .AddAttribute (
"RandomStart",
52 "Random delay at first proactive PREQ",
58 .AddAttribute (
"MaxQueueSize",
59 "Maximum number of packets we can store when resolving route",
61 MakeUintegerAccessor (
63 MakeUintegerChecker<uint16_t> (1)
65 .AddAttribute (
"Dot11MeshHWMPmaxPREQretries",
66 "Maximum number of retries before we suppose the destination to be unreachable",
68 MakeUintegerAccessor (
70 MakeUintegerChecker<uint8_t> (1)
72 .AddAttribute (
"Dot11MeshHWMPnetDiameterTraversalTime",
73 "Time we suppose the packet to go from one edge of the network to another",
79 .AddAttribute (
"Dot11MeshHWMPpreqMinInterval",
80 "Minimal interval between to successive PREQs",
86 .AddAttribute (
"Dot11MeshHWMPperrMinInterval",
87 "Minimal interval between to successive PREQs",
92 .AddAttribute (
"Dot11MeshHWMPactiveRootTimeout",
93 "Lifetime of poractive routing information",
99 .AddAttribute (
"Dot11MeshHWMPactivePathTimeout",
100 "Lifetime of reactive routing information",
106 .AddAttribute (
"Dot11MeshHWMPpathToRootInterval",
107 "Interval between two successive proactive PREQs",
113 .AddAttribute (
"Dot11MeshHWMPrannInterval",
114 "Lifetime of poractive routing information",
120 .AddAttribute (
"MaxTtl",
121 "Initial value of Time To Live field",
123 MakeUintegerAccessor (
125 MakeUintegerChecker<uint8_t> (2)
127 .AddAttribute (
"UnicastPerrThreshold",
128 "Maximum number of PERR receivers, when we send a PERR as a chain of unicasts",
130 MakeUintegerAccessor (
132 MakeUintegerChecker<uint8_t> (1)
134 .AddAttribute (
"UnicastPreqThreshold",
135 "Maximum number of PREQ receivers, when we send a PREQ as a chain of unicasts",
137 MakeUintegerAccessor (
139 MakeUintegerChecker<uint8_t> (1)
141 .AddAttribute (
"UnicastDataThreshold",
142 "Maximum number ofbroadcast receivers, when we send a broadcast as a chain of unicasts",
144 MakeUintegerAccessor (
146 MakeUintegerChecker<uint8_t> (1)
148 .AddAttribute (
"DoFlag",
149 "Destination only HWMP flag",
151 MakeBooleanAccessor (
153 MakeBooleanChecker ()
155 .AddAttribute (
"RfFlag",
156 "Reply and forward flag",
158 MakeBooleanAccessor (
160 MakeBooleanChecker ()
162 .AddTraceSource (
"RouteDiscoveryTime",
163 "The time of route discovery procedure",
176 m_randomStart (Seconds (0.1)),
177 m_maxQueueSize (255),
178 m_dot11MeshHWMPmaxPREQretries (3),
179 m_dot11MeshHWMPnetDiameterTraversalTime (MicroSeconds (1024*100)),
180 m_dot11MeshHWMPpreqMinInterval (MicroSeconds (1024*100)),
181 m_dot11MeshHWMPperrMinInterval (MicroSeconds (1024*100)),
182 m_dot11MeshHWMPactiveRootTimeout (MicroSeconds (1024*5000)),
183 m_dot11MeshHWMPactivePathTimeout (MicroSeconds (1024*5000)),
184 m_dot11MeshHWMPpathToRootInterval (MicroSeconds (1024*2000)),
185 m_dot11MeshHWMPrannInterval (MicroSeconds (1024*5000)),
188 m_unicastPerrThreshold (32),
189 m_unicastPreqThreshold (1),
190 m_unicastDataThreshold (1),
219 i->second.preqTimeout.Cancel ();
233 uint32_t sourceIface,
237 uint16_t protocolType,
248 NS_FATAL_ERROR (
"HWMP tag has come with a packet from upper layer. This must not occur...");
261 NS_FATAL_ERROR (
"HWMP tag is supposed to be here at this point.");
275 std::vector<uint16_t> channels;
278 bool shouldSend =
true;
279 for (std::vector<uint16_t>::const_iterator chan = channels.begin (); chan != channels.end (); chan++)
281 if ((*chan) == plugin->second->GetChannelId ())
290 channels.push_back (plugin->second->GetChannelId ());
292 for (std::vector<Mac48Address>::const_iterator i = receivers.begin (); i != receivers.end (); i++)
302 routeReply (
true, packetCopy, source, destination, protocolType, plugin->first);
308 return ForwardUnicast (sourceIface, source, destination, packet, protocolType, routeReply, tag.
GetTtl ());
319 NS_FATAL_ERROR (
"HWMP tag must exist when packet received from the network");
332 result =
m_rtable->LookupProactive ();
342 routeReply (
true, packet, source, destination, protocolType, result.
ifIndex);
351 result =
m_rtable->LookupReactiveExpired (destination);
359 result =
m_rtable->LookupProactiveExpired ();
363 std::vector<FailedDestination> destinations =
m_rtable->GetUnreachableDestinations (result.
retransmitter);
370 result =
m_rtable->LookupReactiveExpired (destination);
374 uint32_t dst_seqno = 0;
377 dst_seqno = result.
seqnum;
382 i->second->RequestDestination (destination, originator_seqno, dst_seqno);
387 pkt.
dst = destination;
390 pkt.
reply = routeReply;
410 bool freshInfo (
true);
420 if (i->second.second <= preq.
GetMetric ())
451 (
m_rtable->LookupReactive (fromMp).metric > metric)
473 NS_ASSERT (((*i)->IsDo ()) && ((*i)->IsRf ()));
506 if ((*i)->GetDestinationAddress () ==
GetAddress ())
528 if ((lifetime > 0) && ((int32_t)(result.
seqnum - (*i)->GetDestSeqNumber ()) >= 0))
531 (*i)->GetDestinationAddress (),
540 m_rtable->AddPrecursor ((*i)->GetDestinationAddress (), interface, from,
544 (*i)->SetFlags (
true,
false, (*i)->IsUsn ());
563 i->second->SendPreq (preq);
573 bool freshInfo (
true);
577 if ((int32_t)(i->second.first - sequence) > 0)
581 if (i->second.first == sequence)
619 ((
m_rtable->LookupReactive (fromMp)).metric > metric)
641 HwmpProtocolMacMap::const_iterator prep_sender =
m_interfaces.find (result.ifIndex);
643 prep_sender->second->SendPrep (prep, result.retransmitter);
650 std::vector<FailedDestination> retval;
652 for (
unsigned int i = 0; i < destinations.size (); i++)
654 result =
m_rtable->LookupReactiveExpired (destinations[i].destination);
657 (result.
ifIndex != interface) ||
658 ((int32_t)(result.
seqnum - destinations[i].seqnum) > 0)
661 retval.push_back (destinations[i]);
664 if (retval.size () == 0)
676 uint32_t originatorDsn,
677 uint32_t destinationSN,
690 HwmpProtocolMacMap::const_iterator prep_sender =
m_interfaces.find (interface);
692 prep_sender->second->SendPrep (prep, retransmitter);
699 std::vector<Ptr<NetDevice> >
interfaces = mp->GetInterfaces ();
700 for (std::vector<
Ptr<NetDevice> >::const_iterator i = interfaces.begin (); i != interfaces.end (); i++)
716 mac->InstallPlugin (hwmpMac);
721 mp->SetRoutingProtocol (
this);
723 mp->AggregateObject (
this);
734 std::vector<FailedDestination> destinations =
m_rtable->GetUnreachableDestinations (peerAddress);
749 std::map<Mac48Address, uint32_t,std::less<Mac48Address> >::const_iterator i =
m_lastDataSeqno.find (source);
756 if ((int32_t)(i->second - seqno) >= 0)
775 for (
unsigned int i = 0; i < destinations.size (); i++)
778 m_rtable->DeleteReactivePath (destinations[i].destination);
787 std::vector<Mac48Address> receivers_for_interface;
788 for (
unsigned int j = 0; j < perr.
receivers.size (); j++)
792 receivers_for_interface.push_back (perr.
receivers[j].second);
795 i->second->InitiatePerr (perr.
destinations, receivers_for_interface);
803 std::vector<Mac48Address> receivers_for_interface;
804 for (
unsigned int j = 0; j < perr.
receivers.size (); j++)
808 receivers_for_interface.push_back (perr.
receivers[j].second);
811 i->second->ForwardPerr (perr.
destinations, receivers_for_interface);
815 std::vector<std::pair<uint32_t, Mac48Address> >
819 for (
unsigned int i = 0; i < failedDest.size (); i++)
822 m_rtable->DeleteReactivePath (failedDest[i].destination);
823 m_rtable->DeleteProactivePath (failedDest[i].destination);
824 for (
unsigned int j = 0; j < precursors.size (); j++)
826 retval.push_back (precursors[j]);
830 for (
unsigned int i = 0; i < retval.size (); i++)
832 for (
unsigned int j = i+1; j < retval.size (); j++)
834 if (retval[i].second == retval[j].second)
836 retval.erase (retval.begin () + j);
842 std::vector<Mac48Address>
845 std::vector<Mac48Address> retval;
857 std::vector<Mac48Address>
860 std::vector<Mac48Address> retval;
889 for (std::vector<QueuedPacket>::iterator i =
m_rqueue.begin (); i !=
m_rqueue.end (); i++)
917 std::map<Mac48Address, PreqEvent>::iterator i =
m_preqTimeouts.find (dst);
927 while (packet.
pkt != 0)
948 while (packet.
pkt != 0)
969 std::map<Mac48Address, PreqEvent>::const_iterator i =
m_preqTimeouts.find (dst);
986 result =
m_rtable->LookupProactive ();
990 std::map<Mac48Address, PreqEvent>::iterator i =
m_preqTimeouts.find (dst);
999 while (packet.
pkt != 0)
1005 std::map<Mac48Address, PreqEvent>::iterator i =
m_preqTimeouts.find (dst);
1013 uint32_t dst_seqno =
m_rtable->LookupReactiveExpired (dst).seqnum;
1016 i->second->RequestDestination (dst, originator_seqno, dst_seqno);
1052 i->second->SendPreq (preq);
1123 os <<
"<Statistics "
1124 "txUnicast=\"" << txUnicast <<
"\" "
1125 "txBroadcast=\"" << txBroadcast <<
"\" "
1126 "txBytes=\"" << txBytes <<
"\" "
1127 "droppedTtl=\"" << droppedTtl <<
"\" "
1128 "totalQueued=\"" << totalQueued <<
"\" "
1129 "totalDropped=\"" << totalDropped <<
"\" "
1130 "initiatedPreq=\"" << initiatedPreq <<
"\" "
1131 "initiatedPrep=\"" << initiatedPrep <<
"\" "
1132 "initiatedPerr=\"" << initiatedPerr <<
"\"/>" << std::endl;
1138 "address=\"" <<
m_address <<
"\"" << std::endl <<
1148 "isRoot=\"" <<
m_isRoot <<
"\"" << std::endl <<
1149 "maxTtl=\"" << (uint16_t)
m_maxTtl <<
"\"" << std::endl <<
1153 "doFlag=\"" <<
m_doFlag <<
"\"" << std::endl <<
1154 "rfFlag=\"" <<
m_rfFlag <<
"\">" << std::endl;
1158 plugin->second->Report (os);
1160 os <<
"</Hwmp>" << std::endl;
1168 plugin->second->ResetStats ();
Time m_dot11MeshHWMPrannInterval
Structure of path error: IePerr and list of receivers: interfaces and MAC address.
void SetDestinationAddress(Mac48Address dest_address)
void SetPreqID(uint32_t id)
bool RequestRoute(uint32_t sourceIface, const Mac48Address source, const Mac48Address destination, Ptr< const Packet > packet, uint16_t protocolType, RouteReplyCallback routeReply)
Route request, inherited from MeshL2RoutingProtocol.
keep track of time values and allow control of global simulation resolution
#define NS_LOG_FUNCTION(parameters)
void SetStream(int64_t stream)
Specifies the stream number for this RNG stream.
uint32_t GetDestinationSeqNumber() const
Hwmp tag implements interaction between HWMP protocol and MeshWifiMac.
void IncrementMetric(uint32_t metric)
static const uint32_t MAX_METRIC
Maximum (the best?) path metric.
void SetOriginatorSeqNumber(uint32_t originator_seq_number)
Route lookup result, return type of LookupXXX methods.
Time m_dot11MeshHWMPpreqMinInterval
Time m_dot11MeshHWMPperrMinInterval
void SendPrep(Mac48Address src, Mac48Address dst, Mac48Address retransmitter, uint32_t initMetric, uint32_t originatorDsn, uint32_t destinationSN, uint32_t lifetime, uint32_t interface)
forms a path error information element when list of destination fails on a given interface ...
void AddPacketTag(const Tag &tag) const
Time m_dot11MeshHWMPactiveRootTimeout
#define NS_ASSERT(condition)
void ForwardPathError(PathError perr)
Forwards a received path error.
See 7.3.2.97 of 802.11s draft 2.07.
uint32_t GetSize(void) const
Mac48Address GetDestinationAddress() const
Mac48Address src
src address
bool Install(Ptr< MeshPointDevice >)
Install HWMP on given mesh point.
void InitiatePathError(PathError perr)
Passes a self-generated PERR to interface-plugin.
#define NS_LOG_FUNCTION_NOARGS()
static EventId Schedule(Time const &time, MEM mem_ptr, OBJ obj)
uint32_t CalculateMetric(Mac48Address peerAddress, Ptr< MeshWifiInterfaceMac > mac)
NS_OBJECT_ENSURE_REGISTERED(AirtimeLinkMetricCalculator)
uint32_t GetLifetime() const
void ReactivePathResolved(Mac48Address dst)
void SetOriginatorAddress(Mac48Address originator_address)
std::map< Mac48Address, std::pair< uint32_t, uint32_t > > m_hwmpSeqnoMetricDatabase
keeps HWMP seqno (first in pair) and HWMP metric (second in pair) for each address ...
void SetAddress(Mac48Address retransmitter)
#define NS_FATAL_ERROR(msg)
fatal error handling
uint8_t m_unicastDataThreshold
TracedCallback< Time > m_routeDiscoveryTimeCallback
Route discovery time:
void SetLifetime(uint32_t lifetime)
void ReceivePrep(IePrep prep, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric)
forms a path error information element when list of destination fails on a given interface ...
void SendProactivePreq()
Proactive Preq routines:
bool DropDataFrame(uint32_t seqno, Mac48Address source)
MAC-plugin asks whether the frame can be dropped. Protocol automatically updates seqno.
QueuedPacket DequeueFirstPacket()
Ptr< T > CreateObject(void)
std::vector< std::pair< uint32_t, Mac48Address > > PrecursorList
Path precursor = {MAC, interface ID}.
Mac48Address GetOriginatorAddress() const
Ptr< Packet > pkt
the packet
Routing table for HWMP – 802.11s routing protocol.
void Print(std::ostream &os) const
std::vector< Mac48Address > GetPreqReceivers(uint32_t interface)
double GetSeconds(void) const
bool RemoveRoutingStuff(uint32_t fromIface, const Mac48Address source, const Mac48Address destination, Ptr< Packet > packet, uint16_t &protocolType)
Cleanup packet from all tags.
Mac48Address GetOriginatorAddress() const
bool PeekPacketTag(Tag &tag) const
Time GetPerrMinInterval()
Ptr< MeshPointDevice > GetMeshPoint() const
Each mesh protocol must be installed on the mesh point to work.
uint8_t m_unicastPerrThreshold
std::vector< QueuedPacket > m_rqueue
std::vector< std::pair< uint32_t, Mac48Address > > GetPerrReceivers(std::vector< FailedDestination > failedDest)
int64_t GetMicroSeconds(void) const
void RetryPathDiscovery(Mac48Address dst, uint8_t numOfRetry)
Generates PREQ retry when retry timeout has expired and route is still unresolved.
Ptr< MeshPointDevice > m_mp
Host mesh point.
void IncrementMetric(uint32_t metric)
hold objects of type ns3::Time
See 7.3.2.96 of 802.11s draft 2.07.
Hold an unsigned integer type.
bool ForwardUnicast(uint32_t sourceIface, const Mac48Address source, const Mac48Address destination, Ptr< Packet > packet, uint16_t protocolType, RouteReplyCallback routeReply, uint32_t ttl)
Like RequestRoute, but for unicast packets.
Packet waiting its routing information.
Hold together all Wifi-related objects.This class holds together ns3::WifiChannel, ns3::WifiPhy, ns3::WifiMac, and, ns3::WifiRemoteStationManager.
NS_LOG_COMPONENT_DEFINE("HwmpProtocol")
static Mac48Address GetBroadcast(void)
void ProactivePathResolved()
HwmpProtocolMacMap m_interfaces
Callback< R > MakeCallback(R(T::*memPtr)(void), OBJ objPtr)
uint32_t GetOriginatorSeqNumber() const
uint32_t GetActivePathLifetime()
Ptr< HwmpRtable > m_rtable
Routing table.
void SetOriginatorAddress(Mac48Address originator_address)
void SetLifetime(uint32_t lifetime)
static TypeId GetTypeId()
uint8_t m_unicastPreqThreshold
void ReceivePreq(IePreq preq, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric)
forms a path error information element when list of destination fails on a given interface ...
Time m_randomStart
Random start in Proactive PREQ propagation.
Mac48Address GetAddress()
static Mac48Address ConvertFrom(const Address &address)
Ptr< Packet > Copy(void) const
void SetOriginatorSeqNumber(uint32_t originator_seq_number)
uint16_t protocol
protocol number
void SetMetric(uint32_t metric)
uint8_t m_dot11MeshHWMPmaxPREQretries
void AddDestinationAddressElement(bool doFlag, bool rfFlag, Mac48Address dest_address, uint32_t dest_seq_number)
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
void DelDestinationAddressElement(Mac48Address dest_address)
Delete a destination address unit by destination.
PathError MakePathError(std::vector< FailedDestination > destinations)
forms a path error information element when list of destination fails on a given interface ...
std::vector< std::pair< uint32_t, Mac48Address > > receivers
list of PathError receivers (in case of unicast PERR)
bool IsNeedNotPrep() const
uint32_t GetNextHwmpSeqno()
uint8_t GetDestCount() const
std::vector< Ptr< DestinationAddressUnit > > GetDestinationList()
Get all destinations, which are stored in PREQ:
RouteReplyCallback reply
how to reply
Interface for L2 mesh routing protocol and mesh point communication.
void Report(std::ostream &) const
Statistics:
Mac48Address dst
dst address
Ptr< UniformRandomVariable > m_coefficient
uint8_t GetUnicastPerrThreshold()
EventId m_proactivePreqTimer
Random start in Proactive PREQ propagation.
Mac48Address retransmitter
Time m_dot11MeshHWMPactivePathTimeout
std::vector< Mac48Address > GetBroadcastReceivers(uint32_t interface)
std::vector< FailedDestination > destinations
destination list: Mac48Address and sequence number
Time m_dot11MeshHWMPpathToRootInterval
bool RemovePacketTag(Tag &tag)
#define NS_LOG_DEBUG(msg)
Callback< std::vector< Mac48Address >, uint32_t > m_neighboursCallback
uint32_t GetLifetime() const
std::map< Mac48Address, uint32_t > m_lastDataSeqno
keeps HWMP seqno (first in pair) and HWMP metric (second in pair) for each address ...
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range. Both limits are inclusive.
QueuedPacket DequeueFirstPacketByDst(Mac48Address dst)
Time GetPreqMinInterval()
uint32_t GetMetric() const
void SetSeqno(uint32_t seqno)
uint32_t inInterface
incoming device interface ID. (if packet has come from upper layers, this is Mesh point ID) ...
bool QueuePacket(QueuedPacket packet)
uint32_t GetMetric() const
bool ShouldSendPreq(Mac48Address dst)
checks when the last path discovery procedure was started for a given destination.
Hold an floating point type.
void SetDestinationSeqNumber(uint32_t dest_seq_number)
void SetHopcount(uint8_t hopcount)
void PeerLinkStatus(Mac48Address meshPontAddress, Mac48Address peerAddress, uint32_t interface, bool status)
void SetAttribute(std::string name, const AttributeValue &value)
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Basic MAC of mesh point Wi-Fi interface. Its function is extendable through plugins mechanism...
void SetHopcount(uint8_t hopcount)
std::map< Mac48Address, PreqEvent > m_preqTimeouts
Random start in Proactive PREQ propagation.
int64_t AssignStreams(int64_t stream)
Time m_dot11MeshHWMPnetDiameterTraversalTime
void ReceivePerr(std::vector< FailedDestination >, Mac48Address from, uint32_t interface, Mac48Address fromMp)
forms a path error information element when list of destination fails on a given interface ...
void SetNeighboursCallback(Callback< std::vector< Mac48Address >, uint32_t > cb)
This callback is used to obtain active neighbours on a given interface.
virtual void DoInitialize()