A Discrete-Event Network Simulator
API
ipv6-extension.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2007-2009 Strasbourg University
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Author: David Gross <gdavid.devel@gmail.com>
18  */
19 
20 #ifndef IPV6_EXTENSION_H
21 #define IPV6_EXTENSION_H
22 
23 #include "ipv6-extension-header.h"
24 #include "ipv6-header.h"
25 #include "ipv6-interface.h"
26 #include "ipv6-l3-protocol.h"
27 
28 #include "ns3/buffer.h"
29 #include "ns3/ipv6-address.h"
30 #include "ns3/node.h"
31 #include "ns3/object.h"
32 #include "ns3/packet.h"
33 #include "ns3/ptr.h"
34 #include "ns3/random-variable-stream.h"
35 #include "ns3/traced-callback.h"
36 
37 #include <list>
38 #include <map>
39 #include <tuple>
40 
41 namespace ns3
42 {
43 
56 class Ipv6Extension : public Object
57 {
58  public:
63  static TypeId GetTypeId();
64 
68  Ipv6Extension();
69 
73  ~Ipv6Extension() override;
74 
79  void SetNode(Ptr<Node> node);
80 
85  Ptr<Node> GetNode() const;
86 
91  virtual uint8_t GetExtensionNumber() const = 0;
92 
107  virtual uint8_t Process(Ptr<Packet>& packet,
108  uint8_t offset,
109  const Ipv6Header& ipv6Header,
110  Ipv6Address dst,
111  uint8_t* nextHeader,
112  bool& stopProcessing,
113  bool& isDropped,
114  Ipv6L3Protocol::DropReason& dropReason) = 0;
115 
131  virtual uint8_t ProcessOptions(Ptr<Packet>& packet,
132  uint8_t offset,
133  uint8_t length,
134  const Ipv6Header& ipv6Header,
135  Ipv6Address dst,
136  uint8_t* nextHeader,
137  bool& stopProcessing,
138  bool& isDropped,
139  Ipv6L3Protocol::DropReason& dropReason);
140 
149  int64_t AssignStreams(int64_t stream);
150 
151  protected:
156 
157  private:
162 };
163 
170 {
171  public:
175  static const uint8_t EXT_NUMBER = 0;
176 
181  static TypeId GetTypeId();
182 
187 
191  ~Ipv6ExtensionHopByHop() override;
192 
197  uint8_t GetExtensionNumber() const override;
198 
199  uint8_t Process(Ptr<Packet>& packet,
200  uint8_t offset,
201  const Ipv6Header& ipv6Header,
202  Ipv6Address dst,
203  uint8_t* nextHeader,
204  bool& stopProcessing,
205  bool& isDropped,
206  Ipv6L3Protocol::DropReason& dropReason) override;
207 };
208 
215 {
216  public:
220  static const uint8_t EXT_NUMBER = 60;
221 
226  static TypeId GetTypeId();
227 
232 
236  ~Ipv6ExtensionDestination() override;
237 
242  uint8_t GetExtensionNumber() const override;
243 
244  uint8_t Process(Ptr<Packet>& packet,
245  uint8_t offset,
246  const Ipv6Header& ipv6Header,
247  Ipv6Address dst,
248  uint8_t* nextHeader,
249  bool& stopProcessing,
250  bool& isDropped,
251  Ipv6L3Protocol::DropReason& dropReason) override;
252 };
253 
260 {
261  public:
265  static const uint8_t EXT_NUMBER = 44;
266 
271  static TypeId GetTypeId();
272 
277 
281  ~Ipv6ExtensionFragment() override;
282 
287  uint8_t GetExtensionNumber() const override;
288 
289  uint8_t Process(Ptr<Packet>& packet,
290  uint8_t offset,
291  const Ipv6Header& ipv6Header,
292  Ipv6Address dst,
293  uint8_t* nextHeader,
294  bool& stopProcessing,
295  bool& isDropped,
296  Ipv6L3Protocol::DropReason& dropReason) override;
297 
301  typedef std::pair<Ptr<Packet>, Ipv6Header> Ipv6PayloadHeaderPair;
302 
312  void GetFragments(Ptr<Packet> packet,
313  Ipv6Header ipv6Header,
314  uint32_t fragmentSize,
315  std::list<Ipv6PayloadHeaderPair>& listFragments);
316 
317  protected:
321  void DoDispose() override;
322 
323  private:
327  typedef std::pair<Ipv6Address, uint32_t> FragmentKey_t;
328 
332  typedef std::list<std::tuple<Time, FragmentKey_t, Ipv6Header>> FragmentsTimeoutsList_t;
336  typedef std::list<std::tuple<Time, FragmentKey_t, Ipv6Header>>::iterator
338 
344  class Fragments : public SimpleRefCount<Fragments>
345  {
346  public:
350  Fragments();
351 
355  ~Fragments();
356 
363  void AddFragment(Ptr<Packet> fragment, uint16_t fragmentOffset, bool moreFragment);
364 
369  void SetUnfragmentablePart(Ptr<Packet> unfragmentablePart);
370 
375  bool IsEntire() const;
376 
381  Ptr<Packet> GetPacket() const;
382 
388 
394 
400 
401  private:
406 
410  std::list<std::pair<Ptr<Packet>, uint16_t>> m_packetFragments;
411 
416 
421  };
422 
428  void HandleFragmentsTimeout(FragmentKey_t key, Ipv6Header ipHeader);
429 
435 
441 
446 
450  typedef std::map<FragmentKey_t, Ptr<Fragments>> MapFragments_t;
451 
456 
464 
468  void HandleTimeout();
469 
473 };
474 
484 {
485  public:
489  static const uint8_t EXT_NUMBER = 43;
490 
495  static TypeId GetTypeId();
496 
501 
505  ~Ipv6ExtensionRouting() override;
506 
511  uint8_t GetExtensionNumber() const override;
512 
517  virtual uint8_t GetTypeRouting() const;
518 
525 
526  uint8_t Process(Ptr<Packet>& packet,
527  uint8_t offset,
528  const Ipv6Header& ipv6Header,
529  Ipv6Address dst,
530  uint8_t* nextHeader,
531  bool& stopProcessing,
532  bool& isDropped,
533  Ipv6L3Protocol::DropReason& dropReason) override;
534 };
535 
542 {
543  public:
548  static TypeId GetTypeId();
549 
554 
558  ~Ipv6ExtensionRoutingDemux() override;
559 
564  void SetNode(Ptr<Node> node);
565 
570  void Insert(Ptr<Ipv6ExtensionRouting> extensionRouting);
571 
577  Ptr<Ipv6ExtensionRouting> GetExtensionRouting(uint8_t typeRouting);
578 
586 
591  void Remove(Ptr<Ipv6ExtensionRouting> extensionRouting);
592 
593  protected:
597  void DoDispose() override;
598 
599  private:
603  typedef std::list<Ptr<Ipv6ExtensionRouting>> Ipv6ExtensionRoutingList_t;
604 
609 
614 };
615 
622 {
623  public:
627  static const uint8_t TYPE_ROUTING = 0;
628 
633  static TypeId GetTypeId();
634 
639 
643  ~Ipv6ExtensionLooseRouting() override;
644 
649  uint8_t GetTypeRouting() const override;
650 
652 
653  uint8_t Process(Ptr<Packet>& packet,
654  uint8_t offset,
655  const Ipv6Header& ipv6Header,
656  Ipv6Address dst,
657  uint8_t* nextHeader,
658  bool& stopProcessing,
659  bool& isDropped,
660  Ipv6L3Protocol::DropReason& dropReason) override;
661 };
662 
669 {
670  public:
674  static const uint8_t EXT_NUMBER = 50;
675 
680  static TypeId GetTypeId();
681 
686 
690  ~Ipv6ExtensionESP() override;
691 
696  uint8_t GetExtensionNumber() const override;
697 
698  uint8_t Process(Ptr<Packet>& packet,
699  uint8_t offset,
700  const Ipv6Header& ipv6Header,
701  Ipv6Address dst,
702  uint8_t* nextHeader,
703  bool& stopProcessing,
704  bool& isDropped,
705  Ipv6L3Protocol::DropReason& dropReason) override;
706 };
707 
714 {
715  public:
719  static const uint8_t EXT_NUMBER = 51;
720 
725  static TypeId GetTypeId();
726 
730  Ipv6ExtensionAH();
731 
735  ~Ipv6ExtensionAH() override;
736 
741  uint8_t GetExtensionNumber() const override;
742 
743  uint8_t Process(Ptr<Packet>& packet,
744  uint8_t offset,
745  const Ipv6Header& ipv6Header,
746  Ipv6Address dst,
747  uint8_t* nextHeader,
748  bool& stopProcessing,
749  bool& isDropped,
750  Ipv6L3Protocol::DropReason& dropReason) override;
751 };
752 
753 } /* namespace ns3 */
754 
755 #endif /* IPV6_EXTENSION_H */
An identifier for simulation events.
Definition: event-id.h:55
Describes an IPv6 address.
Definition: ipv6-address.h:49
IPv6 Extension AH (Authentication Header)
~Ipv6ExtensionAH() override
Destructor.
uint8_t Process(Ptr< Packet > &packet, uint8_t offset, const Ipv6Header &ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool &stopProcessing, bool &isDropped, Ipv6L3Protocol::DropReason &dropReason) override
Process method Called from Ipv6L3Protocol::Receive.
static TypeId GetTypeId()
Get the type identificator.
uint8_t GetExtensionNumber() const override
Get the extension number.
Ipv6ExtensionAH()
Constructor.
static const uint8_t EXT_NUMBER
AH extension number.
IPv6 Extension Destination.
uint8_t GetExtensionNumber() const override
Get the extension number.
static const uint8_t EXT_NUMBER
Destination extension number.
static TypeId GetTypeId()
Get the type identificator.
~Ipv6ExtensionDestination() override
Destructor.
uint8_t Process(Ptr< Packet > &packet, uint8_t offset, const Ipv6Header &ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool &stopProcessing, bool &isDropped, Ipv6L3Protocol::DropReason &dropReason) override
Process method Called from Ipv6L3Protocol::Receive.
IPv6 Extension ESP (Encapsulating Security Payload)
~Ipv6ExtensionESP() override
Destructor.
Ipv6ExtensionESP()
Constructor.
uint8_t Process(Ptr< Packet > &packet, uint8_t offset, const Ipv6Header &ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool &stopProcessing, bool &isDropped, Ipv6L3Protocol::DropReason &dropReason) override
Process method Called from Ipv6L3Protocol::Receive.
uint8_t GetExtensionNumber() const override
Get the extension number.
static const uint8_t EXT_NUMBER
ESP extension number.
static TypeId GetTypeId()
Get the type identificator.
This class stores the fragments of a packet waiting to be rebuilt.
Ptr< Packet > GetPartialPacket() const
Get the packet parts so far received.
Ptr< Packet > GetPacket() const
Get the entire packet.
std::list< std::pair< Ptr< Packet >, uint16_t > > m_packetFragments
The current fragments.
void AddFragment(Ptr< Packet > fragment, uint16_t fragmentOffset, bool moreFragment)
Add a fragment.
void SetTimeoutIter(FragmentsTimeoutsListI_t iter)
Set the Timeout iterator.
bool m_moreFragment
If other fragments will be sent.
Ptr< Packet > m_unfragmentable
The unfragmentable part.
FragmentsTimeoutsListI_t m_timeoutIter
Timeout iterator to "event" handler.
void SetUnfragmentablePart(Ptr< Packet > unfragmentablePart)
Set the unfragmentable part of the packet.
bool IsEntire() const
If all fragments have been added.
FragmentsTimeoutsListI_t GetTimeoutIter()
Get the Timeout iterator.
IPv6 Extension Fragment.
Time m_fragmentExpirationTimeout
Expiration timeout.
void HandleTimeout()
Handles a fragmented packet timeout.
std::list< std::tuple< Time, FragmentKey_t, Ipv6Header > >::iterator FragmentsTimeoutsListI_t
Container Iterator for fragment timeouts.
Ipv6ExtensionFragment()
Constructor.
static TypeId GetTypeId()
Get the type identificator.
std::pair< Ptr< Packet >, Ipv6Header > Ipv6PayloadHeaderPair
Pair of a packet and an Ipv6 header.
void GetFragments(Ptr< Packet > packet, Ipv6Header ipv6Header, uint32_t fragmentSize, std::list< Ipv6PayloadHeaderPair > &listFragments)
Fragment a packet.
std::pair< Ipv6Address, uint32_t > FragmentKey_t
Key identifying a fragmented packet.
EventId m_timeoutEvent
Event for the next scheduled timeout.
std::map< FragmentKey_t, Ptr< Fragments > > MapFragments_t
Container for the packet fragments.
Ptr< Packet > GetPartialPacket() const
Get the packet parts so far received.
MapFragments_t m_fragments
The hash of fragmented packets.
void DoDispose() override
Dispose this object.
void SetTimeoutEventId(EventId event)
Set the Timeout EventId.
uint8_t Process(Ptr< Packet > &packet, uint8_t offset, const Ipv6Header &ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool &stopProcessing, bool &isDropped, Ipv6L3Protocol::DropReason &dropReason) override
Process method Called from Ipv6L3Protocol::Receive.
~Ipv6ExtensionFragment() override
Destructor.
FragmentsTimeoutsList_t m_timeoutEventList
Timeout "events" container.
void HandleFragmentsTimeout(FragmentKey_t key, Ipv6Header ipHeader)
Process the timeout for packet fragments.
FragmentsTimeoutsListI_t SetTimeout(FragmentKey_t key, Ipv6Header ipHeader)
Set a new timeout "event" for a fragmented packet.
uint8_t GetExtensionNumber() const override
Get the extension number.
std::list< std::tuple< Time, FragmentKey_t, Ipv6Header > > FragmentsTimeoutsList_t
Container for fragment timeouts.
static const uint8_t EXT_NUMBER
Fragmentation extension number.
void CancelTimeout()
Cancel the timeout event.
IPv6 Extension "Hop By Hop".
static TypeId GetTypeId()
Get the type identificator.
~Ipv6ExtensionHopByHop() override
Destructor.
Ipv6ExtensionHopByHop()
Constructor.
uint8_t Process(Ptr< Packet > &packet, uint8_t offset, const Ipv6Header &ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool &stopProcessing, bool &isDropped, Ipv6L3Protocol::DropReason &dropReason) override
Process method Called from Ipv6L3Protocol::Receive.
static const uint8_t EXT_NUMBER
Hop-by-hop extension number.
uint8_t GetExtensionNumber() const override
Get the extension number.
IPv6 Extension base If you want to implement a new IPv6 extension, all you have to do is implement a ...
Ptr< Node > GetNode() const
Get the node.
virtual uint8_t ProcessOptions(Ptr< Packet > &packet, uint8_t offset, uint8_t length, const Ipv6Header &ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool &stopProcessing, bool &isDropped, Ipv6L3Protocol::DropReason &dropReason)
Process options Called by implementing classes to process the options.
virtual uint8_t GetExtensionNumber() const =0
Get the extension number.
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model.
Ptr< Node > m_node
The node.
void SetNode(Ptr< Node > node)
Set the node.
virtual uint8_t Process(Ptr< Packet > &packet, uint8_t offset, const Ipv6Header &ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool &stopProcessing, bool &isDropped, Ipv6L3Protocol::DropReason &dropReason)=0
Process method Called from Ipv6L3Protocol::Receive.
Ptr< UniformRandomVariable > m_uvar
Provides uniform random variables.
~Ipv6Extension() override
Destructor.
Ipv6Extension()
Constructor.
static TypeId GetTypeId()
Get the type identificator.
IPv6 Extension Loose Routing.
static TypeId GetTypeId()
Get the type identificator.
~Ipv6ExtensionLooseRouting() override
Destructor.
uint8_t Process(Ptr< Packet > &packet, uint8_t offset, const Ipv6Header &ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool &stopProcessing, bool &isDropped, Ipv6L3Protocol::DropReason &dropReason) override
Process method Called from Ipv6L3Protocol::Receive.
uint8_t GetTypeRouting() const override
Get the type of routing.
Ipv6ExtensionRoutingHeader * GetExtensionRoutingHeaderPtr() override
Get a pointer to a new routing extension header.
static const uint8_t TYPE_ROUTING
Routing type.
IPv6 Extension Routing Demux.
void DoDispose() override
Dispose this object.
std::list< Ptr< Ipv6ExtensionRouting > > Ipv6ExtensionRoutingList_t
Container for the extension routing.
void Insert(Ptr< Ipv6ExtensionRouting > extensionRouting)
Insert a new IPv6 Routing Extension.
static TypeId GetTypeId()
The interface ID.
void SetNode(Ptr< Node > node)
Set the node.
Ptr< Ipv6ExtensionRouting > GetExtensionRouting(uint8_t typeRouting)
Get the routing extension corresponding to typeRouting.
void Remove(Ptr< Ipv6ExtensionRouting > extensionRouting)
Remove a routing extension from this demux.
Ptr< Node > m_node
The node.
Ipv6ExtensionRoutingList_t m_extensionsRouting
List of IPv6 Routing Extensions supported.
Ipv6ExtensionRoutingHeader * GetExtensionRoutingHeaderPtr(uint8_t typeRouting)
Get a pointer to a new routing extension header corresponding to typeRouting.
~Ipv6ExtensionRoutingDemux() override
Destructor.
Header of IPv6 Extension Routing.
IPv6 Extension Routing.
uint8_t GetExtensionNumber() const override
Get the extension number.
static const uint8_t EXT_NUMBER
Routing extension number.
Ipv6ExtensionRouting()
Constructor.
~Ipv6ExtensionRouting() override
Destructor.
virtual Ipv6ExtensionRoutingHeader * GetExtensionRoutingHeaderPtr()
Get a pointer to a new routing extension header.
static TypeId GetTypeId()
Get the type identificator.
virtual uint8_t GetTypeRouting() const
Get the type of routing.
uint8_t Process(Ptr< Packet > &packet, uint8_t offset, const Ipv6Header &ipv6Header, Ipv6Address dst, uint8_t *nextHeader, bool &stopProcessing, bool &isDropped, Ipv6L3Protocol::DropReason &dropReason) override
Process method Called from Ipv6L3Protocol::Receive.
Packet header for IPv6.
Definition: ipv6-header.h:35
DropReason
Reason why a packet has been dropped.
A base class which provides memory management and object aggregation.
Definition: object.h:89
A template-based reference counting class.
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
a unique identifier for an interface.
Definition: type-id.h:59
Every class exported by the ns3 library is enclosed in the ns3 namespace.