OpenSDN source code
community.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 #include "bgp/community.h"
6 
7 #include <boost/foreach.hpp>
8 
9 #include <algorithm>
10 #include <string>
11 #include <map>
12 
13 #include "base/string_util.h"
14 #include "bgp/bgp_proto.h"
35 #include "net/community_type.h"
36 
37 using std::sort;
38 using std::string;
39 using std::unique;
40 using std::vector;
41 
43  attr->set_community(this);
44 }
45 
46 string CommunitySpec::ToString() const {
47  string repr;
48  char start[32];
49  snprintf(start, sizeof(start), "Communities: %zu [", communities.size());
50  repr += start;
51 
52  for (size_t i = 0; i < communities.size(); ++i) {
53  char community[12];
54  snprintf(community, sizeof(community), " %X", communities[i]);
55  repr += community;
56  }
57  repr += " ]";
58 
59  return repr;
60 }
61 
63  : comm_db_(comm_db), communities_(spec.communities) {
64  refcount_ = 0;
65  sort(communities_.begin(), communities_.end());
66  vector<uint32_t>::iterator it =
67  unique(communities_.begin(), communities_.end());
68  communities_.erase(it, communities_.end());
69 }
70 
71 int Community::CompareTo(const Community &rhs) const {
73  return 0;
74 }
75 
77  return communities.size() * sizeof(uint32_t);
78 }
79 
80 void Community::Append(uint32_t value) {
81  if (ContainsValue(value))
82  return;
83  communities_.push_back(value);
84  sort(communities_.begin(), communities_.end());
85 }
86 
87 void Community::Append(const std::vector<uint32_t> &communities) {
88  for (auto community : communities) {
89  communities_.push_back(community);
90  }
91  sort(communities_.begin(), communities_.end());
92  vector<uint32_t>::iterator it =
93  unique(communities_.begin(), communities_.end());
94  communities_.erase(it, communities_.end());
95 }
96 
97 void Community::Set(const std::vector<uint32_t> &communities) {
98  communities_.clear();
99  for (auto community : communities) {
100  communities_.push_back(community);
101  }
102 }
103 
104 void Community::Remove(const std::vector<uint32_t> &communities) {
105  for (auto community : communities) {
106  communities_.erase(
107  std::remove(communities_.begin(), communities_.end(), community),
108  communities_.end());
109  }
110 }
112  comm_db_->Delete(this);
113 }
114 
115 bool Community::ContainsValue(uint32_t value) const {
116  for (auto community : communities_) {
117  if (community == value)
118  return true;
119  }
120  return false;
121 }
122 
123 void Community::BuildStringList(vector<string> *list) const {
124  for (auto community : communities_) {
125  string name = CommunityType::CommunityToString(community);
126  list->push_back(name);
127  }
128 }
129 
131 }
132 
134  uint32_t value) {
135  Community *clone;
136  if (src) {
137  clone = new Community(*src);
138  } else {
139  clone = new Community(this);
140  }
141 
142  clone->Append(value);
143  return Locate(clone);
144 }
145 
147  const std::vector<uint32_t> &value) {
148  Community *clone;
149  if (src) {
150  clone = new Community(*src);
151  } else {
152  clone = new Community(this);
153  }
154 
155  clone->Append(value);
156  return Locate(clone);
157 }
158 
160  const std::vector<uint32_t> &value) {
161  Community *clone;
162  if (src) {
163  clone = new Community(*src);
164  } else {
165  clone = new Community(this);
166  }
167 
168  clone->Set(value);
169  return Locate(clone);
170 }
171 
173  const std::vector<uint32_t> &value) {
174  Community *clone;
175  if (src) {
176  clone = new Community(*src);
177  } else {
178  clone = new Community(this);
179  }
180 
181  clone->Remove(value);
182  return Locate(clone);
183 }
184 
186  uint32_t value) {
187  Community::CommunityList communities;
188  communities.push_back(value);
189  return RemoveAndLocate(src, communities);
190 }
191 
193  char repr[80];
194  snprintf(repr, sizeof(repr), "ExtCommunity <code: %d, flags: %02x>:%d",
195  code, flags, (uint32_t)communities.size());
196  return string(repr);
197 }
198 
200  const ExtCommunitySpec &ex_spec) {
201  LargeCommunitySpec large_spec;
202  using extcomm_iterator = decltype(large_spec.communities)::iterator;
203  std::map<uint16_t, extcomm_iterator> tno_vs_tspec;
204  std::vector<std::pair<uint32_t,uint16_t> > asn4_vs_tno;
205  const uint64_t ExtCommTag = uint64_t(
208  const uint64_t ExtCommTag4 = uint64_t(
211  uint16_t asn_or_tno;
212  uint32_t asn4;
213  uint16_t tno;
214  for (const auto &val64 : ex_spec.communities) {
215  if ((0xFFFF000000000000 & val64) == ExtCommTag) {
216  asn_or_tno = (0x0000FFFF00000000 & val64) >> 32;
217  std::vector<uint32_t> large_comm = {
218  asn_or_tno,
219  0x01000000 | uint32_t((val64 & 0x00000000FFFF0000) >> 16),
220  uint32_t(val64 & 0x000000000000FFFF)
221  };
222  extcomm_iterator it_tspec = large_spec.communities.insert(
223  large_spec.communities.end(),
224  large_comm.begin(),
225  large_comm.end());
226  tno_vs_tspec.insert({asn_or_tno,
227  it_tspec});
228  continue;
229  }
230 
231  if ((0xFFFF000000000000 & val64) == ExtCommTag4) {
232  asn4 = (0x0000FFFFFFFF0000 & val64) >> 16;
233  tno = (0x000000000000FFFF & val64);
234  asn4_vs_tno.push_back({asn4, tno});
235  }
236  }
237  // loop over all 4-byte ASNs and modify their value in large_spec
238  for(const auto &[asn4, tno] : asn4_vs_tno) {
239  auto &large_comm_asn = tno_vs_tspec[tno];
240  if (large_comm_asn == large_spec.communities.end()) {
241  continue;
242  }
243  *large_comm_asn = asn4;
244  }
245  return large_spec;
246 }
247 
249  const ExtCommunitySpec& ex_spec) {
250  const uint64_t ExtCommTag = uint64_t(
253  const uint64_t ExtCommTag4 = uint64_t(
256  ExtCommunitySpec new_ex_spec;
257  for (const auto &val64 : ex_spec.communities) {
258  if ((0xFFFF000000000000 & val64) != ExtCommTag &&
259  (0xFFFF000000000000 & val64) != ExtCommTag4) {
260  new_ex_spec.communities.push_back(val64);
261  }
262  }
263  return new_ex_spec;
264 }
265 
267  return communities.size() * sizeof(uint64_t);
268 }
269 
270 int ExtCommunitySpec::CompareTo(const BgpAttribute &rhs_attr) const {
271  int ret = BgpAttribute::CompareTo(rhs_attr);
272  if (ret != 0) return ret;
274  static_cast<const ExtCommunitySpec &>(rhs_attr).communities);
275  return 0;
276 }
277 
279  attr->set_ext_community(this);
280 }
281 
282 void ExtCommunitySpec::AddTunnelEncaps(vector<string> encaps) {
283  for (vector<string>::size_type i = 0; i < encaps.size(); i++) {
284  string encap_str = encaps[i];
285  TunnelEncap tun_encap(encap_str);
286  communities.push_back(tun_encap.GetExtCommunityValue());
287  }
288 }
289 
290 int ExtCommunity::CompareTo(const ExtCommunity &rhs) const {
291  KEY_COMPARE(communities_.size(), rhs.communities_.size());
292 
293  ExtCommunityList::const_iterator i, j;
294  for (i = communities_.begin(), j = rhs.communities_.begin();
295  i < communities_.end(); ++i, ++j) {
296  if (*i < *j) {
297  return -1;
298  }
299  if (*i > *j) {
300  return 1;
301  }
302  }
303  return 0;
304 }
305 
307  for (ExtCommunityList::const_iterator it = list.begin();
308  it != list.end(); ++it) {
309  communities_.erase(std::remove(communities_.begin(),
310  communities_.end(), *it), communities_.end());
311  }
312 }
314  extcomm_db_->Delete(this);
315 }
316 
318  communities_.clear();
319  for (ExtCommunityList::const_iterator it = list.begin();
320  it != list.end(); ++it) {
321  communities_.push_back(*it);
322  }
323 }
324 
326  communities_.insert(communities_.end(), list.begin(), list.end());
327  sort(communities_.begin(), communities_.end());
328  ExtCommunityList::iterator it =
329  unique(communities_.begin(), communities_.end());
330  communities_.erase(it, communities_.end());
331 }
332 
334  communities_.push_back(value);
335  sort(communities_.begin(), communities_.end());
336  ExtCommunityList::iterator it =
337  unique(communities_.begin(), communities_.end());
338  communities_.erase(it, communities_.end());
339 }
340 
342  const string &comm, boost::system::error_code *errorp) {
343  ExtCommunityValue data;
344  put_value(&data[0], 8, 0);
345  char *end;
346  uint64_t value = strtoull(comm.c_str(), &end, 16);
347  if (value == 0 || *end) {
348  // e.g. 0 or 12x34ff (invalid hex)
349  if (errorp != NULL) {
350  *errorp = make_error_code(
351  boost::system::errc::invalid_argument);
352  return data;
353  }
354  }
355  if (comm[0] == '0' && (comm[1] == 'x' || comm[1] == 'X')) {
356  if (comm.length() > 18 && errorp != NULL) {
357  // e.g. 0xabcdef0123456789f is an invalid 8byte hex value
358  *errorp = make_error_code(
359  boost::system::errc::invalid_argument);
360  return data;
361  }
362  } else {
363  if (comm.length() > 16 && errorp != NULL) {
364  // e.g. abcdef0123456789f is an invalid 8byte hex value
365  *errorp = make_error_code(
366  boost::system::errc::invalid_argument);
367  return data;
368  }
369  }
370  put_value(&data[0], 8, value);
371  return data;
372 }
373 
375  const string &comm) {
376  ExtCommunityList commList;
377  ExtCommunityValue value;
378  size_t pos = comm.find(':');
379  string first(comm.substr(0, pos));
380  boost::system::error_code error;
381  if (first == "soo") {
382  SiteOfOrigin soo = SiteOfOrigin::FromString(comm, &error);
383  if (error) {
384  return commList;
385  }
386  commList.push_back(soo.GetExtCommunity());
387  } else if (first == "target") {
388  RouteTarget rt = RouteTarget::FromString(comm, &error);
389  if (error) {
390  return commList;
391  }
392  commList.push_back(rt.GetExtCommunity());
393  } else if (first == "source-as") {
394  SourceAs sas = SourceAs::FromString(comm, &error);
395  if (error) {
396  return commList;
397  }
398  commList.push_back(sas.GetExtCommunity());
399  } else if (first == "rt-import") {
400  VrfRouteImport vit = VrfRouteImport::FromString(comm, &error);
401  if (error) {
402  return commList;
403  }
404  commList.push_back(vit.GetExtCommunity());
405  } else if (first == "subcluster") {
406  SubCluster sc = SubCluster::FromString(comm, &error);
407  if (error) {
408  return commList;
409  }
410  commList.push_back(sc.GetExtCommunity());
411  } else {
412  value = FromHexString(comm, &error);
413  if (error) {
414  return commList;
415  }
416  commList.push_back(value);
417  }
418  return commList;
419 }
420 
422  char temp[50];
423  int len = 0;
424  for (size_t i = 0; i < comm.size(); i++) {
425  len += snprintf(temp+len, sizeof(temp) - len, "%02x", (comm)[i]);
426  }
427  return(string(temp));
428 }
429 
431  if (is_route_target(comm)) {
432  RouteTarget rt(comm);
433  return(rt.ToString());
434  } else if (is_default_gateway(comm)) {
435  DefaultGateway dgw(comm);
436  return(dgw.ToString());
437  } else if (is_es_import(comm)) {
438  EsImport es_import(comm);
439  return(es_import.ToString());
440  } else if (is_esi_label(comm)) {
441  EsiLabel esi_label(comm);
442  return(esi_label.ToString());
443  } else if (is_mac_mobility(comm)) {
444  MacMobility mm(comm);
445  return(mm.ToString());
446  } else if (is_local_sequence_number(comm)) {
447  LocalSequenceNumber lsn(comm);
448  return lsn.ToString();
449  } else if (is_etree(comm)) {
450  ETree etree(comm);
451  return(etree.ToString());
452  } else if (is_router_mac(comm)) {
453  RouterMac router_mac(comm);
454  return(router_mac.ToString());
455  } else if (is_origin_vn(comm)) {
456  OriginVn origin_vn(comm);
457  return(origin_vn.ToString());
458  } else if (is_security_group(comm)) {
459  SecurityGroup sg(comm);
460  return(sg.ToString());
461  } else if (is_site_of_origin(comm)) {
462  SiteOfOrigin soo(comm);
463  return(soo.ToString());
464  } else if (is_tunnel_encap(comm)) {
465  TunnelEncap encap(comm);
466  return(encap.ToString());
467  } else if (is_load_balance(comm)) {
468  LoadBalance load_balance(comm);
469  return(load_balance.ToString());
470  } else if (is_tag(comm)) {
471  Tag tag(comm);
472  return(tag.ToString());
473  } else if (is_source_as(comm)) {
474  SourceAs sas(comm);
475  return(sas.ToString());
476  } else if (is_vrf_route_import(comm)) {
477  VrfRouteImport rt_import(comm);
478  return(rt_import.ToString());
479  } else if (is_sub_cluster(comm)) {
480  SubCluster sc(comm);
481  return(sc.ToString());
482  }
483  return ToHexString(comm);
484 }
485 
487  for (ExtCommunityList::const_iterator it = communities_.begin();
488  it != communities_.end(); ++it) {
489  if (ExtCommunity::is_route_target(*it) && *it == val)
490  return true;
491  }
492  return false;
493 }
494 
496  for (ExtCommunityList::const_iterator it = communities_.begin();
497  it != communities_.end(); ++it) {
498  if (ExtCommunity::is_origin_vn(*it) && *it == val)
499  return true;
500  }
501  return false;
502 }
503 
504 bool ExtCommunity::ContainsOriginVn(as_t asn, uint32_t vn_index) const {
505  if (asn <= 0xffffffff) {
506  OriginVn origin_vn(asn, vn_index);
507  return ContainsOriginVn(origin_vn.GetExtCommunity());
508  }
509  OriginVn origin_vn4(asn, AS_TRANS);
510  OriginVn origin_vn(AS_TRANS, vn_index);
511  return (ContainsOriginVn(origin_vn.GetExtCommunity()) &&
512  ContainsOriginVn(origin_vn4.GetExtCommunity()));
513 }
514 
516  for (ExtCommunityList::const_iterator it = communities_.begin();
517  it != communities_.end(); ++it) {
518  if (ExtCommunity::is_source_as(*it) && *it == val)
519  return true;
520  }
521  return false;
522 }
523 
525  for (ExtCommunityList::const_iterator it = communities_.begin();
526  it != communities_.end(); ++it) {
527  if (ExtCommunity::is_sub_cluster(*it)) {
528  SubCluster sc(*it);
529  return sc.GetId();
530  }
531  }
532  return 0;
533 }
534 
536  for (ExtCommunityList::const_iterator it = communities_.begin();
537  it != communities_.end(); ++it) {
538  if (ExtCommunity::is_vrf_route_import(*it) && *it == val)
539  return true;
540  }
541  return false;
542 }
543 
545  for (ExtCommunityList::iterator it = communities_.begin();
546  it != communities_.end(); ) {
548  it = communities_.erase(it);
549  } else {
550  ++it;
551  }
552  }
553 }
554 
556  for (ExtCommunityList::iterator it = communities_.begin();
557  it != communities_.end(); ) {
559  it = communities_.erase(it);
560  } else {
561  ++it;
562  }
563  }
564 }
565 
567  for (ExtCommunityList::iterator it = communities_.begin();
568  it != communities_.end(); ) {
571  it = communities_.erase(it);
572  } else {
573  ++it;
574  }
575  }
576 }
577 
579  for (ExtCommunityList::iterator it = communities_.begin();
580  it != communities_.end(); ) {
581  if (ExtCommunity::is_tag(*it) || ExtCommunity::is_tag4(*it)) {
582  it = communities_.erase(it);
583  } else {
584  ++it;
585  }
586  }
587 }
588 
590  for (ExtCommunityList::iterator it = communities_.begin();
591  it != communities_.end(); ) {
593  it = communities_.erase(it);
594  } else {
595  ++it;
596  }
597  }
598 }
599 
601  for (ExtCommunityList::iterator it = communities_.begin();
602  it != communities_.end(); ) {
603  if (ExtCommunity::is_source_as(*it)) {
604  it = communities_.erase(it);
605  } else {
606  ++it;
607  }
608  }
609 }
611  for (ExtCommunityList::iterator it = communities_.begin();
612  it != communities_.end(); ) {
614  it = communities_.erase(it);
615  } else {
616  ++it;
617  }
618  }
619 }
620 
622  for (ExtCommunityList::iterator it = communities_.begin();
623  it != communities_.end(); ) {
625  it = communities_.erase(it);
626  else
627  ++it;
628  }
629 }
630 
632  for (ExtCommunityList::iterator it = communities_.begin();
633  it != communities_.end(); ) {
635  it = communities_.erase(it);
636  } else {
637  ++it;
638  }
639  }
640 }
641 
643  for (ExtCommunityList::iterator it = communities_.begin();
644  it != communities_.end(); ) {
646  it = communities_.erase(it);
647  } else {
648  ++it;
649  }
650  }
651 }
652 
654  for (ExtCommunityList::iterator it = communities_.begin();
655  it != communities_.end(); ) {
656  if (ExtCommunity::is_sub_cluster(*it)) {
657  it = communities_.erase(it);
658  } else {
659  ++it;
660  }
661  }
662 }
663 
664 vector<string> ExtCommunity::GetTunnelEncap() const {
665  vector<string> encap_list;
666  for (ExtCommunityList::const_iterator iter = communities_.begin();
667  iter != communities_.end(); ++iter) {
668  if (!ExtCommunity::is_tunnel_encap(*iter))
669  continue;
670  TunnelEncap encap(*iter);
671  if (encap.tunnel_encap() == TunnelEncapType::UNSPEC)
672  continue;
673  encap_list.push_back(encap.ToXmppString());
674  }
675 
676  sort(encap_list.begin(), encap_list.end());
677  vector<string>::iterator encap_iter =
678  unique(encap_list.begin(), encap_list.end());
679  encap_list.erase(encap_iter, encap_list.end());
680  return encap_list;
681 }
682 
683 vector<int> ExtCommunity::GetTagList(as2_t asn) const {
684  vector<int> tag_list;
685  for (ExtCommunityList::const_iterator iter = communities_.begin();
686  iter != communities_.end(); ++iter) {
687  if (!ExtCommunity::is_tag(*iter))
688  continue;
689  Tag tag_comm(*iter);
690  if (asn && tag_comm.as_number() != asn && !tag_comm.IsGlobal())
691  continue;
692  tag_list.push_back(tag_comm.tag());
693  }
694 
695  sort(tag_list.begin(), tag_list.end());
696  vector<int>::iterator tag_iter = unique(tag_list.begin(), tag_list.end());
697  tag_list.erase(tag_iter, tag_list.end());
698  return tag_list;
699 }
700 
701 vector<int> ExtCommunity::GetTag4List(as_t asn) const {
702  vector<int> tag_list;
703  for (ExtCommunityList::const_iterator iter = communities_.begin();
704  iter != communities_.end(); ++iter) {
705  if (!ExtCommunity::is_tag4(*iter))
706  continue;
707  Tag4ByteAs tag_comm(*iter);
708  if (asn && tag_comm.as_number() != asn && !tag_comm.IsGlobal())
709  continue;
710  vector<int> matching_tag_list = GetTagList(tag_comm.tag());
711  tag_list.insert(tag_list.end(), matching_tag_list.begin(),
712  matching_tag_list.end());
713  tag_list.push_back(tag_comm.tag());
714  }
715  if ((asn <= 0xffff) && tag_list.size() == 0)
716  tag_list = GetTagList(asn);
717 
718  sort(tag_list.begin(), tag_list.end());
719  vector<int>::iterator tag_iter = unique(tag_list.begin(), tag_list.end());
720  tag_list.erase(tag_iter, tag_list.end());
721  return tag_list;
722 }
723 
725  for (ExtCommunityList::const_iterator iter = communities_.begin();
726  iter != communities_.end(); ++iter) {
727  if (!ExtCommunity::is_tunnel_encap(*iter))
728  continue;
729  TunnelEncap encap(*iter);
730  if (encap.tunnel_encap() == TunnelEncapType::VXLAN)
731  return true;
732  }
733  return false;
734 }
735 
737  for (ExtCommunityList::const_iterator iter = communities_.begin();
738  iter != communities_.end(); ++iter) {
739  if (ExtCommunity::is_origin_vn(*iter)) {
740  OriginVn origin_vn(*iter);
741  return origin_vn.vn_index();
742  }
743  }
744  return -1;
745 }
746 
748  const ExtCommunitySpec spec) : extcomm_db_(extcomm_db) {
749  refcount_ = 0;
750  for (vector<uint64_t>::const_iterator it = spec.communities.begin();
751  it < spec.communities.end(); ++it) {
752  ExtCommunityValue comm;
753  put_value(comm.data(), comm.size(), *it);
754  communities_.push_back(comm);
755  }
756  sort(communities_.begin(), communities_.end());
757  ExtCommunityList::iterator it =
758  unique(communities_.begin(), communities_.end());
759  communities_.erase(it, communities_.end());
760 }
761 
763 }
764 
766  const ExtCommunity::ExtCommunityList &list) {
767  ExtCommunity *clone;
768  if (src) {
769  clone = new ExtCommunity(*src);
770  } else {
771  clone = new ExtCommunity(this);
772  }
773 
774  clone->Append(list);
775  return Locate(clone);
776 }
777 
779  const ExtCommunity::ExtCommunityValue &value) {
781  list.push_back(value);
782  return AppendAndLocate(src, list);
783 }
784 
786  const ExtCommunity::ExtCommunityList &list) {
787  ExtCommunity *clone;
788  if (src) {
789  clone = new ExtCommunity(*src);
790  } else {
791  clone = new ExtCommunity(this);
792  }
793 
794  clone->Remove(list);
795  return Locate(clone);
796 }
797 
799  const ExtCommunity::ExtCommunityList &export_list) {
800  ExtCommunity *clone;
801  if (src) {
802  clone = new ExtCommunity(*src);
803  } else {
804  clone = new ExtCommunity(this);
805  }
806 
807  clone->RemoveMFlags();
808  clone->Append(export_list);
809  return Locate(clone);
810 }
811 
813  const ExtCommunity::ExtCommunityList &export_list) {
814  ExtCommunity *clone;
815  if (src) {
816  clone = new ExtCommunity(*src);
817  } else {
818  clone = new ExtCommunity(this);
819  }
820 
821  clone->RemoveRTarget();
822  clone->Append(export_list);
823  return Locate(clone);
824 }
825 
827  const ExtCommunity *src,
828  const ExtCommunity::ExtCommunityList &sgid_list) {
829  ExtCommunity *clone;
830  if (src) {
831  clone = new ExtCommunity(*src);
832  } else {
833  clone = new ExtCommunity(this);
834  }
835 
836  clone->RemoveSGID();
837  clone->Append(sgid_list);
838  return Locate(clone);
839 }
840 
842  const ExtCommunity *src,
843  const ExtCommunity::ExtCommunityList &tag_list) {
844  ExtCommunity *clone;
845  if (src) {
846  clone = new ExtCommunity(*src);
847  } else {
848  clone = new ExtCommunity(this);
849  }
850 
851  clone->RemoveTag();
852  clone->Append(tag_list);
853  return Locate(clone);
854 }
855 
857  const ExtCommunity *src) {
858  ExtCommunity *clone;
859  if (src) {
860  clone = new ExtCommunity(*src);
861  } else {
862  clone = new ExtCommunity(this);
863  }
864 
865  clone->RemoveSiteOfOrigin();
866  return Locate(clone);
867 }
868 
870  const ExtCommunity *src,
871  const ExtCommunity::ExtCommunityValue &soo) {
872  ExtCommunity *clone;
873  if (src) {
874  clone = new ExtCommunity(*src);
875  } else {
876  clone = new ExtCommunity(this);
877  }
878 
879  clone->RemoveSiteOfOrigin();
880  clone->Append(soo);
881  return Locate(clone);
882 }
883 
885  const ExtCommunity *src) {
886  ExtCommunity *clone;
887  if (src) {
888  clone = new ExtCommunity(*src);
889  } else {
890  clone = new ExtCommunity(this);
891  }
892 
893  clone->RemoveSourceAS();
894  return Locate(clone);
895 }
896 
898  const ExtCommunity *src,
899  const ExtCommunity::ExtCommunityValue &sas) {
900  ExtCommunity *clone;
901  if (src) {
902  clone = new ExtCommunity(*src);
903  } else {
904  clone = new ExtCommunity(this);
905  }
906 
907  clone->RemoveSourceAS();
908  clone->Append(sas);
909  return Locate(clone);
910 }
911 
913  const ExtCommunity *src) {
914  ExtCommunity *clone;
915  if (src) {
916  clone = new ExtCommunity(*src);
917  } else {
918  clone = new ExtCommunity(this);
919  }
920 
921  clone->RemoveVrfRouteImport();
922  return Locate(clone);
923 }
924 
926  const ExtCommunity *src,
927  const ExtCommunity::ExtCommunityValue &vit) {
928  ExtCommunity *clone;
929  if (src) {
930  clone = new ExtCommunity(*src);
931  } else {
932  clone = new ExtCommunity(this);
933  }
934 
935  clone->RemoveVrfRouteImport();
936  clone->Append(vit);
937  return Locate(clone);
938 }
939 
941  const ExtCommunity *src) {
942  ExtCommunity *clone;
943  if (src) {
944  clone = new ExtCommunity(*src);
945  } else {
946  clone = new ExtCommunity(this);
947  }
948 
949  clone->RemoveOriginVn();
950  return Locate(clone);
951 }
952 
954  const ExtCommunity *src,
955  const ExtCommunity::ExtCommunityValue &origin_vn) {
956  ExtCommunity *clone;
957  if (src) {
958  clone = new ExtCommunity(*src);
959  } else {
960  clone = new ExtCommunity(this);
961  }
962 
963  clone->RemoveOriginVn();
964  clone->Append(origin_vn);
965  return Locate(clone);
966 }
967 
969  const ExtCommunity *src,
970  const ExtCommunity::ExtCommunityList &tunnel_encaps) {
971  ExtCommunity *clone;
972  if (src) {
973  clone = new ExtCommunity(*src);
974  } else {
975  clone = new ExtCommunity(this);
976  }
977 
978  clone->RemoveTunnelEncapsulation();
979  clone->Append(tunnel_encaps);
980  return Locate(clone);
981 }
982 
984  const ExtCommunity *src,
986  ExtCommunity *clone;
987  if (src) {
988  clone = new ExtCommunity(*src);
989  } else {
990  clone = new ExtCommunity(this);
991  }
992 
993  clone->RemoveLoadBalance();
994  clone->Append(lb);
995  return Locate(clone);
996 }
997 
999  const ExtCommunity *src,
1000  const ExtCommunity::ExtCommunityValue &sc) {
1001  ExtCommunity *clone;
1002  if (src) {
1003  clone = new ExtCommunity(*src);
1004  } else {
1005  clone = new ExtCommunity(this);
1006  }
1007 
1008  clone->RemoveSubCluster();
1009  clone->Append(sc);
1010  return Locate(clone);
1011 }
1012 
1014  const ExtCommunity::ExtCommunityList &value) {
1015  ExtCommunity *clone;
1016  if (src) {
1017  clone = new ExtCommunity(*src);
1018  } else {
1019  clone = new ExtCommunity(this);
1020  }
1021 
1022  clone->Set(value);
1023  return Locate(clone);
1024 }
1025 
1027  char repr[80];
1028  snprintf(repr, sizeof(repr), "LargeCommunity <code: %d, flags: %02x>:%d",
1029  code, flags, (uint32_t)communities.size() / 3);
1030  return string(repr);
1031 }
1032 
1034  return communities.size() * sizeof(uint32_t);
1035 }
1036 
1037 int LargeCommunitySpec::CompareTo(const BgpAttribute &rhs_attr) const {
1038  int ret = BgpAttribute::CompareTo(rhs_attr);
1039  if (ret != 0) return ret;
1041  static_cast<const LargeCommunitySpec &>(rhs_attr).communities);
1042  return 0;
1043 }
1044 
1046  // add LarceComm to attr
1047  attr->set_large_community(this);
1048 }
1049 
1051  KEY_COMPARE(communities_.size(), rhs.communities_.size());
1052 
1053  LargeCommunityList::const_iterator i, j;
1054  for (i = communities_.begin(), j = rhs.communities_.begin();
1055  i < communities_.end(); ++i, ++j) {
1056  if (*i < *j) {
1057  return -1;
1058  }
1059  if (*i > *j) {
1060  return 1;
1061  }
1062  }
1063  return 0;
1064 }
1065 
1067  for (LargeCommunityList::const_iterator it = list.begin();
1068  it != list.end(); ++it) {
1069  communities_.erase(std::remove(communities_.begin(),
1070  communities_.end(), *it), communities_.end());
1071  }
1072 }
1074  largecomm_db_->Delete(this);
1075 }
1076 
1078  communities_.clear();
1079  for (LargeCommunityList::const_iterator it = list.begin();
1080  it != list.end(); ++it) {
1081  communities_.push_back(*it);
1082  }
1083 }
1084 
1086  communities_.insert(communities_.end(), list.begin(), list.end());
1087  sort(communities_.begin(), communities_.end());
1088  LargeCommunityList::iterator it =
1089  unique(communities_.begin(), communities_.end());
1090  communities_.erase(it, communities_.end());
1091 }
1092 
1094  communities_.push_back(value);
1095  sort(communities_.begin(), communities_.end());
1096  LargeCommunityList::iterator it =
1097  unique(communities_.begin(), communities_.end());
1098  communities_.erase(it, communities_.end());
1099 }
1100 
1102  const string &comm, boost::system::error_code *errorp) {
1103  LargeCommunityValue data;
1104  put_value(&data[0], 12, 0);
1105  char *end;
1106  uint64_t value = strtoull(comm.c_str(), &end, 24);
1107  if (value == 0 || *end) {
1108  // e.g. 0 or 12x34ff (invalid hex)
1109  if (errorp != NULL) {
1110  *errorp = make_error_code(
1111  boost::system::errc::invalid_argument);
1112  return data;
1113  }
1114  }
1115  if (comm[0] == '0' && (comm[1] == 'x' || comm[1] == 'X')) {
1116  if (comm.length() > 26 && errorp != NULL) {
1117  // e.g. 0xabcdef0123456789abcdef012 is an invalid 8byte hex value
1118  *errorp = make_error_code(
1119  boost::system::errc::invalid_argument);
1120  return data;
1121  }
1122  } else {
1123  if (comm.length() > 24 && errorp != NULL) {
1124  // e.g. abcdef0123456789abcdef012 is an invalid 8byte hex value
1125  *errorp = make_error_code(
1126  boost::system::errc::invalid_argument);
1127  return data;
1128  }
1129  }
1130  put_value(&data[0], 12, value);
1131  return data;
1132 }
1133 
1135  const string &comm) {
1136  LargeCommunityList commList;
1137  LargeCommunityValue value;
1138  size_t pos = comm.find(':');
1139  string first(comm.substr(0, pos));
1140  boost::system::error_code error;
1141  value = FromHexString(comm, &error);
1142  if (error) {
1143  return commList;
1144  }
1145  commList.push_back(value);
1146  return commList;
1147 }
1148 
1150  char temp[50];
1151  int len = 0;
1152  for (size_t i = 0; i < comm.size(); i++) {
1153  len += snprintf(temp+len, sizeof(temp) - len, "%02x", (comm)[i]);
1154  }
1155  return(string(temp));
1156 }
1157 
1159  if (is_tag(comm)) {
1160  TagLC tag(comm);
1161  return(tag.ToString());
1162  }
1163  return ToHexString(comm);
1164 }
1165 
1167  for (LargeCommunityList::iterator it = communities_.begin();
1168  it != communities_.end(); ) {
1169  if (LargeCommunity::is_tag(*it)) {
1170  it = communities_.erase(it);
1171  } else {
1172  ++it;
1173  }
1174  }
1175 }
1176 
1177 vector<uint64_t> LargeCommunity::GetTagList(as_t asn) const {
1178  vector<uint64_t> tag_list;
1179  for (const auto &lc : communities_) {
1180  if (!LargeCommunity::is_tag(lc))
1181  continue;
1182  TagLC tag_comm(lc);
1183  if (asn && tag_comm.as_number() != asn && !tag_comm.IsGlobal())
1184  continue;
1185  tag_list.push_back(tag_comm.tag());
1186  }
1187 
1188  sort(tag_list.begin(), tag_list.end());
1189  vector<uint64_t>::iterator tag_iter = unique(tag_list.begin(),
1190  tag_list.end());
1191  tag_list.erase(tag_iter, tag_list.end());
1192  return tag_list;
1193 }
1194 
1195 
1197  const LargeCommunitySpec spec) : largecomm_db_(largecomm_db) {
1198  refcount_ = 0;
1199  std::vector<uint32_t>::const_iterator lcit = spec.communities.begin();
1200  while (lcit < spec.communities.end()) {
1201  LargeCommunityValue comm;
1202  put_value(comm.data(), 4, *lcit);
1203  lcit++;
1204  put_value(comm.data()+4, 4, *lcit);
1205  lcit++;
1206  put_value(comm.data()+8, 4, *lcit);
1207  lcit++;
1208  communities_.push_back(comm);
1209  }
1210  sort(communities_.begin(), communities_.end());
1211  LargeCommunityList::iterator it =
1212  unique(communities_.begin(), communities_.end());
1213  communities_.erase(it, communities_.end());
1214 }
1215 
1217 }
1218 
1220  const LargeCommunity::LargeCommunityList &list) {
1221  LargeCommunity *clone;
1222  if (src) {
1223  clone = new LargeCommunity(*src);
1224  } else {
1225  clone = new LargeCommunity(this);
1226  }
1227 
1228  clone->Append(list);
1229  return Locate(clone);
1230 }
1231 
1233  const LargeCommunity::LargeCommunityValue &value) {
1235  list.push_back(value);
1236  return AppendAndLocate(src, list);
1237 }
1238 
1240  const LargeCommunity *src,
1241  const LargeCommunity::LargeCommunityList &tag_list) {
1242  LargeCommunity *clone;
1243  if (src) {
1244  clone = new LargeCommunity(*src);
1245  } else {
1246  clone = new LargeCommunity(this);
1247  }
1248 
1249  clone->RemoveTag();
1250  clone->Append(tag_list);
1251  return Locate(clone);
1252 }
1253 
1255  const LargeCommunity::LargeCommunityList &list) {
1256  LargeCommunity *clone;
1257  if (src) {
1258  clone = new LargeCommunity(*src);
1259  } else {
1260  clone = new LargeCommunity(this);
1261  }
1262 
1263  clone->Remove(list);
1264  return Locate(clone);
1265 }
1266 
1267 
1269  const LargeCommunity::LargeCommunityList &list) {
1270  LargeCommunity *clone;
1271  if (src) {
1272  clone = new LargeCommunity(*src);
1273  } else {
1274  clone = new LargeCommunity(this);
1275  }
1276 
1277  clone->Set(list);
1278  return Locate(clone);
1279 }
1280 
#define AS_TRANS
Definition: bgp_common.h:23
uint16_t as2_t
Definition: bgp_common.h:22
uint32_t as_t
Definition: bgp_common.h:21
void set_community(CommunityPtr comm)
Definition: bgp_attr.cc:1001
void set_large_community(LargeCommunityPtr largecomm)
Definition: bgp_attr.cc:1035
void set_ext_community(ExtCommunityPtr extcomm)
Definition: bgp_attr.cc:1013
uint8_t flags
Definition: bgp_attr_base.h:71
virtual int CompareTo(const BgpAttribute &rhs) const
uint8_t code
Definition: bgp_attr_base.h:69
void Delete(Type *attr)
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
static const std::string CommunityToString(uint32_t comm)
const std::vector< uint32_t > & communities() const
Definition: community.h:67
std::vector< uint32_t > communities_
Definition: community.h:90
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
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
std::vector< uint32_t > CommunityList
Definition: community.h:50
void Append(uint32_t value)
Definition: community.cc:80
std::string ToString() const
Definition: etree.h:16
std::string ToString()
Definition: etree.cc:44
std::string ToString() const
Definition: es_import.cc:28
std::string ToString() const
Definition: esi_label.cc:44
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
void AddTunnelEncaps(std::vector< std::string > encaps)
Definition: community.cc:282
std::vector< uint64_t > communities
Definition: community.h:145
virtual int CompareTo(const BgpAttribute &rhs_attr) const
Definition: community.cc:270
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
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
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
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
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
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
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
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 bool is_mac_mobility(const ExtCommunityValue &val)
Definition: community.h:229
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
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
static ExtCommunitySpec RemoveTags(const ExtCommunitySpec &ex_spec)
Removes extended communities corresponding to tags from the given ExtCommunitySpec.
Definition: community.cc:248
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
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
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
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
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
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
static LargeCommunityValue FromHexString(const std::string &comm, boost::system::error_code *errorp)
Convert a hexadecimal string to a LargeCommunityValue.
Definition: community.cc:1101
std::string ToString() const
std::string ToString()
Definition: mac_mobility.cc:43
int vn_index() const
Definition: origin_vn.cc:122
std::string ToString()
Definition: origin_vn.cc:138
const bytes_type & GetExtCommunity() const
Definition: origin_vn.h:33
std::string ToString() const
static RouteTarget FromString(const std::string &str, boost::system::error_code *error=NULL)
const bytes_type & GetExtCommunity() const
std::string ToString()
Definition: router_mac.cc:33
std::string ToString()
static SiteOfOrigin FromString(const std::string &str, boost::system::error_code *error=NULL)
const bytes_type & GetExtCommunity() const
std::string ToString() const
std::string ToString() const
Definition: source_as.cc:50
static SourceAs FromString(const std::string &str, boost::system::error_code *error=NULL)
Definition: source_as.cc:68
const bytes_type & GetExtCommunity() const
Definition: source_as.h:44
uint32_t GetId() const
Definition: sub_cluster.cc:37
const bytes_type & GetExtCommunity() const
Definition: sub_cluster.h:44
std::string ToString() const
Definition: sub_cluster.cc:59
static SubCluster FromString(const std::string &str, boost::system::error_code *error=NULL)
Definition: sub_cluster.cc:80
Represents a single BGP Large Community tag.
std::string ToString() const
Returns a string representation.
as_t as_number() const
Returns the AS number.
uint64_t tag() const
Returns the tag id.
bool IsGlobal() const
Returns true if this tag belongs to a global community.
as2_t as_number() const
std::string ToString() const
int tag() const
bool IsGlobal() const
const uint64_t GetExtCommunityValue() const
Definition: tunnel_encap.h:32
std::string ToString()
Definition: tunnel_encap.cc:51
std::string ToXmppString()
Definition: tunnel_encap.cc:57
TunnelEncapType::Encap tunnel_encap() const
Definition: tunnel_encap.cc:40
const bytes_type & GetExtCommunity() const
static VrfRouteImport FromString(const std::string &str, boost::system::error_code *error=NULL)
std::string ToString() const
boost::intrusive_ptr< const LargeCommunity > LargeCommunityPtr
Defines a type for automatic storage of a LargeCommunity instance.
Definition: community.h:686
boost::intrusive_ptr< const Community > CommunityPtr
Definition: community.h:111
boost::intrusive_ptr< const ExtCommunity > ExtCommunityPtr
Definition: community.h:450
static void put_value(uint8_t *data, int size, uint64_t value)
Definition: parse_object.h:55
virtual size_t EncodeLength() const
Definition: community.cc:76
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
#define KEY_COMPARE(x, y)
Definition: util.h:70