A Discrete-Event Network Simulator
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2004 Francisco J. Ros
4  * Copyright (c) 2007 INESC Porto
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation;
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  * Authors: Francisco J. Ros <fjrm@dif.um.es>
20  * Gustavo J. A. M. Carneiro <gjc@inescporto.pt>
21  */
23 #ifndef OLSR_AGENT_IMPL_H
24 #define OLSR_AGENT_IMPL_H
26 #include "olsr-header.h"
27 #include "ns3/test.h"
28 #include "olsr-state.h"
29 #include "olsr-repositories.h"
31 #include "ns3/object.h"
32 #include "ns3/packet.h"
33 #include "ns3/node.h"
34 #include "ns3/socket.h"
35 #include "ns3/event-garbage-collector.h"
36 #include "ns3/random-variable-stream.h"
37 #include "ns3/timer.h"
38 #include "ns3/traced-callback.h"
39 #include "ns3/ipv4.h"
40 #include "ns3/ipv4-routing-protocol.h"
41 #include "ns3/ipv4-static-routing.h"
43 #include <vector>
44 #include <map>
47 class OlsrMprTestCase;
49 namespace ns3 {
50 namespace olsr {
60 {
63  uint32_t interface;
64  uint32_t distance;
66  RoutingTableEntry () : // default values
67  destAddr (), nextAddr (),
68  interface (0), distance (0)
69  {
70  }
71 };
73 class RoutingProtocol;
81 {
82 public:
83  friend class ::OlsrMprTestCase;
89  static TypeId GetTypeId (void);
91  RoutingProtocol ();
92  virtual ~RoutingProtocol ();
99  void SetMainInterface (uint32_t interface);
106  void Dump (void);
111  std::vector<RoutingTableEntry> GetRoutingTableEntries () const;
121  int64_t AssignStreams (int64_t stream);
129  typedef void (* PacketTxRxTracedCallback)(const PacketHeader & header, const MessageList & messages);
136  typedef void (* TableChangeTracedCallback) (uint32_t size);
138 private:
139  std::set<uint32_t> m_interfaceExclusions;
142 public:
147  std::set<uint32_t> GetInterfaceExclusions () const
148  {
149  return m_interfaceExclusions;
150  }
156  void SetInterfaceExclusions (std::set<uint32_t> exceptions);
166  void AddHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask netmask);
176  void RemoveHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask netmask);
196 protected:
197  virtual void DoInitialize (void);
198 private:
199  std::map<Ipv4Address, RoutingTableEntry> m_table;
207  uint16_t m_ansn;
213  uint8_t m_willingness;
221  void Clear ();
227  uint32_t GetSize () const
228  {
229  return m_table.size ();
230  }
236  void RemoveEntry (const Ipv4Address &dest);
247  void AddEntry (const Ipv4Address &dest,
248  const Ipv4Address &next,
249  uint32_t interface,
250  uint32_t distance);
261  void AddEntry (const Ipv4Address &dest,
262  const Ipv4Address &next,
263  const Ipv4Address &interfaceAddress,
264  uint32_t distance);
272  bool Lookup (const Ipv4Address &dest,
273  RoutingTableEntry &outEntry) const;
293  bool FindSendEntry (const RoutingTableEntry &entry,
294  RoutingTableEntry &outEntry) const;
296  // From Ipv4RoutingProtocol
298  const Ipv4Header &header,
299  Ptr<NetDevice> oif,
300  Socket::SocketErrno &sockerr);
301  virtual bool RouteInput (Ptr<const Packet> p,
302  const Ipv4Header &header,
307  ErrorCallback ecb);
308  virtual void NotifyInterfaceUp (uint32_t interface);
309  virtual void NotifyInterfaceDown (uint32_t interface);
310  virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address);
311  virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address);
312  virtual void SetIpv4 (Ptr<Ipv4> ipv4);
313  virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;
315  void DoDispose ();
322  void SendPacket (Ptr<Packet> packet, const MessageList &containedMessages);
328  inline uint16_t GetPacketSequenceNumber ();
334  inline uint16_t GetMessageSequenceNumber ();
340  void RecvOlsr (Ptr<Socket> socket);
345  void MprComputation ();
350  void RoutingTableComputation ();
357  Ipv4Address GetMainAddress (Ipv4Address iface_addr) const;
366  // Timer handlers
371  void HelloTimerExpire ();
377  void TcTimerExpire ();
383  void MidTimerExpire ();
389  void HnaTimerExpire ();
399  void DupTupleTimerExpire (Ipv4Address address, uint16_t sequenceNumber);
413  void LinkTupleTimerExpire (Ipv4Address neighborIfaceAddr);
423  void Nb2hopTupleTimerExpire (Ipv4Address neighborMainAddr, Ipv4Address twoHopNeighborAddr);
432  void MprSelTupleTimerExpire (Ipv4Address mainAddr);
442  void TopologyTupleTimerExpire (Ipv4Address destAddr, Ipv4Address lastAddr);
449  void IfaceAssocTupleTimerExpire (Ipv4Address ifaceAddr);
458  void AssociationTupleTimerExpire (Ipv4Address gatewayAddr, Ipv4Address networkAddr, Ipv4Mask netmask);
463  void IncrementAnsn ();
479  void ForwardDefault (olsr::MessageHeader olsrMessage,
480  DuplicateTuple *duplicated,
481  const Ipv4Address &localIface,
482  const Ipv4Address &senderAddress);
493  void QueueMessage (const olsr::MessageHeader &message, Time delay);
502  void SendQueuedMessages ();
507  void SendHello ();
512  void SendTc ();
517  void SendMid ();
522  void SendHna ();
531  void NeighborLoss (const LinkTuple &tuple);
538  void AddDuplicateTuple (const DuplicateTuple &tuple);
545  void RemoveDuplicateTuple (const DuplicateTuple &tuple);
552  void LinkTupleAdded (const LinkTuple &tuple, uint8_t willingness);
559  void RemoveLinkTuple (const LinkTuple &tuple);
568  void LinkTupleUpdated (const LinkTuple &tuple, uint8_t willingness);
575  void AddNeighborTuple (const NeighborTuple &tuple);
582  void RemoveNeighborTuple (const NeighborTuple &tuple);
589  void AddTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple);
604  void AddMprSelectorTuple (const MprSelectorTuple &tuple);
612  void RemoveMprSelectorTuple (const MprSelectorTuple &tuple);
619  void AddTopologyTuple (const TopologyTuple &tuple);
626  void RemoveTopologyTuple (const TopologyTuple &tuple);
633  void AddIfaceAssocTuple (const IfaceAssocTuple &tuple);
640  void RemoveIfaceAssocTuple (const IfaceAssocTuple &tuple);
647  void AddAssociationTuple (const AssociationTuple &tuple);
654  void RemoveAssociationTuple (const AssociationTuple &tuple);
666  void ProcessHello (const olsr::MessageHeader &msg,
667  const Ipv4Address &receiverIface,
668  const Ipv4Address &senderIface);
680  void ProcessTc (const olsr::MessageHeader &msg,
681  const Ipv4Address &senderIface);
692  void ProcessMid (const olsr::MessageHeader &msg,
693  const Ipv4Address &senderIface);
706  void ProcessHna (const olsr::MessageHeader &msg,
707  const Ipv4Address &senderIface);
717  void LinkSensing (const olsr::MessageHeader &msg,
718  const olsr::MessageHeader::Hello &hello,
719  const Ipv4Address &receiverIface,
720  const Ipv4Address &senderIface);
728  void PopulateNeighborSet (const olsr::MessageHeader &msg,
729  const olsr::MessageHeader::Hello &hello);
738  const olsr::MessageHeader::Hello &hello);
747  const olsr::MessageHeader::Hello &hello);
749  int Degree (NeighborTuple const &tuple);
751  bool IsMyOwnAddress (const Ipv4Address & a) const;
755  // One socket per interface, each bound to that interface's address
756  // (reason: for OLSR Link Sensing we need to know on which interface
757  // HELLO messages arrive)
758  std::map< Ptr<Socket>, Ipv4InterfaceAddress > m_socketAddresses;
772 };
774 }
775 } // namespace ns3
777 #endif /* OLSR_AGENT_IMPL_H */
An MPR-Selector Tuple.
std::set< uint32_t > m_interfaceExclusions
Set of interfaces excluded by OSLR.
An OLSR's routing table entry.
uint32_t distance
Distance in hops to the destination.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:102
void HelloTimerExpire()
Sends a HELLO message and reschedules the HELLO timer.
std::set< uint32_t > GetInterfaceExclusions() const
Get the excluded interfaces.
void AddTopologyTuple(const TopologyTuple &tuple)
Adds a topology tuple to the Topology Set.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:73
void DoDispose()
Destructor implementation.
Enumeration of the possible errors returned by a socket.
Definition: socket.h:82
void IfaceAssocTupleTimerExpire(Ipv4Address ifaceAddr)
Removes interface association tuple_ if expired.
void RemoveMprSelectorTuple(const MprSelectorTuple &tuple)
Removes an MPR selector tuple from the MPR Selector Set.
Timer m_helloTimer
Timer for the HELLO message.
uint16_t GetPacketSequenceNumber()
Increments packet sequence number and returns the new value.
Time m_midInterval
MID messages' emission interval.
A simple Timer class.
Definition: timer.h:73
This header can store HELP, TC, MID and HNA messages.
Definition: olsr-header.h:157
void Clear()
Clears the routing table and frees the memory assigned to each one of its entries.
uint16_t m_messageSequenceNumber
Messages sequence number counter.
Ipv4Address destAddr
Address of the destination node.
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:257
void HnaTimerExpire()
Sends an HNA message (if the node has associated hosts/networks) and reschedules the HNA timer...
void LinkTupleUpdated(const LinkTuple &tuple, uint8_t willingness)
This function is invoked when a link tuple is updated.
Forward calls to a chain of Callback.
uint16_t m_ansn
Advertised Neighbor Set sequence number.
void AddEntry(const Ipv4Address &dest, const Ipv4Address &next, uint32_t interface, uint32_t distance)
Adds a new entry into the routing table.
bool m_linkTupleTimerFirstTime
Flag to indicate if it is the first time the LinkTupleTimer fires.
virtual void NotifyInterfaceUp(uint32_t interface)
void SendTc()
Creates a new OLSR TC message which is buffered for being sent later on.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
void(* TableChangeTracedCallback)(uint32_t size)
TracedCallback signature for routing table computation.
void DupTupleTimerExpire(Ipv4Address address, uint16_t sequenceNumber)
Removes tuple if expired.
Timer m_queuedMessagesTimer
timer for throttling outgoing messages
void AddHostNetworkAssociation(Ipv4Address networkAddr, Ipv4Mask netmask)
Injects the specified (networkAddr, netmask) tuple in the list of local HNA associations to be sent b...
Ipv4Address m_mainAddress
the node main address.
void LinkTupleTimerExpire(Ipv4Address neighborIfaceAddr)
Removes tuple_ if expired.
void SetMainInterface(uint32_t interface)
Set the OLSR main address to the first address on the indicated interface.
void Nb2hopTupleTimerExpire(Ipv4Address neighborMainAddr, Ipv4Address twoHopNeighborAddr)
Removes 2_hop neighbor tuple_ if expired.
void RemoveAssociationTuple(const AssociationTuple &tuple)
Removes a host network association tuple to the Association Set.
void ProcessTc(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a TC message following RFC 3626 specification.
void LinkSensing(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello, const Ipv4Address &receiverIface, const Ipv4Address &senderIface)
Updates Link Set according to a new received HELLO message (following RFC 3626 specification).
void MprSelTupleTimerExpire(Ipv4Address mainAddr)
Removes MPR selector tuple_ if expired.
Callback< void, Ptr< const Packet >, const Ipv4Header &, Socket::SocketErrno > ErrorCallback
Callback for routing errors (e.g., no route found)
std::map< Ipv4Address, RoutingTableEntry > m_table
Data structure for the routing table.
TracedCallback< const PacketHeader &, const MessageList & > m_rxPacketTrace
Rx packet trace.
void RemoveIfaceAssocTuple(const IfaceAssocTuple &tuple)
Removed an interface association tuple to the Interface Association Set.
Packet header for IPv4.
Definition: ipv4-header.h:33
EventGarbageCollector m_events
Running events.
An object that tracks scheduled events and automatically cancels them when it is destroyed.
A record of an IPv4 routing table entry for Ipv4GlobalRouting and Ipv4StaticRouting.
uint8_t m_willingness
Willingness for forwarding packets on behalf of other nodes.
void PopulateNeighborSet(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello)
Updates the Neighbor Set according to the information contained in a new received HELLO message (foll...
void RemoveHostNetworkAssociation(Ipv4Address networkAddr, Ipv4Mask netmask)
Removes the specified (networkAddr, netmask) tuple from the list of local HNA associations to be sent...
void AddIfaceAssocTuple(const IfaceAssocTuple &tuple)
Adds an interface association tuple to the Interface Association Set.
void QueueMessage(const olsr::MessageHeader &message, Time delay)
Enques an OLSR message which will be sent with a delay of (0, delay].
void SendPacket(Ptr< Packet > packet, const MessageList &containedMessages)
Send an OLSR message.
OLSR routing protocol for IPv4.
An Association Tuple.
void ProcessHello(const olsr::MessageHeader &msg, const Ipv4Address &receiverIface, const Ipv4Address &senderIface)
Processes a HELLO message following RFC 3626 specification.
void AddAssociationTuple(const AssociationTuple &tuple)
Adds a host network association tuple to the Association Set.
Ptr< Ipv4StaticRouting > m_hnaRoutingTable
Routing table for HNA routes.
virtual 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)
Timer m_tcTimer
Timer for the TC message.
void MprComputation()
Computates MPR set of a node following RFC 3626 hints.
void RemoveDuplicateTuple(const DuplicateTuple &tuple)
Removes a duplicate tuple from the Duplicate Set.
uint32_t GetSize() const
Returns the routing table size.
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
Time m_helloInterval
HELLO messages' emission interval.
void SetRoutingTableAssociation(Ptr< Ipv4StaticRouting > routingTable)
Associates the specified Ipv4StaticRouting routing table to the OLSR routing protocol.
std::map< Ptr< Socket >, Ipv4InterfaceAddress > m_socketAddresses
Container of sockets and the interfaces they are opened onto.
void TopologyTupleTimerExpire(Ipv4Address destAddr, Ipv4Address lastAddr)
Removes topology tuple_ if expired.
Time m_tcInterval
TC messages' emission interval.
void AddTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
Adds a 2-hop neighbor tuple to the 2-hop Neighbor Set.
void AssociationTupleTimerExpire(Ipv4Address gatewayAddr, Ipv4Address networkAddr, Ipv4Mask netmask)
Removes association tuple_ if expired.
virtual void PrintRoutingTable(Ptr< OutputStreamWrapper > stream) const
Print the Routing Table entries.
void NeighborLoss(const LinkTuple &tuple)
Performs all actions needed when a neighbor loss occurs.
void RemoveTopologyTuple(const TopologyTuple &tuple)
Removes a topology tuple to the Topology Set.
void SendMid()
Creates a new OLSR MID message which is buffered for being sent later on.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
void RecvOlsr(Ptr< Socket > socket)
Receive an OLSR message.
static TypeId GetTypeId(void)
Get the type ID.
This class encapsulates all data structures needed for maintaining internal state of an OLSR node...
Definition: olsr-state.h:35
void MidTimerExpire()
Sends a MID message (if the node has more than one interface) and resets the MID timer.
Ptr< Ipv4StaticRouting > m_routingTableAssociation
Associations from an Ipv4StaticRouting instance.
Ptr< const Ipv4StaticRouting > GetRoutingTableAssociation() const
Returns the internal HNA table.
void AddNeighborTuple(const NeighborTuple &tuple)
Adds a neighbor tuple to the Neighbor Set.
void SendHello()
Creates a new OLSR HELLO message which is buffered for being sent later on.
void RemoveLinkTuple(const LinkTuple &tuple)
Removes a link tuple from the Link Set.
bool UsesNonOlsrOutgoingInterface(const Ipv4RoutingTableEntry &route)
Tests whether or not the specified route uses a non-OLSR outgoing interface.
bool Lookup(const Ipv4Address &dest, RoutingTableEntry &outEntry) const
Looks up an entry for the specified destination address.
std::vector< MessageHeader > MessageList
Definition: olsr-header.h:695
Definition: olsr.py:1
virtual void NotifyInterfaceDown(uint32_t interface)
The basic layout of any packet in OLSR is as follows (omitting IP and UDP headers): ...
Definition: olsr-header.h:75
uint16_t m_packetSequenceNumber
Packets sequence number counter.
void PopulateTwoHopNeighborSet(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello)
Updates the 2-hop Neighbor Set according to the information contained in a new received HELLO message...
Ipv4Address GetMainAddress(Ipv4Address iface_addr) const
Gets the main address associated with a given interface address.
void RoutingTableComputation()
Creates the routing table of the node following RFC 3626 hints.
void RemoveTwoHopNeighborTuple(const TwoHopNeighborTuple &tuple)
Removes a 2-hop neighbor tuple from the 2-hop Neighbor Set.
void RemoveEntry(const Ipv4Address &dest)
Deletes the entry whose destination address is given.
void ForwardDefault(olsr::MessageHeader olsrMessage, DuplicateTuple *duplicated, const Ipv4Address &localIface, const Ipv4Address &senderAddress)
OLSR's default forwarding algorithm.
Callback< void, Ptr< const Packet >, const Ipv4Header &, uint32_t > LocalDeliverCallback
Callback for packets to be locally delivered.
void ProcessHna(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a HNA message following RFC 3626 specification.
virtual 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.
int Degree(NeighborTuple const &tuple)
This auxiliary function (defined in RFC 3626) is used for calculating the MPR Set.
uint32_t interface
Interface index.
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:40
void(* PacketTxRxTracedCallback)(const PacketHeader &header, const MessageList &messages)
TracedCallback signature for Packet transmit and receive events.
bool IsMyOwnAddress(const Ipv4Address &a) const
Check that address is one of my interfaces.
void IncrementAnsn()
Increments the ANSN counter.
Ptr< Ipv4 > m_ipv4
IPv4 object the routing is linked to.
HELLO Message Format.
Definition: olsr-header.h:376
a class to store IPv4 address information on an interface
virtual void SetIpv4(Ptr< Ipv4 > ipv4)
void PopulateMprSelectorSet(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello)
Updates the MPR Selector Set according to the information contained in a new received HELLO message (...
void SendQueuedMessages()
Creates as many OLSR packets as needed in order to send all buffered OLSR messages.
Ipv4Address nextAddr
Address of the next hop.
TracedCallback< const PacketHeader &, const MessageList & > m_txPacketTrace
Tx packet trace.
Timer m_midTimer
Timer for the MID message.
void SendHna()
Creates a new OLSR HNA message which is buffered for being sent later on.
Abstract base class for IPv4 routing protocols.
void LinkTupleAdded(const LinkTuple &tuple, uint8_t willingness)
Adds a link tuple.
void SetInterfaceExclusions(std::set< uint32_t > exceptions)
Set the interfaces to be excluded.
Time m_hnaInterval
HNA messages' emission interval.
void Dump(void)
Dump the neighbor table, two-hop neighbor table, and routing table to logging output (NS_LOG_DEBUG lo...
Timer m_hnaTimer
Timer for the HNA message.
virtual void DoInitialize(void)
Initialize() implementation.
std::vector< RoutingTableEntry > GetRoutingTableEntries() const
Return the list of routing table entries discovered by OLSR.
tuple address
Definition: first.py:37
void AddDuplicateTuple(const DuplicateTuple &tuple)
Adds a duplicate tuple to the Duplicate Set.
void TcTimerExpire()
Sends a TC message (if there exists any MPR selector) and reschedules the TC timer.
void RemoveNeighborTuple(const NeighborTuple &tuple)
Removes a neighbor tuple from the Neighbor Set.
uint16_t GetMessageSequenceNumber()
Increments message sequence number and returns the new value.
OlsrState m_state
Internal state with all needed data structs.
Callback< void, Ptr< Ipv4MulticastRoute >, Ptr< const Packet >, const Ipv4Header & > MulticastForwardCallback
Callback for multicast packets to be forwarded.
void AddMprSelectorTuple(const MprSelectorTuple &tuple)
Adds an MPR selector tuple to the MPR Selector Set.
TracedCallback< uint32_t > m_routingTableChanged
Routing table chanes challback.
a unique identifier for an interface.
Definition: type-id.h:58
An Interface Association Tuple.
virtual void NotifyRemoveAddress(uint32_t interface, Ipv4InterfaceAddress address)
olsr::MessageList m_queuedMessages
A list of pending messages which are buffered awaiting for being sent.
Ptr< UniformRandomVariable > m_uniformRandomVariable
Provides uniform random variables.
bool FindSendEntry(const RoutingTableEntry &entry, RoutingTableEntry &outEntry) const
Finds the appropriate entry which must be used in order to forward a data packet to a next hop (given...
Callback< void, Ptr< Ipv4Route >, Ptr< const Packet >, const Ipv4Header & > UnicastForwardCallback
Callback for unicast packets to be forwarded.
Testcase for MPR computation mechanism.
void ProcessMid(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a MID message following RFC 3626 specification.