13 #include <sys/types.h>
15 #include <sys/resource.h>
16 #include <net/if_arp.h>
21 #include <boost/property_tree/ini_parser.hpp>
22 #include <boost/algorithm/string.hpp>
23 #include <boost/foreach.hpp>
24 #include <boost/program_options.hpp>
25 #include <boost/thread/thread.hpp>
34 #include <sandesh/sandesh_trace.h>
41 using namespace boost::property_tree;
42 using boost::optional;
43 namespace opt = boost::program_options;
47 boost::system::error_code ec;
48 Ip4Address tmp = Ip4Address::from_string(str, ec);
49 if (ec.value() != 0) {
57 optional<string> opt_str;
58 if (opt_str = tree_.get_optional<
string>(key)) {
60 if (GetIpAddress(opt_str.get(), &addr) ==
false) {
61 LOG(ERROR,
"Error in config file <" << config_file_
62 <<
">. Error parsing IP address from <"
63 << opt_str.get() <<
">");
75 optional<string> opt_str;
77 vector<string> tokens;
78 if (opt_str = tree_.get_optional<
string>(key)) {
79 boost::split(tokens, opt_str.get(), boost::is_any_of(
" \t"));
80 if (tokens.size() > 2) {
81 LOG(ERROR,
"Error in config file <" << config_file_
82 <<
">. Cannot have more than 2 servers <"
83 << opt_str.get() <<
">");
86 vector<string>::iterator it = tokens.begin();
87 if (it != tokens.end()) {
88 if (!GetIpAddress(*it, server1)) {
92 if (it != tokens.end()) {
93 if (!GetIpAddress(*it, server2)) {
105 vector<string> tokens;
106 boost::split(tokens, addr_string, boost::is_any_of(
":"));
107 if (tokens.size() > 2) {
108 cout <<
"Error in config file <" << config_file_
109 <<
">. Improper server address <" << addr_string <<
">\n";
112 vector<string>::iterator it = tokens.begin();
113 if (!GetIpAddress(*it, server)) {
114 cout <<
"Error in config file <" << config_file_
115 <<
">. Improper server address <" << addr_string <<
">\n";
119 if (it != tokens.end()) {
130 optional<string> opt_str;
131 if (opt_str = tree_.get_optional<
string>(key)) {
132 vector<string> tokens;
133 boost::split(tokens, opt_str.get(), boost::is_any_of(
" \t"));
134 if (tokens.size() > 2) {
135 cout <<
"Error in config file <" << config_file_
136 <<
">. Cannot have more than 2 DNS servers <"
137 << opt_str.get() <<
">\n";
140 vector<string>::iterator it = tokens.begin();
141 if (it != tokens.end()) {
142 if (!ParseAddress(*it, server1, port1))
145 if (it != tokens.end()) {
146 return ParseAddress(*it, server2, port2);
154 (
const boost::program_options::variables_map &var_map,
Ip4Address &server,
157 if (var_map.count(key)) {
159 if (GetIpAddress(var_map[key].as<string>(), &addr)) {
166 (
const boost::program_options::variables_map &var_map,
Ip4Address &server1,
169 if (var_map.count(key)) {
170 vector<string> value = var_map[key].as<vector<string> >();
171 if (value.size() == 1) {
172 boost::split(value, value[0], boost::is_any_of(
" \t"));
174 if (value.size() > 2) {
175 cout <<
"Error in Arguments. Cannot have more than 2 servers for "
179 vector<string>::iterator it = value.begin();
181 if (it != value.end()) {
182 if (GetIpAddress(*it, &addr)) {
186 if (it != value.end()) {
187 if (GetIpAddress(*it, &addr)) {
197 (
const boost::program_options::variables_map &var_map,
Ip4Address *server1,
198 uint16_t *port1,
Ip4Address *server2, uint16_t *port2,
199 const std::string &key) {
201 if (var_map.count(key)) {
202 vector<string> value = var_map[key].as<vector<string> >();
203 if (value.size() == 1) {
204 boost::split(value, value[0], boost::is_any_of(
" \t"));
206 if (value.size() > 2) {
207 LOG(ERROR,
"Error in Arguments. Cannot have more than 2 servers "
211 vector<string>::iterator it = value.begin();
212 if (it != value.end()) {
213 if (!ParseAddress(*it, server1, port1))
216 if (it != value.end()) {
217 return ParseAddress(*it, server2, port2);
224 std::map<string, std::map<string, string> >
226 std::map<string, std::map<string, string> > dsmap;
227 std::map<string, std::map<string, string> >::iterator dsiter;
229 for (
size_t idx=0; idx!=dsvec.size(); idx++) {
230 size_t pos = dsvec[idx].find(
':');
231 if(pos == string::npos) {
233 "Error config-file, DerivedStats parsing: dsvec size "
234 << dsvec.size() <<
" at index " << idx <<
": " <<dsvec[idx]
238 string dsfull = dsvec[idx].substr(0,pos);
239 string dsarg = dsvec[idx].substr(pos+1, string::npos);
241 size_t dpos = dsfull.find(
'.');
242 if(dpos == string::npos) {
244 "Error config-file, DerivedStats parsing: dsvec size "
245 << dsvec.size() <<
" at index " << idx <<
": " <<dsvec[idx]
246 <<
". substr: " << dsfull <<
". BackTrace: " <<
AgentBackTrace(1));
249 string dsstruct = dsfull.substr(0,dpos);
250 string dsattr = dsfull.substr(dpos+1, string::npos);
252 dsiter = dsmap.find(dsstruct);
253 std::map<string, string> dselem;
254 if (dsiter!=dsmap.end()) dselem = dsiter->second;
255 dselem[dsattr] = dsarg;
257 dsmap[dsstruct] = dselem;
263 compute_node_address_list_.clear();
268 vector<string> tokens;
269 boost::split(tokens, val, boost::is_any_of(
" "));
270 vector<string>::iterator it = tokens.begin();
271 while (it != tokens.end()) {
272 std::string str = *it;
275 boost::algorithm::trim(str);
277 if (GetIpAddress(str, &addr)) {
278 compute_node_address_list_.push_back(addr);
280 LOG(ERROR,
"Error in parsing address " << *it);
286 std::string agent_mode = boost::to_lower_copy(mode);
287 if (agent_mode ==
"tsn")
288 agent_mode_ = TSN_AGENT;
289 else if (agent_mode ==
"tsn-no-forwarding")
290 agent_mode_ = TSN_NO_FORWARDING_AGENT;
291 else if (agent_mode ==
"tor")
292 agent_mode_ = TOR_AGENT;
294 agent_mode_ = VROUTER_AGENT;
298 std::string gateway_mode = boost::to_lower_copy(mode);
299 if (gateway_mode ==
"server")
300 gateway_mode_ = SERVER;
301 else if (gateway_mode ==
"vcpe")
302 gateway_mode_ = VCPE;
303 else if (gateway_mode ==
"pbb")
306 gateway_mode_ =
NONE;
311 const std::string qos_str =
"QUEUE";
313 std::vector<std::string> tokens;
314 std::string sep =
"[],";
315 BOOST_FOREACH(
const ptree::value_type §ion, tree_) {
316 if (section.first.compare(0, qos_str.size(), qos_str) != 0) {
320 std::string hw_queue = section.first;
321 if (sscanf(hw_queue.c_str(),
"QUEUE-%hu", &queue) != 1) {
324 BOOST_FOREACH(
const ptree::value_type &key, section.second) {
325 if (key.first.compare(
"logical_queue") == 0) {
326 input = key.second.get_value<
string>();
327 boost::split(tokens, input, boost::is_any_of(sep),
328 boost::token_compress_on);
330 for (std::vector<string>::const_iterator it = tokens.begin();
331 it != tokens.end(); it++) {
338 nic_queue_list_.insert(queue);
339 std::vector<uint16_t> range_value;
341 if (range_value.size() == 1) {
342 qos_queue_map_[range_value[0]] = queue;
346 if (range_value[0] > range_value[1]) {
350 for (uint16_t i = range_value[0]; i <= range_value[1]; i++) {
351 qos_queue_map_[i] = queue;
356 if (key.first.compare(
"default_hw_queue") == 0) {
357 bool is_default = key.second.get_value<
bool>();
359 default_nic_queue_ = queue;
364 GetValueFromTree<uint32_t>(task_monitor_timeout_msec_,
365 "TASK.task_monitor_timeout");
369 (
const boost::program_options::variables_map &var_map) {
370 slo_destination_.clear();
371 sample_destination_.clear();
372 GetOptValue< vector<string> >(var_map, slo_destination_,
373 "SESSION.slo_destination");
374 GetOptValue< vector<string> >(var_map, sample_destination_,
375 "SESSION.sample_destination");
377 std::set<string> valid_dest_values;
378 valid_dest_values.insert(
"collector");
379 valid_dest_values.insert(
"file");
380 valid_dest_values.insert(
"syslog");
381 valid_dest_values.insert(
"");
382 for (uint32_t i=0; i<slo_destination_.size(); i++) {
384 if(valid_dest_values.find(slo_destination_[i]) ==
385 valid_dest_values.end()) {
387 "Error in config file <" << config_file_
388 <<
">. Error parsing slo_destination, size "
389 << slo_destination_.size() <<
" at index " << i <<
":"
390 << slo_destination_[i]
396 for (uint32_t i=0; i<sample_destination_.size(); i++) {
398 if(valid_dest_values.find(sample_destination_[i]) ==
399 valid_dest_values.end()) {
401 "Error in config file <" << config_file_
402 <<
">. Error parsing sample_destination, size "
403 << sample_destination_.size() <<
" at index " << i <<
":"
404 << sample_destination_[i]
413 (
const boost::program_options::variables_map &var_map) {
414 collector_server_list_.clear();
415 GetOptValueIfNotDefaulted< vector<string> >(var_map, collector_server_list_,
416 "DEFAULT.collectors");
417 if (collector_server_list_.size() == 1) {
418 boost::split(collector_server_list_, collector_server_list_[0],
419 boost::is_any_of(
" "));
424 (
const boost::program_options::variables_map &var_map) {
425 controller_server_list_.clear();
426 GetOptValueIfNotDefaulted< vector<string> >(var_map, controller_server_list_,
427 "CONTROL-NODE.servers");
428 if (controller_server_list_.size() == 1) {
429 boost::split(controller_server_list_, controller_server_list_[0],
430 boost::is_any_of(
" "));
432 GetOptValue<string>(var_map, subcluster_name_,
"CONTROL-NODE.subcluster_name");
436 (
const boost::program_options::variables_map &var_map) {
437 dns_server_list_.clear();
438 GetOptValueIfNotDefaulted< vector<string> >(var_map, dns_server_list_,
440 if (dns_server_list_.size() == 1) {
441 boost::split(dns_server_list_, dns_server_list_[0],
442 boost::is_any_of(
" "));
447 (
const boost::program_options::variables_map &var_map) {
448 tsn_server_list_.clear();
449 GetOptValueIfNotDefaulted< vector<string> >(var_map, tsn_server_list_,
450 "DEFAULT.tsn_servers");
451 if (tsn_server_list_.size() == 1) {
452 boost::split(tsn_server_list_, tsn_server_list_[0],
453 boost::is_any_of(
" "));
455 std::sort(tsn_server_list_.begin(), tsn_server_list_.end());
459 (
const boost::program_options::variables_map &var_map) {
460 GetOptValueIfNotDefaulted< vector<string> >(var_map, collector_server_list_,
461 "DEFAULT.collectors");
462 vector<string> dsvec;
464 "DEFAULT.derived_stats")) {
465 derived_stats_map_ = ParseDerivedStats(dsvec);
475 vector<string> tokens;
476 boost::split(tokens, val, boost::is_any_of(
" "));
477 vector<string>::iterator it = tokens.begin();
478 while (it != tokens.end()) {
479 std::string str = *it;
482 boost::algorithm::trim(str);
485 if (str.find(
'/') != std::string::npos) {
486 boost::system::error_code ec =
488 if (ec.failed() || vhost_.plen_ >= 32) {
489 LOG(ERROR,
"Error in parsing address " << *it);
491 addr_list.push_back(addr);
492 eth_port_plen_list_.push_back(plen);
495 if (GetIpAddress(str, &addr)) {
496 addr_list.push_back(addr);
498 LOG(ERROR,
"Error in parsing address " << *it);
505 (
const boost::program_options::variables_map &var_map) {
506 boost::system::error_code ec;
508 GetOptValue<string>(var_map, vhost_.name_,
"VIRTUAL-HOST-INTERFACE.name");
510 if (GetOptValue<string>(var_map, ip,
"VIRTUAL-HOST-INTERFACE.ip")) {
512 if (ec.failed() || vhost_.plen_ >= 32) {
513 cout <<
"Error parsing vhost ip argument from <" << ip <<
">\n";
518 eth_port_list_.clear();
519 GetOptValueIfNotDefaulted< vector<string> >(var_map, eth_port_list_,
520 "VIRTUAL-HOST-INTERFACE.physical_interface");
521 if (eth_port_list_.size() == 1) {
522 boost::split(eth_port_list_, eth_port_list_[0],
523 boost::is_any_of(
" "));
526 string eth_port_addr_list;
527 if (GetOptValue<string>(var_map, eth_port_addr_list,
528 "VIRTUAL-HOST-INTERFACE.physical_interface_addr")) {
529 BuildAddrList(eth_port_addr_list, eth_port_addr_list_);
533 if (GetOptValue<string>(var_map, gateway_list,
534 "VIRTUAL-HOST-INTERFACE.gateway")) {
535 BuildAddrList(gateway_list, gateway_list_);
538 ParseIpArgument(var_map, loopback_ip_,
"VIRTUAL-HOST-INTERFACE.loopback_ip");
542 (
const boost::program_options::variables_map &var_map) {
543 GetOptValue<uint16_t>(var_map, dns_client_port_,
"DNS.dns_client_port");
544 GetOptValue<uint32_t>(var_map, dns_timeout_,
"DNS.dns_timeout");
545 GetOptValue<uint32_t>(var_map, dns_max_retries_,
"DNS.dns_max_retries");
549 (
const boost::program_options::variables_map &var_map) {
550 ParseIpArgument(var_map, mgmt_ip_,
"NETWORKS.control_network_ip");
554 (
const boost::program_options::variables_map &var_map) {
555 boost::system::error_code ec;
556 if (var_map.count(
"HYPERVISOR.type") &&
557 !var_map[
"HYPERVISOR.type"].defaulted()) {
558 if (var_map[
"HYPERVISOR.type"].as<string>() ==
"xen") {
560 GetOptValue<string>(var_map, xen_ll_.name_,
561 "HYPERVISOR.xen_ll_interface");
563 if (var_map.count(
"HYPERVISOR.xen_ll_ip")) {
564 string ip = var_map[
"HYPERVISOR.xen_ll_ip"].as<
string>();
566 if (ec.failed() || xen_ll_.plen_ >= 32) {
567 cout <<
"Error in argument <" << config_file_
568 <<
">. Error parsing Xen Link-local ip-address from <"
573 }
else if (var_map[
"HYPERVISOR.type"].as<string>() ==
"vmware") {
575 GetOptValue<string>(var_map, vmware_physical_port_,
576 "HYPERVISOR.vmware_physical_interface");
582 if (var_map.count(
"HYPERVISOR.vmware_mode") &&
583 !var_map[
"HYPERVISOR.vmware_mode"].defaulted()) {
584 cout <<
" vmware_mode is " << var_map[
"HYPERVISOR.vmware_mode"].as<
string>() << endl;
585 if (var_map[
"HYPERVISOR.vmware_mode"].as<string>() ==
"vcenter") {
586 vmware_mode_ = VCENTER;
587 }
else if (var_map[
"HYPERVISOR.vmware_mode"].as<string>() ==
589 vmware_mode_ = ESXI_NEUTRON;
591 cout <<
"Error in parsing arguement for HYPERVISOR.vmware_mode <"
592 << var_map[
"HYPERVISOR.vmware_mode"].as<
string>() << endl;
596 if (!GetValueFromTree<uint16_t>(vmi_vm_vn_uve_interval_,
597 "DEFAULT.vmi_vm_vn_uve_interval")) {
603 (
const boost::program_options::variables_map &var_map) {
605 GetOptValue<uint16_t>(var_map, flow_cache_timeout_,
606 "DEFAULT.flow_cache_timeout");
607 GetOptValue<uint32_t>(var_map, stale_interface_cleanup_timeout_,
608 "DEFAULT.stale_interface_cleanup_timeout");
609 GetOptValue<string>(var_map, host_name_,
"DEFAULT.hostname");
610 GetOptValue<string>(var_map, agent_name_,
"DEFAULT.agent_name");
611 GetOptValue<uint16_t>(var_map, http_server_port_,
612 "DEFAULT.http_server_port");
613 GetOptValue<uint16_t>(var_map, rest_port_,
614 "DEFAULT.rest_port");
615 GetOptValue<string>(var_map, log_category_,
"DEFAULT.log_category");
616 GetOptValue<string>(var_map, log_file_,
"DEFAULT.log_file");
617 GetOptValue<int>(var_map, log_files_count_,
"DEFAULT.log_files_count");
618 GetOptValue<long>(var_map, log_file_size_,
"DEFAULT.log_file_size");
619 GetOptValue<string>(var_map, log_level_,
"DEFAULT.log_level");
620 GetOptValue<string>(var_map, syslog_facility_,
"DEFAULT.syslog_facility");
622 GetOptValue<bool>(var_map, xmpp_auth_enable_,
"DEFAULT.xmpp_auth_enable");
623 GetOptValue<bool>(var_map, xmpp_dns_auth_enable_,
624 "DEFAULT.xmpp_dns_auth_enable");
625 GetOptValue<string>(var_map, xmpp_server_cert_,
"DEFAULT.xmpp_server_cert");
626 GetOptValue<string>(var_map, xmpp_server_key_,
627 "DEFAULT.xmpp_server_key");
628 GetOptValue<string>(var_map, xmpp_ca_cert_,
"DEFAULT.xmpp_ca_cert");
630 GetOptValue<bool>(var_map, subnet_hosts_resolvable_,
631 "DEFAULT.subnet_hosts_resolvable");
632 GetOptValue<uint16_t>(var_map, mirror_client_port_,
633 "DEFAULT.mirror_client_port");
634 GetOptValue<uint32_t>(var_map, pkt0_tx_buffer_count_,
635 "DEFAULT.pkt0_tx_buffers");
636 GetOptValue<bool>(var_map, measure_queue_delay_,
637 "DEFAULT.measure_queue_delay");
638 GetOptValue<string>(var_map, tunnel_type_,
639 "DEFAULT.tunnel_type");
640 GetOptValue<uint16_t>(var_map, min_aap_prefix_len_,
641 "DEFAULT.min_aap_prefix_len");
642 GetOptValue<uint16_t>(var_map, vmi_vm_vn_uve_interval_,
643 "DEFAULT.vmi_vm_vn_uve_interval");
644 GetOptValue<bool>(var_map, mvpn_ipv4_enable_,
645 "DEFAULT.mvpn_ipv4_enable");
646 float high_watermark = 0;
647 if (GetOptValue<float>(var_map, high_watermark,
"DEFAULT.vr_object_high_watermark")) {
648 vr_object_high_watermark_ = high_watermark;
653 (
const boost::program_options::variables_map &var_map) {
654 GetOptValue<uint32_t>(var_map, tbb_thread_count_,
655 "TASK.thread_count");
656 GetOptValue<uint32_t>(var_map, tbb_exec_delay_,
657 "TASK.log_exec_threshold");
658 GetOptValue<uint32_t>(var_map, tbb_schedule_delay_,
659 "TASK.log_schedule_threshold");
660 GetOptValue<uint32_t>(var_map, tbb_keepawake_timeout_,
661 "TASK.tbb_keepawake_timeout");
662 GetOptValue<uint32_t>(var_map, task_monitor_timeout_msec_,
663 "TASK.task_monitor_timeout");
664 GetOptValue<string>(var_map, ksync_thread_cpu_pin_policy_,
665 "TASK.ksync_thread_cpu_pin_policy");
666 GetOptValue<uint32_t>(var_map, flow_netlink_pin_cpuid_,
667 "TASK.flow_netlink_pin_cpuid");
671 (
const boost::program_options::variables_map &var_map) {
672 GetOptValue<string>(var_map, metadata_shared_secret_,
673 "METADATA.metadata_proxy_secret");
674 GetOptValue<uint16_t>(var_map, metadata_proxy_port_,
675 "METADATA.metadata_proxy_port");
676 GetOptValue<bool>(var_map, metadata_use_ssl_,
677 "METADATA.metadata_use_ssl");
678 GetOptValue<string>(var_map, metadata_client_cert_,
679 "METADATA.metadata_client_cert");
680 GetOptValue<string>(var_map, metadata_client_cert_type_,
681 "METADATA.metadata_client_cert_type");
682 GetOptValue<string>(var_map, metadata_client_key_,
683 "METADATA.metadata_client_key");
684 GetOptValue<string>(var_map, metadata_ca_cert_,
685 "METADATA.metadata_ca_cert");
689 (
const boost::program_options::variables_map &var_map) {
690 GetOptValue<uint16_t>(var_map, flow_thread_count_,
691 "FLOWS.thread_count");
692 GetOptValue<uint16_t>(var_map, flow_latency_limit_,
693 "FLOWS.latency_limit");
694 GetOptValue<bool>(var_map, flow_trace_enable_,
"FLOWS.trace_enable");
695 GetOptValue<uint16_t>(var_map, linklocal_system_flows_,
696 "FLOWS.max_system_linklocal_flows");
697 GetOptValue<uint16_t>(var_map, linklocal_vm_flows_,
698 "FLOWS.max_vm_linklocal_flows");
699 GetOptValue<uint16_t>(var_map, flow_index_sm_log_count_,
700 "FLOWS.index_sm_log_count");
701 GetOptValue<uint32_t>(var_map, flow_add_tokens_,
703 GetOptValue<uint32_t>(var_map, flow_ksync_tokens_,
704 "FLOWS.ksync_tokens");
705 GetOptValue<uint32_t>(var_map, flow_del_tokens_,
707 GetOptValue<uint32_t>(var_map, flow_update_tokens_,
708 "FLOWS.update_tokens");
709 GetOptValue<bool>(var_map, flow_hash_excl_rid_,
710 "FLOWS.hash_exclude_router_id");
711 GetOptValue<uint16_t>(var_map, max_sessions_per_aggregate_,
712 "FLOWS.max_sessions_per_aggregate");
713 GetOptValue<uint16_t>(var_map, max_aggregates_per_session_endpoint_,
714 "FLOWS.max_aggregates_per_session_endpoint");
715 GetOptValue<uint16_t>(var_map, max_endpoints_per_session_msg_,
716 "FLOWS.max_endpoints_per_session_msg");
717 GetOptValue<uint16_t>(var_map, fabric_snat_hash_table_size_,
718 "FLOWS.fabric_snat_hash_table_size");
722 (
const boost::program_options::variables_map &var_map) {
723 GetOptValue<bool>(var_map, dhcp_relay_mode_,
"DEFAULT.dhcp_relay_mode");
727 (
const boost::program_options::variables_map &var_map) {
728 GetOptValue<bool>(var_map, simulate_evpn_tor_,
"DEFAULT.simulate_evpn_tor");
732 (
const boost::program_options::variables_map &var_map) {
734 if (GetOptValue<string>(var_map, mode,
"DEFAULT.agent_mode")) {
735 set_agent_mode(mode);
737 if (GetOptValue<string>(var_map, mode,
"DEFAULT.gateway_mode")) {
738 set_gateway_mode(mode);
740 GetOptValue<string>(var_map, agent_base_dir_,
741 "DEFAULT.agent_base_directory");
745 (
const boost::program_options::variables_map &var_map) {
746 GetOptValue<string>(var_map, si_netns_command_,
"SERVICE-INSTANCE.netns_command");
747 GetOptValue<string>(var_map, si_docker_command_,
"SERVICE-INSTANCE.docker_command");
748 GetOptValue<int>(var_map, si_netns_workers_,
"SERVICE-INSTANCE.netns_workers");
749 GetOptValue<int>(var_map, si_netns_timeout_,
"SERVICE-INSTANCE.netns_timeout");
750 GetOptValue<string>(var_map, si_lb_ssl_cert_path_,
751 "SERVICE-INSTANCE.lb_ssl_cert_path");
752 GetOptValue<string>(var_map, si_lbaas_auth_conf_,
753 "SERVICE-INSTANCE.lbaas_auth_conf");
758 (
const boost::program_options::variables_map &var_map) {
759 GetOptValue<string>(var_map, nexthop_server_endpoint_,
760 "NEXTHOP-SERVER.endpoint");
761 GetOptValue<bool>(var_map, nexthop_server_add_pid_,
762 "NEXTHOP-SERVER.add_pid");
763 if (nexthop_server_add_pid_) {
764 std::stringstream ss;
765 ss << nexthop_server_endpoint_ <<
"." << getpid();
766 nexthop_server_endpoint_ = ss.str();
771 std::vector<std::string> &strs,
char ch) {
772 size_t pos = txt.find(ch);
773 size_t initialPos = 0;
776 while(pos != std::string::npos) {
777 strs.push_back(txt.substr(initialPos, pos - initialPos));
778 initialPos = pos + 1;
779 pos = txt.find(ch, initialPos);
781 strs.push_back(txt.substr(initialPos, std::min(pos, txt.size()) -
786 (
const boost::program_options::variables_map &var_map) {
787 if (var_map.count(
"DEFAULT.platform") &&
788 !var_map[
"DEFAULT.platform"].defaulted()) {
789 if (var_map[
"DEFAULT.platform"].as<string>() ==
"nic") {
791 }
else if (var_map[
"DEFAULT.platform"].as<string>() ==
"dpdk") {
793 if (var_map.count(
"DEFAULT.physical_interface_address")) {
794 string physical_interface_pci_addr_list;
795 physical_interface_pci_addr_list_.clear();
796 if (GetOptValue<string>(var_map, physical_interface_pci_addr_list,
797 "DEFAULT.physical_interface_address")) {
798 SplitByDelimiter(physical_interface_pci_addr_list,
799 physical_interface_pci_addr_list_,
' ');
801 string physical_interface_mac_addr_list;
802 physical_interface_mac_addr_list_.clear();
803 if (GetOptValue<string>(var_map, physical_interface_mac_addr_list,
804 "DEFAULT.physical_interface_mac")) {
805 SplitByDelimiter(physical_interface_mac_addr_list,
806 physical_interface_mac_addr_list_,
' ');
817 const boost::program_options::variables_map &var_map) {
818 GetOptValue<bool>(var_map, AgentMock_,
"DEFAULT.agent_mock");
821 GetOptValue<bool>(var_map, cat_MockDPDK_,
822 "AGENT-TEST-FRAMEWORK.mock_dpdk");
823 GetOptValue<string>(var_map, cat_kSocketDir_,
824 "AGENT-TEST-FRAMEWORK.ksocketdir");
827 if (!AgentMock_ && cat_MockDPDK_) {
828 std::cout <<
"Please fix conf file parameters."
829 <<
" The DPDK cannot be mocked unless the Agent"
830 <<
" is also executed in the Mock mode" << std::endl;
838 (
const boost::program_options::variables_map &v) {
839 GetOptValue<string>(v, bgp_as_a_service_port_range_,
840 "SERVICES.bgp_as_a_service_port_range");
841 GetOptValue<uint32_t>(v, services_queue_limit_,
"SERVICES.queue_limit");
842 GetOptValue<uint32_t>(v, bgpaas_max_shared_sessions_,
843 "SERVICES.bgpaas_max_shared_sessions");
847 (
const boost::program_options::variables_map &v) {
852 (
const boost::program_options::variables_map &v) {
853 GetOptValue<bool>(v, restart_backup_enable_,
"RESTART.backup_enable");
854 GetOptValue<uint64_t>(v, restart_backup_idle_timeout_,
855 "RESTART.backup_idle_timeout");
856 GetOptValue<string>(v, restart_backup_dir_,
"RESTART.backup_dir");
857 GetOptValue<uint16_t>(v, restart_backup_count_,
"RESTART.backup_count");
859 GetOptValue<bool>(v, restart_restore_enable_,
"RESTART.restore_enable");
860 GetOptValue<uint64_t>(v, restart_restore_audit_timeout_,
861 "RESTART.restore_audit_timeout");
862 huge_page_file_1G_.clear();
863 GetOptValueIfNotDefaulted< vector<string> >(v, huge_page_file_1G_,
864 "RESTART.huge_page_1G");
865 if (huge_page_file_1G_.size() == 1) {
866 boost::split(huge_page_file_1G_, huge_page_file_1G_[0],
867 boost::is_any_of(
" "));
869 huge_page_file_2M_.clear();
870 GetOptValueIfNotDefaulted< vector<string> >(v, huge_page_file_2M_,
871 "RESTART.huge_page_2M");
872 if (huge_page_file_2M_.size() == 1) {
873 boost::split(huge_page_file_2M_, huge_page_file_2M_[0],
874 boost::is_any_of(
" "));
879 (
const boost::program_options::variables_map &var_map) {
880 GetOptValue<uint16_t>(var_map, llgr_params_.stale_config_cleanup_time_,
881 "LLGR.stale_config_cleanup_time_");
882 GetOptValue<uint16_t>(var_map, llgr_params_.config_inactivity_time_,
883 "LLGR.config_inactivity_time");
884 GetOptValue<uint16_t>(var_map, llgr_params_.config_fallback_time_,
885 "LLGR.config_fallback_time");
886 GetOptValue<uint16_t>(var_map, llgr_params_.end_of_rib_rx_fallback_time_,
887 "LLGR.end_of_rib_rx_fallback_time");
888 GetOptValue<uint16_t>(var_map, llgr_params_.end_of_rib_tx_fallback_time_,
889 "LLGR.end_of_rib_tx_fallback_time");
890 GetOptValue<uint16_t>(var_map, llgr_params_.end_of_rib_tx_inactivity_time_,
891 "LLGR.end_of_rib_tx_inactivity_time_");
892 GetOptValue<uint32_t>(var_map, llgr_params_.llgr_stale_time_,
893 "LLGR.llgr_stale_time");
897 (
const boost::program_options::variables_map &var_map) {
898 GetOptValue<uint32_t>(var_map, mac_learning_thread_count_,
899 "MAC-LEARNING.thread_count");
900 GetOptValue<uint32_t>(var_map, mac_learning_add_tokens_,
901 "MAC-LEARNING.add_tokens");
902 GetOptValue<uint32_t>(var_map, mac_learning_delete_tokens_,
903 "MAC-LEARNING.del_tokens");
904 GetOptValue<uint32_t>(var_map, mac_learning_update_tokens_,
905 "MAC-LEARNING.update_tokens");
909 (
const boost::program_options::variables_map &var_map) {
910 GetOptValue<string>(var_map, crypt_port_,
911 "CRYPT.crypt_interface");
917 boost::system::error_code error;
918 host_name_ = boost::asio::ip::host_name(error);
919 agent_name_ = host_name_;
922 if (stat(
"/proc/xen", &fstat) == 0) {
923 hypervisor_mode_ = MODE_XEN;
924 cout <<
"Found file /proc/xen. Initializing mode to XEN\n";
926 xen_ll_.addr_ = Ip4Address::from_string(
"169.254.0.1");
935 ifstream config_file_in;
936 config_file_in.open(config_file_.c_str());
937 if (config_file_in.good()) {
938 opt::basic_parsed_options<char> ParsedOptions = opt::parse_config_file(config_file_in, config_file_options_,
true);
939 boost::program_options::store(ParsedOptions,
941 boost::program_options::notify(var_map_);
942 std::vector<boost::program_options::basic_option<char> >::iterator it;
943 for (it=ParsedOptions.options.begin() ; it < ParsedOptions.options.end(); ++it) {
944 if (it->unregistered) {
945 tree_.put(it->string_key,it->value.at(0));
949 config_file_in.close();
950 cout <<
"Config file <" << config_file_ <<
"> parsing completed.\n";
955 ParseCollectorDSArguments(var_map_);
956 ParseVirtualHostArguments(var_map_);
957 ParseControllerServersArguments(var_map_);
958 ParseDnsServersArguments(var_map_);
959 ParseDnsArguments(var_map_);
960 ParseNetworksArguments(var_map_);
961 ParseHypervisorArguments(var_map_);
962 ParseDefaultSectionArguments(var_map_);
963 ParseTaskSectionArguments(var_map_);
964 ParseFlowArguments(var_map_);
965 ParseMetadataProxyArguments(var_map_);
966 ParseDhcpRelayModeArguments(var_map_);
967 ParseServiceInstanceArguments(var_map_);
968 ParseSimulateEvpnTorArguments(var_map_);
969 ParseAgentInfoArguments(var_map_);
970 ParseNexthopServerArguments(var_map_);
971 ParsePlatformArguments(var_map_);
972 ParseServicesArguments(var_map_);
973 ParseTestFrameworkArguments(var_map_);
974 ParseSandeshArguments(var_map_);
976 ParseRestartArguments(var_map_);
977 ParseMacLearning(var_map_);
978 ParseTsnServersArguments(var_map_);
979 ParseCryptArguments(var_map_);
980 ParseSessionDestinationArguments(var_map_);
985 opt::variables_map var_map;
986 ifstream config_file_in;
987 config_file_in.open(config_file_.c_str());
988 if (config_file_in.good()) {
989 opt::basic_parsed_options<char> ParsedOptions =
990 opt::parse_config_file(config_file_in, config_file_options_,
true);
991 boost::program_options::store(ParsedOptions, var_map);
993 config_file_in.close();
994 LOG(INFO,
"Config file parsing for debug params completed. \n");
1001 opt::variables_map var_map;
1002 ifstream config_file_in;
1003 config_file_in.open(config_file_.c_str());
1004 if (config_file_in.good()) {
1005 opt::basic_parsed_options<char> ParsedOptions =
1006 opt::parse_config_file(config_file_in, config_file_options_,
true);
1007 boost::program_options::store(ParsedOptions, var_map);
1009 ParseControllerServersArguments(var_map);
1010 ParseDnsServersArguments(var_map);
1011 ParseCollectorArguments(var_map);
1012 ParseTsnServersArguments(var_map);
1013 ParseSessionDestinationArguments(var_map);
1015 LogFilteredConfig();
1017 config_file_in.close();
1018 LOG(DEBUG,
"Config file re-parsing completed. \n");
1025 bgp_as_a_service_port_range_value_)) {
1026 bgp_as_a_service_port_range_value_.clear();
1033 bgp_as_a_service_port_range_value_)) {
1034 bgp_as_a_service_port_range_value_.clear();
1037 uint16_t start = bgp_as_a_service_port_range_value_[0];
1038 uint16_t end = bgp_as_a_service_port_range_value_[1];
1040 uint16_t count = end - start + 1;
1042 bgp_as_a_service_port_range_value_[1] =
1048 int result = getrlimit(RLIMIT_NOFILE, &rl);
1051 cout <<
"Clearing BGP as a Service port range," <<
1052 "as Max fd system limit is inadequate\n";
1053 bgp_as_a_service_port_range_value_.clear();
1057 bgp_as_a_service_port_range_value_[1] =
1059 cout <<
"Updating BGP as a Service port range to " <<
1060 bgp_as_a_service_port_range_value_[0] <<
" - " <<
1061 bgp_as_a_service_port_range_value_[1] <<
"\n";
1064 cout <<
"Unable to validate BGP as a server port range configuration\n";
1069 if (vr_object_high_watermark_ > 95) {
1070 cout <<
"Max is 95 updating vrouter objects high watermark to max : 95%\n";
1071 vr_object_high_watermark_ = 95;
1073 if (vr_object_high_watermark_ < 50) {
1074 cout <<
"Wrong config updating vrouter objects high watermark to lowest : 50%\n";
1075 vr_object_high_watermark_ = 50;
1081 int result = getrlimit(RLIMIT_NOFILE, &rl);
1084 cout <<
"Updating linklocal flows configuration to 0\n";
1085 linklocal_system_flows_ = linklocal_vm_flows_ = 0;
1088 if (linklocal_system_flows_ > rl.rlim_max -
1090 linklocal_system_flows_ = rl.rlim_max -
1092 cout <<
"Updating linklocal-system-flows configuration to : " <<
1093 linklocal_system_flows_ <<
"\n";
1102 struct rlimit new_rl;
1103 new_rl.rlim_max = rl.rlim_max;
1104 new_rl.rlim_cur = linklocal_system_flows_ +
1106 result = setrlimit(RLIMIT_NOFILE, &new_rl);
1109 linklocal_system_flows_ = 0;
1111 linklocal_system_flows_ = rl.rlim_cur -
1114 cout <<
"Unable to set Max open files limit to : " <<
1116 " Updating linklocal-system-flows configuration to : " <<
1117 linklocal_system_flows_ <<
"\n";
1120 if (linklocal_vm_flows_ > linklocal_system_flows_) {
1121 linklocal_vm_flows_ = linklocal_system_flows_;
1122 cout <<
"Updating linklocal-vm-flows configuration to : " <<
1123 linklocal_vm_flows_ <<
"\n";
1126 cout <<
"Unable to validate linklocal flow configuration\n";
1131 bool *no_arp,
string *eth_encap) {
1139 int fd = socket(AF_LOCAL, SOCK_STREAM, 0);
1143 memset(&ifr, 0,
sizeof(ifr));
1144 strncpy(ifr.ifr_name, ifname.c_str(), IF_NAMESIZE-1);
1145 int err = ioctl(fd, SIOCGIFFLAGS, (
void *)&ifr);
1149 LOG(ERROR,
"Error reading interface <" << ifname <<
">. Error number "
1150 << errno <<
" : " << strerror(errno));
1154 if ((ifr.ifr_flags & IFF_NOARP)) {
1159 snprintf(fname, 128,
"/sys/class/net/%s/type", ifname.c_str());
1160 FILE *f = fopen(fname,
"r");
1163 if (fscanf(f,
"%d", &
type) >= 0) {
1164 if (
type == ARPHRD_NONE) {
1165 *eth_encap =
"none";
1180 if (vhost_.name_ ==
"") {
1181 LOG(ERROR,
"Configuration error. vhost interface name not specified");
1193 if (eth_port_list_.empty()) {
1194 LOG(ERROR,
"Configuration error. eth_port not specified");
1199 std::vector<std::string>::iterator iter;
1200 for (iter = eth_port_list_.begin(); iter != eth_port_list_.end(); iter++) {
1202 ð_port_encap_type_) ==
false) {
1207 if (crypt_port_ !=
"") {
1210 &crypt_port_encap_type_) ==
false) {
1216 if (hypervisor_mode_ == MODE_VMWARE) {
1217 if (vmware_physical_port_ ==
"") {
1218 LOG(ERROR,
"Configuration error. Physical port connecting to "
1219 "virtual-machines not specified");
1234 uint32_t mask = vhost_.plen_ ? (0xFFFFFFFF << (32 - vhost_.plen_)) : 0;
1235 vhost_.prefix_ =
Ip4Address(vhost_.addr_.to_ulong() & mask);
1237 mask = xen_ll_.plen_ ? (0xFFFFFFFF << (32 - xen_ll_.plen_)) : 0;
1238 xen_ll_.prefix_ =
Ip4Address(xen_ll_.addr_.to_ulong() & mask);
1242 return (std::find(tsn_server_list_.begin(), tsn_server_list_.end(), addr) !=
1243 tsn_server_list_.end());
1248 config_file_ = config_file;
1253 InitVhostAndXenLLPrefix();
1254 UpdateBgpAsaServicePortRangeValue();
1255 ComputeFlowAndFileLimits();
1256 ComputeVrWatermark();
1257 vgw_config_table_->InitFromConfig(tree_);
1265 DebugInitFromConfig();
1269 std::string concat_servers;
1270 std::vector<string> list = controller_server_list();
1271 std::vector<string>::iterator iter;
1272 for (iter = list.begin();
1273 iter != list.end(); iter++) {
1274 concat_servers += *iter +
" ";
1276 LOG(DEBUG,
"Xmpp Servers : " << concat_servers);
1278 concat_servers.clear();
1279 list = dns_server_list();
1280 for (iter = list.begin();
1281 iter != list.end(); iter++) {
1282 concat_servers += *iter +
" ";
1284 LOG(DEBUG,
"DNS Servers : " << concat_servers);
1286 list = tsn_server_list();
1287 concat_servers.clear();
1288 for (iter = list.begin();
1289 iter != list.end(); iter++) {
1290 concat_servers += *iter +
" ";
1292 LOG(DEBUG,
"TSN Servers : " << concat_servers);
1294 concat_servers.clear();
1295 list = collector_server_list();
1296 for (iter = list.begin();
1297 iter != list.end(); iter++) {
1298 concat_servers += *iter +
" ";
1300 LOG(DEBUG,
"COLLECTOR Servers : " << concat_servers);
1304 LOG(DEBUG,
"vhost interface name : " << vhost_.name_);
1305 LOG(DEBUG,
"vhost IP Address : " << vhost_.addr_.to_string()
1306 <<
"/" << vhost_.plen_);
1307 LOG(DEBUG,
"vhost gateway : " << vhost_.gw_.to_string());
1308 std::string eth_port_list;
1309 std::vector<std::string>::const_iterator iter;
1310 for (iter = eth_port_list_.begin(); iter != eth_port_list_.end(); iter++) {
1311 eth_port_list += *iter +
" ";
1313 LOG(DEBUG,
"Ethernet ports : " << eth_port_list);
1314 LOG(DEBUG,
"Loopback IP : " << loopback_ip_.to_string());
1316 std::string concat_servers;
1317 std::vector<string> list = controller_server_list();
1318 for (iter = list.begin();
1319 iter != list.end(); iter++) {
1320 concat_servers += *iter +
" ";
1322 LOG(DEBUG,
"Xmpp Servers : " << concat_servers);
1323 LOG(DEBUG,
"Xmpp Authentication : " << xmpp_auth_enable_);
1324 if (xmpp_auth_enable_) {
1325 LOG(DEBUG,
"Xmpp Server Certificate : " << xmpp_server_cert_);
1326 LOG(DEBUG,
"Xmpp Server Key : " << xmpp_server_key_);
1327 LOG(DEBUG,
"Xmpp CA Certificate : " << xmpp_ca_cert_);
1329 LOG(DEBUG,
"Cluster-Name : " << subcluster_name_);
1331 concat_servers.clear();
1332 list = dns_server_list();
1333 for (iter = list.begin();
1334 iter != list.end(); iter++) {
1335 concat_servers += *iter +
" ";
1337 LOG(DEBUG,
"DNS Servers : " << concat_servers);
1338 LOG(DEBUG,
"DNS client port : " << dns_client_port_);
1339 LOG(DEBUG,
"DNS timeout : " << dns_timeout_);
1340 LOG(DEBUG,
"DNS max retries : " << dns_max_retries_);
1341 LOG(DEBUG,
"Xmpp Dns Authentication : " << xmpp_dns_auth_enable_);
1342 if (xmpp_dns_auth_enable_) {
1343 LOG(DEBUG,
"Xmpp Server Certificate : " << xmpp_server_cert_);
1344 LOG(DEBUG,
"Xmpp Server Key : " << xmpp_server_key_);
1345 LOG(DEBUG,
"Xmpp CA Certificate : " << xmpp_ca_cert_);
1348 concat_servers.clear();
1349 list = tsn_server_list();
1350 for (iter = list.begin();
1351 iter != list.end(); iter++) {
1352 concat_servers += *iter +
" ";
1354 LOG(DEBUG,
"TSN Servers : " << concat_servers);
1355 concat_servers.clear();
1357 list = collector_server_list();
1358 for (iter = list.begin();
1359 iter != list.end(); iter++) {
1360 concat_servers += *iter +
" ";
1362 LOG(DEBUG,
"COLLECTOR Servers : " << concat_servers);
1364 LOG(DEBUG,
"Tunnel-Type : " << tunnel_type_);
1365 LOG(DEBUG,
"Metadata-Proxy Shared Secret: " << metadata_shared_secret_);
1366 LOG(DEBUG,
"Metadata-Proxy Port : " << metadata_proxy_port_);
1367 LOG(DEBUG,
"Metadata-Proxy SSL Flag : " << metadata_use_ssl_);
1368 if (metadata_use_ssl_) {
1369 LOG(DEBUG,
"Metadata Client Certificate : " << metadata_client_cert_);
1370 LOG(DEBUG,
"Metadata Client Certificate Type: "
1371 << metadata_client_cert_type_);
1372 LOG(DEBUG,
"Metadata Client Key : " << metadata_client_key_);
1373 LOG(DEBUG,
"Metadata CA Certificate : " << metadata_ca_cert_);
1376 LOG(DEBUG,
"Linklocal Max System Flows : " << linklocal_system_flows_);
1377 LOG(DEBUG,
"Linklocal Max Vm Flows : " << linklocal_vm_flows_);
1378 LOG(DEBUG,
"Flow cache timeout : " << flow_cache_timeout_);
1379 LOG(DEBUG,
"Stale Interface cleanup timeout : "
1380 << stale_interface_cleanup_timeout_);
1381 LOG(DEBUG,
"Flow thread count : " << flow_thread_count_);
1382 LOG(DEBUG,
"Flow latency limit : " << flow_latency_limit_);
1383 LOG(DEBUG,
"Flow index-mgr sm log count : " << flow_index_sm_log_count_);
1384 LOG(DEBUG,
"Flow add-tokens : " << flow_add_tokens_);
1385 LOG(DEBUG,
"Flow ksync-tokens : " << flow_ksync_tokens_);
1386 LOG(DEBUG,
"Flow del-tokens : " << flow_del_tokens_);
1387 LOG(DEBUG,
"Flow update-tokens : " << flow_update_tokens_);
1388 LOG(DEBUG,
"Pin flow netlink task to CPU: "
1389 << ksync_thread_cpu_pin_policy_);
1390 LOG(DEBUG,
"Maximum sessions : " << max_sessions_per_aggregate_);
1391 LOG(DEBUG,
"Maximum session aggregates : " << max_aggregates_per_session_endpoint_);
1392 LOG(DEBUG,
"Maximum session endpoints : " << max_endpoints_per_session_msg_);
1393 LOG(DEBUG,
"Fabric SNAT hash table size : " << fabric_snat_hash_table_size_);
1394 LOG(DEBUG,
"Flow excluding Router ID in hash :" << flow_hash_excl_rid_);
1396 if (agent_mode_ == VROUTER_AGENT)
1397 LOG(DEBUG,
"Agent Mode : Vrouter");
1398 else if (agent_mode_ == TSN_AGENT)
1399 LOG(DEBUG,
"Agent Mode : TSN");
1400 else if (agent_mode_ == TOR_AGENT)
1401 LOG(DEBUG,
"Agent Mode : TOR");
1403 if (gateway_mode_ == SERVER)
1404 LOG(DEBUG,
"Gateway Mode : Server");
1405 else if (gateway_mode_ == VCPE)
1406 LOG(DEBUG,
"Gateway Mode : vCPE");
1407 else if (gateway_mode_ == PBB)
1408 LOG(DEBUG,
"Gateway Mode : PBB node");
1409 else if (gateway_mode_ ==
NONE)
1410 LOG(DEBUG,
"Gateway Mode : None");
1412 LOG(DEBUG,
"DHCP Relay Mode : " << dhcp_relay_mode_);
1413 if (simulate_evpn_tor_) {
1414 LOG(DEBUG,
"Simulate EVPN TOR : " << simulate_evpn_tor_);
1416 LOG(DEBUG,
"Service instance netns cmd : " << si_netns_command_);
1417 LOG(DEBUG,
"Service instance docker cmd : " << si_docker_command_);
1418 LOG(DEBUG,
"Service instance workers : " << si_netns_workers_);
1419 LOG(DEBUG,
"Service instance timeout : " << si_netns_timeout_);
1420 LOG(DEBUG,
"Service instance lb ssl : " << si_lb_ssl_cert_path_);
1421 LOG(DEBUG,
"Service instance lbaas auth : " << si_lbaas_auth_conf_);
1422 LOG(DEBUG,
"Bgp as a service port range : " << bgp_as_a_service_port_range_);
1423 LOG(DEBUG,
"Services queue limit : " << services_queue_limit_);
1424 LOG(DEBUG,
"BGPAAS max shared sessions for service port : " << bgpaas_max_shared_sessions_);
1426 LOG(DEBUG,
"Sandesh Key file : " << sandesh_config_.keyfile);
1427 LOG(DEBUG,
"Sandesh Cert file : " << sandesh_config_.certfile);
1428 LOG(DEBUG,
"Sandesh CA Cert : " << sandesh_config_.ca_cert);
1429 LOG(DEBUG,
"Sandesh SSL Enable : "
1430 << sandesh_config_.sandesh_ssl_enable);
1431 LOG(DEBUG,
"Introspect SSL Enable : "
1432 << sandesh_config_.introspect_ssl_enable);
1434 if (hypervisor_mode_ == MODE_KVM) {
1435 LOG(DEBUG,
"Hypervisor mode : kvm");
1439 if (hypervisor_mode_ == MODE_XEN) {
1440 LOG(DEBUG,
"Hypervisor mode : xen");
1441 LOG(DEBUG,
"XEN Link Local port : " << xen_ll_.name_);
1442 LOG(DEBUG,
"XEN Link Local IP Address : " << xen_ll_.addr_.to_string()
1443 <<
"/" << xen_ll_.plen_);
1446 if (hypervisor_mode_ == MODE_VMWARE) {
1447 LOG(DEBUG,
"Hypervisor mode : vmware");
1448 LOG(DEBUG,
"Vmware port : " << vmware_physical_port_);
1449 if (vmware_mode_ == VCENTER) {
1450 LOG(DEBUG,
"Vmware mode : Vcenter");
1452 LOG(DEBUG,
"Vmware mode : Esxi_Neutron");
1455 LOG(DEBUG,
"Nexthop server endpoint : " << nexthop_server_endpoint_);
1456 LOG(DEBUG,
"Agent base directory : " << agent_base_dir_);
1457 LOG(DEBUG,
"Vrouter objects high watermark : " << vr_object_high_watermark_);
1461 LOG(DEBUG,
"Ethernet Port Encap Type : " << eth_port_encap_type_);
1462 if (eth_port_no_arp_) {
1463 LOG(DEBUG,
"Ethernet Port No-ARP : " <<
"TRUE");
1466 if (platform_ == VROUTER_ON_NIC) {
1467 LOG(DEBUG,
"Platform mode : Vrouter on NIC");
1468 }
else if (platform_ == VROUTER_ON_HOST_DPDK) {
1469 LOG(DEBUG,
"Platform mode : Vrouter on DPDK");
1472 LOG(DEBUG,
"Platform mode : Vrouter on host linux kernel ");
1481 (
const boost::program_options::options_description &opt) {
1486 (
const boost::program_options::options_description &opt) {
1487 config_file_options_.add(opt);
1491 boost::program_options::store(opt::parse_command_line(argc, argv, options_),
1493 boost::program_options::notify(var_map_);
1497 bool enable_vhost_options,
1498 bool enable_hypervisor_options,
1499 bool enable_service_options,
1501 enable_flow_options_(enable_flow_options),
1502 enable_vhost_options_(enable_vhost_options),
1503 enable_hypervisor_options_(enable_hypervisor_options),
1504 enable_service_options_(enable_service_options),
1505 agent_mode_(agent_mode), gateway_mode_(
NONE), vhost_(),
1506 pkt0_tx_buffer_count_(
Agent::kPkt0TxBufferCount),
1507 measure_queue_delay_(false),
1509 eth_port_no_arp_(false), eth_port_encap_type_(),
1510 crypt_port_(), crypt_port_no_arp_(true), crypt_port_encap_type_(),
1512 dns_client_port_(0), dns_timeout_(3000),
1513 dns_max_retries_(2), mirror_client_port_(0),
1514 mgmt_ip_(), hypervisor_mode_(MODE_KVM),
1515 xen_ll_(), tunnel_type_(), metadata_shared_secret_(),
1516 metadata_proxy_port_(0), metadata_use_ssl_(false),
1517 metadata_client_cert_(
""), metadata_client_cert_type_(
"PEM"),
1518 metadata_client_key_(
""), metadata_ca_cert_(
""),
1519 linklocal_system_flows_(), linklocal_vm_flows_(),
1520 flow_cache_timeout_(), flow_index_sm_log_count_(),
1521 flow_add_tokens_(
Agent::kFlowAddTokens),
1522 flow_ksync_tokens_(
Agent::kFlowKSyncTokens),
1523 flow_del_tokens_(
Agent::kFlowDelTokens),
1524 flow_update_tokens_(
Agent::kFlowUpdateTokens),
1525 flow_netlink_pin_cpuid_(0),
1526 stale_interface_cleanup_timeout_
1527 (
Agent::kDefaultStaleInterfaceCleanupTimeout),
1528 config_file_(), program_name_(),
1531 log_local_(false), log_flow_(false), log_level_(),
1533 http_server_port_(), rest_port_(), host_name_(),
1534 agent_stats_interval_(kAgentStatsInterval),
1535 flow_stats_interval_(kFlowStatsInterval),
1536 vrouter_stats_interval_(kVrouterStatsInterval),
1537 vmware_physical_port_(
""), test_mode_(false), tree_(),
1539 dhcp_relay_mode_(false), xmpp_auth_enable_(false),
1540 xmpp_server_cert_(
""), xmpp_server_key_(
""), xmpp_ca_cert_(
""),
1541 xmpp_dns_auth_enable_(false),
1542 simulate_evpn_tor_(false), si_netns_command_(),
1543 si_docker_command_(), si_netns_workers_(0),
1544 si_netns_timeout_(0), si_lb_ssl_cert_path_(), si_lbaas_auth_conf_(),
1545 vmware_mode_(ESXI_NEUTRON), nexthop_server_endpoint_(),
1546 nexthop_server_add_pid_(0),
1547 vrouter_on_nic_mode_(false),
1548 exception_packet_interface_(
""),
1549 platform_(VROUTER_ON_HOST),
1551 flow_thread_count_(
Agent::kDefaultFlowThreadCount),
1552 flow_trace_enable_(true),
1553 flow_hash_excl_rid_(false),
1554 flow_latency_limit_(
Agent::kDefaultFlowLatencyLimit),
1555 max_sessions_per_aggregate_(
Agent::kMaxSessions),
1556 max_aggregates_per_session_endpoint_(
Agent::kMaxSessionAggs),
1557 max_endpoints_per_session_msg_(
Agent::kMaxSessionEndpoints),
1558 subnet_hosts_resolvable_(true),
1559 bgp_as_a_service_port_range_(
"50000-50512"),
1560 services_queue_limit_(1024),
1561 bgpaas_max_shared_sessions_(4),
1563 restart_backup_enable_(false),
1567 restart_restore_enable_(true),
1569 huge_page_file_1G_(),
1570 huge_page_file_2M_(),
1571 ksync_thread_cpu_pin_policy_(),
1572 tbb_thread_count_(
Agent::kMaxTbbThreads),
1574 tbb_schedule_delay_(0),
1575 tbb_keepawake_timeout_(
Agent::kDefaultTbbKeepawakeTimeout),
1576 task_monitor_timeout_msec_(
Agent::kDefaultTaskMonitorTimeout),
1577 qos_priority_tagging_(true),
1578 default_nic_queue_(
Agent::kInvalidQueueId),
1580 mac_learning_thread_count_(
Agent::kDefaultFlowThreadCount),
1581 mac_learning_add_tokens_(
Agent::kMacLearningDefaultTokens),
1582 mac_learning_update_tokens_(
Agent::kMacLearningDefaultTokens),
1583 mac_learning_delete_tokens_(
Agent::kMacLearningDefaultTokens),
1584 min_aap_prefix_len_(
Agent::kMinAapPrefixLen),
1585 vmi_vm_vn_uve_interval_(
Agent::kDefaultVmiVmVnUveInterval),
1586 fabric_snat_hash_table_size_(
Agent::kFabricSnatTableSize),
1587 mvpn_ipv4_enable_(false),AgentMock_(false), cat_MockDPDK_(false),
1588 cat_kSocketDir_(
"/tmp/"),
1589 vr_object_high_watermark_(
Agent::kDefaultHighWatermark),
1607 boost::program_options::options_description
generic(
"Generic options");
1608 generic.add_options()
1609 (
"help",
"help message")
1612 "Configuration file")
1613 (
"version",
"Display version information")
1615 opt::options_description debug(
"Debug options");
1617 (
"TRACEBUFFSIZE.AgentDBwalkTrace",opt::value<uint32_t>(),
1618 "AgentDBwalkTrace trace buffer size")
1619 (
"TRACEBUFFSIZE.BgpAsAService",opt::value<uint32_t>(),
1620 "BgpAsAService trace buffer size")
1621 (
"TRACEBUFFSIZE.CryptTunnel",opt::value<uint32_t>(),
1622 "CryptTunnel trace buffer size")
1623 (
"TRACEBUFFSIZE.HealthCheck",opt::value<uint32_t>(),
1624 "HealthCheck trace buffer size")
1625 (
"TRACEBUFFSIZE.MplsTrace",opt::value<uint32_t>(),
1626 "MplsTrace trace buffer size")
1627 (
"TRACEBUFFSIZE.Multicast",opt::value<uint32_t>(),
1628 "Multicast trace buffer size")
1629 (
"TRACEBUFFSIZE.InstanceManager",opt::value<uint32_t>(),
1630 "InstanceManager trace buffer size")
1631 (
"TRACEBUFFSIZE.OperIfmap",opt::value<uint32_t>(),
1632 "OperIfmap trace buffer size")
1633 (
"TRACEBUFFSIZE.PathPreference",opt::value<uint32_t>(),
1634 "PathPreference trace buffer size")
1635 (
"TRACEBUFFSIZE.MulticastPolicy",opt::value<uint32_t>(),
1636 "MulticastPolicy trace buffer size")
1637 (
"TRACEBUFFSIZE.TaskTrace",opt::value<uint32_t>(),
1638 "TaskTrace trace buffer size")
1639 (
"TRACEBUFFSIZE.InterfaceMplsData",opt::value<uint32_t>(),
1640 "InterfaceMplsData trace buffer size")
1641 (
"TRACEBUFFSIZE.VrfMplsData",opt::value<uint32_t>(),
1642 "VrfMplsData trace buffer size")
1643 (
"TRACEBUFFSIZE.VlanMplsData",opt::value<uint32_t>(),
1644 "VlanMplsData trace buffer size")
1645 (
"TRACEBUFFSIZE.RouteMplsData",opt::value<uint32_t>(),
1646 "RouteMplsData trace buffer size")
1647 (
"TRACEBUFFSIZE.VersionTrace",opt::value<uint32_t>(),
1648 "VersionTrace trace buffer size")
1649 (
"TRACEBUFFSIZE.DnsBind",opt::value<uint32_t>(),
1650 "DnsBind trace buffer size")
1651 (
"TRACEBUFFSIZE.IFMapAgentTrace",opt::value<uint32_t>(),
1652 "IFMapAgentTrace trace buffer size")
1653 (
"TRACEBUFFSIZE.IOTraceBuf",opt::value<uint32_t>(),
1654 "IOTraceBuf trace buffer size")
1655 (
"TRACEBUFFSIZE.XmppMessageTrace",opt::value<uint32_t>(),
1656 "XmppMessageTrace trace buffer size")
1657 (
"TRACEBUFFSIZE.XmppTrace",opt::value<uint32_t>(),
1658 "XmppTrace trace buffer size")
1659 (
"TRACEBUFFSIZE.Config",opt::value<uint32_t>(),
1660 "Config trace buffer size")
1661 (
"TRACEBUFFSIZE.ControllerConnections",opt::value<uint32_t>(),
1662 "ControllerConnections trace buffer size")
1663 (
"TRACEBUFFSIZE.ControllerInfo",opt::value<uint32_t>(),
1664 "ControllerInfo trace buffer size")
1665 (
"TRACEBUFFSIZE.ControllerTxConfig_1",opt::value<uint32_t>(),
1666 "ControllerTxConfig_1 trace buffer size")
1667 (
"TRACEBUFFSIZE.ControllerTxConfig_2",opt::value<uint32_t>(),
1668 "ControllerTxConfig_2 trace buffer size")
1669 (
"TRACEBUFFSIZE.ControllerRouteWalker",opt::value<uint32_t>(),
1670 "ControllerRouteWalker trace buffer size")
1671 (
"TRACEBUFFSIZE.Controller",opt::value<uint32_t>(),
1672 "Controller trace buffer size")
1673 (
"TRACEBUFFSIZE.ControllerRxRouteXmppMessage1",opt::value<uint32_t>(),
1674 "ControllerRxRouteXmppMessage1 trace buffer size")
1675 (
"TRACEBUFFSIZE.ControllerRxConfigXmppMessage1",opt::value<uint32_t>(),
1676 "ControllerRxConfigXmppMessage1 trace buffer size")
1677 (
"TRACEBUFFSIZE.ControllerRxRouteXmppMessage2",opt::value<uint32_t>(),
1678 "ControllerRxRouteXmppMessage2 trace buffer size")
1679 (
"TRACEBUFFSIZE.ControllerRxConfigXmppMessage2",opt::value<uint32_t>(),
1680 "ControllerRxConfigXmppMessage2 trace buffer size")
1681 (
"TRACEBUFFSIZE.ControllerTxXmppMessage_1",opt::value<uint32_t>(),
1682 "ControllerTxXmppMessage_1 trace buffer size")
1683 (
"TRACEBUFFSIZE.ControllerTxXmppMessage_2",opt::value<uint32_t>(),
1684 "ControllerTxXmppMessage_2 trace buffer size")
1685 (
"TRACEBUFFSIZE.Acl",opt::value<uint32_t>(),
1686 "Acl trace buffer size")
1687 (
"TRACEBUFFSIZE.VnswIfTrace",opt::value<uint32_t>(),
1688 "VnswIfTrace trace buffer size")
1689 (
"TRACEBUFFSIZE.Flow",opt::value<uint32_t>(),
1690 "Flow trace buffer size")
1691 (
"TRACEBUFFSIZE.Packet",opt::value<uint32_t>(),
1692 "Packet trace buffer size")
1693 (
"TRACEBUFFSIZE.FlowHandler",opt::value<uint32_t>(),
1694 "FlowHandler trace buffer size")
1695 (
"TRACEBUFFSIZE.ProuterUve",opt::value<uint32_t>(),
1696 "ProuterUve trace buffer size")
1697 (
"TRACEBUFFSIZE.SessionStats",opt::value<uint32_t>(),
1698 "SessionStats trace buffer size")
1699 (
"TRACEBUFFSIZE.FlowExportStats",opt::value<uint32_t>(),
1700 "FlowExportStats trace buffer size")
1701 (
"TRACEBUFFSIZE.Dhcp",opt::value<uint32_t>(),
1702 "Dhcp trace buffer size")
1703 (
"TRACEBUFFSIZE.Dhcpv6",opt::value<uint32_t>(),
1704 "Dhcpv6 trace buffer size")
1705 (
"TRACEBUFFSIZE.Icmpv6",opt::value<uint32_t>(),
1706 "Icmpv6 trace buffer size")
1707 (
"TRACEBUFFSIZE.Arp",opt::value<uint32_t>(),
1708 "Arp trace buffer size")
1709 (
"TRACEBUFFSIZE.Metadata",opt::value<uint32_t>(),
1710 "Metadata trace buffer size")
1711 (
"TRACEBUFFSIZE.Bfd",opt::value<uint32_t>(),
1712 "Bfd trace buffer size")
1713 (
"TRACEBUFFSIZE.Igmp",opt::value<uint32_t>(),
1714 "Igmp trace buffer size")
1715 (
"TRACEBUFFSIZE.KSync Error",opt::value<uint32_t>(),
1716 "KSync Error trace buffer size")
1717 (
"TRACEBUFFSIZE.MacLearning",opt::value<uint32_t>(),
1718 "MacLearning trace buffer size")
1719 (
"TRACEBUFFSIZE.Xmpp",opt::value<uint32_t>(),
1720 "Xmpp trace buffer size")
1721 (
"TRACEBUFFSIZE.KSync Interface",opt::value<uint32_t>(),
1722 "KSync Interface trace buffer size")
1723 (
"TRACEBUFFSIZE.KSync Mpls",opt::value<uint32_t>(),
1724 "KSync Mpls trace buffer size")
1725 (
"TRACEBUFFSIZE.KSync Nexthop",opt::value<uint32_t>(),
1726 "KSync Nexthop trace buffer size")
1727 (
"TRACEBUFFSIZE.KSync Mirror",opt::value<uint32_t>(),
1728 "KSync Mirror trace buffer size")
1729 (
"TRACEBUFFSIZE.KSync VxLan",opt::value<uint32_t>(),
1730 "KSync VxLan trace buffer size")
1731 (
"TRACEBUFFSIZE.KSync VrfAssign",opt::value<uint32_t>(),
1732 "KSync VrfAssign trace buffer size")
1733 (
"TRACEBUFFSIZE.KSync Qos Queue Object",opt::value<uint32_t>(),
1734 "KSync Qos Queue Object trace buffer size")
1735 (
"TRACEBUFFSIZE.KSync Forwarding class object",opt::value<uint32_t>(),
1736 "KSync Forwarding class object trace buffer size")
1737 (
"TRACEBUFFSIZE.KSync Qos Config class object",opt::value<uint32_t>(),
1738 "KSync Qos Config class object trace buffer size")
1739 (
"TRACEBUFFSIZE.KSync BridgeRouteTable",opt::value<uint32_t>(),
1740 "KSync BridgeRouteTable trace buffer size")
1741 (
"TRACEBUFFSIZE.KSync FlowTable",opt::value<uint32_t>(),
1742 "KSync FlowTable trace buffer size")
1743 (
"TRACEBUFFSIZE.Oper db.interface.0",opt::value<uint32_t>(),
1744 "Oper db.interface.0 trace buffer size")
1745 (
"TRACEBUFFSIZE.Oper db.healthcheck.0",opt::value<uint32_t>(),
1746 "Oper db.healthcheck.0 trace buffer size")
1747 (
"TRACEBUFFSIZE.Oper db.crypttunnel.0",opt::value<uint32_t>(),
1748 "Oper db.crypttunnel.0 trace buffer size")
1749 (
"TRACEBUFFSIZE.Oper db.nexthop.0",opt::value<uint32_t>(),
1750 "Oper db.nexthop.0 trace buffer size")
1751 (
"TRACEBUFFSIZE.Oper db.vrf.0",opt::value<uint32_t>(),
1752 "Oper db.vrf.0 trace buffer size")
1753 (
"TRACEBUFFSIZE.Oper db.vm.0",opt::value<uint32_t>(),
1754 "Oper db.vm.0 trace buffer size")
1755 (
"TRACEBUFFSIZE.Oper db.sg.0",opt::value<uint32_t>(),
1756 "Oper db.sg.0 trace buffer size")
1757 (
"TRACEBUFFSIZE.Oper db.tag.0",opt::value<uint32_t>(),
1758 "Oper db.tag.0 trace buffer size")
1759 (
"TRACEBUFFSIZE.Oper db.vn.0",opt::value<uint32_t>(),
1760 "Oper db.vn.0 trace buffer size")
1761 (
"TRACEBUFFSIZE.Oper db.mpls.0",opt::value<uint32_t>(),
1762 "Oper db.mpls.0 trace buffer size")
1763 (
"TRACEBUFFSIZE.Oper db.acl.0",opt::value<uint32_t>(),
1764 "Oper db.acl.0 trace buffer size")
1765 (
"TRACEBUFFSIZE.Oper db.mirror_table.0",opt::value<uint32_t>(),
1766 "Oper db.mirror_table.0 trace buffer size")
1767 (
"TRACEBUFFSIZE.Oper db.vrf_assign.0",opt::value<uint32_t>(),
1768 "Oper db.vrf_assign.0 trace buffer size")
1769 (
"TRACEBUFFSIZE.Oper db.policy_set.0",opt::value<uint32_t>(),
1770 "Oper db.policy_set.0 trace buffer size")
1771 (
"TRACEBUFFSIZE.Oper db.vxlan.0",opt::value<uint32_t>(),
1772 "Oper db.vxlan.0 trace buffer size")
1773 (
"TRACEBUFFSIZE.Oper db.qos_queue.0",opt::value<uint32_t>(),
1774 "Oper db.qos_queue.0 trace buffer size")
1775 (
"TRACEBUFFSIZE.Oper db.forwardingclass.0",opt::value<uint32_t>(),
1776 "Oper db.forwardingclass.0 trace buffer size")
1777 (
"TRACEBUFFSIZE.Oper db.security_logging_object.0",opt::value<uint32_t>(),
1778 "Oper db.security_logging_object.0 trace buffer size")
1779 (
"TRACEBUFFSIZE.Oper db.qos_config.0",opt::value<uint32_t>(),
1780 "Oper db.qos_config.0 trace buffer size")
1781 (
"TRACEBUFFSIZE.Oper db.bridge_domain.0",opt::value<uint32_t>(),
1782 "Oper db.bridge_domain.0 trace buffer size")
1783 (
"TRACEBUFFSIZE.Oper db.multicast_policy.0",opt::value<uint32_t>(),
1784 "Oper db.multicast_policy.0 trace buffer size")
1785 (
"TRACEBUFFSIZE.Oper db.service-instance.0",opt::value<uint32_t>(),
1786 "Oper db.service-instance.0 trace buffer size")
1787 (
"TRACEBUFFSIZE.Oper db.physical_devices.0",opt::value<uint32_t>(),
1788 "Oper db.physical_devices.0 trace buffer size")
1789 (
"TRACEBUFFSIZE.Oper db.physical_device_vn.0",opt::value<uint32_t>(),
1790 "Oper db.physical_device_vn.0 trace buffer size")
1791 (
"TRACEBUFFSIZE.httpbuf",opt::value<uint32_t>(),
1792 "httpbuf trace buffer size")
1793 (
"TRACEBUFFSIZE.OperRoute",opt::value<uint32_t>(),
1794 "OperRoute trace buffer size")
1795 (
"TRACEBUFFSIZE.KSync Route",opt::value<uint32_t>(),
1796 "KSync Route trace buffer size");
1801 boost::program_options::options_description config(
"Configuration options");
1802 config.add_options()
1803 (
"CONTROL-NODE.servers",
1804 opt::value<std::vector<std::string> >()->multitoken(),
1805 "List of IPAddress:Port of Control node Servers")
1806 (
"CONTROL-NODE.subcluster_name", opt::value<string>(),
"Cluster identifier")
1807 (
"DEFAULT.collectors",
1808 opt::value<std::vector<std::string> >()->multitoken(),
1809 "Collector server list")
1810 (
"DEFAULT.derived_stats",
1811 opt::value<std::vector<std::string> >()->multitoken(),
1812 "Derived Stats Parameters")
1813 (
"DEFAULT.flow_cache_timeout",
1815 "Flow aging time in seconds")
1816 (
"DEFAULT.stale_interface_cleanup_timeout",
1817 opt::value<uint32_t>()->default_value(default_stale_interface_cleanup_timeout),
1818 "Stale Interface cleanup timeout")
1819 (
"DEFAULT.hostname", opt::value<string>(),
1820 "Hostname of compute-node")
1822 "Enable / Disable DHCP relay of DHCP packets from virtual instance")
1823 (
"DEFAULT.agent_name", opt::value<string>(),
1825 (
"DEFAULT.http_server_port",
1827 "Sandesh HTTP listener port")
1828 (
"DEFAULT.rest_port",
1831 (
"DEFAULT.tunnel_type", opt::value<string>()->default_value(
"MPLSoGRE"),
1832 "Tunnel Encapsulation type <MPLSoGRE|MPLSoUDP|VXLAN>")
1833 (
"DEFAULT.agent_mode", opt::value<string>(),
1834 "Run agent in vrouter / tsn / tor mode")
1835 (
"DEFAULT.gateway_mode", opt::value<string>(),
1836 "Set gateway mode to server/ vcpe")
1837 (
"DEFAULT.agent_base_directory", opt::value<string>()->default_value(
"/var/lib/contrail"),
1838 "Base directory used by the agent")
1840 opt::value<vector<string> >()->multitoken(),
1841 "List of IPAddress:Port of DNS node Servers")
1843 "Enable Xmpp over TLS")
1844 (
"DEFAULT.tsn_servers",
1845 opt::value<std::vector<std::string> >()->multitoken(),
1846 "List of IPAddress of TSN Servers")
1847 (
"DEFAULT.min_aap_prefix_len", opt::value<uint16_t>(),
1848 "Minimum prefix-len for Allowed-address-pair entries")
1849 (
"DEFAULT.vmi_vm_vn_uve_interval",
1851 "UVE send interval in seconds")
1852 (
"DNS.dns_timeout", opt::value<uint32_t>()->default_value(3000),
1854 (
"DNS.dns_max_retries", opt::value<uint32_t>()->default_value(2),
1856 (
"DNS.dns_client_port",
1859 (
"DEFAULT.xmpp_server_cert",
1860 opt::value<string>()->default_value(
1861 "/etc/contrail/ssl/certs/server.pem"),
1862 "XMPP Server ssl certificate")
1863 (
"DEFAULT.xmpp_server_key",
1864 opt::value<string>()->default_value(
1865 "/etc/contrail/ssl/private/server-privkey.pem"),
1866 "XMPP Server ssl private key")
1867 (
"DEFAULT.xmpp_ca_cert",
1868 opt::value<string>()->default_value(
1869 "/etc/contrail/ssl/certs/ca-cert.pem"),
1870 "XMPP CA ssl certificate")
1872 "Enable Xmpp over TLS for DNS")
1873 (
"METADATA.metadata_proxy_secret", opt::value<string>(),
1874 "Shared secret for metadata proxy service")
1875 (
"METADATA.metadata_proxy_port",
1877 "Metadata proxy port ")
1879 "Enable SSL for Metadata proxy service")
1880 (
"METADATA.metadata_client_cert", opt::value<string>()->default_value(
""),
1881 "METADATA Client ssl certificate")
1882 (
"METADATA.metadata_client_cert_type", opt::value<string>()->default_value(
"PEM"),
1883 "METADATA Client ssl certificate type")
1884 (
"METADATA.metadata_client_key", opt::value<string>()->default_value(
""),
1885 "METADATA Client ssl private key")
1886 (
"METADATA.metadata_ca_cert", opt::value<string>()->default_value(
""),
1887 "METADATA CA ssl certificate")
1888 (
"NETWORKS.control_network_ip", opt::value<string>(),
1889 "control-channel IP address used by WEB-UI to connect to vnswad")
1890 (
"DEFAULT.platform", opt::value<string>(),
1891 "Mode in which vrouter is running, option are dpdk or vnic")
1892 (
"DEFAULT.agent_mock",opt::value<bool>()->default_value(
false),
1893 "Agent Mocking Mode")
1894 (
"AGENT-TEST-FRAMEWORK.mock_dpdk",
1895 opt::value<bool>()->default_value(
false),
1897 (
"AGENT-TEST-FRAMEWORK.ksocketdir",
1898 opt::value<string>()->default_value(
"/tmp/"),
1899 "ksocket directory")
1900 (
"DEFAULT.subnet_hosts_resolvable",
1902 (
"DEFAULT.pkt0_tx_buffers", opt::value<uint32_t>()->default_value(default_pkt0_tx_buffers),
1903 "Number of tx-buffers for pkt0 interface")
1904 (
"DEFAULT.physical_interface_address",
1905 opt::value<string>()->default_value(
""))
1906 (
"DEFAULT.physical_interface_mac",
1907 opt::value<string>()->default_value(
""))
1908 (
"HYPERVISOR.vmware_physical_interface",
1909 opt::value<string>()->default_value(
""))
1910 (
"DEFAULT.mirror_client_port",
1912 "Mirror client Port")
1914 "Simulate Evpn Tor")
1916 "Measure flow queue delay")
1917 (
"NEXTHOP-SERVER.endpoint", opt::value<string>(),
1918 "Nexthop Server Endpoint")
1920 "Enable Nh Sever Pid")
1922 "Enable MVPN IPv4 in Agent")
1923 (
"DEFAULT.vr_object_high_watermark", opt::value<float>()->default_value(80),
1924 "Max allowed vr object usage till alarm is raised - given as % (in integer) of object limit in vrouter")
1929 opt::options_description restart(
"Restart options");
1930 restart.add_options()
1931 (
"RESTART.backup_enable",
1933 "Enable backup of config and resources into a file")
1935 "Generate backup if no change detected in configured time (in msec)")
1936 (
"RESTART.backup_dir", opt::value<string>()->default_value(
CFG_BACKUP_DIR),
1937 "Directory storing backup files for configuraion or resource")
1938 (
"RESTART.backup_count", opt::value<uint16_t>()->default_value(
CFG_BACKUP_COUNT),
1939 "Number of backup files")
1941 "Enable restore of config and resources from backup files")
1943 "Audit time for config/resource read from file (in milli-sec)")
1944 (
"RESTART.huge_page_1G",
1945 opt::value<std::vector<std::string> >()->multitoken(),
1946 "List of 1G Huge pages to be used by vrouter for flow and bridge entries")
1947 (
"RESTART.huge_page_2M",
1948 opt::value<std::vector<std::string> >()->multitoken(),
1949 "List of 2M Huge pages to be used by vrouter");
1952 opt::options_description log(
"Logging options");
1953 std::vector<std::string> default_session_destination;
1954 std::vector<std::string> implicit_session_destination;
1955 default_session_destination.push_back(
"collector");
1957 (
"DEFAULT.log_category", opt::value<string>()->default_value(
""),
1958 "Category filter for local logging of sandesh messages")
1959 (
"DEFAULT.log_file",
1961 "Filename for the logs to be written to")
1962 (
"DEFAULT.log_files_count", opt::value<int>(),
1963 "Maximum log file roll over index")
1964 (
"DEFAULT.log_file_size", opt::value<long>(),
1965 "Maximum size of the log file")
1966 (
"DEFAULT.log_level", opt::value<string>()->default_value(
"SYS_NOTICE"),
1967 "Severity level for local logging of sandesh messages")
1968 (
"DEFAULT.log_local", opt::bool_switch(&
log_local_),
1969 "Enable local logging of sandesh messages")
1970 (
"DEFAULT.use_syslog", opt::bool_switch(&
use_syslog_),
1971 "Enable logging to syslog")
1972 (
"DEFAULT.syslog_facility", opt::value<string>()->default_value(
"LOG_LOCAL0"),
1973 "Syslog facility to receive log lines")
1974 (
"DEFAULT.log_flow", opt::bool_switch(&
log_flow_),
1975 "Enable local logging of flow sandesh messages")
1976 (
"DEFAULT.log_property_file", opt::value<string>()->default_value(
""),
1977 "Log Property File")
1978 (
"SESSION.slo_destination",
1979 opt::value<vector<string> >()
1980 ->default_value(default_session_destination, std::string(
"collector"))
1981 ->implicit_value(implicit_session_destination, std::string(
"")),
1982 "List of destinations. valid values are collector, file, syslog. Space delimited")
1983 (
"SESSION.sample_destination",
1984 opt::value<std::vector<std::string> >()
1985 ->default_value(default_session_destination, std::string(
"collector"))
1986 ->implicit_value(implicit_session_destination, std::string(
"")),
1987 "List of destinations. valid values are collector, file, syslog. Space delimited");
1992 opt::options_description flow(
"Flow options");
1995 "Number of threads for flow setup")
1997 "Maximum number of link-local flows allowed across all VMs")
1999 "Maximum number of link-local flows allowed per VM")
2001 "Enable flow tracing")
2002 (
"FLOWS.add_tokens", opt::value<uint32_t>()->default_value(default_flow_add_tokens),
2003 "Number of add-tokens")
2004 (
"FLOWS.ksync_tokens", opt::value<uint32_t>()->default_value(default_flow_ksync_tokens),
2005 "Number of ksync-tokens")
2006 (
"FLOWS.del_tokens", opt::value<uint32_t>()->default_value(default_flow_del_tokens),
2007 "Number of delete-tokens")
2008 (
"FLOWS.update_tokens", opt::value<uint32_t>()->default_value(default_flow_update_tokens),
2009 "Number of update-tokens")
2010 (
"FLOWS.hash_exclude_router_id", opt::value<bool>(),
2011 "Exclude router-id in hash calculation")
2013 "Index Sm Log Count")
2016 (
"FLOWS.max_sessions_per_aggregate", opt::value<uint16_t>()->default_value(
Agent::kMaxSessions),
2017 "Maximum number of sessions per Session Aggregate entry")
2018 (
"FLOWS.max_aggregates_per_session_endpoint", opt::value<uint16_t>()->default_value(
Agent::kMaxSessionAggs),
2019 "Maximum number of Session Aggregates per SessionEndpoint Entry")
2021 "Maximum number of SessionEnpoint entries per SessionEndpointObject")
2022 (
"FLOWS.fabric_snat_hash_table_size", opt::value<uint16_t>()->default_value(default_fabric_snat_table_size),
2023 "Size of Port NAT hash table")
2030 opt::options_description hypervisor(
"Hypervisor specific options");
2031 hypervisor.add_options()
2032 (
"HYPERVISOR.type", opt::value<string>()->default_value(
"kvm"),
2033 "Type of hypervisor <kvm|xen|vmware>")
2034 (
"HYPERVISOR.xen_ll_interface", opt::value<string>(),
2035 "Port name on host for link-local network")
2036 (
"HYPERVISOR.xen_ll_ip", opt::value<string>(),
2037 "IP Address and prefix or the link local port in ip/prefix format")
2038 (
"HYPERVISOR.vmware_physical_port", opt::value<string>(),
2039 "Physical port used to connect to VMs in VMWare environment")
2040 (
"HYPERVISOR.vmware_mode",
2041 opt::value<string>()->default_value(
"esxi_neutron"),
2042 "VMWare mode <esxi_neutron|vcenter>")
2049 opt::options_description vhost(
"VHOST interface specific options");
2051 (
"VIRTUAL-HOST-INTERFACE.name", opt::value<string>(),
2052 "Name of virtual host interface")
2053 (
"VIRTUAL-HOST-INTERFACE.ip", opt::value<string>(),
2054 "IP address and prefix in ip/prefix_len format")
2055 (
"VIRTUAL-HOST-INTERFACE.gateway",
2056 opt::value<string>(),
2057 "Lisg of gateway IP address for virtual host")
2058 (
"VIRTUAL-HOST-INTERFACE.physical_interface",
2059 opt::value<std::vector<std::string> >()->multitoken(),
2060 "Physical interface name to which virtual host interface maps to")
2061 (
"VIRTUAL-HOST-INTERFACE.physical_interface_addr",
2062 opt::value<string>(),
2063 "List of Physical interface ip address")
2064 (
"VIRTUAL-HOST-INTERFACE.compute_node_address",
2065 opt::value<std::vector<std::string> >()->multitoken(),
2066 "List of addresses on compute node")
2067 (
"VIRTUAL-HOST-INTERFACE.physical_port_routes",
2068 opt::value<std::vector<std::string> >()->multitoken(),
2069 "Static routes to be added on physical interface")
2070 (
"VIRTUAL-HOST-INTERFACE.eth_port_no_arp", opt::bool_switch(&
eth_port_no_arp_),
2071 "Ethernet Port No-ARP")
2072 (
"VIRTUAL-HOST-INTERFACE.eth_port_encap_type", opt::value<string>(),
2073 "Ethernet Port Encap Type")
2074 (
"VIRTUAL-HOST-INTERFACE.loopback_ip", opt::value<string>(),
2075 "Compute Loopback IP")
2082 opt::options_description service(
"Service instance specific options");
2083 service.add_options()
2084 (
"SERVICE-INSTANCE.netns_command", opt::value<string>(),
2085 "Script path used when a service instance is spawned with network namespace")
2086 (
"SERVICE-INSTANCE.netns_timeout", opt::value<int>()->default_value(0),
2087 "Timeout used to set a netns command as failing and to destroy it")
2088 (
"SERVICE-INSTANCE.netns_workers", opt::value<int>()->default_value(0),
2089 "Number of workers used to spawn netns command")
2090 (
"SERVICE-INSTANCE.docker_command", opt::value<string>(),
2091 "Service instance docker command")
2092 (
"SERVICE-INSTANCE.lb_ssl_cert_path", opt::value<string>(),
2093 "Loadbalancer ssl certificate path")
2094 (
"SERVICES.bgp_as_a_service_port_range", opt::value<string>(),
2095 "Port range for BgPass ")
2096 (
"SERVICES.queue_limit", opt::value<uint32_t>()->default_value(1024),
2097 "Work queue for different services")
2098 (
"SERVICES.bgpaas_max_shared_sessions", opt::value<uint32_t>(),
2099 "BGPAAS max shared sessions for service port")
2100 (
"SERVICE-INSTANCE.lbaas_auth_conf", opt::value<string>(),
2101 "Credentials fo ssl certificates and private-keys")
2108 opt::options_description tbb(
"TBB specific options");
2110 (
"TASK.thread_count", opt::value<uint32_t>()->default_value(default_tbb_thread_count),
2111 "Max number of threads used by TBB")
2112 (
"TASK.log_exec_threshold", opt::value<uint32_t>()->default_value(0),
2113 "Log message if task takes more than threshold (msec) to execute")
2114 (
"TASK.log_schedule_threshold", opt::value<uint32_t>()->default_value(0),
2115 "Log message if task takes more than threshold (msec) to schedule")
2116 (
"TASK.tbb_keepawake_timeout", opt::value<uint32_t>()->default_value(default_tbb_keepawake_timeout),
2117 "Timeout for the TBB keepawake timer")
2118 (
"TASK.task_monitor_timeout", opt::value<uint32_t>(),
2119 "Timeout for the Task monitoring")
2120 (
"TASK.ksync_thread_cpu_pin_policy", opt::value<string>(),
2121 "Pin ksync io task to CPU")
2122 (
"TASK.flow_netlink_pin_cpuid", opt::value<uint32_t>(),
2128 opt::options_description
sandesh(
"Sandesh specific options");
2133 opt::options_description llgr(
"LLGR");
2135 (
"LLGR.disable", opt::value<bool>()->default_value(
false),
2137 (
"LLGR.stale_config_cleanup_time", opt::value<uint16_t>()->default_value(100),
2138 "LLGR Stale Config Cleanup Time")
2139 (
"LLGR.config_poll_time", opt::value<uint16_t>()->default_value(5),
2140 "LLGR Config Poll Time")
2141 (
"LLGR.config_inactivity_time", opt::value<uint16_t>()->default_value(15),
2142 "LLGR Config Inactive Time")
2143 (
"LLGR.config_fallback_time", opt::value<uint16_t>()->default_value(900),
2144 "LLGR Config Fallback Time")
2145 (
"LLGR.end_of_rib_tx_poll_time", opt::value<uint16_t>()->default_value(5),
2146 "LLGR End Of Rib Poll Time")
2147 (
"LLGR.end_of_rib_tx_fallback_time", opt::value<uint16_t>()->default_value(60),
2148 "LLGR End Of Rib Tx Fallback Time")
2149 (
"LLGR.end_of_rib_tx_inactivity_time", opt::value<uint16_t>()->default_value(15),
2150 "LLGR End Of Rib Tx Inactivity Time")
2151 (
"LLGR.end_of_rib_rx_fallback_time", opt::value<uint16_t>()->default_value(60),
2152 "LLGR End Of Rib Rx Fallback Time")
2157 opt::options_description mac_learn(
"MAC-LEARNING");
2158 mac_learn.add_options()
2159 (
"MAC-LEARNING.thread_count", opt::value<uint32_t>()->default_value(default_mac_learning_thread_count),
2161 (
"MAC-LEARNING.add_tokens", opt::value<uint32_t>()->default_value(default_mac_learning_add_tokens),
2163 (
"MAC-LEARNING.del_tokens", opt::value<uint32_t>()->default_value(default_mac_learning_update_tokens),
2165 (
"MAC-LEARNING.update_tokens", opt::value<uint32_t>()->default_value(default_mac_learning_delete_tokens),
2171 opt::options_description qos(
"Quality of Service options");
2173 (
"QOS.priority_tagging",
2175 "Enable Priority tagging")
2180 opt::options_description crypt(
"CRYPT");
2182 (
"CRYPT.crypt_interface", opt::value<string>(),
2183 "Interface name to send data for encrypt")
boost::system::error_code Ip4PrefixParse(const string &str, Ip4Address *addr, int *plen)
boost::asio::ip::address_v4 Ip4Address
std::string AgentBackTrace(int skip=1)
#define CFG_RESTORE_AUDIT_TIMEOUT
#define CFG_BACKUP_IDLE_TIMEOUT
static bool ValidateInterface(bool test_mode, const std::string &ifname, bool *no_arp, string *eth_encap)
bool ParseIp(const std::string &key, Ip4Address *server)
void ParseTestFrameworkArguments(const boost::program_options::variables_map &var_map)
void ComputeFlowAndFileLimits()
void ParseVirtualHostArguments(const boost::program_options::variables_map &v)
void ParseCryptArguments(const boost::program_options::variables_map &v)
boost::program_options::options_description config_file_options_
virtual void DebugInitFromConfig()
void ParseCollectorArguments(const boost::program_options::variables_map &var_map)
virtual void InitFromConfig()
void LogFilteredConfig() const
void ParseLlgrArguments(const boost::program_options::variables_map &v)
virtual void ReInitFromConfig()
void ParseDnsArguments(const boost::program_options::variables_map &v)
void AddOptions(const boost::program_options::options_description &opt)
void ParseFlowArguments(const boost::program_options::variables_map &v)
void ParseControllerServersArguments(const boost::program_options::variables_map &var_map)
void InitVhostAndXenLLPrefix()
void ParseAgentInfoArguments(const boost::program_options::variables_map &v)
bool ParseServerList(const std::string &key, Ip4Address *s1, Ip4Address *s2)
bool restart_backup_enable_
void UpdateBgpAsaServicePortRangeValue()
void ParseServiceInstanceArguments(const boost::program_options::variables_map &v)
void ParseSessionDestinationArguments(const boost::program_options::variables_map &v)
void ComputeVrWatermark()
void SplitByDelimiter(const std::string &txt, std::vector< std::string > &strs, char ch)
const std::string log_file() const
void ParseNetworksArguments(const boost::program_options::variables_map &v)
bool enable_flow_options_
void BuildAddressList(const std::string &val)
AgentParam(bool enable_flow_options=true, bool enable_vhost_options=true, bool enable_hypervisor_options=true, bool enable_service_options=true, AgentMode agent_mode=VROUTER_AGENT)
void PostValidateLogConfig() const
bool enable_service_options_
bool measure_queue_delay_
bool ParseAddress(const std::string &addr_string, Ip4Address *server, uint16_t *port)
void set_agent_mode(const std::string &mode)
void ParseTaskSectionArguments(const boost::program_options::variables_map &v)
std::vector< Ip4Address > AddressList
void ParseIpArgument(const boost::program_options::variables_map &var_map, Ip4Address &server, const std::string &key)
SandeshConfig sandesh_config_
bool nexthop_server_add_pid_
virtual void ProcessArguments()
void set_gateway_mode(const std::string &mode)
void ParseDnsServersArguments(const boost::program_options::variables_map &var_map)
bool xmpp_dns_auth_enable_
bool subnet_hosts_resolvable_
bool GetIpAddress(const std::string &str, Ip4Address *addr)
bool ParseServerListArguments(const boost::program_options::variables_map &var_map, Ip4Address &server1, Ip4Address &server2, const std::string &key)
boost::program_options::options_description options_
void ParseDefaultSectionArguments(const boost::program_options::variables_map &v)
void ParseHypervisorArguments(const boost::program_options::variables_map &v)
void ParseArguments(int argc, char *argv[])
void set_test_mode(bool mode)
void ParseDhcpRelayModeArguments(const boost::program_options::variables_map &var_map)
virtual void InitFromSystem()
bool enable_hypervisor_options_
void ParseServicesArguments(const boost::program_options::variables_map &v)
void ParseMacLearning(const boost::program_options::variables_map &v)
static std::map< string, std::map< string, string > > ParseDerivedStats(const std::vector< std::string > &dsvec)
void Init(const std::string &config_file, const std::string &program_name)
void ParseSimulateEvpnTorArguments(const boost::program_options::variables_map &var_map)
void ParseSandeshArguments(const boost::program_options::variables_map &v)
void ConfigAddOptions(const boost::program_options::options_description &opt)
bool restart_restore_enable_
void ParseCollectorDSArguments(const boost::program_options::variables_map &v)
void ParseMetadataProxyArguments(const boost::program_options::variables_map &v)
void UpdateBgpAsaServicePortRange()
void ParseRestartArguments(const boost::program_options::variables_map &v)
void ParseNexthopServerArguments(const boost::program_options::variables_map &v)
bool IsConfiguredTsnHostRoute(std::string addr) const
bool enable_vhost_options_
void ParsePlatformArguments(const boost::program_options::variables_map &v)
void BuildAddrList(const std::string &val, AddressList &addr_list)
bool qos_priority_tagging_
void ParseTsnServersArguments(const boost::program_options::variables_map &var_map)
static const uint32_t kFlowUpdateTokens
static const uint32_t kPkt0TxBufferCount
static const uint32_t kFlowAddTokens
static const uint32_t kDefaultFlowCacheTimeout
static const uint32_t kDefaultFlowIndexSmLogCount
static const uint32_t kDefaultStaleInterfaceCleanupTimeout
static const uint32_t kMaxOtherOpenFds
static const uint16_t kFabricSnatTableSize
static const uint32_t kFlowKSyncTokens
static const uint8_t kMaxSessions
static const uint16_t kDefaultVmiVmVnUveInterval
static const uint32_t kDefaultFlowThreadCount
static const std::string & NullString()
static const uint32_t kDefaultFlowLatencyLimit
static Agent * GetInstance()
static const uint32_t kFlowDelTokens
static const uint8_t kMaxSessionAggs
static const uint32_t kDefaultTbbKeepawakeTimeout
static const uint8_t kMaxSessionEndpoints
static const std::string config_file_
static const uint32_t kMaxTbbThreads
static const uint32_t kMaxBgpAsAServerSessions
static const uint32_t kMacLearningDefaultTokens
static const uint32_t kDefaultMaxLinkLocalOpenFds
static const uint16_t VrouterAgentDnsClientUdpPort()
static const uint16_t HttpPortAgent()
static const uint16_t MetadataProxyVrouterAgentPort()
static const uint16_t VrouterAgentMirrorClientUdpPort()
static const uint16_t PortIpcVrouterAgentPort()
#define LOG(_Level, _Msg)
bool GetOptValueIfNotDefaulted(const boost::program_options::variables_map &var_map, ValueType &var, const std::string &val)
void AddOptions(opt::options_description *sandesh_options, SandeshConfig *sandesh_config)
void ProcessOptions(const opt::variables_map &var_map, SandeshConfig *sandesh_config)
string program_name(string filename)
bool stringToInteger(const std::string &str, NumberType &num)
static bool stringToIntegerList(std::string input, std::string seperator, std::vector< NumberType > &entries)
uint16_t end_of_rib_tx_inactivity_time_
uint16_t config_inactivity_time_
uint16_t stale_config_cleanup_time_
static const int kEorTxInactivityTime
uint16_t config_poll_time_
uint16_t end_of_rib_rx_fallback_time_
static const int kEorTxFallbackTimeOut
static const int kEorRxFallbackTime
static const int kEorTxPollTime
uint16_t config_fallback_time_
static const int kLlgrStaleTime
static const int kConfigPollTime
uint32_t llgr_stale_time_
static const int kStaleConfigCleanupTime
static const int kConfigInactivityTime
static const int kConfigFallbackTimeOut
uint16_t end_of_rib_tx_poll_time_
uint16_t end_of_rib_tx_fallback_time_