OpenSDN source code
agent_param.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 Juniper Networks, Inc. All rights reserved.
3  */
4 
5 /*
6  * Agent parameters are derived from 3 entities in increasing priority,
7  * - System information
8  * - Configuration file
9  * - Parameters
10  */
11 
12 #include "base/os.h"
13 #include <sys/types.h>
14 #include <sys/stat.h>
15 #include <sys/resource.h>
16 #include <net/if_arp.h>
17 #include <unistd.h>
18 #include <iostream>
19 #include <string>
20 
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>
26 
28 #include <base/logging.h>
29 #include <base/misc_utils.h>
30 #include <base/options_util.h>
31 
33 
34 #include <sandesh/sandesh_trace.h>
35 
36 #include <cmn/agent_cmn.h>
37 #include <init/agent_param.h>
38 #include <vgw/cfg_vgw.h>
39 
40 using namespace std;
41 using namespace boost::property_tree;
42 using boost::optional;
43 namespace opt = boost::program_options;
44 using namespace options::util;
45 
46 bool AgentParam::GetIpAddress(const string &str, Ip4Address *addr) {
47  boost::system::error_code ec;
48  Ip4Address tmp = Ip4Address::from_string(str, ec);
49  if (ec.value() != 0) {
50  return false;
51  }
52  *addr = tmp;
53  return true;
54 }
55 
56 bool AgentParam::ParseIp(const string &key, Ip4Address *server) {
57  optional<string> opt_str;
58  if (opt_str = tree_.get_optional<string>(key)) {
59  Ip4Address addr;
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() << ">");
64  return false;
65 
66  } else {
67  *server = addr;
68  }
69  }
70  return true;
71 }
72 
73 bool AgentParam::ParseServerList(const string &key, Ip4Address *server1,
74  Ip4Address *server2) {
75  optional<string> opt_str;
76  Ip4Address addr;
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() << ">");
84  return false;
85  }
86  vector<string>::iterator it = tokens.begin();
87  if (it != tokens.end()) {
88  if (!GetIpAddress(*it, server1)) {
89  return false;
90  }
91  ++it;
92  if (it != tokens.end()) {
93  if (!GetIpAddress(*it, server2)) {
94  return false;
95  }
96  }
97  }
98  }
99  return true;
100 }
101 
102 // Parse address string in the form <ip>:<port>
103 bool AgentParam::ParseAddress(const std::string &addr_string,
104  Ip4Address *server, uint16_t *port) {
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";
110  return false;
111  }
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";
116  return false;
117  }
118  ++it;
119  if (it != tokens.end()) {
120  stringToInteger(*it, *port);
121  }
122 
123  return true;
124 }
125 
126 // Parse list of servers in the <ip1>:<port1> <ip2>:<port2> format
127 bool AgentParam::ParseServerList(const std::string &key,
128  Ip4Address *server1, uint16_t *port1,
129  Ip4Address *server2, uint16_t *port2) {
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";
138  return false;
139  }
140  vector<string>::iterator it = tokens.begin();
141  if (it != tokens.end()) {
142  if (!ParseAddress(*it, server1, port1))
143  return false;
144  ++it;
145  if (it != tokens.end()) {
146  return ParseAddress(*it, server2, port2);
147  }
148  }
149  }
150  return true;
151 }
152 
154  (const boost::program_options::variables_map &var_map, Ip4Address &server,
155  const string &key) {
156 
157  if (var_map.count(key)) {
158  Ip4Address addr;
159  if (GetIpAddress(var_map[key].as<string>(), &addr)) {
160  server = addr;
161  }
162  }
163 }
164 
166  (const boost::program_options::variables_map &var_map, Ip4Address &server1,
167  Ip4Address &server2, const string &key) {
168 
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"));
173  }
174  if (value.size() > 2) {
175  cout << "Error in Arguments. Cannot have more than 2 servers for "
176  << key << "\n";
177  return false;
178  }
179  vector<string>::iterator it = value.begin();
180  Ip4Address addr;
181  if (it != value.end()) {
182  if (GetIpAddress(*it, &addr)) {
183  server1 = addr;
184  }
185  ++it;
186  if (it != value.end()) {
187  if (GetIpAddress(*it, &addr)) {
188  server2 = addr;
189  }
190  }
191  }
192  }
193  return true;
194 }
195 
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) {
200 
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"));
205  }
206  if (value.size() > 2) {
207  LOG(ERROR, "Error in Arguments. Cannot have more than 2 servers "
208  "for " << key );
209  return false;
210  }
211  vector<string>::iterator it = value.begin();
212  if (it != value.end()) {
213  if (!ParseAddress(*it, server1, port1))
214  return false;
215  ++it;
216  if (it != value.end()) {
217  return ParseAddress(*it, server2, port2);
218  }
219  }
220  }
221  return true;
222 }
223 
224 std::map<string, std::map<string, string> >
225 AgentParam::ParseDerivedStats(const std::vector<std::string> &dsvec) {
226  std::map<string, std::map<string, string> > dsmap;
227  std::map<string, std::map<string, string> >::iterator dsiter;
228 
229  for (size_t idx=0; idx!=dsvec.size(); idx++) {
230  size_t pos = dsvec[idx].find(':');
231  if(pos == string::npos) {
232  LOG(ERROR,
233  "Error config-file, DerivedStats parsing: dsvec size "
234  << dsvec.size() << " at index " << idx << ": " <<dsvec[idx]
235  << ". BackTrace: " << AgentBackTrace(1));
236  _Exit(0);
237  }
238  string dsfull = dsvec[idx].substr(0,pos);
239  string dsarg = dsvec[idx].substr(pos+1, string::npos);
240 
241  size_t dpos = dsfull.find('.');
242  if(dpos == string::npos) {
243  LOG(ERROR,
244  "Error config-file, DerivedStats parsing: dsvec size "
245  << dsvec.size() << " at index " << idx << ": " <<dsvec[idx]
246  << ". substr: " << dsfull << ". BackTrace: " << AgentBackTrace(1));
247  _Exit(0);
248  }
249  string dsstruct = dsfull.substr(0,dpos);
250  string dsattr = dsfull.substr(dpos+1, string::npos);
251 
252  dsiter = dsmap.find(dsstruct);
253  std::map<string, string> dselem;
254  if (dsiter!=dsmap.end()) dselem = dsiter->second;
255  dselem[dsattr] = dsarg;
256 
257  dsmap[dsstruct] = dselem;
258  }
259  return dsmap;
260 }
261 
262 void AgentParam::BuildAddressList(const string &val) {
263  compute_node_address_list_.clear();
264  if (val.empty()) {
265  return;
266  }
267 
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;
273  ++it;
274 
275  boost::algorithm::trim(str);
276  Ip4Address addr;
277  if (GetIpAddress(str, &addr)) {
278  compute_node_address_list_.push_back(addr);
279  } else {
280  LOG(ERROR, "Error in parsing address " << *it);
281  }
282  }
283 }
284 
285 void AgentParam::set_agent_mode(const std::string &mode) {
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;
293  else
294  agent_mode_ = VROUTER_AGENT;
295 }
296 
297 void AgentParam::set_gateway_mode(const std::string &mode) {
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")
304  gateway_mode_ = PBB;
305  else
306  gateway_mode_ = NONE;
307 }
308 
310 
311  const std::string qos_str = "QUEUE";
312  std::string input;
313  std::vector<std::string> tokens;
314  std::string sep = "[],";
315  BOOST_FOREACH(const ptree::value_type &section, tree_) {
316  if (section.first.compare(0, qos_str.size(), qos_str) != 0) {
317  continue;
318  }
319  uint16_t queue;
320  std::string hw_queue = section.first;
321  if (sscanf(hw_queue.c_str(), "QUEUE-%hu", &queue) != 1) {
322  continue;
323  }
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);
329 
330  for (std::vector<string>::const_iterator it = tokens.begin();
331  it != tokens.end(); it++) {
332 
333  if (*it == Agent::NullString()) {
334  continue;
335  }
336 
337  string range = *it;
338  nic_queue_list_.insert(queue);
339  std::vector<uint16_t> range_value;
340  if (stringToIntegerList(range, "-", range_value)) {
341  if (range_value.size() == 1) {
342  qos_queue_map_[range_value[0]] = queue;
343  continue;
344  }
345 
346  if (range_value[0] > range_value[1]) {
347  continue;
348  }
349 
350  for (uint16_t i = range_value[0]; i <= range_value[1]; i++) {
351  qos_queue_map_[i] = queue;
352  }
353  }
354  }
355  }
356  if (key.first.compare("default_hw_queue") == 0) {
357  bool is_default = key.second.get_value<bool>();
358  if (is_default) {
359  default_nic_queue_ = queue;
360  }
361  }
362  }
363  }
364  GetValueFromTree<uint32_t>(task_monitor_timeout_msec_,
365  "TASK.task_monitor_timeout");
366 }
367 
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");
376  //validate the string
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++) {
383 
384  if(valid_dest_values.find(slo_destination_[i]) ==
385  valid_dest_values.end()) {
386  LOG(ERROR,
387  "Error in config file <" << config_file_
388  << ">. Error parsing slo_destination, size "
389  << slo_destination_.size() << " at index " << i << ":"
390  << slo_destination_[i]
391  << ". BackTrace: " << AgentBackTrace(1));
392  _Exit(0);
393  }
394 
395  }
396  for (uint32_t i=0; i<sample_destination_.size(); i++) {
397 
398  if(valid_dest_values.find(sample_destination_[i]) ==
399  valid_dest_values.end()) {
400  LOG(ERROR,
401  "Error in config file <" << config_file_
402  << ">. Error parsing sample_destination, size "
403  << sample_destination_.size() << " at index " << i << ":"
404  << sample_destination_[i]
405  << ". BackTrace: " << AgentBackTrace(1));
406  _Exit(0);
407  }
408 
409  }
410 }
411 
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(" "));
420  }
421 }
422 
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(" "));
431  }
432  GetOptValue<string>(var_map, subcluster_name_, "CONTROL-NODE.subcluster_name");
433 }
434 
436  (const boost::program_options::variables_map &var_map) {
437  dns_server_list_.clear();
438  GetOptValueIfNotDefaulted< vector<string> >(var_map, dns_server_list_,
439  "DNS.servers");
440  if (dns_server_list_.size() == 1) {
441  boost::split(dns_server_list_, dns_server_list_[0],
442  boost::is_any_of(" "));
443  }
444 }
445 
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(" "));
454  }
455  std::sort(tsn_server_list_.begin(), tsn_server_list_.end());
456 }
457 
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;
463  if (GetOptValueIfNotDefaulted< vector<string> >(var_map, dsvec,
464  "DEFAULT.derived_stats")) {
465  derived_stats_map_ = ParseDerivedStats(dsvec);
466  }
467 }
468 
469 void AgentParam::BuildAddrList(const string &val, AddressList& addr_list) {
470  addr_list.clear();
471  if (val.empty()) {
472  return;
473  }
474 
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;
480  ++it;
481 
482  boost::algorithm::trim(str);
483  Ip4Address addr;
484  int plen;
485  if (str.find('/') != std::string::npos) {
486  boost::system::error_code ec =
487  Ip4PrefixParse(str, &addr, &plen);
488  if (ec.failed() || vhost_.plen_ >= 32) {
489  LOG(ERROR, "Error in parsing address " << *it);
490  } else {
491  addr_list.push_back(addr);
492  eth_port_plen_list_.push_back(plen);
493  }
494  } else {
495  if (GetIpAddress(str, &addr)) {
496  addr_list.push_back(addr);
497  } else {
498  LOG(ERROR, "Error in parsing address " << *it);
499  }
500  }
501  }
502 }
503 
505  (const boost::program_options::variables_map &var_map) {
506  boost::system::error_code ec;
507 
508  GetOptValue<string>(var_map, vhost_.name_, "VIRTUAL-HOST-INTERFACE.name");
509  string ip;
510  if (GetOptValue<string>(var_map, ip, "VIRTUAL-HOST-INTERFACE.ip")) {
511  ec = Ip4PrefixParse(ip, &vhost_.addr_, &vhost_.plen_);
512  if (ec.failed() || vhost_.plen_ >= 32) {
513  cout << "Error parsing vhost ip argument from <" << ip << ">\n";
514  }
515  }
516  //ParseIpArgument(var_map, vhost_.gw_, "VIRTUAL-HOST-INTERFACE.gateway");
517 
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(" "));
524  }
525 
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_);
530  }
531 
532  string gateway_list;
533  if (GetOptValue<string>(var_map, gateway_list,
534  "VIRTUAL-HOST-INTERFACE.gateway")) {
535  BuildAddrList(gateway_list, gateway_list_);
536  }
537 
538  ParseIpArgument(var_map, loopback_ip_, "VIRTUAL-HOST-INTERFACE.loopback_ip");
539 }
540 
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");
546 }
547 
549  (const boost::program_options::variables_map &var_map) {
550  ParseIpArgument(var_map, mgmt_ip_, "NETWORKS.control_network_ip");
551 }
552 
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") {
559  hypervisor_mode_ = AgentParam::MODE_XEN;
560  GetOptValue<string>(var_map, xen_ll_.name_,
561  "HYPERVISOR.xen_ll_interface");
562 
563  if (var_map.count("HYPERVISOR.xen_ll_ip")) {
564  string ip = var_map["HYPERVISOR.xen_ll_ip"].as<string>();
565  ec = Ip4PrefixParse(ip, &xen_ll_.addr_, &xen_ll_.plen_);
566  if (ec.failed() || xen_ll_.plen_ >= 32) {
567  cout << "Error in argument <" << config_file_
568  << ">. Error parsing Xen Link-local ip-address from <"
569  << ip << ">\n";
570  exit(EINVAL);
571  }
572  }
573  } else if (var_map["HYPERVISOR.type"].as<string>() == "vmware") {
574  hypervisor_mode_ = AgentParam::MODE_VMWARE;
575  GetOptValue<string>(var_map, vmware_physical_port_,
576  "HYPERVISOR.vmware_physical_interface");
577  } else {
578  hypervisor_mode_ = AgentParam::MODE_KVM;
579  }
580  }
581 
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>() ==
588  "esxi_neutron") {
589  vmware_mode_ = ESXI_NEUTRON;
590  } else {
591  cout << "Error in parsing arguement for HYPERVISOR.vmware_mode <"
592  << var_map["HYPERVISOR.vmware_mode"].as<string>() << endl;
593  return;
594  }
595  }
596  if (!GetValueFromTree<uint16_t>(vmi_vm_vn_uve_interval_,
597  "DEFAULT.vmi_vm_vn_uve_interval")) {
598  vmi_vm_vn_uve_interval_ = Agent::kDefaultVmiVmVnUveInterval;
599  }
600 }
601 
603  (const boost::program_options::variables_map &var_map) {
604 
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");
621 
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");
629 
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;
649  }
650 }
651 
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");
668 }
669 
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");
686 }
687 
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_,
702  "FLOWS.add_tokens");
703  GetOptValue<uint32_t>(var_map, flow_ksync_tokens_,
704  "FLOWS.ksync_tokens");
705  GetOptValue<uint32_t>(var_map, flow_del_tokens_,
706  "FLOWS.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");
719 }
720 
722  (const boost::program_options::variables_map &var_map) {
723  GetOptValue<bool>(var_map, dhcp_relay_mode_, "DEFAULT.dhcp_relay_mode");
724 }
725 
727  (const boost::program_options::variables_map &var_map) {
728  GetOptValue<bool>(var_map, simulate_evpn_tor_, "DEFAULT.simulate_evpn_tor");
729 }
730 
732  (const boost::program_options::variables_map &var_map) {
733  std::string mode;
734  if (GetOptValue<string>(var_map, mode, "DEFAULT.agent_mode")) {
735  set_agent_mode(mode);
736  }
737  if (GetOptValue<string>(var_map, mode, "DEFAULT.gateway_mode")) {
738  set_gateway_mode(mode);
739  }
740  GetOptValue<string>(var_map, agent_base_dir_,
741  "DEFAULT.agent_base_directory");
742 }
743 
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");
754 
755 }
756 
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();
767  }
768 }
769 
770 void AgentParam::SplitByDelimiter (const std::string &txt,
771  std::vector<std::string> &strs, char ch) {
772  size_t pos = txt.find(ch);
773  size_t initialPos = 0;
774  strs.clear();
775 
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);
780  }
781  strs.push_back(txt.substr(initialPos, std::min(pos, txt.size()) -
782  initialPos + 1));
783 }
784 
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") {
790  platform_ = AgentParam::VROUTER_ON_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_, ' ');
800  }
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_, ' ');
807  }
808  }
809  } else {
810  platform_ = AgentParam::VROUTER_ON_HOST;
811  }
812  }
813 }
814 
815 //this has been intentionally seperated from platform to provide an easier mix and match in the future if necessary
817  const boost::program_options::variables_map &var_map) {
818  GetOptValue<bool>(var_map, AgentMock_, "DEFAULT.agent_mock");
819 
820  if (AgentMock_) {
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");
825  }
826 
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;
831  exit(1);
832  }
833 
834 }
835 
836 
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");
844 }
845 
847  (const boost::program_options::variables_map &v) {
848  sandesh::options::ProcessOptions(v, &sandesh_config_);
849 }
850 
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");
858 
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(" "));
868  }
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(" "));
875  }
876 }
877 
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");
894 }
895 
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");
906 }
907 
909  (const boost::program_options::variables_map &var_map) {
910  GetOptValue<string>(var_map, crypt_port_,
911  "CRYPT.crypt_interface");
912 }
913 
914 // Initialize hypervisor mode based on system information
915 // If "/proc/xen" exists it means we are running in Xen dom0
917  boost::system::error_code error;
918  host_name_ = boost::asio::ip::host_name(error);
919  agent_name_ = host_name_;
920 
921  struct stat fstat;
922  if (stat("/proc/xen", &fstat) == 0) {
923  hypervisor_mode_ = MODE_XEN;
924  cout << "Found file /proc/xen. Initializing mode to XEN\n";
925  }
926  xen_ll_.addr_ = Ip4Address::from_string("169.254.0.1");
927  xen_ll_.plen_ = 16;
928 
929  return;
930 }
931 
932 // Update agent parameters from config file
934  // Read and parse INI
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,
940  var_map_);
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));
946  }
947  }
948  }
949  config_file_in.close();
950  cout << "Config file <" << config_file_ << "> parsing completed.\n";
951  return;
952 }
953 
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_);//sagarc
974  ParseSandeshArguments(var_map_);
975  ParseQueue();
976  ParseRestartArguments(var_map_);
977  ParseMacLearning(var_map_);
978  ParseTsnServersArguments(var_map_);
979  ParseCryptArguments(var_map_);
980  ParseSessionDestinationArguments(var_map_);
981 }
982 
984  // Read and parse INI
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);
992  }
993  config_file_in.close();
994  LOG(INFO, "Config file parsing for debug params completed. \n");
995  return;
996 }
997 
999 
1000  // Read and parse INI
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);
1008 
1009  ParseControllerServersArguments(var_map);
1010  ParseDnsServersArguments(var_map);
1011  ParseCollectorArguments(var_map);
1012  ParseTsnServersArguments(var_map);
1013  ParseSessionDestinationArguments(var_map);
1014 
1015  LogFilteredConfig();
1016  }
1017  config_file_in.close();
1018  LOG(DEBUG, "Config file re-parsing completed. \n");
1019 
1020  return;
1021 }
1022 
1024  if (!stringToIntegerList(bgp_as_a_service_port_range_, "-",
1025  bgp_as_a_service_port_range_value_)) {
1026  bgp_as_a_service_port_range_value_.clear();
1027  return;
1028  }
1029 }
1030 
1032  if (!stringToIntegerList(bgp_as_a_service_port_range_, "-",
1033  bgp_as_a_service_port_range_value_)) {
1034  bgp_as_a_service_port_range_value_.clear();
1035  return;
1036  }
1037  uint16_t start = bgp_as_a_service_port_range_value_[0];
1038  uint16_t end = bgp_as_a_service_port_range_value_[1];
1039 
1040  uint16_t count = end - start + 1;
1041  if (count > Agent::kMaxBgpAsAServerSessions) {
1042  bgp_as_a_service_port_range_value_[1] =
1043  start + Agent::kMaxBgpAsAServerSessions - 1;
1045  }
1046 
1047  struct rlimit rl;
1048  int result = getrlimit(RLIMIT_NOFILE, &rl);
1049  if (result == 0) {
1050  if (rl.rlim_max <= Agent::kMaxOtherOpenFds) {
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();
1054  return;
1055  }
1056  if (count > rl.rlim_max - Agent::kMaxOtherOpenFds) {
1057  bgp_as_a_service_port_range_value_[1] =
1058  start + rl.rlim_max - Agent::kMaxOtherOpenFds - 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";
1062  }
1063  } else {
1064  cout << "Unable to validate BGP as a server port range configuration\n";
1065  }
1066 }
1067 
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;
1072  }
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;
1076  }
1077 }
1078 
1080  struct rlimit rl;
1081  int result = getrlimit(RLIMIT_NOFILE, &rl);
1082  if (result == 0) {
1083  if (rl.rlim_max <= Agent::kMaxOtherOpenFds + 1) {
1084  cout << "Updating linklocal flows configuration to 0\n";
1085  linklocal_system_flows_ = linklocal_vm_flows_ = 0;
1086  return;
1087  }
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";
1094  }
1095 
1096  /* Set the rlimit here for max open files to the required value of
1097  * linklocal_system_flows_ + Agent::kMaxOtherOpenFds + 1. Note that
1098  * soft limit is set to the required value even if the existing soft
1099  * limit is higher than the required value. This is done to avoid long
1100  * close() FD loops following any fork or vfork() agent may do in case
1101  * the soft value is set to max allowed value of 1M */
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);
1107  if (result != 0) {
1108  if (rl.rlim_cur <= Agent::kMaxOtherOpenFds + 1) {
1109  linklocal_system_flows_ = 0;
1110  } else {
1111  linklocal_system_flows_ = rl.rlim_cur -
1113  }
1114  cout << "Unable to set Max open files limit to : " <<
1115  new_rl.rlim_cur <<
1116  " Updating linklocal-system-flows configuration to : " <<
1117  linklocal_system_flows_ << "\n";
1118  }
1119 
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";
1124  }
1125  } else {
1126  cout << "Unable to validate linklocal flow configuration\n";
1127  }
1128 }
1129 
1130 static bool ValidateInterface(bool test_mode, const std::string &ifname,
1131  bool *no_arp, string *eth_encap) {
1132  *no_arp = false;
1133  *eth_encap = "";
1134 
1135  if (test_mode) {
1136  return true;
1137  }
1138 
1139  int fd = socket(AF_LOCAL, SOCK_STREAM, 0);
1140  assert(fd >= 0);
1141 
1142  struct ifreq ifr;
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);
1146  close (fd);
1147 
1148  if (err < 0) {
1149  LOG(ERROR, "Error reading interface <" << ifname << ">. Error number "
1150  << errno << " : " << strerror(errno));
1151  return false;
1152  }
1153 
1154  if ((ifr.ifr_flags & IFF_NOARP)) {
1155  *no_arp = true;
1156  }
1157 
1158  char fname[128];
1159  snprintf(fname, 128, "/sys/class/net/%s/type", ifname.c_str());
1160  FILE *f = fopen(fname, "r");
1161  if (f) {
1162  int type;
1163  if (fscanf(f, "%d", &type) >= 0) {
1164  if (type == ARPHRD_NONE) {
1165  *eth_encap = "none";
1166  }
1167  }
1168  fclose(f);
1169  }
1170 
1171  return true;
1172 }
1173 
1175  // TODO: fix the validation for the DPDK platform
1176  if (platform_ == AgentParam::VROUTER_ON_HOST_DPDK)
1177  return 0;
1178 
1179  // Validate vhost interface name
1180  if (vhost_.name_ == "") {
1181  LOG(ERROR, "Configuration error. vhost interface name not specified");
1182  return (EINVAL);
1183  }
1184 
1185  bool no_arp;
1186  string encap;
1187  // Check if interface is already present
1188  if (ValidateInterface(test_mode_, vhost_.name_, &no_arp, &encap) == false) {
1189  return (ENODEV);
1190  }
1191 
1192  // Validate ethernet port
1193  if (eth_port_list_.empty()) {
1194  LOG(ERROR, "Configuration error. eth_port not specified");
1195  return (EINVAL);
1196  }
1197 
1198  // Check if interface is already present
1199  std::vector<std::string>::iterator iter;
1200  for (iter = eth_port_list_.begin(); iter != eth_port_list_.end(); iter++) {
1201  if (ValidateInterface(test_mode_, *iter, &eth_port_no_arp_,
1202  &eth_port_encap_type_) == false) {
1203  return (ENODEV);
1204  }
1205  }
1206 
1207  if (crypt_port_ != "") {
1208  // Check if interface is already present
1209  if (ValidateInterface(test_mode_, crypt_port_, &crypt_port_no_arp_,
1210  &crypt_port_encap_type_) == false) {
1211  return (ENODEV);
1212  }
1213  }
1214 
1215  // Validate physical port used in vmware
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");
1220  return (EINVAL);
1221  }
1222 
1223  if (ValidateInterface(test_mode_, vmware_physical_port_, &no_arp,
1224  &encap) == false) {
1225  return (ENODEV);
1226  }
1227  }
1228 
1229  return 0;
1230 }
1231 
1233  // Set the prefix address for VHOST and XENLL interfaces
1234  uint32_t mask = vhost_.plen_ ? (0xFFFFFFFF << (32 - vhost_.plen_)) : 0;
1235  vhost_.prefix_ = Ip4Address(vhost_.addr_.to_ulong() & mask);
1236 
1237  mask = xen_ll_.plen_ ? (0xFFFFFFFF << (32 - xen_ll_.plen_)) : 0;
1238  xen_ll_.prefix_ = Ip4Address(xen_ll_.addr_.to_ulong() & mask);
1239 }
1240 
1241 bool AgentParam::IsConfiguredTsnHostRoute(std::string addr) const {
1242  return (std::find(tsn_server_list_.begin(), tsn_server_list_.end(), addr) !=
1243  tsn_server_list_.end());
1244 }
1245 
1246 void AgentParam::Init(const string &config_file, const string &program_name) {
1247 
1248  config_file_ = config_file;
1249  program_name_ = program_name;
1250  InitFromSystem();
1251  InitFromConfig();
1252  ProcessArguments();
1253  InitVhostAndXenLLPrefix();
1254  UpdateBgpAsaServicePortRangeValue();
1255  ComputeFlowAndFileLimits();
1256  ComputeVrWatermark();
1257  vgw_config_table_->InitFromConfig(tree_);
1258 }
1259 
1261  ReInitFromConfig();
1262 }
1263 
1265  DebugInitFromConfig();
1266 }
1267 
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 + " ";
1275  }
1276  LOG(DEBUG, "Xmpp Servers : " << concat_servers);
1277 
1278  concat_servers.clear();
1279  list = dns_server_list();
1280  for (iter = list.begin();
1281  iter != list.end(); iter++) {
1282  concat_servers += *iter + " ";
1283  }
1284  LOG(DEBUG, "DNS Servers : " << concat_servers);
1285 
1286  list = tsn_server_list();
1287  concat_servers.clear();
1288  for (iter = list.begin();
1289  iter != list.end(); iter++) {
1290  concat_servers += *iter + " ";
1291  }
1292  LOG(DEBUG, "TSN Servers : " << concat_servers);
1293 
1294  concat_servers.clear();
1295  list = collector_server_list();
1296  for (iter = list.begin();
1297  iter != list.end(); iter++) {
1298  concat_servers += *iter + " ";
1299  }
1300  LOG(DEBUG, "COLLECTOR Servers : " << concat_servers);
1301 }
1302 
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 + " ";
1312  }
1313  LOG(DEBUG, "Ethernet ports : " << eth_port_list);
1314  LOG(DEBUG, "Loopback IP : " << loopback_ip_.to_string());
1315 
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 + " ";
1321  }
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_);
1328  }
1329  LOG(DEBUG, "Cluster-Name : " << subcluster_name_);
1330 
1331  concat_servers.clear();
1332  list = dns_server_list();
1333  for (iter = list.begin();
1334  iter != list.end(); iter++) {
1335  concat_servers += *iter + " ";
1336  }
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_);
1346  }
1347 
1348  concat_servers.clear();
1349  list = tsn_server_list();
1350  for (iter = list.begin();
1351  iter != list.end(); iter++) {
1352  concat_servers += *iter + " ";
1353  }
1354  LOG(DEBUG, "TSN Servers : " << concat_servers);
1355  concat_servers.clear();
1356 
1357  list = collector_server_list();
1358  for (iter = list.begin();
1359  iter != list.end(); iter++) {
1360  concat_servers += *iter + " ";
1361  }
1362  LOG(DEBUG, "COLLECTOR Servers : " << concat_servers);
1363 
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_);
1374  }
1375 
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_);
1395 
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");
1402 
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");
1411 
1412  LOG(DEBUG, "DHCP Relay Mode : " << dhcp_relay_mode_);
1413  if (simulate_evpn_tor_) {
1414  LOG(DEBUG, "Simulate EVPN TOR : " << simulate_evpn_tor_);
1415  }
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_);
1425 
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);
1433 
1434  if (hypervisor_mode_ == MODE_KVM) {
1435  LOG(DEBUG, "Hypervisor mode : kvm");
1436  return;
1437  }
1438 
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_);
1444  }
1445 
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");
1451  } else {
1452  LOG(DEBUG, "Vmware mode : Esxi_Neutron");
1453  }
1454  }
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_);
1458 }
1459 
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");
1464  }
1465 
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");
1470  }
1471  else {
1472  LOG(DEBUG, "Platform mode : Vrouter on host linux kernel ");
1473  }
1474 }
1475 
1476 void AgentParam::set_test_mode(bool mode) {
1477  test_mode_ = mode;
1478 }
1479 
1481 (const boost::program_options::options_description &opt) {
1482  options_.add(opt);
1483 }
1484 
1486 (const boost::program_options::options_description &opt) {
1487  config_file_options_.add(opt);
1488 }
1489 
1490 void AgentParam::ParseArguments(int argc, char *argv[]) {
1491  boost::program_options::store(opt::parse_command_line(argc, argv, options_),
1492  var_map_);
1493  boost::program_options::notify(var_map_);
1494 }
1495 
1496 AgentParam::AgentParam(bool enable_flow_options,
1497  bool enable_vhost_options,
1498  bool enable_hypervisor_options,
1499  bool enable_service_options,
1500  AgentMode agent_mode) :
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),
1508  agent_name_(),
1509  eth_port_no_arp_(false), eth_port_encap_type_(),
1510  crypt_port_(), crypt_port_no_arp_(true), crypt_port_encap_type_(),
1511  subcluster_name_(),
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_(),
1529  log_file_(), log_files_count_(kLogFilesCount),
1530  log_file_size_(kLogFileSize),
1531  log_local_(false), log_flow_(false), log_level_(),
1532  log_category_(), use_syslog_(false),
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_(),
1538  vgw_config_table_(new VirtualGatewayConfigTable() ),
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),
1550  agent_base_dir_(),
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),
1562  sandesh_config_(),
1563  restart_backup_enable_(false),
1564  restart_backup_idle_timeout_(CFG_BACKUP_IDLE_TIMEOUT),
1565  restart_backup_dir_(CFG_BACKUP_DIR),
1566  restart_backup_count_(CFG_BACKUP_COUNT),
1567  restart_restore_enable_(true),
1568  restart_restore_audit_timeout_(CFG_RESTORE_AUDIT_TIMEOUT),
1569  huge_page_file_1G_(),
1570  huge_page_file_2M_(),
1571  ksync_thread_cpu_pin_policy_(),
1572  tbb_thread_count_(Agent::kMaxTbbThreads),
1573  tbb_exec_delay_(0),
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),
1579  llgr_params_(),
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),
1590  loopback_ip_(), gateway_list_(AddressList(1, Ip4Address(0))) {
1591 
1592  uint32_t default_pkt0_tx_buffers = Agent::kPkt0TxBufferCount;
1593  uint32_t default_stale_interface_cleanup_timeout = Agent::kDefaultStaleInterfaceCleanupTimeout;
1594  uint32_t default_flow_update_tokens = Agent::kFlowUpdateTokens;
1595  uint32_t default_flow_del_tokens = Agent::kFlowDelTokens;
1596  uint32_t default_flow_ksync_tokens = Agent::kFlowKSyncTokens;
1597  uint32_t default_flow_add_tokens = Agent::kFlowAddTokens;
1598  uint32_t default_tbb_keepawake_timeout = Agent::kDefaultTbbKeepawakeTimeout;
1599  uint32_t default_tbb_thread_count = Agent::kMaxTbbThreads;
1600  uint32_t default_mac_learning_thread_count = Agent::kDefaultFlowThreadCount;
1601  uint32_t default_mac_learning_add_tokens = Agent::kMacLearningDefaultTokens;
1602  uint32_t default_mac_learning_update_tokens = Agent::kMacLearningDefaultTokens;
1603  uint32_t default_mac_learning_delete_tokens = Agent::kMacLearningDefaultTokens;
1604  uint16_t default_fabric_snat_table_size = Agent::kFabricSnatTableSize;
1605 
1606  // Set common command line arguments supported
1607  boost::program_options::options_description generic("Generic options");
1608  generic.add_options()
1609  ("help", "help message")
1610  ("config_file",
1611  opt::value<string>()->default_value(Agent::config_file_),
1612  "Configuration file")
1613  ("version", "Display version information")
1614  ;
1615  opt::options_description debug("Debug options");
1616  debug.add_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");
1797  options_.add(debug);
1798  config_file_options_.add(debug);
1799 
1800 
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",
1814  opt::value<uint16_t>()->default_value(Agent::kDefaultFlowCacheTimeout),
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")
1821  ("DEFAULT.dhcp_relay_mode", opt::bool_switch(&dhcp_relay_mode_),
1822  "Enable / Disable DHCP relay of DHCP packets from virtual instance")
1823  ("DEFAULT.agent_name", opt::value<string>(),
1824  "Agent Name")
1825  ("DEFAULT.http_server_port",
1826  opt::value<uint16_t>()->default_value(ContrailPorts::HttpPortAgent()),
1827  "Sandesh HTTP listener port")
1828  ("DEFAULT.rest_port",
1829  opt::value<uint16_t>()->default_value(ContrailPorts::PortIpcVrouterAgentPort()),
1830  "REST Server 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")
1839  ("DNS.servers",
1840  opt::value<vector<string> >()->multitoken(),
1841  "List of IPAddress:Port of DNS node Servers")
1842  ("DEFAULT.xmpp_auth_enable", opt::bool_switch(&xmpp_auth_enable_),
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",
1850  opt::value<uint16_t>()->default_value(Agent::kDefaultVmiVmVnUveInterval),
1851  "UVE send interval in seconds")
1852  ("DNS.dns_timeout", opt::value<uint32_t>()->default_value(3000),
1853  "DNS Timeout")
1854  ("DNS.dns_max_retries", opt::value<uint32_t>()->default_value(2),
1855  "Dns Max Retries")
1856  ("DNS.dns_client_port",
1857  opt::value<uint16_t>()->default_value(ContrailPorts::VrouterAgentDnsClientUdpPort()),
1858  "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")
1871  ("DEFAULT.xmpp_dns_auth_enable", opt::bool_switch(&xmpp_dns_auth_enable_),
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",
1876  opt::value<uint16_t>()->default_value(ContrailPorts::MetadataProxyVrouterAgentPort()),
1877  "Metadata proxy port ")
1878  ("METADATA.metadata_use_ssl", opt::bool_switch(&metadata_use_ssl_),
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),
1896  "mock dpdk")
1897  ("AGENT-TEST-FRAMEWORK.ksocketdir",
1898  opt::value<string>()->default_value("/tmp/"),
1899  "ksocket directory")
1900  ("DEFAULT.subnet_hosts_resolvable",
1901  opt::bool_switch(&subnet_hosts_resolvable_)->default_value(true))
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",
1911  opt::value<uint16_t>()->default_value(ContrailPorts::VrouterAgentMirrorClientUdpPort()),
1912  "Mirror client Port")
1913  ("DEFAULT.simulate_evpn_tor", opt::bool_switch(&simulate_evpn_tor_),
1914  "Simulate Evpn Tor")
1915  ("DEFAULT.measure_queue_delay", opt::bool_switch(&measure_queue_delay_),
1916  "Measure flow queue delay")
1917  ("NEXTHOP-SERVER.endpoint", opt::value<string>(),
1918  "Nexthop Server Endpoint")
1919  ("NEXTHOP-SERVER.add_pid", opt::bool_switch(&nexthop_server_add_pid_),
1920  "Enable Nh Sever Pid")
1921  ("DEFAULT.mvpn_ipv4_enable", opt::bool_switch(&mvpn_ipv4_enable_),
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")
1925  ;
1926  options_.add(generic).add(config);
1927  config_file_options_.add(config);
1928 
1929  opt::options_description restart("Restart options");
1930  restart.add_options()
1931  ("RESTART.backup_enable",
1932  opt::bool_switch(&restart_backup_enable_)->default_value(false),
1933  "Enable backup of config and resources into a file")
1934  ("RESTART.backup_idle_timeout", opt::value<uint64_t>()->default_value(CFG_BACKUP_IDLE_TIMEOUT),
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")
1940  ("RESTART.restore_enable", opt::bool_switch(&restart_restore_enable_)->default_value(true),
1941  "Enable restore of config and resources from backup files")
1942  ("RESTART.restore_audit_timeout", opt::value<uint64_t>()->default_value(CFG_RESTORE_AUDIT_TIMEOUT),
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");
1950  options_.add(restart);
1951  config_file_options_.add(restart);
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");
1956  log.add_options()
1957  ("DEFAULT.log_category", opt::value<string>()->default_value(""),
1958  "Category filter for local logging of sandesh messages")
1959  ("DEFAULT.log_file",
1960  opt::value<string>()->default_value(Agent::GetInstance()->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");
1988  options_.add(log);
1989  config_file_options_.add(log);
1990 
1991  if (enable_flow_options_) {
1992  opt::options_description flow("Flow options");
1993  flow.add_options()
1994  ("FLOWS.thread_count", opt::value<uint16_t>()->default_value(Agent::kDefaultFlowThreadCount),
1995  "Number of threads for flow setup")
1996  ("FLOWS.max_system_linklocal_flows", opt::value<uint16_t>()->default_value(Agent::kDefaultMaxLinkLocalOpenFds),
1997  "Maximum number of link-local flows allowed across all VMs")
1998  ("FLOWS.max_vm_linklocal_flows", opt::value<uint16_t>()->default_value(Agent::kDefaultMaxLinkLocalOpenFds),
1999  "Maximum number of link-local flows allowed per VM")
2000  ("FLOWS.trace_enable", opt::bool_switch(&flow_trace_enable_)->default_value(true),
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")
2012  ("FLOWS.index_sm_log_count", opt::value<uint16_t>()->default_value(Agent::kDefaultFlowIndexSmLogCount),
2013  "Index Sm Log Count")
2014  ("FLOWS.latency_limit", opt::value<uint16_t>()->default_value(Agent::kDefaultFlowLatencyLimit),
2015  "Latency Limit")
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")
2020  ("FLOWS.max_endpoints_per_session_msg", opt::value<uint16_t>()->default_value(Agent::kMaxSessionEndpoints),
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")
2024  ;
2025  options_.add(flow);
2026  config_file_options_.add(flow);
2027  }
2028 
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>")
2043  ;
2044  options_.add(hypervisor);
2045  config_file_options_.add(hypervisor);
2046  }
2047 
2048  if (enable_vhost_options_) {
2049  opt::options_description vhost("VHOST interface specific options");
2050  vhost.add_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")
2076  ;
2077  options_.add(vhost);
2078  config_file_options_.add(vhost);
2079  }
2080 
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")
2102  ;
2103  options_.add(service);
2104  config_file_options_.add(service);
2105  }
2106 
2107 
2108  opt::options_description tbb("TBB specific options");
2109  tbb.add_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>(),
2123  "CPU-ID to pin")
2124  ;
2125  options_.add(tbb);
2126  config_file_options_.add(tbb);
2127 
2128  opt::options_description sandesh("Sandesh specific options");
2130  options_.add(sandesh);
2132 
2133  opt::options_description llgr("LLGR");
2134  llgr.add_options()
2135  ("LLGR.disable", opt::value<bool>()->default_value(false),
2136  "Disable LLGR")
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")
2153  ;
2154  options_.add(llgr);
2155  config_file_options_.add(llgr);
2156 
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),
2160  "Thread Count")
2161  ("MAC-LEARNING.add_tokens", opt::value<uint32_t>()->default_value(default_mac_learning_add_tokens),
2162  "Add Tokens")
2163  ("MAC-LEARNING.del_tokens", opt::value<uint32_t>()->default_value(default_mac_learning_update_tokens),
2164  "Del Tokens")
2165  ("MAC-LEARNING.update_tokens", opt::value<uint32_t>()->default_value(default_mac_learning_delete_tokens),
2166  "Update Tokens")
2167  ;
2168  options_.add(mac_learn);
2169  config_file_options_.add(mac_learn);
2170 
2171  opt::options_description qos("Quality of Service options");
2172  qos.add_options()
2173  ("QOS.priority_tagging",
2174  opt::bool_switch(&qos_priority_tagging_)->default_value(true),
2175  "Enable Priority tagging")
2176  ;
2177  options_.add(qos);
2178  config_file_options_.add(qos);
2179 
2180  opt::options_description crypt("CRYPT");
2181  crypt.add_options()
2182  ("CRYPT.crypt_interface", opt::value<string>(),
2183  "Interface name to send data for encrypt")
2184  ;
2185  options_.add(crypt);
2186  config_file_options_.add(crypt);
2187 
2188 }
2189 
2191 }
2192 
2203 }
boost::system::error_code Ip4PrefixParse(const string &str, Ip4Address *addr, int *plen)
Definition: address.cc:107
boost::asio::ip::address_v4 Ip4Address
Definition: address.h:14
std::string AgentBackTrace(int skip=1)
Definition: agent.cc:1199
#define kLogFileSize
Definition: agent.h:311
#define CFG_RESTORE_AUDIT_TIMEOUT
Definition: agent.h:318
#define CFG_BACKUP_COUNT
Definition: agent.h:316
#define CFG_BACKUP_DIR
Definition: agent.h:315
#define CFG_BACKUP_IDLE_TIMEOUT
Definition: agent.h:317
#define kLogFilesCount
Definition: agent.h:310
static bool ValidateInterface(bool test_mode, const std::string &ifname, bool *no_arp, string *eth_encap)
bool ParseIp(const std::string &key, Ip4Address *server)
Definition: agent_param.cc:56
void ParseTestFrameworkArguments(const boost::program_options::variables_map &var_map)
Definition: agent_param.cc:816
void ComputeFlowAndFileLimits()
bool xmpp_auth_enable_
Definition: agent_param.h:766
void ParseVirtualHostArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:505
void ParseCryptArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:909
boost::program_options::options_description config_file_options_
Definition: agent_param.h:685
virtual void DebugInitFromConfig()
Definition: agent_param.cc:983
void ParseCollectorArguments(const boost::program_options::variables_map &var_map)
Definition: agent_param.cc:413
virtual void InitFromConfig()
Definition: agent_param.cc:933
void LogFilteredConfig() const
void ParseLlgrArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:879
virtual void ReInitFromConfig()
Definition: agent_param.cc:998
void ParseDnsArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:542
bool dhcp_relay_mode_
Definition: agent_param.h:765
bool metadata_use_ssl_
Definition: agent_param.h:722
void AddOptions(const boost::program_options::options_description &opt)
void ParseFlowArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:689
void ParseControllerServersArguments(const boost::program_options::variables_map &var_map)
Definition: agent_param.cc:424
void InitVhostAndXenLLPrefix()
void ParseAgentInfoArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:732
bool ParseServerList(const std::string &key, Ip4Address *s1, Ip4Address *s2)
bool restart_backup_enable_
Definition: agent_param.h:809
void UpdateBgpAsaServicePortRangeValue()
void DebugInit()
void ParseServiceInstanceArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:745
void ParseSessionDestinationArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:369
void ComputeVrWatermark()
void ParseQueue()
Definition: agent_param.cc:309
void SplitByDelimiter(const std::string &txt, std::vector< std::string > &strs, char ch)
Definition: agent_param.cc:770
const std::string log_file() const
Definition: agent_param.h:288
void ParseNetworksArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:549
bool enable_flow_options_
Definition: agent_param.h:686
bool use_syslog_
Definition: agent_param.h:751
void BuildAddressList(const std::string &val)
Definition: agent_param.cc:262
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_
Definition: agent_param.h:689
bool measure_queue_delay_
Definition: agent_param.h:697
bool ParseAddress(const std::string &addr_string, Ip4Address *server, uint16_t *port)
Definition: agent_param.cc:103
void set_agent_mode(const std::string &mode)
Definition: agent_param.cc:285
void ParseTaskSectionArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:653
std::vector< Ip4Address > AddressList
Definition: agent_param.h:117
void ParseIpArgument(const boost::program_options::variables_map &var_map, Ip4Address &server, const std::string &key)
Definition: agent_param.cc:154
SandeshConfig sandesh_config_
Definition: agent_param.h:806
bool eth_port_no_arp_
Definition: agent_param.h:703
bool nexthop_server_add_pid_
Definition: agent_param.h:785
bool log_flow_
Definition: agent_param.h:746
virtual void ProcessArguments()
Definition: agent_param.cc:954
bool flow_trace_enable_
Definition: agent_param.h:793
void set_gateway_mode(const std::string &mode)
Definition: agent_param.cc:297
void ParseDnsServersArguments(const boost::program_options::variables_map &var_map)
Definition: agent_param.cc:436
bool xmpp_dns_auth_enable_
Definition: agent_param.h:770
bool subnet_hosts_resolvable_
Definition: agent_param.h:799
bool GetIpAddress(const std::string &str, Ip4Address *addr)
Definition: agent_param.cc:46
virtual int Validate()
bool ParseServerListArguments(const boost::program_options::variables_map &var_map, Ip4Address &server1, Ip4Address &server2, const std::string &key)
boost::program_options::options_description options_
Definition: agent_param.h:684
void ParseDefaultSectionArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:603
void ParseHypervisorArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:554
void ParseArguments(int argc, char *argv[])
void set_test_mode(bool mode)
void ParseDhcpRelayModeArguments(const boost::program_options::variables_map &var_map)
Definition: agent_param.cc:722
virtual void InitFromSystem()
Definition: agent_param.cc:916
bool simulate_evpn_tor_
Definition: agent_param.h:774
bool enable_hypervisor_options_
Definition: agent_param.h:688
void ParseServicesArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:838
@ VROUTER_ON_HOST_DPDK
Definition: agent_param.h:151
void ParseMacLearning(const boost::program_options::variables_map &v)
Definition: agent_param.cc:897
static std::map< string, std::map< string, string > > ParseDerivedStats(const std::vector< std::string > &dsvec)
Definition: agent_param.cc:225
void Init(const std::string &config_file, const std::string &program_name)
void ParseSimulateEvpnTorArguments(const boost::program_options::variables_map &var_map)
Definition: agent_param.cc:727
void LogConfig() const
void ParseSandeshArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:847
void ConfigAddOptions(const boost::program_options::options_description &opt)
bool restart_restore_enable_
Definition: agent_param.h:818
void ParseCollectorDSArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:459
void ParseMetadataProxyArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:671
void UpdateBgpAsaServicePortRange()
void ReInit()
void ParseRestartArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:852
void ParseNexthopServerArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:758
bool IsConfiguredTsnHostRoute(std::string addr) const
bool enable_vhost_options_
Definition: agent_param.h:687
void ParsePlatformArguments(const boost::program_options::variables_map &v)
Definition: agent_param.cc:786
void BuildAddrList(const std::string &val, AddressList &addr_list)
Definition: agent_param.cc:469
bool qos_priority_tagging_
Definition: agent_param.h:834
bool mvpn_ipv4_enable_
Definition: agent_param.h:846
void ParseTsnServersArguments(const boost::program_options::variables_map &var_map)
Definition: agent_param.cc:447
virtual ~AgentParam()
bool log_local_
Definition: agent_param.h:745
Definition: agent.h:360
static const uint32_t kFlowUpdateTokens
Definition: agent.h:388
static const uint32_t kPkt0TxBufferCount
Definition: agent.h:380
static const uint32_t kFlowAddTokens
Definition: agent.h:385
static const uint32_t kDefaultFlowCacheTimeout
Definition: agent.h:368
static const uint32_t kDefaultFlowIndexSmLogCount
Definition: agent.h:370
static const uint32_t kDefaultStaleInterfaceCleanupTimeout
Definition: agent.h:382
static const uint32_t kMaxOtherOpenFds
Definition: agent.h:364
static const uint16_t kFabricSnatTableSize
Definition: agent.h:396
static const uint32_t kFlowKSyncTokens
Definition: agent.h:386
static const uint8_t kMaxSessions
Definition: agent.h:395
static const uint16_t kDefaultVmiVmVnUveInterval
Definition: agent.h:384
static const uint32_t kDefaultFlowThreadCount
Definition: agent.h:372
static const std::string & NullString()
Definition: agent.h:439
static const uint32_t kDefaultFlowLatencyLimit
Definition: agent.h:374
static Agent * GetInstance()
Definition: agent.h:438
static const uint32_t kFlowDelTokens
Definition: agent.h:387
static const uint8_t kMaxSessionAggs
Definition: agent.h:394
static const uint32_t kDefaultTbbKeepawakeTimeout
Definition: agent.h:377
static const uint8_t kMaxSessionEndpoints
Definition: agent.h:393
static const std::string config_file_
Definition: agent.h:1656
static const uint32_t kMaxTbbThreads
Definition: agent.h:376
static const uint32_t kMaxBgpAsAServerSessions
Definition: agent.h:366
static const uint32_t kMacLearningDefaultTokens
Definition: agent.h:389
static const uint32_t kDefaultMaxLinkLocalOpenFds
Definition: agent.h:362
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()
uint8_t type
Definition: load_balance.h:2
static bool use_syslog_
Definition: logging.cc:20
#define LOG(_Level, _Msg)
Definition: logging.h:33
bool GetOptValueIfNotDefaulted(const boost::program_options::variables_map &var_map, ValueType &var, const std::string &val)
Definition: options_util.h:65
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)
Definition: string_util.h:71
static bool stringToIntegerList(std::string input, std::string seperator, std::vector< NumberType > &entries)
Definition: string_util.h:107
uint16_t end_of_rib_tx_inactivity_time_
Definition: agent_param.h:104
uint16_t config_inactivity_time_
Definition: agent_param.h:99
uint16_t stale_config_cleanup_time_
Definition: agent_param.h:96
static const int kEorTxInactivityTime
Definition: agent_param.h:24
uint16_t config_poll_time_
Definition: agent_param.h:98
uint16_t end_of_rib_rx_fallback_time_
Definition: agent_param.h:106
static const int kEorTxFallbackTimeOut
Definition: agent_param.h:23
static const int kEorRxFallbackTime
Definition: agent_param.h:25
static const int kEorTxPollTime
Definition: agent_param.h:22
uint16_t config_fallback_time_
Definition: agent_param.h:100
static const int kLlgrStaleTime
Definition: agent_param.h:26
static const int kConfigPollTime
Definition: agent_param.h:19
uint32_t llgr_stale_time_
Definition: agent_param.h:107
static const int kStaleConfigCleanupTime
Definition: agent_param.h:18
static const int kConfigInactivityTime
Definition: agent_param.h:20
static const int kConfigFallbackTimeOut
Definition: agent_param.h:21
uint16_t end_of_rib_tx_poll_time_
Definition: agent_param.h:102
uint16_t end_of_rib_tx_fallback_time_
Definition: agent_param.h:103