PcapPlusPlus  Next
IPv6Extensions.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 #include "IpAddress.h"
5 #include "Layer.h"
6 #include "TLVData.h"
7 
9 
12 namespace pcpp
13 {
18  {
19  friend class IPv6Layer;
20 
21  public:
24  {
37  };
38 
40  virtual size_t getExtensionLen() const
41  {
42  return 8 * (getBaseHeader()->headerLen + 1);
43  }
44 
47  {
48  return m_ExtType;
49  }
50 
51  const char* getExtensionTypeAsString() const;
52 
54  virtual ~IPv6Extension();
55 
58  {
59  return m_NextHeader;
60  }
61 
62  protected:
63  struct ipv6_ext_base_header
64  {
65  uint8_t nextHeader;
66  uint8_t headerLen;
67  };
68 
69  // protected c'tor
70  IPv6Extension(IDataContainer* dataContainer, size_t offset)
71  : m_NextHeader(nullptr), m_ExtType(IPv6ExtensionUnknown), m_DataContainer(dataContainer), m_Offset(offset),
72  m_ShadowData(nullptr)
73  {}
74 
75  // protected empty c'tor
76  IPv6Extension()
77  : m_NextHeader(nullptr), m_ExtType(IPv6ExtensionUnknown), m_DataContainer(nullptr), m_Offset(0),
78  m_ShadowData(nullptr)
79  {}
80 
81  // protected assignment operator
82  IPv6Extension& operator=(const IPv6Extension& other);
83 
84  uint8_t* getDataPtr() const;
85 
86  void initShadowPtr(size_t size);
87 
88  ipv6_ext_base_header* getBaseHeader() const
89  {
90  return reinterpret_cast<ipv6_ext_base_header*>(getDataPtr());
91  }
92 
93  void setNextHeader(IPv6Extension* nextHeader)
94  {
95  m_NextHeader = nextHeader;
96  }
97 
98  IPv6Extension* m_NextHeader;
99  IPv6ExtensionType m_ExtType;
100 
101  private:
102  IDataContainer* m_DataContainer;
103  size_t m_Offset;
104  uint8_t* m_ShadowData;
105  };
106 
110  {
111  friend class IPv6Layer;
112 
113  public:
117  {
119  uint8_t nextHeader;
121  uint8_t headerLen;
126  uint32_t id;
127  };
128 
134  IPv6FragmentationHeader(uint32_t fragId, uint16_t fragOffset, bool lastFragment);
135 
140  {
141  return reinterpret_cast<ipv6_frag_header*>(getDataPtr());
142  }
143 
145  bool isFirstFragment() const;
146 
148  bool isLastFragment() const;
149 
151  bool isMoreFragments() const;
152 
154  uint16_t getFragmentOffset() const;
155 
156  private:
157  IPv6FragmentationHeader(IDataContainer* dataContainer, size_t offset) : IPv6Extension(dataContainer, offset)
158  {
159  m_ExtType = IPv6Fragmentation;
160  }
161  };
162 
167  {
168  friend class IPv6Layer;
169 
170  public:
175  class IPv6Option : public TLVRecord<uint8_t, uint8_t>
176  {
177  public:
178  static const uint8_t Pad0OptionType = 0;
179  static const uint8_t PadNOptionType = 1;
180 
183  explicit IPv6Option(uint8_t* optionRawData) : TLVRecord(optionRawData)
184  {}
185 
188  {}
189 
194  static bool canAssign(const uint8_t* recordRawData, size_t tlvDataLen)
195  {
196  auto data = reinterpret_cast<TLVRawData const*>(recordRawData);
197  if (data == nullptr)
198  return false;
199 
200  if (tlvDataLen < sizeof(TLVRawData::recordType))
201  return false;
202 
203  if (data->recordType == Pad0OptionType)
204  return true;
205 
206  return TLVRecord<uint8_t, uint8_t>::canAssign(recordRawData, tlvDataLen);
207  }
208 
209  // implement abstract methods
210 
211  size_t getTotalSize() const
212  {
213  if (m_Data == nullptr)
214  return 0;
215 
216  if (m_Data->recordType == Pad0OptionType)
217  return sizeof(uint8_t);
218 
219  return (size_t)(m_Data->recordLen + sizeof(uint16_t));
220  }
221 
222  size_t getDataSize() const
223  {
224  if (m_Data == nullptr || m_Data->recordType == Pad0OptionType)
225  return 0;
226 
227  return (size_t)m_Data->recordLen;
228  }
229  };
230 
235  {
236  public:
243  IPv6TLVOptionBuilder(uint8_t optType, const uint8_t* optValue, uint8_t optValueLen)
244  : TLVRecordBuilder(optType, optValue, optValueLen)
245  {}
246 
251  IPv6TLVOptionBuilder(uint8_t optType, uint8_t optValue) : TLVRecordBuilder(optType, optValue)
252  {}
253 
258  IPv6TLVOptionBuilder(uint8_t optType, uint16_t optValue) : TLVRecordBuilder(optType, optValue)
259  {}
260 
265  {}
266 
270  {
271  TLVRecordBuilder::operator=(other);
272  return *this;
273  }
274 
277  IPv6Option build() const;
278  };
279 
284  IPv6Option getOption(uint8_t optionType) const;
285 
289 
296 
298  size_t getOptionCount() const;
299 
300  protected:
302  explicit IPv6TLVOptionHeader(const std::vector<IPv6TLVOptionBuilder>& options);
303 
304  IPv6TLVOptionHeader(IDataContainer* dataContainer, size_t offset);
305 
306  private:
307  TLVRecordReader<IPv6Option> m_OptionReader;
308  };
309 
314  {
315  friend class IPv6Layer;
316 
317  public:
322  explicit IPv6HopByHopHeader(const std::vector<IPv6TLVOptionBuilder>& options) : IPv6TLVOptionHeader(options)
323  {
324  m_ExtType = IPv6HopByHop;
325  }
326 
327  private:
328  IPv6HopByHopHeader(IDataContainer* dataContainer, size_t offset) : IPv6TLVOptionHeader(dataContainer, offset)
329  {
330  m_ExtType = IPv6HopByHop;
331  }
332  };
333 
338  {
339  friend class IPv6Layer;
340 
341  public:
346  explicit IPv6DestinationHeader(const std::vector<IPv6TLVOptionBuilder>& options) : IPv6TLVOptionHeader(options)
347  {
348  m_ExtType = IPv6Destination;
349  }
350 
351  private:
352  IPv6DestinationHeader(IDataContainer* dataContainer, size_t offset) : IPv6TLVOptionHeader(dataContainer, offset)
353  {
354  m_ExtType = IPv6Destination;
355  }
356  };
357 
361  {
362  friend class IPv6Layer;
363 
364  public:
368  {
370  uint8_t nextHeader;
372  uint8_t headerLen;
374  uint8_t routingType;
376  uint8_t segmentsLeft;
377  };
378 
386  IPv6RoutingHeader(uint8_t routingType, uint8_t segmentsLeft, const uint8_t* additionalRoutingData,
387  size_t additionalRoutingDataLen);
388 
393  {
394  return reinterpret_cast<ipv6_routing_header*>(getDataPtr());
395  }
396 
399  uint8_t* getRoutingAdditionalData() const;
400 
403 
415 
416  private:
417  IPv6RoutingHeader(IDataContainer* dataContainer, size_t offset) : IPv6Extension(dataContainer, offset)
418  {
419  m_ExtType = IPv6Routing;
420  }
421  };
422 
427  {
428  friend class IPv6Layer;
429 
430  public:
434  {
436  uint8_t nextHeader;
440  uint8_t headerLen;
442  uint16_t reserved;
447  uint32_t sequenceNumber;
448  };
449 
459  IPv6AuthenticationHeader(uint32_t securityParametersIndex, uint32_t sequenceNumber,
460  const uint8_t* integrityCheckValue, size_t integrityCheckValueLen);
461 
466  {
467  return reinterpret_cast<ipv6_authentication_header*>(getDataPtr());
468  }
469 
472  uint8_t* getIntegrityCheckValue() const;
473 
476 
477  // overridden methods
478 
482  size_t getExtensionLen() const override
483  {
484  return 4 * (getBaseHeader()->headerLen + 2);
485  }
486 
487  private:
488  IPv6AuthenticationHeader(IDataContainer* dataContainer, size_t offset) : IPv6Extension(dataContainer, offset)
489  {
490  m_ExtType = IPv6AuthenticationHdr;
491  }
492  };
493 
494 } // namespace pcpp
Definition: Layer.h:23
Definition: IpAddress.h:165
Definition: IPv6Extensions.h:427
size_t getIntegrityCheckValueLength() const
size_t getExtensionLen() const override
Definition: IPv6Extensions.h:482
uint8_t * getIntegrityCheckValue() const
ipv6_authentication_header * getAuthHeader() const
Definition: IPv6Extensions.h:465
IPv6AuthenticationHeader(uint32_t securityParametersIndex, uint32_t sequenceNumber, const uint8_t *integrityCheckValue, size_t integrityCheckValueLen)
Definition: IPv6Extensions.h:338
IPv6DestinationHeader(const std::vector< IPv6TLVOptionBuilder > &options)
Definition: IPv6Extensions.h:346
Definition: IPv6Extensions.h:18
IPv6ExtensionType
An enum representing all supported IPv6 extension types.
Definition: IPv6Extensions.h:24
@ IPv6HopByHop
Hop-By-Hop extension type.
Definition: IPv6Extensions.h:26
@ IPv6Routing
Routing extension type.
Definition: IPv6Extensions.h:28
@ IPv6Fragmentation
IPv6 fragmentation extension type.
Definition: IPv6Extensions.h:30
@ IPv6ExtensionUnknown
Unknown or unsupported extension type.
Definition: IPv6Extensions.h:36
@ IPv6Destination
Destination extension type.
Definition: IPv6Extensions.h:34
@ IPv6AuthenticationHdr
Authentication Header extension type.
Definition: IPv6Extensions.h:32
virtual ~IPv6Extension()
A destructor for this class.
IPv6Extension * getNextHeader() const
Definition: IPv6Extensions.h:57
IPv6ExtensionType getExtensionType() const
Definition: IPv6Extensions.h:46
virtual size_t getExtensionLen() const
Definition: IPv6Extensions.h:40
Definition: IPv6Extensions.h:110
ipv6_frag_header * getFragHeader() const
Definition: IPv6Extensions.h:139
IPv6FragmentationHeader(uint32_t fragId, uint16_t fragOffset, bool lastFragment)
uint16_t getFragmentOffset() const
Definition: IPv6Extensions.h:314
IPv6HopByHopHeader(const std::vector< IPv6TLVOptionBuilder > &options)
Definition: IPv6Extensions.h:322
Definition: IPv6Layer.h:52
Definition: IPv6Extensions.h:361
ipv6_routing_header * getRoutingHeader() const
Definition: IPv6Extensions.h:392
IPv6RoutingHeader(uint8_t routingType, uint8_t segmentsLeft, const uint8_t *additionalRoutingData, size_t additionalRoutingDataLen)
size_t getRoutingAdditionalDataLength() const
IPv6Address getRoutingAdditionalDataAsIPv6Address(size_t offset=0) const
uint8_t * getRoutingAdditionalData() const
Definition: IPv6Extensions.h:176
IPv6Option(uint8_t *optionRawData)
Definition: IPv6Extensions.h:183
size_t getTotalSize() const
Definition: IPv6Extensions.h:211
size_t getDataSize() const
Definition: IPv6Extensions.h:222
~IPv6Option()
A d'tor for this class, currently does nothing.
Definition: IPv6Extensions.h:187
static bool canAssign(const uint8_t *recordRawData, size_t tlvDataLen)
Definition: IPv6Extensions.h:194
Definition: IPv6Extensions.h:235
IPv6TLVOptionBuilder(uint8_t optType, uint8_t optValue)
Definition: IPv6Extensions.h:251
IPv6TLVOptionBuilder(uint8_t optType, uint16_t optValue)
Definition: IPv6Extensions.h:258
IPv6TLVOptionBuilder & operator=(const IPv6TLVOptionBuilder &other)
Definition: IPv6Extensions.h:269
IPv6TLVOptionBuilder(const IPv6TLVOptionBuilder &other)
Definition: IPv6Extensions.h:264
IPv6TLVOptionBuilder(uint8_t optType, const uint8_t *optValue, uint8_t optValueLen)
Definition: IPv6Extensions.h:243
Definition: IPv6Extensions.h:167
size_t getOptionCount() const
IPv6TLVOptionHeader(const std::vector< IPv6TLVOptionBuilder > &options)
A private c'tor to keep this object from being constructed.
IPv6Option getNextOption(IPv6Option &option) const
IPv6Option getOption(uint8_t optionType) const
IPv6Option getFirstOption() const
Definition: TLVData.h:374
Definition: TLVData.h:20
static bool canAssign(const uint8_t *recordRawData, size_t tlvDataLen)
Definition: TLVData.h:67
Definition: TLVData.h:219
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
uint8_t headerLen
Definition: IPv6Extensions.h:440
uint32_t sequenceNumber
A monotonic strictly increasing sequence number (incremented by 1 for every packet sent)
Definition: IPv6Extensions.h:447
uint8_t nextHeader
Next header type.
Definition: IPv6Extensions.h:436
uint16_t reserved
Reserved bytes, all zeros.
Definition: IPv6Extensions.h:442
uint32_t securityParametersIndex
Definition: IPv6Extensions.h:445
Definition: IPv6Extensions.h:117
uint8_t headerLen
Fragmentation header size is fixed 8 bytes, so len is always zero.
Definition: IPv6Extensions.h:121
uint16_t fragOffsetAndFlags
Definition: IPv6Extensions.h:124
uint32_t id
packet identification value. Needed for reassembly of the original packet
Definition: IPv6Extensions.h:126
uint8_t nextHeader
Next header type.
Definition: IPv6Extensions.h:119
Definition: IPv6Extensions.h:368
uint8_t segmentsLeft
Number of nodes this packet still has to visit before reaching its final destination.
Definition: IPv6Extensions.h:376
uint8_t nextHeader
Next header type.
Definition: IPv6Extensions.h:370
uint8_t routingType
A value representing the routing type.
Definition: IPv6Extensions.h:374
uint8_t headerLen
The length of this header, in multiples of 8 octets, not including the first 8 octets.
Definition: IPv6Extensions.h:372