Added support for IPv6 mode (-6)

This commit is contained in:
sethdelliott 2010-07-27 20:27:34 +00:00
parent 5e0e1e974e
commit f99bd3b2c6
8 changed files with 56 additions and 40 deletions

View File

@ -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 */

View File

@ -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);

View File

@ -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);

View File

@ -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);
}

View File

@ -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!

View File

@ -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);
}

View File

@ -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!

View File

@ -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);