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 #include <tbb/atomic.h>
12 
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 tbb::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_and_increment();
95 }
96 
97 inline int intrusive_ptr_del_ref(const Community *ccomm) {
98  return ccomm->refcount_.fetch_and_decrement();
99 }
100 
101 inline void intrusive_ptr_release(const Community *ccomm) {
102  int prev = ccomm->refcount_.fetch_and_decrement();
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) {
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 tbb::atomic<int> refcount_;
430 };
431 
432 inline int intrusive_ptr_add_ref(const ExtCommunity *cextcomm) {
433  return cextcomm->refcount_.fetch_and_increment();
434 }
435 
436 inline int intrusive_ptr_del_ref(const ExtCommunity *cextcomm) {
437  return cextcomm->refcount_.fetch_and_decrement();
438 }
439 
440 inline void intrusive_ptr_release(const ExtCommunity *cextcomm) {
441  int prev = cextcomm->refcount_.fetch_and_decrement();
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) {
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 
528  virtual size_t EncodeLength() const;
529 
532  std::vector<uint32_t> communities;
533 
535  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
536 
538  virtual void ToCanonical(BgpAttr *attr);
539 
541  virtual std::string ToString() const;
542 };
543 
549 public:
551  typedef boost::array<uint8_t, 12> LargeCommunityValue;
552 
554  typedef std::vector<LargeCommunityValue> LargeCommunityList;
555 
558  explicit LargeCommunity(LargeCommunityDB *largecomm_db)
559  : largecomm_db_(largecomm_db) {
560  refcount_ = 0;
561  }
562 
564  explicit LargeCommunity(const LargeCommunity &rhs)
567  refcount_ = 0;
568  }
569 
573  explicit LargeCommunity(LargeCommunityDB *largecomm_db,
574  const LargeCommunitySpec spec);
575 
577  virtual ~LargeCommunity() { }
578 
580  virtual void Remove();
581 
583  int CompareTo(const LargeCommunity &rhs) const;
584 
587  return communities_;
588  }
589 
591  std::vector<uint64_t> GetTagList(as_t asn = 0) const;
592 
595  const std::string &comm);
596 
598  static LargeCommunityValue FromHexString(const std::string &comm,
599  boost::system::error_code *errorp);
600 
602  friend std::size_t hash_value(LargeCommunity const &comm) {
603  size_t hash = 0;
604  for (LargeCommunityList::const_iterator iter =
605  comm.communities_.begin();
606  iter != comm.communities_.end(); iter++) {
607  boost::hash_range(hash, iter->begin(), iter->end());
608  }
609  return hash;
610  }
611 
613  static bool is_tag(const LargeCommunityValue &val) {
614  return (val[4] == BgpLargeCommunityType::TagLC);
615  }
616 
618  static std::string ToString(const LargeCommunityValue &val);
619 
621  static std::string ToHexString(const LargeCommunityValue &val);
622 
623 private:
625  friend int intrusive_ptr_add_ref(const LargeCommunity *clargecomm);
627  friend int intrusive_ptr_del_ref(const LargeCommunity *clargecomm);
630  friend void intrusive_ptr_release(const LargeCommunity *clargecomm);
632  friend class LargeCommunityDB;
634  friend class BgpAttrTest;
635 
637  void Append(const LargeCommunityValue &value);
639  void Append(const LargeCommunityList &list);
641  void Remove(const LargeCommunityList &list);
643  void RemoveTag();
645  void Set(const LargeCommunityList &list);
646 
648  mutable tbb::atomic<int> refcount_;
653 };
654 
656 inline int intrusive_ptr_add_ref(const LargeCommunity *clargecomm) {
657  return clargecomm->refcount_.fetch_and_increment();
658 }
659 
661 inline int intrusive_ptr_del_ref(const LargeCommunity *clargecomm) {
662  return clargecomm->refcount_.fetch_and_decrement();
663 }
664 
667 inline void intrusive_ptr_release(const LargeCommunity *clargecomm) {
668  int prev = clargecomm->refcount_.fetch_and_decrement();
669  if (prev == 1) {
670  LargeCommunity *largecomm = const_cast<LargeCommunity *>(clargecomm);
671  largecomm->Remove();
672  assert(largecomm->refcount_ == 0);
673  delete largecomm;
674  }
675 }
676 
678 typedef boost::intrusive_ptr<const LargeCommunity> LargeCommunityPtr;
679 
682  bool operator()(const LargeCommunity *lhs, const LargeCommunity *rhs) {
683  return lhs->CompareTo(*rhs) < 0;
684  }
685 };
686 
690 class LargeCommunityDB : public BgpPathAttributeDB<LargeCommunity,
691  LargeCommunityPtr,
692  LargeCommunitySpec,
693  LargeCommunityCompare,
694  LargeCommunityDB> {
695 public:
698  explicit LargeCommunityDB(BgpServer *server);
699 
702  const LargeCommunity *src,
704 
707  const LargeCommunity *src,
709 
713  const LargeCommunity *src,
715 
718  const LargeCommunity *src,
719  const LargeCommunity::LargeCommunityList &tag_list);
720 
723  const LargeCommunity *src,
725 
726 private:
727 };
728 
729 #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:171
CommunityPtr AppendAndLocate(const Community *src, uint32_t value)
Definition: community.cc:132
CommunityDB(BgpServer *server)
Definition: community.cc:129
CommunityPtr SetAndLocate(const Community *src, const std::vector< uint32_t > &value)
Definition: community.cc:158
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
tbb::atomic< int > refcount_
Definition: community.h:88
int CompareTo(const Community &rhs) const
Definition: community.cc:70
void Set(const std::vector< uint32_t > &communities)
Definition: community.cc:96
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:110
bool ContainsValue(uint32_t value) const
Definition: community.cc:114
void BuildStringList(std::vector< std::string > *list) const
Definition: community.cc:122
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:79
ExtCommunityPtr AppendAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &list)
Definition: community.cc:697
ExtCommunityPtr RemoveVrfRouteImportAndLocate(const ExtCommunity *src)
Definition: community.cc:844
ExtCommunityPtr ReplaceVrfRouteImportAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &vit)
Definition: community.cc:857
ExtCommunityPtr ReplaceMFlagsAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &export_list)
Definition: community.cc:730
ExtCommunityDB(BgpServer *server)
Definition: community.cc:694
ExtCommunityPtr RemoveSourceASAndLocate(const ExtCommunity *src)
Definition: community.cc:816
ExtCommunityPtr RemoveSiteOfOriginAndLocate(const ExtCommunity *src)
Definition: community.cc:788
ExtCommunityPtr ReplaceSGIDListAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &sgid_list)
Definition: community.cc:758
ExtCommunityPtr ReplaceSourceASAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &sas)
Definition: community.cc:829
ExtCommunityPtr ReplaceSiteOfOriginAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &soo)
Definition: community.cc:801
ExtCommunityPtr RemoveAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &list)
Definition: community.cc:717
ExtCommunityPtr ReplaceSubClusterAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &sc)
Definition: community.cc:930
ExtCommunityPtr ReplaceTagListAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &tag_list)
Definition: community.cc:773
ExtCommunityPtr ReplaceLoadBalanceAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &lb)
Definition: community.cc:915
ExtCommunityPtr ReplaceTunnelEncapsulationAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &tunnel_encaps)
Definition: community.cc:900
ExtCommunityPtr SetAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &list)
Definition: community.cc:945
ExtCommunityPtr ReplaceOriginVnAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &origin_vn)
Definition: community.cc:885
ExtCommunityPtr RemoveOriginVnAndLocate(const ExtCommunity *src)
Definition: community.cc:872
ExtCommunityPtr ReplaceRTargetAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &export_list)
Definition: community.cc:744
ExtCommunitySpec(const BgpAttribute &rhs)
Definition: community.h:143
void AddTunnelEncaps(std::vector< std::string > encaps)
Definition: community.cc:214
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:202
static const uint8_t kFlags
Definition: community.h:141
virtual size_t EncodeLength() const
Definition: community.cc:198
virtual std::string ToString() const
Definition: community.cc:191
virtual void ToCanonical(BgpAttr *attr)
Definition: community.cc:210
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:273
static ExtCommunityList ExtCommunityFromString(const std::string &comm)
Definition: community.cc:306
bool ContainsOriginVn(as_t asn, uint32_t vn_index) const
Definition: community.cc:436
friend void intrusive_ptr_release(const ExtCommunity *cextcomm)
Definition: community.h:440
void RemoveVrfRouteImport()
Definition: community.cc:542
bool ContainsSourceAs(const ExtCommunityValue &val) const
Definition: community.cc:447
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:633
void Set(const ExtCommunityList &list)
Definition: community.cc:249
virtual ~ExtCommunity()
Definition: community.h:169
int GetOriginVnIndex() const
Definition: community.cc:668
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:353
uint32_t GetSubClusterId() const
Definition: community.cc:456
bool ContainsOriginVn4(const ExtCommunityValue &val) const
static bool is_local_sequence_number(const ExtCommunityValue &val)
Definition: community.h:237
void RemoveMFlags()
Definition: community.cc:476
int CompareTo(const ExtCommunity &rhs) const
Definition: community.cc:222
std::vector< int > GetTagList(as2_t asn=0) const
Definition: community.cc:615
static std::string ToString(const ExtCommunityValue &val)
Definition: community.cc:362
static bool is_sub_cluster(const ExtCommunityValue &val)
Definition: community.h:348
void RemoveOriginVn()
Definition: community.cc:553
void Append(const ExtCommunityValue &value)
Definition: community.cc:265
static bool is_tag(const ExtCommunityValue &val)
Definition: community.h:380
void RemoveLoadBalance()
Definition: community.cc:574
bool ContainsRTarget(const ExtCommunityValue &val) const
Definition: community.cc:418
void RemoveTag()
Definition: community.cc:510
friend std::size_t hash_value(ExtCommunity const &comm)
Definition: community.h:392
void RemoveSGID()
Definition: community.cc:498
static bool is_tag4(const ExtCommunityValue &val)
Definition: community.h:386
bool ContainsVrfRouteImport(const ExtCommunityValue &val) const
Definition: community.cc:467
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:532
void RemoveSubCluster()
Definition: community.cc:585
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:487
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:563
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
tbb::atomic< int > refcount_
Definition: community.h:427
std::vector< std::string > GetTunnelEncap() const
Definition: community.cc:596
bool ContainsTunnelEncapVxlan() const
Definition: community.cc:656
void RemoveSiteOfOrigin()
Definition: community.cc:521
friend class BgpAttrTest
Definition: community.h:409
virtual void Remove()
Definition: community.cc:245
This class represents a database for managing LargeCommunity objects. It is used to store,...
Definition: community.h:694
LargeCommunityPtr AppendAndLocate(const LargeCommunity *src, const LargeCommunity::LargeCommunityList &list)
Append a list of LargeCommunity values to an existing attribute.
Definition: community.cc:1151
LargeCommunityPtr ReplaceTagListAndLocate(const LargeCommunity *src, const LargeCommunity::LargeCommunityList &tag_list)
Replace all tags in a LargeCommunity with a new tag list.
Definition: community.cc:1171
LargeCommunityPtr SetAndLocate(const LargeCommunity *src, const LargeCommunity::LargeCommunityList &list)
Replace all values in a LargeCommunity with a new list.
Definition: community.cc:1200
LargeCommunityPtr RemoveAndLocate(const LargeCommunity *src, const LargeCommunity::LargeCommunityList &list)
Remove a list of LargeCommunity values from an existing attribute.
Definition: community.cc:1186
LargeCommunityDB(BgpServer *server)
Constructs an instance of the class and links to the given BgpServer instance.
Definition: community.cc:1148
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:977
LargeCommunitySpec()
Constructs a new instance using the attribute type and flags.
Definition: community.h:521
LargeCommunitySpec(const BgpAttribute &rhs)
Construct 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
virtual size_t EncodeLength() const
Compute the encoded length of the attribute.
Definition: community.cc:965
virtual std::string ToString() const
Generate a human-readable string representation.
Definition: community.cc:958
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Compare the attribute with another BgpAttribute.
Definition: community.cc:969
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:532
This class represents an array of BGP Large Community values. A LargeCommunity consists of one or mor...
Definition: community.h:548
const LargeCommunityList & communities() const
Get the list of Large Community values.
Definition: community.h:586
friend std::size_t hash_value(LargeCommunity const &comm)
Compute the hash value for a LargeCommunity object.
Definition: community.h:602
static std::string ToHexString(const LargeCommunityValue &val)
Convert a LargeCommunityValue to a hexadecimal string.
Definition: community.cc:1081
std::vector< LargeCommunityValue > LargeCommunityList
A list (vector) of LargeCommunityValue items.
Definition: community.h:554
friend int intrusive_ptr_del_ref(const LargeCommunity *clargecomm)
Decrement reference count of an clargecomm.
Definition: community.h:661
tbb::atomic< int > refcount_
A reference counter, needed for memory management.
Definition: community.h:648
LargeCommunity(LargeCommunityDB *largecomm_db)
Constructs an instance of the class and links to the given LargeCommunityDB instance.
Definition: community.h:558
std::vector< uint64_t > GetTagList(as_t asn=0) const
Get the list of tags with the specified ASN.
Definition: community.cc:1109
friend int intrusive_ptr_add_ref(const LargeCommunity *clargecomm)
Increment reference count atomically.
Definition: community.h:656
void Set(const LargeCommunityList &list)
Replace all existing values with the provided list.
Definition: community.cc:1009
LargeCommunityDB * largecomm_db_
A pointer to the managing LargeCommunityDB.
Definition: community.h:650
virtual void Remove()
Remove this community.
Definition: community.cc:1005
int CompareTo(const LargeCommunity &rhs) const
Compare this LargeCommunity to another.
Definition: community.cc:982
static LargeCommunityList LargeCommunityFromString(const std::string &comm)
Parse a string into a list of LargeCommunity values.
Definition: community.cc:1066
static std::string ToString(const LargeCommunityValue &val)
Convert a LargeCommunityValue to a human-readable string.
Definition: community.cc:1090
virtual ~LargeCommunity()
Destroys an instance.
Definition: community.h:577
void RemoveTag()
Remove all the tags.
Definition: community.cc:1098
LargeCommunityList communities_
A list of LargeCommunity storing BGP Large Community values.
Definition: community.h:652
boost::array< uint8_t, 12 > LargeCommunityValue
A single Large Community value.
Definition: community.h:551
friend void intrusive_ptr_release(const LargeCommunity *clargecomm)
Release a LargeCommunity instance when the reference count reaches zero.
Definition: community.h:667
static bool is_tag(const LargeCommunityValue &val)
Check if the LargeCommunity value is tag.
Definition: community.h:613
void Append(const LargeCommunityValue &value)
Append a single LargeCommunity value.
Definition: community.cc:1025
friend class BgpAttrTest
Enables the access to private members for BgpAttrTest.
Definition: community.h:634
static LargeCommunityValue FromHexString(const std::string &comm, boost::system::error_code *errorp)
Convert a hexadecimal string to a LargeCommunityValue.
Definition: community.cc:1033
LargeCommunity(const LargeCommunity &rhs)
Copy constructor.
Definition: community.h:564
boost::intrusive_ptr< const LargeCommunity > LargeCommunityPtr
Defines a type for automatic storage of a LargeCommunity instance.
Definition: community.h:678
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)
Definition: community.h:114
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: community.h:36
virtual size_t EncodeLength() const
Definition: community.cc:75
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:45
std::vector< uint32_t > communities
Definition: community.h:35
virtual void ToCanonical(BgpAttr *attr)
Definition: community.cc:41
bool operator()(const ExtCommunity *lhs, const ExtCommunity *rhs)
Definition: community.h:453
A structure to compare order LargeCommunity objects.
Definition: community.h:681
bool operator()(const LargeCommunity *lhs, const LargeCommunity *rhs)
Definition: community.h:682
#define KEY_COMPARE(x, y)
Definition: util.h:70