/*
- * Copyright (c) 2010, 2011, 2012 Nicira Networks.
+ * Copyright (c) 2010, 2011, 2012, 2013, 2015 Nicira, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "socket-util.h"
#include "timeval.h"
#include "util.h"
-#include "vlog.h"
+#include "openvswitch/vlog.h"
#define DEFAULT_PORT 6630
static double timeout;
-static const struct command all_commands[];
+static const struct ovs_cmdl_command *get_all_commands(void);
static void parse_options(int argc, char *argv[]);
static void usage(void);
+static int
+do_poll(struct pollfd *fds, int nfds, int timeout)
+{
+ int retval;
+#ifndef _WIN32
+ do {
+ retval = poll(fds, nfds, timeout);
+ } while (retval < 0 && errno == EINTR);
+#else
+ retval = WSAPoll(fds, nfds, timeout);
+#endif
+ return retval;
+}
+
static long long int
time_in_msec(void)
{
struct timeval tv;
- if (gettimeofday(&tv, NULL) < 0) {
- ovs_fatal(errno, "gettimeofday");
- }
+ xgettimeofday(&tv);
return tv.tv_sec * 1000LL + tv.tv_usec / 1000;
}
int
main(int argc, char *argv[])
{
+ struct ovs_cmdl_context ctx = { .argc = 0, };
set_program_name(argv[0]);
- vlog_set_levels(NULL, VLF_ANY_FACILITY, VLL_EMER);
+ vlog_set_levels(NULL, VLF_ANY_DESTINATION, VLL_EMER);
parse_options(argc, argv);
- run_command(argc - optind, argv + optind, all_commands);
+ ctx.argc = argc - optind;
+ ctx.argv = argv + optind;
+ ovs_cmdl_run_command(&ctx, get_all_commands());
return 0;
}
*min = *max = 0;
if (colon && colon[1] != '\0') {
const char *ports = colon + 1;
- if (sscanf(ports, "%hu-%hu", min, max) == 2) {
+ if (ovs_scan(ports, "%hu-%hu", min, max)) {
if (*min > *max) {
ovs_fatal(0, "%s: minimum is greater than maximum", s_);
}
- } else if (sscanf(ports, "%hu", min) == 1) {
+ } else if (ovs_scan(ports, "%hu", min)) {
*max = *min;
} else {
ovs_fatal(0, "%s: number or range expected", s_);
static void
parse_options(int argc, char *argv[])
{
- static struct option long_options[] = {
+ static const struct option long_options[] = {
{"local", required_argument, NULL, 'l'},
{"remote", required_argument, NULL, 'r'},
{"batches", required_argument, NULL, 'b'},
{"version", no_argument, NULL, 'V'},
{NULL, 0, NULL, 0},
};
- char *short_options = long_options_to_short_options(long_options);
+ char *short_options = ovs_cmdl_long_options_to_short_options(long_options);
local_addr.s_addr = htonl(INADDR_ANY);
local_min_port = local_max_port = 0;
}
static void
-cmd_listen(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+cmd_listen(struct ovs_cmdl_context *ctx OVS_UNUSED)
{
struct pollfd *fds;
int n_fds;
for (;;) {
int retval;
- do {
- retval = poll(fds, n_fds, -1);
- } while (retval < 0 && errno == EINTR);
+ retval = do_poll(fds, n_fds, -1);
if (retval < 0) {
ovs_fatal(errno, "poll failed");
}
}
static void
-cmd_rate(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+cmd_rate(struct ovs_cmdl_context *ctx OVS_UNUSED)
{
unsigned short int local_port;
unsigned short int remote_port;
long long int now;
long long int may_open;
int delay;
- int error;
+ int retval;
int j;
if (max_rate > 0) {
delay = 1000;
}
- do {
- error = poll(fds, n_fds, delay) < 0 ? errno : 0;
- } while (error == EINTR);
- if (error) {
+ retval = do_poll(fds, n_fds, delay);
+ if (retval < 0) {
ovs_fatal(errno, "poll");
}
printf("%.3f s elapsed, %u OK, %u failed, avg %.1f/s\n",
elapsed / 1000.0, completed - failures, failures,
completed / (elapsed / 1000.0));
+ fflush(stdout);
prev = now;
if (timeout && elapsed > timeout * 1000LL) {
}
}
}
+ free(fds);
}
static void
}
static void
-cmd_latency(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+cmd_latency(struct ovs_cmdl_context *ctx OVS_UNUSED)
{
unsigned short int local_port;
unsigned short int remote_port;
}
while (n_fds > 0) {
- int error;
+ int retval;
- do {
- error = poll(fds, n_fds, -1) < 0 ? errno : 0;
- } while (error == EINTR);
- if (error) {
+ retval = do_poll(fds, n_fds, -1);
+ if (retval < 0) {
ovs_fatal(errno, "poll");
}
}
static void
-cmd_help(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+cmd_help(struct ovs_cmdl_context *ctx OVS_UNUSED)
{
usage();
}
-static const struct command all_commands[] = {
- { "listen", 0, 0, cmd_listen },
- { "rate", 0, 0, cmd_rate },
- { "latency", 0, 0, cmd_latency },
- { "help", 0, 0, cmd_help },
- { NULL, 0, 0, NULL },
+static const struct ovs_cmdl_command all_commands[] = {
+ { "listen", NULL, 0, 0, cmd_listen },
+ { "rate", NULL, 0, 0, cmd_rate },
+ { "latency", NULL, 0, 0, cmd_latency },
+ { "help", NULL, 0, 0, cmd_help },
+ { NULL, NULL, 0, 0, NULL },
};
+
+static const struct ovs_cmdl_command *get_all_commands(void)
+{
+ return all_commands;
+}