PcapPlusPlus  Next
GreLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 
6 
9 namespace pcpp
10 {
13 #pragma pack(push, 1)
15  {
16 #if (BYTE_ORDER == LITTLE_ENDIAN)
18  uint8_t recursionControl : 3,
24  keyBit : 1,
29 #else
31  uint8_t checksumBit : 1,
33  routingBit : 1,
35  keyBit : 1,
37  sequenceNumBit : 1,
41  recursionControl : 3;
42 #endif
43 #if (BYTE_ORDER == LITTLE_ENDIAN)
45  uint8_t version : 3,
47  flags : 4,
50 #else
52  uint8_t ackSequenceNumBit : 1,
54  flags : 4,
56  version : 3;
57 #endif
58 
60  uint16_t protocol;
61  };
62 #pragma pack(pop)
63  static_assert(sizeof(gre_basic_header) == 4, "gre_basic_header size is not 4 bytes");
64 
67 #pragma pack(push, 1)
69  {
71  uint16_t payloadLength;
73  uint16_t callID;
74  };
75 #pragma pack(pop)
76  static_assert(sizeof(gre1_header) == 8, "gre1_header size is not 8 bytes");
77 
80 #pragma pack(push, 1)
82  {
84  uint8_t address;
86  uint8_t control;
88  uint16_t protocol;
89  };
90 #pragma pack(pop)
91  static_assert(sizeof(ppp_pptp_header) == 4, "ppp_pptp_header size is not 4 bytes");
92 
96  class GreLayer : public Layer
97  {
98  public:
99  ~GreLayer() override = default;
100 
106  static ProtocolType getGREVersion(uint8_t* greData, size_t greDataLen);
107 
112  bool getSequenceNumber(uint32_t& seqNumber) const;
113 
119  bool setSequenceNumber(uint32_t seqNumber);
120 
125 
126  // implement abstract methods
127 
131  void parseNextLayer() override;
132 
134  size_t getHeaderLen() const override;
135 
137  {
138  return OsiModelNetworkLayer;
139  }
140 
141  protected:
142  GreLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, ProtocolType protocol)
143  : Layer(data, dataLen, prevLayer, packet, protocol)
144  {}
145 
146  GreLayer()
147  {}
148 
149  enum GreField
150  {
151  GreChecksumOrRouting = 0,
152  GreKey = 1,
153  GreSeq = 2,
154  GreAck = 3
155  };
156 
157  uint8_t* getFieldValue(GreField field, bool returnOffsetEvenIfFieldMissing) const;
158 
159  void computeCalculateFieldsInner();
160  };
161 
166  class GREv0Layer : public GreLayer
167  {
168  public:
174  GREv0Layer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
175  : GreLayer(data, dataLen, prevLayer, packet, GREv0)
176  {}
177 
180 
181  ~GREv0Layer() override = default;
182 
191  {
192  return reinterpret_cast<gre_basic_header*>(m_Data);
193  }
194 
199  bool getChecksum(uint16_t& checksum);
200 
209  bool setChecksum(uint16_t checksum);
210 
217 
223  bool getOffset(uint16_t& offset) const;
224 
229  bool getKey(uint32_t& key) const;
230 
236  bool setKey(uint32_t key);
237 
241  bool unsetKey();
242 
247  static inline bool isDataValid(const uint8_t* data, size_t dataLen)
248  {
249  return data && dataLen >= sizeof(gre_basic_header);
250  }
251 
252  // implement abstract methods
253 
257  void computeCalculateFields() override;
258 
259  std::string toString() const override;
260  };
261 
264  class GREv1Layer : public GreLayer
265  {
266  public:
272  GREv1Layer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
273  : GreLayer(data, dataLen, prevLayer, packet, GREv1)
274  {}
275 
278  explicit GREv1Layer(uint16_t callID);
279 
280  ~GREv1Layer() override = default;
281 
291  {
292  return reinterpret_cast<gre1_header*>(m_Data);
293  }
294 
299  bool getAcknowledgmentNum(uint32_t& ackNum) const;
300 
306  bool setAcknowledgmentNum(uint32_t ackNum);
307 
312 
317  static inline bool isDataValid(const uint8_t* data, size_t dataLen)
318  {
319  return data && dataLen >= sizeof(gre1_header);
320  }
321 
322  // implement abstract methods
323 
327  void computeCalculateFields() override;
328 
329  std::string toString() const override;
330  };
331 
335  class PPP_PPTPLayer : public Layer
336  {
337  public:
343  PPP_PPTPLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
344  : Layer(data, dataLen, prevLayer, packet, PPP_PPTP)
345  {}
346 
350  PPP_PPTPLayer(uint8_t address, uint8_t control);
351 
352  ~PPP_PPTPLayer() override = default;
353 
358  {
359  return reinterpret_cast<ppp_pptp_header*>(m_Data);
360  }
361 
366  static inline bool isDataValid(const uint8_t* data, size_t dataLen);
367 
368  // implement abstract methods
369 
371  void parseNextLayer() override;
372 
374  size_t getHeaderLen() const override
375  {
376  return sizeof(ppp_pptp_header);
377  }
378 
381  void computeCalculateFields() override;
382 
383  std::string toString() const override
384  {
385  return "PPP for PPTP Layer";
386  }
387 
389  {
390  return OsiModelSesionLayer;
391  }
392  };
393 
394  bool PPP_PPTPLayer::isDataValid(const uint8_t* data, size_t dataLen)
395  {
396  return data && dataLen >= sizeof(ppp_pptp_header);
397  }
398 
399 } // namespace pcpp
Definition: GreLayer.h:167
std::string toString() const override
GREv0Layer()
A constructor that creates a new GREv0 header and allocates the data.
bool getChecksum(uint16_t &checksum)
bool setKey(uint32_t key)
gre_basic_header * getGreHeader() const
Definition: GreLayer.h:190
GREv0Layer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: GreLayer.h:174
bool getKey(uint32_t &key) const
bool getOffset(uint16_t &offset) const
void computeCalculateFields() override
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: GreLayer.h:247
bool setChecksum(uint16_t checksum)
Definition: GreLayer.h:265
bool setAcknowledgmentNum(uint32_t ackNum)
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: GreLayer.h:317
bool getAcknowledgmentNum(uint32_t &ackNum) const
GREv1Layer(uint16_t callID)
void computeCalculateFields() override
bool unsetAcknowledgmentNum()
std::string toString() const override
gre1_header * getGreHeader() const
Definition: GreLayer.h:290
GREv1Layer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: GreLayer.h:272
Definition: GreLayer.h:97
bool unsetSequenceNumber()
bool getSequenceNumber(uint32_t &seqNumber) const
void parseNextLayer() override
OsiModelLayer getOsiModelLayer() const override
Definition: GreLayer.h:136
bool setSequenceNumber(uint32_t seqNumber)
static ProtocolType getGREVersion(uint8_t *greData, size_t greDataLen)
size_t getHeaderLen() const override
Definition: Layer.h:60
Definition: GreLayer.h:336
size_t getHeaderLen() const override
Definition: GreLayer.h:374
void computeCalculateFields() override
PPP_PPTPLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: GreLayer.h:343
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: GreLayer.h:394
ppp_pptp_header * getPPP_PPTPHeader() const
Definition: GreLayer.h:357
OsiModelLayer getOsiModelLayer() const override
Definition: GreLayer.h:388
std::string toString() const override
Definition: GreLayer.h:383
PPP_PPTPLayer(uint8_t address, uint8_t control)
void parseNextLayer() override
Currently identifies the following next layers: IPv4Layer, IPv6Layer. Otherwise sets PayloadLayer.
Definition: Packet.h:22
The main namespace for the PcapPlusPlus lib.
uint8_t ProtocolType
Definition: ProtocolType.h:13
const ProtocolType GREv0
GRE version 0 protocol.
Definition: ProtocolType.h:74
const ProtocolType PPP_PPTP
PPP for PPTP protocol.
Definition: ProtocolType.h:83
const ProtocolType GREv1
GRE version 1 protocol.
Definition: ProtocolType.h:77
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelSesionLayer
Session layer (layer 5)
Definition: ProtocolType.h:235
@ OsiModelNetworkLayer
Network layer (layer 3)
Definition: ProtocolType.h:231
Definition: GreLayer.h:69
uint16_t payloadLength
Size of the payload not including the GRE header.
Definition: GreLayer.h:71
uint16_t callID
Contains the Peer's Call ID for the session to which this packet belongs.
Definition: GreLayer.h:73
Definition: GreLayer.h:15
uint8_t recursionControl
Number of additional encapsulations which are permitted. 0 is the default value.
Definition: GreLayer.h:18
uint8_t sequenceNumBit
Set if sequence number exists.
Definition: GreLayer.h:22
uint8_t strictSourceRouteBit
Strict source routing bit (GRE v0 only)
Definition: GreLayer.h:20
uint8_t routingBit
Set if routing exists (GRE v0 only)
Definition: GreLayer.h:26
uint8_t ackSequenceNumBit
Set if acknowledgment number is set (GRE v1 only)
Definition: GreLayer.h:49
uint8_t keyBit
Set if key exists.
Definition: GreLayer.h:24
uint8_t flags
Reserved.
Definition: GreLayer.h:47
uint16_t protocol
Protocol type of the next layer.
Definition: GreLayer.h:60
uint8_t checksumBit
Set if checksum exists (GRE v0 only)
Definition: GreLayer.h:28
uint8_t version
GRE version - can be 0 or 1.
Definition: GreLayer.h:45
Definition: GreLayer.h:82
uint16_t protocol
Protocol type of the next layer (see PPP_* macros at PPPoELayer.h)
Definition: GreLayer.h:88
uint8_t address
Broadcast address.
Definition: GreLayer.h:84
uint8_t control
Control byte.
Definition: GreLayer.h:86