summaryrefslogtreecommitdiffstats
path: root/src/bin/perfdhcp/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/perfdhcp/main.cc')
-rw-r--r--src/bin/perfdhcp/main.cc76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/bin/perfdhcp/main.cc b/src/bin/perfdhcp/main.cc
new file mode 100644
index 0000000..5262ace
--- /dev/null
+++ b/src/bin/perfdhcp/main.cc
@@ -0,0 +1,76 @@
+// Copyright (C) 2012-2021 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+
+#include <perfdhcp/avalanche_scen.h>
+#include <perfdhcp/basic_scen.h>
+#include <perfdhcp/command_options.h>
+
+#include <exceptions/exceptions.h>
+
+#include <iostream>
+#include <stdint.h>
+
+using namespace isc::perfdhcp;
+
+int
+main(int argc, char* argv[]) {
+ int ret_code = 0;
+ std::string diags;
+ bool parser_error = true;
+ try {
+ CommandOptions command_options;
+ diags = command_options.getDiags();
+ // If parser returns true it means that user specified
+ // 'h' or 'v' command line option. Program shows the
+ // help or version message and exits here.
+ // The third argument indicates that the command line
+ // should be printed when it gets parsed. This is useful
+ // in particular when the command line needs to be
+ // extracted from the log file.
+ if (command_options.parse(argc, argv, true)) {
+ return (ret_code);
+ }
+ parser_error = false;
+ auto scenario = command_options.getScenario();
+ PerfSocket socket(command_options);
+ if (scenario == Scenario::BASIC) {
+ BasicScen scen(command_options, socket);
+ ret_code = scen.run();
+ } else if (scenario == Scenario::AVALANCHE) {
+ AvalancheScen scen(command_options, socket);
+ ret_code = scen.run();
+ }
+ } catch (const std::exception& e) {
+ ret_code = 1;
+ if (!parser_error) {
+ std::cerr << std::endl << "ERROR: running perfdhcp: "
+ << e.what() << std::endl;
+ } else {
+ CommandOptions::usage();
+ std::cerr << std::endl << "ERROR: parsing command line options: "
+ << e.what() << std::endl;
+ }
+ if (diags.find('e') != std::string::npos) {
+ std::cerr << "Fatal error" << std::endl;
+ }
+ } catch (...) {
+ ret_code = 1;
+ if (!parser_error) {
+ std::cerr << std::endl << "ERROR: running perfdhcp"
+ << std::endl;
+ } else {
+ CommandOptions::usage();
+ std::cerr << std::endl << "ERROR: parsing command line options"
+ << std::endl;
+ }
+ if (diags.find('e') != std::string::npos) {
+ std::cerr << "Fatal error" << std::endl;
+ }
+ }
+ return (ret_code);
+}