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  m_DataLen = dataLen;
129  m_Data = new uint8_t[dataLen];
130  memset(m_Data, 0, dataLen);
131  m_Protocol = STP;
132  }
133 
134  static pcpp::MacAddress IDtoMacAddress(uint64_t id);
135  static uint64_t macAddressToID(const pcpp::MacAddress& addr);
136 
137  public:
142 
146  {
147  return reinterpret_cast<stp_header*>(m_Data);
148  }
149 
152  uint16_t getProtoId() const
153  {
154  return getStpHeader()->protoId;
155  }
156 
159 
160  void setProtoId(uint16_t value)
161  {
162  getStpHeader()->protoId = value;
163  }
164 
167  uint8_t getVersion() const
168  {
169  return getStpHeader()->version;
170  }
171 
174  void setVersion(uint8_t value)
175  {
176  getStpHeader()->version = value;
177  }
178 
181  uint8_t getType() const
182  {
183  return getStpHeader()->type;
184  }
185 
188  void setType(uint8_t value)
189  {
190  getStpHeader()->type = value;
191  }
192 
193  // overridden methods
194 
196  size_t getHeaderLen() const override
197  {
198  return m_DataLen;
199  }
200 
202  void computeCalculateFields() override
203  {}
204 
207  {
208  return OsiModelDataLinkLayer;
209  }
210 
215  static bool isDataValid(const uint8_t* data, size_t dataLen);
216 
224  static StpLayer* parseStpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
225  };
226 
230  {
231  protected:
232  explicit StpTopologyChangeBPDULayer(size_t dataLen) : StpLayer(dataLen)
233  {}
234 
235  public:
241  StpTopologyChangeBPDULayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
242  : StpLayer(data, dataLen, prevLayer, packet)
243  {}
244 
248 
252  {
253  return getStpHeader();
254  }
255 
256  // overridden methods
257 
259  size_t getHeaderLen() const override
260  {
261  return sizeof(stp_tcn_bpdu);
262  }
263 
265  void parseNextLayer() override;
266 
268  std::string toString() const override
269  {
270  return "Spanning Tree Topology Change Notification";
271  }
272 
278  static bool isDataValid(const uint8_t* data, size_t dataLen)
279  {
280  return data && dataLen >= sizeof(stp_tcn_bpdu);
281  }
282  };
283 
287  {
288  protected:
289  explicit StpConfigurationBPDULayer(size_t dataLen) : StpTopologyChangeBPDULayer(dataLen)
290  {}
291 
292  public:
298  StpConfigurationBPDULayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
299  : StpTopologyChangeBPDULayer(data, dataLen, prevLayer, packet)
300  {}
301 
305 
309  {
310  return reinterpret_cast<stp_conf_bpdu*>(m_Data);
311  }
312 
315  uint8_t getFlag() const
316  {
317  return getStpConfHeader()->flag;
318  }
319 
322  void setFlag(uint8_t value)
323  {
324  getStpConfHeader()->flag = value;
325  }
326 
329  uint64_t getRootId() const;
330 
333  void setRootId(uint64_t value);
334 
337  uint16_t getRootPriority() const;
338 
341  void setRootPriority(uint16_t value);
342 
345  uint16_t getRootSystemIDExtension() const;
346 
349  void setRootSystemIDExtension(uint16_t value);
350 
354  {
355  return IDtoMacAddress(getRootId());
356  }
357 
360  void setRootSystemID(const pcpp::MacAddress& value);
361 
364  uint32_t getPathCost() const;
365 
368  void setPathCost(uint32_t value);
369 
372  uint64_t getBridgeId() const;
373 
376  void setBridgeId(uint64_t value);
377 
380  uint16_t getBridgePriority() const;
381 
384  void setBridgePriority(uint16_t value);
385 
388  uint16_t getBridgeSystemIDExtension() const;
389 
392  void setBridgeSystemIDExtension(uint16_t value);
393 
397  {
398  return IDtoMacAddress(getBridgeId());
399  }
400 
404 
407  uint16_t getPortId() const;
408 
411  void setPortId(uint16_t value);
412 
415  double getMessageAge() const;
416 
419  void setMessageAge(double value);
420 
423  double getMaximumAge() const;
424 
427  void setMaximumAge(double value);
428 
431  double getTransmissionInterval() const;
432 
435  void setTransmissionInterval(double value);
436 
439  double getForwardDelay() const;
440 
443  void setForwardDelay(double value);
444 
445  // overridden methods
446 
448  size_t getHeaderLen() const override
449  {
450  return sizeof(stp_conf_bpdu);
451  }
452 
454  void parseNextLayer() override;
455 
457  std::string toString() const override
458  {
459  return "Spanning Tree Configuration";
460  }
461 
466  static bool isDataValid(const uint8_t* data, size_t dataLen)
467  {
468  return data && dataLen >= sizeof(stp_conf_bpdu);
469  }
470  };
471 
475  {
476  protected:
477  explicit RapidStpLayer(size_t dataLen) : StpConfigurationBPDULayer(dataLen)
478  {}
479 
480  public:
486  RapidStpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
487  : StpConfigurationBPDULayer(data, dataLen, prevLayer, packet)
488  {}
489 
493 
497  {
498  return reinterpret_cast<rstp_conf_bpdu*>(m_Data);
499  }
500 
503  uint8_t getVersion1Len() const
504  {
505  return getRstpConfHeader()->version1Len;
506  }
507 
510  void setVersion1Len(uint8_t value)
511  {
512  getRstpConfHeader()->version1Len = value;
513  }
514 
515  // overridden methods
516 
518  size_t getHeaderLen() const override
519  {
520  return sizeof(rstp_conf_bpdu);
521  }
522 
524  void parseNextLayer() override;
525 
527  std::string toString() const override
528  {
529  return "Rapid Spanning Tree";
530  }
531 
536  static bool isDataValid(const uint8_t* data, size_t dataLen)
537  {
538  return data && dataLen >= sizeof(rstp_conf_bpdu);
539  }
540  };
541 
546  {
547  public:
553  MultipleStpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
554  : RapidStpLayer(data, dataLen, prevLayer, packet)
555  {}
556 
560 
564  {
565  return reinterpret_cast<mstp_conf_bpdu*>(m_Data);
566  }
567 
569  uint16_t getVersion3Len() const;
570 
573  void setVersion3Len(uint16_t value);
574 
578  {
580  }
581 
585  {
587  }
588 
591  std::string getMstConfigurationName() const;
592 
596  void setMstConfigurationName(const std::string& value);
597 
600  uint16_t getMstConfigRevision() const;
601 
604  void setMstConfigRevision(uint16_t value);
605 
608  uint8_t* getMstConfigDigest() const
609  {
610  return getMstpHeader()->mstConfigDigest;
611  }
612 
616  void setMstConfigDigest(const uint8_t* value, uint8_t len);
617 
620  uint32_t getCISTIrpc() const;
621 
624  void setCISTIrpc(uint32_t value);
625 
628  uint64_t getCISTBridgeId() const;
629 
632  void setCISTBridgeId(uint64_t value);
633 
636  uint16_t getCISTBridgePriority() const;
637 
640  void setCISTBridgePriority(uint16_t value);
641 
645 
648  void setCISTBridgeSystemIDExtension(uint16_t value);
649 
653  {
654  return IDtoMacAddress(getCISTBridgeId());
655  }
656 
660 
663  uint8_t getRemainingHopCount() const
664  {
665  return getMstpHeader()->remainId;
666  }
667 
670  void setRemainingHopCount(uint8_t value)
671  {
672  getMstpHeader()->remainId = value;
673  }
674 
678  {
679  return (getVersion3Len() - (sizeof(mstp_conf_bpdu) - sizeof(rstp_conf_bpdu) - sizeof(uint16_t))) /
680  sizeof(msti_conf_msg);
681  }
682 
687 
688  // overridden methods
689 
691  void parseNextLayer() override
692  {}
693 
695  std::string toString() const override
696  {
697  return "Multiple Spanning Tree";
698  }
699 
704  static bool isDataValid(const uint8_t* data, size_t dataLen)
705  {
706  return data && dataLen >= sizeof(mstp_conf_bpdu);
707  }
708  };
709 } // namespace pcpp
Definition: Layer.h:60
Definition: MacAddress.h:21
Definition: StpLayer.h:546
void setMstConfigRevision(uint16_t value)
uint8_t getNumberOfMSTIConfMessages() const
Definition: StpLayer.h:677
uint32_t getCISTIrpc() const
void setRemainingHopCount(uint8_t value)
Definition: StpLayer.h:670
void parseNextLayer() override
Parses next layer.
Definition: StpLayer.h:691
mstp_conf_bpdu * getMstpHeader() const
Definition: StpLayer.h:563
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:577
uint8_t * getMstConfigDigest() const
Definition: StpLayer.h:608
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:652
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:553
uint16_t getVersion3Len() const
std::string toString() const override
Definition: StpLayer.h:695
void setMstConfigurationFormatSelector(uint8_t value)
Definition: StpLayer.h:584
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:704
uint8_t getRemainingHopCount() const
Definition: StpLayer.h:663
Definition: Packet.h:22
Definition: StpLayer.h:475
uint8_t getVersion1Len() const
Definition: StpLayer.h:503
void parseNextLayer() override
Parses next layer.
std::string toString() const override
Definition: StpLayer.h:527
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:536
rstp_conf_bpdu * getRstpConfHeader() const
Definition: StpLayer.h:496
RapidStpLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: StpLayer.h:486
void setVersion1Len(uint8_t value)
Definition: StpLayer.h:510
size_t getHeaderLen() const override
Definition: StpLayer.h:518
Definition: StpLayer.h:287
void setBridgePriority(uint16_t value)
StpConfigurationBPDULayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: StpLayer.h:298
uint8_t getFlag() const
Definition: StpLayer.h:315
void setPathCost(uint32_t value)
size_t getHeaderLen() const override
Definition: StpLayer.h:448
void setRootId(uint64_t value)
void setForwardDelay(double value)
pcpp::MacAddress getRootSystemID() const
Definition: StpLayer.h:353
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:308
uint16_t getBridgePriority() const
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:466
uint16_t getRootSystemIDExtension() const
void setFlag(uint8_t value)
Definition: StpLayer.h:322
void setRootSystemID(const pcpp::MacAddress &value)
void setRootSystemIDExtension(uint16_t value)
pcpp::MacAddress getBridgeSystemID() const
Definition: StpLayer.h:396
void setTransmissionInterval(double value)
void setBridgeId(uint64_t value)
std::string toString() const override
Definition: StpLayer.h:457
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:167
uint8_t getType() const
Definition: StpLayer.h:181
static pcpp::MacAddress StpUplinkFastMulticastDstMAC
STP Uplink Fast protocol uses "01:00:0C:CD:CD:CD" as destination MAC.
Definition: StpLayer.h:141
void setProtoId(uint16_t value)
Definition: StpLayer.h:160
void setType(uint8_t value)
Definition: StpLayer.h:188
uint16_t getProtoId() const
Definition: StpLayer.h:152
size_t getHeaderLen() const override
Definition: StpLayer.h:196
stp_header * getStpHeader() const
Definition: StpLayer.h:145
static pcpp::MacAddress StpMulticastDstMAC
STP protocol uses "01:80:C2:00:00:00" multicast address as destination MAC.
Definition: StpLayer.h:139
OsiModelLayer getOsiModelLayer() const override
Definition: StpLayer.h:206
void setVersion(uint8_t value)
Definition: StpLayer.h:174
void computeCalculateFields() override
Does nothing for this layer.
Definition: StpLayer.h:202
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:230
StpTopologyChangeBPDULayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: StpLayer.h:241
std::string toString() const override
Definition: StpLayer.h:268
stp_tcn_bpdu * getStpTcnHeader()
Definition: StpLayer.h:251
size_t getHeaderLen() const override
Definition: StpLayer.h:259
void parseNextLayer() override
Parses next layer.
static bool isDataValid(const uint8_t *data, size_t dataLen)
Definition: StpLayer.h:278
The main namespace for the PcapPlusPlus lib.
const ProtocolType STP
Spanning Tree Protocol.
Definition: ProtocolType.h:173
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelDataLinkLayer
Data link layer (layer 2)
Definition: ProtocolType.h:229
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