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) 2006 Georgia Tech Research Corporation
4 //
5 // This program is free software; you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License version 2 as
7 // published by the Free Software Foundation;
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with this program; if not, write to the Free Software
16 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 //
18 // Author: George F. Riley<riley@ece.gatech.edu>
19 //
21 #ifndef IPV4_L3_PROTOCOL_H
22 #define IPV4_L3_PROTOCOL_H
24 #include <list>
25 #include <map>
26 #include <vector>
27 #include <stdint.h>
28 #include "ns3/ipv4-address.h"
29 #include "ns3/ptr.h"
30 #include "ns3/net-device.h"
31 #include "ns3/ipv4.h"
32 #include "ns3/traced-callback.h"
33 #include "ns3/ipv4-header.h"
34 #include "ns3/ipv4-routing-protocol.h"
35 #include "ns3/nstime.h"
36 #include "ns3/simulator.h"
40 namespace ns3 {
42 class Packet;
43 class NetDevice;
44 class Ipv4Interface;
45 class Ipv4Address;
46 class Ipv4Header;
47 class Ipv4RoutingTableEntry;
48 class Ipv4Route;
49 class Node;
50 class Socket;
51 class Ipv4RawSocketImpl;
52 class IpL4Protocol;
53 class Icmpv4L4Protocol;
80 class Ipv4L3Protocol : public Ipv4
81 {
82 public:
87  static TypeId GetTypeId (void);
88  static const uint16_t PROT_NUMBER;
91  virtual ~Ipv4L3Protocol ();
97  enum DropReason
98  {
106  };
112  void SetNode (Ptr<Node> node);
114  // functions defined in base class Ipv4
116  void SetRoutingProtocol (Ptr<Ipv4RoutingProtocol> routingProtocol);
120  void DeleteRawSocket (Ptr<Socket> socket);
122  virtual void Insert (Ptr<IpL4Protocol> protocol);
123  virtual void Insert (Ptr<IpL4Protocol> protocol, uint32_t interfaceIndex);
125  virtual void Remove (Ptr<IpL4Protocol> protocol);
126  virtual void Remove (Ptr<IpL4Protocol> protocol, uint32_t interfaceIndex);
128  virtual Ptr<IpL4Protocol> GetProtocol (int protocolNumber) const;
129  virtual Ptr<IpL4Protocol> GetProtocol (int protocolNumber, int32_t interfaceIndex) const;
131  virtual Ipv4Address SourceAddressSelection (uint32_t interface, Ipv4Address dest);
139  void SetDefaultTtl (uint8_t ttl);
154  void Receive ( Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol, const Address &from,
155  const Address &to, NetDevice::PacketType packetType);
167  void Send (Ptr<Packet> packet, Ipv4Address source,
168  Ipv4Address destination, uint8_t protocol, Ptr<Ipv4Route> route);
177  void SendWithHeader (Ptr<Packet> packet, Ipv4Header ipHeader, Ptr<Ipv4Route> route);
179  uint32_t AddInterface (Ptr<NetDevice> device);
185  Ptr<Ipv4Interface> GetInterface (uint32_t i) const;
186  uint32_t GetNInterfaces (void) const;
188  int32_t GetInterfaceForAddress (Ipv4Address addr) const;
189  int32_t GetInterfaceForPrefix (Ipv4Address addr, Ipv4Mask mask) const;
190  int32_t GetInterfaceForDevice (Ptr<const NetDevice> device) const;
191  bool IsDestinationAddress (Ipv4Address address, uint32_t iif) const;
193  bool AddAddress (uint32_t i, Ipv4InterfaceAddress address);
194  Ipv4InterfaceAddress GetAddress (uint32_t interfaceIndex, uint32_t addressIndex) const;
195  uint32_t GetNAddresses (uint32_t interface) const;
196  bool RemoveAddress (uint32_t interfaceIndex, uint32_t addressIndex);
197  bool RemoveAddress (uint32_t interface, Ipv4Address address);
202  void SetMetric (uint32_t i, uint16_t metric);
203  uint16_t GetMetric (uint32_t i) const;
204  uint16_t GetMtu (uint32_t i) const;
205  bool IsUp (uint32_t i) const;
206  void SetUp (uint32_t i);
207  void SetDown (uint32_t i);
208  bool IsForwarding (uint32_t i) const;
209  void SetForwarding (uint32_t i, bool val);
211  Ptr<NetDevice> GetNetDevice (uint32_t i);
223  bool IsUnicast (Ipv4Address ad) const;
232  typedef void (* SentTracedCallback)
233  (const Ipv4Header & header, Ptr<const Packet> packet, uint32_t interface);
245  typedef void (* TxRxTracedCallback)
246  (Ptr<const Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
259  typedef void (* DropTracedCallback)
260  (const Ipv4Header & header, Ptr<const Packet> packet,
261  DropReason reason, Ptr<Ipv4> ipv4,
262  uint32_t interface);
264 protected:
266  virtual void DoDispose (void);
271  virtual void NotifyNewAggregate ();
272 private:
277  friend class ::Ipv4L3ProtocolTestCase;
294  // class Ipv4 attributes
295  virtual void SetIpForward (bool forward);
296  virtual bool GetIpForward (void) const;
297  virtual void SetWeakEsModel (bool model);
298  virtual bool GetWeakEsModel (void) const;
306  void DecreaseIdentification (Ipv4Address source,
307  Ipv4Address destination,
308  uint8_t protocol);
322  Ipv4Address source,
323  Ipv4Address destination,
324  uint8_t protocol,
325  uint16_t payloadSize,
326  uint8_t ttl,
327  uint8_t tos,
328  bool mayFragment);
336  void
338  Ptr<Packet> packet,
339  Ipv4Header const &ipHeader);
347  void
348  IpForward (Ptr<Ipv4Route> rtentry,
350  const Ipv4Header &header);
358  void
361  const Ipv4Header &header);
369  void LocalDeliver (Ptr<const Packet> p, Ipv4Header const&ip, uint32_t iif);
377  void RouteInputError (Ptr<const Packet> p, const Ipv4Header & ipHeader, Socket::SocketErrno sockErrno);
384  uint32_t AddIpv4Interface (Ptr<Ipv4Interface> interface);
389  void SetupLoopback (void);
395  Ptr<Icmpv4L4Protocol> GetIcmp (void) const;
403  bool IsUnicast (Ipv4Address ad, Ipv4Mask interfaceMask) const;
408  typedef std::pair<Ptr<Packet>, Ipv4Header> Ipv4PayloadHeaderPair;
417  void DoFragmentation (Ptr<Packet> packet, const Ipv4Header& ipv4Header, uint32_t outIfaceMtu, std::list<Ipv4PayloadHeaderPair>& listFragments);
426  bool ProcessFragment (Ptr<Packet>& packet, Ipv4Header & ipHeader, uint32_t iif);
438  void CallTxTrace (const Ipv4Header & ipHeader, Ptr<Packet> packet, Ptr<Ipv4> ipv4, uint32_t interface);
443  typedef std::vector<Ptr<Ipv4Interface> > Ipv4InterfaceList;
447  typedef std::map<Ptr<const NetDevice>, uint32_t > Ipv4InterfaceReverseContainer;
451  typedef std::list<Ptr<Ipv4RawSocketImpl> > SocketList;
456  typedef std::pair<int, int32_t> L4ListKey_t;
461  typedef std::map<L4ListKey_t, Ptr<IpL4Protocol> > L4List_t;
463  bool m_ipForward;
468  uint8_t m_defaultTtl;
469  std::map<std::pair<uint64_t, uint8_t>, uint16_t> m_identification;
481  // The following two traces pass a packet with an IP header
490  // <ip-header, payload, reason, ifindex> (ifindex not valid if reason is DROP_NO_ROUTE)
501  typedef std::pair<uint64_t, uint32_t> FragmentKey_t;
504  typedef std::list< std::tuple <Time, FragmentKey_t, Ipv4Header, uint32_t > > FragmentsTimeoutsList_t;
506  typedef std::list< std::tuple <Time, FragmentKey_t, Ipv4Header, uint32_t > >::iterator FragmentsTimeoutsListI_t;
514  void HandleFragmentsTimeout (FragmentKey_t key, Ipv4Header & ipHeader, uint32_t iif);
523  FragmentsTimeoutsListI_t SetTimeout (FragmentKey_t key, Ipv4Header ipHeader, uint32_t iif);
528  void HandleTimeout (void);
537  class Fragments : public SimpleRefCount<Fragments>
538  {
539  public:
543  Fragments ();
548  ~Fragments ();
556  void AddFragment (Ptr<Packet> fragment, uint16_t fragmentOffset, bool moreFragment);
562  bool IsEntire () const;
568  Ptr<Packet> GetPacket () const;
574  Ptr<Packet> GetPartialPacket () const;
588  private:
597  std::list<std::pair<Ptr<Packet>, uint16_t> > m_fragments;
603  };
606  typedef std::map< FragmentKey_t, Ptr<Fragments> > MapFragments_t;
613  typedef std::tuple <uint64_t, uint8_t, Ipv4Address, Ipv4Address> DupTuple_t;
615  typedef std::map<DupTuple_t, Time> DupMap_t;
623  bool UpdateDuplicate (Ptr<const Packet> p, const Ipv4Header &header);
628  void RemoveDuplicates (void);
630  bool m_enableDpd;
635 };
637 } // Namespace ns3
639 #endif /* IPV4_L3_PROTOCOL_H */
virtual Ipv4Address SourceAddressSelection(uint32_t interface, Ipv4Address dest)
Choose the source address to use with destination address.
bool m_weakEsModel
Weak ES model state.
FragmentsTimeoutsListI_t GetTimeoutIter()
Get the Timeout iterator.
std::list< std::tuple< Time, FragmentKey_t, Ipv4Header, uint32_t > > FragmentsTimeoutsList_t
Container for fragment timeouts.
void SetDefaultTtl(uint8_t ttl)
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
virtual void SetIpForward(bool forward)
Set or unset the IP forwarding state.
uint32_t GetNAddresses(uint32_t interface) const
bool IsDestinationAddress(Ipv4Address address, uint32_t iif) const
Determine whether address and interface corresponding to received packet can be accepted for local de...
virtual void NotifyNewAggregate()
This function will notify other components connected to the node that a new stack member is now conne...
Time m_fragmentExpirationTimeout
Expiration timeout.
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > m_sendOutgoingTrace
Trace of sent packets.
a class to represent an Ipv4 address mask
Definition: ipv4-address.h:269
Forward calls to a chain of Callback.
void HandleFragmentsTimeout(FragmentKey_t key, Ipv4Header &ipHeader, uint32_t iif)
Process the timeout for packet fragments.
std::list< std::pair< Ptr< Packet >, uint16_t > > m_fragments
The current fragments.
DupMap_t m_dups
map of packet duplicate tuples to expiry event
void RemoveDuplicates(void)
Remove duplicate packet entry.
uint32_t AddInterface(Ptr< NetDevice > device)
TracedCallback< const Ipv4Header &, Ptr< const Packet >, DropReason, Ptr< Ipv4 >, uint32_t > m_dropTrace
Trace of dropped packets.
bool IsEntire() const
If all fragments have been added.
int32_t GetInterfaceForAddress(Ipv4Address addr) const
Return the interface number of the interface that has been assigned the specified IP address...
Enumeration of the possible errors returned by a socket.
Definition: socket.h:82
virtual bool GetIpForward(void) const
Get the IP forwarding state.
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > m_multicastForwardTrace
Trace of multicast forwarded packets.
Ptr< Ipv4RoutingProtocol > m_routingProtocol
Routing protocol associated with the stack.
uint32_t GetNInterfaces(void) const
void SetUp(uint32_t i)
L4List_t m_protocols
List of transport protocol.
a polymophic address class
Definition: address.h:90
Ptr< Packet > GetPartialPacket() const
Get the complete part of the packet.
bool m_enableDpd
Enable multicast duplicate packet detection.
Reason why a packet has been dropped.
Ipv4InterfaceList m_interfaces
List of IPv4 interfaces.
TracedCallback< Ptr< const Packet >, Ptr< Ipv4 >, uint32_t > m_rxTrace
Trace of received packets.
Packet header for IPv4.
Definition: ipv4-header.h:33
std::tuple< uint64_t, uint8_t, Ipv4Address, Ipv4Address > DupTuple_t
IETF RFC 6621, Section 6.2 de-duplication w/o IPSec RFC 6621 recommended duplicate packet tuple: {IPV...
Ptr< Icmpv4L4Protocol > GetIcmp(void) const
Get ICMPv4 protocol.
void SetupLoopback(void)
Setup loopback interface.
bool IsUnicast(Ipv4Address ad) const
Check if an IPv4 address is unicast according to the node.
TracedCallback< Ptr< const Packet >, Ptr< Ipv4 >, uint32_t > m_txTrace
Trace of transmitted packets.
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > m_localDeliverTrace
Trace of locally delivered packets.
Ptr< Ipv4Interface > GetInterface(uint32_t i) const
Get an interface.
void SetMetric(uint32_t i, uint16_t metric)
virtual void DoDispose(void)
Destructor implementation.
EventId m_cleanDpd
event to cleanup expired duplicate entries
void CallTxTrace(const Ipv4Header &ipHeader, Ptr< Packet > packet, Ptr< Ipv4 > ipv4, uint32_t interface)
Make a copy of the packet, add the header and invoke the TX trace callback.
EventId m_timeoutEvent
Event for the next scheduled timeout.
virtual bool GetWeakEsModel(void) const
Get the Weak Es Model status.
Ptr< Socket > CreateRawSocket(void)
Creates a raw socket.
void Send(Ptr< Packet > packet, Ipv4Address source, Ipv4Address destination, uint8_t protocol, Ptr< Ipv4Route > route)
std::pair< uint64_t, uint32_t > FragmentKey_t
Key identifying a fragmented packet.
static TypeId GetTypeId(void)
Get the type ID.
std::map< DupTuple_t, Time > DupMap_t
Maps packet duplicate tuple to expiration time.
MapFragments_t m_fragments
Fragmented packets.
void SendWithHeader(Ptr< Packet > packet, Ipv4Header ipHeader, Ptr< Ipv4Route > route)
void IpForward(Ptr< Ipv4Route > rtentry, Ptr< const Packet > p, const Ipv4Header &header)
Forward a packet.
A Set of Fragment belonging to the same packet (src, dst, identification and proto) ...
Ptr< Ipv4RoutingProtocol > GetRoutingProtocol(void) const
Get the routing protocol to be used by this Ipv4 stack.
std::vector< Ptr< Ipv4Interface > > Ipv4InterfaceList
Container of the IPv4 Interfaces.
bool RemoveAddress(uint32_t interfaceIndex, uint32_t addressIndex)
Remove the address at addressIndex on named interface.
FragmentsTimeoutsList_t m_timeoutEventList
Timeout "events" container.
int32_t GetInterfaceForPrefix(Ipv4Address addr, Ipv4Mask mask) const
Return the interface number of first interface found that has an Ipv4 address within the prefix speci...
void AddFragment(Ptr< Packet > fragment, uint16_t fragmentOffset, bool moreFragment)
Add a fragment.
bool UpdateDuplicate(Ptr< const Packet > p, const Ipv4Header &header)
Registers duplicate entry, return false if new.
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition: ipv4.h:76
bool m_ipForward
Forwarding packets (i.e.
void SetForwarding(uint32_t i, bool val)
void DoFragmentation(Ptr< Packet > packet, const Ipv4Header &ipv4Header, uint32_t outIfaceMtu, std::list< Ipv4PayloadHeaderPair > &listFragments)
Fragment a packet.
std::list< Ptr< Ipv4RawSocketImpl > > SocketList
Container of the IPv4 Raw Sockets.
Time m_expire
duplicate entry expiration delay
Implement the IPv4 layer.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
std::pair< Ptr< Packet >, Ipv4Header > Ipv4PayloadHeaderPair
Pair of a packet and an Ipv4 header.
Definition: first.py:44
std::pair< int, int32_t > L4ListKey_t
Container of the IPv4 L4 keys: protocol number, interface index.
std::map< FragmentKey_t, Ptr< Fragments > > MapFragments_t
Container of fragments, stored as pairs(src+dst addr, src+dst port) / fragment.
Time m_purge
time between purging expired duplicate entries
bool IsForwarding(uint32_t i) const
void DecreaseIdentification(Ipv4Address source, Ipv4Address destination, uint8_t protocol)
Decrease the identification value for a dropped or recursed packet.
Ptr< Node > m_node
Node attached to stack.
void RouteInputError(Ptr< const Packet > p, const Ipv4Header &ipHeader, Socket::SocketErrno sockErrno)
Fallback when no route is found.
Ipv4Header BuildHeader(Ipv4Address source, Ipv4Address destination, uint8_t protocol, uint16_t payloadSize, uint8_t ttl, uint8_t tos, bool mayFragment)
Construct an IPv4 header.
void SendRealOut(Ptr< Ipv4Route > route, Ptr< Packet > packet, Ipv4Header const &ipHeader)
Send packet with route.
std::map< Ptr< const NetDevice >, uint32_t > Ipv4InterfaceReverseContainer
Container of NetDevices registered to IPv4 and their interface indexes.
FragmentsTimeoutsListI_t SetTimeout(FragmentKey_t key, Ipv4Header ipHeader, uint32_t iif)
Set a new timeout "event" for a fragmented packet.
Ptr< NetDevice > GetNetDevice(uint32_t i)
void HandleTimeout(void)
Handles a fragmented packet timeout.
void(* SentTracedCallback)(const Ipv4Header &header, Ptr< const Packet > packet, uint32_t interface)
TracedCallback signature for packet send, forward, or local deliver events.
bool ProcessFragment(Ptr< Packet > &packet, Ipv4Header &ipHeader, uint32_t iif)
Process a packet fragment.
uint32_t AddIpv4Interface(Ptr< Ipv4Interface > interface)
Add an IPv4 interface to the stack.
uint16_t GetMetric(uint32_t i) const
virtual void Remove(Ptr< IpL4Protocol > protocol)
Ipv4 addresses are stored in host order in this class.
Definition: ipv4-address.h:41
virtual void SetWeakEsModel(bool model)
Set or unset the Weak Es Model.
FragmentsTimeoutsListI_t m_timeoutIter
Timeout iterator to "event" handler.
void SetNode(Ptr< Node > node)
Set node associated with this stack.
int32_t GetInterfaceForDevice(Ptr< const NetDevice > device) const
a class to store IPv4 address information on an interface
An identifier for simulation events.
Definition: event-id.h:53
Ptr< Packet > GetPacket() const
Get the entire packet.
void SetTimeoutIter(FragmentsTimeoutsListI_t iter)
Set the Timeout iterator.
SocketList m_sockets
List of IPv4 raw sockets.
void DeleteRawSocket(Ptr< Socket > socket)
Deletes a particular raw socket.
bool AddAddress(uint32_t i, Ipv4InterfaceAddress address)
virtual void Insert(Ptr< IpL4Protocol > protocol)
Ipv4L3Protocol & operator=(const Ipv4L3Protocol &)
Copy constructor.
void LocalDeliver(Ptr< const Packet > p, Ipv4Header const &ip, uint32_t iif)
Deliver a packet.
void IpMulticastForward(Ptr< Ipv4MulticastRoute > mrtentry, Ptr< const Packet > p, const Ipv4Header &header)
Forward a multicast packet.
Ipv4InterfaceAddress GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const
Because addresses can be removed, the addressIndex is not guaranteed to be static across calls to thi...
void Receive(Ptr< NetDevice > device, Ptr< const Packet > p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType)
Lower layer calls this method after calling L3Demux::Lookup The ARP subclass needs to know from which...
uint8_t m_defaultTtl
Default TTL.
Interface is down so can not send packet.
std::list< std::tuple< Time, FragmentKey_t, Ipv4Header, uint32_t > >::iterator FragmentsTimeoutsListI_t
Container Iterator for fragment timeouts..
uint16_t GetMtu(uint32_t i) const
void(* TxRxTracedCallback)(Ptr< const Packet > packet, Ptr< Ipv4 > ipv4, uint32_t interface)
TracedCallback signature for packet transmission or reception events.
Packet types are used as they are in Linux.
Definition: net-device.h:296
TracedCallback< const Ipv4Header &, Ptr< const Packet >, uint32_t > m_unicastForwardTrace
Trace of unicast forwarded packets.
Ipv4InterfaceReverseContainer m_reverseInterfacesContainer
Container of NetDevice / Interface index associations.
std::map< L4ListKey_t, Ptr< IpL4Protocol > > L4List_t
Container of the IPv4 L4 instances.
A template-based reference counting class.
a unique identifier for an interface.
Definition: type-id.h:58
std::map< std::pair< uint64_t, uint8_t >, uint16_t > m_identification
Identification (for each {src, dst, proto} tuple)
Duplicate packet received.
bool IsUp(uint32_t i) const
void SetDown(uint32_t i)
virtual Ptr< IpL4Protocol > GetProtocol(int protocolNumber) const
static const uint16_t PROT_NUMBER
Protocol number (0x0800)
bool m_moreFragment
True if other fragments will be sent.
void(* DropTracedCallback)(const Ipv4Header &header, Ptr< const Packet > packet, DropReason reason, Ptr< Ipv4 > ipv4, uint32_t interface)
TracedCallback signature for packet drop events.
Ipv4Address SelectSourceAddress(Ptr< const NetDevice > device, Ipv4Address dst, Ipv4InterfaceAddress::InterfaceAddressScope_e scope)
Return the first primary source address with scope less than or equal to the requested scope...
void SetRoutingProtocol(Ptr< Ipv4RoutingProtocol > routingProtocol)
Register a new routing protocol to be used by this Ipv4 stack.