A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
ipv6-l3-protocol.h
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2007-2009 Strasbourg University
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
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
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: Sebastien Vincent <vincent@clarinet.u-strasbg.fr>
19  */
20 
21 #ifndef IPV6_L3_PROTOCOL_H
22 #define IPV6_L3_PROTOCOL_H
23 
24 #include <list>
25 
26 #include "ns3/traced-callback.h"
27 #include "ns3/net-device.h"
28 #include "ns3/ipv6.h"
29 #include "ns3/ipv6-address.h"
30 #include "ns3/ipv6-header.h"
31 #include "ns3/ipv6-pmtu-cache.h"
32 
33 namespace ns3
34 {
35 
36 class Node;
37 class Ipv6Interface;
38 class IpL4Protocol;
39 class Ipv6Route;
40 class Ipv6MulticastRoute;
41 class Ipv6RawSocketImpl;
42 class Icmpv6L4Protocol;
43 class Ipv6AutoconfiguredPrefix;
44 
59 class Ipv6L3Protocol : public Ipv6
60 {
61 public:
66  static TypeId GetTypeId ();
67 
71  static const uint16_t PROT_NUMBER;
72 
77  enum DropReason
78  {
84  };
85 
89  Ipv6L3Protocol ();
90 
94  virtual ~Ipv6L3Protocol ();
95 
100  void SetNode (Ptr<Node> node);
101 
106  void Insert (Ptr<IpL4Protocol> protocol);
107 
112  void Remove (Ptr<IpL4Protocol> protocol);
113 
119  Ptr<IpL4Protocol> GetProtocol (int protocolNumber) const;
120 
126 
131  void DeleteRawSocket (Ptr<Socket> socket);
132 
137  void SetDefaultTtl (uint8_t ttl);
138 
143  void SetDefaultTclass (uint8_t tclass);
144 
156  void Receive (Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType);
157 
168  void Send (Ptr<Packet> packet, Ipv6Address source, Ipv6Address destination, uint8_t protocol, Ptr<Ipv6Route> route);
169 
174  void SetRoutingProtocol (Ptr<Ipv6RoutingProtocol> routingProtocol);
175 
181 
187  uint32_t AddInterface (Ptr<NetDevice> device);
188 
194  Ptr<Ipv6Interface> GetInterface (uint32_t i) const;
195 
200  uint32_t GetNInterfaces () const;
201 
207  int32_t GetInterfaceForAddress (Ipv6Address addr) const;
208 
215  int32_t GetInterfaceForPrefix (Ipv6Address addr, Ipv6Prefix mask) const;
216 
221  int32_t GetInterfaceForDevice (Ptr<const NetDevice> device) const;
222 
228  bool AddAddress (uint32_t i, Ipv6InterfaceAddress address);
229 
236  Ipv6InterfaceAddress GetAddress (uint32_t interfaceIndex, uint32_t addressIndex) const;
237 
243  uint32_t GetNAddresses (uint32_t interface) const;
244 
250  bool RemoveAddress (uint32_t interfaceIndex, uint32_t addressIndex);
251 
258  bool RemoveAddress (uint32_t interface, Ipv6Address address);
259 
265  void SetMetric (uint32_t i, uint16_t metric);
266 
272  uint16_t GetMetric (uint32_t i) const;
273 
279  uint16_t GetMtu (uint32_t i) const;
280 
286  virtual void SetPmtu (Ipv6Address dst, uint32_t pmtu);
287 
292  bool IsUp (uint32_t i) const;
293 
298  void SetUp (uint32_t i);
299 
304  void SetDown (uint32_t i);
305 
310  bool IsForwarding (uint32_t i) const;
311 
317  void SetForwarding (uint32_t i, bool val);
318 
324  Ptr<NetDevice> GetNetDevice (uint32_t i);
325 
331 
342  void AddAutoconfiguredAddress (uint32_t interface, Ipv6Address network, Ipv6Prefix mask, uint8_t flags, uint32_t validTime, uint32_t preferredTime, Ipv6Address defaultRouter = Ipv6Address::GetZero ());
343 
353  void RemoveAutoconfiguredAddress (uint32_t interface, Ipv6Address network, Ipv6Prefix mask, Ipv6Address defaultRouter);
354 
358  virtual void RegisterExtensions ();
359 
363  virtual void RegisterOptions ();
364 
365 protected:
369  virtual void DoDispose ();
370 
376  virtual void NotifyNewAggregate ();
377 
378 private:
379  /* for unit-tests */
382 
383  typedef std::list<Ptr<Ipv6Interface> > Ipv6InterfaceList;
384  typedef std::list<Ptr<Ipv6RawSocketImpl> > SocketList;
385  typedef std::list<Ptr<IpL4Protocol> > L4List_t;
386 
387  typedef std::list< Ptr<Ipv6AutoconfiguredPrefix> > Ipv6AutoconfiguredPrefixList;
388  typedef std::list< Ptr<Ipv6AutoconfiguredPrefix> >::iterator Ipv6AutoconfiguredPrefixListI;
389 
394 
399 
404 
409  Ipv6L3Protocol (const Ipv6L3Protocol& o);
410 
416 
426  Ipv6Header BuildHeader (Ipv6Address src, Ipv6Address dst, uint8_t protocol,
427  uint16_t payloadSize, uint8_t hopLimit, uint8_t tclass);
428 
435  void SendRealOut (Ptr<Ipv6Route> route, Ptr<Packet> packet, Ipv6Header const& ipHeader);
436 
444  void IpForward (Ptr<const NetDevice> idev, Ptr<Ipv6Route> rtentry, Ptr<const Packet> p, const Ipv6Header& header);
445 
454 
461  void LocalDeliver (Ptr<const Packet> p, Ipv6Header const& ip, uint32_t iif);
462 
469  void RouteInputError (Ptr<const Packet> p, const Ipv6Header& ipHeader, Socket::SocketErrno sockErrno);
470 
476  uint32_t AddIpv6Interface (Ptr<Ipv6Interface> interface);
477 
481  void SetupLoopback ();
482 
487  virtual void SetIpForward (bool forward);
488 
493  virtual bool GetIpForward () const;
494 
499  virtual void SetMtuDiscover (bool mtuDiscover);
500 
505  virtual bool GetMtuDiscover (void) const;
506 
511  virtual void SetSendIcmpv6Redirect (bool sendIcmpv6Redirect);
512 
517  virtual bool GetSendIcmpv6Redirect () const;
518 
523 
528 
533 
538 
543 
548 
552  uint32_t m_nInterfaces;
553 
557  uint8_t m_defaultTtl;
558 
563 
568 
573 
578 
583 };
584 
585 } /* namespace ns3 */
586 
587 #endif /* IPV6_L3_PROTOCOL_H */
588 
Ipv6Header BuildHeader(Ipv6Address src, Ipv6Address dst, uint8_t protocol, uint16_t payloadSize, uint8_t hopLimit, uint8_t tclass)
Construct an IPv6 header.
void SetForwarding(uint32_t i, bool val)
Enable or disable forwarding on interface.
Packet header for IPv6.
Definition: ipv6-header.h:33
virtual ~Ipv6L3Protocol()
Destructor.
Ipv6L3Protocol()
Constructor.
virtual void SetPmtu(Ipv6Address dst, uint32_t pmtu)
Set the Path MTU for the specified IPv6 destination address.
Ptr< NetDevice > GetNetDevice(uint32_t i)
Get device by index.
bool AddAddress(uint32_t i, Ipv6InterfaceAddress address)
Add an address on interface.
Ptr< Ipv6RoutingProtocol > m_routingProtocol
Routing protocol.
Access to the IPv6 forwarding table, interfaces, and configuration.
Definition: ipv6.h:79
Ptr< Ipv6RoutingProtocol > GetRoutingProtocol() const
Get current routing protocol used.
uint32_t AddIpv6Interface(Ptr< Ipv6Interface > interface)
Add an IPv6 interface to the stack.
void Send(Ptr< Packet > packet, Ipv6Address source, Ipv6Address destination, uint8_t protocol, Ptr< Ipv6Route > route)
Higher-level layers call this method to send a packet down the stack to the MAC and PHY layers...
IPv6 layer implementation.
std::list< Ptr< IpL4Protocol > > L4List_t
forward calls to a chain of CallbackAn ns3::TracedCallback has almost exactly the same API as a norma...
IPv6 address associated with an interface.
uint32_t GetNAddresses(uint32_t interface) const
Get number of address for an interface.
std::list< Ptr< Ipv6RawSocketImpl > > SocketList
void Receive(Ptr< NetDevice > device, Ptr< const Packet > p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType)
Receive method when a packet arrive in the stack. This method removes IPv6 header and forward up to L...
virtual bool GetSendIcmpv6Redirect() const
Get the ICMPv6 Redirect sending state.
virtual void DoDispose()
Dispose object.
void SetMetric(uint32_t i, uint16_t metric)
Set metric for an interface.
uint32_t AddInterface(Ptr< NetDevice > device)
Add IPv6 interface for a device.
std::list< Ptr< Ipv6Interface > > Ipv6InterfaceList
Ptr< Node > m_node
Node attached to stack.
a polymophic address class
Definition: address.h:86
virtual void SetIpForward(bool forward)
Set IPv6 forwarding state.
virtual void NotifyNewAggregate()
Notify other components connected to the node that a new stack member is now connected.
bool IsUp(uint32_t i) const
Is specified interface up ?
uint32_t m_nInterfaces
Number of IPv6 interfaces managed by the stack.
void SetDefaultTclass(uint8_t tclass)
Set the default TCLASS.
int32_t GetInterfaceForPrefix(Ipv6Address addr, Ipv6Prefix mask) const
Get interface index which match specified address/prefix.
Ptr< Socket > CreateRawSocket()
Create raw IPv6 socket.
L4List_t m_protocols
List of transport protocol.
void SetDefaultTtl(uint8_t ttl)
Set the default TTL.
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address.
void IpMulticastForward(Ptr< const NetDevice > idev, Ptr< Ipv6MulticastRoute > mrtentry, Ptr< const Packet > p, const Ipv6Header &header)
Forward a packet in multicast.
void SetUp(uint32_t i)
Set an interface up.
std::list< Ptr< Ipv6AutoconfiguredPrefix > > Ipv6AutoconfiguredPrefixList
static TypeId GetTypeId()
Get the type ID of this class.
Ipv6InterfaceList m_interfaces
List of IPv6 interfaces.
bool m_ipForward
Forwarding packets (i.e. router mode) state.
uint32_t GetNInterfaces() const
Get current number of interface on this stack.
uint16_t GetMetric(uint32_t i) const
Get metric for an interface.
std::list< Ptr< Ipv6AutoconfiguredPrefix > >::iterator Ipv6AutoconfiguredPrefixListI
Ipv6AutoconfiguredPrefixList m_prefixes
List of IPv6 prefix received from RA.
void LocalDeliver(Ptr< const Packet > p, Ipv6Header const &ip, uint32_t iif)
Deliver a packet.
void DeleteRawSocket(Ptr< Socket > socket)
Remove raw IPv6 socket.
virtual bool GetIpForward() const
Get IPv6 forwarding state.
void IpForward(Ptr< const NetDevice > idev, Ptr< Ipv6Route > rtentry, Ptr< const Packet > p, const Ipv6Header &header)
Forward a packet.
Ipv6InterfaceAddress GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const
Get an address.
uint8_t m_defaultTtl
Default TTL for outgoing packets.
TracedCallback< const Ipv6Header &, Ptr< const Packet >, DropReason, Ptr< Ipv6 >, uint32_t > m_dropTrace
Callback to trace drop packets.
TracedCallback< Ptr< const Packet >, Ptr< Ipv6 >, uint32_t > m_rxTrace
Callback to trace RX (reception) packets.
int32_t GetInterfaceForDevice(Ptr< const NetDevice > device) const
Get interface index which is on a specified net device.
void SetNode(Ptr< Node > node)
Set node for this stack.
IPv6 Extension Loose Routing.
bool IsForwarding(uint32_t i) const
Is interface allows forwarding ?
void RemoveAutoconfiguredAddress(uint32_t interface, Ipv6Address network, Ipv6Prefix mask, Ipv6Address defaultRouter)
Remove an autoconfigured address.
void SendRealOut(Ptr< Ipv6Route > route, Ptr< Packet > packet, Ipv6Header const &ipHeader)
Send packet with route.
void SetupLoopback()
Setup loopback interface.
virtual void RegisterExtensions()
Register the IPv6 Extensions.
Describes an IPv6 address.
Definition: ipv6-address.h:46
void SetRoutingProtocol(Ptr< Ipv6RoutingProtocol > routingProtocol)
Set routing protocol for this stack.
Ptr< IpL4Protocol > GetProtocol(int protocolNumber) const
Get L4 protocol by protocol number.
Ptr< Icmpv6L4Protocol > GetIcmpv6() const
Get ICMPv6 protocol.
void Insert(Ptr< IpL4Protocol > protocol)
Add an L4 protocol.
uint16_t GetMtu(uint32_t i) const
Get MTU for an interface.
bool m_sendIcmpv6Redirect
Allow ICMPv6 Redirect sending state.
virtual void RegisterOptions()
Register the IPv6 Options.
Describes an IPv6 prefix. It is just a bitmask like Ipv4Mask.
Definition: ipv6-address.h:364
void SetDown(uint32_t i)
set an interface down.
bool m_mtuDiscover
MTU Discover (i.e. Path MTU) state.
int32_t GetInterfaceForAddress(Ipv6Address addr) const
Get interface index which has specified IPv6 address.
tuple address
Definition: first.py:37
bool RemoveAddress(uint32_t interfaceIndex, uint32_t addressIndex)
Remove an address from an interface.
Ptr< Ipv6PmtuCache > m_pmtuCache
Path MTU Cache.
virtual bool GetMtuDiscover(void) const
Get IPv6 MTU discover state.
TracedCallback< Ptr< const Packet >, Ptr< Ipv6 >, uint32_t > m_txTrace
Callback to trace TX (transmission) packets.
virtual void SetMtuDiscover(bool mtuDiscover)
Set IPv6 MTU discover state.
uint8_t m_defaultTclass
Default TCLASS for outgoing packets.
a unique identifier for an interface.
Definition: type-id.h:49
Ipv6L3Protocol & operator=(const Ipv6L3Protocol &o)
Copy constructor.
SocketList m_sockets
List of IPv6 raw sockets.
static const uint16_t PROT_NUMBER
The protocol number for IPv6 (0x86DD).
Ptr< Ipv6Interface > GetInterface(uint32_t i) const
Get an interface.
void Remove(Ptr< IpL4Protocol > protocol)
Remove an L4 protocol.
void AddAutoconfiguredAddress(uint32_t interface, Ipv6Address network, Ipv6Prefix mask, uint8_t flags, uint32_t validTime, uint32_t preferredTime, Ipv6Address defaultRouter=Ipv6Address::GetZero())
Add an autoconfigured address with RA information.
DropReason
Reason why a packet has been dropped.
virtual void SetSendIcmpv6Redirect(bool sendIcmpv6Redirect)
Set the ICMPv6 Redirect sending state.
void RouteInputError(Ptr< const Packet > p, const Ipv6Header &ipHeader, Socket::SocketErrno sockErrno)
Fallback when no route is found.