PcapPlusPlus  Next
EthLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 #include "MacAddress.h"
5 #include <algorithm>
6 #include <iterator>
7 
9 
12 namespace pcpp
13 {
14 
17 #pragma pack(push, 1)
18  struct ether_header
19  {
21  uint8_t dstMac[6];
23  uint8_t srcMac[6];
25  uint16_t etherType;
26  };
27 #pragma pack(pop)
28  static_assert(sizeof(ether_header) == 14, "ether_header size is not 14 bytes");
29 
30  // Ethernet protocol ID's
31 
33 #define PCPP_ETHERTYPE_IP 0x0800
35 #define PCPP_ETHERTYPE_ARP 0x0806
37 #define PCPP_ETHERTYPE_ETHBRIDGE 0x6558
39 #define PCPP_ETHERTYPE_REVARP 0x8035
41 #define PCPP_ETHERTYPE_AT 0x809B
43 #define PCPP_ETHERTYPE_AARP 0x80F3
45 #define PCPP_ETHERTYPE_VLAN 0x8100
47 #define PCPP_ETHERTYPE_IPX 0x8137
49 #define PCPP_ETHERTYPE_IPV6 0x86dd
51 #define PCPP_ETHERTYPE_LOOPBACK 0x9000
53 #define PCPP_ETHERTYPE_PPPOED 0x8863
55 #define PCPP_ETHERTYPE_PPPOES 0x8864
57 #define PCPP_ETHERTYPE_MPLS 0x8847
59 #define PCPP_ETHERTYPE_PPP 0x880B
61 #define PCPP_ETHERTYPE_ROCEV1 0x8915
63 #define PCPP_ETHERTYPE_IEEE_802_1AD 0x88A8
65 #define PCPP_ETHERTYPE_WAKE_ON_LAN 0x0842
66 
69  class EthLayer : public Layer
70  {
71  public:
76  EthLayer(uint8_t* data, size_t dataLen, Packet* packet) : Layer(data, dataLen, nullptr, packet, Ethernet)
77  {}
78 
84  EthLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
85  : Layer(data, dataLen, prevLayer, packet, Ethernet)
86  {}
87 
93  EthLayer(const MacAddress& sourceMac, const MacAddress& destMac, uint16_t etherType = 0);
94 
95  ~EthLayer() override = default;
96 
100  inline ether_header* getEthHeader() const
101  {
102  return reinterpret_cast<ether_header*>(m_Data);
103  }
104 
107  inline MacAddress getSourceMac() const
108  {
109  return MacAddress(getEthHeader()->srcMac);
110  }
111 
114  inline void setSourceMac(const MacAddress& sourceMac)
115  {
116  sourceMac.copyTo(getEthHeader()->srcMac);
117  }
118 
121  inline MacAddress getDestMac() const
122  {
123  return MacAddress(getEthHeader()->dstMac);
124  }
125 
128  inline void setDestMac(const MacAddress& destMac)
129  {
130  destMac.copyTo(getEthHeader()->dstMac);
131  }
132 
133  // implement abstract methods
134 
137  void parseNextLayer() override;
138 
140  size_t getHeaderLen() const override
141  {
142  return sizeof(ether_header);
143  }
144 
146  void computeCalculateFields() override;
147 
148  std::string toString() const override;
149 
151  {
152  return OsiModelDataLinkLayer;
153  }
154 
159  static bool isDataValid(const uint8_t* data, size_t dataLen);
160 
165  {
167  static std::vector<FieldDescriptor> all()
168  {
169  auto result = Layer::SerializedFields::all();
170  std::initializer_list<FieldDescriptor> extra{ SrcMacAddress, DstMacAddress, EtherType };
171  std::copy(extra.begin(), extra.end(), std::back_inserter(result));
172  return result;
173  }
174 
177 
180 
183  };
184 
185  protected:
186  void serializeLayer(ObjectScope& serializer) const override;
187  };
188 
189 } // namespace pcpp
Definition: EthLayer.h:70
OsiModelLayer getOsiModelLayer() const override
Definition: EthLayer.h:150
std::string toString() const override
void serializeLayer(ObjectScope &serializer) const override
static bool isDataValid(const uint8_t *data, size_t dataLen)
EthLayer(const MacAddress &sourceMac, const MacAddress &destMac, uint16_t etherType=0)
void parseNextLayer() override
ether_header * getEthHeader() const
Definition: EthLayer.h:100
void setSourceMac(const MacAddress &sourceMac)
Definition: EthLayer.h:114
MacAddress getDestMac() const
Definition: EthLayer.h:121
MacAddress getSourceMac() const
Definition: EthLayer.h:107
size_t getHeaderLen() const override
Definition: EthLayer.h:140
void computeCalculateFields() override
Calculate ether_header::etherType for known protocols: IPv4, IPv6, ARP, VLAN.
EthLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: EthLayer.h:84
void setDestMac(const MacAddress &destMac)
Definition: EthLayer.h:128
EthLayer(uint8_t *data, size_t dataLen, Packet *packet)
Definition: EthLayer.h:76
Definition: Layer.h:117
Definition: MacAddress.h:24
void copyTo(uint8_t **arr) const
Definition: MacAddress.h:143
Definition: Serializers.h:230
Definition: Packet.h:49
const ProtocolType Ethernet
Ethernet protocol.
Definition: ProtocolType.h:48
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:420
@ OsiModelDataLinkLayer
Data link layer (layer 2)
Definition: ProtocolType.h:424
Definition: EthLayer.h:165
static std::vector< FieldDescriptor > all()
Definition: EthLayer.h:167
static const FieldDescriptor SrcMacAddress
Source MAC address, as a string.
Definition: EthLayer.h:176
static const FieldDescriptor DstMacAddress
Destination MAC address, as a string.
Definition: EthLayer.h:179
static const FieldDescriptor EtherType
EtherType, in host byte order (e.g. 2048 for IPv4)
Definition: EthLayer.h:182
Definition: Serializers.h:18
Definition: Layer.h:212
static std::vector< FieldDescriptor > all()
Definition: Layer.h:214
Definition: EthLayer.h:19
uint16_t etherType
EtherType.
Definition: EthLayer.h:25
uint8_t srcMac[6]
Source MAC.
Definition: EthLayer.h:23
uint8_t dstMac[6]
Destination MAC.
Definition: EthLayer.h:21