A Discrete-Event Network Simulator
QKDNetSim v2.0 (NS-3 v3.41) @ (+)
API
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
aodv-routing-protocol.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 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  * Based on
18  * NS-2 AODV model developed by the CMU/MONARCH group and optimized and
19  * tuned by Samir Das and Mahesh Marina, University of Cincinnati;
20  *
21  * AODV-UU implementation by Erik Nordström of Uppsala University
22  * https://web.archive.org/web/20100527072022/http://core.it.uu.se/core/index.php/AODV-UU
23  *
24  * Authors: Elena Buchatskaia <borovkovaes@iitp.ru>
25  * Pavel Boyko <boyko@iitp.ru>
26  */
27 #ifndef AODVROUTINGPROTOCOL_H
28 #define AODVROUTINGPROTOCOL_H
29 
30 #include "aodv-dpd.h"
31 #include "aodv-neighbor.h"
32 #include "aodv-packet.h"
33 #include "aodv-rqueue.h"
34 #include "aodv-rtable.h"
35 
36 #include "ns3/ipv4-interface.h"
37 #include "ns3/ipv4-l3-protocol.h"
38 #include "ns3/ipv4-routing-protocol.h"
39 #include "ns3/node.h"
40 #include "ns3/output-stream-wrapper.h"
41 #include "ns3/random-variable-stream.h"
42 
43 #include <map>
44 
45 namespace ns3
46 {
47 
48 class WifiMpdu;
49 enum WifiMacDropReason : uint8_t; // opaque enum declaration
50 
51 namespace aodv
52 {
59 {
60  public:
65  static TypeId GetTypeId();
66  static const uint32_t AODV_PORT;
67 
70  ~RoutingProtocol() override;
71  void DoDispose() override;
72 
73  // Inherited from Ipv4RoutingProtocol
75  const Ipv4Header& header,
76  Ptr<NetDevice> oif,
77  Socket::SocketErrno& sockerr) override;
79  const Ipv4Header& header,
81  const UnicastForwardCallback& ucb,
82  const MulticastForwardCallback& mcb,
83  const LocalDeliverCallback& lcb,
84  const ErrorCallback& ecb) override;
85  void NotifyInterfaceUp(uint32_t interface) override;
86  void NotifyInterfaceDown(uint32_t interface) override;
87  void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address) override;
88  void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address) override;
89  void SetIpv4(Ptr<Ipv4> ipv4) override;
91  Time::Unit unit = Time::S) const override;
92 
93  // Handle protocol parameters
99  {
100  return m_maxQueueTime;
101  }
102 
107  void SetMaxQueueTime(Time t);
108 
113  uint32_t GetMaxQueueLen() const
114  {
115  return m_maxQueueLen;
116  }
117 
122  void SetMaxQueueLen(uint32_t len);
123 
129  {
130  return m_destinationOnly;
131  }
132 
138  {
140  }
141 
147  {
148  return m_gratuitousReply;
149  }
150 
156  {
158  }
159 
164  void SetHelloEnable(bool f)
165  {
166  m_enableHello = f;
167  }
168 
173  bool GetHelloEnable() const
174  {
175  return m_enableHello;
176  }
177 
183  {
185  }
186 
191  bool GetBroadcastEnable() const
192  {
193  return m_enableBroadcast;
194  }
195 
204  int64_t AssignStreams(int64_t stream);
205 
206  protected:
207  void DoInitialize() override;
208 
209  private:
217 
218  // Protocol parameters.
219  uint32_t m_rreqRetries;
221  uint16_t m_ttlStart;
222  uint16_t m_ttlIncrement;
224  uint16_t m_ttlThreshold;
226  uint16_t m_timeoutBuffer;
227  uint16_t m_rreqRateLimit;
228  uint16_t m_rerrRateLimit;
230  uint32_t m_netDiameter;
232 
254  uint32_t m_maxQueueLen;
263 
267  std::map<Ptr<Socket>, Ipv4InterfaceAddress> m_socketAddresses;
273 
280  uint32_t m_requestId;
282  uint32_t m_seqNo;
290  uint16_t m_rreqCount;
292  uint16_t m_rerrCount;
293 
294  private:
296  void Start();
306  const Ipv4Header& header,
308  ErrorCallback ecb);
319  const Ipv4Header& header,
321  ErrorCallback ecb);
327  void ScheduleRreqRetry(Ipv4Address dst);
336  bool UpdateRouteLifeTime(Ipv4Address addr, Time lt);
342  void UpdateRouteToNeighbor(Ipv4Address sender, Ipv4Address receiver);
348  bool IsMyOwnAddress(Ipv4Address src);
369  void ProcessHello(const RrepHeader& rrepHeader, Ipv4Address receiverIfaceAddr);
377  Ptr<Ipv4Route> LoopbackRoute(const Ipv4Header& header, Ptr<NetDevice> oif) const;
378 
387  void RecvAodv(Ptr<Socket> socket);
394  void RecvRequest(Ptr<Packet> p, Ipv4Address receiver, Ipv4Address src);
401  void RecvReply(Ptr<Packet> p, Ipv4Address my, Ipv4Address src);
406  void RecvReplyAck(Ipv4Address neighbor);
413  void RecvError(Ptr<Packet> p, Ipv4Address src);
426  void SendHello();
430  void SendRequest(Ipv4Address dst);
435  void SendReply(const RreqHeader& rreqHeader, const RoutingTableEntry& toOrigin);
442  RoutingTableEntry& toOrigin,
443  bool gratRep);
447  void SendReplyAck(Ipv4Address neighbor);
456  void SendRerrMessage(Ptr<Packet> packet, std::vector<Ipv4Address> precursors);
464  void SendRerrWhenNoRouteToForward(Ipv4Address dst, uint32_t dstSeqNo, Ipv4Address origin);
473  void SendTo(Ptr<Socket> socket, Ptr<Packet> packet, Ipv4Address destination);
474 
478  void HelloTimerExpire();
488  std::map<Ipv4Address, Timer> m_addressReqTimer;
500  void AckTimerExpire(Ipv4Address neighbor, Time blacklistTimeout);
501 
506 };
507 
508 } // namespace aodv
509 } // namespace ns3
510 
511 #endif /* AODVROUTINGPROTOCOL_H */
double f(double x, void *params)
Definition: 80211b.c:70
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:42
Packet header for IPv4.
Definition: ipv4-header.h:34
a class to store IPv4 address information on an interface
Abstract base class for IPv4 routing protocols.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
SocketErrno
Enumeration of the possible errors returned by a socket.
Definition: socket.h:84
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
Unit
The unit to use to interpret a number representing time.
Definition: nstime.h:111
@ S
second
Definition: nstime.h:116
A simple virtual Timer class.
Definition: timer.h:74
a unique identifier for an interface.
Definition: type-id.h:59
Helper class used to remember already seen packets and detect duplicates.
Definition: aodv-dpd.h:45
Unique packets identification cache used for simple duplicate detection.
Definition: aodv-id-cache.h:46
maintain list of active neighbors
Definition: aodv-neighbor.h:54
AODV route request queue.
Definition: aodv-rqueue.h:197
Ptr< Ipv4Route > LoopbackRoute(const Ipv4Header &header, Ptr< NetDevice > oif) const
Create loopback route for given header.
uint32_t m_requestId
Broadcast ID.
void RecvAodv(Ptr< Socket > socket)
Receive and process control packet.
void UpdateRouteToNeighbor(Ipv4Address sender, Ipv4Address receiver)
Update neighbor record.
Timer m_rerrRateLimitTimer
RERR rate limit timer.
Time m_lastBcastTime
Keep track of the last bcast time.
void RecvReply(Ptr< Packet > p, Ipv4Address my, Ipv4Address src)
Receive RREP.
bool m_enableBroadcast
Indicates whether a a broadcast data packets forwarding enable.
bool GetBroadcastEnable() const
Get broadcast enable flag.
bool UpdateRouteLifeTime(Ipv4Address addr, Time lt)
Set lifetime field in routing table entry to the maximum of existing lifetime and lt,...
void RerrRateLimitTimerExpire()
Reset RERR count and schedule RERR rate limit timer with delay 1 sec.
Time m_blackListTimeout
Time for which the node is put into the blacklist.
void RecvReplyAck(Ipv4Address neighbor)
Receive RREP_ACK.
std::map< Ptr< Socket >, Ipv4InterfaceAddress > m_socketSubnetBroadcastAddresses
Raw subnet directed broadcast socket per each IP interface, map socket -> iface address (IP.
Time m_maxQueueTime
The maximum period of time that a routing protocol is allowed to buffer a packet for.
Time m_activeRouteTimeout
Period of time during which the route is considered to be valid.
std::map< Ipv4Address, Timer > m_addressReqTimer
Map IP address + RREQ timer.
uint32_t GetMaxQueueLen() const
Get the maximum queue length.
void DeferredRouteOutput(Ptr< const Packet > p, const Ipv4Header &header, UnicastForwardCallback ucb, ErrorCallback ecb)
Queue packet and send route request.
void SendTo(Ptr< Socket > socket, Ptr< Packet > packet, Ipv4Address destination)
Send packet to destination socket.
DuplicatePacketDetection m_dpd
Handle duplicated broadcast/multicast packets.
Time m_netTraversalTime
Estimate of the average net traversal time.
void DoDispose() override
Destructor implementation.
void SendRequest(Ipv4Address dst)
Send RREQ.
Time m_pathDiscoveryTime
Estimate of maximum time needed to find route in network.
bool m_gratuitousReply
Indicates whether a gratuitous RREP should be unicast to the node originated route discovery.
uint16_t m_rerrCount
Number of RERRs used for RERR rate control.
void HelloTimerExpire()
Schedule next send of hello message.
void NotifyTxError(WifiMacDropReason reason, Ptr< const WifiMpdu > mpdu)
Notify that an MPDU was dropped.
RoutingTable m_routingTable
Routing table.
uint16_t m_rreqRateLimit
Maximum number of RREQ per second.
Ptr< NetDevice > m_lo
Loopback device used to defer RREQ until packet will be fully formed.
uint32_t m_netDiameter
Net diameter measures the maximum possible number of hops between two nodes in the network.
uint32_t m_maxQueueLen
The maximum number of packets that we allow a routing protocol to buffer.
uint16_t m_ttlThreshold
Maximum TTL value for expanding ring search, TTL = NetDiameter is used beyond this value.
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
void SetMaxQueueTime(Time t)
Set the maximum queue time.
uint16_t m_ttlIncrement
TTL increment for each attempt using the expanding ring search for RREQ dissemination.
Time m_myRouteTimeout
Value of lifetime field in RREP generating by this node.
uint16_t m_timeoutBuffer
Provide a buffer for the timeout.
void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const override
Print the Routing Table entries.
Ptr< Socket > FindSocketWithInterfaceAddress(Ipv4InterfaceAddress iface) const
Find unicast socket with local interface address iface.
void NotifyInterfaceDown(uint32_t interface) override
void SetBroadcastEnable(bool f)
Set broadcast enable flag.
void SendPacketFromQueue(Ipv4Address dst, Ptr< Ipv4Route > route)
Forward packet from route request queue.
uint32_t m_allowedHelloLoss
Number of hello messages which may be loss for valid link.
bool IsMyOwnAddress(Ipv4Address src)
Test whether the provided address is assigned to an interface on this node.
void SetMaxQueueLen(uint32_t len)
Set the maximum queue length.
void ScheduleRreqRetry(Ipv4Address dst)
Repeated attempts by a source node at route discovery for a single destination use the expanding ring...
void SendReplyByIntermediateNode(RoutingTableEntry &toDst, RoutingTableEntry &toOrigin, bool gratRep)
Send RREP by intermediate node.
std::map< Ptr< Socket >, Ipv4InterfaceAddress > m_socketAddresses
Raw unicast socket per each IP interface, map socket -> iface address (IP + mask)
void SetGratuitousReplyFlag(bool f)
Set gratuitous reply flag.
bool RouteInput(Ptr< const Packet > p, const Ipv4Header &header, Ptr< const NetDevice > idev, const UnicastForwardCallback &ucb, const MulticastForwardCallback &mcb, const LocalDeliverCallback &lcb, const ErrorCallback &ecb) override
Route an input packet (to be forwarded or locally delivered)
void Start()
Start protocol operation.
uint16_t m_rreqCount
Number of RREQs used for RREQ rate control.
IdCache m_rreqIdCache
Handle duplicated RREQ.
Time m_deletePeriod
DeletePeriod is intended to provide an upper bound on the time for which an upstream node A can have ...
void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address) override
void SendRerrWhenNoRouteToForward(Ipv4Address dst, uint32_t dstSeqNo, Ipv4Address origin)
Send RERR message when no route to forward input packet.
Time m_helloInterval
Every HelloInterval the node checks whether it has sent a broadcast within the last HelloInterval.
void AckTimerExpire(Ipv4Address neighbor, Time blacklistTimeout)
Mark link to neighbor node as unidirectional for blacklistTimeout.
void SetHelloEnable(bool f)
Set hello enable.
bool m_destinationOnly
Indicates only the destination may respond to this RREQ.
void SetIpv4(Ptr< Ipv4 > ipv4) override
static TypeId GetTypeId()
Get the type ID.
void SetDestinationOnlyFlag(bool f)
Set destination only flag.
bool GetDestinationOnlyFlag() const
Get destination only flag.
void SendRerrMessage(Ptr< Packet > packet, std::vector< Ipv4Address > precursors)
Forward RERR.
uint16_t m_ttlStart
Initial TTL value for RREQ.
uint32_t m_rreqRetries
Maximum number of retransmissions of RREQ with TTL = NetDiameter to discover a route.
uint32_t m_seqNo
Request sequence number.
bool m_enableHello
Indicates whether a hello messages enable.
Neighbors m_nb
Handle neighbors.
bool Forwarding(Ptr< const Packet > p, const Ipv4Header &header, UnicastForwardCallback ucb, ErrorCallback ecb)
If route exists and is valid, forward packet.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
static const uint32_t AODV_PORT
UDP Port for AODV control traffic.
Timer m_rreqRateLimitTimer
RREQ rate limit timer.
Time GetMaxQueueTime() const
Get maximum queue time.
void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address) override
Time m_nodeTraversalTime
NodeTraversalTime is a conservative estimate of the average one hop traversal time for packets and sh...
uint16_t m_rerrRateLimit
Maximum number of REER per second.
void RecvRequest(Ptr< Packet > p, Ipv4Address receiver, Ipv4Address src)
Receive RREQ.
Ptr< Socket > FindSubnetBroadcastSocketWithInterfaceAddress(Ipv4InterfaceAddress iface) const
Find subnet directed broadcast socket with local interface address iface.
void DoInitialize() override
Initialize() implementation.
bool GetHelloEnable() const
Get hello enable flag.
void SendRerrWhenBreaksLinkToNextHop(Ipv4Address nextHop)
Initiate RERR.
void RouteRequestTimerExpire(Ipv4Address dst)
Handle route discovery process.
void NotifyInterfaceUp(uint32_t interface) override
bool GetGratuitousReplyFlag() const
Get gratuitous reply flag.
void RecvError(Ptr< Packet > p, Ipv4Address src)
Receive RERR.
Ptr< Ipv4Route > RouteOutput(Ptr< Packet > p, const Ipv4Header &header, Ptr< NetDevice > oif, Socket::SocketErrno &sockerr) override
Query routing cache for an existing route, for an outbound packet.
Time m_nextHopWait
Period of our waiting for the neighbour's RREP_ACK.
void SendReplyAck(Ipv4Address neighbor)
Send RREP_ACK.
Ptr< Ipv4 > m_ipv4
IP protocol.
void RreqRateLimitTimerExpire()
Reset RREQ count and schedule RREQ rate limit timer with delay 1 sec.
void ProcessHello(const RrepHeader &rrepHeader, Ipv4Address receiverIfaceAddr)
Process hello message.
void SendReply(const RreqHeader &rreqHeader, const RoutingTableEntry &toOrigin)
Send RREP.
RequestQueue m_queue
A "drop-front" queue used by the routing layer to buffer packets to which it does not have a route.
Routing table entry.
Definition: aodv-rtable.h:62
The Routing table used by AODV protocol.
Definition: aodv-rtable.h:424
Route Reply (RREP) Message Format.
Definition: aodv-packet.h:358
Route Request (RREQ) Message Format.
Definition: aodv-packet.h:138
WifiMacDropReason
The reason why an MPDU was dropped.
Definition: wifi-mac.h:77
address
Definition: first.py:47
Every class exported by the ns3 library is enclosed in the ns3 namespace.