PcapPlusPlus  Next
EthLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 #include "MacAddress.h"
5 
7 
10 namespace pcpp
11 {
12 
15 #pragma pack(push, 1)
16  struct ether_header
17  {
19  uint8_t dstMac[6];
21  uint8_t srcMac[6];
23  uint16_t etherType;
24  };
25 #pragma pack(pop)
26  static_assert(sizeof(ether_header) == 14, "ether_header size is not 14 bytes");
27 
28  // Ethernet protocol ID's
29 
31 #define PCPP_ETHERTYPE_IP 0x0800
33 #define PCPP_ETHERTYPE_ARP 0x0806
35 #define PCPP_ETHERTYPE_ETHBRIDGE 0x6558
37 #define PCPP_ETHERTYPE_REVARP 0x8035
39 #define PCPP_ETHERTYPE_AT 0x809B
41 #define PCPP_ETHERTYPE_AARP 0x80F3
43 #define PCPP_ETHERTYPE_VLAN 0x8100
45 #define PCPP_ETHERTYPE_IPX 0x8137
47 #define PCPP_ETHERTYPE_IPV6 0x86dd
49 #define PCPP_ETHERTYPE_LOOPBACK 0x9000
51 #define PCPP_ETHERTYPE_PPPOED 0x8863
53 #define PCPP_ETHERTYPE_PPPOES 0x8864
55 #define PCPP_ETHERTYPE_MPLS 0x8847
57 #define PCPP_ETHERTYPE_PPP 0x880B
59 #define PCPP_ETHERTYPE_ROCEV1 0x8915
61 #define PCPP_ETHERTYPE_IEEE_802_1AD 0x88A8
63 #define PCPP_ETHERTYPE_WAKE_ON_LAN 0x0842
64 
67  class EthLayer : public Layer
68  {
69  public:
74  EthLayer(uint8_t* data, size_t dataLen, Packet* packet) : Layer(data, dataLen, nullptr, packet, Ethernet)
75  {}
76 
82  EthLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
83  : Layer(data, dataLen, prevLayer, packet, Ethernet)
84  {}
85 
91  EthLayer(const MacAddress& sourceMac, const MacAddress& destMac, uint16_t etherType = 0);
92 
93  ~EthLayer() override = default;
94 
98  inline ether_header* getEthHeader() const
99  {
100  return reinterpret_cast<ether_header*>(m_Data);
101  }
102 
105  inline MacAddress getSourceMac() const
106  {
107  return MacAddress(getEthHeader()->srcMac);
108  }
109 
112  inline void setSourceMac(const MacAddress& sourceMac)
113  {
114  sourceMac.copyTo(getEthHeader()->srcMac);
115  }
116 
119  inline MacAddress getDestMac() const
120  {
121  return MacAddress(getEthHeader()->dstMac);
122  }
123 
126  inline void setDestMac(const MacAddress& destMac)
127  {
128  destMac.copyTo(getEthHeader()->dstMac);
129  }
130 
131  // implement abstract methods
132 
135  void parseNextLayer() override;
136 
138  size_t getHeaderLen() const override
139  {
140  return sizeof(ether_header);
141  }
142 
144  void computeCalculateFields() override;
145 
146  std::string toString() const override;
147 
149  {
150  return OsiModelDataLinkLayer;
151  }
152 
157  static bool isDataValid(const uint8_t* data, size_t dataLen);
158  };
159 
160 } // namespace pcpp
Definition: EthLayer.h:68
OsiModelLayer getOsiModelLayer() const override
Definition: EthLayer.h:148
std::string toString() 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:98
void setSourceMac(const MacAddress &sourceMac)
Definition: EthLayer.h:112
MacAddress getDestMac() const
Definition: EthLayer.h:119
MacAddress getSourceMac() const
Definition: EthLayer.h:105
size_t getHeaderLen() const override
Definition: EthLayer.h:138
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:82
void setDestMac(const MacAddress &destMac)
Definition: EthLayer.h:126
EthLayer(uint8_t *data, size_t dataLen, Packet *packet)
Definition: EthLayer.h:74
Definition: Layer.h:60
Definition: MacAddress.h:21
void copyTo(uint8_t **arr) const
Definition: MacAddress.h:130
Definition: Packet.h:22
The main namespace for the PcapPlusPlus lib.
const ProtocolType Ethernet
Ethernet protocol.
Definition: ProtocolType.h:23
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelDataLinkLayer
Data link layer (layer 2)
Definition: ProtocolType.h:229
Definition: EthLayer.h:17
uint16_t etherType
EtherType.
Definition: EthLayer.h:23
uint8_t srcMac[6]
Source MAC.
Definition: EthLayer.h:21
uint8_t dstMac[6]
Destination MAC.
Definition: EthLayer.h:19