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 
183  NDPNeighborSolicitationLayer(uint8_t code, const IPv6Address& targetIP);
184 
189  NDPNeighborSolicitationLayer(uint8_t code, const IPv6Address& targetIP, const MacAddress& srcMac);
190 
191  ~NDPNeighborSolicitationLayer() override = default;
192 
195  {
196  return IPv6Address(getNdpHeader()->targetIP);
197  };
198 
201  bool hasLinkLayerAddress() const;
202 
206 
207  std::string toString() const override;
208 
209  private:
210  void initLayer(uint8_t code, const IPv6Address& targetIP);
211  ndpneighborsolicitationhdr* getNdpHeader() const
212  {
213  return reinterpret_cast<ndpneighborsolicitationhdr*>(m_Data);
214  }
215  size_t getNdpHeaderLen() const override
216  {
217  return sizeof(ndpneighborsolicitationhdr);
218  };
219  };
220 
224  {
225  public:
228 #pragma pack(push, 1)
230  {
231 #if (BYTE_ORDER == LITTLE_ENDIAN)
232  uint32_t
234  reserved : 5,
236  override : 1,
241  router : 1,
243  reserved2 : 24;
244 #else
245  uint32_t
247  router : 1,
250  solicited : 1,
252  override : 1,
254  reserved : 29;
255 #endif
257  uint8_t targetIP[16];
258  };
259 #pragma pack(pop)
260 
266  NDPNeighborAdvertisementLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
267  : NDPLayerBase(data, dataLen, prevLayer, packet)
268  {}
269 
278  NDPNeighborAdvertisementLayer(uint8_t code, const IPv6Address& targetIP, const MacAddress& targetMac,
279  bool routerFlag, bool unicastFlag, bool overrideFlag);
280 
288  NDPNeighborAdvertisementLayer(uint8_t code, const IPv6Address& targetIP, bool routerFlag, bool unicastFlag,
289  bool overrideFlag);
290 
291  ~NDPNeighborAdvertisementLayer() override = default;
292 
295 
298  {
299  return IPv6Address(getNdpHeader()->targetIP);
300  }
301 
303  bool hasTargetMacInfo() const;
304 
306  bool getRouterFlag() const
307  {
308  return getNdpHeader()->router;
309  }
310 
312  bool getUnicastFlag() const
313  {
314  return getNdpHeader()->solicited;
315  }
316 
318  bool getOverrideFlag() const
319  {
320  return getNdpHeader()->override;
321  }
322 
323  std::string toString() const override;
324 
325  private:
326  void initLayer(uint8_t code, const IPv6Address& targetIP, bool routerFlag, bool unicastFlag, bool overrideFlag);
327  ndpneighboradvertisementhdr* getNdpHeader() const
328  {
329  return reinterpret_cast<ndpneighboradvertisementhdr*>(m_Data);
330  }
331  size_t getNdpHeaderLen() const override
332  {
333  return sizeof(ndpneighboradvertisementhdr);
334  };
335  };
336 
337 } // namespace pcpp
Definition: IpAddress.h:156
Definition: IcmpV6Layer.h:124
Definition: Layer.h:60
Definition: MacAddress.h:21
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:224
IPv6Address getTargetIP() const
Definition: NdpLayer.h:297
NDPNeighborAdvertisementLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: NdpLayer.h:266
std::string toString() const override
bool getRouterFlag() const
Definition: NdpLayer.h:306
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:312
bool getOverrideFlag() const
Definition: NdpLayer.h:318
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:194
NDPNeighborSolicitationLayer(uint8_t code, const IPv6Address &targetIP)
MacAddress getLinkLayerAddress() const
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:22
Definition: TLVData.h:357
Definition: TLVData.h:19
Definition: TLVData.h:204
The main namespace for the PcapPlusPlus lib.
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:236
uint8_t targetIP[16]
Target address - Either source address of advertisement or address for requested MAC.
Definition: NdpLayer.h:257
uint32_t router
Flag indicating that the advertisement is sent by a router.
Definition: NdpLayer.h:241
uint32_t reserved
Unused field.
Definition: NdpLayer.h:234
uint32_t reserved2
Unused field.
Definition: NdpLayer.h:243
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