OpenSDN source code
community.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_COMMUNITY_H_
6 #define SRC_BGP_COMMUNITY_H_
7 
8 #include <boost/array.hpp>
9 #include <boost/intrusive_ptr.hpp>
10 #include <boost/system/error_code.hpp>
11 
12 #include <atomic>
13 #include <set>
14 #include <string>
15 #include <vector>
16 
17 #include "base/parse_object.h"
18 #include "base/util.h"
19 #include "bgp/bgp_attr_base.h"
20 #include "bgp/bgp_common.h"
23 
24 class BgpAttr;
25 class CommunityDB;
26 class ExtCommunityDB;
27 class LargeCommunityDB;
28 class BgpServer;
29 
30 struct CommunitySpec : public BgpAttribute {
31  static const int kSize = -1;
32  static const uint8_t kFlags = Optional | Transitive;
34  explicit CommunitySpec(const BgpAttribute &rhs) : BgpAttribute(rhs) { }
35  std::vector<uint32_t> communities;
36  virtual int CompareTo(const BgpAttribute &rhs_attr) const {
37  int ret = BgpAttribute::CompareTo(rhs_attr);
38  if (ret != 0) return ret;
40  static_cast<const CommunitySpec &>(rhs_attr).communities);
41  return 0;
42  }
43  virtual void ToCanonical(BgpAttr *attr);
44  virtual std::string ToString() const;
45  virtual size_t EncodeLength() const;
46 };
47 
48 class Community {
49 public:
50  typedef std::vector<uint32_t> CommunityList;
51  explicit Community(CommunityDB *comm_db)
52  : comm_db_(comm_db) {
53  refcount_ = 0;
54  }
55  explicit Community(const Community &rhs)
57  refcount_ = 0;
58  }
59  explicit Community(CommunityDB *comm_db, const CommunitySpec spec);
60  virtual ~Community() { }
61  virtual void Remove();
62 
63  int CompareTo(const Community &rhs) const;
64  bool ContainsValue(uint32_t value) const;
65  void BuildStringList(std::vector<std::string> *list) const;
66 
67  const std::vector<uint32_t> &communities() const { return communities_; }
68 
69  friend std::size_t hash_value(Community const &comm) {
70  size_t hash = 0;
71  boost::hash_range(hash, comm.communities_.begin(),
72  comm.communities_.end());
73  return hash;
74  }
75 
76 private:
77  friend int intrusive_ptr_add_ref(const Community *ccomm);
78  friend int intrusive_ptr_del_ref(const Community *ccomm);
79  friend void intrusive_ptr_release(const Community *ccomm);
80  friend class CommunityDB;
81  friend class BgpAttrTest;
82 
83  void Append(uint32_t value);
84  void Append(const std::vector<uint32_t> &communities);
85  void Set(const std::vector<uint32_t> &communities);
86  void Remove(const std::vector<uint32_t> &communities);
87 
88  mutable std::atomic<int> refcount_;
90  std::vector<uint32_t> communities_;
91 };
92 
93 inline int intrusive_ptr_add_ref(const Community *ccomm) {
94  return ccomm->refcount_.fetch_add(1);
95 }
96 
97 inline int intrusive_ptr_del_ref(const Community *ccomm) {
98  return ccomm->refcount_.fetch_sub(1);
99 }
100 
101 inline void intrusive_ptr_release(const Community *ccomm) {
102  int prev = ccomm->refcount_.fetch_sub(1);
103  if (prev == 1) {
104  Community *comm = const_cast<Community *>(ccomm);
105  comm->Remove();
106  assert(comm->refcount_ == 0);
107  delete comm;
108  }
109 }
110 
111 typedef boost::intrusive_ptr<const Community> CommunityPtr;
112 
114  bool operator()(const Community *lhs, const Community *rhs) const {
115  return lhs->CompareTo(*rhs) < 0;
116  }
117 };
118 
119 class CommunityDB : public BgpPathAttributeDB<Community, CommunityPtr,
120  CommunitySpec, CommunityCompare,
121  CommunityDB> {
122 public:
123  explicit CommunityDB(BgpServer *server);
124  virtual ~CommunityDB() { }
125 
126  CommunityPtr AppendAndLocate(const Community *src, uint32_t value);
128  const std::vector<uint32_t> &value);
130  const std::vector<uint32_t> &value);
132  const std::vector<uint32_t> &value);
133  CommunityPtr RemoveAndLocate(const Community *src, uint32_t value);
134 
135 private:
136 };
137 
139 public:
140  static const int kSize = -1;
141  static const uint8_t kFlags = Optional | Transitive;
143  explicit ExtCommunitySpec(const BgpAttribute &rhs) : BgpAttribute(rhs) { }
144  virtual size_t EncodeLength() const;
145  std::vector<uint64_t> communities;
146  void AddTunnelEncaps(std::vector<std::string> encaps);
147  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
148  virtual void ToCanonical(BgpAttr *attr);
149  virtual std::string ToString() const;
150 };
151 
153 public:
154  typedef boost::array<uint8_t, 8> ExtCommunityValue;
155  typedef std::vector<ExtCommunityValue> ExtCommunityList;
156 
157  explicit ExtCommunity(ExtCommunityDB *extcomm_db)
158  : extcomm_db_(extcomm_db) {
159  refcount_ = 0;
160  }
161  explicit ExtCommunity(const ExtCommunity &rhs)
162  : extcomm_db_(rhs.extcomm_db_),
164  refcount_ = 0;
165  }
166 
167  explicit ExtCommunity(ExtCommunityDB *extcomm_db,
168  const ExtCommunitySpec spec);
169  virtual ~ExtCommunity() { }
170  virtual void Remove();
171  int CompareTo(const ExtCommunity &rhs) const;
172 
173  bool ContainsRTarget(const ExtCommunityValue &val) const;
174  bool ContainsOriginVn(as_t asn, uint32_t vn_index) const;
175  bool ContainsOriginVn(const ExtCommunityValue &val) const;
176  bool ContainsOriginVn4(const ExtCommunityValue &val) const;
177  bool ContainsVrfRouteImport(const ExtCommunityValue &val) const;
178  bool ContainsSourceAs(const ExtCommunityValue &val) const;
179  uint32_t GetSubClusterId() const;
180 
181  // Return vector of communities
182  const ExtCommunityList &communities() const {
183  return communities_;
184  }
185 
186  std::vector<std::string> GetTunnelEncap() const;
187  std::vector<int> GetTagList(as2_t asn = 0) const;
188  std::vector<int> GetTag4List(as_t asn = 0) const;
189  bool ContainsTunnelEncapVxlan() const;
190  int GetOriginVnIndex() const;
191  static ExtCommunityList ExtCommunityFromString(const std::string &comm);
192  static ExtCommunityValue FromHexString(const std::string &comm,
193  boost::system::error_code *errorp);
194 
195  static bool is_origin_vn(const ExtCommunityValue &val) {
196  //
197  // Origin VN extended community
198  // 2 Octet AS specific extended community
199  //
200  return ((val[0] == BgpExtendedCommunityType::Experimental ||
203  }
204 
205  static bool is_default_gateway(const ExtCommunityValue &val) {
206  //
207  // Default Gateway extended community
208  //
209  return (val[0] == BgpExtendedCommunityType::Opaque) &&
211  }
212 
213  static bool is_es_import(const ExtCommunityValue &val) {
214  //
215  // ES Import extended community
216  //
217  return (val[0] == BgpExtendedCommunityType::Evpn) &&
219  }
220 
221  static bool is_esi_label(const ExtCommunityValue &val) {
222  //
223  // ESI Label extended community
224  //
225  return (val[0] == BgpExtendedCommunityType::Evpn) &&
227  }
228 
229  static bool is_mac_mobility(const ExtCommunityValue &val) {
230  //
231  // MAC Mobility extended community
232  //
233  return (val[0] == BgpExtendedCommunityType::Evpn) &&
235  }
236 
237  static bool is_local_sequence_number(const ExtCommunityValue &val) {
240  }
241 
242  static bool is_etree(const ExtCommunityValue &val) {
243  //
244  // ETree extended community
245  //
246  return (val[0] == BgpExtendedCommunityType::Evpn) &&
248  }
249 
250  static bool is_multicast_flags(const ExtCommunityValue &val) {
251  //
252  // Multicast Flags extended community
253  //
254  return (val[0] == BgpExtendedCommunityType::Evpn) &&
256  }
257 
258 
259  static bool is_router_mac(const ExtCommunityValue &val) {
260  //
261  // Router MAC extended community
262  //
263  return (val[0] == BgpExtendedCommunityType::Evpn) &&
265  }
266 
267  static bool is_route_target(const ExtCommunityValue &val) {
268  //
269  // Route target extended community
270  // 1. 2 Octet AS specific extended community Route Target
271  // 2. IPv4 Address specific extended community Route Target
272  // 3. 4 Octet AS specific extended community Route Target
273  //
274  return ((val[0] == BgpExtendedCommunityType::TwoOctetAS ||
278  }
279 
280  static uint32_t get_rtarget_val(const ExtCommunityValue &val) {
281  //
282  // Get non user-configured RT value from Route Target extended
283  // community for
284  // 1. 2 Octet AS specific extended community Route Target
285  // 2. 4 Octet AS specific extended community Route Target
286  //
287  if (is_route_target(val)) {
288  uint8_t data[8];
289  uint32_t rt;
290  std::copy(val.begin(), val.end(), &data[0]);
291  if (data[0] == BgpExtendedCommunityType::TwoOctetAS) {
292  rt = get_value(data + 4, 4);
293  if (rt >= BGP_RTGT_MIN_ID_AS2 && rt <= BGP_RTGT_MAX_ID_AS2) {
294  return (rt);
295  }
296  } else if (data[0] == BgpExtendedCommunityType::FourOctetAS) {
297  rt = get_value(data + 6, 2);
298  if (rt >= BGP_RTGT_MIN_ID_AS4 && rt <= BGP_RTGT_MAX_ID_AS4) {
299  return (rt);
300  }
301  }
302  }
303  return (0);
304  }
305 
306  static bool is_security_group(const ExtCommunityValue &val) {
307  //
308  // SG ID extended community
309  // 2 Octet AS specific extended community
310  //
311  return (val[0] == BgpExtendedCommunityType::Experimental) &&
313  }
314 
315  static bool is_security_group4(const ExtCommunityValue &val) {
316  //
317  // SG ID extended community
318  // 2 Octet AS specific extended community
319  //
322  }
323 
324  static bool is_site_of_origin(const ExtCommunityValue &val) {
325  //
326  // Site of Origin / Route Origin extended community
327  // 1. 2 Octet AS specific extended community
328  // 2. IPv4 Address specific extended community
329  // 3. 4 Octet AS specific extended community Route Target
330  //
331  return ((val[0] == BgpExtendedCommunityType::TwoOctetAS ||
335  }
336 
337  static bool is_source_as(const ExtCommunityValue &val) {
338  //
339  // Source AS extended community
340  // 1. 2 Octet AS specific extended community
341  // 2. 4 Octet AS specific extended community
342  //
343  return ((val[0] == BgpExtendedCommunityType::TwoOctetAS ||
346  }
347 
348  static bool is_sub_cluster(const ExtCommunityValue &val) {
349  //
350  // Sub Cluster extended community
351  // 1. Experimental AS specific extended community
352  // 2. Experimental4Byte AS specific extended community
353  //
354  return (((val[0] == BgpExtendedCommunityType::Experimental) ||
357  }
358 
359  static bool is_vrf_route_import(const ExtCommunityValue &val) {
360  //
361  // VRF Route Import extended community
362  // IPv4 Address specific extended community
363  //
364  return ((val[0] == BgpExtendedCommunityType::IPv4Address) &&
366  }
367 
368  static bool is_tunnel_encap(const ExtCommunityValue &val) {
369  // Tunnel encap extended community
370  return (val[0] == BgpExtendedCommunityType::Opaque) &&
372  }
373 
374  static bool is_load_balance(const ExtCommunityValue &val) {
375  // Load Balance extended community
376  return (val[0] == BgpExtendedCommunityType::Opaque) &&
378  }
379 
380  static bool is_tag(const ExtCommunityValue &val) {
381  // Tag extended community
382  return (val[0] == BgpExtendedCommunityType::Experimental) &&
384  }
385 
386  static bool is_tag4(const ExtCommunityValue &val) {
387  // Tag extended community
390  }
391 
392  friend std::size_t hash_value(ExtCommunity const &comm) {
393  size_t hash = 0;
394  for (ExtCommunityList::const_iterator iter = comm.communities_.begin();
395  iter != comm.communities_.end(); iter++) {
396  boost::hash_range(hash, iter->begin(), iter->end());
397  }
398  return hash;
399  }
400 
401  static std::string ToString(const ExtCommunityValue &val);
402  static std::string ToHexString(const ExtCommunityValue &val);
403 
404 private:
405  friend int intrusive_ptr_add_ref(const ExtCommunity *cextcomm);
406  friend int intrusive_ptr_del_ref(const ExtCommunity *cextcomm);
407  friend void intrusive_ptr_release(const ExtCommunity *cextcomm);
408  friend class ExtCommunityDB;
409  friend class BgpAttrTest;
410 
411  void Append(const ExtCommunityValue &value);
412  void Append(const ExtCommunityList &list);
413  void Remove(const ExtCommunityList &list);
414  void RemoveMFlags();
415  void RemoveRTarget();
416  void RemoveSGID();
417  void RemoveTag();
418  void RemoveSiteOfOrigin();
419  void RemoveSourceAS();
420  void RemoveVrfRouteImport();
421  void RemoveOriginVn();
423  void RemoveLoadBalance();
424  void RemoveSubCluster();
425  void Set(const ExtCommunityList &list);
426 
427  mutable std::atomic<int> refcount_;
430 };
431 
432 inline int intrusive_ptr_add_ref(const ExtCommunity *cextcomm) {
433  return cextcomm->refcount_.fetch_add(1);
434 }
435 
436 inline int intrusive_ptr_del_ref(const ExtCommunity *cextcomm) {
437  return cextcomm->refcount_.fetch_sub(1);
438 }
439 
440 inline void intrusive_ptr_release(const ExtCommunity *cextcomm) {
441  int prev = cextcomm->refcount_.fetch_sub(1);
442  if (prev == 1) {
443  ExtCommunity *extcomm = const_cast<ExtCommunity *>(cextcomm);
444  extcomm->Remove();
445  assert(extcomm->refcount_ == 0);
446  delete extcomm;
447  }
448 }
449 
450 typedef boost::intrusive_ptr<const ExtCommunity> ExtCommunityPtr;
451 
453  bool operator()(const ExtCommunity *lhs, const ExtCommunity *rhs) const {
454  return lhs->CompareTo(*rhs) < 0;
455  }
456 };
457 
458 class ExtCommunityDB : public BgpPathAttributeDB<ExtCommunity, ExtCommunityPtr,
459  ExtCommunitySpec,
460  ExtCommunityCompare,
461  ExtCommunityDB> {
462 public:
463  explicit ExtCommunityDB(BgpServer *server);
464 
466  const ExtCommunity::ExtCommunityList &list);
468  const ExtCommunity::ExtCommunityValue &value);
470  const ExtCommunity::ExtCommunityList &list);
471 
473  const ExtCommunity::ExtCommunityList &export_list);
475  const ExtCommunity::ExtCommunityList &export_list);
477  const ExtCommunity::ExtCommunityList &sgid_list);
479  const ExtCommunity::ExtCommunityList &tag_list);
491  const ExtCommunity::ExtCommunityValue &origin_vn);
493  const ExtCommunity *src,
494  const ExtCommunity::ExtCommunityList &tunnel_encaps);
500  const ExtCommunity::ExtCommunityList &list);
501 
502 private:
503 };
504 
509 public:
513  static const int kSize = -1;
514 
517  static const uint8_t kFlags = Optional | Transitive;
518 
522 
524  explicit LargeCommunitySpec(const BgpAttribute &rhs) :
525  BgpAttribute(rhs) { }
526 
529  static LargeCommunitySpec FromTag(const ExtCommunitySpec &ex_spec);
530 
533  static ExtCommunitySpec RemoveTags(const ExtCommunitySpec& ex_spec);
534 
536  virtual size_t EncodeLength() const;
537 
540  std::vector<uint32_t> communities;
541 
543  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
544 
546  virtual void ToCanonical(BgpAttr *attr);
547 
549  virtual std::string ToString() const;
550 };
551 
557 public:
559  typedef boost::array<uint8_t, 12> LargeCommunityValue;
560 
562  typedef std::vector<LargeCommunityValue> LargeCommunityList;
563 
566  explicit LargeCommunity(LargeCommunityDB *largecomm_db)
567  : largecomm_db_(largecomm_db) {
568  refcount_ = 0;
569  }
570 
572  explicit LargeCommunity(const LargeCommunity &rhs)
575  refcount_ = 0;
576  }
577 
581  explicit LargeCommunity(LargeCommunityDB *largecomm_db,
582  const LargeCommunitySpec spec);
583 
585  virtual ~LargeCommunity() { }
586 
588  virtual void Remove();
589 
591  int CompareTo(const LargeCommunity &rhs) const;
592 
595  return communities_;
596  }
597 
599  std::vector<uint64_t> GetTagList(as_t asn = 0) const;
600 
603  const std::string &comm);
604 
606  static LargeCommunityValue FromHexString(const std::string &comm,
607  boost::system::error_code *errorp);
608 
610  friend std::size_t hash_value(LargeCommunity const &comm) {
611  size_t hash = 0;
612  for (LargeCommunityList::const_iterator iter =
613  comm.communities_.begin();
614  iter != comm.communities_.end(); iter++) {
615  boost::hash_range(hash, iter->begin(), iter->end());
616  }
617  return hash;
618  }
619 
621  static bool is_tag(const LargeCommunityValue &val) {
622  return (val[4] == BgpLargeCommunityType::TagLC);
623  }
624 
626  static std::string ToString(const LargeCommunityValue &val);
627 
629  static std::string ToHexString(const LargeCommunityValue &val);
630 
631 private:
633  friend int intrusive_ptr_add_ref(const LargeCommunity *clargecomm);
635  friend int intrusive_ptr_del_ref(const LargeCommunity *clargecomm);
638  friend void intrusive_ptr_release(const LargeCommunity *clargecomm);
640  friend class LargeCommunityDB;
642  friend class BgpAttrTest;
643 
645  void Append(const LargeCommunityValue &value);
647  void Append(const LargeCommunityList &list);
649  void Remove(const LargeCommunityList &list);
651  void RemoveTag();
653  void Set(const LargeCommunityList &list);
654 
656  mutable std::atomic<int> refcount_;
661 };
662 
664 inline int intrusive_ptr_add_ref(const LargeCommunity *clargecomm) {
665  return clargecomm->refcount_.fetch_add(1);
666 }
667 
669 inline int intrusive_ptr_del_ref(const LargeCommunity *clargecomm) {
670  return clargecomm->refcount_.fetch_sub(1);
671 }
672 
675 inline void intrusive_ptr_release(const LargeCommunity *clargecomm) {
676  int prev = clargecomm->refcount_.fetch_sub(1);
677  if (prev == 1) {
678  LargeCommunity *largecomm = const_cast<LargeCommunity *>(clargecomm);
679  largecomm->Remove();
680  assert(largecomm->refcount_ == 0);
681  delete largecomm;
682  }
683 }
684 
686 typedef boost::intrusive_ptr<const LargeCommunity> LargeCommunityPtr;
687 
690  bool operator()(const LargeCommunity *lhs, const LargeCommunity *rhs) const {
691  return lhs->CompareTo(*rhs) < 0;
692  }
693 };
694 
698 class LargeCommunityDB : public BgpPathAttributeDB<LargeCommunity,
699  LargeCommunityPtr,
700  LargeCommunitySpec,
701  LargeCommunityCompare,
702  LargeCommunityDB> {
703 public:
706  explicit LargeCommunityDB(BgpServer *server);
707 
710  const LargeCommunity *src,
712 
715  const LargeCommunity *src,
717 
721  const LargeCommunity *src,
723 
726  const LargeCommunity *src,
727  const LargeCommunity::LargeCommunityList &tag_list);
728 
731  const LargeCommunity *src,
733 
734 private:
735 };
736 
737 #endif // SRC_BGP_COMMUNITY_H_
#define BGP_RTGT_MAX_ID_AS2
Definition: bgp_common.h:18
#define BGP_RTGT_MIN_ID_AS2
Definition: bgp_common.h:15
#define BGP_RTGT_MIN_ID_AS4
Definition: bgp_common.h:16
uint16_t as2_t
Definition: bgp_common.h:22
#define BGP_RTGT_MAX_ID_AS4
Definition: bgp_common.h:19
uint32_t as_t
Definition: bgp_common.h:21
virtual int CompareTo(const BgpAttribute &rhs) const
virtual ~CommunityDB()
Definition: community.h:124
CommunityPtr RemoveAndLocate(const Community *src, const std::vector< uint32_t > &value)
Definition: community.cc:172
CommunityPtr AppendAndLocate(const Community *src, uint32_t value)
Definition: community.cc:133
CommunityDB(BgpServer *server)
Definition: community.cc:130
CommunityPtr SetAndLocate(const Community *src, const std::vector< uint32_t > &value)
Definition: community.cc:159
const std::vector< uint32_t > & communities() const
Definition: community.h:67
std::vector< uint32_t > communities_
Definition: community.h:90
friend std::size_t hash_value(Community const &comm)
Definition: community.h:69
Community(CommunityDB *comm_db)
Definition: community.h:51
int CompareTo(const Community &rhs) const
Definition: community.cc:71
void Set(const std::vector< uint32_t > &communities)
Definition: community.cc:97
CommunityDB * comm_db_
Definition: community.h:89
friend int intrusive_ptr_add_ref(const Community *ccomm)
Definition: community.h:93
friend void intrusive_ptr_release(const Community *ccomm)
Definition: community.h:101
virtual void Remove()
Definition: community.cc:111
bool ContainsValue(uint32_t value) const
Definition: community.cc:115
std::atomic< int > refcount_
Definition: community.h:88
void BuildStringList(std::vector< std::string > *list) const
Definition: community.cc:123
virtual ~Community()
Definition: community.h:60
std::vector< uint32_t > CommunityList
Definition: community.h:50
Community(const Community &rhs)
Definition: community.h:55
friend class BgpAttrTest
Definition: community.h:81
friend int intrusive_ptr_del_ref(const Community *ccomm)
Definition: community.h:97
void Append(uint32_t value)
Definition: community.cc:80
ExtCommunityPtr AppendAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &list)
Definition: community.cc:765
ExtCommunityPtr RemoveVrfRouteImportAndLocate(const ExtCommunity *src)
Definition: community.cc:912
ExtCommunityPtr ReplaceVrfRouteImportAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &vit)
Definition: community.cc:925
ExtCommunityPtr ReplaceMFlagsAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &export_list)
Definition: community.cc:798
ExtCommunityDB(BgpServer *server)
Definition: community.cc:762
ExtCommunityPtr RemoveSourceASAndLocate(const ExtCommunity *src)
Definition: community.cc:884
ExtCommunityPtr RemoveSiteOfOriginAndLocate(const ExtCommunity *src)
Definition: community.cc:856
ExtCommunityPtr ReplaceSGIDListAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &sgid_list)
Definition: community.cc:826
ExtCommunityPtr ReplaceSourceASAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &sas)
Definition: community.cc:897
ExtCommunityPtr ReplaceSiteOfOriginAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &soo)
Definition: community.cc:869
ExtCommunityPtr RemoveAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &list)
Definition: community.cc:785
ExtCommunityPtr ReplaceSubClusterAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &sc)
Definition: community.cc:998
ExtCommunityPtr ReplaceTagListAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &tag_list)
Definition: community.cc:841
ExtCommunityPtr ReplaceLoadBalanceAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &lb)
Definition: community.cc:983
ExtCommunityPtr ReplaceTunnelEncapsulationAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &tunnel_encaps)
Definition: community.cc:968
ExtCommunityPtr SetAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &list)
Definition: community.cc:1013
ExtCommunityPtr ReplaceOriginVnAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &origin_vn)
Definition: community.cc:953
ExtCommunityPtr RemoveOriginVnAndLocate(const ExtCommunity *src)
Definition: community.cc:940
ExtCommunityPtr ReplaceRTargetAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &export_list)
Definition: community.cc:812
ExtCommunitySpec(const BgpAttribute &rhs)
Definition: community.h:143
void AddTunnelEncaps(std::vector< std::string > encaps)
Definition: community.cc:282
static const int kSize
Definition: community.h:140
std::vector< uint64_t > communities
Definition: community.h:145
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: community.cc:270
static const uint8_t kFlags
Definition: community.h:141
virtual size_t EncodeLength() const
Definition: community.cc:266
virtual std::string ToString() const
Definition: community.cc:192
virtual void ToCanonical(BgpAttr *attr)
Definition: community.cc:278
static bool is_tunnel_encap(const ExtCommunityValue &val)
Definition: community.h:368
ExtCommunity(const ExtCommunity &rhs)
Definition: community.h:161
static bool is_router_mac(const ExtCommunityValue &val)
Definition: community.h:259
ExtCommunityList communities_
Definition: community.h:429
static bool is_route_target(const ExtCommunityValue &val)
Definition: community.h:267
static bool is_source_as(const ExtCommunityValue &val)
Definition: community.h:337
static ExtCommunityValue FromHexString(const std::string &comm, boost::system::error_code *errorp)
Definition: community.cc:341
static ExtCommunityList ExtCommunityFromString(const std::string &comm)
Definition: community.cc:374
bool ContainsOriginVn(as_t asn, uint32_t vn_index) const
Definition: community.cc:504
friend void intrusive_ptr_release(const ExtCommunity *cextcomm)
Definition: community.h:440
void RemoveVrfRouteImport()
Definition: community.cc:610
bool ContainsSourceAs(const ExtCommunityValue &val) const
Definition: community.cc:515
static bool is_esi_label(const ExtCommunityValue &val)
Definition: community.h:221
ExtCommunity(ExtCommunityDB *extcomm_db)
Definition: community.h:157
std::vector< int > GetTag4List(as_t asn=0) const
Definition: community.cc:701
void Set(const ExtCommunityList &list)
Definition: community.cc:317
virtual ~ExtCommunity()
Definition: community.h:169
int GetOriginVnIndex() const
Definition: community.cc:736
std::atomic< int > refcount_
Definition: community.h:427
std::vector< ExtCommunityValue > ExtCommunityList
Definition: community.h:155
static bool is_security_group4(const ExtCommunityValue &val)
Definition: community.h:315
boost::array< uint8_t, 8 > ExtCommunityValue
Definition: community.h:154
static std::string ToHexString(const ExtCommunityValue &val)
Definition: community.cc:421
uint32_t GetSubClusterId() const
Definition: community.cc:524
bool ContainsOriginVn4(const ExtCommunityValue &val) const
static bool is_local_sequence_number(const ExtCommunityValue &val)
Definition: community.h:237
void RemoveMFlags()
Definition: community.cc:544
int CompareTo(const ExtCommunity &rhs) const
Definition: community.cc:290
std::vector< int > GetTagList(as2_t asn=0) const
Definition: community.cc:683
static std::string ToString(const ExtCommunityValue &val)
Definition: community.cc:430
static bool is_sub_cluster(const ExtCommunityValue &val)
Definition: community.h:348
void RemoveOriginVn()
Definition: community.cc:621
void Append(const ExtCommunityValue &value)
Definition: community.cc:333
static bool is_tag(const ExtCommunityValue &val)
Definition: community.h:380
void RemoveLoadBalance()
Definition: community.cc:642
bool ContainsRTarget(const ExtCommunityValue &val) const
Definition: community.cc:486
void RemoveTag()
Definition: community.cc:578
friend std::size_t hash_value(ExtCommunity const &comm)
Definition: community.h:392
void RemoveSGID()
Definition: community.cc:566
static bool is_tag4(const ExtCommunityValue &val)
Definition: community.h:386
bool ContainsVrfRouteImport(const ExtCommunityValue &val) const
Definition: community.cc:535
static bool is_default_gateway(const ExtCommunityValue &val)
Definition: community.h:205
const ExtCommunityList & communities() const
Definition: community.h:182
void RemoveSourceAS()
Definition: community.cc:600
void RemoveSubCluster()
Definition: community.cc:653
ExtCommunityDB * extcomm_db_
Definition: community.h:428
static bool is_load_balance(const ExtCommunityValue &val)
Definition: community.h:374
friend int intrusive_ptr_add_ref(const ExtCommunity *cextcomm)
Definition: community.h:432
static bool is_security_group(const ExtCommunityValue &val)
Definition: community.h:306
static bool is_origin_vn(const ExtCommunityValue &val)
Definition: community.h:195
void RemoveRTarget()
Definition: community.cc:555
static uint32_t get_rtarget_val(const ExtCommunityValue &val)
Definition: community.h:280
static bool is_mac_mobility(const ExtCommunityValue &val)
Definition: community.h:229
friend int intrusive_ptr_del_ref(const ExtCommunity *cextcomm)
Definition: community.h:436
static bool is_etree(const ExtCommunityValue &val)
Definition: community.h:242
static bool is_site_of_origin(const ExtCommunityValue &val)
Definition: community.h:324
void RemoveTunnelEncapsulation()
Definition: community.cc:631
static bool is_es_import(const ExtCommunityValue &val)
Definition: community.h:213
static bool is_multicast_flags(const ExtCommunityValue &val)
Definition: community.h:250
static bool is_vrf_route_import(const ExtCommunityValue &val)
Definition: community.h:359
std::vector< std::string > GetTunnelEncap() const
Definition: community.cc:664
bool ContainsTunnelEncapVxlan() const
Definition: community.cc:724
void RemoveSiteOfOrigin()
Definition: community.cc:589
friend class BgpAttrTest
Definition: community.h:409
virtual void Remove()
Definition: community.cc:313
This class represents a database for managing LargeCommunity objects. It is used to store,...
Definition: community.h:702
LargeCommunityPtr AppendAndLocate(const LargeCommunity *src, const LargeCommunity::LargeCommunityList &list)
Append a list of LargeCommunity values to an existing attribute.
Definition: community.cc:1219
LargeCommunityPtr ReplaceTagListAndLocate(const LargeCommunity *src, const LargeCommunity::LargeCommunityList &tag_list)
Replace all tags in a LargeCommunity with a new tag list.
Definition: community.cc:1239
LargeCommunityPtr SetAndLocate(const LargeCommunity *src, const LargeCommunity::LargeCommunityList &list)
Replace all values in a LargeCommunity with a new list.
Definition: community.cc:1268
LargeCommunityPtr RemoveAndLocate(const LargeCommunity *src, const LargeCommunity::LargeCommunityList &list)
Remove a list of LargeCommunity values from an existing attribute.
Definition: community.cc:1254
LargeCommunityDB(BgpServer *server)
Constructs an instance of the class and links to the given BgpServer instance.
Definition: community.cc:1216
This class encapsulates the wire-format representation of a BGP Large Community attribute and provide...
Definition: community.h:508
virtual void ToCanonical(BgpAttr *attr)
Convert the attribute to its canonical form.
Definition: community.cc:1045
LargeCommunitySpec()
Constructs a new instance using the attribute type and flags.
Definition: community.h:521
static ExtCommunitySpec RemoveTags(const ExtCommunitySpec &ex_spec)
Removes extended communities corresponding to tags from the given ExtCommunitySpec.
Definition: community.cc:248
LargeCommunitySpec(const BgpAttribute &rhs)
Constructs from an existing BgpAttribute.
Definition: community.h:524
static const uint8_t kFlags
Definition: community.h:517
static const int kSize
Definition: community.h:513
static LargeCommunitySpec FromTag(const ExtCommunitySpec &ex_spec)
Constructs an instance from an Extened Community specification by distributing its bits inside a new ...
Definition: community.cc:199
virtual size_t EncodeLength() const
Compute the encoded length of the attribute.
Definition: community.cc:1033
virtual std::string ToString() const
Generate a human-readable string representation.
Definition: community.cc:1026
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Compare the attribute with another BgpAttribute.
Definition: community.cc:1037
std::vector< uint32_t > communities
Vector of community values. Each Large Community value consists of three 4-byte fields (12 bytes tota...
Definition: community.h:540
This class represents an array of BGP Large Community values. A LargeCommunity consists of one or mor...
Definition: community.h:556
const LargeCommunityList & communities() const
Get the list of Large Community values.
Definition: community.h:594
friend std::size_t hash_value(LargeCommunity const &comm)
Compute the hash value for a LargeCommunity object.
Definition: community.h:610
static std::string ToHexString(const LargeCommunityValue &val)
Convert a LargeCommunityValue to a hexadecimal string.
Definition: community.cc:1149
std::vector< LargeCommunityValue > LargeCommunityList
A list (vector) of LargeCommunityValue items.
Definition: community.h:562
friend int intrusive_ptr_del_ref(const LargeCommunity *clargecomm)
Decrement reference count of an clargecomm.
Definition: community.h:669
std::atomic< int > refcount_
A reference counter, needed for memory management.
Definition: community.h:656
LargeCommunity(LargeCommunityDB *largecomm_db)
Constructs an instance of the class and links to the given LargeCommunityDB instance.
Definition: community.h:566
std::vector< uint64_t > GetTagList(as_t asn=0) const
Get the list of tags with the specified ASN.
Definition: community.cc:1177
friend int intrusive_ptr_add_ref(const LargeCommunity *clargecomm)
Increment reference count atomically.
Definition: community.h:664
void Set(const LargeCommunityList &list)
Replace all existing values with the provided list.
Definition: community.cc:1077
LargeCommunityDB * largecomm_db_
A pointer to the managing LargeCommunityDB.
Definition: community.h:658
virtual void Remove()
Remove this community.
Definition: community.cc:1073
int CompareTo(const LargeCommunity &rhs) const
Compare this LargeCommunity to another.
Definition: community.cc:1050
static LargeCommunityList LargeCommunityFromString(const std::string &comm)
Parse a string into a list of LargeCommunity values.
Definition: community.cc:1134
static std::string ToString(const LargeCommunityValue &val)
Convert a LargeCommunityValue to a human-readable string.
Definition: community.cc:1158
virtual ~LargeCommunity()
Destroys an instance.
Definition: community.h:585
void RemoveTag()
Remove all the tags.
Definition: community.cc:1166
LargeCommunityList communities_
A list of LargeCommunity storing BGP Large Community values.
Definition: community.h:660
boost::array< uint8_t, 12 > LargeCommunityValue
A single Large Community value.
Definition: community.h:559
friend void intrusive_ptr_release(const LargeCommunity *clargecomm)
Release a LargeCommunity instance when the reference count reaches zero.
Definition: community.h:675
static bool is_tag(const LargeCommunityValue &val)
Check if the LargeCommunity value is tag.
Definition: community.h:621
void Append(const LargeCommunityValue &value)
Append a single LargeCommunity value.
Definition: community.cc:1093
friend class BgpAttrTest
Enables the access to private members for BgpAttrTest.
Definition: community.h:642
static LargeCommunityValue FromHexString(const std::string &comm, boost::system::error_code *errorp)
Convert a hexadecimal string to a LargeCommunityValue.
Definition: community.cc:1101
LargeCommunity(const LargeCommunity &rhs)
Copy constructor.
Definition: community.h:572
boost::intrusive_ptr< const LargeCommunity > LargeCommunityPtr
Defines a type for automatic storage of a LargeCommunity instance.
Definition: community.h:686
int intrusive_ptr_add_ref(const Community *ccomm)
Definition: community.h:93
void intrusive_ptr_release(const Community *ccomm)
Definition: community.h:101
boost::intrusive_ptr< const Community > CommunityPtr
Definition: community.h:111
boost::intrusive_ptr< const ExtCommunity > ExtCommunityPtr
Definition: community.h:450
int intrusive_ptr_del_ref(const Community *ccomm)
Definition: community.h:97
static uint64_t get_value(const uint8_t *data, int size)
Definition: parse_object.h:39
@ TagLC
Large Community Tag.
bool operator()(const Community *lhs, const Community *rhs) const
Definition: community.h:114
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: community.h:36
virtual size_t EncodeLength() const
Definition: community.cc:76
static const uint8_t kFlags
Definition: community.h:32
CommunitySpec(const BgpAttribute &rhs)
Definition: community.h:34
static const int kSize
Definition: community.h:31
virtual std::string ToString() const
Definition: community.cc:46
std::vector< uint32_t > communities
Definition: community.h:35
virtual void ToCanonical(BgpAttr *attr)
Definition: community.cc:42
bool operator()(const ExtCommunity *lhs, const ExtCommunity *rhs) const
Definition: community.h:453
A structure to compare order LargeCommunity objects.
Definition: community.h:689
bool operator()(const LargeCommunity *lhs, const LargeCommunity *rhs) const
Definition: community.h:690
#define KEY_COMPARE(x, y)
Definition: util.h:70