A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
ipv6-l3-protocol.h
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 
32 namespace ns3
33 {
34 
35 class Node;
36 class Ipv6Interface;
37 class IpL4Protocol;
38 class Ipv6Route;
39 class Ipv6MulticastRoute;
40 class Ipv6RawSocketImpl;
41 class Icmpv6L4Protocol;
42 class Ipv6AutoconfiguredPrefix;
43 
58 class Ipv6L3Protocol : public Ipv6
59 {
60 public:
65  static TypeId GetTypeId ();
66 
70  static const uint16_t PROT_NUMBER;
71 
76  enum DropReason
77  {
83  };
84 
88  Ipv6L3Protocol ();
89 
93  virtual ~Ipv6L3Protocol ();
94 
99  void SetNode (Ptr<Node> node);
100 
105  void Insert (Ptr<IpL4Protocol> protocol);
106 
111  void Remove (Ptr<IpL4Protocol> protocol);
112 
118  Ptr<IpL4Protocol> GetProtocol (int protocolNumber) const;
119 
125 
130  void DeleteRawSocket (Ptr<Socket> socket);
131 
136  void SetDefaultTtl (uint8_t ttl);
137 
142  void SetDefaultTclass (uint8_t tclass);
143 
155  void Receive (Ptr<NetDevice> device, Ptr<const Packet> p, uint16_t protocol, const Address &from, const Address &to, NetDevice::PacketType packetType);
156 
167  void Send (Ptr<Packet> packet, Ipv6Address source, Ipv6Address destination, uint8_t protocol, Ptr<Ipv6Route> route);
168 
173  void SetRoutingProtocol (Ptr<Ipv6RoutingProtocol> routingProtocol);
174 
180 
186  uint32_t AddInterface (Ptr<NetDevice> device);
187 
193  Ptr<Ipv6Interface> GetInterface (uint32_t i) const;
194 
199  uint32_t GetNInterfaces () const;
200 
206  int32_t GetInterfaceForAddress (Ipv6Address addr) const;
207 
214  int32_t GetInterfaceForPrefix (Ipv6Address addr, Ipv6Prefix mask) const;
215 
220  int32_t GetInterfaceForDevice (Ptr<const NetDevice> device) const;
221 
227  bool AddAddress (uint32_t i, Ipv6InterfaceAddress address);
228 
235  Ipv6InterfaceAddress GetAddress (uint32_t interfaceIndex, uint32_t addressIndex) const;
236 
242  uint32_t GetNAddresses (uint32_t interface) const;
243 
249  bool RemoveAddress (uint32_t interfaceIndex, uint32_t addressIndex);
250 
256  void SetMetric (uint32_t i, uint16_t metric);
257 
263  uint16_t GetMetric (uint32_t i) const;
264 
270  uint16_t GetMtu (uint32_t i) const;
271 
276  bool IsUp (uint32_t i) const;
277 
282  void SetUp (uint32_t i);
283 
288  void SetDown (uint32_t i);
289 
294  bool IsForwarding (uint32_t i) const;
295 
301  void SetForwarding (uint32_t i, bool val);
302 
308  Ptr<NetDevice> GetNetDevice (uint32_t i);
309 
315 
326  void AddAutoconfiguredAddress (uint32_t interface, Ipv6Address network, Ipv6Prefix mask, uint8_t flags, uint32_t validTime, uint32_t preferredTime, Ipv6Address defaultRouter = Ipv6Address::GetZero ());
327 
337  void RemoveAutoconfiguredAddress (uint32_t interface, Ipv6Address network, Ipv6Prefix mask, Ipv6Address defaultRouter);
338 
342  virtual void RegisterExtensions ();
343 
347  virtual void RegisterOptions ();
348 
349 protected:
353  virtual void DoDispose ();
354 
360  virtual void NotifyNewAggregate ();
361 
362 private:
363  /* for unit-tests */
364  friend class Ipv6L3ProtocolTestCase;
365  friend class Ipv6ExtensionLooseRouting;
366 
367  typedef std::list<Ptr<Ipv6Interface> > Ipv6InterfaceList;
368  typedef std::list<Ptr<Ipv6RawSocketImpl> > SocketList;
369  typedef std::list<Ptr<IpL4Protocol> > L4List_t;
370 
371  typedef std::list< Ptr<Ipv6AutoconfiguredPrefix> > Ipv6AutoconfiguredPrefixList;
372  typedef std::list< Ptr<Ipv6AutoconfiguredPrefix> >::iterator Ipv6AutoconfiguredPrefixListI;
373 
378 
383 
388 
393  Ipv6L3Protocol (const Ipv6L3Protocol& o);
394 
400 
410  Ipv6Header BuildHeader (Ipv6Address src, Ipv6Address dst, uint8_t protocol,
411  uint16_t payloadSize, uint8_t hopLimit, uint8_t tclass);
412 
419  void SendRealOut (Ptr<Ipv6Route> route, Ptr<Packet> packet, Ipv6Header const& ipHeader);
420 
427  void IpForward (Ptr<Ipv6Route> rtentry, Ptr<const Packet> p, const Ipv6Header& header);
428 
436 
443  void LocalDeliver (Ptr<const Packet> p, Ipv6Header const& ip, uint32_t iif);
444 
451  void RouteInputError (Ptr<const Packet> p, const Ipv6Header& ipHeader, Socket::SocketErrno sockErrno);
452 
458  uint32_t AddIpv6Interface (Ptr<Ipv6Interface> interface);
459 
463  void SetupLoopback ();
464 
469  virtual void SetIpForward (bool forward);
470 
475  virtual bool GetIpForward () const;
476 
481  virtual void SetSendIcmpv6Redirect (bool sendIcmpv6Redirect);
482 
487  virtual bool GetSendIcmpv6Redirect () const;
488 
493 
498 
502  L4List_t m_protocols;
503 
507  Ipv6InterfaceList m_interfaces;
508 
512  uint32_t m_nInterfaces;
513 
517  uint8_t m_defaultTtl;
518 
523 
528 
532  SocketList m_sockets;
533 
537  Ipv6AutoconfiguredPrefixList m_prefixes;
538 
543 };
544 
545 } /* namespace ns3 */
546 
547 #endif /* IPV6_L3_PROTOCOL_H */
548 
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.
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
void IpForward(Ptr< Ipv6Route > rtentry, Ptr< const Packet > p, const Ipv6Header &header)
Forward a packet.
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.
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.
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.
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 IpMulticastForward(Ptr< Ipv6MulticastRoute > mrtentry, Ptr< const Packet > p, const Ipv6Header &header)
Forward a packet in multicast.
void SetDefaultTtl(uint8_t ttl)
Set the default TTL.
static Ipv6Address GetZero()
Get the 0 (::) Ipv6Address.
void SetUp(uint32_t i)
Set an interface up.
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.
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.
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:44
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:326
void SetDown(uint32_t i)
set an interface down.
int32_t GetInterfaceForAddress(Ipv6Address addr) const
Get interface index which has specified IPv6 address.
bool RemoveAddress(uint32_t interfaceIndex, uint32_t addressIndex)
Remove an address from an interface.
TracedCallback< Ptr< const Packet >, Ptr< Ipv6 >, uint32_t > m_txTrace
Callback to trace TX (transmission) packets.
uint8_t m_defaultTclass
Default TCLASS for outgoing packets.
a unique identifier for an interface.
Definition: type-id.h:44
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.