7 #include <boost/foreach.hpp>
49 snprintf(start,
sizeof(start),
"Communities: %zu [",
communities.size());
54 snprintf(community,
sizeof(community),
" %X",
communities[i]);
63 : comm_db_(comm_db), communities_(spec.communities) {
66 vector<uint32_t>::iterator it =
92 vector<uint32_t>::iterator it =
117 if (community == value)
126 list->push_back(name);
147 const std::vector<uint32_t> &value) {
160 const std::vector<uint32_t> &value) {
173 const std::vector<uint32_t> &value) {
188 communities.push_back(value);
194 snprintf(repr,
sizeof(repr),
"ExtCommunity <code: %d, flags: %02x>:%d",
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(
215 if ((0xFFFF000000000000 & val64) == ExtCommTag) {
216 asn_or_tno = (0x0000FFFF00000000 & val64) >> 32;
217 std::vector<uint32_t> large_comm = {
219 0x01000000 | uint32_t((val64 & 0x00000000FFFF0000) >> 16),
220 uint32_t(val64 & 0x000000000000FFFF)
222 extcomm_iterator it_tspec = large_spec.
communities.insert(
226 tno_vs_tspec.insert({asn_or_tno,
231 if ((0xFFFF000000000000 & val64) == ExtCommTag4) {
232 asn4 = (0x0000FFFFFFFF0000 & val64) >> 16;
233 tno = (0x000000000000FFFF & val64);
234 asn4_vs_tno.push_back({asn4, tno});
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()) {
243 *large_comm_asn = asn4;
250 const uint64_t ExtCommTag = uint64_t(
253 const uint64_t ExtCommTag4 = uint64_t(
258 if ((0xFFFF000000000000 & val64) != ExtCommTag &&
259 (0xFFFF000000000000 & val64) != ExtCommTag4) {
272 if (ret != 0)
return ret;
283 for (vector<string>::size_type i = 0; i < encaps.size(); i++) {
284 string encap_str = encaps[i];
293 ExtCommunityList::const_iterator i, j;
307 for (ExtCommunityList::const_iterator it = list.begin();
308 it != list.end(); ++it) {
319 for (ExtCommunityList::const_iterator it = list.begin();
320 it != list.end(); ++it) {
328 ExtCommunityList::iterator it =
336 ExtCommunityList::iterator it =
342 const string &comm, boost::system::error_code *errorp) {
346 uint64_t value = strtoull(comm.c_str(), &end, 16);
347 if (value == 0 || *end) {
349 if (errorp != NULL) {
350 *errorp = make_error_code(
351 boost::system::errc::invalid_argument);
355 if (comm[0] ==
'0' && (comm[1] ==
'x' || comm[1] ==
'X')) {
356 if (comm.length() > 18 && errorp != NULL) {
358 *errorp = make_error_code(
359 boost::system::errc::invalid_argument);
363 if (comm.length() > 16 && errorp != NULL) {
365 *errorp = make_error_code(
366 boost::system::errc::invalid_argument);
375 const string &comm) {
378 size_t pos = comm.find(
':');
379 string first(comm.substr(0, pos));
380 boost::system::error_code error;
381 if (first ==
"soo") {
387 }
else if (first ==
"target") {
393 }
else if (first ==
"source-as") {
399 }
else if (first ==
"rt-import") {
405 }
else if (first ==
"subcluster") {
416 commList.push_back(value);
424 for (
size_t i = 0; i < comm.size(); i++) {
425 len += snprintf(temp+len,
sizeof(temp) - len,
"%02x", (comm)[i]);
427 return(
string(temp));
470 }
else if (
is_tag(comm)) {
487 for (ExtCommunityList::const_iterator it =
communities_.begin();
496 for (ExtCommunityList::const_iterator it =
communities_.begin();
505 if (asn <= 0xffffffff) {
516 for (ExtCommunityList::const_iterator it =
communities_.begin();
525 for (ExtCommunityList::const_iterator it =
communities_.begin();
536 for (ExtCommunityList::const_iterator it =
communities_.begin();
545 for (ExtCommunityList::iterator it =
communities_.begin();
556 for (ExtCommunityList::iterator it =
communities_.begin();
567 for (ExtCommunityList::iterator it =
communities_.begin();
579 for (ExtCommunityList::iterator it =
communities_.begin();
590 for (ExtCommunityList::iterator it =
communities_.begin();
601 for (ExtCommunityList::iterator it =
communities_.begin();
611 for (ExtCommunityList::iterator it =
communities_.begin();
622 for (ExtCommunityList::iterator it =
communities_.begin();
632 for (ExtCommunityList::iterator it =
communities_.begin();
643 for (ExtCommunityList::iterator it =
communities_.begin();
654 for (ExtCommunityList::iterator it =
communities_.begin();
665 vector<string> encap_list;
666 for (ExtCommunityList::const_iterator iter =
communities_.begin();
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());
684 vector<int> tag_list;
685 for (ExtCommunityList::const_iterator iter =
communities_.begin();
692 tag_list.push_back(tag_comm.
tag());
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());
702 vector<int> tag_list;
703 for (ExtCommunityList::const_iterator iter =
communities_.begin();
711 tag_list.insert(tag_list.end(), matching_tag_list.begin(),
712 matching_tag_list.end());
713 tag_list.push_back(tag_comm.
tag());
715 if ((asn <= 0xffff) && tag_list.size() == 0)
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());
725 for (ExtCommunityList::const_iterator iter =
communities_.begin();
737 for (ExtCommunityList::const_iterator iter =
communities_.begin();
750 for (vector<uint64_t>::const_iterator it = spec.
communities.begin();
753 put_value(comm.data(), comm.size(), *it);
757 ExtCommunityList::iterator it =
781 list.push_back(value);
808 clone->
Append(export_list);
822 clone->
Append(export_list);
979 clone->
Append(tunnel_encaps);
1028 snprintf(repr,
sizeof(repr),
"LargeCommunity <code: %d, flags: %02x>:%d",
1030 return string(repr);
1039 if (ret != 0)
return ret;
1053 LargeCommunityList::const_iterator i, j;
1067 for (LargeCommunityList::const_iterator it = list.begin();
1068 it != list.end(); ++it) {
1079 for (LargeCommunityList::const_iterator it = list.begin();
1080 it != list.end(); ++it) {
1088 LargeCommunityList::iterator it =
1096 LargeCommunityList::iterator it =
1102 const string &comm, boost::system::error_code *errorp) {
1106 uint64_t value = strtoull(comm.c_str(), &end, 24);
1107 if (value == 0 || *end) {
1109 if (errorp != NULL) {
1110 *errorp = make_error_code(
1111 boost::system::errc::invalid_argument);
1115 if (comm[0] ==
'0' && (comm[1] ==
'x' || comm[1] ==
'X')) {
1116 if (comm.length() > 26 && errorp != NULL) {
1118 *errorp = make_error_code(
1119 boost::system::errc::invalid_argument);
1123 if (comm.length() > 24 && errorp != NULL) {
1125 *errorp = make_error_code(
1126 boost::system::errc::invalid_argument);
1135 const string &comm) {
1138 size_t pos = comm.find(
':');
1139 string first(comm.substr(0, pos));
1140 boost::system::error_code error;
1145 commList.push_back(value);
1152 for (
size_t i = 0; i < comm.size(); i++) {
1153 len += snprintf(temp+len,
sizeof(temp) - len,
"%02x", (comm)[i]);
1155 return(
string(temp));
1167 for (LargeCommunityList::iterator it =
communities_.begin();
1178 vector<uint64_t> tag_list;
1185 tag_list.push_back(tag_comm.
tag());
1188 sort(tag_list.begin(), tag_list.end());
1189 vector<uint64_t>::iterator tag_iter = unique(tag_list.begin(),
1191 tag_list.erase(tag_iter, tag_list.end());
1199 std::vector<uint32_t>::const_iterator lcit = spec.
communities.begin();
1211 LargeCommunityList::iterator it =
1235 list.push_back(value);
void set_community(CommunityPtr comm)
void set_large_community(LargeCommunityPtr largecomm)
void set_ext_community(ExtCommunityPtr extcomm)
virtual int CompareTo(const BgpAttribute &rhs) const
CommunityPtr Locate(Community *attr)
std::string ToString() const
std::string ToString() const
std::string ToString() const
std::string ToString() const
const bytes_type & GetExtCommunity() const
std::string ToString() const
static RouteTarget FromString(const std::string &str, boost::system::error_code *error=NULL)
const bytes_type & GetExtCommunity() const
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
static SourceAs FromString(const std::string &str, boost::system::error_code *error=NULL)
const bytes_type & GetExtCommunity() const
const bytes_type & GetExtCommunity() const
std::string ToString() const
static SubCluster FromString(const std::string &str, boost::system::error_code *error=NULL)
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.
std::string ToString() const
const uint64_t GetExtCommunityValue() const
std::string ToXmppString()
TunnelEncapType::Encap tunnel_encap() const
const bytes_type & GetExtCommunity() const
static VrfRouteImport FromString(const std::string &str, boost::system::error_code *error=NULL)
std::string ToString() const
static void put_value(uint8_t *data, int size, uint64_t value)
#define KEY_COMPARE(x, y)