PcapPlusPlus  Next
StpLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Layer.h"
4 #include "MacAddress.h"
5 #include <cstring>
6 
8 
11 namespace pcpp
12 {
15 #pragma pack(push, 1)
16  struct stp_tcn_bpdu
17  {
19  uint16_t protoId;
21  uint8_t version;
23  uint8_t type;
24  };
25 #pragma pack(pop)
26  static_assert(sizeof(stp_tcn_bpdu) == 4, "stp_tcn_bpdu size is not 4 bytes");
27 
30  static_assert(sizeof(stp_header) == 4, "stp_header size is not 4 bytes");
31 
34 #pragma pack(push, 1)
36  {
38  uint8_t flag;
40  uint64_t rootId;
42  uint32_t pathCost;
44  uint64_t bridgeId;
46  uint16_t portId;
48  uint16_t msgAge;
50  uint16_t maxAge;
52  uint16_t helloTime;
54  uint16_t forwardDelay;
55  };
56 #pragma pack(pop)
57  static_assert(sizeof(stp_conf_bpdu) == 35, "stp_conf_bpdu size is not 35 bytes");
58 
61 #pragma pack(push, 1)
63  {
65  uint8_t version1Len;
66  };
67 #pragma pack(pop)
68  static_assert(sizeof(rstp_conf_bpdu) == 36, "rstp_conf_bpdu size is not 36 bytes");
69 
72 #pragma pack(push, 1)
74  {
76  uint16_t version3Len;
80  uint8_t mstConfigName[32];
84  uint8_t mstConfigDigest[16];
86  uint32_t irpc;
88  uint64_t cistBridgeId;
90  uint8_t remainId;
91  };
92 #pragma pack(pop)
93  static_assert(sizeof(mstp_conf_bpdu) == 102, "mstp_conf_bpdu size is not 102 bytes");
94 
98 #pragma pack(push, 1)
100  {
102  uint8_t flags;
104  uint64_t regionalRootId;
106  uint32_t pathCost;
108  uint8_t bridgePriority;
110  uint8_t portPriority;
112  uint8_t remainingHops;
113  };
114 #pragma pack(pop)
115  static_assert(sizeof(msti_conf_msg) == 16, "msti_conf_msg size is not 16 bytes");
116 
119  class StpLayer : public Layer
120  {
121  protected:
122  StpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
123  : Layer(data, dataLen, prevLayer, packet, STP)
124  {}
125 
126  explicit StpLayer(size_t dataLen)
127  {
128  allocData(dataLen);
129  m_Protocol = STP;
130  }
131 
132  static pcpp::MacAddress IDtoMacAddress(uint64_t id);
133  static uint64_t macAddressToID(const pcpp::MacAddress& addr);
134 
135  public:
140 
144  {
145  return reinterpret_cast<stp_header*>(m_Data);
146  }
147 
150  uint16_t getProtoId() const
151  {
152  return getStpHeader()->protoId;
153  }
154 
157 
158  void setProtoId(uint16_t value)
159  {
160  getStpHeader()->protoId = value;
161  }
162 
165  uint8_t getVersion() const
166  {
167  return getStpHeader()->version;
168  }
169 
172  void setVersion(uint8_t value)
173  {
174  getStpHeader()->version = value;
175  }
176 
179  uint8_t getType() const
180  {
181  return getStpHeader()->type;
182  }
183 
186  void setType(uint8_t value)
187  {
188  getStpHeader()->type = value;
189  }
190 
191  // overridden methods
192 
194  size_t getHeaderLen() const override
195  {
196  return m_DataLen;
197  }
198 
200  void computeCalculateFields() override
201  {}
202 
205  {
206  return OsiModelDataLinkLayer;
207  }
208 
213  static bool isDataValid(const uint8_t* data, size_t dataLen);
214 
222  static StpLayer* parseStpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
223  };
224 
228  {
229  protected:
230  explicit StpTopologyChangeBPDULayer(size_t dataLen) : StpLayer(dataLen)
231  {}
232 
233  public:
239  StpTopologyChangeBPDULayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
240  : StpLayer(data, dataLen, prevLayer, packet)
241  {}
242 
246 
250  {
251  return getStpHeader();
252  }
253 
254  // overridden methods
255 
257  size_t getHeaderLen() const override
258  {
259  return sizeof(stp_tcn_bpdu);
260  }
261 
263  void parseNextLayer() override;
264 
266  std::string toString() const override
267  {
268  return "Spanning Tree Topology Change Notification";
269  }
270 
276  static bool isDataValid(const uint8_t* data, size_t dataLen)
277  {
278  return canReinterpretAs<stp_tcn_bpdu>(data, dataLen);
279  }
280  };
281 
285  {
286  protected:
287  explicit StpConfigurationBPDULayer(size_t dataLen) : StpTopologyChangeBPDULayer(dataLen)
288  {}
289 
290  public:
296  StpConfigurationBPDULayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
297  : StpTopologyChangeBPDULayer(data, dataLen, prevLayer, packet)
298  {}
299 
303 
307  {
308  return reinterpret_cast<stp_conf_bpdu*>(m_Data);
309  }
310 
313  uint8_t getFlag() const
314  {
315  return getStpConfHeader()->flag;
316  }
317 
320  void setFlag(uint8_t value)
321  {
322  getStpConfHeader()->flag = value;
323  }
324 
327  uint64_t getRootId() const;
328 
331  void setRootId(uint64_t value);
332 
335  uint16_t getRootPriority() const;
336 
339  void setRootPriority(uint16_t value);
340 
343  uint16_t getRootSystemIDExtension() const;
344 
347  void setRootSystemIDExtension(uint16_t value);
348 
352  {
353  return IDtoMacAddress(getRootId());
354  }
355 
358  void setRootSystemID(const pcpp::MacAddress& value);
359 
362  uint32_t getPathCost() const;
363 
366  void setPathCost(uint32_t value);
367 
370  uint64_t getBridgeId() const;
371 
374  void setBridgeId(uint64_t value);
375 
378  uint16_t getBridgePriority() const;
379 
382  void setBridgePriority(uint16_t value);
383 
386  uint16_t getBridgeSystemIDExtension() const;
387 
390  void setBridgeSystemIDExtension(uint16_t value);
391 
395  {
396  return IDtoMacAddress(getBridgeId());
397  }
398 
402 
405  uint16_t getPortId() const;
406 
409  void setPortId(uint16_t value);
410 
413  double getMessageAge() const;
414 
417  void setMessageAge(double value);
418 
421  double getMaximumAge() const;
422 
425  void setMaximumAge(double value);
426 
429  double getTransmissionInterval() const;
430 
433  void setTransmissionInterval(double value);
434 
437  double getForwardDelay() const;
438 
441  void setForwardDelay(double value);
442 
443  // overridden methods
444 
446  size_t getHeaderLen() const override
447  {
448  return sizeof(stp_conf_bpdu);
449  }
450 
452  void parseNextLayer() override;
453 
455  std::string toString() const override
456  {
457  return "Spanning Tree Configuration";
458  }
459 
464  static bool isDataValid(const uint8_t* data, size_t dataLen)
465  {
466  return canReinterpretAs<stp_conf_bpdu>(data, dataLen);
467  }
468  };
469 
473  {
474  protected:
475  explicit RapidStpLayer(size_t dataLen) : StpConfigurationBPDULayer(dataLen)
476  {}
477 
478  public:
484  RapidStpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
485  : StpConfigurationBPDULayer(data, dataLen, prevLayer, packet)
486  {}
487 
491 
495  {
496  return reinterpret_cast<rstp_conf_bpdu*>(m_Data);
497  }
498 
501  uint8_t getVersion1Len() const
502  {
503  return getRstpConfHeader()->version1Len;
504  }
505 
508  void setVersion1Len(uint8_t value)
509  {
510  getRstpConfHeader()->version1Len = value;
511  }
512 
513  // overridden methods
514 
516  size_t getHeaderLen() const override
517  {
518  return sizeof(rstp_conf_bpdu);
519  }
520 
522  void parseNextLayer() override;
523 
525  std::string toString() const override
526  {
527  return "Rapid Spanning Tree";
528  }
529 
534  static bool isDataValid(const uint8_t* data, size_t dataLen)
535  {
536  return canReinterpretAs<rstp_conf_bpdu>(data, dataLen);
537  }
538  };
539 
544  {
545  public:
551  MultipleStpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
552  : RapidStpLayer(data, dataLen, prevLayer, packet)
553  {}
554 
558 
562  {
563  return reinterpret_cast<mstp_conf_bpdu*>(m_Data);
564  }
565 
567  uint16_t getVersion3Len() const;
568 
571  void setVersion3Len(uint16_t value);
572 
576  {
578  }
579 
583  {
585  }
586 
589  std::string getMstConfigurationName() const;
590 
594  void setMstConfigurationName(const std::string& value);
595 
598  uint16_t getMstConfigRevision() const;
599 
602  void setMstConfigRevision(uint16_t value);
603 
606  uint8_t* getMstConfigDigest() const
607  {
608  return getMstpHeader()->mstConfigDigest;
609  }
610 
614  void setMstConfigDigest(const uint8_t* value, uint8_t len);
615 
618  uint32_t getCISTIrpc() const;
619 
622  void setCISTIrpc(uint32_t value);
623 
626  uint64_t getCISTBridgeId() const;
627 
630  void setCISTBridgeId(uint64_t value);
631 
634  uint16_t getCISTBridgePriority() const;
635 
638  void setCISTBridgePriority(uint16_t value);
639 
643 
646  void setCISTBridgeSystemIDExtension(uint16_t value);
647 
651  {
652  return IDtoMacAddress(getCISTBridgeId());
653  }
654 
658 
661  uint8_t getRemainingHopCount() const
662  {
663  return getMstpHeader()->remainId;
664  }
665 
668  void setRemainingHopCount(uint8_t value)
669  {
670  getMstpHeader()->remainId = value;
671  }
672 
676  {
677  return (getVersion3Len() - (sizeof(mstp_conf_bpdu) - sizeof(rstp_conf_bpdu) - sizeof(uint16_t))) /
678  sizeof(msti_conf_msg);
679  }
680 
685 
686  // overridden methods
687 
689  void parseNextLayer() override
690  {}
691 
693  std::string toString() const override
694  {
695  return "Multiple Spanning Tree";
696  }
697 
702  static bool isDataValid(const uint8_t* data, size_t dataLen)
703  {
704  return canReinterpretAs<mstp_conf_bpdu>(data, dataLen);
705  }
706  };
707 } // namespace pcpp
Definition: Layer.h:116
void allocData(size_t dataLen, bool zeroInit=true)
Requests the layer to allocate a new data buffer of the specified length.
Definition: MacAddress.h:24
Definition: StpLayer.h:544
void setMstConfigRevision(uint16_t value)
uint8_t getNumberOfMSTIConfMessages() const
Definition: StpLayer.h:675
uint32_t getCISTIrpc() const
void setRemainingHopCount(uint8_t value)
Definition: StpLayer.h:668
void parseNextLayer() override
Parses next layer.
Definition: StpLayer.h:689
mstp_conf_bpdu * getMstpHeader() const
Definition: StpLayer.h:561
uint64_t getCISTBridgeId() const
void setCISTBridgeSystemIDExtension(uint16_t value)
uint16_t getCISTBridgePriority() const
uint16_t getMstConfigRevision() const
void setMstConfigDigest(const uint8_t *value, uint8_t len)
uint8_t getMstConfigurationFormatSelector() const
Definition: StpLayer.h:575
uint8_t * getMstConfigDigest() const
Definition: StpLayer.h:606
msti_conf_msg * getMstiConfMessages() const
void setCISTBridgeId(uint64_t value)
void setCISTBridgeSystemID(const pcpp::MacAddress &value)
void setVersion3Len(uint16_t value)
std::string getMstConfigurationName() const
void setMstConfigurationName(const std::string &value)
pcpp::MacAddress getCISTBridgeSystemID() const
Definition: StpLayer.h:650
void setCISTBridgePriority(uint16_t value)
void setCISTIrpc(uint32_t value)
uint16_t getCISTBridgeSystemIDExtension() const
MultipleStpLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: StpLayer.h:551
uint16_t getVersion3Len() const
std::string toString() const override
Definition: StpLayer.h:693
void setMstConfigurationFormatSelector(uint8_t value)
Definition: StpLayer.h:582
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:702
uint8_t getRemainingHopCount() const
Definition: StpLayer.h:661
Definition: Packet.h:48
Definition: StpLayer.h:473
uint8_t getVersion1Len() const
Definition: StpLayer.h:501
void parseNextLayer() override
Parses next layer.
std::string toString() const override
Definition: StpLayer.h:525
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:534
rstp_conf_bpdu * getRstpConfHeader() const
Definition: StpLayer.h:494
RapidStpLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: StpLayer.h:484
void setVersion1Len(uint8_t value)
Definition: StpLayer.h:508
size_t getHeaderLen() const override
Definition: StpLayer.h:516
Definition: StpLayer.h:285
void setBridgePriority(uint16_t value)
StpConfigurationBPDULayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: StpLayer.h:296
uint8_t getFlag() const
Definition: StpLayer.h:313
void setPathCost(uint32_t value)
size_t getHeaderLen() const override
Definition: StpLayer.h:446
void setRootId(uint64_t value)
void setForwardDelay(double value)
pcpp::MacAddress getRootSystemID() const
Definition: StpLayer.h:351
void setMaximumAge(double value)
void parseNextLayer() override
Parses next layer.
void setRootPriority(uint16_t value)
uint16_t getBridgeSystemIDExtension() const
void setBridgeSystemIDExtension(uint16_t value)
void setBridgeSystemID(const pcpp::MacAddress &value)
void setMessageAge(double value)
double getTransmissionInterval() const
stp_conf_bpdu * getStpConfHeader() const
Definition: StpLayer.h:306
uint16_t getBridgePriority() const
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:464
uint16_t getRootSystemIDExtension() const
void setFlag(uint8_t value)
Definition: StpLayer.h:320
void setRootSystemID(const pcpp::MacAddress &value)
void setRootSystemIDExtension(uint16_t value)
pcpp::MacAddress getBridgeSystemID() const
Definition: StpLayer.h:394
void setTransmissionInterval(double value)
void setBridgeId(uint64_t value)
std::string toString() const override
Definition: StpLayer.h:455
void setPortId(uint16_t value)
uint16_t getRootPriority() const
Definition: StpLayer.h:120
static StpLayer * parseStpLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
uint8_t getVersion() const
Definition: StpLayer.h:165
uint8_t getType() const
Definition: StpLayer.h:179
static pcpp::MacAddress StpUplinkFastMulticastDstMAC
STP Uplink Fast protocol uses "01:00:0C:CD:CD:CD" as destination MAC.
Definition: StpLayer.h:139
void setProtoId(uint16_t value)
Definition: StpLayer.h:158
void setType(uint8_t value)
Definition: StpLayer.h:186
uint16_t getProtoId() const
Definition: StpLayer.h:150
size_t getHeaderLen() const override
Definition: StpLayer.h:194
stp_header * getStpHeader() const
Definition: StpLayer.h:143
static pcpp::MacAddress StpMulticastDstMAC
STP protocol uses "01:80:C2:00:00:00" multicast address as destination MAC.
Definition: StpLayer.h:137
OsiModelLayer getOsiModelLayer() const override
Definition: StpLayer.h:204
void setVersion(uint8_t value)
Definition: StpLayer.h:172
void computeCalculateFields() override
Does nothing for this layer.
Definition: StpLayer.h:200
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:228
StpTopologyChangeBPDULayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: StpLayer.h:239
std::string toString() const override
Definition: StpLayer.h:266
stp_tcn_bpdu * getStpTcnHeader()
Definition: StpLayer.h:249
size_t getHeaderLen() const override
Definition: StpLayer.h:257
void parseNextLayer() override
Parses next layer.
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:276
const ProtocolType STP
Spanning Tree Protocol.
Definition: ProtocolType.h:195
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:267
@ OsiModelDataLinkLayer
Data link layer (layer 2)
Definition: ProtocolType.h:271
stp_tcn_bpdu stp_header
Spanning Tree protocol common header.
Definition: StpLayer.h:26
Definition: StpLayer.h:100
uint8_t portPriority
Priority value of port.
Definition: StpLayer.h:110
uint8_t bridgePriority
Priority value of switching device.
Definition: StpLayer.h:108
uint8_t flags
MSTI flags.
Definition: StpLayer.h:102
uint8_t remainingHops
Remaining hops of BPDU.
Definition: StpLayer.h:112
uint64_t regionalRootId
Regional root switching id (Priority (4 bits) + ID (12 bits) + Regional root (48 bits - MAC address))
Definition: StpLayer.h:104
uint32_t pathCost
Total path cost from local port to regional port.
Definition: StpLayer.h:106
Definition: StpLayer.h:74
uint8_t mstConfigFormatSelector
Configuration id format selector.
Definition: StpLayer.h:78
uint32_t irpc
CIST internal root path cost.
Definition: StpLayer.h:86
uint16_t version3Len
Version3 length.
Definition: StpLayer.h:76
uint8_t mstConfigName[32]
Configuration id name.
Definition: StpLayer.h:80
uint64_t cistBridgeId
CIST bridge id.
Definition: StpLayer.h:88
uint8_t remainId
CIST remaining hop count.
Definition: StpLayer.h:90
uint8_t mstConfigDigest[16]
Configuration id digest.
Definition: StpLayer.h:84
uint16_t mstConfigRevision
Configuration id revision.
Definition: StpLayer.h:82
Definition: StpLayer.h:63
uint8_t version1Len
Version1 length. The value is 0x0.
Definition: StpLayer.h:65
Definition: StpLayer.h:36
uint8_t flag
Flag for indicate purpose of BPDU.
Definition: StpLayer.h:38
uint64_t rootId
Root bridge ID.
Definition: StpLayer.h:40
uint64_t bridgeId
Bridge ID.
Definition: StpLayer.h:44
uint16_t helloTime
BPDU transmission interval.
Definition: StpLayer.h:52
uint16_t msgAge
Age of the BPDU.
Definition: StpLayer.h:48
uint16_t portId
Port ID.
Definition: StpLayer.h:46
uint16_t maxAge
Maximum age of the BPDU.
Definition: StpLayer.h:50
uint32_t pathCost
Cost of path.
Definition: StpLayer.h:42
uint16_t forwardDelay
Delay for STP.
Definition: StpLayer.h:54
Definition: StpLayer.h:17
uint8_t version
Protocol version. 0x0 for STP, 0x2 for RSTP, 0x3 for MSTP.
Definition: StpLayer.h:21
uint16_t protoId
Protocol ID. Fixed at 0x0, which represents IEEE 802.1d.
Definition: StpLayer.h:19
uint8_t type
Type of the BPDU. 0x0 for configuration, 0x2 for RSTP/MSTP, 0x80 for TCN.
Definition: StpLayer.h:23