A Discrete-Event Network Simulator
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
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 namespace ns3 {
48 namespace olsr {
57 {
60  uint32_t interface;
61  uint32_t distance;
63  RoutingTableEntry () : // default values
64  destAddr (), nextAddr (),
65  interface (0), distance (0) {};
66 };
68 class RoutingProtocol;
71 class OlsrMprTestCase;
79 {
80 public:
81  friend class OlsrMprTestCase;
82  static TypeId GetTypeId (void);
84  RoutingProtocol ();
85  virtual ~RoutingProtocol ();
92  void SetMainInterface (uint32_t interface);
99  void Dump (void);
104  std::vector<RoutingTableEntry> GetRoutingTableEntries () const;
114  int64_t AssignStreams (int64_t stream);
116 private:
117  std::set<uint32_t> m_interfaceExclusions;
118  Ptr<Ipv4StaticRouting> m_routingTableAssociation;
120 public:
121  std::set<uint32_t> GetInterfaceExclusions () const
122  {
123  return m_interfaceExclusions;
124  }
125  void SetInterfaceExclusions (std::set<uint32_t> exceptions);
128  void AddHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask netmask);
130  void RemoveHostNetworkAssociation (Ipv4Address networkAddr, Ipv4Mask netmask);
135 protected:
136  virtual void DoInitialize (void);
137 private:
138  std::map<Ipv4Address, RoutingTableEntry> m_table;
140  Ptr<Ipv4StaticRouting> m_hnaRoutingTable;
142  EventGarbageCollector m_events;
149  uint16_t m_ansn;
160  uint8_t m_willingness;
165  Ptr<Ipv4> m_ipv4;
167  void Clear ();
168  uint32_t GetSize () const { return m_table.size (); }
169  void RemoveEntry (const Ipv4Address &dest);
170  void AddEntry (const Ipv4Address &dest,
171  const Ipv4Address &next,
172  uint32_t interface,
173  uint32_t distance);
174  void AddEntry (const Ipv4Address &dest,
175  const Ipv4Address &next,
176  const Ipv4Address &interfaceAddress,
177  uint32_t distance);
178  bool Lookup (const Ipv4Address &dest,
179  RoutingTableEntry &outEntry) const;
180  bool FindSendEntry (const RoutingTableEntry &entry,
181  RoutingTableEntry &outEntry) const;
183  // From Ipv4RoutingProtocol
185  const Ipv4Header &header,
186  Ptr<NetDevice> oif,
187  Socket::SocketErrno &sockerr);
188  virtual bool RouteInput (Ptr<const Packet> p,
189  const Ipv4Header &header,
191  UnicastForwardCallback ucb,
192  MulticastForwardCallback mcb,
193  LocalDeliverCallback lcb,
194  ErrorCallback ecb);
195  virtual void NotifyInterfaceUp (uint32_t interface);
196  virtual void NotifyInterfaceDown (uint32_t interface);
197  virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address);
198  virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address);
199  virtual void SetIpv4 (Ptr<Ipv4> ipv4);
200  virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream) const;
202  void DoDispose ();
204  void SendPacket (Ptr<Packet> packet, const MessageList &containedMessages);
207  inline uint16_t GetPacketSequenceNumber ();
209  inline uint16_t GetMessageSequenceNumber ();
211  void RecvOlsr (Ptr<Socket> socket);
213  void MprComputation ();
214  void RoutingTableComputation ();
215  Ipv4Address GetMainAddress (Ipv4Address iface_addr) const;
218  // Timer handlers
219  Timer m_helloTimer;
220  void HelloTimerExpire ();
222  Timer m_tcTimer;
223  void TcTimerExpire ();
225  Timer m_midTimer;
226  void MidTimerExpire ();
228  Timer m_hnaTimer;
229  void HnaTimerExpire ();
231  void DupTupleTimerExpire (Ipv4Address address, uint16_t sequenceNumber);
232  bool m_linkTupleTimerFirstTime;
233  void LinkTupleTimerExpire (Ipv4Address neighborIfaceAddr);
234  void Nb2hopTupleTimerExpire (Ipv4Address neighborMainAddr, Ipv4Address twoHopNeighborAddr);
235  void MprSelTupleTimerExpire (Ipv4Address mainAddr);
236  void TopologyTupleTimerExpire (Ipv4Address destAddr, Ipv4Address lastAddr);
237  void IfaceAssocTupleTimerExpire (Ipv4Address ifaceAddr);
238  void AssociationTupleTimerExpire (Ipv4Address gatewayAddr, Ipv4Address networkAddr, Ipv4Mask netmask);
240  void IncrementAnsn ();
243  olsr::MessageList m_queuedMessages;
244  Timer m_queuedMessagesTimer; // timer for throttling outgoing messages
246  void ForwardDefault (olsr::MessageHeader olsrMessage,
247  DuplicateTuple *duplicated,
248  const Ipv4Address &localIface,
249  const Ipv4Address &senderAddress);
250  void QueueMessage (const olsr::MessageHeader &message, Time delay);
251  void SendQueuedMessages ();
252  void SendHello ();
253  void SendTc ();
254  void SendMid ();
255  void SendHna ();
257  void NeighborLoss (const LinkTuple &tuple);
258  void AddDuplicateTuple (const DuplicateTuple &tuple);
259  void RemoveDuplicateTuple (const DuplicateTuple &tuple);
260  void LinkTupleAdded (const LinkTuple &tuple, uint8_t willingness);
261  void RemoveLinkTuple (const LinkTuple &tuple);
262  void LinkTupleUpdated (const LinkTuple &tuple, uint8_t willingness);
263  void AddNeighborTuple (const NeighborTuple &tuple);
264  void RemoveNeighborTuple (const NeighborTuple &tuple);
265  void AddTwoHopNeighborTuple (const TwoHopNeighborTuple &tuple);
267  void AddMprSelectorTuple (const MprSelectorTuple &tuple);
268  void RemoveMprSelectorTuple (const MprSelectorTuple &tuple);
269  void AddTopologyTuple (const TopologyTuple &tuple);
270  void RemoveTopologyTuple (const TopologyTuple &tuple);
271  void AddIfaceAssocTuple (const IfaceAssocTuple &tuple);
272  void RemoveIfaceAssocTuple (const IfaceAssocTuple &tuple);
273  void AddAssociationTuple (const AssociationTuple &tuple);
274  void RemoveAssociationTuple (const AssociationTuple &tuple);
276  void ProcessHello (const olsr::MessageHeader &msg,
277  const Ipv4Address &receiverIface,
278  const Ipv4Address &senderIface);
279  void ProcessTc (const olsr::MessageHeader &msg,
280  const Ipv4Address &senderIface);
281  void ProcessMid (const olsr::MessageHeader &msg,
282  const Ipv4Address &senderIface);
283  void ProcessHna (const olsr::MessageHeader &msg,
284  const Ipv4Address &senderIface);
286  void LinkSensing (const olsr::MessageHeader &msg,
287  const olsr::MessageHeader::Hello &hello,
288  const Ipv4Address &receiverIface,
289  const Ipv4Address &sender_iface);
290  void PopulateNeighborSet (const olsr::MessageHeader &msg,
291  const olsr::MessageHeader::Hello &hello);
293  const olsr::MessageHeader::Hello &hello);
295  const olsr::MessageHeader::Hello &hello);
297  int Degree (NeighborTuple const &tuple);
299  bool IsMyOwnAddress (const Ipv4Address & a) const;
301  Ipv4Address m_mainAddress;
303  // One socket per interface, each bound to that interface's address
304  // (reason: for OLSR Link Sensing we need to know on which interface
305  // HELLO messages arrive)
306  std::map< Ptr<Socket>, Ipv4InterfaceAddress > m_socketAddresses;
308  TracedCallback <const PacketHeader &,
309  const MessageList &> m_rxPacketTrace;
310  TracedCallback <const PacketHeader &,
311  const MessageList &> m_txPacketTrace;
312  TracedCallback <uint32_t> m_routingTableChanged;
317 };
319 }
320 } // namespace ns3
322 #endif /* OLSR_AGENT_IMPL_H */
An MPR-Selector Tuple.
This class encapsulates all data structures needed for maintaining internal state of an OLSR node...
Definition: olsr-state.h:35
An OLSR's routing table entry.
uint32_t distance
Distance in hops to the destination.
keep track of time unit.
Definition: nstime.h:149
void HelloTimerExpire()
Sends a HELLO message and reschedules the HELLO timer.
void AddTopologyTuple(const TopologyTuple &tuple)
Adds a topology tuple to the Topology Set.
smart pointer class similar to boost::intrusive_ptr
Definition: ptr.h:59
void IfaceAssocTupleTimerExpire(Ipv4Address ifaceAddr)
Removes tuple_ if expired. Else timer is rescheduled to expire at tuple_->time(). ...
void RemoveMprSelectorTuple(const MprSelectorTuple &tuple)
Removes an MPR selector tuple from the MPR Selector Set.
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:45
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:210
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. Its aim is to also update the corresponding ne...
void LinkSensing(const olsr::MessageHeader &msg, const olsr::MessageHeader::Hello &hello, const Ipv4Address &receiverIface, const Ipv4Address &sender_iface)
Updates Link Set according to a new received HELLO message (following RFC 3626 specification). Neighbor Set is also updated if needed.
forward calls to a chain of CallbackAn ns3::TracedCallback has almost exactly the same API as a norma...
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.
virtual void NotifyInterfaceUp(uint32_t interface)
Testcase for MPR computation mechanism.
void SendTc()
Creates a new OLSR TC message which is buffered for being sent later on.
int64_t AssignStreams(int64_t stream)
void DupTupleTimerExpire(Ipv4Address address, uint16_t sequenceNumber)
Removes tuple if expired. Else timer is rescheduled to expire at tuple.expirationTime.
void AddHostNetworkAssociation(Ipv4Address networkAddr, Ipv4Mask netmask)
Inject Association to be sent in HNA message.
void LinkTupleTimerExpire(Ipv4Address neighborIfaceAddr)
Removes tuple_ if expired. Else if symmetric time has expired then it is assumed a neighbor loss and ...
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 tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
void RemoveAssociationTuple(const AssociationTuple &tuple)
Removes a host network association tuple from the Association Set.
void ProcessTc(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a TC message following RFC 3626 specification.
void MprSelTupleTimerExpire(Ipv4Address mainAddr)
Removes tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
std::map< Ipv4Address, RoutingTableEntry > m_table
Data structure for the routing table.
void RemoveIfaceAssocTuple(const IfaceAssocTuple &tuple)
Removes an interface association tuple from the Interface Association Set.
Packet header for IPv4.
Definition: ipv4-header.h:31
An object that tracks scheduled events and automatically cancels them when it is destroyed. It is useful in situations where multiple instances of the same type of event can simultaneously be scheduled, and when the events should be limited to the lifetime of a container object.
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 Association sent in HNA message.
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].
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.
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)
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.
virtual void NotifyAddAddress(uint32_t interface, Ipv4InterfaceAddress address)
Time m_helloInterval
HELLO messages' emission interval.
void SetRoutingTableAssociation(Ptr< Ipv4StaticRouting > routingTable)
Inject Associations from an Ipv4StaticRouting instance.
void TopologyTupleTimerExpire(Ipv4Address destAddr, Ipv4Address lastAddr)
Removes tuple_ if expired. Else the timer is rescheduled to expire at tuple_->time().
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 tuple_ if expired. Else timer is rescheduled to expire at tuple_->time(). ...
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 from the Topology Set.
void SendMid()
Creates a new OLSR MID message which is buffered for being sent later on.
void MidTimerExpire()
Sends a MID message (if the node has more than one interface) and resets the MID timer.
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. Returns true if the outg...
bool Lookup(const Ipv4Address &dest, RoutingTableEntry &outEntry) const
Looks up an entry for the specified destination address.
virtual void NotifyInterfaceDown(uint32_t interface)
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.
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:38
bool IsMyOwnAddress(const Ipv4Address &a) const
Check that address is one of my interfaces.
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.
void SendHna()
Creates a new OLSR HNA message which is buffered for being sent later on.
Abstract base class for IPv4 routing protocols.
Time m_hnaInterval
HNA messages' emission interval.
std::vector< RoutingTableEntry > GetRoutingTableEntries() const
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.
void AddMprSelectorTuple(const MprSelectorTuple &tuple)
Adds an MPR selector tuple to the MPR Selector Set.
a unique identifier for an interface.
Definition: type-id.h:44
An Interface Association Tuple.
The type "list of interface addresses".
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 appropiate entry which must be used in order to forward a data packet to a next hop (given ...
void ProcessMid(const olsr::MessageHeader &msg, const Ipv4Address &senderIface)
Processes a MID message following RFC 3626 specification.