7 #include <boost/foreach.hpp>
20 #include "schema/bgp_schema_types.h"
21 #include "schema/vnc_cfg_types.h"
23 using std::unique_ptr;
47 last = identifier.rfind(
':');
48 if (last == 0 || last == string::npos) {
51 parent = identifier.substr(0, last);
56 return htonl(address.to_v4().to_ulong());
61 return addr.to_string();
65 : instance_(instance) {
81 instance_(rti), policy_(rtp) {
100 iter !=
node->
end(graph); ++iter) {
102 if (strcmp(adj->
table()->
Typename(),
"routing-instance") == 0)
103 routing_instance = adj;
105 routing_policy = adj;
107 if (routing_policy == NULL || routing_instance == NULL) {
111 pair->first = routing_instance;
112 pair->second = routing_policy;
117 const autogen::RoutingPolicyRoutingInstance *ri_rp) {
127 if (boost::iequals(value,
"md5")) {
134 const autogen::AuthenticationData &values) {
139 for (vector<autogen::AuthenticationKeyItem>::const_iterator iter =
140 values.key_items.begin(); iter != values.key_items.end(); ++iter) {
141 key.
id = iter->key_id;
142 key.
value = iter->key;
154 const string &family) {
157 return (family ==
"inet" || family ==
"inet6");
167 const vector<string> &remote_family_list) {
169 BOOST_FOREACH(
const string &family, family_list) {
175 if (!remote_family_list.empty()) {
176 vector<string>::const_iterator it = find(
177 remote_family_list.begin(), remote_family_list.end(), family);
178 if (it == remote_family_list.end())
183 family_attributes_list.push_back(family_attributes);
198 const autogen::BgpSessionAttributes *attributes) {
199 set<string> family_set;
201 BOOST_FOREACH(
const autogen::BgpFamilyAttributes &family_config,
202 attributes->family_attributes) {
206 family_config.address_family);
207 family_attributes.
loop_count = family_config.loop_count;
208 family_attributes.
prefix_limit = family_config.prefix_limit.maximum;
210 family_config.prefix_limit.idle_timeout;
212 family_config.default_tunnel_encap;
213 family_attributes_list.push_back(family_attributes);
214 family_set.insert(family_config.address_family);
217 BOOST_FOREACH(
const string &family, attributes->address_families.family) {
218 if (family_set.find(family) != family_set.end())
221 family_attributes_list.push_back(family_attributes);
236 const autogen::BgpSession *session) {
237 typedef vector<autogen::BgpSessionAttributes> AttributeVec;
238 const autogen::BgpSessionAttributes *common = NULL;
239 const autogen::BgpSessionAttributes *local = NULL;
240 for (AttributeVec::const_iterator iter = session->attributes.begin();
241 iter != session->attributes.end(); ++iter) {
242 const autogen::BgpSessionAttributes *attr = iter.operator->();
243 if (attr->bgp_router.empty()) {
245 }
else if (neighbor->
router_type() !=
"bgpaas-client" &&
246 attr->bgp_router == localname) {
248 }
else if (neighbor->
router_type() ==
"bgpaas-client" &&
249 attr->bgp_router ==
"bgpaas-server") {
255 const autogen::BgpSessionAttributes *attributes = NULL;
256 if (common != NULL) {
258 }
else if (local != NULL) {
261 if (attributes != NULL) {
266 if (attributes->admin_down) {
269 if (attributes->local_autonomous_system) {
270 neighbor->
set_local_as(attributes->local_autonomous_system);
272 if (attributes->hold_time) {
277 const autogen::RouteOriginOverride &origin_override =
278 attributes->route_origin_override;
280 origin_override.origin);
287 const string &local_name,
288 const string &remote_name,
289 const autogen::BgpRouter *local_router,
290 const autogen::BgpRouter *remote_router,
291 const autogen::BgpSession *session) {
298 if (session && !session->uuid.empty()) {
300 neighbor->
set_name(remote_name +
":" + session->uuid);
307 const autogen::BgpRouterParams ¶ms = remote_router->parameters();
309 if (params.admin_down) {
312 if (params.local_autonomous_system) {
313 neighbor->
set_peer_as(params.local_autonomous_system);
317 boost::system::error_code err;
319 IpAddress::from_string(params.address, err));
322 "Invalid peer address " << params.address <<
323 " for neighbor " << neighbor->
name());
326 Ip4Address identifier = Ip4Address::from_string(params.identifier, err);
329 "Invalid peer identifier " << params.identifier <<
330 " for neighbor " << neighbor->
name());
334 if (params.router_type ==
"bgpaas-client") {
336 Ip4Address::from_string(params.gateway_address, err);
337 if (!params.gateway_address.empty() && err) {
339 "Invalid gateway address " <<
340 params.gateway_address <<
341 " for neighbor " << neighbor->
name());
347 Ip6Address::from_string(params.ipv6_gateway_address, err);
348 if (!params.ipv6_gateway_address.empty() && err) {
350 "Invalid ipv6 gateway address " <<
351 params.ipv6_gateway_address <<
352 " for neighbor " << neighbor->
name());
362 if (session != NULL) {
369 if (master_protocol && master_protocol->
bgp_router()) {
370 const autogen::BgpRouterParams &master_params =
372 if (master_params.admin_down) {
376 Ip4Address::from_string(master_params.identifier, err);
381 if (master_params.local_autonomous_system) {
382 neighbor->
set_local_as(master_params.local_autonomous_system);
384 neighbor->
set_local_as(master_params.autonomous_system);
387 if (instance != master_instance) {
396 const autogen::BgpRouterParams &protocol_params =
400 protocol_params.address_families.family,
401 params.address_families.family);
404 const autogen::BgpRouterParams &local_params =
405 local_router->parameters();
412 params.address_families.family);
422 const autogen::BgpRouter *local_rt_config,
423 const string &peername,
const autogen::BgpRouter *remote_rt_config,
424 const autogen::BgpPeering *peering,
NeighborMap *map) {
430 const autogen::BgpPeeringAttributes &attr = peering->data();
431 for (autogen::BgpPeeringAttributes::const_iterator iter = attr.begin();
432 iter != attr.end(); ++iter) {
435 local_rt_config, remote_rt_config, iter.operator->());
436 map->insert(make_pair(neighbor->
name(), neighbor));
444 local_rt_config, remote_rt_config, NULL);
445 map->insert(make_pair(neighbor->
name(), neighbor));
458 const autogen::BgpPeering *peering) {
460 assert(
node != NULL);
467 pair<IFMapNode *, IFMapNode *> routers;
470 const autogen::BgpRouter *local_rt_config =
471 static_cast<const autogen::BgpRouter *
>(
472 routers.first->GetObject());
473 const autogen::BgpRouter *remote_rt_config =
474 static_cast<const autogen::BgpRouter *
>(
475 routers.second->GetObject());
476 if (local_rt_config &&
477 local_rt_config->IsPropertySet(autogen::BgpRouter::PARAMETERS) &&
479 remote_rt_config->IsPropertySet(autogen::BgpRouter::PARAMETERS)) {
481 remote_rt_config, peering, &future);
492 NeighborMap::iterator it1 = current.begin();
493 NeighborMap::iterator it2 = future.begin();
494 while (it1 != current.end() && it2 != future.end()) {
495 if (it1->first < it2->first) {
499 }
else if (it1->first > it2->first) {
508 if (*neighbor != *update) {
520 for (; it1 != current.end(); ++it1) {
524 for (; it2 != future.end(); ++it2) {
546 for (NeighborMap::iterator iter = current.begin();
547 iter != current.end(); ++iter) {
565 const string &localname,
IFMapNode *node,
566 pair<IFMapNode *, IFMapNode *> *pair) {
569 string local_router_type;
570 string remote_router_type;
571 string local_instance;
572 string remote_instance;
575 iter !=
node->
end(db_graph); ++iter) {
579 autogen::BgpRouter *router =
580 static_cast<autogen::BgpRouter *
>(adj->
GetObject());
583 const autogen::BgpRouterParams ¶ms = router->parameters();
585 string name = adj->
name().substr(instance_name.size() + 1);
586 if (
name == localname && params.router_type !=
"bgpaas-client") {
588 local_router_type = params.router_type;
589 local_instance = instance_name;
591 params.router_type ==
"bgpaas-server") {
593 local_router_type = params.router_type;
594 local_instance = instance_name;
597 remote_router_type = params.router_type;
598 remote_instance = instance_name;
602 if ((local == NULL || remote == NULL) || (local_router_type ==
603 "bgpaas-server" && remote_router_type !=
"bgpaas-client") ||
604 (local_router_type !=
"bgpaas-server" && remote_router_type ==
605 "bgpaas-client") || (local_instance != remote_instance)) {
607 "localname: " << localname <<
608 ((local == NULL) ?
" Local node not present" :
609 " Local node present") <<
610 ((remote == NULL) ?
" Remote node not present" :
611 " Remote node present") <<
612 " local_router_type: " << local_router_type <<
613 " remote_router_type: " << remote_router_type <<
614 " local instance: " << local_instance <<
615 " remote instance: " << remote_instance);
620 pair->second = remote;
628 : instance_(instance),
629 data_(instance->name()) {
655 const autogen::BgpRouter *router) {
657 const autogen::BgpRouterParams ¶ms = router->parameters();
663 boost::system::error_code err;
664 IpAddress identifier = IpAddress::from_string(params.identifier, err);
680 iter !=
node->
end(graph); ++iter) {
684 const autogen::SubCluster *sc =
685 static_cast<autogen::SubCluster *
>(adj->
GetObject());
759 iter != node->
end(graph); ++iter) {
762 *target = adj->
name();
780 vector<string> *target_list) {
782 iter != node->
end(graph); ++iter) {
785 if ((strcmp(adj->
table()->
Typename(),
"instance-target") == 0) &&
787 const autogen::InstanceTarget *itarget =
788 dynamic_cast<autogen::InstanceTarget *
>(adj->
GetObject());
791 const autogen::InstanceTargetType &itt = itarget->data();
792 if (itt.import_export.empty())
793 target_list->push_back(target);
810 const string &src_instance,
IFMapNode *node,
811 vector<string> *target_list) {
812 const autogen::Connection *conn =
813 dynamic_cast<autogen::Connection *
>(node->
GetObject());
816 const autogen::ConnectionType &conn_type = conn->data();
817 if (!conn_type.destination_instance.empty() &&
818 conn_type.destination_instance != src_instance)
821 iter != node->
end(graph); ++iter) {
825 if (strcmp(adj->
table()->
Typename(),
"routing-instance") != 0)
839 const autogen::RoutingPolicyRoutingInstance *policy =
840 static_cast<autogen::RoutingPolicyRoutingInstance *
>(node->
GetObject());
841 const autogen::RoutingPolicyType &attach_info = policy->data();
843 ri_rp_link->
sequence_ = attach_info.sequence;
846 iter != node->
end(graph); ++iter) {
848 if (strcmp(adj->
table()->
Typename(),
"routing-policy") == 0) {
862 const autogen::RouteAggregate *ra =
863 static_cast<autogen::RouteAggregate *
>(node->
GetObject());
864 if (ra == NULL)
return false;
866 boost::system::error_code ec;
868 IpAddress::from_string(ra->aggregate_route_nexthop(), ec);
869 if (ec.failed())
return false;
871 BOOST_FOREACH(
const string &route, ra->aggregate_route_entries()) {
878 if (!nexthop.is_v4())
continue;
880 inet_list->push_back(aggregate);
882 if (!nexthop.is_v6())
continue;
885 if (ec.failed())
continue;
887 inet6_list->push_back(aggregate);
899 const autogen::VirtualNetwork *vn =
900 static_cast<autogen::VirtualNetwork *
>(node->
GetObject());
901 if (vn && vn->IsPropertySet(autogen::VirtualNetwork::NETWORK_ID))
902 return vn->network_id();
903 if (vn && vn->IsPropertySet(autogen::VirtualNetwork::PROPERTIES))
904 return vn->properties().network_id;
913 const autogen::VirtualNetwork *vn =
914 static_cast<autogen::VirtualNetwork *
>(node->
GetObject());
915 if (vn && vn->IsPropertySet(autogen::VirtualNetwork::PROPERTIES))
916 return vn->properties().allow_transit;
926 const autogen::VirtualNetwork *vn =
927 static_cast<autogen::VirtualNetwork *
>(node->
GetObject());
928 if (vn && vn->IsPropertySet(autogen::VirtualNetwork::PBB_EVPN_ENABLE))
929 return vn->pbb_evpn_enable();
942 const autogen::VirtualNetwork *vn =
943 static_cast<autogen::VirtualNetwork *
>(node->
GetObject());
944 if (vn && vn->IsPropertySet(autogen::VirtualNetwork::PROPERTIES)) {
945 if (vn->properties().vxlan_network_identifier) {
946 return vn->properties().vxlan_network_identifier;
948 return vn->properties().network_id;
955 const autogen::RoutingInstance *config) {
958 BOOST_FOREACH(
const autogen::StaticRouteType &route,
959 config->static_route_entries()) {
960 boost::system::error_code ec;
962 item.
nexthop = IpAddress::from_string(route.next_hop, ec);
974 std::pair<BgpInstanceConfig::StaticRouteList::iterator, bool> ret =
975 inet_list.insert(item);
978 "Duplicate static route prefix " << route.prefix <<
979 " with nexthop " << route.next_hop <<
980 " for routing instance " << rti->
name());
988 std::pair<BgpInstanceConfig::StaticRouteList::iterator, bool> ret =
989 inet6_list.insert(item);
992 "Duplicate static route prefix " << route.prefix <<
993 " with nexthop " << route.next_hop <<
994 " for routing instance " << rti->
name());
1003 const autogen::RoutingInstance *config) {
1005 const autogen::ServiceChainInfo &inet_chain =
1006 config->service_chain_information();
1007 if (config->IsPropertySet(
1008 autogen::RoutingInstance::SERVICE_CHAIN_INFORMATION)) {
1011 inet_chain.routing_instance,
1013 inet_chain.service_chain_address,
1014 inet_chain.service_instance,
1015 inet_chain.source_routing_instance,
1016 inet_chain.service_chain_id,
1018 inet_chain.retain_as_path,
1020 list.push_back(item);
1023 const autogen::ServiceChainInfo &inet6_chain =
1024 config->ipv6_service_chain_information();
1025 if (config->IsPropertySet(
1026 autogen::RoutingInstance::IPV6_SERVICE_CHAIN_INFORMATION)) {
1029 inet6_chain.routing_instance,
1031 inet6_chain.service_chain_address,
1032 inet6_chain.service_instance,
1033 inet6_chain.source_routing_instance,
1034 inet6_chain.service_chain_id,
1035 inet6_chain.sc_head,
1036 inet6_chain.retain_as_path,
1038 list.push_back(item);
1041 const autogen::ServiceChainInfo &evpn_chain =
1042 config->evpn_service_chain_information();
1043 if (config->IsPropertySet(
1044 autogen::RoutingInstance::EVPN_SERVICE_CHAIN_INFORMATION)) {
1047 evpn_chain.routing_instance,
1049 evpn_chain.service_chain_address,
1050 evpn_chain.service_instance,
1051 evpn_chain.source_routing_instance,
1052 evpn_chain.service_chain_id,
1054 evpn_chain.retain_as_path,
1056 list.push_back(item);
1059 const autogen::ServiceChainInfo &evpnv6_chain =
1060 config->evpn_ipv6_service_chain_information();
1061 if (config->IsPropertySet(
1062 autogen::RoutingInstance::EVPN_IPV6_SERVICE_CHAIN_INFORMATION)) {
1065 evpnv6_chain.routing_instance,
1066 evpnv6_chain.prefix,
1067 evpnv6_chain.service_chain_address,
1068 evpnv6_chain.service_instance,
1069 evpnv6_chain.source_routing_instance,
1070 evpnv6_chain.service_chain_id,
1071 evpnv6_chain.sc_head,
1072 evpnv6_chain.retain_as_path,
1074 list.push_back(item);
1083 const autogen::VirtualNetwork *vn_vxlan =
1084 static_cast<autogen::VirtualNetwork *
>(node->
GetObject());
1088 iter_ri != node->
end(graph); ++iter_ri) {
1090 if (strcmp(adj_ri->
table()->
Typename(),
"routing-instance") == 0) {
1091 const autogen::RoutingInstance *iri =
1092 dynamic_cast<autogen::RoutingInstance *
>(adj_ri->
GetObject());
1095 return adj_ri->
name();
1102 std::string ri_name =
"";
1104 iter_lr != node->
end(graph); ++iter_lr) {
1107 "logical-router-virtual-network") == 0) {
1109 iter_vn != adj_lr->
end(graph); ++iter_vn) {
1111 if (strcmp(adj_vn->
table()->
Typename(),
"virtual-network") == 0) {
1113 if (ri_name !=
"") {
1125 std::string ri_name =
"";
1126 const autogen::VirtualNetwork *vn =
1127 static_cast<autogen::VirtualNetwork *
>(node->
GetObject());
1132 iter_vmi != node->
end(graph); ++iter_vmi) {
1135 "virtual-machine-interface") == 0) {
1137 iter_lr != adj_vmi->
end(graph); ++iter_lr) {
1139 if (strcmp(adj_lr->
table()->
Typename(),
"logical-router") == 0) {
1141 if (ri_name !=
"") {
1158 if (ri_rp_link == NULL) {
1160 if (proxy == NULL) {
1164 if (node == NULL || delta.
obj.get() == NULL) {
1168 pair<IFMapNode *, IFMapNode *> ri_rp_pair;
1170 node, &ri_rp_pair)) {
1174 string instance_name = ri_rp_pair.first->
name();
1175 string policy_name = ri_rp_pair.second->name();
1178 config_->FindInstance(instance_name);
1180 config_->FindRoutingPolicy(policy_name);
1185 ri_rp_link =
config_->CreateRoutingPolicyLink(rti, rtp, proxy);
1188 assert(node != NULL);
1189 if (delta.
obj.get() == NULL) {
1192 config_->DeleteRoutingPolicyLink(ri_rp_link);
1194 config_->DeleteRoutingPolicy(rtp);
1205 autogen::RoutingPolicyRoutingInstance *ri_rp_link_cfg =
1206 static_cast<autogen::RoutingPolicyRoutingInstance *
>(delta.
obj.get());
1208 ri_rp_link->
Update(
this, ri_rp_link_cfg);
1220 string old_vit =
"target:" +
GetVitFromId(ntohl(old_id));
1224 string new_vit =
"target:" +
GetVitFromId(ntohl(new_id));
1244 if (identifier == 0)
1266 uint32_t bgp_identifier = 0;
1268 if (master_instance) {
1271 if (master_protocol) {
1279 if (bgp_identifier > 0)
1299 const autogen::RoutingInstance *config) {
1309 iter !=
node->
end(graph); ++iter) {
1311 if (strcmp(adj->
table()->
Typename(),
"instance-target") == 0) {
1314 const autogen::InstanceTarget *itarget =
1315 dynamic_cast<autogen::InstanceTarget *
>(adj->
GetObject());
1318 const autogen::InstanceTargetType &itt = itarget->data();
1319 if (itt.import_export ==
"import") {
1321 }
else if (itt.import_export ==
"export") {
1329 "routing-policy-routing-instance") == 0) {
1332 policy_list.push_back(policy_info);
1334 }
else if (strcmp(adj->
table()->
Typename(),
"route-aggregate") == 0) {
1336 &inet6_aggregate_list);
1337 }
else if (strcmp(adj->
table()->
Typename(),
"connection") == 0) {
1338 vector<string> target_list;
1340 BOOST_FOREACH(
string target, target_list) {
1343 }
else if (strcmp(adj->
table()->
Typename(),
"virtual-network") == 0) {
1407 Create, manager->
server(), neighbor, SandeshLevel::SYS_DEBUG,
1428 loc->second = neighbor;
1463 const string &name)
const {
1464 NeighborMap::const_iterator loc;
1475 return loc !=
neighbors_.end() ? loc->second : NULL;
1510 uint32_t new_id, uint32_t old_id,
1511 uint32_t new_as, uint32_t old_as) {
1512 assert(new_id != old_id || new_as != old_as);
1517 if (new_id != old_id)
1519 if (new_as != old_as)
1563 pair<BgpInstanceMap::iterator, bool> result2 =
1566 assert(result2.second);
1593 const string &name)
const {
1615 pair<IfmapRoutingPolicyLinkMap::iterator, bool> result =
1617 assert(result.second);
1643 const string &name) {
1644 IfmapRoutingPolicyLinkMap::iterator loc =
ri_rp_links_.find(name);
1657 IfmapRoutingPolicyLinkMap::const_iterator loc =
ri_rp_links_.find(name);
1675 pair<IfmapPeeringMap::iterator, bool> result =
1677 assert(result.second);
1680 "Creating BgpIfmapPeering " << peering->
node()->
name());
1693 "Deleting BgpIfmapPeering " << peering->
node()->
name());
1703 IfmapPeeringMap::iterator loc =
peerings_.find(name);
1715 const string &name)
const {
1716 IfmapPeeringMap::const_iterator loc =
peerings_.find(name);
1741 const string &name) {
1747 pair<IfmapRoutingPolicyMap::iterator, bool> result =
1749 assert(result.second);
1750 pair<BgpRoutingPolicyMap::iterator, bool> result2 =
1753 assert(result2.second);
1765 BgpRoutingPolicyMap::iterator loc2 =
1773 const string &name) {
1782 const string &name)
const {
1799 kConfigTaskInstanceId),
1815 const string &localname) {
1833 return config_->InstanceMapItems(start_name);
1838 return config_->RoutingPolicyMapItems(start_name);
1843 const string &instance_name)
const {
1847 return make_pair(nilMap.begin(), nilMap.end());
1857 const string &instance_name)
const {
1884 if (proxy != NULL) {
1899 if (
node() != NULL) {
1928 BOOST_FOREACH(
const autogen::PrefixMatchType &prefix_match,
1929 cfg_term.term_match_condition.prefix) {
1930 string prefix_type(prefix_match.prefix_type);
1932 prefix_type.empty() ?
"exact" : prefix_type);
1936 cfg_term.term_match_condition.community_match_all;
1937 if (!cfg_term.term_match_condition.community_list.empty()) {
1939 cfg_term.term_match_condition.community_list;
1941 if (!cfg_term.term_match_condition.community.empty()) {
1943 cfg_term.term_match_condition.community);
1946 cfg_term.term_match_condition.extcommunity_match_all;
1947 if (!cfg_term.term_match_condition.extcommunity_list.empty()) {
1949 cfg_term.term_match_condition.extcommunity_list;
1952 BOOST_FOREACH(uint32_t asn,
1953 cfg_term.term_action_list.update.as_path.expand.asn_list) {
1956 BOOST_FOREACH(
const string community,
1957 cfg_term.term_action_list.update.community.add.community) {
1960 BOOST_FOREACH(
const string community,
1961 cfg_term.term_action_list.update.community.remove.community) {
1964 BOOST_FOREACH(
const string community,
1965 cfg_term.term_action_list.update.community.set.community) {
1968 BOOST_FOREACH(
const string community,
1969 cfg_term.term_action_list.update.extcommunity.add.community) {
1972 BOOST_FOREACH(
const string community,
1973 cfg_term.term_action_list.update.extcommunity.remove.community) {
1976 BOOST_FOREACH(
const string community,
1977 cfg_term.term_action_list.update.extcommunity.set.community) {
1981 cfg_term.term_action_list.update.local_pref;
1985 if (strcmp(cfg_term.term_action_list.action.c_str(),
"reject") == 0) {
1988 strcmp(cfg_term.term_action_list.action.c_str(),
"accept") == 0) {
1994 const autogen::RoutingPolicy *policy) {
1995 vector<autogen::PolicyTermType> terms = policy->entries();
1996 BOOST_FOREACH(autogen::PolicyTermType cfg_term, terms) {
1999 policy_cfg->
add_term(policy_term_cfg);
2004 const autogen::RoutingPolicy *policy) {
2020 const string &name)
const {
2029 const string &name)
const {
2038 const string &instance_name)
const {
2044 if (proto == NULL) {
2051 const string &instance_name,
const string &name)
const {
2063 autogen::BgpRouterParams *param) {
2076 unique_ptr<autogen::BgpRouter> router(
new autogen::BgpRouter());
2077 autogen::BgpRouterParams param;
2079 router->SetProperty(
"bgp-router-parameters", ¶m);
2081 protocol->
Update(
this, router.release());
2084 vector<string> import_list;
2085 vector<string> export_list;
2088 import_list, export_list,
2092 Create,
server(), protocol,
2103 const autogen::GlobalSystemConfig *system) {
2104 bool changed =
false;
2106 if (
data_.
gr_enable() != system->graceful_restart_parameters().enable) {
2111 if (
data_.
gr_time() != system->graceful_restart_parameters().restart_time) {
2117 system->graceful_restart_parameters().long_lived_restart_time)) {
2119 system->graceful_restart_parameters().long_lived_restart_time);
2124 system->graceful_restart_parameters().end_of_rib_timeout) {
2126 system->graceful_restart_parameters().end_of_rib_timeout);
2131 system->graceful_restart_parameters().bgp_helper_enable) {
2133 system->graceful_restart_parameters().bgp_helper_enable);
2138 system->graceful_restart_parameters().xmpp_helper_enable) {
2140 system->graceful_restart_parameters().xmpp_helper_enable);
2160 system->fast_convergence_parameters().xmpp_hold_time) {
2162 system->fast_convergence_parameters().xmpp_hold_time);
2176 if (
data_.
fc_enabled() != system->fast_convergence_parameters().enable) {
2182 system->fast_convergence_parameters().nh_reachability_check) {
2184 system->fast_convergence_parameters().nh_reachability_check);
2197 const autogen::GlobalQosConfig *qos) {
2198 bool changed =
false;
2199 const autogen::ControlTrafficDscpType &dscp = qos->control_traffic_dscp();
2220 id_map_.insert(make_pair(
"routing-instance",
2223 id_map_.insert(make_pair(
"routing-policy",
2225 id_map_.insert(make_pair(
"routing-policy-routing-instance",
2228 id_map_.insert(make_pair(
"bgp-router",
2230 id_map_.insert(make_pair(
"bgp-peering",
2232 id_map_.insert(make_pair(
"global-system-config",
2235 id_map_.insert(make_pair(
"global-qos-config",
2249 vector<string> import_rt(rti->
import_list().begin(),
2251 vector<string> export_rt(rti->
export_list().begin(),
2256 import_rt, export_rt,
2261 import_rt, export_rt,
2295 string instance_name = delta.
id_name;
2299 if (proxy == NULL) {
2303 if (node == NULL || node->
IsDeleted()) {
2307 rti =
config_->LocateInstance(instance_name);
2313 if (proxy == NULL) {
2329 autogen::RoutingInstance *rti_config =
2330 static_cast<autogen::RoutingInstance *
>(delta.
obj.get());
2331 if (rti->
index() != -1)
2333 rti->
Update(
this, rti_config);
2355 if (protocol == NULL) {
2357 if (proxy == NULL) {
2361 if (delta.
obj.get() == NULL) {
2365 if (node == NULL || node->
IsDeleted()) {
2370 rti =
config_->LocateInstance(instance_name);
2380 if (delta.
obj.get() == NULL) {
2384 }
else if (delta.
obj.get() == NULL) {
2398 autogen::BgpRouter *rt_config =
2399 static_cast<autogen::BgpRouter *
>(delta.
obj.get());
2402 protocol->
Update(
this, rt_config);
2405 if (new_id != old_id || new_as != old_as) {
2406 config_->ProcessIdentifierAndASUpdate(
this, new_id, old_id, new_as,
2415 vector<string> families(
2449 string policy_name = delta.
id_name;
2453 if (proxy == NULL) {
2457 if (node == NULL || node->
IsDeleted()) {
2461 rtp =
config_->LocateRoutingPolicy(policy_name);
2467 if (proxy == NULL) {
2474 config_->DeleteRoutingPolicy(rtp);
2480 autogen::RoutingPolicy *rtp_config =
2481 static_cast<autogen::RoutingPolicy *
>(delta.
obj.get());
2482 rtp->
Update(
this, rtp_config);
2494 if (instance_name.empty() ||
2500 string name = delta.
id_name.substr(instance_name.size() + 1);
2509 BOOST_FOREACH(
const BgpIfmapConfigData::IfmapPeeringMap::value_type &value,
2539 if (peering == NULL) {
2541 if (proxy == NULL) {
2543 "ProcessBgpPeering failed. Cannot find proxy " <<
2548 if (node == NULL || delta.
obj.get() == NULL) {
2550 "ProcessBgpPeering failed. Cannot find node/obj " <<
2555 pair<IFMapNode *, IFMapNode *> routers;
2566 rti =
config_->LocateInstance(instance_name);
2569 peering =
config_->CreatePeering(rti, proxy);
2572 assert(node != NULL);
2573 if (delta.
obj.get() == NULL) {
2578 config_->DeletePeering(peering);
2595 autogen::BgpPeering *peering_config =
2596 static_cast<autogen::BgpPeering *
>(delta.
obj.get());
2597 peering->
Update(
this, peering_config);
2607 autogen::GlobalSystemConfig *
config, default_config;
2608 if (node == NULL || node->
IsDeleted() || delta.
obj.get() == NULL) {
2609 config = &default_config;
2611 config =
static_cast<autogen::GlobalSystemConfig *
>(delta.
obj.get());
2625 autogen::GlobalQosConfig *
config, default_config;
2626 if (node == NULL || node->
IsDeleted() || delta.
obj.get() == NULL) {
2627 config = &default_config;
2629 config =
static_cast<autogen::GlobalQosConfig *
>(delta.
obj.get());
2643 for (ChangeList::const_iterator iter = change_list.begin();
2644 iter != change_list.end(); ++iter) {
2645 IdentifierMap::iterator loc =
id_map_.find(iter->id_type);
2647 (loc->second)(*iter);
boost::system::error_code Ip4SubnetParse(const string &str, Ip4Address *addr, int *plen)
boost::system::error_code Inet6SubnetParse(const string &str, Ip6Address *addr, int *plen)
boost::asio::ip::address_v6 Ip6Address
boost::asio::ip::address IpAddress
boost::asio::ip::address_v4 Ip4Address
std::vector< RoutingPolicyAttachInfo > RoutingPolicyConfigList
static bool GetRoutingInstanceRoutingPolicy(DBGraph *graph, IFMapNode *node, RoutingPolicyAttachInfo *ri_rp_link)
static string GetConnectedVxlanRiLr(DBGraph *graph, IFMapNode *node)
void DefaultAddressFamilyInit()
static void SetServiceChainConfig(BgpInstanceConfig *rti, const autogen::RoutingInstance *config)
static void BuildKeyChain(BgpNeighborConfig *neighbor, const autogen::AuthenticationData &values)
static string BgpIdentifierToString(uint32_t identifier)
static bool GetInstanceTargetRouteTarget(DBGraph *graph, IFMapNode *node, string *target)
static uint32_t IpAddressToBgpIdentifier(const IpAddress &address)
static bool GetVirtualNetworkAllowTransit(DBGraph *graph, IFMapNode *node)
static string GetConnectedVxlanRi(DBGraph *graph, IFMapNode *node)
static BgpNeighborConfig::AddressFamilyList default_addr_family_list
static string GetConnectedVxlanRiVn(DBGraph *graph, IFMapNode *node)
static void BuildPolicyTermsConfig(BgpRoutingPolicyConfig *policy_cfg, const autogen::RoutingPolicy *policy)
static bool GetVirtualNetworkPbbEvpnEnable(DBGraph *graph, IFMapNode *node)
static BgpNeighborConfig * MakeBgpNeighborConfig(const BgpIfmapInstanceConfig *instance, const BgpIfmapInstanceConfig *master_instance, const string &local_name, const string &remote_name, const autogen::BgpRouter *local_router, const autogen::BgpRouter *remote_router, const autogen::BgpSession *session)
static bool CompareRoutingPolicyOrder(const RoutingPolicyAttachInfo &lhs, const RoutingPolicyAttachInfo &rhs)
static AuthenticationData::KeyType KeyChainType(const string &value)
static bool AddressFamilyIsValid(BgpNeighborConfig *neighbor, const string &family)
static string IdentifierParent(const string &identifier)
static void GetConnectionExportTargets(DBGraph *graph, IFMapNode *src_node, const string &src_instance, IFMapNode *node, vector< string > *target_list)
static void BuildPolicyTermConfig(autogen::PolicyTermType cfg_term, RoutingPolicyTermConfig *term)
static void NeighborSetSessionAttributes(BgpNeighborConfig *neighbor, const string &localname, const autogen::BgpSession *session)
MODULE_INITIALIZER(DefaultAddressFamilyInit)
static void BuildFamilyAttributesList(BgpNeighborConfig *neighbor, const BgpNeighborConfig::AddressFamilyList &family_list, const vector< string > &remote_family_list)
static void SetStaticRouteConfig(BgpInstanceConfig *rti, const autogen::RoutingInstance *config)
static bool GetRouteAggregateConfig(DBGraph *graph, IFMapNode *node, BgpInstanceConfig::AggregateRouteList *inet_list, BgpInstanceConfig::AggregateRouteList *inet6_list)
static int GetVirtualNetworkVxlanId(DBGraph *graph, IFMapNode *node)
static void GetRoutingInstanceExportTargets(DBGraph *graph, IFMapNode *node, vector< string > *target_list)
static int GetVirtualNetworkIndex(DBGraph *graph, IFMapNode *node)
#define EVPN_ES_IMPORT_ROUTE_TARGET_AS2
#define EVPN_ES_IMPORT_ROUTE_TARGET_AS4
#define BGP_CONFIG_LOG_INSTANCE(type, server, rtinstance, level, flags,...)
#define BGP_CONFIG_LOG_PEERING(type, server, peering, level, flags,...)
#define BGP_LOG_FLAG_SYSLOG
#define BGP_LOG_WARNING_STR(obj, flags, arg)
#define BGP_CONFIG_LOG_PROTOCOL(type, server, protocol, level, flags,...)
#define BGP_CONFIG_LOG_NEIGHBOR(type, server, neighbor, level, flags,...)
#define BGP_LOG_STR(obj, level, flags, arg)
void set_key_type(KeyType in_type)
void AddKeyToKeyChain(const AuthenticationKey &key)
static const int kDefaultPort
std::map< std::string, BgpNeighborConfig * > NeighborMap
void Notify(const BgpConfigObject *, EventType)
std::pair< NeighborMap::const_iterator, NeighborMap::const_iterator > NeighborMapRange
static const uint32_t kDefaultAutonomousSystem
const BgpServer * server()
static const char * kMasterInstance
std::pair< InstanceMap::const_iterator, InstanceMap::const_iterator > InstanceMapRange
std::pair< RoutingPolicyMap::const_iterator, RoutingPolicyMap::const_iterator > RoutingPolicyMapRange
uint8_t analytics_dscp() const
void set_control_dscp(uint8_t value)
uint8_t control_dscp() const
void set_analytics_dscp(uint8_t value)
bool all_tags_are_global() const
void set_xmpp_hold_time(uint8_t hold_time)
void set_all_tags_are_global(bool all_tags_are_global)
void set_end_of_rib_timeout(uint16_t time)
uint16_t bgpaas_port_start() const
uint16_t end_of_rib_timeout() const
uint16_t bgpaas_port_end() const
void set_rd_cluster_seed(uint16_t seed)
bool gr_bgp_helper() const
void set_always_compare_med(bool always_compare_med)
uint16_t rd_cluster_seed() const
uint32_t llgr_time() const
bool enable_4byte_as() const
void set_gr_time(uint16_t gr_time)
void set_fc_enabled(bool enable)
void set_llgr_time(uint64_t llgr_time)
bool always_compare_med() const
void set_gr_bgp_helper(bool helper)
void set_nh_check_enabled(bool enable)
void set_bgpaas_port_end(uint16_t bgpaas_port_end)
void set_bgpaas_port_start(uint16_t bgpaas_port_start)
uint8_t xmpp_hold_time() const
void set_gr_xmpp_helper(bool helper)
bool gr_xmpp_helper() const
bool nh_check_enabled() const
void set_gr_enable(bool enable)
void set_enable_4byte_as(bool as_4byte)
BgpIfmapInstanceConfig * FindInstance(const std::string &name)
BgpConfigManager::RoutingPolicyMapRange RoutingPolicyMapItems(const std::string &start_name=std::string()) const
IfmapPeeringMap peerings_
BgpIfmapRoutingPolicyConfig * FindRoutingPolicy(const std::string &name)
BgpConfigManager::InstanceMapRange InstanceMapItems(const std::string &start_name=std::string()) const
BgpInstanceMap instance_config_map_
void DeletePeering(BgpIfmapPeeringConfig *peer)
BgpIfmapRoutingPolicyLinkConfig * FindRoutingPolicyLink(const std::string &name)
IfmapRoutingPolicyMap routing_policies_
void DeleteInstance(BgpIfmapInstanceConfig *rti)
BgpIfmapInstanceConfig * LocateInstance(const std::string &name)
BgpIfmapPeeringConfig * CreatePeering(BgpIfmapInstanceConfig *rti, IFMapNodeProxy *proxy)
BgpIfmapRoutingPolicyLinkConfig * CreateRoutingPolicyLink(BgpIfmapInstanceConfig *rti, BgpIfmapRoutingPolicyConfig *rtp, IFMapNodeProxy *proxy)
BgpIfmapPeeringConfig * FindPeering(const std::string &name)
BgpIfmapRoutingPolicyConfig * LocateRoutingPolicy(const std::string &name)
IfmapRoutingPolicyLinkMap ri_rp_links_
BgpRoutingPolicyMap routing_policy_config_map_
IfmapInstanceMap instances_
void DeleteRoutingPolicy(BgpIfmapRoutingPolicyConfig *rtp)
void ProcessIdentifierAndASUpdate(BgpIfmapConfigManager *manager, uint32_t new_id, uint32_t old_id, uint32_t new_as, uint32_t old_as)
IfmapInstanceMap & instances()
void DeleteRoutingPolicyLink(BgpIfmapRoutingPolicyLinkConfig *ri_rp_link)
boost::scoped_ptr< BgpIfmapConfigData > config_
void ProcessBgpProtocol(const BgpConfigDelta &change)
void ProcessGlobalSystemConfig(const BgpConfigDelta &delta)
virtual NeighborMapRange NeighborMapItems(const std::string &instance_name) const
void ProcessRoutingInstance(const BgpConfigDelta &change)
virtual const BgpRoutingPolicyConfig * FindRoutingPolicy(const std::string &name) const
void ProcessBgpRouter(const BgpConfigDelta &change)
void Initialize(DB *db, DBGraph *db_graph, const std::string &localname)
BgpIfmapConfigManager(BgpServer *server)
boost::scoped_ptr< BgpConfigListener > listener_
static const int kConfigTaskInstanceId
virtual const BgpProtocolConfig * GetProtocolConfig(const std::string &instance_name) const
virtual int NeighborCount(const std::string &instance_name) const
void ProcessRoutingPolicy(const BgpConfigDelta &change)
virtual void ResetRoutingInstanceIndexBit(int index)
void ProcessRoutingPolicyLink(const BgpConfigDelta &change)
void ProcessGlobalQosConfig(const BgpConfigDelta &delta)
virtual const std::string & localname() const
virtual RoutingPolicyMapRange RoutingPolicyMapItems(const std::string &start_name=std::string()) const
virtual InstanceMapRange InstanceMapItems(const std::string &start_name=std::string()) const
void DefaultBgpRouterParams(autogen::BgpRouterParams *param)
void ProcessBgpPeering(const BgpConfigDelta &change)
const BgpIfmapConfigData * config() const
void UpdateInstanceConfig(BgpIfmapInstanceConfig *rti, BgpConfigManager::EventType event)
virtual const BgpInstanceConfig * FindInstance(const std::string &name) const
virtual const BgpNeighborConfig * FindNeighbor(const std::string &instance_name, const std::string &name) const
void ProcessChanges(const ChangeList &change_list)
std::vector< BgpConfigDelta > ChangeList
virtual ~BgpIfmapConfigManager()
bool Update(BgpIfmapConfigManager *manager, const autogen::GlobalQosConfig *qos)
BgpGlobalSystemConfig data_
bool Update(BgpIfmapConfigManager *manager, const autogen::GlobalSystemConfig *system)
std::string GetESRouteTarget(uint32_t as) const
void ProcessASUpdate(uint32_t new_as, uint32_t old_as)
const BgpNeighborConfig * FindNeighbor(const std::string &name) const
void ProcessIdentifierUpdate(uint32_t new_id, uint32_t old_id)
IFMapNodeProxy node_proxy_
const std::string & virtual_network() const
void SetNodeProxy(IFMapNodeProxy *proxy)
std::string GetVitFromId(uint32_t identifier) const
boost::scoped_ptr< BgpIfmapProtocolConfig > protocol_
void DeletePeering(BgpIfmapPeeringConfig *peering)
void set_index(int index)
BgpIfmapInstanceConfig(const std::string &name)
BgpIfmapProtocolConfig * protocol_config_mutable()
const RouteTargetList & import_list() const
const NeighborMap & neighbors() const
BgpIfmapProtocolConfig * LocateProtocol()
void DeleteNeighbor(BgpConfigManager *manager, BgpNeighborConfig *neighbor)
void AddPeering(BgpIfmapPeeringConfig *peering)
void AddRoutingPolicy(BgpIfmapRoutingPolicyConfig *rtp)
~BgpIfmapInstanceConfig()
void ChangeNeighbor(BgpConfigManager *manager, BgpNeighborConfig *neighbor)
BgpConfigManager::NeighborMapRange NeighborMapItems() const
const RouteTargetList & export_list() const
void AddNeighbor(BgpConfigManager *manager, BgpNeighborConfig *neighbor)
BgpInstanceConfig * instance_config()
bool DeleteIfEmpty(BgpConfigManager *manager)
void Update(BgpIfmapConfigManager *manager, const autogen::RoutingInstance *config)
const std::string & name() const
RouitngPolicyMap routing_policies_
void DeleteRoutingPolicy(BgpIfmapRoutingPolicyConfig *rtp)
void InsertVitAndESRTargetInImportList(BgpIfmapConfigManager *manager, BgpInstanceConfig::RouteTargetList &import_list)
int virtual_network_index() const
const BgpIfmapProtocolConfig * protocol_config() const
BgpIfmapInstanceConfig * instance_
void SetNodeProxy(IFMapNodeProxy *proxy)
const IFMapNode * node() const
void Delete(BgpIfmapConfigManager *manager)
void Update(BgpIfmapConfigManager *manager, const autogen::BgpPeering *peering)
std::map< std::string, BgpNeighborConfig * > NeighborMap
void BuildNeighbors(BgpIfmapConfigManager *manager, const autogen::BgpRouter *local_rt_config, const std::string &peername, const autogen::BgpRouter *remote_rt_config, const autogen::BgpPeering *peering, NeighborMap *map)
const autogen::BgpPeering * bgp_peering() const
BgpIfmapPeeringConfig(BgpIfmapInstanceConfig *instance)
static bool GetRouterPair(DBGraph *db_graph, const std::string &localname, IFMapNode *node, std::pair< IFMapNode *, IFMapNode * > *pair)
BgpIfmapInstanceConfig * instance()
IFMapNodeProxy node_proxy_
boost::intrusive_ptr< const autogen::BgpPeering > bgp_peering_
const autogen::BgpRouterParams & router_params() const
const autogen::BgpRouter * bgp_router() const
BgpIfmapProtocolConfig(BgpIfmapInstanceConfig *instance)
BgpIfmapInstanceConfig * instance_
const BgpProtocolConfig * protocol_config() const
IFMapNodeProxy node_proxy_
~BgpIfmapProtocolConfig()
void SetNodeProxy(IFMapNodeProxy *proxy)
void Update(BgpIfmapConfigManager *manager, const autogen::BgpRouter *router)
boost::intrusive_ptr< const autogen::BgpRouter > bgp_router_
void Delete(BgpIfmapConfigManager *manager)
const std::string & InstanceName() const
~BgpIfmapRoutingPolicyConfig()
void AddInstance(BgpIfmapInstanceConfig *rti)
void Delete(BgpConfigManager *manager)
BgpRoutingPolicyConfig * routing_policy_config()
BgpRoutingPolicyConfig data_
void SetNodeProxy(IFMapNodeProxy *proxy)
bool DeleteIfEmpty(BgpConfigManager *manager)
const std::string & name() const
void Update(BgpIfmapConfigManager *manager, const autogen::RoutingPolicy *policy)
BgpIfmapRoutingPolicyConfig(const std::string &name)
IFMapNodeProxy node_proxy_
void RemoveInstance(BgpIfmapInstanceConfig *rti)
boost::intrusive_ptr< const autogen::RoutingPolicy > routing_policy_
IFMapNodeProxy node_proxy_
BgpIfmapInstanceConfig * instance()
const IFMapNode * node() const
boost::intrusive_ptr< const autogen::RoutingPolicyRoutingInstance > ri_rp_link_
static bool GetInstancePolicyPair(DBGraph *graph, IFMapNode *node, std::pair< IFMapNode *, IFMapNode * > *pair)
void SetNodeProxy(IFMapNodeProxy *proxy)
~BgpIfmapRoutingPolicyLinkConfig()
BgpIfmapRoutingPolicyConfig * policy()
void Update(BgpIfmapConfigManager *manager, const autogen::RoutingPolicyRoutingInstance *ri_rp)
void Delete(BgpIfmapConfigManager *manager)
BgpIfmapRoutingPolicyLinkConfig(BgpIfmapInstanceConfig *rti, BgpIfmapRoutingPolicyConfig *rtp)
void set_index(int index)
void set_virtual_network_allow_transit(bool allow_transit)
std::vector< AggregateRouteConfig > AggregateRouteList
void set_import_list(const RouteTargetList &import_list)
std::set< std::string > RouteTargetList
void set_virtual_network_pbb_evpn_enable(bool pbb_evpn)
void set_virtual_network(const std::string &virtual_network)
const RouteTargetList & import_list() const
const std::string & name() const
void swap_routing_policy_list(RoutingPolicyConfigList *list)
void swap_service_chain_list(ServiceChainList *list)
void swap_static_routes(Address::Family family, StaticRouteList *list)
void add_neighbor(const std::string &neighbor)
void delete_neighbor(const std::string &neighbor)
void set_vxlan_id(int vxlan_id)
void set_has_pnf(bool has_pnf)
void set_virtual_network_index(int virtual_network_index)
void swap_aggregate_routes(Address::Family family, AggregateRouteList *list)
void set_export_list(const RouteTargetList &export_list)
void set_routing_instance_vxlan(const std::string &routing_instance_vxlan)
std::vector< ServiceChainConfig > ServiceChainList
std::set< StaticRouteConfig > StaticRouteList
AddressFamilyList GetAddressFamilies() const
const std::string & instance_name() const
std::string AuthKeyTypeToString() const
void set_peer_as(uint32_t peer_as)
const AuthenticationData & auth_data() const
uint32_t local_identifier() const
void set_keydata(const AuthenticationData &in_auth_data)
void set_hold_time(int hold_time)
std::vector< std::string > AuthKeysToString() const
void set_port(uint16_t port)
void set_router_type(const std::string &router_type)
std::string router_type() const
void set_passive(bool passive)
const std::string & name() const
std::vector< std::string > AddressFamilyList
void set_peer_address(const IpAddress &address)
std::vector< BgpFamilyAttributesConfig > FamilyAttributesList
void set_gateway_address(Address::Family family, const IpAddress &address)
void set_private_as_action(const std::string &private_as_action)
void set_local_as(uint32_t local_as)
void set_family_attributes_list(const FamilyAttributesList &family_attributes_list)
void set_instance_name(const std::string &instance_name)
void set_as_override(bool as_override)
void set_source_port(uint16_t source_port)
const IpAddress & peer_address() const
void set_loop_count(uint8_t loop_count)
void SetOriginOverride(bool origin_override, std::string origin)
const FamilyAttributesList & family_attributes_list() const
uint32_t local_as() const
void set_peer_identifier(uint32_t identifier)
void set_uuid(const std::string &uuid)
void set_local_identifier(uint32_t identifier)
void set_name(const std::string &name)
void set_admin_down(bool admin_down)
void set_hold_time(uint32_t hold_time)
void set_cluster_id(uint32_t cluster_id)
void reset_subcluster_name()
void set_subcluster_name(const std::string &name)
void reset_subcluster_id()
void set_admin_down(bool admin_down)
uint32_t autonomous_system() const
void set_autonomous_system(uint32_t autonomous_system)
void set_local_autonomous_system(uint32_t local_autonomous_system)
void set_identifier(uint32_t identifier)
void set_subcluster_id(uint32_t id)
uint32_t identifier() const
void add_term(const RoutingPolicyTermConfig &term)
adjacency_iterator end(DBGraph *graph)
adjacency_iterator begin(DBGraph *graph)
std::vector< ConfigDelta > ChangeList
void Swap(IFMapNodeProxy *rhs)
const std::string & name() const
IFMapObject * GetObject()
virtual const char * Typename() const =0
ValueType * At(int index) const
size_t Insert(const KeyType &key, ValueType *value, int index=-1)
void Remove(const KeyType &key, int index, bool clear_bit=true)
void ReserveBit(int index)
ValueType * Find(const KeyType &key) const
static void SetDscpValue(uint8_t value)
The TaskScheduler keeps track of what tasks are currently schedulable. When a task is enqueued it is ...
static const std::string integerToString(const NumberType &num)
CommunityList ext_community_set
CommunityList ext_community_add
CommunityList community_set
CommunityList community_remove
CommunityList ext_community_remove
CommunityList community_add
std::vector< std::string > default_tunnel_encap_list
std::string routing_policy_
ProtocolList protocols_match
CommunityList community_match
PrefixMatchConfigList prefixes_to_match
CommunityList ext_community_match
bool ext_community_match_all
RoutingPolicyMatchConfig match
RoutingPolicyActionConfig action
std::vector< std::string > route_targets
std::vector< std::string > communities
#define CHECK_CONCURRENCY(...)
void STLDeleteElements(Container *container)