Thanks, applied to master.
On Fri, Feb 05, 2016 at 04:42:51PM -0800, Jarno Rajahalme wrote: > Acked-by: Jarno Rajahalme <[email protected]> > > > On Feb 5, 2016, at 4:02 PM, Ben Pfaff <[email protected]> wrote: > > > > This utility was completely broken and no one noticed for the time of a > > full release, so I think that's a safe sign that we should remove it. > > > > Signed-off-by: Ben Pfaff <[email protected]> > > --- > > NEWS | 2 + > > debian/openvswitch-common.install | 1 - > > debian/openvswitch-common.manpages | 1 - > > rhel/openvswitch-fedora.spec.in | 6 +- > > rhel/openvswitch.spec.in | 4 +- > > utilities/.gitignore | 2 - > > utilities/automake.mk | 7 - > > utilities/ovs-benchmark.1.in | 198 ------------ > > utilities/ovs-benchmark.c | 634 > > ------------------------------------- > > xenserver/openvswitch-xen.spec.in | 4 +- > > 10 files changed, 6 insertions(+), 853 deletions(-) > > delete mode 100644 utilities/ovs-benchmark.1.in > > delete mode 100644 utilities/ovs-benchmark.c > > > > diff --git a/NEWS b/NEWS > > index c133838..3e33871 100644 > > --- a/NEWS > > +++ b/NEWS > > @@ -10,6 +10,8 @@ Post-v2.5.0 > > - DPDK: > > * New option "n_rxq" for PMD interfaces. > > Old 'other_config:n-dpdk-rxqs' is no longer supported. > > + - ovs-benchmark: This utility has been removed due to lack of use and > > + bitrot. > > > > > > v2.5.0 - xx xxx xxxx > > diff --git a/debian/openvswitch-common.install > > b/debian/openvswitch-common.install > > index 0bbec39..3264ea5 100644 > > --- a/debian/openvswitch-common.install > > +++ b/debian/openvswitch-common.install > > @@ -1,6 +1,5 @@ > > etc/bash_completion.d/ovs-appctl-bashcomp.bash > > usr/bin/ovs-appctl > > -usr/bin/ovs-benchmark > > usr/bin/ovs-docker > > usr/bin/ovs-ofctl > > usr/bin/ovs-parse-backtrace > > diff --git a/debian/openvswitch-common.manpages > > b/debian/openvswitch-common.manpages > > index 6a543d4..9ac6a1d 100644 > > --- a/debian/openvswitch-common.manpages > > +++ b/debian/openvswitch-common.manpages > > @@ -2,7 +2,6 @@ ovsdb/ovsdb-client.1 > > ovsdb/ovsdb-tool.1 > > utilities/bugtool/ovs-bugtool.8 > > utilities/ovs-appctl.8 > > -utilities/ovs-benchmark.1 > > utilities/ovs-ofctl.8 > > utilities/ovs-parse-backtrace.8 > > utilities/ovs-pki.8 > > diff --git a/rhel/openvswitch-fedora.spec.in > > b/rhel/openvswitch-fedora.spec.in > > index e655665..22cdaf1 100644 > > --- a/rhel/openvswitch-fedora.spec.in > > +++ b/rhel/openvswitch-fedora.spec.in > > @@ -1,6 +1,6 @@ > > # Spec file for Open vSwitch. > > > > -# Copyright (C) 2009, 2010, 2013, 2014, 2015 Nicira Networks, Inc. > > +# Copyright (C) 2009, 2010, 2013, 2014, 2015, 2016 Nicira Networks, Inc. > > # > > # Copying and distribution of this file, with or without modification, > > # are permitted in any medium without royalty provided the copyright > > @@ -164,12 +164,10 @@ touch > > $RPM_BUILD_ROOT%{_sysconfdir}/openvswitch/conf.db > > touch $RPM_BUILD_ROOT%{_sysconfdir}/openvswitch/system-id.conf > > > > # remove unpackaged files > > -rm -f $RPM_BUILD_ROOT%{_bindir}/ovs-benchmark \ > > - $RPM_BUILD_ROOT%{_bindir}/ovs-parse-backtrace \ > > +rm -f $RPM_BUILD_ROOT%{_bindir}/ovs-parse-backtrace \ > > $RPM_BUILD_ROOT%{_bindir}/ovs-pcap \ > > $RPM_BUILD_ROOT%{_bindir}/ovs-tcpundump \ > > $RPM_BUILD_ROOT%{_sbindir}/ovs-vlan-bug-workaround \ > > - $RPM_BUILD_ROOT%{_mandir}/man1/ovs-benchmark.1 \ > > $RPM_BUILD_ROOT%{_mandir}/man1/ovs-pcap.1 \ > > $RPM_BUILD_ROOT%{_mandir}/man1/ovs-tcpundump.1 \ > > $RPM_BUILD_ROOT%{_mandir}/man8/ovs-vlan-bug-workaround.8 \ > > diff --git a/rhel/openvswitch.spec.in b/rhel/openvswitch.spec.in > > index a1f9b18..05b9e4d 100644 > > --- a/rhel/openvswitch.spec.in > > +++ b/rhel/openvswitch.spec.in > > @@ -1,6 +1,6 @@ > > # Spec file for Open vSwitch on Red Hat Enterprise Linux. > > > > -# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. > > +# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc. > > # > > # Copying and distribution of this file, with or without modification, > > # are permitted in any medium without royalty provided the copyright > > @@ -132,7 +132,6 @@ exit 0 > > /etc/sysconfig/network-scripts/ifup-ovs > > /etc/sysconfig/network-scripts/ifdown-ovs > > /usr/bin/ovs-appctl > > -/usr/bin/ovs-benchmark > > /usr/bin/ovs-dpctl > > /usr/bin/ovs-dpctl-top > > /usr/bin/ovs-docker > > @@ -149,7 +148,6 @@ exit 0 > > /usr/sbin/ovs-bugtool > > /usr/sbin/ovs-vswitchd > > /usr/sbin/ovsdb-server > > -/usr/share/man/man1/ovs-benchmark.1.gz > > /usr/share/man/man1/ovs-pcap.1.gz > > /usr/share/man/man1/ovs-tcpundump.1.gz > > /usr/share/man/man1/ovsdb-client.1.gz > > diff --git a/utilities/.gitignore b/utilities/.gitignore > > index 1d59e28..10cb4af 100644 > > --- a/utilities/.gitignore > > +++ b/utilities/.gitignore > > @@ -3,8 +3,6 @@ > > /nlmon > > /ovs-appctl > > /ovs-appctl.8 > > -/ovs-benchmark > > -/ovs-benchmark.1 > > /ovs-cfg-mod > > /ovs-cfg-mod.8 > > /ovs-check-dead-ifs > > diff --git a/utilities/automake.mk b/utilities/automake.mk > > index d08347e..674d326 100644 > > --- a/utilities/automake.mk > > +++ b/utilities/automake.mk > > @@ -59,7 +59,6 @@ EXTRA_DIST += \ > > utilities/qemu-wrap.py > > MAN_ROOTS += \ > > utilities/ovs-appctl.8.in \ > > - utilities/ovs-benchmark.1.in \ > > utilities/ovs-testcontroller.8.in \ > > utilities/ovs-ctl.8 \ > > utilities/ovs-dpctl.8.in \ > > @@ -78,7 +77,6 @@ MAN_FRAGMENTS += utilities/ovs-vlan-bugs.man > > DISTCLEANFILES += \ > > utilities/ovs-appctl.8 \ > > utilities/ovs-ctl \ > > - utilities/ovs-benchmark.1 \ > > utilities/ovs-check-dead-ifs \ > > utilities/ovs-testcontroller.8 \ > > utilities/ovs-dpctl.8 \ > > @@ -106,7 +104,6 @@ DISTCLEANFILES += \ > > > > man_MANS += \ > > utilities/ovs-appctl.8 \ > > - utilities/ovs-benchmark.1 \ > > utilities/ovs-ctl.8 \ > > utilities/ovs-testcontroller.8 \ > > utilities/ovs-dpctl.8 \ > > @@ -149,10 +146,6 @@ utilities_nlmon_SOURCES = utilities/nlmon.c > > utilities_nlmon_LDADD = lib/libopenvswitch.la > > endif > > > > -bin_PROGRAMS += utilities/ovs-benchmark > > -utilities_ovs_benchmark_SOURCES = utilities/ovs-benchmark.c > > -utilities_ovs_benchmark_LDADD = lib/libopenvswitch.la > > - > > FLAKE8_PYFILES += utilities/ovs-pcap.in > > > > include utilities/bugtool/automake.mk > > diff --git a/utilities/ovs-benchmark.1.in b/utilities/ovs-benchmark.1.in > > deleted file mode 100644 > > index 97e9d32..0000000 > > --- a/utilities/ovs-benchmark.1.in > > +++ /dev/null > > @@ -1,198 +0,0 @@ > > -.\" -*- nroff -*- > > -.so lib/ovs.tmac > > -.TH ovs\-benchmark 1 "@VERSION@" "Open vSwitch" "Open vSwitch Manual" > > -. > > -.SH NAME > > -ovs\-benchmark \- flow setup benchmark utility for Open vSwitch > > -. > > -.SH SYNOPSIS > > -. > > -.SY ovs\-benchmark\ latency > > -\fB\-\-remote \fIip\fR[\fB:\fIports\fR] > > -.OP \-\-sockets nsocks > > -.OP \-\-batches nbatches > > -.OP \-\-local \fR[\fIip\fR][\fB:\fIports\fR] > > -.YS > > -. > > -.SY ovs\-benchmark\ rate > > -\fB\-\-remote \fIip\fR[\fB:\fIports\fR] > > -.OP \-\-max\-rate rate > > -.OP \-\-timeout maxsecs > > -.OP \-\-sockets nsocks > > -.OP \-\-batches nbatches > > -.OP \-\-local \fR[\fIip\fR][\fB:\fIports\fR] > > -.YS > > -. > > -.SY ovs\-benchmark\ listen > > -.OP \-\-local \fR[\fIip\fR]\fB:\fIports > > -.YS > > -. > > -.SY ovs\-benchmark\ help > > -.YS > > -. > > -.SH DESCRIPTION > > -\fBovs\-benchmark\fR tests the performance of Open vSwitch flow setup > > -by setting up a number of TCP connections and measuring the time > > -required. It can also be used with the Linux bridge or without any > > -bridging software, which allows one to measure the bandwidth and > > -latency cost of bridging. > > -.PP > > -Each \fBovs\-benchmark\fR command is described separately below. > > -. > > -.SH "The ``latency'' command" > > -. > > -.PP > > -This command initiates \fInsocks\fR TCP connections (by default, 100) > > -as quickly as possible, waits for each one to complete with success or > > -failure, and prints a bar chart of completion times on standard > > -output, followed by a summary line. Each line in the bar chart lists > > -a time to connection completion in milliseconds followed by a number > > -of \fB.\fR or \fB!\fR symbols, one for each TCP connection that > > -completed in that many milliseconds. A successful connection prints a > > -\fB.\fR, and an unsuccessful connection (e.g. to a port on which no > > -process is listening) prints a \fB!\fR. > > -. > > -.PP > > -If \fInbatches\fR is given, the entire procedure is repeated the > > -specified number of times. Only a single summary line is printed at > > -the end. > > -. > > -.PP > > -Results vary widely based on the number of sockets and whether the > > -remote host is listening for connections on the specified ports. With > > -a small number of sockets, all connection times typically remain > > -within a handful of milliseconds. As the number of sockets increases, > > -the distribution of connection times clusters around the sending TCP > > -stack's SYN retransmission interval. (This pattern occurs with or > > -without Open vSwitch on the network path.) > > -. > > -.SH "The ``rate'' command" > > -. > > -.PP > > -This command initiates \fInsocks\fR TCP connections (by default, 100) > > -as quickly as possible (limited by \fImaxrate\fR, if > > -\fB\-\-max\-rate\fR is specified). Each time a connection completes > > -with success or failure, it closes that connection and initiates a new > > -one. It continues to do so either forever or, if \fB\-\-timeout\fR is > > -specified, until \fImaxsecs\fR seconds have elapsed. During the test, > > -it prints statistics about time elapsed, successful and unsuccessful > > -connections, and the average number of completed (succeeded or failed) > > -connections per second over the run. > > -. > > -.PP > > -Without \fB\-\-max\-rate\fR, the \fBrate\fR command measures the > > -maximum sustained flow setup rate for an Open vSwitch instance. This > > -naturally tends to drive \fBovs\-vswitchd\fR CPU usage to 100% on the > > -host receiving the traffic. > > -. > > -.PP > > -When \fB\-\-max\-rate\fR is specified with a value below the maximum > > -rate that an Open vSwitch instance can handle, then \fBrate\fR can > > -also be used to measure the kernel and userspace CPU cost of flow > > -setups at specific flow rates. > > -. > > -.PP > > -Results tend to fluctuate greatly for the first few seconds of a run, > > -then settle down. The displayed average is calculated over the entire > > -run and so tends to converge asymptotically on the ``correct'' value. > > -To converge more quickly, try running for 5 to 10 seconds, then > > -killing and restarting the run. > > -. > > -.SH "The ``listen'' command" > > -. > > -.PP > > -This command listens on one or more TCP ports for incoming > > -connections. It accepts connections and immediately closes them. It > > -can be paired with the \fBrate\fR or \fBlatency\fR commands for > > -observing effects of successful vs. unsuccessful TCP connections. > > -. > > -.PP > > -It is easier to reproduce and interpret \fBovs\-benchmark\fR results > > -when there is no listener (see \fBNOTES\fR below). > > -. > > -.SH "The ``help'' command" > > -. > > -.PP > > -Prints a usage message and exits successfully. > > -. > > -.SH OPTIONS > > -. > > -.IP "\fB\-r \fIip\fR[\fB:\fIports\fR]" > > -.IQ "\fB\-\-remote \fIip\fR[\fB:\fIports\fR]" > > -This option, required on \fBlatency\fR and \fBrate\fR commands, > > -minimally specifies the remote host to connect to (as an IP address or > > -DNS name) as \fIip\fR. > > -. > > -.IP > > -A TCP port or range of ports (separated by \fB\-\fR) may also be > > -specified. If a range is specified then each port in the range is > > -used in round-robin order. The default port is 6630 if none is > > -specified. > > -. > > -.IP "\fB\-l \fR[\fIip\fR][\fB:\fIports\fR]" > > -.IQ "\fB\-\-local \fR[\fIip\fR][\fB:\fIports\fR]" > > -On the \fBlatency\fR and \fBrate\fR, without this option, outgoing > > -connections will not bind a specific TCP port. The local TCP stack > > -will pick a local TCP port to bind. When this option is specified, > > -the specified port or range of ports will be used in turn. (If a port > > -range is specified on both \fB\-\-local\fR and \fB\-\-remote\fR, then > > -each local port in its range will be used before the remote port is > > -incremented to the next port in its range.) > > -. > > -.IP > > -On the \fBlisten\fR command, this option specifies the local port or > > -ports and IP addresses on which to listen. If it is omitted, port > > -6630 on any IP address is used. > > -. > > -.IP "\fB\-s \fInsocks\fR" > > -.IQ "\fB\-\-sockets \fInsocks\fR" > > -For \fBlatency\fR, sets the number of connections to initiate per > > -batch. For \fBrate\fR, sets the number of outstanding connections > > -attempts to maintain at any given time. The default is 100. > > -. > > -.IP "\fB\-b \fInbatches\fR" > > -.IQ "\fB\-\-batches \fInbatches\fR" > > -For \fBlatency\fR, sets the number of times to initiate and wait for > > -all of the connections to complete. The default is 1. > > -. > > -.IP "\fB\-c \fImaxrate\fR" > > -.IQ "\fB\-\-max\-rate \fImaxrate\fR" > > -For \fBrate\fR, caps the maximum rate at which connections will be > > -attempted to \fImaxrate\fR connections per second. By default there > > -is no limit. > > -. > > -.IP "\fB\-T \fImaxsecs\fR" > > -.IQ "\fB\-\-timeout \fImaxsecs\fR" > > -For \fBrate\fR, stops the benchmark after \fImaxsecs\fR seconds have > > -elapsed. By default, the benchmark continues until interrupted by a > > -signal. > > -. > > -.SH NOTES > > -.PP > > -\fBovs\-benchmark\fR uses standard POSIX socket calls for network > > -access, so it shares the strengths and limitations of TCP/IP and its > > -implementations in the local and remote TCP/IP stacks. Particularly, > > -TCP and its implementations limit the number of successfully completed > > -and then closed TCP connections. This means that \fBovs\-benchmark\fR > > -tests tend to slow down if run for long intervals or with large > > -numbers of sockets or batches, if the remote system is listening on > > -the port or ports being contacted. The problem does not occur when > > -the remote system is not listening. \fBovs\-benchmark\fR results are > > -therefore much more reliable and repeatable when the remote system is > > -not listening on the port or ports being contacted. Even a single > > -listening socket (e.g. range of ports 8000 to 9000 with one listener > > -on port 8080) can cause anomalies in results. > > -. > > -.PP > > -Be sure that the remote TCP/IP stack's firewall allows the benchmark's > > -traffic to be processed. For Open vSwitch benchmarking purposes, you > > -might want to disable the firewall with, e.g., \fBiptables \-F\fR. > > -. > > -.PP > > -\fBovs\-benchmark\fR is single-threaded. A multithreaded process > > -might be able to initiate connections more quickly. > > -. > > -.PP > > -A TCP connection consists of two flows (one in each direction), so > > -multiply the TCP connection statistics that \fBovs\-benchmark\fR > > -reports by 2 to get flow statistics. > > diff --git a/utilities/ovs-benchmark.c b/utilities/ovs-benchmark.c > > deleted file mode 100644 > > index ee593ff..0000000 > > --- a/utilities/ovs-benchmark.c > > +++ /dev/null > > @@ -1,634 +0,0 @@ > > -/* > > - * 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. > > - * You may obtain a copy of the License at: > > - * > > - * http://www.apache.org/licenses/LICENSE-2.0 > > - * > > - * Unless required by applicable law or agreed to in writing, software > > - * distributed under the License is distributed on an "AS IS" BASIS, > > - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. > > - * See the License for the specific language governing permissions and > > - * limitations under the License. > > - */ > > - > > -#include <config.h> > > - > > -#include <errno.h> > > -#include <getopt.h> > > -#include <limits.h> > > -#include <poll.h> > > -#include <stdlib.h> > > -#include <sys/socket.h> > > -#include <sys/time.h> > > -#include <stddef.h> > > -#include <unistd.h> > > - > > -#include "command-line.h" > > -#include "poll-loop.h" > > -#include "socket-util.h" > > -#include "timeval.h" > > -#include "util.h" > > -#include "openvswitch/vlog.h" > > - > > -#define DEFAULT_PORT 6630 > > - > > -#define MAX_SOCKETS 65535 > > -static int n_batches = 1; > > -static int n_sockets = 100; > > - > > -static struct in_addr local_addr; > > -static unsigned short int local_min_port, local_max_port; > > - > > -static struct in_addr remote_addr; > > -static unsigned short int remote_min_port, remote_max_port; > > - > > -static double max_rate; > > - > > -static double timeout; > > - > > -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; > > - > > - 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_DESTINATION, VLL_EMER); > > - parse_options(argc, argv); > > - ctx.argc = argc - optind; > > - ctx.argv = argv + optind; > > - ovs_cmdl_run_command(&ctx, get_all_commands()); > > - return 0; > > -} > > - > > -static void > > -parse_target(const char *s_, struct in_addr *addr, > > - unsigned short int *min, unsigned short int *max) > > -{ > > - char *s = xstrdup(s_); > > - char *colon; > > - int error; > > - > > - colon = strchr(s, ':'); > > - if (colon) { > > - *colon = '\0'; > > - } > > - > > - if (*s != '\0') { > > - error = lookup_hostname(s, addr); > > - if (error) { > > - ovs_fatal(error, "failed to look up IP address for \"%s\"", > > s_); > > - } > > - } else { > > - addr->s_addr = htonl(INADDR_ANY); > > - } > > - > > - *min = *max = 0; > > - if (colon && colon[1] != '\0') { > > - const char *ports = colon + 1; > > - if (ovs_scan(ports, "%hu-%hu", min, max)) { > > - if (*min > *max) { > > - ovs_fatal(0, "%s: minimum is greater than maximum", s_); > > - } > > - } else if (ovs_scan(ports, "%hu", min)) { > > - *max = *min; > > - } else { > > - ovs_fatal(0, "%s: number or range expected", s_); > > - } > > - } > > - > > - free(s); > > -} > > - > > -static void > > -parse_options(int argc, char *argv[]) > > -{ > > - static const struct option long_options[] = { > > - {"local", required_argument, NULL, 'l'}, > > - {"remote", required_argument, NULL, 'r'}, > > - {"batches", required_argument, NULL, 'b'}, > > - {"sockets", required_argument, NULL, 's'}, > > - {"max-rate", required_argument, NULL, 'c'}, > > - {"timeout", required_argument, NULL, 'T'}, > > - {"help", no_argument, NULL, 'h'}, > > - {"version", no_argument, NULL, 'V'}, > > - {NULL, 0, NULL, 0}, > > - }; > > - 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; > > - > > - remote_addr.s_addr = htonl(0); > > - remote_min_port = remote_max_port = 0; > > - > > - for (;;) { > > - int c; > > - > > - c = getopt_long(argc, argv, short_options, long_options, NULL); > > - if (c == -1) { > > - break; > > - } > > - > > - switch (c) { > > - case 'l': > > - parse_target(optarg, > > - &local_addr, &local_min_port, &local_max_port); > > - break; > > - > > - case 'r': > > - parse_target(optarg, > > - &remote_addr, &remote_min_port, &remote_max_port); > > - if (remote_addr.s_addr == htonl(INADDR_ANY)) { > > - ovs_fatal(0, "remote IP address is required"); > > - } > > - break; > > - > > - case 'b': > > - n_batches = atoi(optarg); > > - if (n_batches < 0) { > > - ovs_fatal(0, "--batches or -b argument must be at least > > 1"); > > - } > > - break; > > - > > - case 's': > > - n_sockets = atoi(optarg); > > - if (n_sockets < 1 || n_sockets > MAX_SOCKETS) { > > - ovs_fatal(0, "--sockets or -s argument must be between 1 " > > - "and %d (inclusive)", MAX_SOCKETS); > > - } > > - break; > > - > > - case 'c': > > - max_rate = atof(optarg); > > - if (max_rate <= 0.0) { > > - ovs_fatal(0, "--max-rate or -c argument must be positive"); > > - } > > - break; > > - > > - case 'T': > > - timeout = atoi(optarg); > > - if (!timeout) { > > - ovs_fatal(0, "-T or --timeout argument must be positive"); > > - } > > - break; > > - > > - case 'h': > > - usage(); > > - > > - case 'V': > > - ovs_print_version(0, 0); > > - exit(EXIT_SUCCESS); > > - > > - case '?': > > - exit(EXIT_FAILURE); > > - > > - default: > > - abort(); > > - } > > - } > > - free(short_options); > > -} > > - > > -static void > > -usage(void) > > -{ > > - printf("\ > > -%s: Open vSwitch flow setup benchmark utility\n\ > > -usage: %s [OPTIONS] COMMAND [ARG...]\n\ > > - latency connect many times all at once\n\ > > - rate measure sustained flow setup rate\n\ > > - listen accept TCP connections\n\ > > - help display this help message\n\ > > -\n\ > > -Command options:\n\ > > - -l, --local [IP][:PORTS] use local IP and range of PORTS\n\ > > - -r, --remote IP[:PORTS] connect to remote IP and PORTS\n\ > > - -s, --sockets N number of sockets for \"rate\" or > > \"latency\"\n\ > > - -b, --batches N number of connection batches for > > \"latency\"\n\ > > - -c, --max-rate NPERSEC connection rate limit for \"rate\"\n\ > > - -T, --timeout MAXSECS max number of seconds to run for \"rate\"\n\ > > -\n\ > > -Other options:\n\ > > - -h, --help display this help message\n\ > > - -V, --version display version information\n", > > - program_name, program_name); > > - exit(EXIT_SUCCESS); > > -} > > - > > -static void > > -cmd_listen(struct ovs_cmdl_context *ctx OVS_UNUSED) > > -{ > > - struct pollfd *fds; > > - int n_fds; > > - int port; > > - int i; > > - > > - if (!local_min_port && !local_max_port) { > > - local_min_port = local_max_port = DEFAULT_PORT; > > - } > > - fds = xmalloc((1 + local_max_port - local_min_port) * sizeof *fds); > > - n_fds = 0; > > - for (port = local_min_port; port <= local_max_port; port++) { > > - struct sockaddr_in sin; > > - unsigned int yes = 1; > > - int error; > > - int fd; > > - > > - /* Create socket, set SO_REUSEADDR. */ > > - fd = socket(AF_INET, SOCK_STREAM, 0); > > - if (fd < 0) { > > - ovs_fatal(errno, "failed to create socket"); > > - } > > - error = set_nonblocking(fd); > > - if (error) { > > - ovs_fatal(error, "failed to set non-blocking mode"); > > - } > > - if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof yes) < > > 0) { > > - ovs_fatal(errno, "setsockopt(SO_REUSEADDR) failed"); > > - } > > - > > - /* Bind. */ > > - sin.sin_family = AF_INET; > > - sin.sin_addr = remote_addr; > > - sin.sin_port = htons(port); > > - if (bind(fd, (struct sockaddr *) &sin, sizeof sin) < 0) { > > - ovs_fatal(errno, "bind failed"); > > - } > > - > > - /* Listen. */ > > - if (listen(fd, 10000) < 0) { > > - ovs_fatal(errno, "listen failed"); > > - } > > - > > - fds[n_fds].fd = fd; > > - fds[n_fds].events = POLLIN; > > - n_fds++; > > - } > > - > > - for (;;) { > > - int retval; > > - > > - retval = do_poll(fds, n_fds, -1); > > - if (retval < 0) { > > - ovs_fatal(errno, "poll failed"); > > - } > > - > > - for (i = 0; i < n_fds; i++) { > > - if (fds[i].revents & POLLIN) { > > - int newfd; > > - > > - do { > > - newfd = accept(fds[i].fd, NULL, NULL); > > - } while (newfd < 0 && errno == EINTR); > > - > > - if (newfd >= 0) { > > - close(newfd); > > - } else if (errno != EAGAIN) { > > - ovs_fatal(errno, "accept failed"); > > - } > > - } > > - } > > - } > > -} > > - > > -/* Increments '*value' within the range 'min...max' inclusive. Returns > > true > > - * if '*value' wraps around to 'min', otherwise false. */ > > -static bool > > -increment(unsigned short int *value, > > - unsigned short int min, unsigned short int max) > > -{ > > - if (*value < max) { > > - ++*value; > > - return false; > > - } else { > > - *value = min; > > - return true; > > - } > > -} > > - > > -static void > > -next_ports(unsigned short int *local_port, unsigned short int *remote_port) > > -{ > > - if (increment(local_port, local_min_port, local_max_port)) { > > - increment(remote_port, remote_min_port, remote_max_port); > > - } > > -} > > - > > -static void > > -bind_local_port(int fd, unsigned short int *local_port, > > - unsigned short int *remote_port) > > -{ > > - int error; > > - > > - if (!local_min_port && !local_max_port) { > > - next_ports(local_port, remote_port); > > - return; > > - } > > - > > - do { > > - struct sockaddr_in local; > > - > > - memset(&local, 0, sizeof local); > > - local.sin_family = AF_INET; > > - local.sin_addr = local_addr; > > - local.sin_port = htons(*local_port); > > - error = (bind(fd, (struct sockaddr *) &local, sizeof local) < 0 > > - ? errno : 0); > > - next_ports(local_port, remote_port); > > - } while (error == EADDRINUSE || error == EINTR); > > - if (error) { > > - ovs_fatal(error, "bind failed"); > > - } > > -} > > - > > -static void > > -cmd_rate(struct ovs_cmdl_context *ctx OVS_UNUSED) > > -{ > > - unsigned short int local_port; > > - unsigned short int remote_port; > > - unsigned int completed = 0; > > - unsigned int failures = 0; > > - long long int start, prev; > > - struct pollfd *fds; > > - int n_fds; > > - > > - if (!remote_addr.s_addr) { > > - ovs_fatal(0, "remote address must be specified with -r or > > --remote"); > > - } > > - if (!remote_min_port && !remote_max_port) { > > - remote_min_port = remote_max_port = DEFAULT_PORT; > > - } > > - > > - local_port = local_min_port; > > - remote_port = remote_min_port; > > - fds = xmalloc(n_sockets * sizeof *fds); > > - n_fds = 0; > > - start = prev = time_in_msec(); > > - for (;;) { > > - long long int now; > > - long long int may_open; > > - int delay; > > - int retval; > > - int j; > > - > > - if (max_rate > 0) { > > - long long int cur_total = completed + n_fds; > > - long long int max_total = (time_in_msec() - start) * (max_rate > > / 1000.0); > > - if (max_total > cur_total) { > > - may_open = MIN(n_sockets, max_total - cur_total); > > - } else { > > - may_open = 0; > > - } > > - delay = 1000.0 / max_rate; > > - } else { > > - may_open = n_sockets; > > - delay = 1000; > > - } > > - > > - while (may_open-- > 0 && n_fds < n_sockets) { > > - struct sockaddr_in remote; > > - int error; > > - int fd; > > - > > - fd = socket(AF_INET, SOCK_STREAM, 0); > > - if (fd < 0) { > > - ovs_fatal(errno, "socket failed"); > > - } > > - > > - error = set_nonblocking(fd); > > - if (error) { > > - ovs_fatal(error, "set_nonblocking failed"); > > - } > > - > > - bind_local_port(fd, &local_port, &remote_port); > > - > > - memset(&remote, 0, sizeof remote); > > - remote.sin_family = AF_INET; > > - remote.sin_addr = remote_addr; > > - remote.sin_port = htons(remote_port); > > - if (connect(fd, (struct sockaddr *) &remote, sizeof remote) < > > 0) { > > - if (errno == EINPROGRESS) { > > - fds[n_fds].fd = fd; > > - fds[n_fds].events = POLLOUT; > > - fds[n_fds].revents = 0; > > - n_fds++; > > - } else if (errno != ECONNREFUSED) { > > - ovs_fatal(errno, "connect"); > > - } > > - } else { > > - /* Success, I guess. */ > > - shutdown(fd, 2); > > - close(fd); > > - completed++; > > - } > > - } > > - > > - if (n_fds == n_sockets) { > > - delay = 1000; > > - } > > - > > - retval = do_poll(fds, n_fds, delay); > > - if (retval < 0) { > > - ovs_fatal(errno, "poll"); > > - } > > - > > - for (j = 0; j < n_fds; ) { > > - if (fds[j].revents) { > > - if (fds[j].revents & POLLERR) { > > - failures++; > > - } > > - shutdown(fds[j].fd, 2); > > - close(fds[j].fd); > > - fds[j] = fds[--n_fds]; > > - completed++; > > - } else { > > - j++; > > - } > > - } > > - > > - now = time_in_msec(); > > - if (now >= prev + 1000) { > > - long long int elapsed = now - start; > > - 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) { > > - break; > > - } > > - } > > - } > > - free(fds); > > -} > > - > > -static void > > -timer_end(long long int start, bool error, > > - int *min, int *max, unsigned long long int *total) > > -{ > > - int elapsed = time_in_msec() - start; > > - static int last_elapsed = INT_MIN; > > - char c = error ? '!' : '.'; > > - > > - if (last_elapsed != elapsed) { > > - if (last_elapsed != INT_MIN) { > > - putchar('\n'); > > - } > > - printf("%5d %c", elapsed, c); > > - fflush(stdout); > > - last_elapsed = elapsed; > > - } else { > > - putchar(c); > > - fflush(stdout); > > - } > > - > > - if (elapsed < *min) { > > - *min = elapsed; > > - } > > - if (elapsed > *max) { > > - *max = elapsed; > > - } > > - *total += elapsed; > > -} > > - > > -static void > > -cmd_latency(struct ovs_cmdl_context *ctx OVS_UNUSED) > > -{ > > - unsigned short int local_port; > > - unsigned short int remote_port; > > - int min = INT_MAX; > > - int max = 0; > > - unsigned long long int total = 0; > > - int i; > > - > > - if (!remote_addr.s_addr) { > > - ovs_fatal(0, "remote address must be specified with -r or --rate"); > > - } > > - if (!remote_min_port && !remote_max_port) { > > - remote_min_port = remote_max_port = DEFAULT_PORT; > > - } > > - > > - local_port = local_min_port; > > - remote_port = remote_min_port; > > - for (i = 0; i < n_batches; i++) { > > - struct pollfd fds[MAX_SOCKETS]; > > - long long int start; > > - int n_fds; > > - int j; > > - > > - start = time_in_msec(); > > - n_fds = 0; > > - for (j = 0; j < n_sockets; j++) { > > - struct sockaddr_in remote; > > - int error; > > - int fd; > > - > > - fd = socket(AF_INET, SOCK_STREAM, 0); > > - if (fd < 0) { > > - ovs_fatal(errno, "socket failed"); > > - } > > - > > - error = set_nonblocking(fd); > > - if (error) { > > - ovs_fatal(error, "set_nonblocking failed"); > > - } > > - > > - bind_local_port(fd, &local_port, &remote_port); > > - > > - memset(&remote, 0, sizeof remote); > > - remote.sin_family = AF_INET; > > - remote.sin_addr = remote_addr; > > - remote.sin_port = htons(remote_port); > > - if (connect(fd, (struct sockaddr *) &remote, sizeof remote) < > > 0) { > > - if (errno == EINPROGRESS) { > > - fds[n_fds].fd = fd; > > - fds[n_fds].events = POLLOUT; > > - fds[n_fds].revents = 0; > > - n_fds++; > > - } else if (errno != ECONNREFUSED) { > > - ovs_fatal(errno, "connect"); > > - } > > - } else { > > - /* Success, I guess. */ > > - close(fd); > > - timer_end(start, 0, &min, &max, &total); > > - } > > - } > > - > > - while (n_fds > 0) { > > - int retval; > > - > > - retval = do_poll(fds, n_fds, -1); > > - if (retval < 0) { > > - ovs_fatal(errno, "poll"); > > - } > > - > > - for (j = 0; j < n_fds; ) { > > - if (fds[j].revents) { > > - timer_end(start, > > - fds[j].revents & (POLLERR|POLLHUP) ? 1 : 0, > > - &min, &max, &total); > > - close(fds[j].fd); > > - fds[j] = fds[--n_fds]; > > - } else { > > - j++; > > - } > > - } > > - } > > - putchar('\n'); > > - } > > - > > - printf("min %d ms, max %d ms, avg %llu ms\n", > > - min, max, total / (1ULL * n_sockets * n_batches)); > > -} > > - > > -static void > > -cmd_help(struct ovs_cmdl_context *ctx OVS_UNUSED) > > -{ > > - usage(); > > -} > > - > > -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; > > -} > > diff --git a/xenserver/openvswitch-xen.spec.in > > b/xenserver/openvswitch-xen.spec.in > > index 2b844b2..8bc4a2c 100644 > > --- a/xenserver/openvswitch-xen.spec.in > > +++ b/xenserver/openvswitch-xen.spec.in > > @@ -1,6 +1,6 @@ > > # Spec file for Open vSwitch. > > > > -# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc. > > +# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc. > > # > > # Copying and distribution of this file, with or without modification, > > # are permitted in any medium without royalty provided the copyright > > @@ -146,12 +146,10 @@ cp -rf > > $RPM_BUILD_ROOT/usr/share/openvswitch/bugtool-plugins/* $RPM_BUILD_ROOT/e > > > > # Get rid of stuff we don't want to make RPM happy. > > rm \ > > - $RPM_BUILD_ROOT/usr/bin/ovs-benchmark \ > > $RPM_BUILD_ROOT/usr/bin/ovs-testcontroller \ > > $RPM_BUILD_ROOT/usr/bin/ovs-l3ping \ > > $RPM_BUILD_ROOT/usr/bin/ovs-pki \ > > $RPM_BUILD_ROOT/usr/bin/ovs-test \ > > - $RPM_BUILD_ROOT/usr/share/man/man1/ovs-benchmark.1 \ > > $RPM_BUILD_ROOT/usr/share/man/man8/ovs-testcontroller.8 \ > > $RPM_BUILD_ROOT/usr/share/man/man8/ovs-l3ping.8 \ > > $RPM_BUILD_ROOT/usr/share/man/man8/ovs-pki.8 \ > > -- > > 2.1.3 > > > > _______________________________________________ > > dev mailing list > > [email protected] > > http://openvswitch.org/mailman/listinfo/dev > _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
