Added support for IPv6 mode (-6)
This commit is contained in:
parent
5e0e1e974e
commit
f99bd3b2c6
@ -48,6 +48,7 @@ struct iperf_stream_result
|
||||
#define COOKIE_SIZE 37 /* size of an ascii uuid */
|
||||
struct iperf_settings
|
||||
{
|
||||
int domain; /* AF_INET or AF_INET6 */
|
||||
int socket_bufsize; /* window size for TCP */
|
||||
int blksize; /* size of read/writes (-l) */
|
||||
uint64_t rate; /* target data rate, UDP only */
|
||||
|
@ -122,19 +122,25 @@ iperf_on_test_start(struct iperf_test *test)
|
||||
void
|
||||
iperf_on_connect(struct iperf_test *test)
|
||||
{
|
||||
char ipl[INET6_ADDRSTRLEN], ipr[INET6_ADDRSTRLEN];
|
||||
struct sockaddr_in temp;
|
||||
char ipr[INET6_ADDRSTRLEN];
|
||||
struct sockaddr_storage temp;
|
||||
socklen_t len;
|
||||
int domain;
|
||||
|
||||
if (test->role == 'c') {
|
||||
printf("Connecting to host %s, port %d\n", test->server_hostname,
|
||||
test->server_port);
|
||||
} else {
|
||||
len = sizeof(struct sockaddr_in);
|
||||
domain = test->settings->domain;
|
||||
len = sizeof(temp);
|
||||
getpeername(test->ctrl_sck, (struct sockaddr *) &temp, &len);
|
||||
inet_ntop(AF_INET, (void *) &temp.sin_addr, ipr, sizeof(ipr));
|
||||
|
||||
printf("Accepted connection from %s, port %d\n", ipr, ntohs(temp.sin_port));
|
||||
if (domain == AF_INET) {
|
||||
inet_ntop(domain, &((struct sockaddr_in *) &temp)->sin_addr, ipr, sizeof(ipr));
|
||||
printf("Accepted connection from %s, port %d\n", ipr, ntohs(((struct sockaddr_in *) &temp)->sin_port));
|
||||
} else {
|
||||
inet_ntop(domain, &((struct sockaddr_in6 *) &temp)->sin6_addr, ipr, sizeof(ipr));
|
||||
printf("Accepted connection from %s, port %d\n", ipr, ntohs(((struct sockaddr_in6 *) &temp)->sin6_port));
|
||||
}
|
||||
}
|
||||
if (test->verbose) {
|
||||
printf(" Cookie: %s\n", test->cookie);
|
||||
@ -181,6 +187,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
|
||||
{"daemon", no_argument, NULL, 'D'},
|
||||
{"format", required_argument, NULL, 'f'},
|
||||
{"reverse", no_argument, NULL, 'R'},
|
||||
{"version6", no_argument, NULL, '6'},
|
||||
|
||||
/* XXX: The following ifdef needs to be split up. linux-congestion is not necessarily supported
|
||||
* by systems that support tos.
|
||||
@ -193,7 +200,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
|
||||
};
|
||||
char ch;
|
||||
|
||||
while ((ch = getopt_long(argc, argv, "c:p:st:uP:B:b:l:w:i:n:mRNTvhVdM:f:", longopts, NULL)) != -1) {
|
||||
while ((ch = getopt_long(argc, argv, "c:p:st:uP:B:b:l:w:i:n:mRNTvh6VdM:f:", longopts, NULL)) != -1) {
|
||||
switch (ch) {
|
||||
case 'c':
|
||||
if (test->role == 's') {
|
||||
@ -324,6 +331,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
|
||||
case 'T':
|
||||
test->tcp_info = 1;
|
||||
break;
|
||||
case '6':
|
||||
test->settings->domain = AF_INET6;
|
||||
break;
|
||||
case 'V':
|
||||
test->verbose = 1;
|
||||
break;
|
||||
@ -852,17 +862,25 @@ add_to_interval_list(struct iperf_stream_result * rp, struct iperf_interval_resu
|
||||
*/
|
||||
|
||||
void
|
||||
connect_msg(struct iperf_stream * sp)
|
||||
connect_msg(struct iperf_stream *sp)
|
||||
{
|
||||
char ipl[512], ipr[512];
|
||||
char ipl[INET6_ADDRSTRLEN], ipr[INET6_ADDRSTRLEN];
|
||||
int lport, rport, domain = sp->settings->domain;
|
||||
|
||||
inet_ntop(AF_INET, (void *) (&((struct sockaddr_in *) & sp->local_addr)->sin_addr), (void *) ipl, sizeof(ipl));
|
||||
inet_ntop(AF_INET, (void *) (&((struct sockaddr_in *) & sp->remote_addr)->sin_addr), (void *) ipr, sizeof(ipr));
|
||||
if (domain == AF_INET) {
|
||||
inet_ntop(domain, (void *) &((struct sockaddr_in *) &sp->local_addr)->sin_addr, ipl, sizeof(ipl));
|
||||
inet_ntop(domain, (void *) &((struct sockaddr_in *) &sp->remote_addr)->sin_addr, ipr, sizeof(ipr));
|
||||
lport = ntohs(((struct sockaddr_in *) &sp->local_addr)->sin_port);
|
||||
rport = ntohs(((struct sockaddr_in *) &sp->remote_addr)->sin_port);
|
||||
} else {
|
||||
inet_ntop(domain, (void *) &((struct sockaddr_in6 *) &sp->local_addr)->sin6_addr, ipl, sizeof(ipl));
|
||||
inet_ntop(domain, (void *) &((struct sockaddr_in6 *) &sp->remote_addr)->sin6_addr, ipr, sizeof(ipr));
|
||||
lport = ntohs(((struct sockaddr_in6 *) &sp->local_addr)->sin6_port);
|
||||
rport = ntohs(((struct sockaddr_in6 *) &sp->remote_addr)->sin6_port);
|
||||
}
|
||||
|
||||
printf("[%3d] local %s port %d connected to %s port %d\n",
|
||||
sp->socket,
|
||||
ipl, ntohs(((struct sockaddr_in *) & sp->local_addr)->sin_port),
|
||||
ipr, ntohs(((struct sockaddr_in *) & sp->remote_addr)->sin_port));
|
||||
sp->socket, ipl, lport, ipr, rport);
|
||||
}
|
||||
|
||||
|
||||
@ -903,6 +921,7 @@ iperf_defaults(struct iperf_test * testp)
|
||||
testp->reporter_interval = 0;
|
||||
testp->num_streams = 1;
|
||||
|
||||
testp->settings->domain = AF_INET;
|
||||
testp->settings->unit_format = 'a';
|
||||
testp->settings->socket_bufsize = 0; /* use autotuning */
|
||||
testp->settings->blksize = DEFAULT_TCP_BLKSIZE;
|
||||
@ -1259,12 +1278,12 @@ iperf_init_stream(struct iperf_stream * sp, struct iperf_test * testp)
|
||||
{
|
||||
socklen_t len;
|
||||
|
||||
len = sizeof(struct sockaddr_in);
|
||||
|
||||
len = sizeof(struct sockaddr_storage);
|
||||
if (getsockname(sp->socket, (struct sockaddr *) &sp->local_addr, &len) < 0) {
|
||||
i_errno = IEINITSTREAM;
|
||||
return (-1);
|
||||
}
|
||||
len = sizeof(struct sockaddr_storage);
|
||||
if (getpeername(sp->socket, (struct sockaddr *) &sp->remote_addr, &len) < 0) {
|
||||
i_errno = IEINITSTREAM;
|
||||
return (-1);
|
||||
|
@ -113,7 +113,7 @@ iperf_connect(struct iperf_test *test)
|
||||
get_uuid(test->cookie);
|
||||
|
||||
/* Create and connect the control channel */
|
||||
test->ctrl_sck = netdial(Ptcp, test->bind_address, test->server_hostname, test->server_port);
|
||||
test->ctrl_sck = netdial(test->settings->domain, Ptcp, test->bind_address, test->server_hostname, test->server_port);
|
||||
if (test->ctrl_sck < 0) {
|
||||
i_errno = IECONNECT;
|
||||
return (-1);
|
||||
|
@ -52,7 +52,7 @@ iperf_server_listen(struct iperf_test *test)
|
||||
char ubuf[UNIT_LEN];
|
||||
int x;
|
||||
|
||||
if((test->listener = netannounce(Ptcp, test->bind_address, test->server_port)) < 0) {
|
||||
if((test->listener = netannounce(test->settings->domain, Ptcp, test->bind_address, test->server_port)) < 0) {
|
||||
i_errno = IELISTEN;
|
||||
return (-1);
|
||||
}
|
||||
@ -345,7 +345,7 @@ iperf_run_server(struct iperf_test *test)
|
||||
if (test->no_delay || test->settings->mss) {
|
||||
FD_CLR(test->listener, &test->read_set);
|
||||
close(test->listener);
|
||||
if ((s = netannounce(Ptcp, test->bind_address, test->server_port)) < 0) {
|
||||
if ((s = netannounce(test->settings->domain, Ptcp, test->bind_address, test->server_port)) < 0) {
|
||||
i_errno = IELISTEN;
|
||||
return (-1);
|
||||
}
|
||||
|
@ -115,8 +115,6 @@ int
|
||||
iperf_tcp_listen(struct iperf_test *test)
|
||||
{
|
||||
int s, opt;
|
||||
struct sockaddr_in sa;
|
||||
struct hostent *hent;
|
||||
struct addrinfo hints, *res;
|
||||
char portstr[6];
|
||||
s = test->listener;
|
||||
@ -124,7 +122,7 @@ iperf_tcp_listen(struct iperf_test *test)
|
||||
if (test->no_delay || test->settings->mss) {
|
||||
FD_CLR(s, &test->read_set);
|
||||
close(s);
|
||||
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
||||
if ((s = socket(test->settings->domain, SOCK_STREAM, 0)) < 0) {
|
||||
i_errno = IESTREAMLISTEN;
|
||||
return (-1);
|
||||
}
|
||||
@ -152,7 +150,7 @@ iperf_tcp_listen(struct iperf_test *test)
|
||||
|
||||
snprintf(portstr, 6, "%d", test->server_port);
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_family = test->settings->domain;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
hints.ai_flags = AI_PASSIVE;
|
||||
// XXX: Check getaddrinfo for errors!
|
||||
@ -189,19 +187,17 @@ int
|
||||
iperf_tcp_connect(struct iperf_test *test)
|
||||
{
|
||||
int s, opt;
|
||||
struct sockaddr_in sa, local;
|
||||
struct hostent *hent;
|
||||
struct addrinfo hints, *res;
|
||||
char portstr[6];
|
||||
|
||||
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
||||
if ((s = socket(test->settings->domain, SOCK_STREAM, 0)) < 0) {
|
||||
i_errno = IESTREAMCONNECT;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (test->bind_address) {
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_family = test->settings->domain;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
// XXX: Check getaddrinfo for errors!
|
||||
if (getaddrinfo(test->bind_address, NULL, &hints, &res) != 0) {
|
||||
@ -233,7 +229,7 @@ iperf_tcp_connect(struct iperf_test *test)
|
||||
}
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_family = test->settings->domain;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
snprintf(portstr, 6, "%d", test->server_port);
|
||||
// XXX: Check getaddrinfo for errors!
|
||||
|
@ -170,7 +170,7 @@ iperf_udp_accept(struct iperf_test *test)
|
||||
return (-1);
|
||||
}
|
||||
|
||||
test->prot_listener = netannounce(Pudp, test->bind_address, test->server_port);
|
||||
test->prot_listener = netannounce(test->settings->domain, Pudp, test->bind_address, test->server_port);
|
||||
if (test->prot_listener < 0) {
|
||||
i_errno = IESTREAMLISTEN;
|
||||
return (-1);
|
||||
@ -198,7 +198,7 @@ iperf_udp_listen(struct iperf_test *test)
|
||||
{
|
||||
int s;
|
||||
|
||||
if ((s = netannounce(Pudp, test->bind_address, test->server_port)) < 0) {
|
||||
if ((s = netannounce(test->settings->domain, Pudp, test->bind_address, test->server_port)) < 0) {
|
||||
i_errno = IESTREAMLISTEN;
|
||||
return (-1);
|
||||
}
|
||||
@ -216,7 +216,7 @@ iperf_udp_connect(struct iperf_test *test)
|
||||
{
|
||||
int s, buf;
|
||||
|
||||
if ((s = netdial(Pudp, test->bind_address, test->server_hostname, test->server_port)) < 0) {
|
||||
if ((s = netdial(test->settings->domain, Pudp, test->bind_address, test->server_hostname, test->server_port)) < 0) {
|
||||
i_errno = IESTREAMCONNECT;
|
||||
return (-1);
|
||||
}
|
||||
|
14
src/net.c
14
src/net.c
@ -19,19 +19,19 @@
|
||||
|
||||
/* make connection to server */
|
||||
int
|
||||
netdial(int proto, char *local, char *server, int port)
|
||||
netdial(int domain, int proto, char *local, char *server, int port)
|
||||
{
|
||||
int s;
|
||||
struct addrinfo hints, *res;
|
||||
|
||||
s = socket(AF_INET, proto, 0);
|
||||
s = socket(domain, proto, 0);
|
||||
if (s < 0) {
|
||||
return (-1);
|
||||
}
|
||||
|
||||
if (local) {
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_family = domain;
|
||||
hints.ai_socktype = proto;
|
||||
|
||||
// XXX: Check getaddrinfo for errors!
|
||||
@ -45,7 +45,7 @@ netdial(int proto, char *local, char *server, int port)
|
||||
}
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_family = domain;
|
||||
hints.ai_socktype = proto;
|
||||
|
||||
// XXX: Check getaddrinfo for errors!
|
||||
@ -66,13 +66,13 @@ netdial(int proto, char *local, char *server, int port)
|
||||
/***************************************************************/
|
||||
|
||||
int
|
||||
netannounce(int proto, char *local, int port)
|
||||
netannounce(int domain, int proto, char *local, int port)
|
||||
{
|
||||
int s, opt;
|
||||
struct addrinfo hints, *res;
|
||||
char portstr[6];
|
||||
|
||||
s = socket(AF_INET, proto, 0);
|
||||
s = socket(domain, proto, 0);
|
||||
if (s < 0) {
|
||||
return (-1);
|
||||
}
|
||||
@ -81,7 +81,7 @@ netannounce(int proto, char *local, int port)
|
||||
|
||||
snprintf(portstr, 6, "%d", port);
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = AF_INET;
|
||||
hints.ai_family = domain;
|
||||
hints.ai_socktype = proto;
|
||||
hints.ai_flags = AI_PASSIVE;
|
||||
// XXX: Check getaddrinfo for errors!
|
||||
|
@ -1,8 +1,8 @@
|
||||
#ifndef __NET_H
|
||||
#define __NET_H
|
||||
|
||||
int netdial(int, char *, char *, int);
|
||||
int netannounce(int, char *, int);
|
||||
int netdial(int, int, char *, char *, int);
|
||||
int netannounce(int, int, char *, int);
|
||||
int Nwrite(int, void *, int, int);
|
||||
int Nread(int, void *, int, int);
|
||||
int getsock_tcp_mss(int);
|
||||
|
Loading…
Reference in New Issue
Block a user