OpenSDN source code
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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"
22 
23 class BgpAttr;
24 class CommunityDB;
25 class ExtCommunityDB;
26 class BgpServer;
27 
28 struct CommunitySpec : public BgpAttribute {
29  static const int kSize = -1;
30  static const uint8_t kFlags = Optional | Transitive;
32  explicit CommunitySpec(const BgpAttribute &rhs) : BgpAttribute(rhs) { }
33  std::vector<uint32_t> communities;
34  virtual int CompareTo(const BgpAttribute &rhs_attr) const {
35  int ret = BgpAttribute::CompareTo(rhs_attr);
36  if (ret != 0) return ret;
38  static_cast<const CommunitySpec &>(rhs_attr).communities);
39  return 0;
40  }
41  virtual void ToCanonical(BgpAttr *attr);
42  virtual std::string ToString() const;
43  virtual size_t EncodeLength() const;
44 };
45 
46 class Community {
47 public:
48  typedef std::vector<uint32_t> CommunityList;
49  explicit Community(CommunityDB *comm_db)
50  : comm_db_(comm_db) {
51  refcount_ = 0;
52  }
53  explicit Community(const Community &rhs)
55  refcount_ = 0;
56  }
57  explicit Community(CommunityDB *comm_db, const CommunitySpec spec);
58  virtual ~Community() { }
59  virtual void Remove();
60 
61  int CompareTo(const Community &rhs) const;
62  bool ContainsValue(uint32_t value) const;
63  void BuildStringList(std::vector<std::string> *list) const;
64 
65  const std::vector<uint32_t> &communities() const { return communities_; }
66 
67  friend std::size_t hash_value(Community const &comm) {
68  size_t hash = 0;
69  boost::hash_range(hash, comm.communities_.begin(),
70  comm.communities_.end());
71  return hash;
72  }
73 
74 private:
75  friend int intrusive_ptr_add_ref(const Community *ccomm);
76  friend int intrusive_ptr_del_ref(const Community *ccomm);
77  friend void intrusive_ptr_release(const Community *ccomm);
78  friend class CommunityDB;
79  friend class BgpAttrTest;
80 
81  void Append(uint32_t value);
82  void Append(const std::vector<uint32_t> &communities);
83  void Set(const std::vector<uint32_t> &communities);
84  void Remove(const std::vector<uint32_t> &communities);
85 
86  mutable tbb::atomic<int> refcount_;
88  std::vector<uint32_t> communities_;
89 };
90 
91 inline int intrusive_ptr_add_ref(const Community *ccomm) {
92  return ccomm->refcount_.fetch_and_increment();
93 }
94 
95 inline int intrusive_ptr_del_ref(const Community *ccomm) {
96  return ccomm->refcount_.fetch_and_decrement();
97 }
98 
99 inline void intrusive_ptr_release(const Community *ccomm) {
100  int prev = ccomm->refcount_.fetch_and_decrement();
101  if (prev == 1) {
102  Community *comm = const_cast<Community *>(ccomm);
103  comm->Remove();
104  assert(comm->refcount_ == 0);
105  delete comm;
106  }
107 }
108 
109 typedef boost::intrusive_ptr<const Community> CommunityPtr;
110 
112  bool operator()(const Community *lhs, const Community *rhs) {
113  return lhs->CompareTo(*rhs) < 0;
114  }
115 };
116 
117 class CommunityDB : public BgpPathAttributeDB<Community, CommunityPtr,
118  CommunitySpec, CommunityCompare,
119  CommunityDB> {
120 public:
121  explicit CommunityDB(BgpServer *server);
122  virtual ~CommunityDB() { }
123 
124  CommunityPtr AppendAndLocate(const Community *src, uint32_t value);
126  const std::vector<uint32_t> &value);
128  const std::vector<uint32_t> &value);
130  const std::vector<uint32_t> &value);
131  CommunityPtr RemoveAndLocate(const Community *src, uint32_t value);
132 
133 private:
134 };
135 
137 public:
138  static const int kSize = -1;
139  static const uint8_t kFlags = Optional | Transitive;
141  explicit ExtCommunitySpec(const BgpAttribute &rhs) : BgpAttribute(rhs) { }
142  virtual size_t EncodeLength() const;
143  std::vector<uint64_t> communities;
144  void AddTunnelEncaps(std::vector<std::string> encaps);
145  virtual int CompareTo(const BgpAttribute &rhs_attr) const;
146  virtual void ToCanonical(BgpAttr *attr);
147  virtual std::string ToString() const;
148 };
149 
151 public:
152  typedef boost::array<uint8_t, 8> ExtCommunityValue;
153  typedef std::vector<ExtCommunityValue> ExtCommunityList;
154 
155  explicit ExtCommunity(ExtCommunityDB *extcomm_db)
156  : extcomm_db_(extcomm_db) {
157  refcount_ = 0;
158  }
159  explicit ExtCommunity(const ExtCommunity &rhs)
160  : extcomm_db_(rhs.extcomm_db_),
162  refcount_ = 0;
163  }
164 
165  explicit ExtCommunity(ExtCommunityDB *extcomm_db,
166  const ExtCommunitySpec spec);
167  virtual ~ExtCommunity() { }
168  virtual void Remove();
169  int CompareTo(const ExtCommunity &rhs) const;
170 
171  bool ContainsRTarget(const ExtCommunityValue &val) const;
172  bool ContainsOriginVn(as_t asn, uint32_t vn_index) const;
173  bool ContainsOriginVn(const ExtCommunityValue &val) const;
174  bool ContainsOriginVn4(const ExtCommunityValue &val) const;
175  bool ContainsVrfRouteImport(const ExtCommunityValue &val) const;
176  bool ContainsSourceAs(const ExtCommunityValue &val) const;
177  uint32_t GetSubClusterId() const;
178 
179  // Return vector of communities
180  const ExtCommunityList &communities() const {
181  return communities_;
182  }
183 
184  std::vector<std::string> GetTunnelEncap() const;
185  std::vector<int> GetTagList(as2_t asn = 0) const;
186  std::vector<int> GetTag4List(as_t asn = 0) const;
187  bool ContainsTunnelEncapVxlan() const;
188  int GetOriginVnIndex() const;
189  static ExtCommunityList ExtCommunityFromString(const std::string &comm);
190  static ExtCommunityValue FromHexString(const std::string &comm,
191  boost::system::error_code *errorp);
192 
193  static bool is_origin_vn(const ExtCommunityValue &val) {
194  //
195  // Origin VN extended community
196  // 2 Octet AS specific extended community
197  //
198  return ((val[0] == BgpExtendedCommunityType::Experimental ||
201  }
202 
203  static bool is_default_gateway(const ExtCommunityValue &val) {
204  //
205  // Default Gateway extended community
206  //
207  return (val[0] == BgpExtendedCommunityType::Opaque) &&
209  }
210 
211  static bool is_es_import(const ExtCommunityValue &val) {
212  //
213  // ES Import extended community
214  //
215  return (val[0] == BgpExtendedCommunityType::Evpn) &&
217  }
218 
219  static bool is_esi_label(const ExtCommunityValue &val) {
220  //
221  // ESI Label extended community
222  //
223  return (val[0] == BgpExtendedCommunityType::Evpn) &&
225  }
226 
227  static bool is_mac_mobility(const ExtCommunityValue &val) {
228  //
229  // MAC Mobility extended community
230  //
231  return (val[0] == BgpExtendedCommunityType::Evpn) &&
233  }
234 
235  static bool is_local_sequence_number(const ExtCommunityValue &val) {
238  }
239 
240  static bool is_etree(const ExtCommunityValue &val) {
241  //
242  // ETree extended community
243  //
244  return (val[0] == BgpExtendedCommunityType::Evpn) &&
246  }
247 
248  static bool is_multicast_flags(const ExtCommunityValue &val) {
249  //
250  // Multicast Flags extended community
251  //
252  return (val[0] == BgpExtendedCommunityType::Evpn) &&
254  }
255 
256 
257  static bool is_router_mac(const ExtCommunityValue &val) {
258  //
259  // Router MAC extended community
260  //
261  return (val[0] == BgpExtendedCommunityType::Evpn) &&
263  }
264 
265  static bool is_route_target(const ExtCommunityValue &val) {
266  //
267  // Route target extended community
268  // 1. 2 Octet AS specific extended community Route Target
269  // 2. IPv4 Address specific extended community Route Target
270  // 3. 4 Octet AS specific extended community Route Target
271  //
272  return ((val[0] == BgpExtendedCommunityType::TwoOctetAS ||
276  }
277 
278  static uint32_t get_rtarget_val(const ExtCommunityValue &val) {
279  //
280  // Get non user-configured RT value from Route Target extended
281  // community for
282  // 1. 2 Octet AS specific extended community Route Target
283  // 2. 4 Octet AS specific extended community Route Target
284  //
285  if (is_route_target(val)) {
286  uint8_t data[8];
287  uint32_t rt;
288  std::copy(val.begin(), val.end(), &data[0]);
289  if (data[0] == BgpExtendedCommunityType::TwoOctetAS) {
290  rt = get_value(data + 4, 4);
291  if (rt >= BGP_RTGT_MIN_ID_AS2 && rt <= BGP_RTGT_MAX_ID_AS2) {
292  return (rt);
293  }
294  } else if (data[0] == BgpExtendedCommunityType::FourOctetAS) {
295  rt = get_value(data + 6, 2);
296  if (rt >= BGP_RTGT_MIN_ID_AS4 && rt <= BGP_RTGT_MAX_ID_AS4) {
297  return (rt);
298  }
299  }
300  }
301  return (0);
302  }
303 
304  static bool is_security_group(const ExtCommunityValue &val) {
305  //
306  // SG ID extended community
307  // 2 Octet AS specific extended community
308  //
309  return (val[0] == BgpExtendedCommunityType::Experimental) &&
311  }
312 
313  static bool is_security_group4(const ExtCommunityValue &val) {
314  //
315  // SG ID extended community
316  // 2 Octet AS specific extended community
317  //
320  }
321 
322  static bool is_site_of_origin(const ExtCommunityValue &val) {
323  //
324  // Site of Origin / Route Origin extended community
325  // 1. 2 Octet AS specific extended community
326  // 2. IPv4 Address specific extended community
327  // 3. 4 Octet AS specific extended community Route Target
328  //
329  return ((val[0] == BgpExtendedCommunityType::TwoOctetAS ||
333  }
334 
335  static bool is_source_as(const ExtCommunityValue &val) {
336  //
337  // Source AS extended community
338  // 1. 2 Octet AS specific extended community
339  // 2. 4 Octet AS specific extended community
340  //
341  return ((val[0] == BgpExtendedCommunityType::TwoOctetAS ||
344  }
345 
346  static bool is_sub_cluster(const ExtCommunityValue &val) {
347  //
348  // Sub Cluster extended community
349  // 1. Experimental AS specific extended community
350  // 2. Experimental4Byte AS specific extended community
351  //
352  return (((val[0] == BgpExtendedCommunityType::Experimental) ||
355  }
356 
357  static bool is_vrf_route_import(const ExtCommunityValue &val) {
358  //
359  // VRF Route Import extended community
360  // IPv4 Address specific extended community
361  //
362  return ((val[0] == BgpExtendedCommunityType::IPv4Address) &&
364  }
365 
366  static bool is_tunnel_encap(const ExtCommunityValue &val) {
367  // Tunnel encap extended community
368  return (val[0] == BgpExtendedCommunityType::Opaque) &&
370  }
371 
372  static bool is_load_balance(const ExtCommunityValue &val) {
373  // Load Balance extended community
374  return (val[0] == BgpExtendedCommunityType::Opaque) &&
376  }
377 
378  static bool is_tag(const ExtCommunityValue &val) {
379  // Tag extended community
380  return (val[0] == BgpExtendedCommunityType::Experimental) &&
382  }
383 
384  static bool is_tag4(const ExtCommunityValue &val) {
385  // Tag extended community
388  }
389 
390  friend std::size_t hash_value(ExtCommunity const &comm) {
391  size_t hash = 0;
392  for (ExtCommunityList::const_iterator iter = comm.communities_.begin();
393  iter != comm.communities_.end(); iter++) {
394  boost::hash_range(hash, iter->begin(), iter->end());
395  }
396  return hash;
397  }
398 
399  static std::string ToString(const ExtCommunityValue &val);
400  static std::string ToHexString(const ExtCommunityValue &val);
401 
402 private:
403  friend int intrusive_ptr_add_ref(const ExtCommunity *cextcomm);
404  friend int intrusive_ptr_del_ref(const ExtCommunity *cextcomm);
405  friend void intrusive_ptr_release(const ExtCommunity *cextcomm);
406  friend class ExtCommunityDB;
407  friend class BgpAttrTest;
408 
409  void Append(const ExtCommunityValue &value);
410  void Append(const ExtCommunityList &list);
411  void Remove(const ExtCommunityList &list);
412  void RemoveMFlags();
413  void RemoveRTarget();
414  void RemoveSGID();
415  void RemoveTag();
416  void RemoveSiteOfOrigin();
417  void RemoveSourceAS();
418  void RemoveVrfRouteImport();
419  void RemoveOriginVn();
421  void RemoveLoadBalance();
422  void RemoveSubCluster();
423  void Set(const ExtCommunityList &list);
424 
425  mutable tbb::atomic<int> refcount_;
428 };
429 
430 inline int intrusive_ptr_add_ref(const ExtCommunity *cextcomm) {
431  return cextcomm->refcount_.fetch_and_increment();
432 }
433 
434 inline int intrusive_ptr_del_ref(const ExtCommunity *cextcomm) {
435  return cextcomm->refcount_.fetch_and_decrement();
436 }
437 
438 inline void intrusive_ptr_release(const ExtCommunity *cextcomm) {
439  int prev = cextcomm->refcount_.fetch_and_decrement();
440  if (prev == 1) {
441  ExtCommunity *extcomm = const_cast<ExtCommunity *>(cextcomm);
442  extcomm->Remove();
443  assert(extcomm->refcount_ == 0);
444  delete extcomm;
445  }
446 }
447 
448 typedef boost::intrusive_ptr<const ExtCommunity> ExtCommunityPtr;
449 
451  bool operator()(const ExtCommunity *lhs, const ExtCommunity *rhs) {
452  return lhs->CompareTo(*rhs) < 0;
453  }
454 };
455 
456 class ExtCommunityDB : public BgpPathAttributeDB<ExtCommunity, ExtCommunityPtr,
457  ExtCommunitySpec,
458  ExtCommunityCompare,
459  ExtCommunityDB> {
460 public:
461  explicit ExtCommunityDB(BgpServer *server);
462 
464  const ExtCommunity::ExtCommunityList &list);
466  const ExtCommunity::ExtCommunityValue &value);
468  const ExtCommunity::ExtCommunityList &list);
469 
471  const ExtCommunity::ExtCommunityList &export_list);
473  const ExtCommunity::ExtCommunityList &export_list);
475  const ExtCommunity::ExtCommunityList &sgid_list);
477  const ExtCommunity::ExtCommunityList &tag_list);
489  const ExtCommunity::ExtCommunityValue &origin_vn);
491  const ExtCommunity *src,
492  const ExtCommunity::ExtCommunityList &tunnel_encaps);
498  const ExtCommunity::ExtCommunityList &list);
499 
500 private:
501 };
502 
503 #endif // SRC_BGP_COMMUNITY_H_
CommunityDB(BgpServer *server)
Definition: community.cc:128
int GetOriginVnIndex() const
Definition: community.cc:667
ExtCommunityPtr RemoveSiteOfOriginAndLocate(const ExtCommunity *src)
Definition: community.cc:787
const std::vector< uint32_t > & communities() const
Definition: community.h:65
int intrusive_ptr_add_ref(const AsPath *cpath)
Definition: bgp_aspath.h:147
ExtCommunityPtr ReplaceSGIDListAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &sgid_list)
Definition: community.cc:757
ExtCommunityDB * extcomm_db_
Definition: community.h:426
ExtCommunityPtr AppendAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &list)
Definition: community.cc:696
ExtCommunityPtr ReplaceOriginVnAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &origin_vn)
Definition: community.cc:884
ExtCommunityPtr ReplaceMFlagsAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &export_list)
Definition: community.cc:729
friend int intrusive_ptr_del_ref(const ExtCommunity *cextcomm)
Definition: community.h:434
friend int intrusive_ptr_add_ref(const ExtCommunity *cextcomm)
Definition: community.h:430
boost::array< uint8_t, 8 > ExtCommunityValue
Definition: community.h:152
bool ContainsOriginVn(as_t asn, uint32_t vn_index) const
Definition: community.cc:435
ExtCommunity(ExtCommunityDB *extcomm_db)
Definition: community.h:155
void RemoveSubCluster()
Definition: community.cc:584
friend void intrusive_ptr_release(const Community *ccomm)
Definition: community.h:99
uint32_t GetSubClusterId() const
Definition: community.cc:455
std::vector< int > GetTagList(as2_t asn=0) const
Definition: community.cc:614
static bool is_security_group(const ExtCommunityValue &val)
Definition: community.h:304
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: community.cc:201
virtual size_t EncodeLength() const
Definition: community.cc:197
void Set(const std::vector< uint32_t > &communities)
Definition: community.cc:95
virtual void Remove()
Definition: community.cc:109
#define KEY_COMPARE(x, y)
Definition: util.h:70
#define BGP_RTGT_MAX_ID_AS2
Definition: bgp_common.h:18
tbb::atomic< int > refcount_
Definition: community.h:425
static std::string ToHexString(const ExtCommunityValue &val)
Definition: community.cc:352
static const int kSize
Definition: community.h:138
ExtCommunityPtr RemoveOriginVnAndLocate(const ExtCommunity *src)
Definition: community.cc:871
void Append(const ExtCommunityValue &value)
Definition: community.cc:264
bool ContainsOriginVn4(const ExtCommunityValue &val) const
std::vector< int > GetTag4List(as_t asn=0) const
Definition: community.cc:632
CommunityPtr RemoveAndLocate(const Community *src, const std::vector< uint32_t > &value)
Definition: community.cc:170
static bool is_source_as(const ExtCommunityValue &val)
Definition: community.h:335
bool operator()(const ExtCommunity *lhs, const ExtCommunity *rhs)
Definition: community.h:451
static bool is_site_of_origin(const ExtCommunityValue &val)
Definition: community.h:322
bool operator()(const Community *lhs, const Community *rhs)
Definition: community.h:112
ExtCommunityPtr RemoveAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &list)
Definition: community.cc:716
ExtCommunityPtr RemoveVrfRouteImportAndLocate(const ExtCommunity *src)
Definition: community.cc:843
uint32_t as_t
Definition: bgp_common.h:21
static uint64_t get_value(const uint8_t *data, int size)
Definition: parse_object.h:39
static const int kSize
Definition: community.h:29
bool ContainsRTarget(const ExtCommunityValue &val) const
Definition: community.cc:417
static bool is_esi_label(const ExtCommunityValue &val)
Definition: community.h:219
static bool is_security_group4(const ExtCommunityValue &val)
Definition: community.h:313
void RemoveRTarget()
Definition: community.cc:486
virtual ~ExtCommunity()
Definition: community.h:167
virtual ~CommunityDB()
Definition: community.h:122
void RemoveSourceAS()
Definition: community.cc:531
friend class BgpAttrTest
Definition: community.h:407
virtual size_t EncodeLength() const
Definition: community.cc:74
virtual void ToCanonical(BgpAttr *attr)
Definition: community.cc:40
bool ContainsSourceAs(const ExtCommunityValue &val) const
Definition: community.cc:446
const ExtCommunityList & communities() const
Definition: community.h:180
virtual int CompareTo(const BgpAttribute &rhs) const
uint16_t as2_t
Definition: bgp_common.h:22
CommunityPtr AppendAndLocate(const Community *src, uint32_t value)
Definition: community.cc:131
static bool is_router_mac(const ExtCommunityValue &val)
Definition: community.h:257
ExtCommunityList communities_
Definition: community.h:427
boost::intrusive_ptr< const ExtCommunity > ExtCommunityPtr
Definition: community.h:448
CommunityPtr SetAndLocate(const Community *src, const std::vector< uint32_t > &value)
Definition: community.cc:157
static bool is_multicast_flags(const ExtCommunityValue &val)
Definition: community.h:248
bool ContainsValue(uint32_t value) const
Definition: community.cc:113
static ExtCommunityList ExtCommunityFromString(const std::string &comm)
Definition: community.cc:305
friend std::size_t hash_value(ExtCommunity const &comm)
Definition: community.h:390
void RemoveSiteOfOrigin()
Definition: community.cc:520
Community(CommunityDB *comm_db)
Definition: community.h:49
static bool is_tag4(const ExtCommunityValue &val)
Definition: community.h:384
static ExtCommunityValue FromHexString(const std::string &comm, boost::system::error_code *errorp)
Definition: community.cc:272
virtual void Remove()
Definition: community.cc:244
ExtCommunitySpec(const BgpAttribute &rhs)
Definition: community.h:141
int CompareTo(const Community &rhs) const
Definition: community.cc:69
friend int intrusive_ptr_add_ref(const Community *ccomm)
Definition: community.h:91
static std::string ToString(const ExtCommunityValue &val)
Definition: community.cc:361
int CompareTo(const ExtCommunity &rhs) const
Definition: community.cc:221
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: community.h:34
boost::intrusive_ptr< const Community > CommunityPtr
Definition: community.h:109
ExtCommunityPtr ReplaceSourceASAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &sas)
Definition: community.cc:828
static bool is_es_import(const ExtCommunityValue &val)
Definition: community.h:211
void AddTunnelEncaps(std::vector< std::string > encaps)
Definition: community.cc:213
bool ContainsVrfRouteImport(const ExtCommunityValue &val) const
Definition: community.cc:466
void Set(const ExtCommunityList &list)
Definition: community.cc:248
int intrusive_ptr_del_ref(const AsPath *cpath)
Definition: bgp_aspath.h:151
static bool is_local_sequence_number(const ExtCommunityValue &val)
Definition: community.h:235
void RemoveOriginVn()
Definition: community.cc:552
virtual std::string ToString() const
Definition: community.cc:190
void RemoveSGID()
Definition: community.cc:497
ExtCommunityPtr RemoveSourceASAndLocate(const ExtCommunity *src)
Definition: community.cc:815
void RemoveTunnelEncapsulation()
Definition: community.cc:562
static bool is_sub_cluster(const ExtCommunityValue &val)
Definition: community.h:346
ExtCommunityPtr ReplaceSiteOfOriginAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &soo)
Definition: community.cc:800
static const uint8_t kFlags
Definition: community.h:139
ExtCommunityPtr ReplaceTagListAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &tag_list)
Definition: community.cc:772
static bool is_default_gateway(const ExtCommunityValue &val)
Definition: community.h:203
#define BGP_RTGT_MIN_ID_AS4
Definition: bgp_common.h:16
void RemoveLoadBalance()
Definition: community.cc:573
void RemoveVrfRouteImport()
Definition: community.cc:541
CommunitySpec(const BgpAttribute &rhs)
Definition: community.h:32
std::vector< ExtCommunityValue > ExtCommunityList
Definition: community.h:153
static bool is_tag(const ExtCommunityValue &val)
Definition: community.h:378
Community(const Community &rhs)
Definition: community.h:53
ExtCommunityPtr ReplaceTunnelEncapsulationAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &tunnel_encaps)
Definition: community.cc:899
bool ContainsTunnelEncapVxlan() const
Definition: community.cc:655
static bool is_route_target(const ExtCommunityValue &val)
Definition: community.h:265
static bool is_tunnel_encap(const ExtCommunityValue &val)
Definition: community.h:366
ExtCommunity(const ExtCommunity &rhs)
Definition: community.h:159
friend int intrusive_ptr_del_ref(const Community *ccomm)
Definition: community.h:95
std::vector< std::string > GetTunnelEncap() const
Definition: community.cc:595
#define BGP_RTGT_MAX_ID_AS4
Definition: bgp_common.h:19
std::vector< uint32_t > communities_
Definition: community.h:88
ExtCommunityPtr ReplaceSubClusterAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &sc)
Definition: community.cc:929
#define BGP_RTGT_MIN_ID_AS2
Definition: bgp_common.h:15
void intrusive_ptr_release(const AsPath *cpath)
Definition: bgp_aspath.h:155
ExtCommunityPtr ReplaceLoadBalanceAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &lb)
Definition: community.cc:914
void RemoveTag()
Definition: community.cc:509
virtual std::string ToString() const
Definition: community.cc:44
static bool is_etree(const ExtCommunityValue &val)
Definition: community.h:240
friend std::size_t hash_value(Community const &comm)
Definition: community.h:67
std::vector< uint32_t > communities
Definition: community.h:33
std::vector< uint64_t > communities
Definition: community.h:143
void Append(uint32_t value)
Definition: community.cc:78
ExtCommunityPtr ReplaceVrfRouteImportAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityValue &vit)
Definition: community.cc:856
static bool is_vrf_route_import(const ExtCommunityValue &val)
Definition: community.h:357
virtual void ToCanonical(BgpAttr *attr)
Definition: community.cc:209
ExtCommunityDB(BgpServer *server)
Definition: community.cc:693
static uint32_t get_rtarget_val(const ExtCommunityValue &val)
Definition: community.h:278
void BuildStringList(std::vector< std::string > *list) const
Definition: community.cc:121
friend void intrusive_ptr_release(const ExtCommunity *cextcomm)
Definition: community.h:438
friend class BgpAttrTest
Definition: community.h:79
std::vector< uint32_t > CommunityList
Definition: community.h:48
ExtCommunityPtr SetAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &list)
Definition: community.cc:944
virtual ~Community()
Definition: community.h:58
ExtCommunityPtr ReplaceRTargetAndLocate(const ExtCommunity *src, const ExtCommunity::ExtCommunityList &export_list)
Definition: community.cc:743
static const uint8_t kFlags
Definition: community.h:30
static bool is_mac_mobility(const ExtCommunityValue &val)
Definition: community.h:227
tbb::atomic< int > refcount_
Definition: community.h:86
void RemoveMFlags()
Definition: community.cc:475
static bool is_load_balance(const ExtCommunityValue &val)
Definition: community.h:372
CommunityDB * comm_db_
Definition: community.h:87
static bool is_origin_vn(const ExtCommunityValue &val)
Definition: community.h:193