6 #include <boost/foreach.hpp>
12 #include <vnc_cfg_types.h>
13 #include <agent_types.h>
41 if (proto ==
"TCP" || proto ==
"tcp") {
45 if (proto ==
"UDP" || proto ==
"udp") {
49 if (proto ==
"ICMP" || proto ==
"icmp") {
53 if (proto ==
"SCTP" || proto ==
"sctp") {
61 return atoi(proto.c_str());
65 if (
agent()->flow_stats_req_handler() == NULL) {
69 std::vector<autogen::FlowAgingTimeout>::const_iterator new_list_it =
70 cfg->flow_aging_timeout_list().begin();
73 while (new_list_it != cfg->flow_aging_timeout_list().end()) {
75 if (proto < 0 || proto > 0xFF) {
81 new_list_it->timeout_in_seconds);
84 new_flow_aging_timeout_map.insert(
89 FlowAgingTimeoutMap::const_iterator old_list_it =
93 old_list_it->first.port, 0);
101 if (
agent()->flow_stats_req_handler() == NULL) {
105 FlowAgingTimeoutMap::const_iterator old_list_it =
109 old_list_it->first.port, 0);
116 if (
agent()->port_config_handler() == NULL) {
121 std::vector<autogen::PortTranslationPool>::const_iterator new_list_it =
122 cfg->port_translation_pools().begin();
123 for (;new_list_it != cfg->port_translation_pools().end(); new_list_it++) {
125 if (proto < 0 || proto > 0xFF) {
130 if (proto != IPPROTO_TCP && proto != IPPROTO_UDP) {
134 uint16_t port_count = 0;
135 std::stringstream str(new_list_it->port_count);
139 if (new_list_it->port_range.start_port != 0 &&
140 new_list_it->port_range.end_port != 0) {
142 new_list_it->port_range.end_port);
143 new_protocol_port_set[proto].port_range.push_back(range);
144 }
else if (port_count != 0) {
145 new_protocol_port_set[proto].port_count = port_count;
150 int result = getrlimit(RLIMIT_NOFILE, &rl);
154 if (avail_count < 0) {
166 int total_port_count = 0;
167 ProtocolPortSet::iterator pc_list_it = new_protocol_port_set.begin();
168 for (; pc_list_it != new_protocol_port_set.end(); pc_list_it++) {
169 pc_list_it->second.Trim();
170 total_port_count += pc_list_it->second.port_count;
173 float avail_percent = 1;
174 if (total_port_count > avail_count) {
175 avail_percent = (float)avail_count / (
float)total_port_count;
178 pc_list_it = new_protocol_port_set.begin();
179 for (; pc_list_it != new_protocol_port_set.end(); pc_list_it++) {
180 pc_list_it->second.port_count *= avail_percent;
182 &(pc_list_it->second));
202 const std::string &service_name,
203 const std::string &fabric_dns_name,
204 const std::vector<Ip4Address> &fabric_ip,
205 uint16_t fabric_port)
206 : linklocal_service_name(service_name),
207 ipfabric_dns_service_name(fabric_dns_name),
208 ipfabric_service_ip(fabric_ip),
209 ipfabric_service_port(fabric_port) {
223 BOOST_FOREACH(
Ip4Address ipfabric_addr, ipfabric_service_ip) {
224 if (ipfabric_addr == ip)
243 static const uint32_t kDnsTimeout = 15 * 60 * 1000;
246 : request_count_(0), response_count_(0), global_vrouter_(vrouter),
250 timer_->Start(kDnsTimeout,
260 std::vector<Ip4Address> empty_addr_list;
262 tbb::mutex::scoped_lock lock(mutex_);
263 BOOST_FOREACH(std::string name, name_list) {
265 ResolveMap::iterator it = address_map_.find(name);
266 if (it != address_map_.end()) {
267 new_addr_map.insert(
ResolvePair(name, it->second));
268 address_map_.erase(it);
270 new_addr_map.insert(
ResolvePair(name, empty_addr_list));
273 address_map_.swap(new_addr_map);
278 tbb::mutex::scoped_lock lock(mutex_);
279 ResolveMap::iterator it = address_map_.find(name);
280 if (it != address_map_.end() && it->second.size()) {
281 int index = rand() % it->second.size();
282 *address = it->second[index];
284 *address = global_vrouter_->agent()->router_id();
293 tbb::mutex::scoped_lock lock(mutex_);
294 for (ResolveMap::const_iterator it = address_map_.begin();
295 it != address_map_.end(); ++it) {
296 ResolveName(it->first);
303 tbb::mutex::scoped_lock lock(mutex_);
304 for (ResolveMap::const_iterator it = address_map_.begin();
305 it != address_map_.end(); ++it) {
306 BOOST_FOREACH(
Ip4Address address, it->second) {
315 return request_count_ - response_count_;
319 typedef std::map<std::string, std::vector<Ip4Address> >
ResolveMap;
320 typedef std::pair<std::string, std::vector<Ip4Address> >
ResolvePair;
323 boost_udp::resolver *resolver =
new boost_udp::resolver(io_);
325 resolver->async_resolve(
326 boost_udp::resolver::query(boost_udp::v4(), name,
"domain"),
328 _1, _2, name, resolver));
334 boost_udp::resolver::iterator resolve_it,
335 std::string &name, boost_udp::resolver *resolver) {
336 std::vector<Ip4Address> old_list;
337 ResolveMap::iterator addr_it;
338 tbb::mutex::scoped_lock lock(mutex_);
339 addr_it = address_map_.find(name);
340 if (addr_it != address_map_.end()) {
341 old_list.swap(addr_it->second);
343 boost_udp::resolver::iterator end;
344 while (resolve_it != end) {
345 boost_udp::endpoint ep = *resolve_it;
346 addr_it->second.push_back(ep.address().to_v4());
350 global_vrouter_->LinkLocalRouteUpdate(addr_it->second);
362 boost::asio::io_service &
io_;
372 : global_vrouter_(vrouter), vn_id_(
DBTableBase::kInvalidId){
377 ipfabric_address_list_.clear();
378 linklocal_address_list_.clear();
382 void DeleteDBClients();
399 vn_id_ = global_vrouter_->agent()->vn_table()->Register(
405 global_vrouter_->agent()->vn_table()->Unregister(vn_id_);
409 std::set<Ip4Address>::iterator it;
410 std::pair<std::set<Ip4Address>::iterator,
bool> ret;
412 ret = ipfabric_address_list_.insert(srv);
413 if (ret.second ==
false) {
443 global_vrouter_->agent()->vn_table()->AllocWalker(
445 this, _2, key, is_add),
448 global_vrouter_->agent()->vn_table()->WalkAgain(walk_ref);
485 boost::uuids::nil_uuid(),
507 global_vrouter_->agent()->vn_table()->ReleaseWalker(ref);
521 for (std::set<IpAddress>::const_iterator it =
526 state->
vrf_->
GetName(), *it, it->is_v4() ? 32 : 128, NULL);
545 global_vrouter_->linklocal_services_map();
546 for (GlobalVrouter::LinkLocalServicesMap::const_iterator it =
547 services.begin(); it != services.end(); ++it) {
549 boost::uuids::nil_uuid(),
553 state->
Add(it->first.linklocal_service_ip);
557 it->first.linklocal_service_ip,
558 it->first.linklocal_service_ip.is_v4() ? 32 : 128,
573 (this, *(agent->event_manager()->io_service()))),
580 RegisterWalker(static_cast<AgentRouteWalker *>
628 autogen::SecurityLoggingObject *slo =
629 static_cast<autogen::SecurityLoggingObject *
>(adj_node->
631 autogen::IdPermsType id_perms = slo->id_perms();
632 CfgUuidSet(id_perms.uuid.uuid_mslong, id_perms.uuid.uuid_lslong,
642 bool resync_vn =
false;
643 bool resync_route =
false;
648 autogen::GlobalVrouterConfig *cfg =
649 static_cast<autogen::GlobalVrouterConfig *
>(node->
GetObject());
655 if (cfg->vxlan_network_identifier_mode() ==
"configured") {
660 cfg->encryption_mode());
670 if (cfg->IsPropertySet
671 (autogen::GlobalVrouterConfig::FLOW_EXPORT_RATE)) {
679 if (cfg->ecmp_hashing_include_fields().hashing_configured) {
681 ecmp_hashing_include_fields());
696 if (cfg_vxlan_network_identifier_mode !=
697 agent()->vxlan_network_identifier_mode()) {
699 (cfg_vxlan_network_identifier_mode);
721 uint16_t *service_port,
722 std::string *fabric_hostname,
724 uint16_t *fabric_port)
const {
725 std::string name = boost::to_lower_copy(service_name);
727 for (GlobalVrouter::LinkLocalServicesMap::const_iterator it =
730 if (it->second.linklocal_service_name == name) {
731 *service_ip = it->first.linklocal_service_ip;
732 *service_port = it->first.linklocal_service_port;
733 *fabric_port = it->second.ipfabric_service_port;
734 *fabric_hostname = it->second.ipfabric_dns_service_name;
735 if (it->second.ipfabric_service_ip.size()) {
737 int index = rand() % it->second.ipfabric_service_ip.size();
738 *fabric_ip = it->second.ipfabric_service_ip[index];
742 if (it->second.ipfabric_dns_service_name.empty())
743 *fabric_hostname = fabric_ip->to_string();
745 }
else if (!it->second.ipfabric_dns_service_name.empty()) {
747 it->second.ipfabric_dns_service_name, fabric_ip);
756 uint16_t service_port,
757 std::string *service_name,
759 uint16_t *fabric_port)
const {
760 LinkLocalServicesMap::const_iterator it =
769 uint16_t metadata_service_port, metadata_fabric_port;
771 &metadata_service_ip,
772 &metadata_service_port,
774 &metadata_fabric_port) &&
775 service_ip == metadata_service_ip) {
785 *service_name = it->second.linklocal_service_name;
787 != std::string::npos) {
794 *fabric_port = it->second.ipfabric_service_port;
796 if (it->second.ipfabric_service_ip.size()) {
797 int index = rand() % it->second.ipfabric_service_ip.size();
798 *fabric_ip = it->second.ipfabric_service_ip[index];
803 }
else if (!it->second.ipfabric_dns_service_name.empty()) {
805 it->second.ipfabric_dns_service_name, fabric_ip);
812 std::set<IpAddress> *service_ip
814 if (service_name.empty())
817 std::string name = boost::to_lower_copy(service_name);
818 for (GlobalVrouter::LinkLocalServicesMap::const_iterator it =
821 if (it->second.linklocal_service_name == name) {
822 service_ip->insert(it->first.linklocal_service_ip);
826 return (service_ip->size() > 0);
831 std::set<std::string> *service_names
833 LinkLocalServicesMap::const_iterator it =
837 it->first.linklocal_service_ip == service_ip) {
838 service_names->insert(it->second.linklocal_service_name);
842 return (service_names->size() > 0);
849 std::vector<std::string> dns_name_list;
851 for (std::vector<autogen::LinklocalServiceEntryType>::const_iterator it =
852 linklocal_list.begin(); it != linklocal_list.end(); it++) {
853 boost::system::error_code ec;
854 IpAddress llip = IpAddress::from_string(it->linklocal_service_ip, ec);
855 std::vector<Ip4Address> fabric_ip;
856 BOOST_FOREACH(std::string ip_fabric_ip, it->ip_fabric_service_ip) {
857 Ip4Address ip = Ip4Address::from_string(ip_fabric_ip, ec);
859 fabric_ip.push_back(ip);
861 std::string name = boost::to_lower_copy(it->linklocal_service_name);
865 fabric_ip, it->ip_fabric_service_port)));
866 if (!it->ip_fabric_DNS_service_name.empty())
867 dns_name_list.push_back(it->ip_fabric_DNS_service_name);
876 std::vector<std::string> dns_name_list;
888 LinkLocalServicesMap::iterator it_old = old_value->begin();
889 LinkLocalServicesMap::iterator it_new = new_value->begin();
890 while (it_old != old_value->end() && it_new != new_value->end()) {
891 if (it_old->first < it_new->first) {
896 }
else if (it_new->first < it_old->first) {
901 }
else if (it_new->second == it_old->second) {
915 for (; it_old != old_value->end(); ++it_old) {
921 for (; it_new != new_value->end(); ++it_new) {
931 const LinkLocalServicesMap::iterator &it) {
933 BOOST_FOREACH(
Ip4Address ip, it->second.ipfabric_service_ip) {
940 const LinkLocalServicesMap::iterator &it) {
947 const LinkLocalServicesMap::iterator &old_it,
948 const LinkLocalServicesMap::iterator &new_it) {
949 if (old_it->first.linklocal_service_ip !=
950 new_it->first.linklocal_service_ip) {
959 const std::vector<Ip4Address> &addr_list) {
966 for (LinkLocalServicesMap::const_iterator it =
969 if (it->second.IsAddressInUse(ip))
976 for (LinkLocalServicesMap::const_iterator it =
979 if (it->first.linklocal_service_ip == ip)
996 void LinkLocalServiceInfo::HandleRequest()
const {
997 LinkLocalServiceResponse *resp =
new LinkLocalServiceResponse();
998 std::vector<LinkLocalServiceData> linklocal_list;
1001 global_vrouter()->linklocal_services_map();
1003 for (GlobalVrouter::LinkLocalServicesMap::const_iterator it =
1004 services.begin(); it != services.end(); ++it) {
1005 LinkLocalServiceData service;
1006 service.linklocal_service_name = it->second.linklocal_service_name;
1007 service.linklocal_service_ip =
1008 it->first.linklocal_service_ip.to_string();
1009 service.linklocal_service_port = it->first.linklocal_service_port;
1010 service.ipfabric_dns_name = it->second.ipfabric_dns_service_name;
1011 BOOST_FOREACH(
Ip4Address ip, it->second.ipfabric_service_ip) {
1012 service.ipfabric_ip.push_back(ip.to_string());
1014 service.ipfabric_port = it->second.ipfabric_service_port;
1015 linklocal_list.push_back(service);
1018 resp->set_service_list(linklocal_list);
1019 resp->set_context(context());
1027 bool vrouter_present =
false;
1028 for (EncryptionTunnelEndpointList::const_iterator it = endpoint_list.begin();
1029 it != endpoint_list.end(); it++) {
1030 if (it->tunnel_remote_ip_address.compare(
agent()->router_id().to_string()) == 0) {
1031 vrouter_present =
true;
1035 return vrouter_present;
1043 if (!
agent()->crypt_interface())
1046 if (boost::iequals(encrypt_mode_str,
"all"))
1048 for (EncryptionTunnelEndpointList::const_iterator it = endpoint_list.begin();
1049 it != endpoint_list.end(); it++) {
1050 if (it->tunnel_remote_ip_address.compare(
agent()->router_id().to_string()) == 0) {
1066 bool change =
false;
1067 CryptTunnelsMap::iterator it_old = old_value->begin();
1068 CryptTunnelsMap::iterator it_new = new_value->begin();
1069 while (it_old != old_value->end() && it_new != new_value->end()) {
1070 if (it_old->first < it_new->first) {
1075 }
else if (it_new->first < it_old->first) {
1080 }
else if (it_new->second == it_old->second) {
1094 for (; it_old != old_value->end(); ++it_old) {
1100 for (; it_new != new_value->end(); ++it_new) {
1109 bool crypt_traffic =
false;
1111 crypt_traffic =
true;
1120 const CryptTunnelsMap::iterator &new_it) {
1135 for (uint16_t index = 0; index <
port_range.size(); index++) {
1148 for (uint16_t sub_index = 0; sub_index <
port_range.size(); sub_index++) {
1149 if (index == sub_index) {
1187 std::vector<PortRange>::iterator it =
port_range.begin();
1189 std::vector<PortRange>::iterator prev_it = it++;
1190 if (prev_it->port_end == 0 &&
1191 prev_it->port_start == 0) {
1195 port_count += (prev_it->port_end - prev_it->port_start) + 1;
std::pair< CryptTunnelKey, CryptTunnel > CryptTunnelsPair
void Delete(const std::string &remote_ip)
void LinkLocalRouteUpdate(const std::vector< Ip4Address > &addr_list)
bool VnUpdateWalk(DBEntryBase *entry, const LinkLocalServiceKey key, bool is_add)
void GlobalVrouterConfig(IFMapNode *node)
void ResolveList(const std::vector< std::string > &name_list)
std::map< LinkLocalServiceKey, LinkLocalService > LinkLocalServicesMap
void ConfigManagerEnqueue(IFMapNode *node)
static Agent * GetInstance()
LinkLocalService(const std::string &service_name, const std::string &fabric_dns_name, const std::vector< Ip4Address > &fabric_ip, uint16_t fabric_port)
static void CfgUuidSet(uint64_t ms_long, uint64_t ls_long, boost::uuids::uuid &u)
std::string ipfabric_dns_service_name
std::pair< std::string, std::vector< Ip4Address > > ResolvePair
DBState * GetState(DBTableBase *tbl_base, ListenerId listener) const
virtual ~LinkLocalRouteManager()
bool UpdateFields(const autogen::EcmpHashingIncludeFields &ecmp_hashing_fields)
void AddArpRoute(const Ip4Address &srv)
bool Resolve(const std::string &name, Ip4Address *address)
void ResolveName(const std::string &name)
boost::asio::io_service & io_
bool operator==(const LinkLocalService &rhs) const
const Interface * vhost_interface() const
std::map< std::string, std::vector< Ip4Address > > ResolveMap
std::set< Ip4Address > ipfabric_address_list_
ConfigManager * config_manager() const
void SetState(DBTableBase *tbl_base, ListenerId listener, DBState *state)
void set_vxlan_network_identifier_mode(VxLanNetworkIdentifierMode mode)
boost::asio::ip::address IpAddress
std::vector< int > SecurityGroupList
void UpdateFlowAging(autogen::GlobalVrouterConfig *cfg)
void set_global_slo_status(bool flag)
std::pair< FlowAgingTimeoutKey, uint32_t > FlowAgingTimeoutPair
const std::string & vhost_interface_name() const
VnTable * vn_table() const
adjacency_iterator end(DBGraph *graph)
const string & GetName() const
int32_t flow_export_rate_
bool IsVrouterPresentCryptTunnelConfig(const EncryptionTunnelEndpointList &endpoint_list)
bool ChangeNotifyCryptTunnels(CryptTunnelsMap *old_value, CryptTunnelsMap *new_value)
void UpdateCryptTunnelEndpointConfig(const EncryptionTunnelEndpointList &endpoint_list, const std::string encrypt_mode_str)
void ChangeCryptTunnelEndpoint(const CryptTunnelsMap::iterator &old_it, const CryptTunnelsMap::iterator &new_it)
GlobalVrouter * global_vrouter_
const EcmpLoadBalance & ecmp_load_balance() const
bool FindLinkLocalService(const std::string &service_name, IpAddress *service_ip, uint16_t *service_port, std::string *fabric_hostname, Ip4Address *fabric_ip, uint16_t *fabric_port) const
Get link local service configuration info, for a given service name.
static bool EncapPrioritySync(const std::vector< std::string > &cfg_list)
static void AddVHostRecvRoute(const Peer *peer, const string &vrf, const InterfaceKey &interface, const IpAddress &addr, uint8_t plen, const string &vn_name, bool policy, bool native_encap, bool ipam_host_route=true)
void ResolveHandler(const boost::system::error_code &error, boost_udp::resolver::iterator resolve_it, std::string &name, boost_udp::resolver *resolver)
const DBGraph * GetGraph() const
void UpdatePortConfig(autogen::GlobalVrouterConfig *cfg)
const std::string & fabric_vrf_name() const
void VnWalkDone(DBTable::DBTableWalkRef ref)
void AddGlobalVrouterNode(IFMapNode *node)
IpAddress linklocal_service_ip
boost::scoped_ptr< FabricDnsResolver > fabric_dns_resolver_
const Peer * link_local_peer() const
std::set< IpAddress > linklocal_address_list_
LinkLocalServicesMap linklocal_services_map_
void DeleteCryptTunnelEndpointConfig()
CryptTunnelsMap crypt_tunnels_map_
boost::uuids::uuid slo_uuid_
static void DeletePriorityList()
bool IsAddressInUse(const Ip4Address &ip)
ProtocolPortSet protocol_port_set_
boost::asio::ip::udp boost_udp
AgentRouteWalkerManager * agent_route_walk_manager() const
uint16_t ipfabric_service_port
bool ChangeNotify(LinkLocalServicesMap *old_value, LinkLocalServicesMap *new_value)
InetUnicastAgentRouteTable * GetInetUnicastRouteTable(const IpAddress &addr) const
Ip4Address router_id() const
uint64_t PendingFabricDnsRequests() const
std::map< uint8_t, PortConfig > ProtocolPortSet
void AddCryptTunnelEndpoint(const CryptTunnelsMap::iterator &it)
std::vector< Ip4Address > ipfabric_service_ip
const LinkLocalServicesMap & linklocal_services_map() const
static const std::string kMetadataService6
bool operator<(const LinkLocalServiceKey &rhs) const
std::vector< autogen::LinklocalServiceEntryType > LinkLocalServiceList
bool IsLinkLocalAddressInUse(const IpAddress &ip) const
LinkLocalRouteManager(GlobalVrouter *vrouter)
CryptTunnelTable * crypt_tunnel_table() const
std::set< std::string > VnListType
static void DeleteReq(const Peer *peer, const string &vrf_name, const IpAddress &addr, uint8_t plen, AgentRouteData *data)
static Timer * CreateTimer(boost::asio::io_context &service, const std::string &name, int task_id=Timer::GetTimerTaskId(), int task_instance=Timer::GetTimerInstanceId(), bool delete_on_completion=false)
void ClearState(DBTableBase *tbl_base, ListenerId listener)
void ConfigDelete(IFMapNode *node)
boost::asio::ip::address_v4 Ip4Address
Agent::ForwardingMode forwarding_mode_
IFMapObject * GetObject()
FlowAgingTimeoutMap flow_aging_timeout_map_
static void CheckAndAddArpReq(const string &vrf_name, const Ip4Address &ip, const Interface *intf, const VnListType &vn_list, const SecurityGroupList &sg, const TagList &tag)
VrfEntry * GetVrf() const
std::set< IpAddress > addresses_
std::string linklocal_service_name
static const std::string kMetadataService
void ChangeLinkLocalService(const LinkLocalServicesMap::iterator &old_it, const LinkLocalServicesMap::iterator &new_it)
std::map< CryptTunnelKey, CryptTunnel > CryptTunnelsMap
bool layer3_forwarding() const
virtual ~FabricDnsResolver()
static int ProtocolToString(const std::string proto)
bool IsAddressInUse(const Ip4Address &ip) const
uint16_t linklocal_service_port
void DeleteLinkLocalService(const LinkLocalServicesMap::iterator &it)
boost::scoped_ptr< LinkLocalRouteManager > linklocal_route_mgr_
void AddLinkLocalService(const LinkLocalServicesMap::iterator &it)
void UpdateLinkLocalServiceConfig(const LinkLocalServiceList &linklocal_list)
GlobalVrouter(Agent *agent)
Agent::ForwardingMode TranslateForwardingMode(const std::string &mode) const
std::map< FlowAgingTimeoutKey, uint32_t > FlowAgingTimeoutMap
VxLanNetworkIdentifierMode
void Delete(const IpAddress &address)
std::vector< autogen::EncryptionTunnelEndpoint > EncryptionTunnelEndpointList
DBTableBase::ListenerId vn_id_
uint64_t PendingRequests() const
void Create(const std::string &remote_ip, bool crypt)
EcmpLoadBalance ecmp_load_balance_
void ConfigAddChange(IFMapNode *node)
const string & GetName() const
void UpdateSLOConfig(IFMapNode *node)
DBTablePartBase * get_table_partition() const
PortConfigHandler & port_config_handler()
boost::intrusive_ptr< DBTableWalk > DBTableWalkRef
void GlobalVrouterConfigChanged()
AgentConfig * cfg() const
uint16_t metadata_server_port() const
const std::string & fabric_vn_name() const
void DeleteLinkLocalServiceConfig()
IFMapAgentTable * cfg_slo_table() const
bool SkipNode(IFMapNode *node)
static const uint32_t kMaxOtherOpenFds
void UpdateAllVns(const LinkLocalServiceKey &key, bool is_add)
adjacency_iterator begin(DBGraph *graph)
void Add(const IpAddress &address)
bool VnNotify(DBTablePartBase *partition, DBEntryBase *entry)
std::string CryptTunnelKey
void DeleteCryptTunnelEndpoint(const CryptTunnelsMap::iterator &it)
process::ConnectionState * connection_state() const
bool IsAddressInUse(const Ip4Address &ip) const
std::vector< PortRange > port_range
std::pair< LinkLocalServiceKey, LinkLocalService > LinkLocalServicesPair
AgentRouteWalkerPtr agent_route_resync_walker_
FlowStatsReqHandler & flow_stats_req_handler()
GlobalVrouter * global_vrouter_
FabricDnsResolver(GlobalVrouter *vrouter, boost::asio::io_service &io)
static bool DeleteTimer(Timer *Timer)
static const Ip4Address kLoopBackIp
std::vector< int > TagList
static const int32_t kDefaultFlowExportRate