7 #include <boost/foreach.hpp>
48 snprintf(start,
sizeof(start),
"Communities: %zu [",
communities.size());
53 snprintf(community,
sizeof(community),
" %X",
communities[i]);
62 : comm_db_(comm_db), communities_(spec.communities) {
65 vector<uint32_t>::iterator it =
91 vector<uint32_t>::iterator it =
116 if (community == value)
125 list->push_back(name);
146 const std::vector<uint32_t> &value) {
159 const std::vector<uint32_t> &value) {
172 const std::vector<uint32_t> &value) {
187 communities.push_back(value);
193 snprintf(repr,
sizeof(repr),
"ExtCommunity <code: %d, flags: %02x>:%d",
204 if (ret != 0)
return ret;
215 for (vector<string>::size_type i = 0; i < encaps.size(); i++) {
216 string encap_str = encaps[i];
225 ExtCommunityList::const_iterator i, j;
239 for (ExtCommunityList::const_iterator it = list.begin();
240 it != list.end(); ++it) {
251 for (ExtCommunityList::const_iterator it = list.begin();
252 it != list.end(); ++it) {
260 ExtCommunityList::iterator it =
268 ExtCommunityList::iterator it =
274 const string &comm, boost::system::error_code *errorp) {
278 uint64_t value = strtoull(comm.c_str(), &end, 16);
279 if (value == 0 || *end) {
281 if (errorp != NULL) {
282 *errorp = make_error_code(
283 boost::system::errc::invalid_argument);
287 if (comm[0] ==
'0' && (comm[1] ==
'x' || comm[1] ==
'X')) {
288 if (comm.length() > 18 && errorp != NULL) {
290 *errorp = make_error_code(
291 boost::system::errc::invalid_argument);
295 if (comm.length() > 16 && errorp != NULL) {
297 *errorp = make_error_code(
298 boost::system::errc::invalid_argument);
307 const string &comm) {
310 size_t pos = comm.find(
':');
311 string first(comm.substr(0, pos));
312 boost::system::error_code error;
313 if (first ==
"soo") {
319 }
else if (first ==
"target") {
325 }
else if (first ==
"source-as") {
331 }
else if (first ==
"rt-import") {
337 }
else if (first ==
"subcluster") {
348 commList.push_back(value);
356 for (
size_t i = 0; i < comm.size(); i++) {
357 len += snprintf(temp+len,
sizeof(temp) - len,
"%02x", (comm)[i]);
359 return(
string(temp));
402 }
else if (
is_tag(comm)) {
419 for (ExtCommunityList::const_iterator it =
communities_.begin();
428 for (ExtCommunityList::const_iterator it =
communities_.begin();
437 if (asn <= 0xffffffff) {
448 for (ExtCommunityList::const_iterator it =
communities_.begin();
457 for (ExtCommunityList::const_iterator it =
communities_.begin();
468 for (ExtCommunityList::const_iterator it =
communities_.begin();
477 for (ExtCommunityList::iterator it =
communities_.begin();
488 for (ExtCommunityList::iterator it =
communities_.begin();
499 for (ExtCommunityList::iterator it =
communities_.begin();
511 for (ExtCommunityList::iterator it =
communities_.begin();
522 for (ExtCommunityList::iterator it =
communities_.begin();
533 for (ExtCommunityList::iterator it =
communities_.begin();
543 for (ExtCommunityList::iterator it =
communities_.begin();
554 for (ExtCommunityList::iterator it =
communities_.begin();
564 for (ExtCommunityList::iterator it =
communities_.begin();
575 for (ExtCommunityList::iterator it =
communities_.begin();
586 for (ExtCommunityList::iterator it =
communities_.begin();
597 vector<string> encap_list;
598 for (ExtCommunityList::const_iterator iter =
communities_.begin();
608 sort(encap_list.begin(), encap_list.end());
609 vector<string>::iterator encap_iter =
610 unique(encap_list.begin(), encap_list.end());
611 encap_list.erase(encap_iter, encap_list.end());
616 vector<int> tag_list;
617 for (ExtCommunityList::const_iterator iter =
communities_.begin();
624 tag_list.push_back(tag_comm.
tag());
627 sort(tag_list.begin(), tag_list.end());
628 vector<int>::iterator tag_iter = unique(tag_list.begin(), tag_list.end());
629 tag_list.erase(tag_iter, tag_list.end());
634 vector<int> tag_list;
635 for (ExtCommunityList::const_iterator iter =
communities_.begin();
643 tag_list.insert(tag_list.end(), matching_tag_list.begin(),
644 matching_tag_list.end());
645 tag_list.push_back(tag_comm.
tag());
647 if ((asn <= 0xffff) && tag_list.size() == 0)
650 sort(tag_list.begin(), tag_list.end());
651 vector<int>::iterator tag_iter = unique(tag_list.begin(), tag_list.end());
652 tag_list.erase(tag_iter, tag_list.end());
657 for (ExtCommunityList::const_iterator iter =
communities_.begin();
669 for (ExtCommunityList::const_iterator iter =
communities_.begin();
682 for (vector<uint64_t>::const_iterator it = spec.
communities.begin();
685 put_value(comm.data(), comm.size(), *it);
689 ExtCommunityList::iterator it =
713 list.push_back(value);
740 clone->
Append(export_list);
754 clone->
Append(export_list);
911 clone->
Append(tunnel_encaps);
960 snprintf(repr,
sizeof(repr),
"LargeCommunity <code: %d, flags: %02x>:%d",
971 if (ret != 0)
return ret;
985 LargeCommunityList::const_iterator i, j;
999 for (LargeCommunityList::const_iterator it = list.begin();
1000 it != list.end(); ++it) {
1011 for (LargeCommunityList::const_iterator it = list.begin();
1012 it != list.end(); ++it) {
1020 LargeCommunityList::iterator it =
1028 LargeCommunityList::iterator it =
1034 const string &comm, boost::system::error_code *errorp) {
1038 uint64_t value = strtoull(comm.c_str(), &end, 24);
1039 if (value == 0 || *end) {
1041 if (errorp != NULL) {
1042 *errorp = make_error_code(
1043 boost::system::errc::invalid_argument);
1047 if (comm[0] ==
'0' && (comm[1] ==
'x' || comm[1] ==
'X')) {
1048 if (comm.length() > 26 && errorp != NULL) {
1050 *errorp = make_error_code(
1051 boost::system::errc::invalid_argument);
1055 if (comm.length() > 24 && errorp != NULL) {
1057 *errorp = make_error_code(
1058 boost::system::errc::invalid_argument);
1067 const string &comm) {
1070 size_t pos = comm.find(
':');
1071 string first(comm.substr(0, pos));
1072 boost::system::error_code error;
1077 commList.push_back(value);
1084 for (
size_t i = 0; i < comm.size(); i++) {
1085 len += snprintf(temp+len,
sizeof(temp) - len,
"%02x", (comm)[i]);
1087 return(
string(temp));
1099 for (LargeCommunityList::iterator it =
communities_.begin();
1110 vector<uint64_t> tag_list;
1117 tag_list.push_back(tag_comm.
tag());
1120 sort(tag_list.begin(), tag_list.end());
1121 vector<uint64_t>::iterator tag_iter = unique(tag_list.begin(),
1123 tag_list.erase(tag_iter, tag_list.end());
1131 std::vector<uint32_t>::const_iterator lcit = spec.
communities.begin();
1143 LargeCommunityList::iterator it =
1167 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)