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;
152  uint8_t length;
154  uint8_t value[32];
155 
156  // FIXME: This does not actually zero the data.
159  {}
160 
165  optional_parameter(uint8_t typeVal, const std::string& valueAsHexString);
166  };
167 
173  BgpOpenMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
174  : BgpLayer(data, dataLen, prevLayer, packet)
175  {}
176 
183  BgpOpenMessageLayer(uint16_t myAutonomousSystem, uint16_t holdTime, const IPv4Address& bgpId,
184  const std::vector<optional_parameter>& optionalParams = std::vector<optional_parameter>());
185 
190  {
191  return reinterpret_cast<bgp_open_message*>(m_Data);
192  }
193 
196  {
197  return IPv4Address(getOpenMsgHeader()->bgpId);
198  }
199 
202  void setBgpId(const IPv4Address& newBgpId);
203 
207  void getOptionalParameters(std::vector<optional_parameter>& optionalParameters);
208 
211 
219  bool setOptionalParameters(const std::vector<optional_parameter>& optionalParameters);
220 
226 
227  // implement abstract methods
228 
230  {
231  return BgpLayer::Open;
232  }
233 
234  private:
235  size_t optionalParamsToByteArray(const std::vector<optional_parameter>& optionalParams, uint8_t* resultByteArr,
236  size_t maxByteArrSize);
237  };
238 
242  {
243  public:
248  {
250  uint8_t prefix;
253 
256  {}
257 
261  prefix_and_ip(uint8_t prefixVal, const std::string& ipAddrVal) : prefix(prefixVal), ipAddr(ipAddrVal)
262  {}
263  };
264 
268  {
270  uint8_t flags;
272  uint8_t type;
274  uint8_t length;
276  uint8_t data[32];
277 
278  // FIXME: This does not actually zero the data.
281  {}
282 
289  path_attribute(uint8_t flagsVal, uint8_t typeVal, const std::string& dataAsHexString);
290  };
291 
297  BgpUpdateMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
298  : BgpLayer(data, dataLen, prevLayer, packet)
299  {}
300 
305  static bool isDataValid(const uint8_t* data, size_t dataSize);
306 
315  const std::vector<prefix_and_ip>& withdrawnRoutes = std::vector<prefix_and_ip>(),
316  const std::vector<path_attribute>& pathAttributes = std::vector<path_attribute>(),
317  const std::vector<prefix_and_ip>& nlri = std::vector<prefix_and_ip>());
318 
323  {
324  return reinterpret_cast<bgp_common_header*>(m_Data);
325  }
326 
328  size_t getWithdrawnRoutesLength() const;
329 
332  void getWithdrawnRoutes(std::vector<prefix_and_ip>& withdrawnRoutes);
333 
340  bool setWithdrawnRoutes(const std::vector<prefix_and_ip>& withdrawnRoutes);
341 
347 
349  size_t getPathAttributesLength() const;
350 
353  void getPathAttributes(std::vector<path_attribute>& pathAttributes);
354 
361  bool setPathAttributes(const std::vector<path_attribute>& pathAttributes);
362 
368 
371 
374  void getNetworkLayerReachabilityInfo(std::vector<prefix_and_ip>& nlri);
375 
382  bool setNetworkLayerReachabilityInfo(const std::vector<prefix_and_ip>& nlri);
383 
389 
390  // implement abstract methods
391 
393  {
394  return BgpLayer::Update;
395  }
396 
397  private:
398  void parsePrefixAndIPData(uint8_t* dataPtr, size_t dataLen, std::vector<prefix_and_ip>& result);
399 
400  size_t prefixAndIPDataToByteArray(const std::vector<prefix_and_ip>& prefixAndIpData, uint8_t* resultByteArr,
401  size_t maxByteArrSize);
402 
403  size_t pathAttributesToByteArray(const std::vector<path_attribute>& pathAttributes, uint8_t* resultByteArr,
404  size_t maxByteArrSize);
405  };
406 
410  {
411  public:
412 #pragma pack(push, 1)
416  {
418  uint8_t errorCode;
420  uint8_t errorSubCode;
422 #pragma pack(pop)
423 
429  BgpNotificationMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
430  : BgpLayer(data, dataLen, prevLayer, packet)
431  {}
432 
436  BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode);
437 
443  BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode, const uint8_t* notificationData,
444  size_t notificationDataLen);
445 
452  BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode, const std::string& notificationData);
453 
458  {
459  return reinterpret_cast<bgp_notification_message*>(m_Data);
460  }
461 
464  size_t getNotificationDataLen() const;
465 
468  uint8_t* getNotificationData() const;
469 
472  std::string getNotificationDataAsHexString() const;
473 
481  bool setNotificationData(const uint8_t* newNotificationData, size_t newNotificationDataLen);
482 
490  bool setNotificationData(const std::string& newNotificationDataAsHexString);
491 
492  // implement abstract methods
493 
495  {
496  return BgpLayer::Notification;
497  }
498 
499  private:
500  void initMessageData(uint8_t errorCode, uint8_t errorSubCode, const uint8_t* notificationData,
501  size_t notificationDataLen);
502  };
503 
507  {
508  public:
512 
518  BgpKeepaliveMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
519  : BgpLayer(data, dataLen, prevLayer, packet)
520  {}
521 
524 
529  {
530  return reinterpret_cast<bgp_keepalive_message*>(getBasicHeader());
531  }
532 
533  // implement abstract methods
534 
536  {
537  return BgpLayer::Keepalive;
538  }
539  };
540 
544  {
545  public:
546 #pragma pack(push, 1)
550  {
552  uint16_t afi;
554  uint8_t reserved;
556  uint8_t safi;
558 #pragma pack(pop)
559 
565  BgpRouteRefreshMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
566  : BgpLayer(data, dataLen, prevLayer, packet)
567  {}
568 
572  BgpRouteRefreshMessageLayer(uint16_t afi, uint8_t safi);
573 
578  {
579  return reinterpret_cast<bgp_route_refresh_message*>(getBasicHeader());
580  }
581 
582  // implement abstract methods
583 
585  {
586  return BgpLayer::RouteRefresh;
587  }
588  };
589 
590 } // namespace pcpp
Definition: BgpLayer.h:507
bgp_common_header bgp_keepalive_message
Definition: BgpLayer.h:511
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:535
BgpKeepaliveMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:518
bgp_keepalive_message * getKeepaliveHeader() const
Definition: BgpLayer.h:528
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:410
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:494
bool setNotificationData(const std::string &newNotificationDataAsHexString)
bgp_notification_message * getNotificationMsgHeader() const
Definition: BgpLayer.h:457
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:429
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:229
BgpOpenMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:173
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:189
IPv4Address getBgpId() const
Definition: BgpLayer.h:195
size_t getOptionalParametersLength()
Definition: BgpLayer.h:544
BgpRouteRefreshMessageLayer(uint16_t afi, uint8_t safi)
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:584
BgpRouteRefreshMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:565
bgp_route_refresh_message * getRouteRefreshHeader() const
Definition: BgpLayer.h:577
Definition: BgpLayer.h:242
void getPathAttributes(std::vector< path_attribute > &pathAttributes)
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:392
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:322
void getNetworkLayerReachabilityInfo(std::vector< prefix_and_ip > &nlri)
BgpUpdateMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:297
Definition: IpAddress.h:30
Definition: Layer.h:62
Definition: Packet.h:22
const ProtocolType BGP
Border Gateway Protocol (BGP) version 4 protocol.
Definition: ProtocolType.h:165
The main namespace for the PcapPlusPlus lib.
Definition: AssertionUtils.h:19
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:261
@ OsiModelApplicationLayer
Application layer (layer 7)
Definition: ProtocolType.h:275
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:420
uint8_t errorCode
BGP notification error code.
Definition: BgpLayer.h:418
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
uint8_t length
Parameter length.
Definition: BgpLayer.h:152
optional_parameter()
A default c'tor that zeroes all data.
Definition: BgpLayer.h:158
uint8_t value[32]
Parameter data.
Definition: BgpLayer.h:154
uint8_t safi
Subsequent Address Family Identifier.
Definition: BgpLayer.h:556
uint16_t afi
Address Family Identifier.
Definition: BgpLayer.h:552
uint8_t reserved
Reserved field.
Definition: BgpLayer.h:554
path_attribute()
A default c'tor that zeroes all data.
Definition: BgpLayer.h:280
uint8_t type
Path attribute type.
Definition: BgpLayer.h:272
uint8_t flags
Path attribute flags.
Definition: BgpLayer.h:270
uint8_t data[32]
Path attribute data. Max supported data length is 32 bytes.
Definition: BgpLayer.h:276
path_attribute(uint8_t flagsVal, uint8_t typeVal, const std::string &dataAsHexString)
uint8_t length
Path attribute length.
Definition: BgpLayer.h:274
uint8_t prefix
IPv4 address mask, must contain one of the values: 8, 16, 24, 32.
Definition: BgpLayer.h:250
prefix_and_ip()
A default c'tor that zeroes all data.
Definition: BgpLayer.h:255
prefix_and_ip(uint8_t prefixVal, const std::string &ipAddrVal)
Definition: BgpLayer.h:261
IPv4Address ipAddr
IPv4 address.
Definition: BgpLayer.h:252