A Discrete-Event Network Simulator
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
3 * Copyright (c) 2008,2009 IITP RAS
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Authors: Kirill Andreev <andreev@iitp.ru>
19 */
24#include "ns3/mesh-l2-routing-protocol.h"
25#include "ns3/nstime.h"
26#include "ns3/event-id.h"
27#include "ns3/traced-value.h"
28#include <vector>
29#include <map>
31namespace ns3 {
32class MeshPointDevice;
33class Packet;
34class Mac48Address;
35class UniformRandomVariable;
36class RandomVariableStream;
37namespace dot11s {
38class HwmpProtocolMac;
39class HwmpRtable;
40class IePerr;
41class IePreq;
42class IePrep;
49 std::string type;
70 static TypeId GetTypeId ();
72 HwmpProtocol ();
75 // Delete copy constructor and assignment operator to avoid misuse
76 HwmpProtocol (const HwmpProtocol &) = delete;
79 void DoDispose ();
85 {
88 };
101 bool RequestRoute (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination,
102 Ptr<const Packet> packet, uint16_t protocolType, RouteReplyCallback routeReply);
113 bool RemoveRoutingStuff (uint32_t fromIface, const Mac48Address source,
114 const Mac48Address destination, Ptr<Packet> packet, uint16_t& protocolType);
133 void PeerLinkStatus (Mac48Address meshPontAddress, Mac48Address peerAddress, uint32_t interface,bool status);
138 void SetNeighboursCallback (Callback<std::vector<Mac48Address>, uint32_t> cb);
142 void SetRoot ();
144 void UnsetRoot ();
153 void Report (std::ostream & os) const;
155 void ResetStats ();
166 int64_t AssignStreams (int64_t stream);
172 Ptr<HwmpRtable> GetRoutingTable (void) const;
176 friend class HwmpProtocolMac;
178 virtual void DoInitialize ();
185 {
186 std::vector<FailedDestination> destinations;
187 std::vector<std::pair<uint32_t, Mac48Address> > receivers;
188 };
191 {
195 uint16_t protocol;
199 QueuedPacket ();
200 };
201 typedef std::map<uint32_t, Ptr<HwmpProtocolMac> > HwmpProtocolMacMap;
214 bool ForwardUnicast (uint32_t sourceIface, const Mac48Address source, const Mac48Address destination,
215 Ptr<Packet> packet, uint16_t protocolType, RouteReplyCallback routeReply, uint32_t ttl);
228 void ReceivePreq (IePreq preq, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric);
238 void ReceivePrep (IePrep prep, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric);
247 void ReceivePerr (std::vector<FailedDestination> destinations, Mac48Address from, uint32_t interface, Mac48Address fromMp);
259 void SendPrep (
260 Mac48Address src,
261 Mac48Address dst,
262 Mac48Address retransmitter,
263 uint32_t initMetric,
264 uint32_t originatorDsn,
265 uint32_t destinationSN,
266 uint32_t lifetime,
267 uint32_t interface);
275 PathError MakePathError (std::vector<FailedDestination> destinations);
280 void ForwardPathError (PathError perr);
285 void InitiatePathError (PathError perr);
292 std::vector<std::pair<uint32_t, Mac48Address> > GetPerrReceivers (std::vector<FailedDestination> failedDest);
300 std::vector<Mac48Address> GetPreqReceivers (uint32_t interface);
307 std::vector<Mac48Address> GetBroadcastReceivers (uint32_t interface);
315 bool DropDataFrame (uint32_t seqno, Mac48Address source);
325 // /\name Methods related to Queue/Dequeue procedures
332 bool QueuePacket (QueuedPacket packet);
352 void ProactivePathResolved ();
364 bool ShouldSendPreq (Mac48Address dst);
373 void RetryPathDiscovery (Mac48Address dst, uint8_t numOfRetry);
375 void SendProactivePreq ();
386 bool GetDoFlag ();
391 bool GetRfFlag ();
406 uint8_t GetMaxTtl ();
426 uint8_t GetUnicastPerrThreshold ();
432 {
433 uint16_t txUnicast;
434 uint16_t txBroadcast;
436 uint16_t droppedTtl;
437 uint16_t totalQueued;
438 uint16_t totalDropped;
439 uint16_t initiatedPreq;
440 uint16_t initiatedPrep;
441 uint16_t initiatedPerr;
447 void Print (std::ostream & os) const;
449 Statistics ();
450 };
461 std::map<Mac48Address, uint32_t> m_lastDataSeqno;
463 std::map<Mac48Address, std::pair<uint32_t, uint32_t> > m_hwmpSeqnoMetricDatabase;
470 struct PreqEvent {
473 };
475 std::map<Mac48Address, PreqEvent> m_preqTimeouts;
480 std::vector<QueuedPacket> m_rqueue;
485 uint16_t m_maxQueueSize;
494 bool m_isRoot;
495 uint8_t m_maxTtl;
499 bool m_doFlag;
500 bool m_rfFlag;
507} // namespace dot11s
508} // namespace ns3
Callback template class.
Definition: callback.h:422
An identifier for simulation events.
Definition: event-id.h:54
an EUI-48 address
Definition: mac48-address.h:44
Interface for L2 mesh routing protocol and mesh point communication.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:104
Forward calls to a chain of Callback.
a unique identifier for an interface.
Definition: type-id.h:59
Hybrid wireless mesh protocol – a mesh routing protocol defined in IEEE 802.11-2012 standard.
Definition: hwmp-protocol.h:64
void SetRoot()
Unset the current node as root.
std::vector< Mac48Address > GetPreqReceivers(uint32_t interface)
Get PREQ receivers.
QueuedPacket DequeueFirstPacket()
Dequeue the first packet in the queue.
Ptr< HwmpRtable > m_rtable
Routing table.
uint8_t m_unicastDataThreshold
Maximum number of broadcast receivers, when we send a broadcast as a chain of unicasts.
void ReceivePrep(IePrep prep, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric)
Handler for receiving Path Reply.
void Report(std::ostream &os) const
uint32_t GetNextHwmpSeqno()
Get next HWMP sequence no function.
PathError MakePathError(std::vector< FailedDestination > destinations)
forms a path error information element when list of destination fails on a given interface
Time m_dot11MeshHWMPrannInterval
Lifetime of proactive routing information.
Time GetPerrMinInterval()
Get PERR minimum interval function.
uint8_t m_unicastPreqThreshold
Maximum number of PREQ receivers, when we send a PREQ as a chain of unicasts.
void UnsetRoot()
Unset the current node as root.
uint32_t m_dataSeqno
data sequence no
Time m_dot11MeshHWMPnetDiameterTraversalTime
Time we suppose the packet to go from one edge of the network to another.
Time m_dot11MeshHWMPactivePathTimeout
Lifetime of reactive routing information.
bool QueuePacket(QueuedPacket packet)
Queue a packet.
bool m_isRoot
True if the node is a root.
Statistics m_stats
uint32_t m_hwmpSeqno
HWMP sequence no.
bool RemoveRoutingStuff(uint32_t fromIface, const Mac48Address source, const Mac48Address destination, Ptr< Packet > packet, uint16_t &protocolType)
Clean HWMP packet tag from packet; only the packet parameter is used.
Time m_randomStart
Random start in Proactive PREQ propagation.
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.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
virtual void DoInitialize()
Initialize() implementation.
TracedCallback< struct RouteChange > RouteChangeTracedCallback
RouteChangeTracedCallback typedef.
TracedCallback< Time > m_routeDiscoveryTimeCallback
Route discovery time:
static TypeId GetTypeId()
Get the type ID.
bool GetRfFlag()
Get rf flag function.
bool ShouldSendPreq(Mac48Address dst)
checks when the last path discovery procedure was started for a given destination.
void PeerLinkStatus(Mac48Address meshPontAddress, Mac48Address peerAddress, uint32_t interface, bool status)
Peer link status function.
void ReceivePerr(std::vector< FailedDestination > destinations, Mac48Address from, uint32_t interface, Mac48Address fromMp)
Handler for receiving Path Error.
std::map< Mac48Address, PreqEvent > m_preqTimeouts
PREQ timeouts.
Time m_dot11MeshHWMPperrMinInterval
Minimal interval between to successive PREQs.
bool m_rfFlag
Reply and forward flag.
bool GetDoFlag()
Get do flag function.
Time GetPreqMinInterval()
Get PREQ minimum interval function.
QueuedPacket DequeueFirstPacketByDst(Mac48Address dst)
Dequeue the first packet for a given destination.
HwmpProtocol(const HwmpProtocol &)=delete
EventId m_proactivePreqTimer
proactive PREQ timer
Ptr< UniformRandomVariable > m_coefficient
Random variable for random start time.
uint32_t GetNextPreqId()
Get next period function.
void InitiatePathError(PathError perr)
Passes a self-generated PERR to interface-plugin.
uint8_t GetUnicastPerrThreshold()
Get unicast PERR threshold function.
void SendProactivePreq()
Proactive Preq routines:
void ForwardPathError(PathError perr)
Forwards a received path error.
void DoDispose()
Destructor implementation.
Time m_dot11MeshHWMPpathToRootInterval
Interval between two successive proactive PREQs.
void RetryPathDiscovery(Mac48Address dst, uint8_t numOfRetry)
Generates PREQ retry when retry timeout has expired and route is still unresolved.
bool m_doFlag
Destination only HWMP flag.
Mac48Address m_address
Time m_dot11MeshHWMPactiveRootTimeout
Lifetime of proactive routing information.
void ReceivePreq(IePreq preq, Mac48Address from, uint32_t interface, Mac48Address fromMp, uint32_t metric)
Handler for receiving Path Request.
Time m_dot11MeshHWMPpreqMinInterval
Minimal interval between to successive PREQs.
uint8_t GetMaxTtl()
Get maximum TTL function.
void ReactivePathResolved(Mac48Address dst)
Signal the protocol that the reactive path toward a destination is now available.
std::vector< Mac48Address > GetBroadcastReceivers(uint32_t interface)
Get broadcast receivers.
bool Install(Ptr< MeshPointDevice > mp)
Install HWMP on given mesh point.
uint32_t GetActivePathLifetime()
Get active path lifetime function.
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.
void ProactivePathResolved()
Signal the protocol that the proactive path is now available.
void SetNeighboursCallback(Callback< std::vector< Mac48Address >, uint32_t > cb)
This callback is used to obtain active neighbours on a given interface.
std::vector< QueuedPacket > m_rqueue
Packet Queue.
Callback< std::vector< Mac48Address >, uint32_t > m_neighboursCallback
neighbors callback
std::vector< std::pair< uint32_t, Mac48Address > > GetPerrReceivers(std::vector< FailedDestination > failedDest)
Get PERR receivers.
HwmpProtocol & operator=(const HwmpProtocol &)=delete
HwmpProtocolMacMap m_interfaces
Ptr< HwmpRtable > GetRoutingTable(void) const
Get pointer to HWMP routing table.
uint16_t m_maxQueueSize
Maximum number of packets we can store when resolving route.
uint8_t m_maxTtl
Initial value of Time To Live field.
std::map< Mac48Address, uint32_t > m_lastDataSeqno
keeps HWMP seqno (first in pair) and HWMP metric (second in pair) for each address
void ResetStats()
Reset Statistics:
bool DropDataFrame(uint32_t seqno, Mac48Address source)
MAC-plugin asks whether the frame can be dropped.
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.
uint8_t m_unicastPerrThreshold
Maximum number of PERR receivers, when we send a PERR as a chain of unicasts.
uint32_t m_preqId
uint8_t m_dot11MeshHWMPmaxPREQretries
Maximum number of retries before we suppose the destination to be unreachable.
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
TracedCallback< struct RouteChange > m_routeChangeTraceSource
Route change trace source.
std::map< uint32_t, Ptr< HwmpProtocolMac > > HwmpProtocolMacMap
HwmpProtocolMacMap typedef.
Interface MAC plugin for HWMP – 802.11s routing protocol.
See of 802.11s draft 2.07.
See of 802.11s draft 2.07.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
structure of unreachable destination - address and sequence number
Definition: hwmp-protocol.h:85
Mac48Address destination
destination address
Definition: hwmp-protocol.h:86
Structure of path error: IePerr and list of receivers: interfaces and MAC address.
std::vector< FailedDestination > destinations
destination list: Mac48Address and sequence number
std::vector< std::pair< uint32_t, Mac48Address > > receivers
list of PathError receivers (in case of unicast PERR)
Packet waiting its routing information.
RouteReplyCallback reply
how to reply
uint32_t inInterface
incoming device interface ID. (if packet has come from upper layers, this is Mesh point ID)
void Print(std::ostream &os) const
Print function.
uint16_t initiatedPrep
initiated PREP
uint16_t txBroadcast
transmit broadcast
uint16_t txUnicast
transmit unicast
uint16_t initiatedPerr
initiated PERR
uint16_t initiatedPreq
initiated PREQ
Structure to encapsulate route change information.
Definition: hwmp-protocol.h:48
Time lifetime
lifetime of route
Definition: hwmp-protocol.h:54
Mac48Address retransmitter
route source
Definition: hwmp-protocol.h:51
uint32_t seqnum
sequence number of route
Definition: hwmp-protocol.h:55
uint32_t metric
metric of route
Definition: hwmp-protocol.h:53
Mac48Address destination
route destination
Definition: hwmp-protocol.h:50
std::string type
type of change
Definition: hwmp-protocol.h:49
uint32_t interface
interface index
Definition: hwmp-protocol.h:52