PcapPlusPlus  Next
NdpLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "IcmpV6Layer.h"
4 #include "IpAddress.h"
5 #include "Layer.h"
6 #include "MacAddress.h"
7 #include "TLVData.h"
8 
9 #include <vector>
10 
12 
15 namespace pcpp
16 {
17 
19  enum class NDPNeighborOptionTypes : int
20  {
21  NDP_OPTION_SOURCE_LINK_LAYER = 1,
22  NDP_OPTION_TARGET_LINK_LAYER = 2,
23  NDP_OPTION_PREFIX_INFORMATION = 3,
24  NDP_OPTION_REDIRECTED_HEADER = 4,
25  NDP_OPTION_MTU = 5,
26  NDP_OPTION_UNKNOWN = 255
27  };
28 
32  class NdpOption : public TLVRecord<uint8_t, uint8_t>
33  {
34  public:
37  explicit NdpOption(uint8_t* optionRawData) : TLVRecord(optionRawData)
38  {}
39 
41  ~NdpOption() override = default;
42 
46  {
47  if (m_Data == nullptr)
48  return NDPNeighborOptionTypes::NDP_OPTION_UNKNOWN;
49 
50  return static_cast<NDPNeighborOptionTypes>(m_Data->recordType);
51  }
52 
53  // implement abstract methods
54 
55  size_t getTotalSize() const override
56  {
57  if (m_Data == nullptr)
58  return 0;
59 
60  return static_cast<size_t>(m_Data->recordLen) * 8;
61  }
62 
63  size_t getDataSize() const override
64  {
65  if (m_Data == nullptr)
66  {
67  return 0;
68  }
69 
70  // length value is stored in units of 8 octets
71  return static_cast<size_t>(m_Data->recordLen) * 8 - (2 * sizeof(uint8_t));
72  }
73  };
74 
79  {
80  public:
87  NdpOptionBuilder(NDPNeighborOptionTypes optionType, const uint8_t* optionValue, uint8_t optionValueLen)
88  : TLVRecordBuilder((uint8_t)optionType, optionValue, optionValueLen)
89  {}
90 
94  NdpOption build() const;
95  };
96 
99  class NDPLayerBase : public IcmpV6Layer
100  {
101  public:
102  ~NDPLayerBase() override = default;
103 
105  size_t getNdpOptionCount() const;
106 
112 
116 
123 
129  NdpOption addNdpOption(const NdpOptionBuilder& optionBuilder);
130 
135 
136  protected:
137  NDPLayerBase() = default;
138 
139  NDPLayerBase(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
140  : IcmpV6Layer(data, dataLen, prevLayer, packet)
141  {}
142 
143  private:
144  TLVRecordReader<NdpOption> m_OptionReader;
145 
146  virtual size_t getNdpHeaderLen() const = 0;
147  virtual uint8_t* getNdpOptionsBasePtr() const
148  {
149  return m_Data + getNdpHeaderLen();
150  };
151  NdpOption addNdpOptionAt(const NdpOptionBuilder& optionBuilder, int offset);
152  };
153 
157  {
158  public:
161 #pragma pack(push, 1)
163  {
165  uint32_t reserved;
167  uint8_t targetIP[16];
168  };
169 #pragma pack(pop)
170 
176  NDPNeighborSolicitationLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
177  : NDPLayerBase(data, dataLen, prevLayer, packet)
178  {}
179 
184  static bool isDataValid(const uint8_t* data, size_t dataLen)
185  {
186  return data != nullptr && dataLen >= sizeof(ndpneighborsolicitationhdr);
187  }
188 
192  NDPNeighborSolicitationLayer(uint8_t code, const IPv6Address& targetIP);
193 
198  NDPNeighborSolicitationLayer(uint8_t code, const IPv6Address& targetIP, const MacAddress& srcMac);
199 
200  ~NDPNeighborSolicitationLayer() override = default;
201 
204  {
205  return IPv6Address(getNdpHeader()->targetIP);
206  };
207 
210  bool hasLinkLayerAddress() const;
211 
215 
216  std::string toString() const override;
217 
218  private:
219  void initLayer(uint8_t code, const IPv6Address& targetIP);
220  ndpneighborsolicitationhdr* getNdpHeader() const
221  {
222  return reinterpret_cast<ndpneighborsolicitationhdr*>(m_Data);
223  }
224  size_t getNdpHeaderLen() const override
225  {
226  return sizeof(ndpneighborsolicitationhdr);
227  };
228  };
229 
233  {
234  public:
237 #pragma pack(push, 1)
239  {
240 #if (BYTE_ORDER == LITTLE_ENDIAN)
241  uint32_t
243  reserved : 5,
245  override : 1,
250  router : 1,
252  reserved2 : 24;
253 #else
254  uint32_t
256  router : 1,
259  solicited : 1,
261  override : 1,
263  reserved : 29;
264 #endif
266  uint8_t targetIP[16];
267  };
268 #pragma pack(pop)
269 
275  NDPNeighborAdvertisementLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
276  : NDPLayerBase(data, dataLen, prevLayer, packet)
277  {}
278 
283  static bool isDataValid(const uint8_t* data, size_t dataLen)
284  {
285  return data != nullptr && dataLen >= sizeof(ndpneighboradvertisementhdr);
286  }
287 
296  NDPNeighborAdvertisementLayer(uint8_t code, const IPv6Address& targetIP, const MacAddress& targetMac,
297  bool routerFlag, bool unicastFlag, bool overrideFlag);
298 
306  NDPNeighborAdvertisementLayer(uint8_t code, const IPv6Address& targetIP, bool routerFlag, bool unicastFlag,
307  bool overrideFlag);
308 
309  ~NDPNeighborAdvertisementLayer() override = default;
310 
313 
316  {
317  return IPv6Address(getNdpHeader()->targetIP);
318  }
319 
321  bool hasTargetMacInfo() const;
322 
324  bool getRouterFlag() const
325  {
326  return getNdpHeader()->router;
327  }
328 
330  bool getUnicastFlag() const
331  {
332  return getNdpHeader()->solicited;
333  }
334 
336  bool getOverrideFlag() const
337  {
338  return getNdpHeader()->override;
339  }
340 
341  std::string toString() const override;
342 
343  private:
344  void initLayer(uint8_t code, const IPv6Address& targetIP, bool routerFlag, bool unicastFlag, bool overrideFlag);
345  ndpneighboradvertisementhdr* getNdpHeader() const
346  {
347  return reinterpret_cast<ndpneighboradvertisementhdr*>(m_Data);
348  }
349  size_t getNdpHeaderLen() const override
350  {
351  return sizeof(ndpneighboradvertisementhdr);
352  };
353  };
354 
355 } // namespace pcpp
Definition: IpAddress.h:165
Definition: IcmpV6Layer.h:124
Definition: Layer.h:116
Definition: MacAddress.h:24
Definition: NdpLayer.h:100
NdpOption getFirstNdpOption() const
size_t getNdpOptionCount() const
bool removeAllNdpOptions()
NdpOption getNdpOption(NDPNeighborOptionTypes option) const
NdpOption addNdpOption(const NdpOptionBuilder &optionBuilder)
NdpOption getNextNdpOption(NdpOption &option) const
Definition: NdpLayer.h:233
IPv6Address getTargetIP() const
Definition: NdpLayer.h:315
NDPNeighborAdvertisementLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: NdpLayer.h:275
std::string toString() const override
bool getRouterFlag() const
Definition: NdpLayer.h:324
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: NdpLayer.h:283
NDPNeighborAdvertisementLayer(uint8_t code, const IPv6Address &targetIP, const MacAddress &targetMac, bool routerFlag, bool unicastFlag, bool overrideFlag)
NDPNeighborAdvertisementLayer(uint8_t code, const IPv6Address &targetIP, bool routerFlag, bool unicastFlag, bool overrideFlag)
bool getUnicastFlag() const
Definition: NdpLayer.h:330
bool getOverrideFlag() const
Definition: NdpLayer.h:336
Definition: NdpLayer.h:157
NDPNeighborSolicitationLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: NdpLayer.h:176
IPv6Address getTargetIP() const
Definition: NdpLayer.h:203
NDPNeighborSolicitationLayer(uint8_t code, const IPv6Address &targetIP)
MacAddress getLinkLayerAddress() const
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: NdpLayer.h:184
std::string toString() const override
NDPNeighborSolicitationLayer(uint8_t code, const IPv6Address &targetIP, const MacAddress &srcMac)
Definition: NdpLayer.h:79
NdpOption build() const
NdpOptionBuilder(NDPNeighborOptionTypes optionType, const uint8_t *optionValue, uint8_t optionValueLen)
Definition: NdpLayer.h:87
Definition: NdpLayer.h:33
NDPNeighborOptionTypes getNdpOptionType() const
Definition: NdpLayer.h:45
~NdpOption() override=default
A d'tor for this class, currently does nothing.
NdpOption(uint8_t *optionRawData)
Definition: NdpLayer.h:37
size_t getDataSize() const override
Definition: NdpLayer.h:63
size_t getTotalSize() const override
Definition: NdpLayer.h:55
Definition: Packet.h:48
Definition: TLVData.h:357
Definition: TLVData.h:19
Definition: TLVData.h:204
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
NDPNeighborOptionTypes
An enum representing the available option types for Neighbor Discovery in IPv6 (see RFC 4861)
Definition: NdpLayer.h:20
uint32_t override
Flag indicating that this entry should override the old one.
Definition: NdpLayer.h:245
uint8_t targetIP[16]
Target address - Either source address of advertisement or address for requested MAC.
Definition: NdpLayer.h:266
uint32_t router
Flag indicating that the advertisement is sent by a router.
Definition: NdpLayer.h:250
uint32_t reserved
Unused field.
Definition: NdpLayer.h:243
uint32_t reserved2
Unused field.
Definition: NdpLayer.h:252
uint32_t reserved
Reserved.
Definition: NdpLayer.h:165
uint8_t targetIP[16]
Target address - Target address of solicitation message.
Definition: NdpLayer.h:167
Definition: IcmpV6Layer.h:96