PcapPlusPlus  Next
IPv6Layer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 #include "IPLayer.h"
5 #include "IPv6Extensions.h"
6 #include "IpAddress.h"
7 
9 
12 namespace pcpp
13 {
14 
17 #pragma pack(push, 1)
18  struct ip6_hdr
19  {
20 #if (BYTE_ORDER == LITTLE_ENDIAN)
22  uint8_t trafficClass : 4,
24  ipVersion : 4;
25 #else
27  uint8_t ipVersion : 4,
29  trafficClass : 4;
30 #endif
32  uint8_t flowLabel[3];
34  uint16_t payloadLength;
36  uint8_t nextHeader;
38  uint8_t hopLimit;
40  uint8_t ipSrc[16];
42  uint8_t ipDst[16];
43  };
44 #pragma pack(pop)
45  static_assert(sizeof(ip6_hdr) == 40, "ip6_hdr size is not 40 bytes");
46 
49  class IPv6Layer : public Layer, public IPLayer
50  {
51  public:
57  IPv6Layer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
58 
61 
65  IPv6Layer(const IPv6Address& srcIP, const IPv6Address& dstIP);
66 
68  IPv6Layer(const IPv6Layer& other);
69 
71  ~IPv6Layer() override;
72 
75  IPv6Layer& operator=(const IPv6Layer& other);
76 
81  {
82  return reinterpret_cast<ip6_hdr*>(m_Data);
83  }
84 
88  IPAddress getSrcIPAddress() const override
89  {
90  return getSrcIPv6Address();
91  }
92 
96  {
97  return getIPv6Header()->ipSrc;
98  }
99 
102  void setSrcIPv6Address(const IPv6Address& ipAddr)
103  {
104  ipAddr.copyTo(getIPv6Header()->ipSrc);
105  }
106 
109  void setDstIPv6Address(const IPv6Address& ipAddr)
110  {
111  ipAddr.copyTo(getIPv6Header()->ipDst);
112  }
113 
117  IPAddress getDstIPAddress() const override
118  {
119  return getDstIPv6Address();
120  }
121 
125  {
126  return getIPv6Header()->ipDst;
127  }
128 
130  size_t getExtensionCount() const;
131 
136  template <class TIPv6Extension> TIPv6Extension* getExtensionOfType() const;
137 
145  template <class TIPv6Extension> TIPv6Extension* addExtension(const TIPv6Extension& extensionHeader);
146 
149 
151  bool isFragment() const;
152 
157  static inline bool isDataValid(const uint8_t* data, size_t dataLen);
158 
159  // implement abstract methods
160 
171  void parseNextLayer() override;
172 
174  size_t getHeaderLen() const override
175  {
176  return sizeof(ip6_hdr) + m_ExtensionsLen;
177  }
178 
184  void computeCalculateFields() override;
185 
186  std::string toString() const override;
187 
189  {
190  return OsiModelNetworkLayer;
191  }
192 
193  private:
194  void initLayer();
195  void parseExtensions();
196  void deleteExtensions();
197 
198  IPv6Extension* m_FirstExtension;
199  IPv6Extension* m_LastExtension;
200  size_t m_ExtensionsLen;
201  };
202 
203  template <class TIPv6Extension> TIPv6Extension* IPv6Layer::getExtensionOfType() const
204  {
205  IPv6Extension* curExt = m_FirstExtension;
206  while (curExt != nullptr && dynamic_cast<TIPv6Extension*>(curExt) == nullptr)
207  curExt = curExt->getNextHeader();
208 
209  return static_cast<TIPv6Extension*>(curExt);
210  }
211 
212  template <class TIPv6Extension> TIPv6Extension* IPv6Layer::addExtension(const TIPv6Extension& extensionHeader)
213  {
214  int offsetToAddHeader = static_cast<int>(getHeaderLen());
215  if (!extendLayer(offsetToAddHeader, extensionHeader.getExtensionLen()))
216  {
217  return nullptr;
218  }
219 
220  TIPv6Extension* newHeader = new TIPv6Extension(this, static_cast<size_t>(offsetToAddHeader));
221  (*newHeader) = extensionHeader;
222 
223  if (m_FirstExtension != nullptr)
224  {
225  newHeader->getBaseHeader()->nextHeader = m_LastExtension->getBaseHeader()->nextHeader;
226  m_LastExtension->getBaseHeader()->nextHeader = newHeader->getExtensionType();
227  m_LastExtension->setNextHeader(newHeader);
228  m_LastExtension = newHeader;
229  }
230  else
231  {
232  m_FirstExtension = newHeader;
233  m_LastExtension = newHeader;
234  newHeader->getBaseHeader()->nextHeader = getIPv6Header()->nextHeader;
235  getIPv6Header()->nextHeader = newHeader->getExtensionType();
236  }
237 
238  m_ExtensionsLen += newHeader->getExtensionLen();
239 
240  return newHeader;
241  }
242 
243  // implementation of inline methods
244 
245  bool IPv6Layer::isDataValid(const uint8_t* data, size_t dataLen)
246  {
247  return data && dataLen >= sizeof(ip6_hdr);
248  }
249 
250 } // namespace pcpp
Definition: IpAddress.h:276
Definition: IPLayer.h:18
Definition: IpAddress.h:156
void copyTo(uint8_t **arr, size_t &length) const
Definition: IPv6Extensions.h:18
IPv6Extension * getNextHeader() const
Definition: IPv6Extensions.h:55
Definition: IPv6Layer.h:50
IPv6Address getSrcIPv6Address() const
Definition: IPv6Layer.h:95
IPv6Layer(const IPv6Address &srcIP, const IPv6Address &dstIP)
IPv6Layer(const IPv6Layer &other)
A copy constructor that copies the entire header from the other IPv6Layer (including IPv6 extensions)
void parseNextLayer() override
IPv6Address getDstIPv6Address() const
Definition: IPv6Layer.h:124
void removeAllExtensions()
Remove all IPv6 extensions in this layer.
TIPv6Extension * getExtensionOfType() const
Definition: IPv6Layer.h:203
void computeCalculateFields() override
OsiModelLayer getOsiModelLayer() const override
Definition: IPv6Layer.h:188
std::string toString() const override
bool isFragment() const
ip6_hdr * getIPv6Header() const
Definition: IPv6Layer.h:80
void setDstIPv6Address(const IPv6Address &ipAddr)
Definition: IPv6Layer.h:109
size_t getHeaderLen() const override
Definition: IPv6Layer.h:174
IPv6Layer & operator=(const IPv6Layer &other)
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: IPv6Layer.h:245
IPv6Layer()
A constructor that allocates a new IPv6 header with empty fields.
void setSrcIPv6Address(const IPv6Address &ipAddr)
Definition: IPv6Layer.h:102
IPAddress getSrcIPAddress() const override
Definition: IPv6Layer.h:88
IPv6Layer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
size_t getExtensionCount() const
TIPv6Extension * addExtension(const TIPv6Extension &extensionHeader)
Definition: IPv6Layer.h:212
~IPv6Layer() override
A destructor for this layer.
IPAddress getDstIPAddress() const override
Definition: IPv6Layer.h:117
Definition: Layer.h:60
Definition: Packet.h:22
The main namespace for the PcapPlusPlus lib.
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelNetworkLayer
Network layer (layer 3)
Definition: ProtocolType.h:231
Definition: IPv6Layer.h:19
uint8_t trafficClass
Traffic class.
Definition: IPv6Layer.h:22
uint8_t flowLabel[3]
Flow label.
Definition: IPv6Layer.h:32
uint8_t hopLimit
Replaces the time to live field of IPv4.
Definition: IPv6Layer.h:38
uint8_t ipSrc[16]
Source address.
Definition: IPv6Layer.h:40
uint16_t payloadLength
The size of the payload in octets, including any extension headers.
Definition: IPv6Layer.h:34
uint8_t ipVersion
IP version number, has the value of 6 for IPv6.
Definition: IPv6Layer.h:24
uint8_t nextHeader
Specifies the type of the next header (protocol). Must be one of IPProtocolTypes.
Definition: IPv6Layer.h:36
uint8_t ipDst[16]
Destination address.
Definition: IPv6Layer.h:42