PcapPlusPlus  Next
CiscoHdlcLayer.h
1 #pragma once
2 
3 #include "Layer.h"
4 
5 namespace pcpp
6 {
9  class CiscoHdlcLayer : public Layer
10  {
11  public:
14  enum class AddressType
15  {
17  Unicast = 0x0f,
19  Multicast = 0x8f,
21  Unknown
22  };
23 
28  CiscoHdlcLayer(uint8_t* data, size_t dataLen, Packet* packet) : Layer(data, dataLen, nullptr, packet, CiscoHDLC)
29  {}
30 
33  explicit CiscoHdlcLayer(AddressType address);
34 
36  ~CiscoHdlcLayer() override = default;
37 
40 
42  uint8_t getAddressValue() const;
43 
46  void setAddress(AddressType address);
47 
50  void setAddressValue(uint8_t address);
51 
53  uint16_t getNextProtocol() const;
54 
59  static bool isDataValid(const uint8_t* data, size_t dataLen)
60  {
61  return data && dataLen >= sizeof(cisco_hdlc_header);
62  }
63 
64  // Overridden methods
65 
67  size_t getHeaderLen() const override
68  {
69  return sizeof(cisco_hdlc_header);
70  }
71 
73  void computeCalculateFields() override;
74 
76  void parseNextLayer() override;
77 
78  std::string toString() const override;
79 
81  {
82  return OsiModelDataLinkLayer;
83  }
84 
89  {
91  static std::vector<FieldDescriptor> all()
92  {
93  auto result = Layer::SerializedFields::all();
94  std::initializer_list<FieldDescriptor> extra{ Address, NextProtocol };
95  std::copy(extra.begin(), extra.end(), std::back_inserter(result));
96  return result;
97  }
98 
100  static const FieldDescriptor Address;
101 
104  };
105 
106  protected:
107  void serializeLayer(ObjectScope& serializer) const override;
108 
109  private:
110 #pragma pack(push, 1)
111  struct cisco_hdlc_header
112  {
113  uint8_t address;
114  uint8_t control;
115  uint16_t protocol;
116  };
117 #pragma pack(pop)
118  static_assert(sizeof(cisco_hdlc_header) == 4, "cisco_hdlc_header size is not 4 bytes");
119 
120  cisco_hdlc_header* getCiscoHdlcHeader() const
121  {
122  return reinterpret_cast<cisco_hdlc_header*>(m_Data);
123  }
124 
125  void setNextProtocol(uint16_t protocol);
126  };
127 
128 } // namespace pcpp
Definition: CiscoHdlcLayer.h:10
size_t getHeaderLen() const override
Definition: CiscoHdlcLayer.h:67
AddressType
Definition: CiscoHdlcLayer.h:15
@ Unknown
Unknown address type.
void setAddressValue(uint8_t address)
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: CiscoHdlcLayer.h:59
OsiModelLayer getOsiModelLayer() const override
Definition: CiscoHdlcLayer.h:80
~CiscoHdlcLayer() override=default
Default destructor for this layer.
CiscoHdlcLayer(uint8_t *data, size_t dataLen, Packet *packet)
Definition: CiscoHdlcLayer.h:28
void serializeLayer(ObjectScope &serializer) const override
void setAddress(AddressType address)
std::string toString() const override
CiscoHdlcLayer(AddressType address)
AddressType getAddress() const
uint16_t getNextProtocol() const
uint8_t getAddressValue() const
void computeCalculateFields() override
Calculate the Next Protocol when possible.
void parseNextLayer() override
Parses the next layer. Currently, supports IPv4 and IPv6.
Definition: Layer.h:117
Definition: Serializers.h:230
Definition: Packet.h:49
const ProtocolType CiscoHDLC
Cisco HDLC protocol.
Definition: ProtocolType.h:246
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:425
@ OsiModelDataLinkLayer
Data link layer (layer 2)
Definition: ProtocolType.h:429
Definition: CiscoHdlcLayer.h:89
static const FieldDescriptor NextProtocol
Field descriptor for the protocol type of the encapsulated payload, written as a number.
Definition: CiscoHdlcLayer.h:103
static std::vector< FieldDescriptor > all()
Definition: CiscoHdlcLayer.h:91
static const FieldDescriptor Address
Field descriptor for the address field, written as a string (see CiscoHdlcLayer::AddressType).
Definition: CiscoHdlcLayer.h:100
Definition: Serializers.h:18
Definition: Layer.h:212
static std::vector< FieldDescriptor > all()
Definition: Layer.h:214