A Discrete-Event Network Simulator
API
hwmp-protocol.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008,2009 IITP RAS
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Authors: Kirill Andreev <andreev@iitp.ru>
18  */
19 
20 #ifndef HWMP_PROTOCOL_H
21 #define HWMP_PROTOCOL_H
22 
23 #include "ns3/event-id.h"
24 #include "ns3/mesh-l2-routing-protocol.h"
25 #include "ns3/nstime.h"
26 #include "ns3/traced-value.h"
27 
28 #include <map>
29 #include <vector>
30 
31 namespace ns3
32 {
33 class MeshPointDevice;
34 class Packet;
35 class Mac48Address;
36 class UniformRandomVariable;
37 class RandomVariableStream;
38 
39 namespace dot11s
40 {
41 class HwmpProtocolMac;
42 class HwmpRtable;
43 class IePerr;
44 class IePreq;
45 class IePrep;
46 
51 {
52  std::string type;
55  uint32_t interface;
56  uint32_t metric;
58  uint32_t seqnum;
59 };
60 
68 {
69  public:
74  static TypeId GetTypeId();
75 
76  HwmpProtocol();
77  ~HwmpProtocol() override;
78 
79  // Delete copy constructor and assignment operator to avoid misuse
80  HwmpProtocol(const HwmpProtocol&) = delete;
81  HwmpProtocol& operator=(const HwmpProtocol&) = delete;
82 
83  void DoDispose() override;
84 
89  {
91  uint32_t seqnum;
92  };
93 
105  bool RequestRoute(uint32_t sourceIface,
106  const Mac48Address source,
107  const Mac48Address destination,
108  Ptr<const Packet> packet,
109  uint16_t protocolType,
110  RouteReplyCallback routeReply) override;
121  bool RemoveRoutingStuff(uint32_t fromIface,
122  const Mac48Address source,
123  const Mac48Address destination,
124  Ptr<Packet> packet,
125  uint16_t& protocolType) override;
136  bool Install(Ptr<MeshPointDevice> mp);
144  void PeerLinkStatus(Mac48Address meshPointAddress,
145  Mac48Address peerAddress,
146  uint32_t interface,
147  bool status);
152  void SetNeighboursCallback(Callback<std::vector<Mac48Address>, uint32_t> cb);
156  void SetRoot();
158  void UnsetRoot();
160 
163 
167  void Report(std::ostream& os) const;
169  void ResetStats();
171 
180  int64_t AssignStreams(int64_t stream);
181 
187 
188  private:
190  friend class HwmpProtocolMac;
191 
192  void DoInitialize() override;
193 
198  struct PathError
199  {
200  std::vector<FailedDestination>
202  std::vector<std::pair<uint32_t, Mac48Address>>
204  };
205 
208  {
212  uint16_t protocol;
213  uint32_t inInterface;
216 
217  QueuedPacket();
218  };
219 
220  typedef std::map<uint32_t, Ptr<HwmpProtocolMac>>
234  bool ForwardUnicast(uint32_t sourceIface,
235  const Mac48Address source,
236  const Mac48Address destination,
237  Ptr<Packet> packet,
238  uint16_t protocolType,
239  RouteReplyCallback routeReply,
240  uint32_t ttl);
241 
244 
253  void ReceivePreq(IePreq preq,
254  Mac48Address from,
255  uint32_t interface,
256  Mac48Address fromMp,
257  uint32_t metric);
267  void ReceivePrep(IePrep prep,
268  Mac48Address from,
269  uint32_t interface,
270  Mac48Address fromMp,
271  uint32_t metric);
280  void ReceivePerr(std::vector<FailedDestination> destinations,
281  Mac48Address from,
282  uint32_t interface,
283  Mac48Address fromMp);
295  void SendPrep(Mac48Address src,
296  Mac48Address dst,
297  Mac48Address retransmitter,
298  uint32_t initMetric,
299  uint32_t originatorDsn,
300  uint32_t destinationSN,
301  uint32_t lifetime,
302  uint32_t interface);
310  PathError MakePathError(std::vector<FailedDestination> destinations);
315  void ForwardPathError(PathError perr);
320  void InitiatePathError(PathError perr);
327  std::vector<std::pair<uint32_t, Mac48Address>> GetPerrReceivers(
328  std::vector<FailedDestination> failedDest);
329 
336  std::vector<Mac48Address> GetPreqReceivers(uint32_t interface);
343  std::vector<Mac48Address> GetBroadcastReceivers(uint32_t interface);
352  bool DropDataFrame(uint32_t seqno, Mac48Address source);
354 
361 
362  // /\name Methods related to Queue/Dequeue procedures
364 
369  bool QueuePacket(QueuedPacket packet);
389  void ProactivePathResolved();
391 
394 
401  bool ShouldSendPreq(Mac48Address dst);
402 
410  void RetryPathDiscovery(Mac48Address dst, uint8_t numOfRetry);
412  void SendProactivePreq();
414 
419 
423  bool GetDoFlag() const;
428  bool GetRfFlag() const;
443  uint8_t GetMaxTtl() const;
448  uint32_t GetNextPreqId();
453  uint32_t GetNextHwmpSeqno();
458  uint32_t GetActivePathLifetime();
463  uint8_t GetUnicastPerrThreshold() const;
465 
466  private:
468  struct Statistics
469  {
470  uint16_t txUnicast;
471  uint16_t txBroadcast;
472  uint32_t txBytes;
473  uint16_t droppedTtl;
474  uint16_t totalQueued;
475  uint16_t totalDropped;
476  uint16_t initiatedPreq;
477  uint16_t initiatedPrep;
478  uint16_t initiatedPerr;
479 
484  void Print(std::ostream& os) const;
486  Statistics();
487  };
488 
490 
493  uint32_t m_dataSeqno;
494  uint32_t m_hwmpSeqno;
495  uint32_t m_preqId;
499  std::map<Mac48Address, uint32_t> m_lastDataSeqno;
501  std::map<Mac48Address, std::pair<uint32_t, uint32_t>> m_hwmpSeqnoMetricDatabase;
503 
506 
508  struct PreqEvent
509  {
512  };
513 
514  std::map<Mac48Address, PreqEvent> m_preqTimeouts;
519  std::vector<QueuedPacket> m_rqueue;
520 
524  uint16_t m_maxQueueSize;
535  bool m_isRoot;
536  uint8_t m_maxTtl;
543  bool m_doFlag;
544  bool m_rfFlag;
546 
550 };
551 } // namespace dot11s
552 } // namespace ns3
553 #endif
Callback template class.
Definition: callback.h:438
An identifier for simulation events.
Definition: event-id.h:55
an EUI-48 address
Definition: mac48-address.h:46
Interface for L2 mesh routing protocol and mesh point communication.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
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:68
void SetRoot()
Unset the current node as root.
std::vector< Mac48Address > GetPreqReceivers(uint32_t interface)
Get PREQ receivers.
void PeerLinkStatus(Mac48Address meshPointAddress, Mac48Address peerAddress, uint32_t interface, bool status)
Peer link status function.
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
Statistics:
uint32_t GetNextHwmpSeqno()
Get next HWMP sequence no function.
TracedCallback< RouteChange > m_routeChangeTraceSource
Route change trace source.
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.
Ptr< HwmpRtable > GetRoutingTable() const
Get pointer to HWMP routing table.
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
statistics
uint32_t m_hwmpSeqno
HWMP sequence no.
uint8_t GetMaxTtl() const
Get maximum TTL function.
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.
bool GetDoFlag() const
Get do flag function.
HwmpProtocol & operator=(const HwmpProtocol &)=delete
TracedCallback< Time > m_routeDiscoveryTimeCallback
Route discovery time:
static TypeId GetTypeId()
Get the type ID.
bool ShouldSendPreq(Mac48Address dst)
checks when the last path discovery procedure was started for a given destination.
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 RequestRoute(uint32_t sourceIface, const Mac48Address source, const Mac48Address destination, Ptr< const Packet > packet, uint16_t protocolType, RouteReplyCallback routeReply) override
Route request, inherited from MeshL2RoutingProtocol.
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.
void SendProactivePreq()
Proactive Preq routines:
void ForwardPathError(PathError perr)
Forwards a received path error.
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 RemoveRoutingStuff(uint32_t fromIface, const Mac48Address source, const Mac48Address destination, Ptr< Packet > packet, uint16_t &protocolType) override
Clean HWMP packet tag from packet; only the packet parameter is used.
bool m_doFlag
Destination only HWMP flag.
Mac48Address m_address
address
void DoInitialize() override
Initialize() implementation.
Time m_dot11MeshHWMPactiveRootTimeout
Lifetime of proactive routing information.
void DoDispose() override
Destructor implementation.
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 GetUnicastPerrThreshold() const
Get unicast PERR threshold 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 GetRfFlag() const
Get rf flag function.
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.
HwmpProtocolMacMap m_interfaces
interfaces
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.
uint8_t m_unicastPerrThreshold
Maximum number of PERR receivers, when we send a PERR as a chain of unicasts.
uint32_t m_preqId
PREQ ID.
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< RouteChange > RouteChangeTracedCallback
RouteChangeTracedCallback typedef.
std::map< uint32_t, Ptr< HwmpProtocolMac > > HwmpProtocolMacMap
HwmpProtocolMacMap typedef.
Interface MAC plugin for HWMP – 802.11s routing protocol.
See 7.3.2.97 of 802.11s draft 2.07.
See 7.3.2.96 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:89
Mac48Address destination
destination address
Definition: hwmp-protocol.h:90
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.
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:51
Time lifetime
lifetime of route
Definition: hwmp-protocol.h:57
Mac48Address retransmitter
route source
Definition: hwmp-protocol.h:54
uint32_t seqnum
sequence number of route
Definition: hwmp-protocol.h:58
uint32_t metric
metric of route
Definition: hwmp-protocol.h:56
Mac48Address destination
route destination
Definition: hwmp-protocol.h:53
std::string type
type of change
Definition: hwmp-protocol.h:52
uint32_t interface
interface index
Definition: hwmp-protocol.h:55