PcapPlusPlus  Next
BgpLayer.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include <vector>
4 #include "Layer.h"
5 #include "IpAddress.h"
6 
12 
15 namespace pcpp
16 {
17 
21  class BgpLayer : public Layer
22  {
23  public:
26  {
28  Open = 1,
30  Update = 2,
34  Keepalive = 4,
37  };
38 
39 #pragma pack(push, 1)
43  {
45  uint8_t marker[16];
47  uint16_t length;
49  uint8_t messageType;
50  };
51 #pragma pack(pop)
52  static_assert(sizeof(bgp_common_header) == 19, "bgp_common_header size is not 19 bytes");
53 
55  virtual BgpMessageType getBgpMessageType() const = 0;
56 
59  std::string getMessageTypeAsString() const;
60 
65  static bool isBgpPort(uint16_t portSrc, uint16_t portDst)
66  {
67  return portSrc == 179 || portDst == 179;
68  }
69 
78  static BgpLayer* parseBgpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet);
79 
80  // implement abstract methods
81 
83  size_t getHeaderLen() const override;
84 
87  void parseNextLayer() override;
88 
89  std::string toString() const override;
90 
92  {
94  }
95 
100  void computeCalculateFields() override;
101 
102  protected:
103  // protected c'tors, this class cannot be instantiated by users
104  BgpLayer()
105  {}
106  BgpLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
107  : Layer(data, dataLen, prevLayer, packet, BGP)
108  {}
109 
110  bgp_common_header* getBasicHeader() const
111  {
112  return reinterpret_cast<bgp_common_header*>(m_Data);
113  }
114 
115  void setBgpFields(size_t messageLen = 0);
116 
117  bool extendLayer(int offsetInLayer, size_t numOfBytesToExtend) override;
118 
119  bool shortenLayer(int offsetInLayer, size_t numOfBytesToShorten) override;
120  };
121 
125  {
126  public:
127 #pragma pack(push, 1)
131  {
133  uint8_t version;
137  uint16_t holdTime;
139  uint32_t bgpId;
143 #pragma pack(pop)
144 
148  {
150  uint8_t type = 0;
152  uint8_t length = 0;
154  uint8_t value[32] = {};
155 
157  optional_parameter() = default;
158 
163  optional_parameter(uint8_t typeVal, const std::string& valueAsHexString);
164  };
165 
171  BgpOpenMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
172  : BgpLayer(data, dataLen, prevLayer, packet)
173  {}
174 
179  static bool isDataValid(const uint8_t* data, size_t dataSize);
180 
188  BgpOpenMessageLayer(uint16_t myAutonomousSystem, uint16_t holdTime, const IPv4Address& bgpId,
189  const std::vector<optional_parameter>& optionalParams = std::vector<optional_parameter>());
190 
195  {
196  return reinterpret_cast<bgp_open_message*>(m_Data);
197  }
198 
201  {
202  return IPv4Address(getOpenMsgHeader()->bgpId);
203  }
204 
207  void setBgpId(const IPv4Address& newBgpId);
208 
212  void getOptionalParameters(std::vector<optional_parameter>& optionalParameters);
213 
216 
224  bool setOptionalParameters(const std::vector<optional_parameter>& optionalParameters);
225 
231 
232  // implement abstract methods
233 
235  {
236  return BgpLayer::Open;
237  }
238 
239  private:
243  size_t optionalParamsToByteArray(const std::vector<optional_parameter>& optionalParams, uint8_t* resultByteArr,
244  size_t maxByteArrSize);
245  };
246 
250  {
251  public:
256  {
258  uint8_t prefix;
261 
264  {}
265 
269  prefix_and_ip(uint8_t prefixVal, const std::string& ipAddrVal) : prefix(prefixVal), ipAddr(ipAddrVal)
270  {}
271  };
272 
276  {
278  uint8_t flags;
280  uint8_t type;
282  uint8_t length;
284  uint8_t data[32];
285 
286  // FIXME: This does not actually zero the data.
289  {}
290 
297  path_attribute(uint8_t flagsVal, uint8_t typeVal, const std::string& dataAsHexString);
298  };
299 
305  BgpUpdateMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
306  : BgpLayer(data, dataLen, prevLayer, packet)
307  {}
308 
313  static bool isDataValid(const uint8_t* data, size_t dataSize);
314 
323  const std::vector<prefix_and_ip>& withdrawnRoutes = std::vector<prefix_and_ip>(),
324  const std::vector<path_attribute>& pathAttributes = std::vector<path_attribute>(),
325  const std::vector<prefix_and_ip>& nlri = std::vector<prefix_and_ip>());
326 
331  {
332  return reinterpret_cast<bgp_common_header*>(m_Data);
333  }
334 
336  size_t getWithdrawnRoutesLength() const;
337 
340  void getWithdrawnRoutes(std::vector<prefix_and_ip>& withdrawnRoutes);
341 
348  bool setWithdrawnRoutes(const std::vector<prefix_and_ip>& withdrawnRoutes);
349 
355 
357  size_t getPathAttributesLength() const;
358 
361  void getPathAttributes(std::vector<path_attribute>& pathAttributes);
362 
369  bool setPathAttributes(const std::vector<path_attribute>& pathAttributes);
370 
376 
379 
382  void getNetworkLayerReachabilityInfo(std::vector<prefix_and_ip>& nlri);
383 
390  bool setNetworkLayerReachabilityInfo(const std::vector<prefix_and_ip>& nlri);
391 
397 
398  // implement abstract methods
399 
401  {
402  return BgpLayer::Update;
403  }
404 
405  private:
406  void parsePrefixAndIPData(uint8_t* dataPtr, size_t dataLen, std::vector<prefix_and_ip>& result);
407 
408  size_t prefixAndIPDataToByteArray(const std::vector<prefix_and_ip>& prefixAndIpData, uint8_t* resultByteArr,
409  size_t maxByteArrSize);
410 
411  size_t pathAttributesToByteArray(const std::vector<path_attribute>& pathAttributes, uint8_t* resultByteArr,
412  size_t maxByteArrSize);
413  };
414 
418  {
419  public:
420 #pragma pack(push, 1)
424  {
426  uint8_t errorCode;
428  uint8_t errorSubCode;
430 #pragma pack(pop)
431 
437  BgpNotificationMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
438  : BgpLayer(data, dataLen, prevLayer, packet)
439  {}
440 
444  BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode);
445 
451  BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode, const uint8_t* notificationData,
452  size_t notificationDataLen);
453 
460  BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode, const std::string& notificationData);
461 
466  {
467  return reinterpret_cast<bgp_notification_message*>(m_Data);
468  }
469 
472  size_t getNotificationDataLen() const;
473 
476  uint8_t* getNotificationData() const;
477 
480  std::string getNotificationDataAsHexString() const;
481 
489  bool setNotificationData(const uint8_t* newNotificationData, size_t newNotificationDataLen);
490 
498  bool setNotificationData(const std::string& newNotificationDataAsHexString);
499 
500  // implement abstract methods
501 
503  {
504  return BgpLayer::Notification;
505  }
506 
507  private:
508  void initMessageData(uint8_t errorCode, uint8_t errorSubCode, const uint8_t* notificationData,
509  size_t notificationDataLen);
510  };
511 
515  {
516  public:
520 
526  BgpKeepaliveMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
527  : BgpLayer(data, dataLen, prevLayer, packet)
528  {}
529 
532 
537  {
538  return reinterpret_cast<bgp_keepalive_message*>(getBasicHeader());
539  }
540 
541  // implement abstract methods
542 
544  {
545  return BgpLayer::Keepalive;
546  }
547  };
548 
552  {
553  public:
554 #pragma pack(push, 1)
558  {
560  uint16_t afi;
562  uint8_t reserved;
564  uint8_t safi;
566 #pragma pack(pop)
567 
573  BgpRouteRefreshMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
574  : BgpLayer(data, dataLen, prevLayer, packet)
575  {}
576 
580  BgpRouteRefreshMessageLayer(uint16_t afi, uint8_t safi);
581 
586  {
587  return reinterpret_cast<bgp_route_refresh_message*>(getBasicHeader());
588  }
589 
590  // implement abstract methods
591 
593  {
594  return BgpLayer::RouteRefresh;
595  }
596  };
597 
598 } // namespace pcpp
Definition: BgpLayer.h:515
bgp_common_header bgp_keepalive_message
Definition: BgpLayer.h:519
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:543
BgpKeepaliveMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:526
bgp_keepalive_message * getKeepaliveHeader() const
Definition: BgpLayer.h:536
BgpKeepaliveMessageLayer()
A c'tor that creates a new BGP KEEPALIVE message.
Definition: BgpLayer.h:22
void computeCalculateFields() override
static bool isBgpPort(uint16_t portSrc, uint16_t portDst)
Definition: BgpLayer.h:65
BgpMessageType
An enum representing BGP message types.
Definition: BgpLayer.h:26
@ RouteRefresh
BGP ROUTE-REFRESH message.
Definition: BgpLayer.h:36
@ Update
BGP UPDATE message.
Definition: BgpLayer.h:30
@ Keepalive
BGP KEEPALIVE message.
Definition: BgpLayer.h:34
@ Notification
BGP NOTIFICATION message.
Definition: BgpLayer.h:32
@ Open
BGP OPEN message.
Definition: BgpLayer.h:28
std::string toString() const override
std::string getMessageTypeAsString() const
OsiModelLayer getOsiModelLayer() const override
Definition: BgpLayer.h:91
size_t getHeaderLen() const override
void parseNextLayer() override
static BgpLayer * parseBgpLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
virtual BgpMessageType getBgpMessageType() const =0
Definition: BgpLayer.h:418
BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode)
BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode, const std::string &notificationData)
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:502
bool setNotificationData(const std::string &newNotificationDataAsHexString)
bgp_notification_message * getNotificationMsgHeader() const
Definition: BgpLayer.h:465
std::string getNotificationDataAsHexString() const
bool setNotificationData(const uint8_t *newNotificationData, size_t newNotificationDataLen)
BgpNotificationMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:437
BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode, const uint8_t *notificationData, size_t notificationDataLen)
uint8_t * getNotificationData() const
Definition: BgpLayer.h:125
void getOptionalParameters(std::vector< optional_parameter > &optionalParameters)
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:234
static bool isDataValid(const uint8_t *data, size_t dataSize)
BgpOpenMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:171
void setBgpId(const IPv4Address &newBgpId)
bool setOptionalParameters(const std::vector< optional_parameter > &optionalParameters)
BgpOpenMessageLayer(uint16_t myAutonomousSystem, uint16_t holdTime, const IPv4Address &bgpId, const std::vector< optional_parameter > &optionalParams=std::vector< optional_parameter >())
bgp_open_message * getOpenMsgHeader() const
Definition: BgpLayer.h:194
IPv4Address getBgpId() const
Definition: BgpLayer.h:200
size_t getOptionalParametersLength()
Definition: BgpLayer.h:552
BgpRouteRefreshMessageLayer(uint16_t afi, uint8_t safi)
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:592
BgpRouteRefreshMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:573
bgp_route_refresh_message * getRouteRefreshHeader() const
Definition: BgpLayer.h:585
Definition: BgpLayer.h:250
void getPathAttributes(std::vector< path_attribute > &pathAttributes)
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:400
BgpUpdateMessageLayer(const std::vector< prefix_and_ip > &withdrawnRoutes=std::vector< prefix_and_ip >(), const std::vector< path_attribute > &pathAttributes=std::vector< path_attribute >(), const std::vector< prefix_and_ip > &nlri=std::vector< prefix_and_ip >())
static bool isDataValid(const uint8_t *data, size_t dataSize)
void getWithdrawnRoutes(std::vector< prefix_and_ip > &withdrawnRoutes)
bool setPathAttributes(const std::vector< path_attribute > &pathAttributes)
bool setNetworkLayerReachabilityInfo(const std::vector< prefix_and_ip > &nlri)
size_t getNetworkLayerReachabilityInfoLength() const
bool setWithdrawnRoutes(const std::vector< prefix_and_ip > &withdrawnRoutes)
size_t getPathAttributesLength() const
size_t getWithdrawnRoutesLength() const
bgp_common_header * getBasicMsgHeader() const
Definition: BgpLayer.h:330
void getNetworkLayerReachabilityInfo(std::vector< prefix_and_ip > &nlri)
BgpUpdateMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:305
Definition: IpAddress.h:30
Definition: Layer.h:117
Definition: Packet.h:49
const ProtocolType BGP
Border Gateway Protocol (BGP) version 4 protocol.
Definition: ProtocolType.h:168
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:425
@ OsiModelApplicationLayer
Application layer (layer 7)
Definition: ProtocolType.h:441
Definition: BgpLayer.h:43
uint8_t messageType
BGP message type.
Definition: BgpLayer.h:49
uint8_t marker[16]
16-octet marker
Definition: BgpLayer.h:45
uint16_t length
Total length of the message, including the header.
Definition: BgpLayer.h:47
uint8_t errorSubCode
BGP notification error sub-code.
Definition: BgpLayer.h:428
uint8_t errorCode
BGP notification error code.
Definition: BgpLayer.h:426
uint16_t holdTime
The number of seconds the sender proposes for the value of the Hold Timer.
Definition: BgpLayer.h:137
uint8_t version
BGP version number.
Definition: BgpLayer.h:133
uint32_t bgpId
BGP Identifier of the sender.
Definition: BgpLayer.h:139
uint16_t myAutonomousSystem
Autonomous System number of the sender.
Definition: BgpLayer.h:135
uint8_t optionalParameterLength
The total length of the Optional Parameters field.
Definition: BgpLayer.h:141
optional_parameter(uint8_t typeVal, const std::string &valueAsHexString)
uint8_t type
Parameter type.
Definition: BgpLayer.h:150
optional_parameter()=default
A default c'tor that zeroes all data.
uint8_t length
Parameter length.
Definition: BgpLayer.h:152
uint8_t value[32]
Parameter data.
Definition: BgpLayer.h:154
uint8_t safi
Subsequent Address Family Identifier.
Definition: BgpLayer.h:564
uint16_t afi
Address Family Identifier.
Definition: BgpLayer.h:560
uint8_t reserved
Reserved field.
Definition: BgpLayer.h:562
path_attribute()
A default c'tor that zeroes all data.
Definition: BgpLayer.h:288
uint8_t type
Path attribute type.
Definition: BgpLayer.h:280
uint8_t flags
Path attribute flags.
Definition: BgpLayer.h:278
uint8_t data[32]
Path attribute data. Max supported data length is 32 bytes.
Definition: BgpLayer.h:284
path_attribute(uint8_t flagsVal, uint8_t typeVal, const std::string &dataAsHexString)
uint8_t length
Path attribute length.
Definition: BgpLayer.h:282
uint8_t prefix
IPv4 address mask, must contain one of the values: 8, 16, 24, 32.
Definition: BgpLayer.h:258
prefix_and_ip()
A default c'tor that zeroes all data.
Definition: BgpLayer.h:263
prefix_and_ip(uint8_t prefixVal, const std::string &ipAddrVal)
Definition: BgpLayer.h:269
IPv4Address ipAddr
IPv4 address.
Definition: BgpLayer.h:260