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 
52  virtual ~IPv6Extension();
53 
56  {
57  return m_NextHeader;
58  }
59 
60  protected:
61  struct ipv6_ext_base_header
62  {
63  uint8_t nextHeader;
64  uint8_t headerLen;
65  };
66 
67  // protected c'tor
68  IPv6Extension(IDataContainer* dataContainer, size_t offset)
69  : m_NextHeader(nullptr), m_ExtType(IPv6ExtensionUnknown), m_DataContainer(dataContainer), m_Offset(offset),
70  m_ShadowData(nullptr)
71  {}
72 
73  // protected empty c'tor
74  IPv6Extension()
75  : m_NextHeader(nullptr), m_ExtType(IPv6ExtensionUnknown), m_DataContainer(nullptr), m_Offset(0),
76  m_ShadowData(nullptr)
77  {}
78 
79  // protected assignment operator
80  IPv6Extension& operator=(const IPv6Extension& other);
81 
82  uint8_t* getDataPtr() const;
83 
84  void initShadowPtr(size_t size);
85 
86  ipv6_ext_base_header* getBaseHeader() const
87  {
88  return (ipv6_ext_base_header*)getDataPtr();
89  }
90 
91  void setNextHeader(IPv6Extension* nextHeader)
92  {
93  m_NextHeader = nextHeader;
94  }
95 
96  IPv6Extension* m_NextHeader;
97  IPv6ExtensionType m_ExtType;
98 
99  private:
100  IDataContainer* m_DataContainer;
101  size_t m_Offset;
102  uint8_t* m_ShadowData;
103  };
104 
108  {
109  friend class IPv6Layer;
110 
111  public:
115  {
117  uint8_t nextHeader;
119  uint8_t headerLen;
124  uint32_t id;
125  };
126 
132  IPv6FragmentationHeader(uint32_t fragId, uint16_t fragOffset, bool lastFragment);
133 
138  {
139  return (ipv6_frag_header*)getDataPtr();
140  }
141 
143  bool isFirstFragment() const;
144 
146  bool isLastFragment() const;
147 
149  bool isMoreFragments() const;
150 
152  uint16_t getFragmentOffset() const;
153 
154  private:
155  IPv6FragmentationHeader(IDataContainer* dataContainer, size_t offset) : IPv6Extension(dataContainer, offset)
156  {
157  m_ExtType = IPv6Fragmentation;
158  }
159  };
160 
165  {
166  friend class IPv6Layer;
167 
168  public:
173  class IPv6Option : public TLVRecord<uint8_t, uint8_t>
174  {
175  public:
176  static const uint8_t Pad0OptionType = 0;
177  static const uint8_t PadNOptionType = 1;
178 
181  explicit IPv6Option(uint8_t* optionRawData) : TLVRecord(optionRawData)
182  {}
183 
186  {}
187 
192  static bool canAssign(const uint8_t* recordRawData, size_t tlvDataLen)
193  {
194  auto data = (TLVRawData*)recordRawData;
195  if (data == nullptr)
196  return false;
197 
198  if (tlvDataLen < sizeof(TLVRawData::recordType))
199  return false;
200 
201  if (data->recordType == Pad0OptionType)
202  return true;
203 
204  return TLVRecord<uint8_t, uint8_t>::canAssign(recordRawData, tlvDataLen);
205  }
206 
207  // implement abstract methods
208 
209  size_t getTotalSize() const
210  {
211  if (m_Data == nullptr)
212  return 0;
213 
214  if (m_Data->recordType == Pad0OptionType)
215  return sizeof(uint8_t);
216 
217  return (size_t)(m_Data->recordLen + sizeof(uint16_t));
218  }
219 
220  size_t getDataSize() const
221  {
222  if (m_Data == nullptr || m_Data->recordType == Pad0OptionType)
223  return 0;
224 
225  return (size_t)m_Data->recordLen;
226  }
227  };
228 
233  {
234  public:
241  IPv6TLVOptionBuilder(uint8_t optType, const uint8_t* optValue, uint8_t optValueLen)
242  : TLVRecordBuilder(optType, optValue, optValueLen)
243  {}
244 
249  IPv6TLVOptionBuilder(uint8_t optType, uint8_t optValue) : TLVRecordBuilder(optType, optValue)
250  {}
251 
256  IPv6TLVOptionBuilder(uint8_t optType, uint16_t optValue) : TLVRecordBuilder(optType, optValue)
257  {}
258 
263  {}
264 
268  {
269  TLVRecordBuilder::operator=(other);
270  return *this;
271  }
272 
275  IPv6Option build() const;
276  };
277 
282  IPv6Option getOption(uint8_t optionType) const;
283 
287 
294 
296  size_t getOptionCount() const;
297 
298  protected:
300  explicit IPv6TLVOptionHeader(const std::vector<IPv6TLVOptionBuilder>& options);
301 
302  IPv6TLVOptionHeader(IDataContainer* dataContainer, size_t offset);
303 
304  private:
305  TLVRecordReader<IPv6Option> m_OptionReader;
306  };
307 
312  {
313  friend class IPv6Layer;
314 
315  public:
320  explicit IPv6HopByHopHeader(const std::vector<IPv6TLVOptionBuilder>& options) : IPv6TLVOptionHeader(options)
321  {
322  m_ExtType = IPv6HopByHop;
323  }
324 
325  private:
326  IPv6HopByHopHeader(IDataContainer* dataContainer, size_t offset) : IPv6TLVOptionHeader(dataContainer, offset)
327  {
328  m_ExtType = IPv6HopByHop;
329  }
330  };
331 
336  {
337  friend class IPv6Layer;
338 
339  public:
344  explicit IPv6DestinationHeader(const std::vector<IPv6TLVOptionBuilder>& options) : IPv6TLVOptionHeader(options)
345  {
346  m_ExtType = IPv6Destination;
347  }
348 
349  private:
350  IPv6DestinationHeader(IDataContainer* dataContainer, size_t offset) : IPv6TLVOptionHeader(dataContainer, offset)
351  {
352  m_ExtType = IPv6Destination;
353  }
354  };
355 
359  {
360  friend class IPv6Layer;
361 
362  public:
366  {
368  uint8_t nextHeader;
370  uint8_t headerLen;
372  uint8_t routingType;
374  uint8_t segmentsLeft;
375  };
376 
384  IPv6RoutingHeader(uint8_t routingType, uint8_t segmentsLeft, const uint8_t* additionalRoutingData,
385  size_t additionalRoutingDataLen);
386 
391  {
392  return (ipv6_routing_header*)getDataPtr();
393  }
394 
397  uint8_t* getRoutingAdditionalData() const;
398 
401 
413 
414  private:
415  IPv6RoutingHeader(IDataContainer* dataContainer, size_t offset) : IPv6Extension(dataContainer, offset)
416  {
417  m_ExtType = IPv6Routing;
418  }
419  };
420 
425  {
426  friend class IPv6Layer;
427 
428  public:
432  {
434  uint8_t nextHeader;
438  uint8_t headerLen;
440  uint16_t reserved;
445  uint32_t sequenceNumber;
446  };
447 
457  IPv6AuthenticationHeader(uint32_t securityParametersIndex, uint32_t sequenceNumber,
458  const uint8_t* integrityCheckValue, size_t integrityCheckValueLen);
459 
464  {
465  return (ipv6_authentication_header*)getDataPtr();
466  }
467 
470  uint8_t* getIntegrityCheckValue() const;
471 
474 
475  // overridden methods
476 
480  size_t getExtensionLen() const override
481  {
482  return 4 * (getBaseHeader()->headerLen + 2);
483  }
484 
485  private:
486  IPv6AuthenticationHeader(IDataContainer* dataContainer, size_t offset) : IPv6Extension(dataContainer, offset)
487  {
488  m_ExtType = IPv6AuthenticationHdr;
489  }
490  };
491 
492 } // namespace pcpp
Definition: Layer.h:19
Definition: IpAddress.h:156
Definition: IPv6Extensions.h:425
size_t getIntegrityCheckValueLength() const
size_t getExtensionLen() const override
Definition: IPv6Extensions.h:480
uint8_t * getIntegrityCheckValue() const
ipv6_authentication_header * getAuthHeader() const
Definition: IPv6Extensions.h:463
IPv6AuthenticationHeader(uint32_t securityParametersIndex, uint32_t sequenceNumber, const uint8_t *integrityCheckValue, size_t integrityCheckValueLen)
Definition: IPv6Extensions.h:336
IPv6DestinationHeader(const std::vector< IPv6TLVOptionBuilder > &options)
Definition: IPv6Extensions.h:344
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:55
IPv6ExtensionType getExtensionType() const
Definition: IPv6Extensions.h:46
virtual size_t getExtensionLen() const
Definition: IPv6Extensions.h:40
Definition: IPv6Extensions.h:108
ipv6_frag_header * getFragHeader() const
Definition: IPv6Extensions.h:137
IPv6FragmentationHeader(uint32_t fragId, uint16_t fragOffset, bool lastFragment)
uint16_t getFragmentOffset() const
Definition: IPv6Extensions.h:312
IPv6HopByHopHeader(const std::vector< IPv6TLVOptionBuilder > &options)
Definition: IPv6Extensions.h:320
Definition: IPv6Layer.h:50
Definition: IPv6Extensions.h:359
ipv6_routing_header * getRoutingHeader() const
Definition: IPv6Extensions.h:390
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:174
IPv6Option(uint8_t *optionRawData)
Definition: IPv6Extensions.h:181
size_t getTotalSize() const
Definition: IPv6Extensions.h:209
size_t getDataSize() const
Definition: IPv6Extensions.h:220
~IPv6Option()
A d'tor for this class, currently does nothing.
Definition: IPv6Extensions.h:185
static bool canAssign(const uint8_t *recordRawData, size_t tlvDataLen)
Definition: IPv6Extensions.h:192
Definition: IPv6Extensions.h:233
IPv6TLVOptionBuilder(uint8_t optType, uint8_t optValue)
Definition: IPv6Extensions.h:249
IPv6TLVOptionBuilder(uint8_t optType, uint16_t optValue)
Definition: IPv6Extensions.h:256
IPv6TLVOptionBuilder & operator=(const IPv6TLVOptionBuilder &other)
Definition: IPv6Extensions.h:267
IPv6TLVOptionBuilder(const IPv6TLVOptionBuilder &other)
Definition: IPv6Extensions.h:262
IPv6TLVOptionBuilder(uint8_t optType, const uint8_t *optValue, uint8_t optValueLen)
Definition: IPv6Extensions.h:241
Definition: IPv6Extensions.h:165
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:357
Definition: TLVData.h:19
static bool canAssign(const uint8_t *recordRawData, size_t tlvDataLen)
Definition: TLVData.h:66
Definition: TLVData.h:204
The main namespace for the PcapPlusPlus lib.
uint8_t headerLen
Definition: IPv6Extensions.h:438
uint32_t sequenceNumber
A monotonic strictly increasing sequence number (incremented by 1 for every packet sent)
Definition: IPv6Extensions.h:445
uint8_t nextHeader
Next header type.
Definition: IPv6Extensions.h:434
uint16_t reserved
Reserved bytes, all zeros.
Definition: IPv6Extensions.h:440
uint32_t securityParametersIndex
Definition: IPv6Extensions.h:443
Definition: IPv6Extensions.h:115
uint8_t headerLen
Fragmentation header size is fixed 8 bytes, so len is always zero.
Definition: IPv6Extensions.h:119
uint16_t fragOffsetAndFlags
Definition: IPv6Extensions.h:122
uint32_t id
packet identification value. Needed for reassembly of the original packet
Definition: IPv6Extensions.h:124
uint8_t nextHeader
Next header type.
Definition: IPv6Extensions.h:117
Definition: IPv6Extensions.h:366
uint8_t segmentsLeft
Number of nodes this packet still has to visit before reaching its final destination.
Definition: IPv6Extensions.h:374
uint8_t nextHeader
Next header type.
Definition: IPv6Extensions.h:368
uint8_t routingType
A value representing the routing type.
Definition: IPv6Extensions.h:372
uint8_t headerLen
The length of this header, in multiples of 8 octets, not including the first 8 octets.
Definition: IPv6Extensions.h:370