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"
52 .SetGroupName (
"Mesh")
54 .AddAttribute (
"RandomStart",
55 "Random delay at first proactive PREQ",
61 .AddAttribute (
"MaxQueueSize",
62 "Maximum number of packets we can store when resolving route",
66 MakeUintegerChecker<uint16_t> (1)
68 .AddAttribute (
"Dot11MeshHWMPmaxPREQretries",
69 "Maximum number of retries before we suppose the destination to be unreachable",
73 MakeUintegerChecker<uint8_t> (1)
75 .AddAttribute (
"Dot11MeshHWMPnetDiameterTraversalTime",
76 "Time we suppose the packet to go from one edge of the network to another",
82 .AddAttribute (
"Dot11MeshHWMPpreqMinInterval",
83 "Minimal interval between to successive PREQs",
89 .AddAttribute (
"Dot11MeshHWMPperrMinInterval",
90 "Minimal interval between to successive PREQs",
95 .AddAttribute (
"Dot11MeshHWMPactiveRootTimeout",
96 "Lifetime of poractive routing information",
102 .AddAttribute (
"Dot11MeshHWMPactivePathTimeout",
103 "Lifetime of reactive routing information",
109 .AddAttribute (
"Dot11MeshHWMPpathToRootInterval",
110 "Interval between two successive proactive PREQs",
116 .AddAttribute (
"Dot11MeshHWMPrannInterval",
117 "Lifetime of poractive routing information",
123 .AddAttribute (
"MaxTtl",
124 "Initial value of Time To Live field",
128 MakeUintegerChecker<uint8_t> (2)
130 .AddAttribute (
"UnicastPerrThreshold",
131 "Maximum number of PERR receivers, when we send a PERR as a chain of unicasts",
135 MakeUintegerChecker<uint8_t> (1)
137 .AddAttribute (
"UnicastPreqThreshold",
138 "Maximum number of PREQ receivers, when we send a PREQ as a chain of unicasts",
142 MakeUintegerChecker<uint8_t> (1)
144 .AddAttribute (
"UnicastDataThreshold",
145 "Maximum number ofbroadcast receivers, when we send a broadcast as a chain of unicasts",
149 MakeUintegerChecker<uint8_t> (1)
151 .AddAttribute (
"DoFlag",
152 "Destination only HWMP flag",
158 .AddAttribute (
"RfFlag",
159 "Reply and forward flag",
165 .AddTraceSource (
"RouteDiscoveryTime",
166 "The time of route discovery procedure",
169 "ns3::Time::TracedCallback"
181 m_maxQueueSize (255),
182 m_dot11MeshHWMPmaxPREQretries (3),
183 m_dot11MeshHWMPnetDiameterTraversalTime (
MicroSeconds (1024*100)),
184 m_dot11MeshHWMPpreqMinInterval (
MicroSeconds (1024*100)),
185 m_dot11MeshHWMPperrMinInterval (
MicroSeconds (1024*100)),
186 m_dot11MeshHWMPactiveRootTimeout (
MicroSeconds (1024*5000)),
187 m_dot11MeshHWMPactivePathTimeout (
MicroSeconds (1024*5000)),
188 m_dot11MeshHWMPpathToRootInterval (
MicroSeconds (1024*2000)),
192 m_unicastPerrThreshold (32),
193 m_unicastPreqThreshold (1),
194 m_unicastDataThreshold (1),
224 i->second.preqTimeout.Cancel ();
238 uint32_t sourceIface,
242 uint16_t protocolType,
253 NS_FATAL_ERROR (
"HWMP tag has come with a packet from upper layer. This must not occur...");
266 NS_FATAL_ERROR (
"HWMP tag is supposed to be here at this point.");
280 std::vector<uint16_t> channels;
283 bool shouldSend =
true;
284 for (std::vector<uint16_t>::const_iterator chan = channels.begin (); chan != channels.end (); chan++)
286 if ((*chan) == plugin->second->GetChannelId ())
295 channels.push_back (plugin->second->GetChannelId ());
297 for (std::vector<Mac48Address>::const_iterator i = receivers.begin (); i != receivers.end (); i++)
307 routeReply (
true, packetCopy, source, destination, protocolType, plugin->first);
313 return ForwardUnicast (sourceIface, source, destination, packet, protocolType, routeReply, tag.
GetTtl ());
324 NS_FATAL_ERROR (
"HWMP tag must exist when packet received from the network");
347 routeReply (
true, packet, source, destination, protocolType, result.
ifIndex);
379 uint32_t dst_seqno = 0;
382 dst_seqno = result.
seqnum;
387 i->second->RequestDestination (destination, originator_seqno, dst_seqno);
392 pkt.
dst = destination;
395 pkt.
reply = routeReply;
415 bool freshInfo (
true);
425 if (i->second.second <= preq.
GetMetric ())
478 NS_ASSERT (((*i)->IsDo ()) && ((*i)->IsRf ()));
511 if ((*i)->GetDestinationAddress () ==
GetAddress ())
533 if ((lifetime > 0) && ((int32_t)(result.
seqnum - (*i)->GetDestSeqNumber ()) >= 0))
536 (*i)->GetDestinationAddress (),
549 (*i)->SetFlags (
true,
false, (*i)->IsUsn ());
568 i->second->SendPreq (preq);
578 bool freshInfo (
true);
582 if ((int32_t)(i->second.first - sequence) > 0)
586 if (i->second.first == sequence)
646 HwmpProtocolMacMap::const_iterator prep_sender =
m_interfaces.find (result.ifIndex);
648 prep_sender->second->SendPrep (prep, result.retransmitter);
655 std::vector<FailedDestination> retval;
657 for (
unsigned int i = 0; i < destinations.size (); i++)
662 (result.
ifIndex != interface) ||
663 ((int32_t)(result.
seqnum - destinations[i].seqnum) > 0)
666 retval.push_back (destinations[i]);
669 if (retval.size () == 0)
681 uint32_t originatorDsn,
682 uint32_t destinationSN,
695 HwmpProtocolMacMap::const_iterator prep_sender =
m_interfaces.find (interface);
697 prep_sender->second->SendPrep (prep, retransmitter);
704 std::vector<Ptr<NetDevice> >
interfaces = mp->GetInterfaces ();
705 for (std::vector<
Ptr<NetDevice> >::const_iterator i = interfaces.begin (); i != interfaces.end (); i++)
721 mac->InstallPlugin (hwmpMac);
726 mp->SetRoutingProtocol (
this);
728 mp->AggregateObject (
this);
754 std::map<Mac48Address, uint32_t,std::less<Mac48Address> >::const_iterator i =
m_lastDataSeqno.find (source);
761 if ((int32_t)(i->second - seqno) >= 0)
780 for (
unsigned int i = 0; i < destinations.size (); i++)
792 std::vector<Mac48Address> receivers_for_interface;
793 for (
unsigned int j = 0; j < perr.
receivers.size (); j++)
797 receivers_for_interface.push_back (perr.
receivers[j].second);
800 i->second->InitiatePerr (perr.
destinations, receivers_for_interface);
808 std::vector<Mac48Address> receivers_for_interface;
809 for (
unsigned int j = 0; j < perr.
receivers.size (); j++)
813 receivers_for_interface.push_back (perr.
receivers[j].second);
816 i->second->ForwardPerr (perr.
destinations, receivers_for_interface);
820 std::vector<std::pair<uint32_t, Mac48Address> >
824 for (
unsigned int i = 0; i < failedDest.size (); i++)
829 for (
unsigned int j = 0; j < precursors.size (); j++)
831 retval.push_back (precursors[j]);
835 for (
unsigned int i = 0; i < retval.size (); i++)
837 for (
unsigned int j = i+1; j < retval.size (); j++)
839 if (retval[i].second == retval[j].second)
841 retval.erase (retval.begin () + j);
847 std::vector<Mac48Address>
850 std::vector<Mac48Address> retval;
862 std::vector<Mac48Address>
865 std::vector<Mac48Address> retval;
894 for (std::vector<QueuedPacket>::iterator i =
m_rqueue.begin (); i !=
m_rqueue.end (); i++)
922 std::map<Mac48Address, PreqEvent>::iterator i =
m_preqTimeouts.find (dst);
932 while (packet.
pkt != 0)
953 while (packet.
pkt != 0)
974 std::map<Mac48Address, PreqEvent>::const_iterator i =
m_preqTimeouts.find (dst);
995 std::map<Mac48Address, PreqEvent>::iterator i =
m_preqTimeouts.find (dst);
1004 while (packet.
pkt != 0)
1010 std::map<Mac48Address, PreqEvent>::iterator i =
m_preqTimeouts.find (dst);
1021 i->second->RequestDestination (dst, originator_seqno, dst_seqno);
1055 i->second->SendPreq (preq);
1126 os <<
"<Statistics "
1127 "txUnicast=\"" << txUnicast <<
"\" "
1128 "txBroadcast=\"" << txBroadcast <<
"\" "
1129 "txBytes=\"" << txBytes <<
"\" "
1130 "droppedTtl=\"" << droppedTtl <<
"\" "
1131 "totalQueued=\"" << totalQueued <<
"\" "
1132 "totalDropped=\"" << totalDropped <<
"\" "
1133 "initiatedPreq=\"" << initiatedPreq <<
"\" "
1134 "initiatedPrep=\"" << initiatedPrep <<
"\" "
1135 "initiatedPerr=\"" << initiatedPerr <<
"\"/>" << std::endl;
1141 "address=\"" <<
m_address <<
"\"" << std::endl <<
1151 "isRoot=\"" <<
m_isRoot <<
"\"" << std::endl <<
1152 "maxTtl=\"" << (uint16_t)
m_maxTtl <<
"\"" << std::endl <<
1156 "doFlag=\"" <<
m_doFlag <<
"\"" << std::endl <<
1157 "rfFlag=\"" <<
m_rfFlag <<
"\">" << std::endl;
1161 plugin->second->Report (os);
1163 os <<
"</Hwmp>" << std::endl;
1171 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.
Simulation virtual time values and global simulation resolution.
#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 this RNG stream.
AttributeValue implementation for Boolean.
uint32_t GetDestinationSeqNumber() const
Hwmp tag implements interaction between HWMP protocol and MeshWifiMac.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
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)
Send Path Reply.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
void AddPacketTag(const Tag &tag) const
Add a packet tag.
Time m_dot11MeshHWMPactiveRootTimeout
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file...
void ForwardPathError(PathError perr)
Forwards a received path error.
#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).
LookupResult LookupReactiveExpired(Mac48Address destination)
Return all reactive paths, including expired.
Mac48Address GetDestinationAddress() const
Mac48Address src
src address
bool Install(Ptr< MeshPointDevice >)
Install HWMP on given mesh point.
#define NS_FATAL_ERROR(msg)
Fatal error handling.
void InitiatePathError(PathError perr)
Passes a self-generated PERR to interface-plugin.
#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.
uint32_t CalculateMetric(Mac48Address peerAddress, Ptr< MeshWifiInterfaceMac > mac)
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)
uint8_t m_unicastDataThreshold
LookupResult LookupReactive(Mac48Address destination)
Lookup path to destination.
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)
Handler for receiving Path Reply.
Ptr< const TraceSourceAccessor > MakeTraceSourceAccessor(T a)
Create a TraceSourceAccessor which will control access to the underlying trace source.
void SendProactivePreq()
Proactive Preq routines:
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
bool DropDataFrame(uint32_t seqno, Mac48Address source)
MAC-plugin asks whether the frame can be dropped.
QueuedPacket DequeueFirstPacket()
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
Get an approximation of the time stored in this instance in the indicated unit.
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
Search a matching tag and call Tag::Deserialize if it is found.
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
Packet Queue.
std::vector< std::pair< uint32_t, Mac48Address > > GetPerrReceivers(std::vector< FailedDestination > failedDest)
int64_t GetMicroSeconds(void) const
Get an approximation of the time stored in this instance in the indicated unit.
std::vector< HwmpProtocol::FailedDestination > GetUnreachableDestinations(Mac48Address peerAddress)
When peer link with a given MAC-address fails - it returns list of unreachable destination addresses...
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)
AttributeValue implementation for Time.
void DoDispose()
Destructor implementation.
Hybrid wireless mesh protocol – a routing protocol of IEEE 802.11s draft.
See 7.3.2.96 of 802.11s draft 2.07.
Hold an unsigned integer type.
PrecursorList GetPrecursors(Mac48Address destination)
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.
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()
void AddPrecursor(Mac48Address destination, uint32_t precursorInterface, Mac48Address precursorAddress, Time lifetime)
Ptr< HwmpRtable > m_rtable
Routing table.
void SetOriginatorAddress(Mac48Address originator_address)
void SetLifetime(uint32_t lifetime)
static TypeId GetTypeId()
uint8_t m_unicastPreqThreshold
LookupResult LookupProactiveExpired()
Return all proactive paths, including expired.
void ReceivePreq(IePreq preq, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric)
Handler for receiving Path Request.
Time m_randomStart
Random start in Proactive PREQ propagation.
Mac48Address GetAddress()
static Mac48Address ConvertFrom(const Address &address)
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
void SetOriginatorSeqNumber(uint32_t originator_seq_number)
uint16_t protocol
protocol number
void SetMetric(uint32_t metric)
uint8_t m_dot11MeshHWMPmaxPREQretries
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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 AddReactivePath(Mac48Address destination, Mac48Address retransmitter, uint32_t interface, uint32_t metric, Time lifetime, uint32_t seqnum)
Ptr< const AttributeChecker > MakeBooleanChecker(void)
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
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method...
static Time Now(void)
Return the current simulation virtual time.
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
void DeleteProactivePath()
Ptr< UniformRandomVariable > m_coefficient
Random variable for random start time.
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)
Remove a packet tag.
#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.
Callback< std::vector< Mac48Address >, uint32_t > m_neighboursCallback
void Cancel(void)
This method is syntactic sugar for the ns3::Simulator::Cancel method.
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< T > CreateObject(void)
Create an object by type, with varying number of constructor parameters.
void DeleteReactivePath(Mac48Address destination)
QueuedPacket DequeueFirstPacketByDst(Mac48Address dst)
Time GetPreqMinInterval()
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
void AddProactivePath(uint32_t metric, Mac48Address root, Mac48Address retransmitter, uint32_t interface, Time lifetime, uint32_t seqnum)
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.
This class can be used to hold variables of floating point type such as 'double' or 'float'...
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)
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...
a unique identifier for an interface.
TypeId SetParent(TypeId tid)
Basic MAC of mesh point Wi-Fi interface.
void SetHopcount(uint8_t hopcount)
std::map< Mac48Address, PreqEvent > m_preqTimeouts
Random start in Proactive PREQ propagation.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
Time m_dot11MeshHWMPnetDiameterTraversalTime
LookupResult LookupProactive()
Find proactive path to tree root. Note that calling this method has side effect of deleting expired p...
void ReceivePerr(std::vector< FailedDestination >, Mac48Address from, uint32_t interface, Mac48Address fromMp)
Handler for receiving Path Error.
void SetNeighboursCallback(Callback< std::vector< Mac48Address >, uint32_t > cb)
This callback is used to obtain active neighbours on a given interface.
virtual void DoInitialize()
Initialize() implementation.