A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
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
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
41namespace ns3
42{
43
56class Ipv6Extension : public Object
57{
58 public:
63 static TypeId GetTypeId();
64
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
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
559
564 void SetNode(Ptr<Node> node);
565
570 void Insert(Ptr<Ipv6ExtensionRouting> extensionRouting);
571
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
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
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.
Ptr< Packet > GetPartialPacket() const
Get the packet parts so far received.
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.
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.
std::list< std::tuple< Time, FragmentKey_t, Ipv6Header > >::iterator FragmentsTimeoutsListI_t
Container Iterator for fragment timeouts.
~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
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
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.