|
A Discrete-Event Network Simulator
|
API
|
Go to the documentation of this file.
28 #define NS_LOG_APPEND_CONTEXT \
29 if (m_ipv4) { std::clog << "[node " << m_ipv4->GetObject<Node> ()->GetId () << "] "; }
33 #include "ns3/boolean.h"
34 #include "ns3/random-variable-stream.h"
35 #include "ns3/inet-socket-address.h"
36 #include "ns3/trace-source-accessor.h"
37 #include "ns3/udp-socket-factory.h"
38 #include "ns3/udp-l4-protocol.h"
39 #include "ns3/udp-header.h"
40 #include "ns3/wifi-net-device.h"
41 #include "ns3/adhoc-wifi-mac.h"
42 #include "ns3/wifi-mac-queue-item.h"
43 #include "ns3/string.h"
44 #include "ns3/pointer.h"
81 static TypeId tid =
TypeId (
"ns3::aodv::DeferredRouteOutputTag")
83 .SetGroupName (
"Aodv")
114 return sizeof(int32_t);
129 os <<
"DeferredRouteOutputTag: output interface = " <<
m_oif;
147 m_rreqRateLimit (10),
148 m_rerrRateLimit (10),
149 m_activeRouteTimeout (
Seconds (3)),
152 m_netTraversalTime (
Time ((2 * m_netDiameter) * m_nodeTraversalTime)),
153 m_pathDiscoveryTime (
Time (2 * m_netTraversalTime)),
154 m_myRouteTimeout (
Time (2 * std::
max (m_pathDiscoveryTime, m_activeRouteTimeout))),
156 m_allowedHelloLoss (2),
157 m_deletePeriod (
Time (5 * std::
max (m_activeRouteTimeout, m_helloInterval))),
158 m_nextHopWait (m_nodeTraversalTime +
MilliSeconds (10)),
159 m_blackListTimeout (
Time (m_rreqRetries * m_netTraversalTime)),
162 m_destinationOnly (false),
163 m_gratuitousReply (true),
164 m_enableHello (false),
165 m_routingTable (m_deletePeriod),
166 m_queue (m_maxQueueLen, m_maxQueueTime),
169 m_rreqIdCache (m_pathDiscoveryTime),
170 m_dpd (m_pathDiscoveryTime),
171 m_nb (m_helloInterval),
174 m_htimer (
Timer::CANCEL_ON_DESTROY),
175 m_rreqRateLimitTimer (
Timer::CANCEL_ON_DESTROY),
176 m_rerrRateLimitTimer (
Timer::CANCEL_ON_DESTROY),
185 static TypeId tid =
TypeId (
"ns3::aodv::RoutingProtocol")
187 .SetGroupName (
"Aodv")
189 .AddAttribute (
"HelloInterval",
"HELLO messages emission interval.",
193 .AddAttribute (
"TtlStart",
"Initial TTL value for RREQ.",
196 MakeUintegerChecker<uint16_t> ())
197 .AddAttribute (
"TtlIncrement",
"TTL increment for each attempt using the expanding ring search for RREQ dissemination.",
200 MakeUintegerChecker<uint16_t> ())
201 .AddAttribute (
"TtlThreshold",
"Maximum TTL value for expanding ring search, TTL = NetDiameter is used beyond this value.",
204 MakeUintegerChecker<uint16_t> ())
205 .AddAttribute (
"TimeoutBuffer",
"Provide a buffer for the timeout.",
208 MakeUintegerChecker<uint16_t> ())
209 .AddAttribute (
"RreqRetries",
"Maximum number of retransmissions of RREQ to discover a route",
212 MakeUintegerChecker<uint32_t> ())
213 .AddAttribute (
"RreqRateLimit",
"Maximum number of RREQ per second.",
216 MakeUintegerChecker<uint32_t> ())
217 .AddAttribute (
"RerrRateLimit",
"Maximum number of RERR per second.",
220 MakeUintegerChecker<uint32_t> ())
221 .AddAttribute (
"NodeTraversalTime",
"Conservative estimate of the average one hop traversal time for packets and should include "
222 "queuing delays, interrupt processing times and transfer times.",
226 .AddAttribute (
"NextHopWait",
"Period of our waiting for the neighbour's RREP_ACK = 10 ms + NodeTraversalTime",
230 .AddAttribute (
"ActiveRouteTimeout",
"Period of time during which the route is considered to be valid",
234 .AddAttribute (
"MyRouteTimeout",
"Value of lifetime field in RREP generating by this node = 2 * max(ActiveRouteTimeout, PathDiscoveryTime)",
238 .AddAttribute (
"BlackListTimeout",
"Time for which the node is put into the blacklist = RreqRetries * NetTraversalTime",
242 .AddAttribute (
"DeletePeriod",
"DeletePeriod is intended to provide an upper bound on the time for which an upstream node A "
243 "can have a neighbor B as an active next hop for destination D, while B has invalidated the route to D."
244 " = 5 * max (HelloInterval, ActiveRouteTimeout)",
248 .AddAttribute (
"NetDiameter",
"Net diameter measures the maximum possible number of hops between two nodes in the network",
251 MakeUintegerChecker<uint32_t> ())
252 .AddAttribute (
"NetTraversalTime",
"Estimate of the average net traversal time = 2 * NodeTraversalTime * NetDiameter",
256 .AddAttribute (
"PathDiscoveryTime",
"Estimate of maximum time needed to find route in network = 2 * NetTraversalTime",
260 .AddAttribute (
"MaxQueueLen",
"Maximum number of packets that we allow a routing protocol to buffer.",
264 MakeUintegerChecker<uint32_t> ())
265 .AddAttribute (
"MaxQueueTime",
"Maximum time packets can be queued (in seconds)",
270 .AddAttribute (
"AllowedHelloLoss",
"Number of hello messages which may be loss for valid link.",
273 MakeUintegerChecker<uint16_t> ())
274 .AddAttribute (
"GratuitousReply",
"Indicates whether a gratuitous RREP should be unicast to the node originated route discovery.",
279 .AddAttribute (
"DestinationOnly",
"Indicates only the destination may respond to this RREQ.",
284 .AddAttribute (
"EnableHello",
"Indicates whether a hello messages enable.",
289 .AddAttribute (
"EnableBroadcast",
"Indicates whether a broadcast data packets forwarding enable.",
294 .AddAttribute (
"UniformRv",
295 "Access to the underlying UniformRandomVariable",
298 MakePointerChecker<UniformRandomVariable> ())
327 iter->first->Close ();
333 iter->first->Close ();
343 <<
"; Time: " <<
Now ().
As (unit)
344 <<
", Local time: " <<
m_ipv4->GetObject<
Node> ()->GetLocalTime ().As (unit)
345 <<
", AODV Routing table" << std::endl;
402 NS_LOG_DEBUG (
"Exist route to " << route->GetDestination () <<
" from interface " << route->GetSource ());
403 if (oif != 0 && route->GetOutputDevice () != oif)
417 uint32_t iif = (oif ?
m_ipv4->GetInterfaceForDevice (oif) : -1);
464 int32_t iif =
m_ipv4->GetInterfaceForDevice (idev);
503 NS_LOG_DEBUG (
"Duplicated packet " << p->
GetUid () <<
" from " << origin <<
". Drop.");
508 if (lcb.
IsNull () ==
false)
511 lcb (p, header, iif);
516 NS_LOG_ERROR (
"Unable to deliver packet locally due to null callback " << p->
GetUid () <<
" from " << origin);
540 ucb (route, packet, header);
557 if (
m_ipv4->IsDestinationAddress (dst, iif))
566 if (lcb.
IsNull () ==
false)
569 lcb (p, header, iif);
573 NS_LOG_ERROR (
"Unable to deliver packet locally due to null callback " << p->
GetUid () <<
" from " << origin);
580 if (
m_ipv4->IsForwarding (iif) ==
false)
582 NS_LOG_LOGIC (
"Forwarding disabled for this interface");
605 NS_LOG_LOGIC (route->GetSource () <<
" forwarding to " << dst <<
" from " << origin <<
" packet " << p->
GetUid ());
628 ucb (route, p, header);
641 NS_LOG_LOGIC (
"route not found to " << dst <<
". Send RERR message.");
674 if (l3->GetNAddresses (i) > 1)
676 NS_LOG_WARN (
"AODV does not work with more then one address per each interface.");
712 if (l3->GetInterface (i)->GetArpCache ())
752 mac->TraceDisconnectWithoutContext (
"DroppedMpdu",
790 if (l3->GetNAddresses (i) == 1)
832 NS_LOG_LOGIC (
"AODV does not work with more then one address per each interface. Ignore added address");
850 unicastSocket->
Close ();
855 if (l3->GetNAddresses (i))
898 NS_LOG_LOGIC (
"Remove address not participating in AODV operation");
948 int32_t
interface =
m_ipv4->GetInterfaceForAddress (addr);
949 if (oif ==
m_ipv4->GetNetDevice (
static_cast<uint32_t
> (interface)))
951 rt->SetSource (addr);
958 rt->SetSource (j->second.GetLocal ());
962 rt->SetOutputDevice (
m_lo);
1111 uint16_t backoffFactor = rt.
GetRreqCnt () - 1;
1112 NS_LOG_LOGIC (
"Applying binary exponential backoff factor " << backoffFactor);
1139 NS_ASSERT_MSG (
false,
"Received a packet from an unknown socket");
1141 NS_LOG_DEBUG (
"AODV node " <<
this <<
" received a AODV packet from " << sender <<
" to " << receiver);
1148 NS_LOG_DEBUG (
"AODV message " << packet->
GetUid () <<
" with unknown type received: " << tHeader.
Get () <<
". Drop");
1151 switch (tHeader.
Get ())
1198 NS_LOG_FUNCTION (
this <<
"sender " << sender <<
" receiver " << receiver);
1204 m_ipv4->GetAddress (
m_ipv4->GetInterfaceForAddress (receiver), 0),
1218 m_ipv4->GetAddress (
m_ipv4->GetInterfaceForAddress (receiver), 0),
1244 uint32_t
id = rreqHeader.
GetId ();
1276 m_ipv4->GetAddress (
m_ipv4->GetInterfaceForAddress (receiver), 0), hop,
1308 NS_LOG_DEBUG (
"Neighbor:" << src <<
" not found in routing table. Creating an entry");
1311 m_ipv4->GetAddress (
m_ipv4->GetInterfaceForAddress (receiver), 0),
1329 NS_LOG_LOGIC (receiver <<
" receive RREQ with hop count " <<
static_cast<uint32_t
> (rreqHeader.
GetHopCount ())
1330 <<
" ID " << rreqHeader.
GetId ()
1331 <<
" to destination " << rreqHeader.
GetDst ());
1338 NS_LOG_DEBUG (
"Send reply since I am the destination");
1382 NS_LOG_DEBUG (
"TTL exceeded. Drop RREQ origin " << src <<
" destination " << dst );
1449 if (toDst.
GetHop () == 1)
1544 m_ipv4->GetAddress (
m_ipv4->GetInterfaceForAddress (receiver), 0), hop,
1633 NS_LOG_DEBUG (
"TTL exceeded. Drop RREP destination " << dst <<
" origin " << rrepHeader.
GetOrigin ());
1676 m_ipv4->GetAddress (
m_ipv4->GetInterfaceForAddress (receiver), 0),
1704 std::map<Ipv4Address, uint32_t> dstWithNextHopSrc;
1705 std::map<Ipv4Address, uint32_t> unreachable;
1707 std::pair<Ipv4Address, uint32_t> un;
1710 for (std::map<Ipv4Address, uint32_t>::const_iterator i =
1711 dstWithNextHopSrc.begin (); i != dstWithNextHopSrc.end (); ++i)
1713 if (i->first == un.first)
1715 unreachable.insert (un);
1720 std::vector<Ipv4Address> precursors;
1721 for (std::map<Ipv4Address, uint32_t>::const_iterator i = unreachable.begin ();
1722 i != unreachable.end (); )
1734 rerrHeader.
Clear ();
1779 NS_LOG_DEBUG (
"Route not found. Drop all packets with dst " << dst);
1791 NS_LOG_DEBUG (
"Route down. Stop search. Drop packet with destination " << dst);
1892 NS_LOG_DEBUG (
"Output device doesn't match. Dropped.");
1899 ucb (route, p, header);
1908 std::vector<Ipv4Address> precursors;
1909 std::map<Ipv4Address, uint32_t> unreachable;
1919 for (std::map<Ipv4Address, uint32_t>::const_iterator i = unreachable.begin (); i
1920 != unreachable.end (); )
1933 rerrHeader.
Clear ();
1954 unreachable.insert (std::make_pair (nextHop, toNextHop.
GetSeqNo ()));
1971 <<
"; suppressing RERR");
1988 NS_LOG_LOGIC (
"Unicast RERR to the source of the data transmission");
2020 if (precursors.empty ())
2033 <<
"; suppressing RERR");
2037 if (precursors.size () == 1)
2052 std::vector<Ipv4InterfaceAddress> ifaces;
2054 for (std::vector<Ipv4Address>::const_iterator i = precursors.begin (); i != precursors.end (); ++i)
2057 && std::find (ifaces.begin (), ifaces.end (), toPrecursor.
GetInterface ()) == ifaces.end ())
2063 for (std::vector<Ipv4InterfaceAddress>::const_iterator i = ifaces.begin (); i != ifaces.end (); ++i)
2067 NS_LOG_LOGIC (
"Broadcast RERR message from interface " << i->GetLocal ());
Ptr< Ipv4Route > RouteOutput(Ptr< Packet > p, const Ipv4Header &header, Ptr< NetDevice > oif, Socket::SocketErrno &sockerr)
Query routing cache for an existing route, for an outbound packet.
void Clear()
Remove all entries.
std::map< Ptr< Socket >, Ipv4InterfaceAddress > m_socketAddresses
Raw unicast socket per each IP interface, map socket -> iface address (IP + mask)
a unique identifier for an interface.
void SetQueueTimeout(Time t)
Set queue timeout.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
TypeId GetInstanceTypeId() const
Get the most derived TypeId for this Object.
void RerrRateLimitTimerExpire()
Reset RERR count and schedule RERR rate limit timer with delay 1 sec.
uint32_t GetMaxQueueLen() const
Get the maximum queue length.
void RecvRequest(Ptr< Packet > p, Ipv4Address receiver, Ipv4Address src)
Receive RREQ.
void Update(Ipv4Address addr, Time expire)
Update expire time for entry with address addr, if it exists, else add new entry.
bool IsUnidirectional() const
Get the unidirectional flag.
virtual bool SetAllowBroadcast(bool allowBroadcast)=0
Configure whether broadcast datagram transmissions are allowed.
Ipv4Address GetNextHop() const
Get next hop address.
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
#define NS_ASSERT(condition)
At runtime, in debugging builds, if this condition is not true, the program prints the source file,...
void Start()
Start protocol operation.
Ptr< Socket > FindSocketWithInterfaceAddress(Ipv4InterfaceAddress iface) const
Find unicast socket with local interface address iface.
Ptr< const AttributeChecker > MakeTimeChecker(const Time min, const Time max)
Helper to make a Time checker with bounded range.
AttributeValue implementation for Boolean.
void InvalidateRoutesWithDst(std::map< Ipv4Address, uint32_t > const &unreachable)
Update routing entries with this destination as follows:
uint32_t PeekHeader(Header &header) const
Deserialize but does not remove the header from the internal buffer.
void RecvReply(Ptr< Packet > p, Ipv4Address my, Ipv4Address src)
Receive RREP.
virtual int Bind(const Address &address)=0
Allocate a local endpoint for this socket.
void RouteRequestTimerExpire(Ipv4Address dst)
Handle route discovery process.
void ScheduleTimer()
Schedule m_ntimer.
bool LookupValidRoute(Ipv4Address dst, RoutingTableEntry &rt)
Lookup route in VALID state.
int32_t m_oif
Positive if output device is fixed in RouteOutput.
uint16_t m_ttlThreshold
Maximum TTL value for expanding ring search, TTL = NetDiameter is used beyond this value.
void ScheduleRreqRetry(Ipv4Address dst)
Repeated attempts by a source node at route discovery for a single destination use the expanding ring...
bool IsDuplicate(Ipv4Address addr, uint32_t id)
Check that entry (addr, id) exists in cache.
void SetValidSeqNo(bool s)
Set the valid sequence number.
void AddHeader(const Header &header)
Add header to this packet.
SocketErrno
Enumeration of the possible errors returned by a socket.
WifiMacDropReason
The reason why an MPDU was dropped.
virtual Address GetAddress(void) const =0
bool GetGratuitousReplyFlag() const
Get gratuitous reply flag.
static Time Now(void)
Return the current simulation virtual time.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
Neighbors m_nb
Handle neighbors.
static Ipv4Address GetBroadcast(void)
void Clear()
Delete all entries from routing table.
TAG_BUFFER_INLINE void WriteU32(uint32_t v)
void DropPacketWithDst(Ipv4Address dst)
Remove all packets with destination IP address dst.
@ AODVTYPE_RREP
AODVTYPE_RREP.
bool IsNull(void) const
Check for null implementation.
virtual void SetIpv4(Ptr< Ipv4 > ipv4)
Time m_activeRouteTimeout
Period of time during which the route is considered to be valid.
void RreqRateLimitTimerExpire()
Reset RREQ count and schedule RREQ rate limit timer with delay 1 sec.
bool m_enableBroadcast
Indicates whether a a broadcast data packets forwarding enable.
void Deserialize(TagBuffer i)
Time MicroSeconds(uint64_t value)
Construct a Time in the indicated unit.
Ipv4Mask GetMask(void) const
Get the network mask.
bool Update(RoutingTableEntry &rt)
Update routing table.
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
bool Forwarding(Ptr< const Packet > p, const Ipv4Header &header, UnicastForwardCallback ucb, ErrorCallback ecb)
If route exists and is valid, forward packet.
void NotifyTxError(WifiMacDropReason reason, Ptr< const WifiMacQueueItem > mpdu)
Notify that an MPDU was dropped.
uint16_t m_rerrRateLimit
Maximum number of REER per second.
Ptr< T > GetObject(void) const
Get a pointer to the requested aggregated Object.
Ptr< NetDevice > m_lo
Loopback device used to defer RREQ until packet will be fully formed.
void SetInterface(Ipv4InterfaceAddress iface)
Set the Ipv4InterfaceAddress.
uint8_t GetRreqCnt() const
Get the RREQ count.
uint16_t m_rreqRateLimit
Maximum number of RREQ per second.
#define NS_LOG_WARN(msg)
Use NS_LOG to output a message of level LOG_WARN.
Wifi MAC high model for an ad-hoc Wifi MAC.
bool GetValidSeqNo() const
Get the valid sequence number.
Ipv4 addresses are stored in host order in this class.
uint32_t m_allowedHelloLoss
Number of hello messages which may be loss for valid link.
static const uint32_t AODV_PORT
UDP Port for AODV control traffic.
std::ostream * GetStream(void)
Return a pointer to an ostream previously set in the wrapper.
bool Dequeue(Ipv4Address dst, QueueEntry &entry)
Return first found (the earliest) entry for given destination.
void DeferredRouteOutput(Ptr< const Packet > p, const Ipv4Header &header, UnicastForwardCallback ucb, ErrorCallback ecb)
Queue packet and send route request.
uint32_t m_maxQueueLen
The maximum number of packets that we allow a routing protocol to buffer.
void SetTtl(uint8_t ttl)
Set the tag's TTL.
virtual void NotifyInterfaceDown(uint32_t interface)
TAG_BUFFER_INLINE uint32_t ReadU32(void)
void AddArpCache(Ptr< ArpCache > a)
Add ARP cache to be used to allow layer 2 notifications processing.
TimeWithUnit As(const enum Unit unit=Time::AUTO) const
Attach a unit to a Time, to facilitate output in a specific unit.
void DelArpCache(Ptr< ArpCache > a)
Don't use given ARP cache any more (interface is down)
uint32_t GetSerializedSize() const
bool PeekPacketTag(Tag &tag) const
Search a matching tag and call Tag::Deserialize if it is found.
int32_t GetInterface() const
Get the output interface.
static EventId Schedule(Time const &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Ptr< const AttributeAccessor > MakeBooleanAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
virtual int SendTo(Ptr< Packet > p, uint32_t flags, const Address &toAddress)=0
Send data to a specified peer.
void SendPacketFromQueue(Ipv4Address dst, Ptr< Ipv4Route > route)
Forward packet from route request queue.
static InetSocketAddress ConvertFrom(const Address &address)
Returns an InetSocketAddress which corresponds to the input Address.
void Cancel(void)
Cancel the currently-running event if there is one.
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Timer m_ackTimer
RREP_ACK timer.
void SendReplyByIntermediateNode(RoutingTableEntry &toDst, RoutingTableEntry &toOrigin, bool gratRep)
Send RREP by intermediate node.
bool IsDuplicate(Ptr< const Packet > p, const Ipv4Header &header)
Check if the packet is a duplicate.
RequestQueue m_queue
A "drop-front" queue used by the routing layer to buffer packets to which it does not have a route.
Time GetDelayLeft(void) const
Hold together all Wifi-related objects.
bool IsRunning(void) const
Timer m_htimer
Hello timer.
void SetDestinationOnlyFlag(bool f)
Set destination only flag.
virtual void DoInitialize(void)
Initialize() implementation.
bool m_enableHello
Indicates whether a hello messages enable.
A simple virtual Timer class.
void SetBroadcastEnable(bool f)
Set broadcast enable flag.
uint32_t m_requestId
Broadcast ID.
UnicastForwardCallback GetUnicastForwardCallback() const
Get unicast forward callback.
bool GetDestinationOnlyFlag() const
Get destination only flag.
bool IsMulticast(void) const
void SetRreqCnt(uint8_t n)
Set the RREQ count.
void SendRerrWhenNoRouteToForward(Ipv4Address dst, uint32_t dstSeqNo, Ipv4Address origin)
Send RERR message when no route to forward input packet.
void Serialize(TagBuffer i) const
uint16_t m_timeoutBuffer
Provide a buffer for the timeout.
uint16_t m_rerrCount
Number of RERRs used for RERR rate control.
void SetRecvCallback(Callback< void, Ptr< Socket > > receivedData)
Notify application when new data is available to be read.
@ AODVTYPE_RREP_ACK
AODVTYPE_RREP_ACK.
uint16_t m_ttlIncrement
TTL increment for each attempt using the expanding ring search for RREQ dissemination.
void SendHello()
Send hello.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Ptr< Ipv4Route > GetRoute() const
Get route function.
void RecvError(Ptr< Packet > p, Ipv4Address src)
Receive RERR.
void Purge()
Delete all outdated entries and invalidate valid entry if Lifetime is expired.
void SendRequest(Ipv4Address dst)
Send RREQ.
tag a set of bytes in a packet
a polymophic address class
DeferredRouteOutputTag(int32_t o=-1)
Constructor.
Time m_deletePeriod
DeletePeriod is intended to provide an upper bound on the time for which an upstream node A can have ...
a class to store IPv4 address information on an interface
Tag used by AODV implementation.
void SetGratuitousReplyFlag(bool f)
Set gratuitous reply flag.
void Schedule(void)
Schedule a new event using the currently-configured delay, function, and arguments.
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
virtual Ptr< Packet > RecvFrom(uint32_t maxSize, uint32_t flags, Address &fromAddress)=0
Read a single packet from the socket and retrieve the sender address.
Ipv4Address GetIpv4(void) const
Time m_myRouteTimeout
Value of lifetime field in RREP generating by this node.
IdCache m_rreqIdCache
Handle duplicated RREQ.
Time MilliSeconds(uint64_t value)
Construct a Time in the indicated unit.
uint32_t RemoveHeader(Header &header)
Deserialize and remove the header from the internal buffer.
void SendRerrWhenBreaksLinkToNextHop(Ipv4Address nextHop)
Initiate RERR.
void SetSeqNo(uint32_t sn)
Set the sequence number.
@ AODVTYPE_RREQ
AODVTYPE_RREQ.
bool m_destinationOnly
Indicates only the destination may respond to this RREQ.
Time GetLifeTime() const
Get the lifetime.
Ptr< Ipv4 > m_ipv4
IP protocol.
Ptr< const AttributeChecker > MakeBooleanChecker(void)
Time m_lastBcastTime
Keep track of the last bcast time.
Ipv4Header GetIpv4Header() const
Get IPv4 header.
bool IsMyOwnAddress(Ipv4Address src)
Test whether the provided address is assigned to an interface on this node.
uint16_t GetHop() const
Get the number of hops.
Ptr< const Packet > GetPacket() const
Get packet from entry.
void SendTo(Ptr< Socket > socket, Ptr< Packet > packet, Ipv4Address destination)
Send packet to destination scoket.
Ptr< Socket > FindSubnetBroadcastSocketWithInterfaceAddress(Ipv4InterfaceAddress iface) const
Find subnet directed broadcast socket with local interface address iface.
Ptr< Ipv4Route > LoopbackRoute(const Ipv4Header &header, Ptr< NetDevice > oif) const
Create loopback route for given header.
Simulation virtual time values and global simulation resolution.
virtual int Close(void)=0
Close a socket.
uint32_t m_rreqRetries
Maximum number of retransmissions of RREQ with TTL = NetDiameter to discover a route.
@ CANCEL_ON_DESTROY
This policy cancels the event from the destructor of the Timer or from Suspend().
uint32_t GetSeqNo() const
Get the sequence number.
bool IsBroadcast(void) const
#define NS_ASSERT_MSG(condition, message)
At runtime, in debugging builds, if this condition is not true, the program prints the message to out...
Time m_nextHopWait
Period of our waiting for the neighbour's RREP_ACK.
RoutingTable m_routingTable
Routing table.
uint16_t m_ttlStart
Initial TTL value for RREQ.
virtual void DoInitialize(void)
Initialize() implementation.
static const uint8_t PROT_NUMBER
protocol number (0x11)
Time m_helloInterval
Every HelloInterval the node checks whether it has sent a broadcast within the last HelloInterval.
void SetMaxQueueLen(uint32_t len)
Set maximum queue length.
std::map< Ipv4Address, Timer > m_addressReqTimer
Map IP address + RREQ timer.
virtual void NotifyInterfaceUp(uint32_t interface)
void SendReply(RreqHeader const &rreqHeader, RoutingTableEntry const &toOrigin)
Send RREP.
virtual ~RoutingProtocol()
static Ipv4Address GetLoopback(void)
void UpdateRouteToNeighbor(Ipv4Address sender, Ipv4Address receiver)
Update neighbor record.
static Time GetMaximumSimulationTime(void)
Get the maximum representable simulation time.
Ptr< NetDevice > GetOutputDevice() const
Get output device.
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
#define NS_LOG_LOGIC(msg)
Use NS_LOG to output a message of level LOG_LOGIC.
Ptr< const AttributeAccessor > MakePointerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
void DeleteAllRoutesFromInterface(Ipv4InterfaceAddress iface)
Delete all route from interface with address iface.
Hold variables of type string.
static TypeId GetTypeId(void)
Get the type ID.
Abstract base class for IPv4 routing protocols.
bool GetHelloEnable() const
Get hello enable flag.
Time m_netTraversalTime
Estimate of the average net traversal time.
#define NS_LOG_ERROR(msg)
Use NS_LOG to output a message of level LOG_ERROR.
void Print(std::ostream &os) const
void SendReplyAck(Ipv4Address neighbor)
Send RREP_ACK.
uint8_t GetTtl(void) const
Get the tag's TTL.
void AddPacketTag(const Tag &tag) const
Add a packet tag.
#define NS_ABORT_MSG_UNLESS(cond, msg)
Abnormal program termination if a condition is false, with a message.
void SendRerrMessage(Ptr< Packet > packet, std::vector< Ipv4Address > precursors)
Forward RERR.
bool Enqueue(QueueEntry &entry)
Push entry in queue, if there is no entry with the same packet and destination address in queue.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
void GetListOfDestinationWithNextHop(Ipv4Address nextHop, std::map< Ipv4Address, uint32_t > &unreachable)
Lookup routing entries with next hop Address dst and not empty list of precursors.
bool UpdateRouteLifeTime(Ipv4Address addr, Time lt)
Set lifetime field in routing table entry to the maximum of existing lifetime and lt,...
void RecvAodv(Ptr< Socket > socket)
Receive and process control packet.
void SetDelay(const Time &delay)
#define NS_LOG_DEBUG(msg)
Use NS_LOG to output a message of level LOG_DEBUG.
bool MarkLinkAsUnidirectional(Ipv4Address neighbor, Time blacklistTimeout)
Mark entry as unidirectional (e.g.
@ AODVTYPE_RERR
AODVTYPE_RERR.
virtual void DoDispose()
Destructor implementation.
Time Seconds(double value)
Construct a Time in the indicated unit.
Ptr< Packet > Copy(void) const
performs a COW copy of the packet.
This class implements a tag that carries the socket-specific TTL of a packet to the IP layer.
std::map< Ptr< Socket >, Ipv4InterfaceAddress > m_socketSubnetBroadcastAddresses
Raw subnet directed broadcast socket per each IP interface, map socket -> iface address (IP + mask)
void SetHop(uint16_t hop)
Set the number of hops.
void SetMaxQueueLen(uint32_t len)
Set the maximum queue length.
Implement the IPv4 layer.
Time m_pathDiscoveryTime
Estimate of maximum time needed to find route in network.
bool InsertPrecursor(Ipv4Address id)
Insert precursor in precursor list if it doesn't yet exist in the list.
void SetInterface(int32_t oif)
Set the output interface.
static Ipv4Mask GetOnes(void)
void SetHelloEnable(bool f)
Set hello enable.
RouteFlags GetFlag() const
Get the route flags.
void SetIpRecvTtl(bool ipv4RecvTtl)
Tells a socket to pass information about IP_TTL up the stack.
static TypeId GetTypeId(void)
Get the type ID.
virtual void BindToNetDevice(Ptr< NetDevice > netdevice)
Bind a socket to specific device.
bool RemovePacketTag(Tag &tag)
Remove a packet tag.
AttributeValue implementation for Time.
Callback< void, WifiMacHeader const & > GetTxErrorCallback() const
Get callback to ProcessTxError.
#define NS_LOG_FUNCTION(parameters)
If log level LOG_FUNCTION is enabled, this macro will output all input parameters separated by ",...
Time m_nodeTraversalTime
NodeTraversalTime is a conservative estimate of the average one hop traversal time for packets and sh...
bool DeleteRoute(Ipv4Address dst)
Delete routing table entry with destination address dst, if it exists.
void SetArguments(Ts... args)
a class to represent an Ipv4 address mask
Ipv4Address GetLocal(void) const
Get the local address.
void SetStream(int64_t stream)
Specifies the stream number for the RngStream.
Time GetMaxQueueTime() const
Get maximum queue time.
void ProcessHello(RrepHeader const &rrepHeader, Ipv4Address receiverIfaceAddr)
Process hello message.
Hold an unsigned integer type.
static Ptr< Socket > CreateSocket(Ptr< Node > node, TypeId tid)
This method wraps the creation of sockets that is performed on a given node by a SocketFactory specif...
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
bool GetBroadcastEnable() const
Get broadcast enable flag.
void(* Time)(Time oldValue, Time newValue)
TracedValue callback signature for Time.
Timer m_rerrRateLimitTimer
RERR rate limit timer.
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print the Routing Table entries.
uint16_t m_rreqCount
Number of RREQs used for RREQ rate control.
DuplicatePacketDetection m_dpd
Handle duplicated broadcast/multicast packets.
double max(double x, double y)
void SetCallback(Callback< void, Ipv4Address > cb)
Set link failure callback.
bool m_gratuitousReply
Indicates whether a gratuitous RREP should be unicast to the node originated route discovery.
Time m_maxQueueTime
The maximum period of time that a routing protocol is allowed to buffer a packet for.
Ipv4Address GetDestination() const
Get destination address function.
Timer m_rreqRateLimitTimer
RREQ rate limit timer.
Ptr< const AttributeAccessor > MakeUintegerAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
void SetNextHop(Ipv4Address nextHop)
Set next hop address.
void SetLifeTime(Time lt)
Set the lifetime.
void Print(Ptr< OutputStreamWrapper > stream, Time::Unit unit=Time::S) const
Print routing table.
void IncrementRreqCnt()
Increment the RREQ count.
Ipv4Address GetBroadcast(void) const
Get the broadcast address.
void GetPrecursors(std::vector< Ipv4Address > &prec) const
Inserts precursors in output parameter prec if they do not yet exist in vector.
bool AddRoute(RoutingTableEntry &r)
Add routing table entry if it doesn't yet exist in routing table.
void SetFlag(RouteFlags flag)
Set the route flags.
virtual uint32_t GetIfIndex(void) const =0
virtual void DoDispose(void)
Destructor implementation.
void RecvReplyAck(Ipv4Address neighbor)
Receive RREP_ACK.
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
Time m_blackListTimeout
Time for which the node is put into the blacklist.
Ipv4InterfaceAddress GetInterface() const
Get the Ipv4InterfaceAddress.
bool LookupRoute(Ipv4Address dst, RoutingTableEntry &rt)
Lookup routing table entry with destination address dst.
bool RouteInput(Ptr< const Packet > p, const Ipv4Header &header, Ptr< const NetDevice > idev, UnicastForwardCallback ucb, MulticastForwardCallback mcb, LocalDeliverCallback lcb, ErrorCallback ecb)
Route an input packet (to be forwarded or locally delivered)
void AckTimerExpire(Ipv4Address neighbor, Time blacklistTimeout)
Mark link to neighbor node as unidirectional for blacklistTimeout.
Unit
The unit to use to interpret a number representing time.
void HelloTimerExpire()
Schedule next send of hello message.
Ptr< const AttributeAccessor > MakeTimeAccessor(T1 a1)
Create an AttributeAccessor for a class data member, or a lone class get functor or set method.
void SetOutputDevice(Ptr< NetDevice > dev)
Set output device.
uint32_t m_netDiameter
Net diameter measures the maximum possible number of hops between two nodes in the network.
uint64_t GetUid(void) const
Returns the packet's Uid.
void SetMaxQueueTime(Time t)
Set the maximum queue time.
uint32_t m_seqNo
Request sequence number.
static TypeId GetTypeId()
Get the type ID.
RoutingProtocol()
constructor