OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
bgp_attr.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #ifndef SRC_BGP_BGP_ATTR_H_
6 #define SRC_BGP_BGP_ATTR_H_
7 
8 #include <boost/intrusive_ptr.hpp>
9 #include <tbb/atomic.h>
10 
11 #include <set>
12 #include <string>
13 #include <vector>
14 
15 #include "base/label_block.h"
16 #include "base/parse_object.h"
17 #include "base/util.h"
18 #include "base/address.h"
19 #include "bgp/bgp_aspath.h"
20 #include "bgp/bgp_attr_base.h"
21 #include "bgp/bgp_origin_vn_path.h"
22 #include "bgp/community.h"
23 #include "net/esi.h"
24 #include "net/mac_address.h"
25 #include "net/rd.h"
26 
27 class BgpAttr;
28 class BgpAttrDB;
29 class BgpOListDB;
30 class BgpServer;
31 class ClusterListDB;
32 class EdgeDiscoveryDB;
33 class EdgeForwardingDB;
34 class PmsiTunnelDB;
35 
36 // BGP UPDATE attributes: as-path, community, ext-community, next-hop,
37 // cluster-list, ...
38 // all information in the UPDATE except: NLRI (prefix) and label.
39 
40 struct BgpAttrOrigin : public BgpAttribute {
41  static const int kSize = 1;
42  static const uint8_t kFlags = Transitive;
44  explicit BgpAttrOrigin(const BgpAttribute &rhs)
45  : BgpAttribute(rhs), origin(IGP) {
46  }
47  explicit BgpAttrOrigin(int origin) :
48  BgpAttribute(Origin, kFlags), origin(origin) { }
49  enum OriginType {
50  IGP = 0,
51  EGP = 1,
53  };
54 
55  int origin;
56  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
57  virtual void ToCanonical(BgpAttr *attr);
58  virtual std::string ToString() const;
59 };
60 
61 struct BgpAttrNextHop : public BgpAttribute {
62  static const int kSize = 4;
63  static const uint8_t kFlags = Transitive;
65  explicit BgpAttrNextHop(const BgpAttribute &rhs)
66  : BgpAttribute(rhs), nexthop(0) {
67  }
68  explicit BgpAttrNextHop(uint32_t nexthop)
69  : BgpAttribute(NextHop, kFlags), nexthop(nexthop) {}
70  explicit BgpAttrNextHop(Ip4Address v4_nexthop)
71  : BgpAttribute(NextHop, kFlags), nexthop(v4_nexthop.to_ulong()) {}
73  : BgpAttribute(NextHop, kFlags), nexthop(0), v6_nexthop(v6_nexthop) {}
74  explicit BgpAttrNextHop(IpAddress ip_nexthop)
76  if (ip_nexthop.is_v4()) {
77  nexthop = ip_nexthop.to_v4().to_ulong();
78  } else if (ip_nexthop.is_v6()) {
79  v6_nexthop = ip_nexthop.to_v6();
80  }
81  }
82  uint32_t nexthop;
84  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
85  virtual void ToCanonical(BgpAttr *attr);
86  virtual std::string ToString() const;
87 };
88 
90  static const int kSize = 4;
91  static const uint8_t kFlags = Optional;
93  explicit BgpAttrMultiExitDisc(const BgpAttribute &rhs)
94  : BgpAttribute(rhs), med(0) {
95  }
96  explicit BgpAttrMultiExitDisc(uint32_t med) :
97  BgpAttribute(MultiExitDisc, kFlags), med(med) {}
98  uint32_t med;
99  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
100  virtual void ToCanonical(BgpAttr *attr);
101  virtual std::string ToString() const;
102 };
103 
105  static const int kDefault = 100;
106  static const int kSize = 4;
107  static const uint8_t kFlags = Transitive;
109  explicit BgpAttrLocalPref(const BgpAttribute &rhs)
110  : BgpAttribute(rhs), local_pref(0) {
111  }
112  explicit BgpAttrLocalPref(uint32_t local_pref)
113  : BgpAttribute(LocalPref, kFlags), local_pref(local_pref) {
114  }
115  uint32_t local_pref;
116  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
117  virtual void ToCanonical(BgpAttr *attr);
118  virtual std::string ToString() const;
119 };
120 
122  static const int kSize = 0;
123  static const uint8_t kFlags = Transitive;
126  : BgpAttribute(rhs) {
127  }
128  virtual void ToCanonical(BgpAttr *attr);
129  virtual std::string ToString() const;
130 };
131 
133  static const int kSize = 8;
134  static const uint8_t kFlags = Optional|Transitive;
137  }
138  explicit BgpAttrAs4Aggregator(const BgpAttribute &rhs)
139  : BgpAttribute(rhs), as_num(0), address(0) {
140  }
141  explicit BgpAttrAs4Aggregator(uint32_t as_num, uint32_t address) :
142  BgpAttribute(As4Aggregator, kFlags), as_num(as_num), address(address) {}
144  uint32_t address;
145  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
146  virtual void ToCanonical(BgpAttr *attr);
147  virtual std::string ToString() const;
148 };
149 
151  static const int kSize = 6;
152  static const uint8_t kFlags = Optional|Transitive;
155  }
156  explicit BgpAttrAggregator(const BgpAttribute &rhs)
157  : BgpAttribute(rhs), as_num(0), address(0) {
158  }
159  explicit BgpAttrAggregator(uint32_t as_num, uint32_t address) :
160  BgpAttribute(Aggregator, kFlags), as_num(as_num), address(address) {}
162  uint32_t address;
163  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
164  virtual void ToCanonical(BgpAttr *attr);
165  virtual std::string ToString() const;
166 };
167 
169  static const int kSize = 8;
170  static const uint8_t kFlags = Optional|Transitive;
173  }
175  : BgpAttribute(rhs), as_num(0), address(0) {
176  }
177  explicit BgpAttr4ByteAggregator(uint32_t as_num, uint32_t address) :
178  BgpAttribute(Aggregator, kFlags), as_num(as_num), address(address) {}
180  uint32_t address;
181  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
182  virtual void ToCanonical(BgpAttr *attr);
183  virtual std::string ToString() const;
184 };
185 
187  static const int kSize = 4;
188  static const uint8_t kFlags = Optional;
191  }
192  explicit BgpAttrOriginatorId(const BgpAttribute &rhs)
193  : BgpAttribute(rhs), originator_id(0) {
194  }
196  : BgpAttribute(OriginatorId, kFlags), originator_id(originator_id) {}
197  uint32_t originator_id;
198  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
199  virtual void ToCanonical(BgpAttr *attr);
200  virtual std::string ToString() const;
201 };
202 
203 struct ClusterListSpec : public BgpAttribute {
204  static const int kSize = -1;
205  static const uint8_t kFlags = Optional;
207  explicit ClusterListSpec(const BgpAttribute &rhs) : BgpAttribute(rhs) { }
208  explicit ClusterListSpec(const ClusterListSpec &rhs)
211  }
212  ClusterListSpec(uint32_t cluster_id, const ClusterListSpec *rhs);
213  virtual int CompareTo(const BgpAttribute &rhs) const;
214  virtual void ToCanonical(BgpAttr *attr);
215  virtual std::string ToString() const;
216  bool ClusterListLoop(uint32_t cluster_id) const;
217  std::vector<uint32_t> cluster_list;
218 };
219 
220 class ClusterList {
221 public:
222  ClusterList(ClusterListDB *cluster_list_db, const ClusterListSpec &spec);
224  void Remove();
225  int CompareTo(const ClusterList &rhs) const {
226  return spec_.CompareTo(rhs.cluster_list());
227  }
228 
229  const ClusterListSpec &cluster_list() const { return spec_; }
230  size_t size() const { return spec_.cluster_list.size(); }
231 
232  friend std::size_t hash_value(const ClusterList &cluster_list) {
233  size_t hash = 0;
234  return hash;
235  }
236 
237 private:
238  friend int intrusive_ptr_add_ref(const ClusterList *ccluster_list);
239  friend int intrusive_ptr_del_ref(const ClusterList *ccluster_list);
240  friend void intrusive_ptr_release(const ClusterList *ccluster_list);
241  friend class ClusterListDB;
242 
243  mutable tbb::atomic<int> refcount_;
246 };
247 
248 inline int intrusive_ptr_add_ref(const ClusterList *ccluster_list) {
249  return ccluster_list->refcount_.fetch_and_increment();
250 }
251 
252 inline int intrusive_ptr_del_ref(const ClusterList *ccluster_list) {
253  return ccluster_list->refcount_.fetch_and_decrement();
254 }
255 
256 inline void intrusive_ptr_release(const ClusterList *ccluster_list) {
257  int prev = ccluster_list->refcount_.fetch_and_decrement();
258  if (prev == 1) {
259  ClusterList *cluster_list = const_cast<ClusterList *>(ccluster_list);
260  cluster_list->Remove();
261  assert(cluster_list->refcount_ == 0);
262  delete cluster_list;
263  }
264 }
265 
266 typedef boost::intrusive_ptr<ClusterList> ClusterListPtr;
267 
269  bool operator()(const ClusterList *lhs, const ClusterList *rhs) {
270  return lhs->CompareTo(*rhs) < 0;
271  }
272 };
273 
274 class ClusterListDB : public BgpPathAttributeDB<ClusterList, ClusterListPtr,
275  ClusterListSpec,
276  ClusterListCompare,
277  ClusterListDB> {
278 public:
279  explicit ClusterListDB(BgpServer *server);
280 };
281 
282 struct BgpMpNlri : public BgpAttribute {
283  static const int kSize = -1;
284  static const uint8_t kFlags = Optional;
285  // Always using extended length for MP NLRI
288  BgpAttribute(code, ExtendedLength|kFlags), afi(0), safi(0) {}
289  explicit BgpMpNlri(BgpAttribute::Code code, uint16_t afi, uint8_t safi,
290  std::vector<uint8_t> nh) :
291  BgpAttribute(code, ExtendedLength|kFlags), afi(afi), safi(safi),
292  nexthop(nh) {}
293  explicit BgpMpNlri(BgpAttribute::Code code, uint16_t afi, uint8_t safi) :
294  BgpAttribute(code, ExtendedLength|kFlags), afi(afi), safi(safi) {
295  nexthop.clear();
296  }
297  explicit BgpMpNlri(const BgpAttribute &rhs)
298  : BgpAttribute(rhs), afi(0), safi(0) {
299  }
302  }
303  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
304  virtual void ToCanonical(BgpAttr *attr);
305  virtual size_t EncodeLength() const;
306 
307  uint16_t afi;
308  uint8_t safi;
309  std::vector<uint8_t> nexthop;
310 
311  std::vector<BgpProtoPrefix *> nlri;
312 };
313 
314 struct PmsiTunnelSpec : public BgpAttribute {
315  enum Flags {
319  };
320 
321  enum ARType {
322  RegularNVE = 0 << 3,
323  ARReplicator = 1 << 3,
324  ARLeaf = 2 << 3
325  };
326 
327  enum Type {
337  };
338 
339  static const int kSize = -1;
340  static const uint8_t kFlags = Optional | Transitive;
341 
342  PmsiTunnelSpec();
343  explicit PmsiTunnelSpec(const BgpAttribute &rhs);
344 
345  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
346  virtual void ToCanonical(BgpAttr *attr);
347  virtual std::string ToString() const;
348 
349  uint32_t GetLabel(const ExtCommunity *ext) const;
350  void SetLabel(uint32_t label, const ExtCommunity *ext);
351  Ip4Address GetIdentifier() const;
353 
354  std::string GetTunnelTypeString() const;
355  std::string GetTunnelArTypeString() const;
356  std::vector<std::string> GetTunnelFlagsStrings() const;
357 
358  uint8_t tunnel_flags;
359  uint8_t tunnel_type;
360  uint32_t label;
361  std::vector<uint8_t> identifier;
362 };
363 
364 class PmsiTunnel {
365 public:
366  PmsiTunnel(PmsiTunnelDB *pmsi_tunnel_db, const PmsiTunnelSpec &pmsi_spec);
367  virtual ~PmsiTunnel() { }
368  virtual void Remove();
369  int CompareTo(const PmsiTunnel &rhs) const {
370  return pmsi_spec_.CompareTo(rhs.pmsi_tunnel());
371  }
372 
373  const PmsiTunnelSpec &pmsi_tunnel() const { return pmsi_spec_; }
374  uint32_t GetLabel(const ExtCommunity *ext) const;
375 
376  friend std::size_t hash_value(const PmsiTunnel &pmsi_tunnel) {
377  size_t hash = 0;
378  boost::hash_combine(hash, pmsi_tunnel.pmsi_tunnel().ToString());
379  return hash;
380  }
381 
382  const uint8_t tunnel_flags() const { return tunnel_flags_; }
383  const uint8_t tunnel_type() const { return tunnel_type_; }
384  const Ip4Address identifier() const { return identifier_; }
385  const uint32_t label() const { return label_; }
386 
387 private:
388  friend int intrusive_ptr_add_ref(const PmsiTunnel *cpmsi_tunnel);
389  friend int intrusive_ptr_del_ref(const PmsiTunnel *cpmsi_tunnel);
390  friend void intrusive_ptr_release(const PmsiTunnel *cpmsi_tunnel);
391  friend class PmsiTunnelDB;
392 
393  uint8_t tunnel_flags_;
394  uint8_t tunnel_type_;
396  uint32_t label_;
397  mutable tbb::atomic<int> refcount_;
400 };
401 
402 inline int intrusive_ptr_add_ref(const PmsiTunnel *cpmsi_tunnel) {
403  return cpmsi_tunnel->refcount_.fetch_and_increment();
404 }
405 
406 inline int intrusive_ptr_del_ref(const PmsiTunnel *cpmsi_tunnel) {
407  return cpmsi_tunnel->refcount_.fetch_and_decrement();
408 }
409 
410 inline void intrusive_ptr_release(const PmsiTunnel *cpmsi_tunnel) {
411  int prev = cpmsi_tunnel->refcount_.fetch_and_decrement();
412  if (prev == 1) {
413  PmsiTunnel *pmsi_tunnel = const_cast<PmsiTunnel *>(cpmsi_tunnel);
414  pmsi_tunnel->Remove();
415  assert(pmsi_tunnel->refcount_ == 0);
416  delete pmsi_tunnel;
417  }
418 }
419 
420 typedef boost::intrusive_ptr<PmsiTunnel> PmsiTunnelPtr;
421 
423  bool operator()(const PmsiTunnel *lhs, const PmsiTunnel *rhs) {
424  return lhs->CompareTo(*rhs) < 0;
425  }
426 };
427 
428 class PmsiTunnelDB : public BgpPathAttributeDB<PmsiTunnel, PmsiTunnelPtr,
429  PmsiTunnelSpec,
430  PmsiTunnelCompare,
431  PmsiTunnelDB> {
432 public:
433  explicit PmsiTunnelDB(BgpServer *server);
434 };
435 
437  static const int kSize = -1;
438  static const uint8_t kFlags = Optional | Transitive;
440  explicit EdgeDiscoverySpec(const BgpAttribute &rhs);
441  explicit EdgeDiscoverySpec(const EdgeDiscoverySpec &rhs);
443 
444  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
445  virtual void ToCanonical(BgpAttr *attr);
446  virtual std::string ToString() const;
447  virtual size_t EncodeLength() const;
448 
449  struct Edge : public ParseObject {
450  Ip4Address GetIp4Address() const;
451  void SetIp4Address(Ip4Address addr);
452  void GetLabels(uint32_t *first_label, uint32_t *last_label) const;
453  void SetLabels(uint32_t first_label, uint32_t last_label);
454 
455  std::vector<uint8_t> address;
456  std::vector<uint32_t> labels;
457  };
458  typedef std::vector<Edge *> EdgeList;
460 };
461 
463 public:
464  EdgeDiscovery(EdgeDiscoveryDB *edge_discovery_db,
465  const EdgeDiscoverySpec &edspec);
466  virtual ~EdgeDiscovery();
467  virtual void Remove();
468  int CompareTo(const EdgeDiscovery &rhs) const;
469 
470  const EdgeDiscoverySpec &edge_discovery() const { return edspec_; }
471 
472  friend std::size_t hash_value(const EdgeDiscovery &edge_discovery) {
473  size_t hash = 0;
474  boost::hash_combine(hash, edge_discovery.edge_discovery().ToString());
475  return hash;
476  }
477 
478  struct Edge {
479  explicit Edge(const EdgeDiscoverySpec::Edge *edge_spec);
482  bool operator<(const Edge &rhs) const;
483  };
484  typedef std::vector<Edge *> EdgeList;
485 
486  struct EdgeCompare {
487  bool operator()(const Edge *lhs, const Edge *rhs) {
488  BOOL_KEY_COMPARE(*lhs, *rhs);
489  return false;
490  }
491  };
492 
494 
495 private:
496  friend int intrusive_ptr_add_ref(const EdgeDiscovery *ediscovery);
497  friend int intrusive_ptr_del_ref(const EdgeDiscovery *ediscovery);
498  friend void intrusive_ptr_release(const EdgeDiscovery *ediscovery);
499  friend class EdgeDiscoveryDB;
500 
501  mutable tbb::atomic<int> refcount_;
504 };
505 
506 inline int intrusive_ptr_add_ref(const EdgeDiscovery *cediscovery) {
507  return cediscovery->refcount_.fetch_and_increment();
508 }
509 
510 inline int intrusive_ptr_del_ref(const EdgeDiscovery *cediscovery) {
511  return cediscovery->refcount_.fetch_and_decrement();
512 }
513 
514 inline void intrusive_ptr_release(const EdgeDiscovery *cediscovery) {
515  int prev = cediscovery->refcount_.fetch_and_decrement();
516  if (prev == 1) {
517  EdgeDiscovery *ediscovery = const_cast<EdgeDiscovery *>(cediscovery);
518  ediscovery->Remove();
519  assert(ediscovery->refcount_ == 0);
520  delete ediscovery;
521  }
522 }
523 
524 typedef boost::intrusive_ptr<EdgeDiscovery> EdgeDiscoveryPtr;
525 
527  bool operator()(const EdgeDiscovery *lhs, const EdgeDiscovery *rhs) {
528  return lhs->CompareTo(*rhs) < 0;
529  }
530 };
531 
532 class EdgeDiscoveryDB : public BgpPathAttributeDB<EdgeDiscovery,
533  EdgeDiscoveryPtr,
534  EdgeDiscoverySpec,
535  EdgeDiscoveryCompare,
536  EdgeDiscoveryDB> {
537 public:
538  explicit EdgeDiscoveryDB(BgpServer *server);
539 };
540 
542  static const int kSize = -1;
543  static const uint8_t kFlags = Optional | Transitive;
545  explicit EdgeForwardingSpec(const BgpAttribute &rhs);
546  explicit EdgeForwardingSpec(const EdgeForwardingSpec &rhs);
548 
549  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
550  virtual void ToCanonical(BgpAttr *attr);
551  virtual std::string ToString() const;
552  virtual size_t EncodeLength() const;
553 
554  struct Edge : public ParseObject {
557  void SetInboundIp4Address(Ip4Address addr);
559 
561  std::vector<uint8_t> inbound_address, outbound_address;
563  };
564  typedef std::vector<Edge *> EdgeList;
565 
567 };
568 
570 public:
571  EdgeForwarding(EdgeForwardingDB *edge_forwarding_db,
572  const EdgeForwardingSpec &efspec);
573  virtual ~EdgeForwarding();
574  virtual void Remove();
575  int CompareTo(const EdgeForwarding &rhs) const;
576 
577  const EdgeForwardingSpec &edge_forwarding() const { return efspec_; }
578 
579  friend std::size_t hash_value(const EdgeForwarding &edge_forwarding) {
580  size_t hash = 0;
581  boost::hash_combine(hash, edge_forwarding.edge_forwarding().ToString());
582  return hash;
583  }
584 
585  struct Edge {
586  explicit Edge(const EdgeForwardingSpec::Edge *edge_spec);
587  bool operator<(const Edge &rhs) const;
590  };
591  typedef std::vector<Edge *> EdgeList;
592 
593  struct EdgeCompare {
594  bool operator()(const Edge *lhs, const Edge *rhs) {
595  BOOL_KEY_COMPARE(*lhs, *rhs);
596  return false;
597  }
598  };
599 
601 
602 private:
603  friend int intrusive_ptr_add_ref(const EdgeForwarding *ceforwarding);
604  friend int intrusive_ptr_del_ref(const EdgeForwarding *ceforwarding);
605  friend void intrusive_ptr_release(const EdgeForwarding *ceforwarding);
606  friend class EdgeForwardingDB;
607 
608  mutable tbb::atomic<int> refcount_;
611 };
612 
613 inline int intrusive_ptr_add_ref(const EdgeForwarding *ceforwarding) {
614  return ceforwarding->refcount_.fetch_and_increment();
615 }
616 
617 inline int intrusive_ptr_del_ref(const EdgeForwarding *ceforwarding) {
618  return ceforwarding->refcount_.fetch_and_decrement();
619 }
620 
621 inline void intrusive_ptr_release(const EdgeForwarding *ceforwarding) {
622  int prev = ceforwarding->refcount_.fetch_and_decrement();
623  if (prev == 1) {
624  EdgeForwarding *eforwarding =
625  const_cast<EdgeForwarding *>(ceforwarding);
626  eforwarding->Remove();
627  assert(eforwarding->refcount_ == 0);
628  delete eforwarding;
629  }
630 }
631 
632 typedef boost::intrusive_ptr<EdgeForwarding> EdgeForwardingPtr;
633 
635  bool operator()(const EdgeForwarding *lhs, const EdgeForwarding *rhs) {
636  return lhs->CompareTo(*rhs) < 0;
637  }
638 };
639 
640 class EdgeForwardingDB : public BgpPathAttributeDB<EdgeForwarding,
641  EdgeForwardingPtr,
642  EdgeForwardingSpec,
643  EdgeForwardingCompare,
644  EdgeForwardingDB> {
645 public:
646  explicit EdgeForwardingDB(BgpServer *server);
647 };
648 
650  static const int kSize = 0;
652  explicit BgpAttrLabelBlock(const BgpAttribute &rhs) : BgpAttribute(rhs) {}
655  label_block(label_block) {
656  }
658  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
659  virtual void ToCanonical(BgpAttr *attr);
660  virtual std::string ToString() const;
661 };
662 
664 public:
666  std::vector<std::string> encap = std::vector<std::string>())
667  : address(address), label(label), encap(encap) {
668  }
669 
670  bool operator<(const BgpOListElem &rhs) const;
671 
673  uint32_t label;
674  std::vector<std::string> encap;
675 };
676 
678  bool operator()(const BgpOListElem *lhs, const BgpOListElem *rhs) {
679  BOOL_KEY_COMPARE(*lhs, *rhs);
680  return false;
681  }
682 };
683 
684 struct BgpOListSpec : public BgpAttribute {
685  static const int kSize = 0;
687  explicit BgpOListSpec(uint8_t subcode) : BgpAttribute(0, subcode, 0) {}
688 
689  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
690  virtual void ToCanonical(BgpAttr *attr);
691  virtual std::string ToString() const;
692 
693  typedef std::vector<BgpOListElem> Elements;
695 };
696 
697 class BgpOList {
698 public:
699  BgpOList(BgpOListDB *olist_db, const BgpOListSpec &olist_spec);
700  virtual ~BgpOList();
701  virtual void Remove();
702  int CompareTo(const BgpOList &rhs) const;
703 
704  const BgpOListSpec &olist() const { return olist_spec_; }
705 
706  friend std::size_t hash_value(const BgpOList &olist) {
707  size_t hash = 0;
708  boost::hash_combine(hash, olist.olist().ToString());
709  return hash;
710  }
711 
712  typedef std::vector<BgpOListElem *> Elements;
713 
714  const Elements &elements() const { return elements_; }
715 
716 private:
717  friend int intrusive_ptr_add_ref(const BgpOList *colist);
718  friend int intrusive_ptr_del_ref(const BgpOList *colist);
719  friend void intrusive_ptr_release(const BgpOList *colist);
720  friend class BgpOListDB;
721 
723  mutable tbb::atomic<int> refcount_;
726 };
727 
728 inline int intrusive_ptr_add_ref(const BgpOList *colist) {
729  return colist->refcount_.fetch_and_increment();
730 }
731 
732 inline int intrusive_ptr_del_ref(const BgpOList *colist) {
733  return colist->refcount_.fetch_and_decrement();
734 }
735 
736 inline void intrusive_ptr_release(const BgpOList *colist) {
737  int prev = colist->refcount_.fetch_and_decrement();
738  if (prev == 1) {
739  BgpOList *olist = const_cast<BgpOList *>(colist);
740  olist->Remove();
741  assert(olist->refcount_ == 0);
742  delete olist;
743  }
744 }
745 
746 typedef boost::intrusive_ptr<BgpOList> BgpOListPtr;
747 
749  bool operator()(const BgpOList *lhs, const BgpOList *rhs) {
750  return lhs->CompareTo(*rhs) < 0;
751  }
752 };
753 
754 class BgpOListDB : public BgpPathAttributeDB<BgpOList,
755  BgpOListPtr,
756  BgpOListSpec,
757  BgpOListCompare,
758  BgpOListDB> {
759 public:
760  explicit BgpOListDB(BgpServer *server);
761 };
762 
763 struct BgpAttrUnknown : public BgpAttribute {
765  explicit BgpAttrUnknown(const BgpAttribute &rhs) : BgpAttribute(rhs) {}
766  std::vector<uint8_t> value;
767 };
768 
769 struct BgpAttrSourceRd : public BgpAttribute {
771  explicit BgpAttrSourceRd(const BgpAttribute &rhs) : BgpAttribute(rhs) {}
773  : BgpAttribute(0, SourceRd, 0), source_rd(source_rd) {
774  }
776  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
777  virtual void ToCanonical(BgpAttr *attr);
778  virtual std::string ToString() const;
779 };
780 
781 struct BgpAttrEsi : public BgpAttribute {
783  explicit BgpAttrEsi(const BgpAttribute &rhs) : BgpAttribute(rhs) {}
785  : BgpAttribute(0, Esi, 0), esi(esi) {
786  }
788  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
789  virtual void ToCanonical(BgpAttr *attr);
790  virtual std::string ToString() const;
791 };
792 
795  explicit BgpAttrSubProtocol(const BgpAttribute &rhs) : BgpAttribute(rhs) {}
796  explicit BgpAttrSubProtocol(const std::string &sbp)
797  : BgpAttribute(0, SubProtocol, 0), sbp(sbp) {
798  }
799  std::string sbp;
800  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
801  virtual void ToCanonical(BgpAttr *attr);
802  virtual std::string ToString() const;
803 };
804 
805 struct BgpAttrParams : public BgpAttribute {
806  enum Flags {
807  TestFlag = 1 << 0
808  };
809 
811  explicit BgpAttrParams(const BgpAttribute &rhs)
812  : BgpAttribute(rhs), params(0) {
813  }
814  explicit BgpAttrParams(uint64_t params) :
815  BgpAttribute(0, Params, 0), params(params) {}
816  uint64_t params;
817  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
818  virtual void ToCanonical(BgpAttr *attr);
819  virtual std::string ToString() const;
820 };
821 
822 typedef std::vector<BgpAttribute *> BgpAttrSpec;
823 
824 // Canonicalized BGP attribute
825 class BgpAttr {
826 public:
827  BgpAttr();
828  explicit BgpAttr(BgpAttrDB *attr_db);
829  explicit BgpAttr(const BgpAttr &rhs);
830  BgpAttr(BgpAttrDB *attr_db, const BgpAttrSpec &spec);
831  virtual ~BgpAttr() { }
832  virtual void Remove();
833 
834  int CompareTo(const BgpAttr &rhs) const;
835 
838  void set_med(uint32_t med) { med_ = med; }
840  void set_atomic_aggregate(bool ae) { atomic_aggregate_ = ae; }
841  void set_aggregator(as_t as_num, IpAddress address) {
842  aggregator_as_num_ = as_num;
843  aggregator_address_ = address;
844  }
845  void set_as4_aggregator(as_t as_num, IpAddress address) {
846  aggregator_as4_num_ = as_num;
847  aggregator_address_ = address;
848  }
851  }
854  }
855  void set_esi(const EthernetSegmentId &esi) { esi_ = esi; }
856  void set_params(uint64_t params) { params_ = params; }
857  void set_as_path(AsPathPtr aspath);
858  void set_as_path(const AsPathSpec *spec);
859  void set_as4_path(As4PathPtr aspath);
860  void set_as4_path(const As4PathSpec *spec);
861  void set_aspath_4byte(AsPath4BytePtr aspath);
862  void set_aspath_4byte(const AsPath4ByteSpec *spec);
863  void set_cluster_list(const ClusterListSpec *spec);
864  void set_community(CommunityPtr comm);
865  void set_community(const CommunitySpec *comm);
866  void set_ext_community(ExtCommunityPtr extcomm);
867  void set_ext_community(const ExtCommunitySpec *extcomm);
868  void set_origin_vn_path(OriginVnPathPtr ovnpath);
869  void set_origin_vn_path(const OriginVnPathSpec *spec);
870  void set_pmsi_tunnel(const PmsiTunnelSpec *pmsi_spec);
871  void set_edge_discovery(const EdgeDiscoverySpec *edspec);
872  void set_edge_forwarding(const EdgeForwardingSpec *efspec);
874  void set_olist(const BgpOListSpec *olist_spec);
875  void set_leaf_olist(const BgpOListSpec *leaf_olist_spec);
876  void set_sub_protocol(const std::string &sub_protocol) {
878  }
879  friend std::size_t hash_value(BgpAttr const &attr);
880 
882  static std::string OriginToString(BgpAttrOrigin::OriginType origin);
883  static BgpAttrOrigin::OriginType OriginFromString(const std::string &bgp_origin_type);
884  std::string origin_string() const;
885 
886  const IpAddress &nexthop() const { return nexthop_; }
888  uint32_t med() const { return med_; }
889  uint32_t local_pref() const { return local_pref_; }
890  bool atomic_aggregate() const { return atomic_aggregate_; }
893  as_t neighbor_as() const;
895  const Ip4Address &originator_id() const { return originator_id_; }
896  const RouteDistinguisher &source_rd() const { return source_rd_; }
897  const EthernetSegmentId &esi() const { return esi_; }
898  uint64_t params() const { return params_; }
899  const AsPath *as_path() const { return as_path_.get(); }
900  int as_path_count() const { return as_path_ ? as_path_->AsCount() : 0; }
901  int max_as_path_count() const;
902  const AsPath4Byte *aspath_4byte() const { return aspath_4byte_.get(); }
903  int aspath_4byte_count() const {
904  return aspath_4byte_ ? aspath_4byte_->AsCount() : 0;
905  }
906  int IsAsPathLoop(as_t asn, uint8_t max_loop_count = 0) const;
907  const ClusterList *cluster_list() const { return cluster_list_.get(); }
908  size_t cluster_list_length() const {
909  return cluster_list_ ? cluster_list_->size() : 0;
910  }
911  const As4Path *as4_path() const { return as4_path_.get(); }
912  int as4_path_count() const { return as4_path_ ? as4_path_->AsCount() : 0; }
913  bool IsAsPathEmpty() const;
914  const Community *community() const { return community_.get(); }
915  const ExtCommunity *ext_community() const { return ext_community_.get(); }
916  const OriginVnPath *origin_vn_path() const { return origin_vn_path_.get(); }
917  const PmsiTunnel *pmsi_tunnel() const { return pmsi_tunnel_.get(); }
918  const EdgeDiscovery *edge_discovery() const {
919  return edge_discovery_.get();
920  }
922  return edge_forwarding_.get();
923  }
925  BgpOListPtr olist() const { return olist_; }
926  BgpOListPtr leaf_olist() const { return leaf_olist_; }
927  const std::string &sub_protocol() const { return sub_protocol_; }
928  BgpAttrDB *attr_db() { return attr_db_; }
929  const BgpAttrDB *attr_db() const { return attr_db_; }
930  uint32_t sequence_number() const;
931  bool evpn_sticky_mac() const;
932  bool etree_leaf() const;
933  bool evpn_single_active() const;
934  MacAddress mac_address() const;
935 
936 private:
937  friend class BgpAttrDB;
938  friend class BgpAttrTest;
939  friend int intrusive_ptr_add_ref(const BgpAttr *cattrp);
940  friend int intrusive_ptr_del_ref(const BgpAttr *cattrp);
941  friend void intrusive_ptr_release(const BgpAttr *cattrp);
942 
943  mutable tbb::atomic<int> refcount_;
947  uint32_t med_;
948  uint32_t local_pref_;
956  uint64_t params_;
968  BgpOListPtr olist_;
969  BgpOListPtr leaf_olist_;
970  std::string sub_protocol_;
971 };
972 
973 inline int intrusive_ptr_add_ref(const BgpAttr *cattrp) {
974  return cattrp->refcount_.fetch_and_increment();
975 }
976 
977 inline int intrusive_ptr_del_ref(const BgpAttr *cattrp) {
978  return cattrp->refcount_.fetch_and_decrement();
979 }
980 
981 inline void intrusive_ptr_release(const BgpAttr *cattrp) {
982  int prev = cattrp->refcount_.fetch_and_decrement();
983  if (prev == 1) {
984  BgpAttr *attrp = const_cast<BgpAttr *>(cattrp);
985  attrp->Remove();
986  assert(attrp->refcount_ == 0);
987  delete attrp;
988  }
989 }
990 
991 typedef boost::intrusive_ptr<const BgpAttr> BgpAttrPtr;
992 
994  bool operator()(const BgpAttr *lhs, const BgpAttr *rhs) {
995  return lhs->CompareTo(*rhs) < 0;
996  }
997 };
998 
999 class BgpAttrDB : public BgpPathAttributeDB<BgpAttr, BgpAttrPtr, BgpAttrSpec,
1000  BgpAttrCompare, BgpAttrDB> {
1001 public:
1002  explicit BgpAttrDB(BgpServer *server);
1003  BgpAttrPtr ReplaceAsPathAndLocate(const BgpAttr *attr,
1004  AsPathPtr aspath);
1005  BgpAttrPtr ReplaceCommunityAndLocate(const BgpAttr *attr,
1006  CommunityPtr community);
1007  BgpAttrPtr ReplaceOriginAndLocate(const BgpAttr *attr,
1008  BgpAttrOrigin::OriginType origin);
1009  BgpAttrPtr ReplaceExtCommunityAndLocate(const BgpAttr *attr,
1010  ExtCommunityPtr extcomm);
1011  BgpAttrPtr ReplaceOriginVnPathAndLocate(const BgpAttr *attr,
1012  OriginVnPathPtr ovnpath);
1013  BgpAttrPtr ReplaceLocalPreferenceAndLocate(const BgpAttr *attr,
1014  uint32_t local_pref);
1015  BgpAttrPtr ReplaceOriginatorIdAndLocate(const BgpAttr *attr,
1016  Ip4Address originator_id);
1017  BgpAttrPtr ReplaceSourceRdAndLocate(const BgpAttr *attr,
1018  const RouteDistinguisher &source_rd);
1019  BgpAttrPtr ReplaceEsiAndLocate(const BgpAttr *attr,
1020  const EthernetSegmentId &esi);
1021  BgpAttrPtr ReplaceOListAndLocate(const BgpAttr *attr,
1022  const BgpOListSpec *olist_spec);
1023  BgpAttrPtr ReplaceLeafOListAndLocate(const BgpAttr *attr,
1024  const BgpOListSpec *leaf_olist_spec);
1025  BgpAttrPtr ReplacePmsiTunnelAndLocate(const BgpAttr *attr,
1026  const PmsiTunnelSpec *pmsi_spec);
1027  BgpAttrPtr ReplaceNexthopAndLocate(const BgpAttr *attr,
1028  const IpAddress &addr);
1029  BgpAttrPtr ReplaceSubProtocolAndLocate(const BgpAttr *attr,
1030  const std::string &sbp);
1031  BgpServer *server() { return server_; }
1032  const BgpServer *server() const { return server_; }
1033 
1034 private:
1036 };
1037 
1038 #endif // SRC_BGP_BGP_ATTR_H_
EthernetSegmentId esi
Definition: bgp_attr.h:787
virtual ~EdgeForwarding()
Definition: bgp_attr.cc:700
virtual void Remove()
Definition: bgp_attr.cc:719
const Community * community() const
Definition: bgp_attr.h:914
tbb::atomic< int > refcount_
Definition: bgp_attr.h:397
boost::intrusive_ptr< const AsPath > AsPathPtr
Definition: bgp_aspath.h:165
EdgeDiscoveryPtr edge_discovery_
Definition: bgp_attr.h:965
void SetIp4Address(Ip4Address addr)
Definition: bgp_attr.cc:450
int intrusive_ptr_add_ref(const AsPath *cpath)
Definition: bgp_aspath.h:147
BgpAttrPtr ReplaceLeafOListAndLocate(const BgpAttr *attr, const BgpOListSpec *leaf_olist_spec)
Definition: bgp_attr.cc:1387
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:47
Elements elements
Definition: bgp_attr.h:694
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:150
std::vector< std::string > encap
Definition: bgp_attr.h:674
Ip4Address GetIdentifier() const
Definition: bgp_attr.cc:334
const Ip4Address identifier() const
Definition: bgp_attr.h:384
Ip4Address GetInboundIp4Address() const
Definition: bgp_attr.cc:594
static const uint8_t kFlags
Definition: bgp_attr.h:340
Elements elements_
Definition: bgp_attr.h:722
std::vector< Edge * > EdgeList
Definition: bgp_attr.h:458
std::vector< uint8_t > value
Definition: bgp_attr.h:766
const BgpOListSpec & olist() const
Definition: bgp_attr.h:704
uint16_t afi
Definition: bgp_attr.h:307
as_t neighbor_as() const
Definition: bgp_attr.cc:1132
const ClusterListSpec & cluster_list() const
Definition: bgp_attr.h:229
tbb::atomic< int > refcount_
Definition: bgp_attr.h:723
std::vector< BgpProtoPrefix * > nlri
Definition: bgp_attr.h:311
uint32_t originator_id
Definition: bgp_attr.h:197
friend int intrusive_ptr_del_ref(const PmsiTunnel *cpmsi_tunnel)
Definition: bgp_attr.h:406
static const uint8_t kFlags
Definition: bgp_attr.h:438
tbb::atomic< int > refcount_
Definition: bgp_attr.h:243
uint32_t local_pref() const
Definition: bgp_attr.h:889
EdgeForwarding(EdgeForwardingDB *edge_forwarding_db, const EdgeForwardingSpec &efspec)
Definition: bgp_attr.cc:687
BgpAttrMultiExitDisc(uint32_t med)
Definition: bgp_attr.h:96
BgpServer * server_
Definition: bgp_attr.h:1035
const IpAddress & nexthop() const
Definition: bgp_attr.h:886
void STLDeleteValues(Container *container)
Definition: util.h:101
BgpAttrPtr ReplaceOriginatorIdAndLocate(const BgpAttr *attr, Ip4Address originator_id)
Definition: bgp_attr.cc:1354
ExtCommunityPtr ext_community_
Definition: bgp_attr.h:962
const BgpServer * server() const
Definition: bgp_attr.h:1032
void set_pmsi_tunnel(const PmsiTunnelSpec *pmsi_spec)
Definition: bgp_attr.cc:1035
bool etree_leaf() const
Definition: bgp_attr.cc:1168
friend void intrusive_ptr_release(const EdgeDiscovery *ediscovery)
Definition: bgp_attr.h:514
static const int kSize
Definition: bgp_attr.h:169
LabelBlockPtr label_block() const
Definition: bgp_attr.h:924
BgpAttrAs4Aggregator(uint32_t as_num, uint32_t address)
Definition: bgp_attr.h:141
std::vector< uint8_t > outbound_address
Definition: bgp_attr.h:561
void GetLabels(uint32_t *first_label, uint32_t *last_label) const
Definition: bgp_attr.cc:456
virtual std::string ToString() const
Definition: bgp_attr.cc:492
virtual size_t EncodeLength() const
Definition: bgp_attr.cc:509
friend void intrusive_ptr_release(const BgpOList *colist)
Definition: bgp_attr.h:736
static const int kSize
Definition: bgp_attr.h:122
void set_nexthop(IpAddress nexthop)
Definition: bgp_attr.h:837
static const int kSize
Definition: bgp_attr.h:542
boost::intrusive_ptr< PmsiTunnel > PmsiTunnelPtr
Definition: bgp_attr.h:420
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:809
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:305
std::vector< std::string > GetTunnelFlagsStrings() const
Definition: bgp_attr.cc:386
std::string sub_protocol_
Definition: bgp_attr.h:970
BgpAttrPtr ReplaceCommunityAndLocate(const BgpAttr *attr, CommunityPtr community)
Definition: bgp_attr.cc:1314
void set_cluster_list(const ClusterListSpec *spec)
Definition: bgp_attr.cc:991
bool operator()(const EdgeDiscovery *lhs, const EdgeDiscovery *rhs)
Definition: bgp_attr.h:527
tbb::atomic< int > refcount_
Definition: bgp_attr.h:943
boost::intrusive_ptr< const As4Path > As4PathPtr
Definition: bgp_aspath.h:481
const EdgeForwardingSpec & edge_forwarding() const
Definition: bgp_attr.h:577
static const uint8_t kFlags
Definition: bgp_attr.h:123
RouteDistinguisher source_rd_
Definition: bgp_attr.h:954
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:21
virtual std::string ToString() const
Definition: bgp_attr.cc:212
As4PathPtr as4_path_
Definition: bgp_attr.h:959
void set_origin(BgpAttrOrigin::OriginType org)
Definition: bgp_attr.h:836
Family
Definition: address.h:24
uint32_t local_pref_
Definition: bgp_attr.h:948
const BgpAttrDB * attr_db() const
Definition: bgp_attr.h:929
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:836
friend std::size_t hash_value(const EdgeDiscovery &edge_discovery)
Definition: bgp_attr.h:472
boost::asio::ip::address IpAddress
Definition: address.h:13
BgpAttr4ByteAggregator(uint32_t as_num, uint32_t address)
Definition: bgp_attr.h:177
BgpOListPtr olist() const
Definition: bgp_attr.h:925
EdgeDiscovery(EdgeDiscoveryDB *edge_discovery_db, const EdgeDiscoverySpec &edspec)
Definition: bgp_attr.cc:534
PmsiTunnelSpec pmsi_spec_
Definition: bgp_attr.h:399
static const uint8_t kFlags
Definition: bgp_attr.h:42
std::vector< uint8_t > address
Definition: bgp_attr.h:455
PmsiTunnel(PmsiTunnelDB *pmsi_tunnel_db, const PmsiTunnelSpec &pmsi_spec)
Definition: bgp_attr.cc:400
void SetOutboundIp4Address(Ip4Address addr)
Definition: bgp_attr.cc:609
EdgeList edge_list
Definition: bgp_attr.h:459
virtual void Remove()
Definition: bgp_attr.cc:566
uint32_t label_
Definition: bgp_attr.h:396
virtual std::string ToString() const
Definition: bgp_attr.cc:840
int CompareTo(const EdgeForwarding &rhs) const
Definition: bgp_attr.cc:712
EdgeForwardingSpec efspec_
Definition: bgp_attr.h:610
IpAddress aggregator_address_
Definition: bgp_attr.h:952
boost::intrusive_ptr< LabelBlock > LabelBlockPtr
Definition: label_block.h:18
BgpMpNlri(BgpAttribute::Code code, uint16_t afi, uint8_t safi, std::vector< uint8_t > nh)
Definition: bgp_attr.h:289
BgpAttrPtr ReplaceNexthopAndLocate(const BgpAttr *attr, const IpAddress &addr)
Definition: bgp_attr.cc:1413
OriginVnPathPtr origin_vn_path_
Definition: bgp_attr.h:963
virtual std::string ToString() const
Definition: bgp_attr.cc:183
uint8_t tunnel_type
Definition: bgp_attr.h:359
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:171
LabelBlockPtr label_block
Definition: bgp_attr.h:481
Ip6Address v6_nexthop
Definition: bgp_attr.h:83
const OriginVnPath * origin_vn_path() const
Definition: bgp_attr.h:916
void set_edge_discovery(const EdgeDiscoverySpec *edspec)
Definition: bgp_attr.cc:1043
const uint8_t tunnel_type() const
Definition: bgp_attr.h:383
void set_community(CommunityPtr comm)
Definition: bgp_attr.cc:999
as_t aggregator_as4_num_
Definition: bgp_attr.h:951
virtual void Remove()
Definition: bgp_attr.cc:411
std::vector< BgpAttribute * > BgpAttrSpec
Definition: bgp_attr.h:822
BgpAttrNextHop(IpAddress ip_nexthop)
Definition: bgp_attr.h:74
virtual ~BgpOList()
Definition: bgp_attr.cc:783
void Remove()
Definition: bgp_attr.cc:239
static const int kSize
Definition: bgp_attr.h:204
static const uint8_t kFlags
Definition: bgp_attr.h:170
EdgeList edge_list
Definition: bgp_attr.h:600
const Ip4Address & originator_id() const
Definition: bgp_attr.h:895
BgpAttrOriginatorId(const BgpAttribute &rhs)
Definition: bgp_attr.h:192
BgpAttr()
Definition: bgp_attr.cc:901
BgpAttrEsi(const EthernetSegmentId &esi)
Definition: bgp_attr.h:784
const IpAddress & aggregator_adderess() const
Definition: bgp_attr.h:894
size_t size() const
Definition: bgp_attr.h:230
bool operator()(const BgpOList *lhs, const BgpOList *rhs)
Definition: bgp_attr.h:749
friend int intrusive_ptr_add_ref(const ClusterList *ccluster_list)
Definition: bgp_attr.h:248
uint64_t params_
Definition: bgp_attr.h:956
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:847
BgpAttrSourceRd(const RouteDistinguisher &source_rd)
Definition: bgp_attr.h:772
virtual std::string ToString() const
Definition: bgp_attr.cc:894
friend int intrusive_ptr_add_ref(const PmsiTunnel *cpmsi_tunnel)
Definition: bgp_attr.h:402
static const uint8_t kFlags
Definition: bgp_attr.h:543
const RouteDistinguisher & source_rd() const
Definition: bgp_attr.h:896
virtual std::string ToString() const
Definition: bgp_attr.cc:821
BgpAttrAtomicAggregate(const BgpAttribute &rhs)
Definition: bgp_attr.h:125
BgpMpNlri()
Definition: bgp_attr.h:286
virtual std::string ToString() const
Definition: bgp_attr.cc:749
uint32_t as_t
Definition: bgp_common.h:21
Edge(const EdgeDiscoverySpec::Edge *edge_spec)
Definition: bgp_attr.cc:520
static const int kDefault
Definition: bgp_attr.h:105
BgpAttrDB * attr_db_
Definition: bgp_attr.h:944
uint32_t inbound_label
Definition: bgp_attr.h:589
std::string origin_string() const
Definition: bgp_attr.cc:1120
tbb::atomic< int > refcount_
Definition: bgp_attr.h:608
std::vector< uint32_t > cluster_list
Definition: bgp_attr.h:217
BgpAttrEsi(const BgpAttribute &rhs)
Definition: bgp_attr.h:783
Ip4Address address
Definition: bgp_attr.h:672
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:138
virtual std::string ToString() const
Definition: bgp_attr.cc:142
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:97
void set_as_path(AsPathPtr aspath)
Definition: bgp_attr.cc:955
void set_source_rd(const RouteDistinguisher &source_rd)
Definition: bgp_attr.h:852
Ip4Address originator_id_
Definition: bgp_attr.h:953
BgpAttrPtr ReplaceExtCommunityAndLocate(const BgpAttr *attr, ExtCommunityPtr extcomm)
Definition: bgp_attr.cc:1330
virtual std::string ToString() const
Definition: bgp_attr.cc:121
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:477
void set_aggregator(as_t as_num, IpAddress address)
Definition: bgp_attr.h:841
bool operator<(const Edge &rhs) const
Definition: bgp_attr.cc:527
virtual size_t EncodeLength() const
Definition: bgp_attr.cc:660
int IsAsPathLoop(as_t asn, uint8_t max_loop_count=0) const
Definition: bgp_attr.cc:1214
MacAddress mac_address() const
Definition: bgp_attr.cc:1196
boost::intrusive_ptr< const OriginVnPath > OriginVnPathPtr
std::vector< BgpOListElem * > Elements
Definition: bgp_attr.h:712
virtual int CompareTo(const BgpAttribute &rhs) const
Definition: bgp_attr.cc:200
friend int intrusive_ptr_del_ref(const BgpAttr *cattrp)
Definition: bgp_attr.h:977
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:159
BgpAttrDB * attr_db()
Definition: bgp_attr.h:928
boost::intrusive_ptr< const AsPath4Byte > AsPath4BytePtr
Definition: bgp_aspath.h:323
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:865
virtual ~BgpAttr()
Definition: bgp_attr.h:831
void set_sub_protocol(const std::string &sub_protocol)
Definition: bgp_attr.h:876
friend int intrusive_ptr_del_ref(const EdgeDiscovery *ediscovery)
Definition: bgp_attr.h:510
Ip4Address GetIp4Address() const
Definition: bgp_attr.cc:446
void set_esi(const EthernetSegmentId &esi)
Definition: bgp_attr.h:855
Ip4Address address
Definition: bgp_attr.h:480
boost::intrusive_ptr< const BgpAttr > BgpAttrPtr
Definition: bgp_attr.h:991
BgpMpNlri(BgpAttribute::Code code, uint16_t afi, uint8_t safi)
Definition: bgp_attr.h:293
bool operator()(const PmsiTunnel *lhs, const PmsiTunnel *rhs)
Definition: bgp_attr.h:423
static const int kSize
Definition: bgp_attr.h:106
Ip4Address inbound_address
Definition: bgp_attr.h:588
const std::string & sub_protocol() const
Definition: bgp_attr.h:927
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:739
BgpAttrSubProtocol(const BgpAttribute &rhs)
Definition: bgp_attr.h:795
static const int kSize
Definition: bgp_attr.h:339
virtual std::string ToString() const
Definition: bgp_attr.cc:55
virtual void Remove()
Definition: bgp_attr.cc:1210
Ip4Address GetOutboundIp4Address() const
Definition: bgp_attr.cc:598
const uint8_t tunnel_flags() const
Definition: bgp_attr.h:382
uint8_t tunnel_type_
Definition: bgp_attr.h:394
BgpAttrLocalPref(const BgpAttribute &rhs)
Definition: bgp_attr.h:109
friend int intrusive_ptr_add_ref(const EdgeForwarding *ceforwarding)
Definition: bgp_attr.h:613
void SetInboundIp4Address(Ip4Address addr)
Definition: bgp_attr.cc:602
ClusterListSpec(const BgpAttribute &rhs)
Definition: bgp_attr.h:207
~BgpMpNlri()
Definition: bgp_attr.h:300
void set_params(uint64_t params)
Definition: bgp_attr.h:856
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:294
BgpAttrPtr ReplaceEsiAndLocate(const BgpAttr *attr, const EthernetSegmentId &esi)
Definition: bgp_attr.cc:1370
static const int kSize
Definition: bgp_attr.h:650
void set_leaf_olist(const BgpOListSpec *leaf_olist_spec)
Definition: bgp_attr.cc:1073
const AsPath4Byte * aspath_4byte() const
Definition: bgp_attr.h:902
friend std::size_t hash_value(const BgpOList &olist)
Definition: bgp_attr.h:706
std::vector< Edge * > EdgeList
Definition: bgp_attr.h:564
PmsiTunnelPtr pmsi_tunnel_
Definition: bgp_attr.h:964
const ClusterList * cluster_list() const
Definition: bgp_attr.h:907
#define BOOL_KEY_COMPARE(x, y)
Definition: util.h:64
bool evpn_single_active() const
Definition: bgp_attr.cc:1182
BgpAttrOrigin::OriginType origin_
Definition: bgp_attr.h:945
uint32_t outbound_label
Definition: bgp_attr.h:589
static const int kSize
Definition: bgp_attr.h:437
static std::string OriginToString(BgpAttrOrigin::OriginType origin)
Definition: bgp_attr.cc:1095
uint16_t as2_t
Definition: bgp_common.h:22
bool operator<(const Edge &rhs) const
Definition: bgp_attr.cc:679
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:627
uint32_t label
Definition: bgp_attr.h:360
void SetLabels(uint32_t first_label, uint32_t last_label)
Definition: bgp_attr.cc:462
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:28
BgpOListSpec olist_spec_
Definition: bgp_attr.h:725
const EthernetSegmentId & esi() const
Definition: bgp_attr.h:897
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:117
friend int intrusive_ptr_add_ref(const BgpOList *colist)
Definition: bgp_attr.h:728
boost::intrusive_ptr< const ExtCommunity > ExtCommunityPtr
Definition: community.h:448
BgpAttr4ByteAggregator(const BgpAttribute &rhs)
Definition: bgp_attr.h:174
boost::asio::ip::address_v6 Ip6Address
Definition: address.h:15
int CompareTo(const EdgeDiscovery &rhs) const
Definition: bgp_attr.cc:559
BgpAttrPtr ReplaceSubProtocolAndLocate(const BgpAttr *attr, const std::string &sbp)
Definition: bgp_attr.cc:1396
friend int intrusive_ptr_del_ref(const BgpOList *colist)
Definition: bgp_attr.h:732
ClusterList(ClusterListDB *cluster_list_db, const ClusterListSpec &spec)
Definition: bgp_attr.cc:232
std::string GetTunnelArTypeString() const
Definition: bgp_attr.cc:372
std::vector< Edge * > EdgeList
Definition: bgp_attr.h:591
static const int kSize
Definition: bgp_attr.h:151
int CompareTo(const PmsiTunnel &rhs) const
Definition: bgp_attr.h:369
void SetIdentifier(Ip4Address identifier)
Definition: bgp_attr.cc:340
std::vector< Edge * > EdgeList
Definition: bgp_attr.h:484
static const int kSize
Definition: bgp_attr.h:133
BgpAttrPtr ReplaceLocalPreferenceAndLocate(const BgpAttr *attr, uint32_t local_pref)
Definition: bgp_attr.cc:1346
BgpAttrLabelBlock(const BgpAttribute &rhs)
Definition: bgp_attr.h:652
int CompareTo(const BgpAttr &rhs) const
Definition: bgp_attr.cc:1229
static const int kSize
Definition: bgp_attr.h:41
int as4_path_count() const
Definition: bgp_attr.h:912
BgpMpNlri(BgpAttribute::Code code)
Definition: bgp_attr.h:287
static const int kSize
Definition: bgp_attr.h:283
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:39
ClusterListSpec spec_
Definition: bgp_attr.h:245
friend void intrusive_ptr_release(const PmsiTunnel *cpmsi_tunnel)
Definition: bgp_attr.h:410
EdgeDiscoveryDB(BgpServer *server)
Definition: bgp_attr.cc:570
friend class BgpAttrTest
Definition: bgp_attr.h:938
size_t cluster_list_length() const
Definition: bgp_attr.h:908
static const uint8_t kFlags
Definition: bgp_attr.h:107
as_t aggregator_as4_num() const
Definition: bgp_attr.h:892
BgpAttrPtr ReplaceSourceRdAndLocate(const BgpAttr *attr, const RouteDistinguisher &source_rd)
Definition: bgp_attr.cc:1362
BgpOList(BgpOListDB *olist_db, const BgpOListSpec &olist_spec)
Definition: bgp_attr.cc:770
virtual std::string ToString() const
Definition: bgp_attr.cc:32
as_t aggregator_as_num() const
Definition: bgp_attr.h:891
friend int intrusive_ptr_add_ref(const EdgeDiscovery *ediscovery)
Definition: bgp_attr.h:506
BgpAttrParams(const BgpAttribute &rhs)
Definition: bgp_attr.h:811
uint32_t nexthop
Definition: bgp_attr.h:82
BgpAttrSubProtocol(const std::string &sbp)
Definition: bgp_attr.h:796
const EdgeDiscoverySpec & edge_discovery() const
Definition: bgp_attr.h:470
Ip4Address identifier_
Definition: bgp_attr.h:395
virtual std::string ToString() const
Definition: bgp_attr.cc:72
const As4Path * as4_path() const
Definition: bgp_attr.h:911
EdgeList edge_list
Definition: bgp_attr.h:493
BgpServer * server()
Definition: bgp_attr.h:1031
static const uint8_t kFlags
Definition: bgp_attr.h:188
virtual std::string ToString() const
Definition: bgp_attr.cc:309
BgpAttrNextHop(Ip6Address v6_nexthop)
Definition: bgp_attr.h:72
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:208
friend void intrusive_ptr_release(const BgpAttr *cattrp)
Definition: bgp_attr.h:981
BgpOListPtr olist_
Definition: bgp_attr.h:968
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:817
bool operator()(const Edge *lhs, const Edge *rhs)
Definition: bgp_attr.h:594
ClusterListDB(BgpServer *server)
Definition: bgp_attr.cc:243
bool IsAsPathEmpty() const
Definition: bgp_attr.cc:1087
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:129
BgpAttrPtr ReplaceOriginAndLocate(const BgpAttr *attr, BgpAttrOrigin::OriginType origin)
Definition: bgp_attr.cc:1322
void SetLabel(uint32_t label, const ExtCommunity *ext)
Definition: bgp_attr.cc:328
virtual std::string ToString() const
Definition: bgp_attr.cc:876
boost::intrusive_ptr< const Community > CommunityPtr
Definition: community.h:109
BgpAttrPtr ReplacePmsiTunnelAndLocate(const BgpAttr *attr, const PmsiTunnelSpec *pmsi_spec)
Definition: bgp_attr.cc:1405
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
friend int intrusive_ptr_add_ref(const BgpAttr *cattrp)
Definition: bgp_attr.h:973
const AsPath * as_path() const
Definition: bgp_attr.h:899
void set_local_pref(uint32_t local_pref)
Definition: bgp_attr.h:839
ClusterListSpec(const ClusterListSpec &rhs)
Definition: bgp_attr.h:208
std::vector< uint8_t > identifier
Definition: bgp_attr.h:361
int intrusive_ptr_del_ref(const AsPath *cpath)
Definition: bgp_aspath.h:151
virtual std::string ToString() const
Definition: bgp_attr.cc:642
void set_edge_forwarding(const EdgeForwardingSpec *efspec)
Definition: bgp_attr.cc:1052
uint8_t tunnel_flags_
Definition: bgp_attr.h:393
EdgeDiscoveryDB * edge_discovery_db_
Definition: bgp_attr.h:502
BgpOListElem(Ip4Address address, uint32_t label, std::vector< std::string > encap=std::vector< std::string >())
Definition: bgp_attr.h:665
void set_originator_id(Ip4Address originator_id)
Definition: bgp_attr.h:849
virtual ~PmsiTunnel()
Definition: bgp_attr.h:367
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:263
static const int kSize
Definition: bgp_attr.h:685
friend std::size_t hash_value(const PmsiTunnel &pmsi_tunnel)
Definition: bgp_attr.h:376
uint64_t params() const
Definition: bgp_attr.h:898
static BgpAttrOrigin::OriginType OriginFromString(const std::string &bgp_origin_type)
Definition: bgp_attr.cc:1110
Address::Family nexthop_family() const
Definition: bgp_attr.cc:1124
bool operator()(const ClusterList *lhs, const ClusterList *rhs)
Definition: bgp_attr.h:269
void set_label_block(LabelBlockPtr label_block)
Definition: bgp_attr.cc:1061
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:733
BgpAttrSourceRd(const BgpAttribute &rhs)
Definition: bgp_attr.h:771
BgpAttrNextHop(Ip4Address v4_nexthop)
Definition: bgp_attr.h:70
const ExtCommunity * ext_community() const
Definition: bgp_attr.h:915
BgpOListDB(BgpServer *server)
Definition: bgp_attr.cc:806
uint8_t tunnel_flags
Definition: bgp_attr.h:358
BgpAttrLabelBlock(LabelBlockPtr label_block)
Definition: bgp_attr.h:653
BgpAttrPtr ReplaceAsPathAndLocate(const BgpAttr *attr, AsPathPtr aspath)
Definition: bgp_attr.cc:1306
Ip4Address outbound_address
Definition: bgp_attr.h:588
boost::intrusive_ptr< ClusterList > ClusterListPtr
Definition: bgp_attr.h:266
std::string sbp
Definition: bgp_attr.h:799
uint8_t safi
Definition: bgp_attr.h:308
static const uint8_t kFlags
Definition: bgp_attr.h:205
const Elements & elements() const
Definition: bgp_attr.h:714
BgpAttrPtr ReplaceOListAndLocate(const BgpAttr *attr, const BgpOListSpec *olist_spec)
Definition: bgp_attr.cc:1378
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:883
BgpAttrAggregator(const BgpAttribute &rhs)
Definition: bgp_attr.h:156
PmsiTunnelDB(BgpServer *server)
Definition: bgp_attr.cc:422
int max_as_path_count() const
Definition: bgp_attr.cc:1081
friend void intrusive_ptr_release(const ClusterList *ccluster_list)
Definition: bgp_attr.h:256
virtual size_t EncodeLength() const
Definition: bgp_attr.cc:266
IpAddress nexthop_
Definition: bgp_attr.h:946
BgpAttrOrigin::OriginType origin() const
Definition: bgp_attr.h:881
uint32_t label
Definition: bgp_attr.h:673
BgpMpNlri(const BgpAttribute &rhs)
Definition: bgp_attr.h:297
BgpAttrOriginatorId(uint32_t originator_id)
Definition: bgp_attr.h:195
ClusterListPtr cluster_list_
Definition: bgp_attr.h:960
friend std::size_t hash_value(const ClusterList &cluster_list)
Definition: bgp_attr.h:232
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:488
int aspath_4byte_count() const
Definition: bgp_attr.h:903
BgpAttrNextHop(const BgpAttribute &rhs)
Definition: bgp_attr.h:65
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:79
void set_med(uint32_t med)
Definition: bgp_attr.h:838
BgpAttrAs4Aggregator(const BgpAttribute &rhs)
Definition: bgp_attr.h:138
EdgeDiscoverySpec edspec_
Definition: bgp_attr.h:503
uint32_t GetLabel(const ExtCommunity *ext) const
Definition: bgp_attr.cc:322
BgpAttrAggregator(uint32_t as_num, uint32_t address)
Definition: bgp_attr.h:159
BgpOListSpec(uint8_t subcode)
Definition: bgp_attr.h:687
uint32_t address
Definition: bgp_attr.h:162
uint64_t params
Definition: bgp_attr.h:816
AsPathPtr as_path_
Definition: bgp_attr.h:957
LabelBlockPtr label_block_
Definition: bgp_attr.h:967
static const int kSize
Definition: bgp_attr.h:187
BgpAttrOrigin(const BgpAttribute &rhs)
Definition: bgp_attr.h:44
const PmsiTunnelSpec & pmsi_tunnel() const
Definition: bgp_attr.h:373
as_t aggregator_as_num_
Definition: bgp_attr.h:950
void intrusive_ptr_release(const AsPath *cpath)
Definition: bgp_aspath.h:155
friend int intrusive_ptr_del_ref(const ClusterList *ccluster_list)
Definition: bgp_attr.h:252
uint32_t sequence_number() const
Definition: bgp_attr.cc:1140
EthernetSegmentId esi_
Definition: bgp_attr.h:955
std::string GetTunnelTypeString() const
Definition: bgp_attr.cc:346
BgpAttrNextHop(uint32_t nexthop)
Definition: bgp_attr.h:68
static const uint8_t kFlags
Definition: bgp_attr.h:91
bool operator<(const BgpOListElem &rhs) const
Definition: bgp_attr.cc:726
static const uint8_t kFlags
Definition: bgp_attr.h:134
EdgeList edge_list
Definition: bgp_attr.h:566
const EdgeForwarding * edge_forwarding() const
Definition: bgp_attr.h:921
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:86
BgpAttrOrigin(int origin)
Definition: bgp_attr.h:47
friend int intrusive_ptr_del_ref(const EdgeForwarding *ceforwarding)
Definition: bgp_attr.h:617
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:62
void set_ext_community(ExtCommunityPtr extcomm)
Definition: bgp_attr.cc:1011
BgpAttrEsi()
Definition: bgp_attr.h:782
int as_path_count() const
Definition: bgp_attr.h:900
int CompareTo(const BgpOList &rhs) const
Definition: bgp_attr.cc:794
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:179
BgpAttrLocalPref(uint32_t local_pref)
Definition: bgp_attr.h:112
Edge(const EdgeForwardingSpec::Edge *edge_spec)
Definition: bgp_attr.cc:672
EdgeForwardingPtr edge_forwarding_
Definition: bgp_attr.h:966
void set_origin_vn_path(OriginVnPathPtr ovnpath)
Definition: bgp_attr.cc:1023
boost::intrusive_ptr< BgpOList > BgpOListPtr
Definition: bgp_attr.h:746
RouteDistinguisher source_rd
Definition: bgp_attr.h:775
void set_olist(const BgpOListSpec *olist_spec)
Definition: bgp_attr.cc:1065
static const uint8_t kFlags
Definition: bgp_attr.h:284
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:108
const EdgeDiscovery * edge_discovery() const
Definition: bgp_attr.h:918
bool ClusterListLoop(uint32_t cluster_id) const
Definition: bgp_attr.cc:223
std::vector< uint8_t > nexthop
Definition: bgp_attr.h:309
void set_atomic_aggregate(bool ae)
Definition: bgp_attr.h:840
virtual std::string ToString() const
Definition: bgp_attr.cc:163
uint32_t med() const
Definition: bgp_attr.h:888
uint32_t med_
Definition: bgp_attr.h:947
ClusterListDB * cluster_list_db_
Definition: bgp_attr.h:244
void set_aspath_4byte(AsPath4BytePtr aspath)
Definition: bgp_attr.cc:979
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:638
LabelBlockPtr label_block
Definition: bgp_attr.h:657
void set_as4_path(As4PathPtr aspath)
Definition: bgp_attr.cc:967
const PmsiTunnel * pmsi_tunnel() const
Definition: bgp_attr.h:917
static const int kSize
Definition: bgp_attr.h:90
virtual std::string ToString() const
Definition: bgp_attr.cc:858
uint32_t local_pref
Definition: bgp_attr.h:115
std::vector< uint8_t > inbound_address
Definition: bgp_attr.h:561
static const uint8_t kFlags
Definition: bgp_attr.h:152
uint8_t subcode
Definition: bgp_attr_base.h:69
bool operator()(const EdgeForwarding *lhs, const EdgeForwarding *rhs)
Definition: bgp_attr.h:635
BgpOListPtr leaf_olist() const
Definition: bgp_attr.h:926
int CompareTo(const ClusterList &rhs) const
Definition: bgp_attr.h:225
tbb::atomic< int > refcount_
Definition: bgp_attr.h:501
static const uint8_t kFlags
Definition: bgp_attr.h:63
virtual std::string ToString() const
Definition: bgp_attr.cc:90
friend void intrusive_ptr_release(const EdgeForwarding *ceforwarding)
Definition: bgp_attr.h:621
EdgeForwardingDB * edge_forwarding_db_
Definition: bgp_attr.h:609
BgpAttrMultiExitDisc(const BgpAttribute &rhs)
Definition: bgp_attr.h:93
bool operator()(const BgpOListElem *lhs, const BgpOListElem *rhs)
Definition: bgp_attr.h:678
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:872
BgpAttrDB(BgpServer *server)
Definition: bgp_attr.cc:1302
virtual std::string ToString() const
Definition: bgp_attr.cc:101
uint8_t code
Definition: bgp_attr_base.h:68
std::vector< BgpOListElem > Elements
Definition: bgp_attr.h:693
BgpAttrPtr ReplaceOriginVnPathAndLocate(const BgpAttr *attr, OriginVnPathPtr ovnpath)
Definition: bgp_attr.cc:1338
friend std::size_t hash_value(BgpAttr const &attr)
Definition: bgp_attr.cc:1259
bool atomic_aggregate_
Definition: bgp_attr.h:949
bool atomic_aggregate() const
Definition: bgp_attr.h:890
BgpAttrUnknown(const BgpAttribute &rhs)
Definition: bgp_attr.h:765
bool operator()(const Edge *lhs, const Edge *rhs)
Definition: bgp_attr.h:487
bool operator()(const BgpAttr *lhs, const BgpAttr *rhs)
Definition: bgp_attr.h:994
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:68
BgpAttrParams(uint64_t params)
Definition: bgp_attr.h:814
bool evpn_sticky_mac() const
Definition: bgp_attr.cc:1154
static const int kSize
Definition: bgp_attr.h:62
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:828
virtual ~EdgeDiscovery()
Definition: bgp_attr.cc:547
boost::intrusive_ptr< EdgeDiscovery > EdgeDiscoveryPtr
Definition: bgp_attr.h:524
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:890
uint32_t GetLabel(const ExtCommunity *ext) const
Definition: bgp_attr.cc:415
EdgeForwardingDB(BgpServer *server)
Definition: bgp_attr.cc:723
AsPath4BytePtr aspath_4byte_
Definition: bgp_attr.h:958
BgpOListDB * olist_db_
Definition: bgp_attr.h:724
virtual void ToCanonical(BgpAttr *attr)
Definition: bgp_attr.cc:854
BgpOListPtr leaf_olist_
Definition: bgp_attr.h:969
std::vector< uint32_t > labels
Definition: bgp_attr.h:456
CommunityPtr community_
Definition: bgp_attr.h:961
PmsiTunnelDB * pmsi_tunnel_db_
Definition: bgp_attr.h:398
~ClusterList()
Definition: bgp_attr.h:223
friend std::size_t hash_value(const EdgeForwarding &edge_forwarding)
Definition: bgp_attr.h:579
void set_as4_aggregator(as_t as_num, IpAddress address)
Definition: bgp_attr.h:845
virtual void Remove()
Definition: bgp_attr.cc:802
boost::intrusive_ptr< EdgeForwarding > EdgeForwardingPtr
Definition: bgp_attr.h:632
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: bgp_attr.cc:246
const uint32_t label() const
Definition: bgp_attr.h:385