PcapPlusPlus  Next
ArpLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 #include "IpAddress.h"
5 #include "MacAddress.h"
6 #include "DeprecationUtils.h"
7 
9 
12 namespace pcpp
13 {
16 #pragma pack(push, 1)
17  struct arphdr
18  {
20  uint16_t hardwareType;
22  uint16_t protocolType;
24  uint8_t hardwareSize;
27  uint8_t protocolSize;
30  uint16_t opcode;
32  uint8_t senderMacAddr[6];
34  uint32_t senderIpAddr;
36  uint8_t targetMacAddr[6];
38  uint32_t targetIpAddr;
39  };
40 #pragma pack(pop)
41  static_assert(sizeof(arphdr) == 28, "arphdr size is not 28 bytes");
42 
44  enum ArpOpcode
45  {
46  ARP_REQUEST = 0x0001,
47  ARP_REPLY = 0x0002
48  };
49 
51  enum class ArpMessageType
52  {
53  Unknown,
54  Request,
55  Reply,
58  };
59 
63  struct ArpRequest
64  {
65  MacAddress senderMacAddr;
66  IPv4Address senderIpAddr;
67  IPv4Address targetIpAddr;
68 
73  ArpRequest(MacAddress const& senderMacAddress, IPv4Address const& senderIPAddress,
74  IPv4Address const& targetIPAddress)
75  : senderMacAddr(senderMacAddress), senderIpAddr(senderIPAddress), targetIpAddr(targetIPAddress) {};
76  };
77 
82  struct ArpReply
83  {
84  MacAddress senderMacAddr;
85  IPv4Address senderIpAddr;
86  MacAddress targetMacAddr;
87  IPv4Address targetIpAddr;
88 
95  ArpReply(MacAddress const& senderMacAddress, IPv4Address const& senderIPAddress,
96  MacAddress const& targetMacAddress, IPv4Address const& targetIPAddress)
97  : senderMacAddr(senderMacAddress), senderIpAddr(senderIPAddress), targetMacAddr(targetMacAddress),
98  targetIpAddr(targetIPAddress) {};
99  };
100 
110  {
111  MacAddress senderMacAddr;
112  IPv4Address senderIpAddr;
113 
119  GratuitousArpRequest(MacAddress const& senderMacAddress, IPv4Address const& senderIPAddress)
120  : senderMacAddr(senderMacAddress), senderIpAddr(senderIPAddress) {};
121  };
122 
128  {
129  MacAddress senderMacAddr;
130  IPv4Address senderIpAddr;
131 
137  GratuitousArpReply(MacAddress const& senderMacAddress, IPv4Address const& senderIPAddress)
138  : senderMacAddr(senderMacAddress), senderIpAddr(senderIPAddress) {};
139  };
140 
143  class ArpLayer : public Layer
144  {
145  public:
151  ArpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
152  : Layer(data, dataLen, prevLayer, packet, ARP)
153  {
154  m_DataLen = sizeof(arphdr);
155  }
156 
165  ArpLayer(ArpOpcode opCode, const MacAddress& senderMacAddr, const IPv4Address& senderIpAddr,
166  const MacAddress& targetMacAddr, const IPv4Address& targetIpAddr);
167 
176  PCPP_DEPRECATED("This constructor has been deprecated. Please use one of the other overloads.")
177  ArpLayer(ArpOpcode opCode, const MacAddress& senderMacAddr, const MacAddress& targetMacAddr,
178  const IPv4Address& senderIpAddr, const IPv4Address& targetIpAddr);
179 
182  explicit ArpLayer(ArpRequest const& arpRequest);
183 
186  explicit ArpLayer(ArpReply const& arpReply);
187 
190  explicit ArpLayer(GratuitousArpRequest const& gratuitousArpRequest);
191 
194  explicit ArpLayer(GratuitousArpReply const& gratuitousArpReply);
195 
196  ~ArpLayer() override = default;
197 
201  inline arphdr* getArpHeader() const
202  {
203  return reinterpret_cast<arphdr*>(m_Data);
204  }
205 
210 
214  {
215  return MacAddress(getArpHeader()->senderMacAddr);
216  }
217 
221  {
222  return MacAddress(getArpHeader()->targetMacAddr);
223  }
224 
228  {
229  return getArpHeader()->senderIpAddr;
230  }
231 
235  {
236  return getArpHeader()->targetIpAddr;
237  }
238 
239  // implement abstract methods
240 
242  void parseNextLayer() override
243  {}
244 
246  size_t getHeaderLen() const override
247  {
248  return sizeof(arphdr);
249  }
250 
256  void computeCalculateFields() override;
257 
261 
263  bool isRequest() const;
264 
266  bool isReply() const;
267 
268  std::string toString() const override;
269 
271  {
272  return OsiModelNetworkLayer;
273  }
274  };
275 
276 } // namespace pcpp
Definition: ArpLayer.h:144
ArpOpcode getOpcode() const
ArpMessageType getMessageType() const
Attempts to determine the ARP message type based on the header signature.
arphdr * getArpHeader() const
Definition: ArpLayer.h:201
IPv4Address getTargetIpAddr() const
Definition: ArpLayer.h:234
void parseNextLayer() override
Does nothing for this layer (ArpLayer is always last)
Definition: ArpLayer.h:242
bool isReply() const
Is this packet an ARP reply?
size_t getHeaderLen() const override
Definition: ArpLayer.h:246
MacAddress getTargetMacAddress() const
Definition: ArpLayer.h:220
void computeCalculateFields() override
bool isRequest() const
Is this packet an ARP request?
ArpLayer(ArpOpcode opCode, const MacAddress &senderMacAddr, const IPv4Address &senderIpAddr, const MacAddress &targetMacAddr, const IPv4Address &targetIpAddr)
A constructor that creates an ARP header.
IPv4Address getSenderIpAddr() const
Definition: ArpLayer.h:227
std::string toString() const override
ArpLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: ArpLayer.h:151
OsiModelLayer getOsiModelLayer() const override
Definition: ArpLayer.h:270
MacAddress getSenderMacAddress() const
Definition: ArpLayer.h:213
Definition: IpAddress.h:28
Definition: Layer.h:60
Definition: MacAddress.h:21
Definition: Packet.h:22
The main namespace for the PcapPlusPlus lib.
ArpOpcode
An enum for ARP message type.
Definition: ArpLayer.h:45
@ ARP_REQUEST
ARP request.
Definition: ArpLayer.h:46
@ ARP_REPLY
ARP reply (response)
Definition: ArpLayer.h:47
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelNetworkLayer
Network layer (layer 3)
Definition: ProtocolType.h:231
const ProtocolType ARP
ARP protocol.
Definition: ProtocolType.h:50
ArpMessageType
An enum representing the ARP message type.
Definition: ArpLayer.h:52
@ Request
ARP request.
@ GratuitousRequest
Gratuitous ARP request.
@ GratuitousReply
Gratuitous ARP reply.
@ Unknown
Unknown ARP message type.
A struct representing the build data for an ARP reply.
Definition: ArpLayer.h:83
ArpReply(MacAddress const &senderMacAddress, IPv4Address const &senderIPAddress, MacAddress const &targetMacAddress, IPv4Address const &targetIPAddress)
Construct a new Arp Reply object.
Definition: ArpLayer.h:95
A struct representing the build data for an ARP request.
Definition: ArpLayer.h:64
ArpRequest(MacAddress const &senderMacAddress, IPv4Address const &senderIPAddress, IPv4Address const &targetIPAddress)
Construct a new Arp Request object.
Definition: ArpLayer.h:73
A struct representing the build data a gratuitous ARP reply.
Definition: ArpLayer.h:128
GratuitousArpReply(MacAddress const &senderMacAddress, IPv4Address const &senderIPAddress)
Construct a new Gratuitous Arp Reply object.
Definition: ArpLayer.h:137
A struct representing the build data for a gratuitous ARP request.
Definition: ArpLayer.h:110
GratuitousArpRequest(MacAddress const &senderMacAddress, IPv4Address const &senderIPAddress)
Construct a new Gratuitous Arp Request object.
Definition: ArpLayer.h:119
Definition: ArpLayer.h:18
uint32_t targetIpAddr
Target protocol address (TPA)
Definition: ArpLayer.h:38
uint8_t protocolSize
Definition: ArpLayer.h:27
uint16_t opcode
Definition: ArpLayer.h:30
uint16_t hardwareType
Hardware type (HTYPE)
Definition: ArpLayer.h:20
uint8_t targetMacAddr[6]
Target hardware address (THA)
Definition: ArpLayer.h:36
uint32_t senderIpAddr
Sender protocol address (SPA)
Definition: ArpLayer.h:34
uint8_t hardwareSize
Hardware address length (HLEN). For IPv4, this has the value 0x0800.
Definition: ArpLayer.h:24
uint8_t senderMacAddr[6]
Sender hardware address (SHA)
Definition: ArpLayer.h:32
uint16_t protocolType
Protocol type (PTYPE). The permitted PTYPE values share a numbering space with those for EtherType.
Definition: ArpLayer.h:22