PcapPlusPlus  Next
PPPoELayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 #include "TLVData.h"
5 #include <vector>
6 #include <string.h>
7 
9 
12 namespace pcpp
13 {
16 #pragma pack(push, 1)
17  struct pppoe_header
18  {
19 #if (BYTE_ORDER == LITTLE_ENDIAN)
21  uint8_t version : 4;
23  uint8_t type : 4;
25  uint8_t code;
26 #else
28  uint16_t version : 4;
30  uint16_t type : 4;
32  uint16_t code : 8;
33 #endif
35  uint16_t sessionId;
37  uint16_t payloadLength;
38  };
39 #pragma pack(pop)
40  static_assert(sizeof(pppoe_header) == 6, "pppoe_header size is not 6 bytes");
41 
45  class PPPoELayer : public Layer
46  {
47  public:
49  enum PPPoECode
50  {
72  PPPOE_CODE_PADN = 0xd4
73  };
74 
75  ~PPPoELayer() override = default;
76 
81  {
82  return reinterpret_cast<pppoe_header*>(m_Data);
83  }
84 
85  // abstract methods implementation
86 
88  void computeCalculateFields() override;
89 
91  {
92  return OsiModelDataLinkLayer;
93  }
94 
95  protected:
96  // protected c'tor as this class shouldn't be instantiated
97  PPPoELayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet, ProtocolType protocol)
98  : Layer(data, dataLen, prevLayer, packet, protocol)
99  {}
100 
101  // protected c'tor as this class shouldn't be instantiated
102  PPPoELayer(uint8_t version, uint8_t type, PPPoELayer::PPPoECode code, uint16_t sessionId,
103  size_t additionalBytesToAllocate = 0);
104  };
105 
109  {
110  public:
116  PPPoESessionLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
117  : PPPoELayer(data, dataLen, prevLayer, packet, PPPoESession)
118  {}
119 
126  PPPoESessionLayer(uint8_t version, uint8_t type, uint16_t sessionId, uint16_t pppNextProtocol)
127  : PPPoELayer(version, type, PPPoELayer::PPPOE_CODE_SESSION, sessionId, sizeof(uint16_t))
128  {
129  setPPPNextProtocol(pppNextProtocol);
130  }
131 
132  ~PPPoESessionLayer() override = default;
133 
137  uint16_t getPPPNextProtocol() const;
138 
141  void setPPPNextProtocol(uint16_t nextProtocol);
142 
147  static inline bool isDataValid(const uint8_t* data, size_t dataLen);
148 
149  // abstract methods implementation
150 
152  void parseNextLayer() override;
153 
155  size_t getHeaderLen() const override
156  {
157  return sizeof(pppoe_header) + sizeof(uint16_t);
158  }
159 
160  std::string toString() const override;
161  };
162 
166  {
167  public:
170  {
172  PPPOE_TAG_EOL = 0x0000,
194  PPPOE_TAG_HURL = 0x0111,
196  PPPOE_TAG_MOTM = 0x0112,
206  PPPOE_TAG_GENERIC_ERR = 0x0203
207  };
208 
211  class PPPoETag : public TLVRecord<uint16_t, uint16_t>
212  {
213  public:
216  explicit PPPoETag(uint8_t* tagRawData) : TLVRecord(tagRawData)
217  {}
218 
220  ~PPPoETag() override = default;
221 
224 
227  std::string getValueAsString() const
228  {
229  size_t dataSize = getDataSize();
230  if (dataSize < 1)
231  return "";
232 
233  return std::string(reinterpret_cast<const char*>(m_Data->recordValue), dataSize);
234  }
235 
236  // implement abstract methods
237 
238  size_t getTotalSize() const override;
239 
240  size_t getDataSize() const override;
241  };
242 
247  {
248  public:
252  explicit PPPoETagBuilder(PPPoETagTypes tagType)
253  : TLVRecordBuilder(static_cast<uint16_t>(tagType), nullptr, 0)
254  {}
255 
260  PPPoETagBuilder(PPPoETagTypes tagType, uint32_t tagValue)
261  : TLVRecordBuilder(static_cast<uint16_t>(tagType), tagValue)
262  {}
263 
269  PPPoETagBuilder(PPPoETagTypes tagType, uint8_t* tagValue, uint8_t tagValueLen)
270  : TLVRecordBuilder(static_cast<uint16_t>(tagType), tagValue, tagValueLen)
271  {}
272 
275  PPPoETag build() const;
276  };
277 
283  PPPoEDiscoveryLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
284  : PPPoELayer(data, dataLen, prevLayer, packet, PPPoEDiscovery)
285  {
286  m_DataLen = getHeaderLen();
287  }
288 
294  PPPoEDiscoveryLayer(uint8_t version, uint8_t type, PPPoELayer::PPPoECode code, uint16_t sessionId)
295  : PPPoELayer(version, type, code, sessionId)
296  {
297  m_Protocol = PPPoEDiscovery;
298  }
299 
305 
309 
315  PPPoETag getNextTag(const PPPoETag& tag) const;
316 
318  int getTagCount() const;
319 
324  PPPoETag addTag(const PPPoETagBuilder& tagBuilder);
325 
331  PPPoETag addTagAfter(const PPPoETagBuilder& tagBuilder, PPPoETagTypes prevTagType);
332 
338 
343 
348  static inline bool isDataValid(const uint8_t* data, size_t dataLen);
349 
350  // abstract methods implementation
351 
353  void parseNextLayer() override
354  {}
355 
357  size_t getHeaderLen() const override;
358 
359  std::string toString() const override
360  {
361  return "PPP-over-Ethernet Discovery (" + codeToString((PPPoELayer::PPPoECode)getPPPoEHeader()->code) + ")";
362  }
363 
364  private:
365  TLVRecordReader<PPPoETag> m_TagReader;
366 
367  PPPoETag addTagAt(const PPPoETagBuilder& tagBuilder, int offset);
368 
369  uint8_t* getTagBasePtr() const
370  {
371  return m_Data + sizeof(pppoe_header);
372  }
373 
374  std::string codeToString(PPPoECode code) const;
375  };
376 
377  // implementation of inline methods
378 
379  bool PPPoESessionLayer::isDataValid(const uint8_t* data, size_t dataLen)
380  {
381  return data && dataLen >= sizeof(pppoe_header) + sizeof(uint16_t);
382  }
383 
384  bool PPPoEDiscoveryLayer::isDataValid(const uint8_t* data, size_t dataLen)
385  {
386  return data && dataLen >= sizeof(pppoe_header);
387  }
388 
389  // Copied from Wireshark: ppptypes.h
390 
392 #define PCPP_PPP_PADDING 0x1
394 #define PCPP_PPP_ROHC_SCID 0x3
396 #define PCPP_PPP_ROHC_LCID 0x5
398 #define PCPP_PPP_IP 0x21
400 #define PCPP_PPP_OSI 0x23
402 #define PCPP_PPP_XNSIDP 0x25
404 #define PCPP_PPP_DEC4 0x27
406 #define PCPP_PPP_AT 0x29
408 #define PCPP_PPP_IPX 0x2b
410 #define PCPP_PPP_VJC_COMP 0x2d
412 #define PCPP_PPP_VJC_UNCOMP 0x2f
414 #define PCPP_PPP_BCP 0x31
416 #define PCPP_PPP_ST 0x33
418 #define PCPP_PPP_VINES 0x35
420 #define PCPP_PPP_AT_EDDP 0x39
422 #define PCPP_PPP_AT_SB 0x3b
424 #define PCPP_PPP_MP 0x3d
426 #define PCPP_PPP_NB 0x3f
428 #define PCPP_PPP_CISCO 0x41
430 #define PCPP_PPP_ASCOM 0x43
432 #define PCPP_PPP_LBLB 0x45
434 #define PCPP_PPP_RL 0x47
436 #define PCPP_PPP_SDTP 0x49
438 #define PCPP_PPP_LLC 0x4b
440 #define PCPP_PPP_SNA 0x4d
442 #define PCPP_PPP_IPV6HC 0x4f
444 #define PCPP_PPP_KNX 0x51
446 #define PCPP_PPP_ENCRYPT 0x53
448 #define PCPP_PPP_ILE 0x55
450 #define PCPP_PPP_IPV6 0x57
452 #define PCPP_PPP_MUX 0x59
454 #define PCPP_PPP_VSNP 0x5b
456 #define PCPP_PPP_TNP 0x5d
458 #define PCPP_PPP_RTP_FH 0x61
460 #define PCPP_PPP_RTP_CTCP 0x63
462 #define PCPP_PPP_RTP_CNTCP 0x65
464 #define PCPP_PPP_RTP_CUDP8 0x67
466 #define PCPP_PPP_RTP_CRTP8 0x69
468 #define PCPP_PPP_STAMPEDE 0x6f
470 #define PCPP_PPP_MPPLUS 0x73
472 #define PCPP_PPP_NTCITS_IPI 0xc1
474 #define PCPP_PPP_ML_SLCOMP 0xfb
476 #define PCPP_PPP_COMP 0xfd
478 #define PCPP_PPP_STP_HELLO 0x0201
480 #define PCPP_PPP_IBM_SR 0x0203
482 #define PCPP_PPP_DEC_LB 0x0205
484 #define PCPP_PPP_CDP 0x0207
486 #define PCPP_PPP_NETCS 0x0209
488 #define PCPP_PPP_STP 0x020b
490 #define PCPP_PPP_EDP 0x020d
492 #define PCPP_PPP_OSCP 0x0211
494 #define PCPP_PPP_OSCP2 0x0213
496 #define PCPP_PPP_LUXCOM 0x0231
498 #define PCPP_PPP_SIGMA 0x0233
500 #define PCPP_PPP_ACSP 0x0235
502 #define PCPP_PPP_MPLS_UNI 0x0281
504 #define PCPP_PPP_MPLS_MULTI 0x0283
506 #define PCPP_PPP_P12844 0x0285
508 #define PCPP_PPP_TETRA 0x0287
510 #define PCPP_PPP_MFTP 0x0289
512 #define PCPP_PPP_RTP_CTCPND 0x2063
514 #define PCPP_PPP_RTP_CS 0x2065
516 #define PCPP_PPP_RTP_CUDP16 0x2067
518 #define PCPP_PPP_RTP_CRDP16 0x2069
520 #define PCPP_PPP_CCCP 0x4001
522 #define PCPP_PPP_CDPD_MNRP 0x4003
524 #define PCPP_PPP_EXPANDAP 0x4005
526 #define PCPP_PPP_ODSICP 0x4007
528 #define PCPP_PPP_DOCSIS 0x4009
530 #define PCPP_PPP_CETACEANNDP 0x400b
532 #define PCPP_PPP_LZS 0x4021
534 #define PCPP_PPP_REFTEK 0x4023
536 #define PCPP_PPP_FC 0x4025
538 #define PCPP_PPP_EMIT 0x4027
540 #define PCPP_PPP_VSP 0x405b
542 #define PCPP_PPP_TLSP 0x405d
544 #define PCPP_PPP_IPCP 0x8021
546 #define PCPP_PPP_OSINLCP 0x8023
548 #define PCPP_PPP_XNSIDPCP 0x8025
550 #define PCPP_PPP_DECNETCP 0x8027
552 #define PCPP_PPP_ATCP 0x8029
554 #define PCPP_PPP_IPXCP 0x802b
556 #define PCPP_PPP_BRIDGENCP 0x8031
558 #define PCPP_PPP_SPCP 0x8033
560 #define PCPP_PPP_BVCP 0x8035
562 #define PCPP_PPP_MLCP 0x803d
564 #define PCPP_PPP_NBCP 0x803f
566 #define PCPP_PPP_CISCOCP 0x8041
568 #define PCPP_PPP_ASCOMCP 0x8043
570 #define PCPP_PPP_LBLBCP 0x8045
572 #define PCPP_PPP_RLNCP 0x8047
574 #define PCPP_PPP_SDCP 0x8049
576 #define PCPP_PPP_LLCCP 0x804b
578 #define PCPP_PPP_SNACP 0x804d
580 #define PCPP_PPP_IP6HCCP 0x804f
582 #define PCPP_PPP_KNXCP 0x8051
584 #define PCPP_PPP_ECP 0x8053
586 #define PCPP_PPP_ILECP 0x8055
588 #define PCPP_PPP_IPV6CP 0x8057
590 #define PCPP_PPP_MUXCP 0x8059
592 #define PCPP_PPP_VSNCP 0x805b
594 #define PCPP_PPP_TNCP 0x805d
596 #define PCPP_PPP_STAMPEDECP 0x806f
598 #define PCPP_PPP_MPPCP 0x8073
600 #define PCPP_PPP_IPICP 0x80c1
602 #define PCPP_PPP_SLCC 0x80fb
604 #define PCPP_PPP_CCP 0x80fd
606 #define PCPP_PPP_CDPCP 0x8207
608 #define PCPP_PPP_NETCSCP 0x8209
610 #define PCPP_PPP_STPCP 0x820b
612 #define PCPP_PPP_EDPCP 0x820d
614 #define PCPP_PPP_ACSPC 0x8235
616 #define PCPP_PPP_MPLSCP 0x8281
618 #define PCPP_PPP_P12844CP 0x8285
620 #define PCPP_PPP_TETRACP 0x8287
622 #define PCPP_PPP_MFTPCP 0x8289
624 #define PCPP_PPP_LCP 0xc021
626 #define PCPP_PPP_PAP 0xc023
628 #define PCPP_PPP_LQR 0xc025
630 #define PCPP_PPP_SPAP 0xc027
632 #define PCPP_PPP_CBCP 0xc029
634 #define PCPP_PPP_BACP 0xc02b
636 #define PCPP_PPP_BAP 0xc02d
638 #define PCPP_PPP_VSAP 0xc05b
640 #define PCPP_PPP_CONTCP 0xc081
642 #define PCPP_PPP_CHAP 0xc223
644 #define PCPP_PPP_RSAAP 0xc225
646 #define PCPP_PPP_EAP 0xc227
648 #define PCPP_PPP_SIEP 0xc229
650 #define PCPP_PPP_SBAP 0xc26f
652 #define PCPP_PPP_PRPAP 0xc281
654 #define PCPP_PPP_PRPAP2 0xc283
656 #define PCPP_PPP_PRPNIAP 0xc481
657 
658 } // namespace pcpp
Definition: Layer.h:60
Definition: PPPoELayer.h:247
PPPoETagBuilder(PPPoETagTypes tagType)
Definition: PPPoELayer.h:252
PPPoETagBuilder(PPPoETagTypes tagType, uint8_t *tagValue, uint8_t tagValueLen)
Definition: PPPoELayer.h:269
PPPoETagBuilder(PPPoETagTypes tagType, uint32_t tagValue)
Definition: PPPoELayer.h:260
Definition: PPPoELayer.h:212
std::string getValueAsString() const
Definition: PPPoELayer.h:227
PPPoEDiscoveryLayer::PPPoETagTypes getType() const
PPPoETag(uint8_t *tagRawData)
Definition: PPPoELayer.h:216
size_t getDataSize() const override
~PPPoETag() override=default
A d'tor for this class, currently does nothing.
size_t getTotalSize() const override
Definition: PPPoELayer.h:166
PPPoETag addTag(const PPPoETagBuilder &tagBuilder)
PPPoEDiscoveryLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: PPPoELayer.h:283
size_t getHeaderLen() const override
PPPoETag getFirstTag() const
PPPoETag addTagAfter(const PPPoETagBuilder &tagBuilder, PPPoETagTypes prevTagType)
std::string toString() const override
Definition: PPPoELayer.h:359
bool removeTag(PPPoEDiscoveryLayer::PPPoETagTypes tagType)
PPPoEDiscoveryLayer(uint8_t version, uint8_t type, PPPoELayer::PPPoECode code, uint16_t sessionId)
Definition: PPPoELayer.h:294
void parseNextLayer() override
Does nothing for this layer (PPPoE discovery is always the last layer)
Definition: PPPoELayer.h:353
PPPoETagTypes
PPPoE tag types.
Definition: PPPoELayer.h:170
@ PPPOE_TAG_SVC_ERR
Service-Name-Error tag type.
Definition: PPPoELayer.h:202
@ PPPOE_TAG_HURL
HURL tag type.
Definition: PPPoELayer.h:194
@ PPPOE_TAG_EOL
End-Of-List tag type.
Definition: PPPoELayer.h:172
@ PPPOE_TAG_CRED_SCALE
Credit Scale Factor tag type.
Definition: PPPoELayer.h:190
@ PPPOE_TAG_METRICS
Metrics tag type.
Definition: PPPoELayer.h:186
@ PPPOE_TAG_RELAY_ID
Relay-Session-Id tag type.
Definition: PPPoELayer.h:192
@ PPPOE_TAG_GENERIC_ERR
Generic-Error tag type.
Definition: PPPoELayer.h:206
@ PPPOE_TAG_SVC_NAME
Service-Name tag type.
Definition: PPPoELayer.h:174
@ PPPOE_TAG_CREDITS
Credits tag type.
Definition: PPPoELayer.h:184
@ PPPOE_TAG_AC_NAME
AC-Name tag type.
Definition: PPPoELayer.h:176
@ PPPOE_TAG_MOTM
MOTM tag type.
Definition: PPPoELayer.h:196
@ PPPOE_TAG_SEQ_NUM
Sequence Number tag type.
Definition: PPPoELayer.h:188
@ PPPOE_TAG_HOST_UNIQ
Host-Uniq tag type.
Definition: PPPoELayer.h:178
@ PPPOE_TAG_MAX_PAYLD
PPP-Max-Payload tag type.
Definition: PPPoELayer.h:198
@ PPPOE_TAG_IP_RT_ADD
IP_Route_Add tag type.
Definition: PPPoELayer.h:200
@ PPPOE_TAG_AC_COOKIE
AC-Cookie tag type.
Definition: PPPoELayer.h:180
@ PPPOE_TAG_AC_ERR
AC-System-Error tag type.
Definition: PPPoELayer.h:204
@ PPPOE_TAG_VENDOR
Vendor-Specific tag type.
Definition: PPPoELayer.h:182
PPPoETag getNextTag(const PPPoETag &tag) const
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: PPPoELayer.h:384
PPPoETag getTag(PPPoEDiscoveryLayer::PPPoETagTypes tagType) const
Definition: PPPoELayer.h:46
OsiModelLayer getOsiModelLayer() const override
Definition: PPPoELayer.h:90
PPPoECode
PPPoE possible codes.
Definition: PPPoELayer.h:50
@ PPPOE_CODE_PADR
PPPoE discovery PADR.
Definition: PPPoELayer.h:64
@ PPPOE_CODE_PADQ
PPPoE discovery PADQ.
Definition: PPPoELayer.h:62
@ PPPOE_CODE_PADI
PPPoE discovery PADI.
Definition: PPPoELayer.h:56
@ PPPOE_CODE_PADS
PPPoE discovery PADS.
Definition: PPPoELayer.h:66
@ PPPOE_CODE_PADN
PPPoE discovery PADN.
Definition: PPPoELayer.h:72
@ PPPOE_CODE_PADC
PPPoE discovery PADC.
Definition: PPPoELayer.h:60
@ PPPOE_CODE_SESSION
PPPoE session code.
Definition: PPPoELayer.h:52
@ PPPOE_CODE_PADM
PPPoE discovery PADM.
Definition: PPPoELayer.h:70
@ PPPOE_CODE_PADT
PPPoE discovery PADT.
Definition: PPPoELayer.h:68
@ PPPOE_CODE_PADO
PPPoE discovery PADO.
Definition: PPPoELayer.h:54
@ PPPOE_CODE_PADG
PPPoE discovery PADG.
Definition: PPPoELayer.h:58
void computeCalculateFields() override
Calculate pppoe_header::payloadLength field.
pppoe_header * getPPPoEHeader() const
Definition: PPPoELayer.h:80
Definition: PPPoELayer.h:109
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: PPPoELayer.h:379
PPPoESessionLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: PPPoELayer.h:116
std::string toString() const override
uint16_t getPPPNextProtocol() const
PPPoESessionLayer(uint8_t version, uint8_t type, uint16_t sessionId, uint16_t pppNextProtocol)
Definition: PPPoELayer.h:126
void parseNextLayer() override
Currently identifies the following next layers: IPv4Layer, IPv6Layer. Otherwise sets PayloadLayer.
void setPPPNextProtocol(uint16_t nextProtocol)
size_t getHeaderLen() const override
Definition: PPPoELayer.h:155
Definition: Packet.h:22
Definition: TLVData.h:357
Definition: TLVData.h:19
Definition: TLVData.h:204
The main namespace for the PcapPlusPlus lib.
uint8_t ProtocolType
Definition: ProtocolType.h:13
const ProtocolType PPPoESession
PPPoE session protocol.
Definition: ProtocolType.h:59
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelDataLinkLayer
Data link layer (layer 2)
Definition: ProtocolType.h:229
const ProtocolType PPPoEDiscovery
PPPoE discovery protocol.
Definition: ProtocolType.h:62
Definition: PPPoELayer.h:18
uint16_t payloadLength
Length (in bytes) of payload, not including the PPPoE header.
Definition: PPPoELayer.h:37
uint8_t type
PPPoE type.
Definition: PPPoELayer.h:23
uint8_t version
PPPoE version.
Definition: PPPoELayer.h:21
uint8_t code
PPPoE code.
Definition: PPPoELayer.h:25
uint16_t sessionId
PPPoE session ID (relevant for PPPoE session packets only)
Definition: PPPoELayer.h:35