PcapPlusPlus  23.09
PPPoELayer.h
Go to the documentation of this file.
1 #ifndef PACKETPP_PPPOE_LAYER
2 #define PACKETPP_PPPOE_LAYER
3 
4 #include "Layer.h"
5 #include "TLVData.h"
6 #include <vector>
7 #include <string.h>
8 
10 
15 namespace pcpp
16 {
17 
22 #pragma pack(push, 1)
23  struct pppoe_header
24  {
25 #if (BYTE_ORDER == LITTLE_ENDIAN)
26 
27  uint8_t version:4,
29  type:4;
31  uint8_t code;
32 #else
33 
34  uint16_t version:4,
36  type:4,
38  code:8;
39 #endif
40 
41  uint16_t sessionId;
43  uint16_t payloadLength;
44  };
45 #pragma pack(pop)
46 
47 
53  class PPPoELayer : public Layer
54  {
55  public:
59  enum PPPoECode
60  {
62  PPPOE_CODE_SESSION = 0x00,
64  PPPOE_CODE_PADO = 0x07,
66  PPPOE_CODE_PADI = 0x09,
68  PPPOE_CODE_PADG = 0x0a,
70  PPPOE_CODE_PADC = 0x0b,
72  PPPOE_CODE_PADQ = 0x0c,
74  PPPOE_CODE_PADR = 0x19,
76  PPPOE_CODE_PADS = 0x65,
78  PPPOE_CODE_PADT = 0xa7,
80  PPPOE_CODE_PADM = 0xd3,
82  PPPOE_CODE_PADN = 0xd4
83  };
84 
85  ~PPPoELayer() {}
86 
91  pppoe_header* getPPPoEHeader() const { return (pppoe_header*)m_Data; }
92 
93  // abstract methods implementation
94 
98  virtual void computeCalculateFields();
99 
101 
102  protected:
103 
104  // protected c'tor as this class shouldn't be instantiated
105  PPPoELayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet) : Layer(data, dataLen, prevLayer, packet) { }
106 
107  // protected c'tor as this class shouldn't be instantiated
108  PPPoELayer(uint8_t version, uint8_t type, PPPoELayer::PPPoECode code, uint16_t sessionId, size_t additionalBytesToAllocate = 0);
109 
110  };
111 
112 
118  {
119  public:
120 
128  PPPoESessionLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet) : PPPoELayer(data, dataLen, prevLayer, packet) { m_Protocol = PPPoESession; }
129 
137  PPPoESessionLayer(uint8_t version, uint8_t type, uint16_t sessionId, uint16_t pppNextProtocol) : PPPoELayer(version, type, PPPoELayer::PPPOE_CODE_SESSION, sessionId, sizeof(uint16_t)) { setPPPNextProtocol(pppNextProtocol); }
138 
139  virtual ~PPPoESessionLayer() {}
140 
145  uint16_t getPPPNextProtocol() const;
146 
151  void setPPPNextProtocol(uint16_t nextProtocol);
152 
159  static inline bool isDataValid(const uint8_t* data, size_t dataLen);
160 
161  // abstract methods implementation
162 
166  virtual void parseNextLayer();
167 
171  virtual size_t getHeaderLen() const { return sizeof(pppoe_header) + sizeof(uint16_t); }
172 
173  virtual std::string toString() const;
174  };
175 
176 
177 
183  {
184  public:
189  {
191  PPPOE_TAG_EOL = 0x0000,
193  PPPOE_TAG_SVC_NAME = 0x0101,
195  PPPOE_TAG_AC_NAME = 0x0102,
197  PPPOE_TAG_HOST_UNIQ = 0x0103,
199  PPPOE_TAG_AC_COOKIE = 0x0104,
201  PPPOE_TAG_VENDOR = 0x0105,
203  PPPOE_TAG_CREDITS = 0x0106,
205  PPPOE_TAG_METRICS = 0x0107,
207  PPPOE_TAG_SEQ_NUM = 0x0108,
209  PPPOE_TAG_CRED_SCALE = 0x0109,
211  PPPOE_TAG_RELAY_ID = 0x0110,
213  PPPOE_TAG_HURL = 0x0111,
215  PPPOE_TAG_MOTM = 0x0112,
217  PPPOE_TAG_MAX_PAYLD = 0x0120,
219  PPPOE_TAG_IP_RT_ADD = 0x0121,
221  PPPOE_TAG_SVC_ERR = 0x0201,
223  PPPOE_TAG_AC_ERR = 0x0202,
225  PPPOE_TAG_GENERIC_ERR= 0x0203
226  };
227 
232  class PPPoETag : public TLVRecord<uint16_t, uint16_t>
233  {
234  public:
239  explicit PPPoETag(uint8_t* tagRawData) : TLVRecord(tagRawData) { }
240 
244  virtual ~PPPoETag() { }
245 
249  PPPoEDiscoveryLayer::PPPoETagTypes getType() const;
250 
255  std::string getValueAsString() const
256  {
257  size_t dataSize = getDataSize();
258  if (dataSize < 1)
259  return "";
260 
261  return std::string((const char*)m_Data->recordValue, dataSize);
262  }
263 
264  // implement abstract methods
265 
266  size_t getTotalSize() const;
267 
268  size_t getDataSize() const;
269  };
270 
271 
278  {
279  public:
280 
286  explicit PPPoETagBuilder(PPPoETagTypes tagType) :
287  TLVRecordBuilder(static_cast<uint16_t>(tagType), NULL, 0) { }
288 
295  PPPoETagBuilder(PPPoETagTypes tagType, uint32_t tagValue) :
296  TLVRecordBuilder(static_cast<uint16_t>(tagType), tagValue) { }
297 
305  PPPoETagBuilder(PPPoETagTypes tagType, uint8_t* tagValue, uint8_t tagValueLen) :
306  TLVRecordBuilder(static_cast<uint16_t>(tagType), tagValue, tagValueLen) { }
307 
312  PPPoETag build() const;
313  };
314 
322  PPPoEDiscoveryLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet) : PPPoELayer(data, dataLen, prevLayer, packet) { m_Protocol = PPPoEDiscovery; m_DataLen = getHeaderLen(); }
323 
331  PPPoEDiscoveryLayer(uint8_t version, uint8_t type, PPPoELayer::PPPoECode code, uint16_t sessionId) : PPPoELayer(version, type, code, sessionId) { m_Protocol = PPPoEDiscovery; }
332 
339  PPPoETag getTag(PPPoEDiscoveryLayer::PPPoETagTypes tagType) const;
340 
345  PPPoETag getFirstTag() const;
346 
354  PPPoETag getNextTag(const PPPoETag& tag) const;
355 
359  int getTagCount() const;
360 
367  PPPoETag addTag(const PPPoETagBuilder& tagBuilder);
368 
376  PPPoETag addTagAfter(const PPPoETagBuilder& tagBuilder, PPPoETagTypes prevTagType);
377 
384  bool removeTag(PPPoEDiscoveryLayer::PPPoETagTypes tagType);
385 
390  bool removeAllTags();
391 
398  static inline bool isDataValid(const uint8_t* data, size_t dataLen);
399 
400  // abstract methods implementation
401 
405  virtual void parseNextLayer() {}
406 
410  virtual size_t getHeaderLen() const;
411 
412  virtual std::string toString() const { return "PPP-over-Ethernet Discovery (" + codeToString((PPPoELayer::PPPoECode)getPPPoEHeader()->code) + ")"; }
413 
414  private:
415  TLVRecordReader<PPPoETag> m_TagReader;
416 
417  PPPoETag addTagAt(const PPPoETagBuilder& tagBuilder, int offset);
418 
419  uint8_t* getTagBasePtr() const { return m_Data + sizeof(pppoe_header); }
420 
421  std::string codeToString(PPPoECode code) const;
422  };
423 
424 
425  // implementation of inline methods
426 
427  bool PPPoESessionLayer::isDataValid(const uint8_t* data, size_t dataLen)
428  {
429  return data && dataLen >= sizeof(pppoe_header) + sizeof(uint16_t);
430  }
431 
432  bool PPPoEDiscoveryLayer::isDataValid(const uint8_t* data, size_t dataLen)
433  {
434  return data && dataLen >= sizeof(pppoe_header);
435  }
436 
437  // Copied from Wireshark: ppptypes.h
438 
440 #define PCPP_PPP_PADDING 0x1
441 
442 #define PCPP_PPP_ROHC_SCID 0x3
443 
444 #define PCPP_PPP_ROHC_LCID 0x5
445 
446 #define PCPP_PPP_IP 0x21
447 
448 #define PCPP_PPP_OSI 0x23
449 
450 #define PCPP_PPP_XNSIDP 0x25
451 
452 #define PCPP_PPP_DEC4 0x27
453 
454 #define PCPP_PPP_AT 0x29
455 
456 #define PCPP_PPP_IPX 0x2b
457 
458 #define PCPP_PPP_VJC_COMP 0x2d
459 
460 #define PCPP_PPP_VJC_UNCOMP 0x2f
461 
462 #define PCPP_PPP_BCP 0x31
463 
464 #define PCPP_PPP_ST 0x33
465 
466 #define PCPP_PPP_VINES 0x35
467 
468 #define PCPP_PPP_AT_EDDP 0x39
469 
470 #define PCPP_PPP_AT_SB 0x3b
471 
472 #define PCPP_PPP_MP 0x3d
473 
474 #define PCPP_PPP_NB 0x3f
475 
476 #define PCPP_PPP_CISCO 0x41
477 
478 #define PCPP_PPP_ASCOM 0x43
479 
480 #define PCPP_PPP_LBLB 0x45
481 
482 #define PCPP_PPP_RL 0x47
483 
484 #define PCPP_PPP_SDTP 0x49
485 
486 #define PCPP_PPP_LLC 0x4b
487 
488 #define PCPP_PPP_SNA 0x4d
489 
490 #define PCPP_PPP_IPV6HC 0x4f
491 
492 #define PCPP_PPP_KNX 0x51
493 
494 #define PCPP_PPP_ENCRYPT 0x53
495 
496 #define PCPP_PPP_ILE 0x55
497 
498 #define PCPP_PPP_IPV6 0x57
499 
500 #define PCPP_PPP_MUX 0x59
501 
502 #define PCPP_PPP_VSNP 0x5b
503 
504 #define PCPP_PPP_TNP 0x5d
505 
506 #define PCPP_PPP_RTP_FH 0x61
507 
508 #define PCPP_PPP_RTP_CTCP 0x63
509 
510 #define PCPP_PPP_RTP_CNTCP 0x65
511 
512 #define PCPP_PPP_RTP_CUDP8 0x67
513 
514 #define PCPP_PPP_RTP_CRTP8 0x69
515 
516 #define PCPP_PPP_STAMPEDE 0x6f
517 
518 #define PCPP_PPP_MPPLUS 0x73
519 
520 #define PCPP_PPP_NTCITS_IPI 0xc1
521 
522 #define PCPP_PPP_ML_SLCOMP 0xfb
523 
524 #define PCPP_PPP_COMP 0xfd
525 
526 #define PCPP_PPP_STP_HELLO 0x0201
527 
528 #define PCPP_PPP_IBM_SR 0x0203
529 
530 #define PCPP_PPP_DEC_LB 0x0205
531 
532 #define PCPP_PPP_CDP 0x0207
533 
534 #define PCPP_PPP_NETCS 0x0209
535 
536 #define PCPP_PPP_STP 0x020b
537 
538 #define PCPP_PPP_EDP 0x020d
539 
540 #define PCPP_PPP_OSCP 0x0211
541 
542 #define PCPP_PPP_OSCP2 0x0213
543 
544 #define PCPP_PPP_LUXCOM 0x0231
545 
546 #define PCPP_PPP_SIGMA 0x0233
547 
548 #define PCPP_PPP_ACSP 0x0235
549 
550 #define PCPP_PPP_MPLS_UNI 0x0281
551 
552 #define PCPP_PPP_MPLS_MULTI 0x0283
553 
554 #define PCPP_PPP_P12844 0x0285
555 
556 #define PCPP_PPP_TETRA 0x0287
557 
558 #define PCPP_PPP_MFTP 0x0289
559 
560 #define PCPP_PPP_RTP_CTCPND 0x2063
561 
562 #define PCPP_PPP_RTP_CS 0x2065
563 
564 #define PCPP_PPP_RTP_CUDP16 0x2067
565 
566 #define PCPP_PPP_RTP_CRDP16 0x2069
567 
568 #define PCPP_PPP_CCCP 0x4001
569 
570 #define PCPP_PPP_CDPD_MNRP 0x4003
571 
572 #define PCPP_PPP_EXPANDAP 0x4005
573 
574 #define PCPP_PPP_ODSICP 0x4007
575 
576 #define PCPP_PPP_DOCSIS 0x4009
577 
578 #define PCPP_PPP_CETACEANNDP 0x400b
579 
580 #define PCPP_PPP_LZS 0x4021
581 
582 #define PCPP_PPP_REFTEK 0x4023
583 
584 #define PCPP_PPP_FC 0x4025
585 
586 #define PCPP_PPP_EMIT 0x4027
587 
588 #define PCPP_PPP_VSP 0x405b
589 
590 #define PCPP_PPP_TLSP 0x405d
591 
592 #define PCPP_PPP_IPCP 0x8021
593 
594 #define PCPP_PPP_OSINLCP 0x8023
595 
596 #define PCPP_PPP_XNSIDPCP 0x8025
597 
598 #define PCPP_PPP_DECNETCP 0x8027
599 
600 #define PCPP_PPP_ATCP 0x8029
601 
602 #define PCPP_PPP_IPXCP 0x802b
603 
604 #define PCPP_PPP_BRIDGENCP 0x8031
605 
606 #define PCPP_PPP_SPCP 0x8033
607 
608 #define PCPP_PPP_BVCP 0x8035
609 
610 #define PCPP_PPP_MLCP 0x803d
611 
612 #define PCPP_PPP_NBCP 0x803f
613 
614 #define PCPP_PPP_CISCOCP 0x8041
615 
616 #define PCPP_PPP_ASCOMCP 0x8043
617 
618 #define PCPP_PPP_LBLBCP 0x8045
619 
620 #define PCPP_PPP_RLNCP 0x8047
621 
622 #define PCPP_PPP_SDCP 0x8049
623 
624 #define PCPP_PPP_LLCCP 0x804b
625 
626 #define PCPP_PPP_SNACP 0x804d
627 
628 #define PCPP_PPP_IP6HCCP 0x804f
629 
630 #define PCPP_PPP_KNXCP 0x8051
631 
632 #define PCPP_PPP_ECP 0x8053
633 
634 #define PCPP_PPP_ILECP 0x8055
635 
636 #define PCPP_PPP_IPV6CP 0x8057
637 
638 #define PCPP_PPP_MUXCP 0x8059
639 
640 #define PCPP_PPP_VSNCP 0x805b
641 
642 #define PCPP_PPP_TNCP 0x805d
643 
644 #define PCPP_PPP_STAMPEDECP 0x806f
645 
646 #define PCPP_PPP_MPPCP 0x8073
647 
648 #define PCPP_PPP_IPICP 0x80c1
649 
650 #define PCPP_PPP_SLCC 0x80fb
651 
652 #define PCPP_PPP_CCP 0x80fd
653 
654 #define PCPP_PPP_CDPCP 0x8207
655 
656 #define PCPP_PPP_NETCSCP 0x8209
657 
658 #define PCPP_PPP_STPCP 0x820b
659 
660 #define PCPP_PPP_EDPCP 0x820d
661 
662 #define PCPP_PPP_ACSPC 0x8235
663 
664 #define PCPP_PPP_MPLSCP 0x8281
665 
666 #define PCPP_PPP_P12844CP 0x8285
667 
668 #define PCPP_PPP_TETRACP 0x8287
669 
670 #define PCPP_PPP_MFTPCP 0x8289
671 
672 #define PCPP_PPP_LCP 0xc021
673 
674 #define PCPP_PPP_PAP 0xc023
675 
676 #define PCPP_PPP_LQR 0xc025
677 
678 #define PCPP_PPP_SPAP 0xc027
679 
680 #define PCPP_PPP_CBCP 0xc029
681 
682 #define PCPP_PPP_BACP 0xc02b
683 
684 #define PCPP_PPP_BAP 0xc02d
685 
686 #define PCPP_PPP_VSAP 0xc05b
687 
688 #define PCPP_PPP_CONTCP 0xc081
689 
690 #define PCPP_PPP_CHAP 0xc223
691 
692 #define PCPP_PPP_RSAAP 0xc225
693 
694 #define PCPP_PPP_EAP 0xc227
695 
696 #define PCPP_PPP_SIEP 0xc229
697 
698 #define PCPP_PPP_SBAP 0xc26f
699 
700 #define PCPP_PPP_PRPAP 0xc281
701 
702 #define PCPP_PPP_PRPAP2 0xc283
703 
704 #define PCPP_PPP_PRPNIAP 0xc481
705 
706 } // namespace pcpp
707 
708 #endif /* PACKETPP_PPPOE_LAYER */
The main namespace for the PcapPlusPlus lib.
OsiModelLayer
Definition: ProtocolType.h:333
PPPoETagTypes
Definition: PPPoELayer.h:188
const ProtocolType PPPoEDiscovery
Definition: ProtocolType.h:93
Definition: PPPoELayer.h:117
Definition: PPPoELayer.h:182
Definition: ProtocolType.h:338
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: PPPoELayer.h:432
Definition: TLVData.h:376
Definition: Layer.h:70
Definition: TLVData.h:24
virtual ~PPPoETag()
Definition: PPPoELayer.h:244
const ProtocolType PPPoESession
Definition: ProtocolType.h:88
Definition: PPPoELayer.h:53
Definition: Packet.h:26
virtual void parseNextLayer()
Definition: PPPoELayer.h:405
PPPoETagBuilder(PPPoETagTypes tagType, uint8_t *tagValue, uint8_t tagValueLen)
Definition: PPPoELayer.h:305
uint8_t type
Definition: PPPoELayer.h:27
Definition: TLVData.h:217
std::string getValueAsString() const
Definition: PPPoELayer.h:255
virtual size_t getHeaderLen() const
Definition: PPPoELayer.h:171
PPPoECode
Definition: PPPoELayer.h:59
Definition: PPPoELayer.h:232
PPPoETagBuilder(PPPoETagTypes tagType, uint32_t tagValue)
Definition: PPPoELayer.h:295
PPPoEDiscoveryLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: PPPoELayer.h:322
PPPoESessionLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: PPPoELayer.h:128
OsiModelLayer getOsiModelLayer() const
Definition: PPPoELayer.h:100
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: PPPoELayer.h:427
PPPoEDiscoveryLayer(uint8_t version, uint8_t type, PPPoELayer::PPPoECode code, uint16_t sessionId)
Definition: PPPoELayer.h:331
PPPoETagBuilder(PPPoETagTypes tagType)
Definition: PPPoELayer.h:286
virtual std::string toString() const
Definition: PPPoELayer.h:412
uint8_t code
Definition: PPPoELayer.h:31
pppoe_header * getPPPoEHeader() const
Definition: PPPoELayer.h:91
uint16_t sessionId
Definition: PPPoELayer.h:41
Definition: PPPoELayer.h:23
uint16_t payloadLength
Definition: PPPoELayer.h:43
uint8_t version
Definition: PPPoELayer.h:27
Definition: PPPoELayer.h:277
PPPoESessionLayer(uint8_t version, uint8_t type, uint16_t sessionId, uint16_t pppNextProtocol)
Definition: PPPoELayer.h:137
PPPoETag(uint8_t *tagRawData)
Definition: PPPoELayer.h:239