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 
121  {
122  public:
123 #pragma pack(push, 1)
127  {
129  uint8_t version;
133  uint16_t holdTime;
135  uint32_t bgpId;
139 #pragma pack(pop)
140 
144  {
146  uint8_t type;
148  uint8_t length;
150  uint8_t value[32];
151 
152  // FIXME: This does not actually zero the data.
155  {}
156 
161  optional_parameter(uint8_t typeVal, const std::string& valueAsHexString);
162  };
163 
169  BgpOpenMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
170  : BgpLayer(data, dataLen, prevLayer, packet)
171  {}
172 
179  BgpOpenMessageLayer(uint16_t myAutonomousSystem, uint16_t holdTime, const IPv4Address& bgpId,
180  const std::vector<optional_parameter>& optionalParams = std::vector<optional_parameter>());
181 
186  {
187  return reinterpret_cast<bgp_open_message*>(m_Data);
188  }
189 
192  {
193  return IPv4Address(getOpenMsgHeader()->bgpId);
194  }
195 
198  void setBgpId(const IPv4Address& newBgpId);
199 
203  void getOptionalParameters(std::vector<optional_parameter>& optionalParameters);
204 
207 
215  bool setOptionalParameters(const std::vector<optional_parameter>& optionalParameters);
216 
222 
223  // implement abstract methods
224 
226  {
227  return BgpLayer::Open;
228  }
229 
230  private:
231  size_t optionalParamsToByteArray(const std::vector<optional_parameter>& optionalParams, uint8_t* resultByteArr,
232  size_t maxByteArrSize);
233  };
234 
238  {
239  public:
244  {
246  uint8_t prefix;
249 
252  {}
253 
257  prefix_and_ip(uint8_t prefixVal, const std::string& ipAddrVal) : prefix(prefixVal), ipAddr(ipAddrVal)
258  {}
259  };
260 
264  {
266  uint8_t flags;
268  uint8_t type;
270  uint8_t length;
272  uint8_t data[32];
273 
274  // FIXME: This does not actually zero the data.
277  {}
278 
285  path_attribute(uint8_t flagsVal, uint8_t typeVal, const std::string& dataAsHexString);
286  };
287 
293  BgpUpdateMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
294  : BgpLayer(data, dataLen, prevLayer, packet)
295  {}
296 
301  static bool isDataValid(const uint8_t* data, size_t dataSize);
302 
311  const std::vector<prefix_and_ip>& withdrawnRoutes = std::vector<prefix_and_ip>(),
312  const std::vector<path_attribute>& pathAttributes = std::vector<path_attribute>(),
313  const std::vector<prefix_and_ip>& nlri = std::vector<prefix_and_ip>());
314 
319  {
320  return reinterpret_cast<bgp_common_header*>(m_Data);
321  }
322 
324  size_t getWithdrawnRoutesLength() const;
325 
328  void getWithdrawnRoutes(std::vector<prefix_and_ip>& withdrawnRoutes);
329 
336  bool setWithdrawnRoutes(const std::vector<prefix_and_ip>& withdrawnRoutes);
337 
343 
345  size_t getPathAttributesLength() const;
346 
349  void getPathAttributes(std::vector<path_attribute>& pathAttributes);
350 
357  bool setPathAttributes(const std::vector<path_attribute>& pathAttributes);
358 
364 
367 
370  void getNetworkLayerReachabilityInfo(std::vector<prefix_and_ip>& nlri);
371 
378  bool setNetworkLayerReachabilityInfo(const std::vector<prefix_and_ip>& nlri);
379 
385 
386  // implement abstract methods
387 
389  {
390  return BgpLayer::Update;
391  }
392 
393  private:
394  void parsePrefixAndIPData(uint8_t* dataPtr, size_t dataLen, std::vector<prefix_and_ip>& result);
395 
396  size_t prefixAndIPDataToByteArray(const std::vector<prefix_and_ip>& prefixAndIpData, uint8_t* resultByteArr,
397  size_t maxByteArrSize);
398 
399  size_t pathAttributesToByteArray(const std::vector<path_attribute>& pathAttributes, uint8_t* resultByteArr,
400  size_t maxByteArrSize);
401  };
402 
406  {
407  public:
408 #pragma pack(push, 1)
412  {
414  uint8_t errorCode;
416  uint8_t errorSubCode;
418 #pragma pack(pop)
419 
425  BgpNotificationMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
426  : BgpLayer(data, dataLen, prevLayer, packet)
427  {}
428 
432  BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode);
433 
439  BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode, const uint8_t* notificationData,
440  size_t notificationDataLen);
441 
448  BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode, const std::string& notificationData);
449 
454  {
455  return reinterpret_cast<bgp_notification_message*>(m_Data);
456  }
457 
460  size_t getNotificationDataLen() const;
461 
464  uint8_t* getNotificationData() const;
465 
468  std::string getNotificationDataAsHexString() const;
469 
477  bool setNotificationData(const uint8_t* newNotificationData, size_t newNotificationDataLen);
478 
486  bool setNotificationData(const std::string& newNotificationDataAsHexString);
487 
488  // implement abstract methods
489 
491  {
492  return BgpLayer::Notification;
493  }
494 
495  private:
496  void initMessageData(uint8_t errorCode, uint8_t errorSubCode, const uint8_t* notificationData,
497  size_t notificationDataLen);
498  };
499 
503  {
504  public:
508 
514  BgpKeepaliveMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
515  : BgpLayer(data, dataLen, prevLayer, packet)
516  {}
517 
520 
525  {
526  return reinterpret_cast<bgp_keepalive_message*>(getBasicHeader());
527  }
528 
529  // implement abstract methods
530 
532  {
533  return BgpLayer::Keepalive;
534  }
535  };
536 
540  {
541  public:
542 #pragma pack(push, 1)
546  {
548  uint16_t afi;
550  uint8_t reserved;
552  uint8_t safi;
554 #pragma pack(pop)
555 
561  BgpRouteRefreshMessageLayer(uint8_t* data, size_t dataLen, Layer* prevLayer, Packet* packet)
562  : BgpLayer(data, dataLen, prevLayer, packet)
563  {}
564 
568  BgpRouteRefreshMessageLayer(uint16_t afi, uint8_t safi);
569 
574  {
575  return reinterpret_cast<bgp_route_refresh_message*>(getBasicHeader());
576  }
577 
578  // implement abstract methods
579 
581  {
582  return BgpLayer::RouteRefresh;
583  }
584  };
585 
586 } // namespace pcpp
Definition: BgpLayer.h:503
bgp_common_header bgp_keepalive_message
Definition: BgpLayer.h:507
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:531
BgpKeepaliveMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:514
bgp_keepalive_message * getKeepaliveHeader() const
Definition: BgpLayer.h:524
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:406
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:490
bool setNotificationData(const std::string &newNotificationDataAsHexString)
bgp_notification_message * getNotificationMsgHeader() const
Definition: BgpLayer.h:453
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:425
BgpNotificationMessageLayer(uint8_t errorCode, uint8_t errorSubCode, const uint8_t *notificationData, size_t notificationDataLen)
uint8_t * getNotificationData() const
Definition: BgpLayer.h:121
void getOptionalParameters(std::vector< optional_parameter > &optionalParameters)
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:225
BgpOpenMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:169
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:185
IPv4Address getBgpId() const
Definition: BgpLayer.h:191
size_t getOptionalParametersLength()
Definition: BgpLayer.h:540
BgpRouteRefreshMessageLayer(uint16_t afi, uint8_t safi)
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:580
BgpRouteRefreshMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:561
bgp_route_refresh_message * getRouteRefreshHeader() const
Definition: BgpLayer.h:573
Definition: BgpLayer.h:238
void getPathAttributes(std::vector< path_attribute > &pathAttributes)
BgpMessageType getBgpMessageType() const override
Definition: BgpLayer.h:388
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:318
void getNetworkLayerReachabilityInfo(std::vector< prefix_and_ip > &nlri)
BgpUpdateMessageLayer(uint8_t *data, size_t dataLen, Layer *prevLayer, Packet *packet)
Definition: BgpLayer.h:293
Definition: IpAddress.h:28
Definition: Layer.h:60
Definition: Packet.h:22
The main namespace for the PcapPlusPlus lib.
const ProtocolType BGP
Border Gateway Protocol (BGP) version 4 protocol.
Definition: ProtocolType.h:143
OsiModelLayer
An enum representing OSI model layers.
Definition: ProtocolType.h:225
@ OsiModelApplicationLayer
Application layer (layer 7)
Definition: ProtocolType.h:239
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:416
uint8_t errorCode
BGP notification error code.
Definition: BgpLayer.h:414
uint16_t holdTime
The number of seconds the sender proposes for the value of the Hold Timer.
Definition: BgpLayer.h:133
uint8_t version
BGP version number.
Definition: BgpLayer.h:129
uint32_t bgpId
BGP Identifier of the sender.
Definition: BgpLayer.h:135
uint16_t myAutonomousSystem
Autonomous System number of the sender.
Definition: BgpLayer.h:131
uint8_t optionalParameterLength
The total length of the Optional Parameters field.
Definition: BgpLayer.h:137
optional_parameter(uint8_t typeVal, const std::string &valueAsHexString)
uint8_t type
Parameter type.
Definition: BgpLayer.h:146
uint8_t length
Parameter length.
Definition: BgpLayer.h:148
optional_parameter()
A default c'tor that zeroes all data.
Definition: BgpLayer.h:154
uint8_t value[32]
Parameter data.
Definition: BgpLayer.h:150
uint8_t safi
Subsequent Address Family Identifier.
Definition: BgpLayer.h:552
uint16_t afi
Address Family Identifier.
Definition: BgpLayer.h:548
uint8_t reserved
Reserved field.
Definition: BgpLayer.h:550
path_attribute()
A default c'tor that zeroes all data.
Definition: BgpLayer.h:276
uint8_t type
Path attribute type.
Definition: BgpLayer.h:268
uint8_t flags
Path attribute flags.
Definition: BgpLayer.h:266
uint8_t data[32]
Path attribute data. Max supported data length is 32 bytes.
Definition: BgpLayer.h:272
path_attribute(uint8_t flagsVal, uint8_t typeVal, const std::string &dataAsHexString)
uint8_t length
Path attribute length.
Definition: BgpLayer.h:270
uint8_t prefix
IPv4 address mask, must contain one of the values: 8, 16, 24, 32.
Definition: BgpLayer.h:246
prefix_and_ip()
A default c'tor that zeroes all data.
Definition: BgpLayer.h:251
prefix_and_ip(uint8_t prefixVal, const std::string &ipAddrVal)
Definition: BgpLayer.h:257
IPv4Address ipAddr
IPv4 address.
Definition: BgpLayer.h:248