1
1

Merge branch 'kevinconstantine-master'

Этот коммит содержится в:
Bruce A. Mah 2014-09-15 13:22:10 -07:00
родитель fbd89512af de1683975b
Коммит 5fef310cdf
11 изменённых файлов: 39 добавлений и 4 удалений

Просмотреть файл

@ -172,6 +172,7 @@ struct iperf_test
signed char state;
char *server_hostname; /* -c option */
char *bind_address; /* -B option */
int *bind_port; /* -e option */
int server_port;
int omit; /* duration of omit period (-O flag) */
int duration; /* total duration of test (-t flag) */

Просмотреть файл

@ -113,6 +113,10 @@ number of blocks (packets) to transmit (instead of -t or -n)
.BR -l ", " --length " \fIn\fR[KM]"
length of buffer to read or write (default 128 KB for TCP, 8KB for UDP)
.TP
.BR --cport " \fIport\fR"
bind data streams to a specific client port (for TCP and UDP only,
default is to use an ephemeral port)
.TP
.BR -P ", " --parallel " \fIn\fR"
number of parallel client streams to run
.TP

Просмотреть файл

@ -584,6 +584,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
{"reverse", no_argument, NULL, 'R'},
{"window", required_argument, NULL, 'w'},
{"bind", required_argument, NULL, 'B'},
{"cport", required_argument, NULL, OPT_CLIENT_PORT},
{"set-mss", required_argument, NULL, 'M'},
{"no-delay", no_argument, NULL, 'N'},
{"version4", no_argument, NULL, '4'},
@ -745,6 +746,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
case 'B':
test->bind_address = strdup(optarg);
break;
case OPT_CLIENT_PORT:
test->bind_port = atoi(optarg);
break;
case 'M':
test->settings->mss = atoi(optarg);
if (test->settings->mss > MAX_MSS) {
@ -876,6 +880,10 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
return -1;
}
if (!test->bind_address && test->bind_port) {
i_errno = IEBIND;
return -1;
}
if (blksize == 0) {
if (test->protocol->id == Pudp)
blksize = DEFAULT_UDP_BLKSIZE;

Просмотреть файл

@ -30,6 +30,7 @@ struct iperf_stream;
#define OPT_LOGFILE 2
#define OPT_GET_SERVER_OUTPUT 3
#define OPT_UDP_COUNTERS_64BIT 4
#define OPT_CLIENT_PORT 5
/* states */
#define TEST_START 1
@ -262,6 +263,7 @@ enum {
IEENDCONDITIONS = 16, // Only one test end condition (-t, -n, -k) may be specified
IELOGFILE = 17, // Can't open log file
IENOSCTP = 18, // No SCTP support available
IEBIND = 19, // Local port specified with no local bind option
/* Test errors */
IENEWTEST = 100, // Unable to create a new test (check perror)
IEINITTEST = 101, // Test initialization failed (check perror)

Просмотреть файл

@ -268,7 +268,8 @@ iperf_connect(struct iperf_test *test)
/* Create and connect the control channel */
if (test->ctrl_sck < 0)
test->ctrl_sck = netdial(test->settings->domain, Ptcp, test->bind_address, test->server_hostname, test->server_port);
// Create the control channel using an ephemeral port
test->ctrl_sck = netdial(test->settings->domain, Ptcp, test->bind_address, NULL, test->server_hostname, test->server_port);
if (test->ctrl_sck < 0) {
i_errno = IECONNECT;
return -1;

Просмотреть файл

@ -104,6 +104,9 @@ iperf_strerror(int i_errno)
case IEINTERVAL:
snprintf(errstr, len, "invalid report interval (min = %g, max = %g seconds)", MIN_INTERVAL, MAX_INTERVAL);
break;
case IEBIND:
snprintf(errstr, len, "--bind must be specified to use --cport");
break;
case IEMSS:
snprintf(errstr, len, "TCP MSS too large (maximum = %d bytes)", MAX_MSS);
break;

Просмотреть файл

@ -108,6 +108,7 @@ const char usage_longstr[] = "Usage: iperf [-s|-c host] [options]\n"
" -k, --blockcount #[KMG] number of blocks (packets) to transmit (instead of -t or -n)\n"
" -l, --len #[KMG] length of buffer to read or write\n"
" (default %d KB for TCP, %d KB for UDP)\n"
" --cport <port> bind to a specific client port (TCP and UDP, default: ephemeral port)\n"
" -P, --parallel # number of parallel client streams to run\n"
" -R, --reverse run in reverse mode (server sends, client receives)\n"
" -w, --window #[KMG] TCP window size (socket buffer size)\n"
@ -171,6 +172,9 @@ const char client_port[] =
const char bind_address[] =
"Binding to local address %s\n";
const char bind_port[] =
"Binding to local port %s\n";
const char multicast_ttl[] =
"Setting multicast TTL to %d\n";

Просмотреть файл

@ -325,6 +325,11 @@ iperf_tcp_connect(struct iperf_test *test)
}
if (test->bind_address) {
struct sockaddr_in *lcladdr;
lcladdr = (struct sockaddr_in *)local_res->ai_addr;
lcladdr->sin_port = htons(test->bind_port);
local_res->ai_addr = (struct sockaddr *)lcladdr;
if (bind(s, (struct sockaddr *) local_res->ai_addr, local_res->ai_addrlen) < 0) {
saved_errno = errno;
close(s);

Просмотреть файл

@ -234,7 +234,7 @@ iperf_udp_connect(struct iperf_test *test)
{
int s, buf, sz;
if ((s = netdial(test->settings->domain, Pudp, test->bind_address, test->server_hostname, test->server_port)) < 0) {
if ((s = netdial(test->settings->domain, Pudp, test->bind_address, test->bind_port, test->server_hostname, test->server_port)) < 0) {
i_errno = IESTREAMCONNECT;
return -1;
}

Просмотреть файл

@ -48,7 +48,7 @@
/* make connection to server */
int
netdial(int domain, int proto, char *local, char *server, int port)
netdial(int domain, int proto, char *local, int local_port, char *server, int port)
{
struct addrinfo hints, *local_res, *server_res;
int s;
@ -76,6 +76,13 @@ netdial(int domain, int proto, char *local, char *server, int port)
}
if (local) {
if (local_port) {
struct sockaddr_in *lcladdr;
lcladdr = (struct sockaddr_in *)local_res->ai_addr;
lcladdr->sin_port = htons(local_port);
local_res->ai_addr = (struct sockaddr *)lcladdr;
}
if (bind(s, (struct sockaddr *) local_res->ai_addr, local_res->ai_addrlen) < 0) {
close(s);
freeaddrinfo(local_res);

Просмотреть файл

@ -10,7 +10,7 @@
#ifndef __NET_H
#define __NET_H
int netdial(int domain, int proto, char *local, char *server, int port);
int netdial(int domain, int proto, char *local, int local_port, char *server, int port);
int netannounce(int domain, int proto, char *local, int port);
int Nread(int fd, char *buf, size_t count, int prot);
int Nwrite(int fd, const char *buf, size_t count, int prot) /* __attribute__((hot)) */;