More code restructuring

This commit is contained in:
sethdelliott 2010-07-23 18:39:14 +00:00
parent 66ce7ad49d
commit 112a907cc3
5 changed files with 92 additions and 112 deletions

View File

@ -24,7 +24,7 @@ struct iperf_interval_results
float interval_duration;
#if defined(linux) || defined(__FreeBSD__)
struct tcp_info tcpInfo; /* getsockopt(TCP_INFO) results here for
* Linux and FreeBSD stored here */
* Linux and FreeBSD stored here */
#else
char *tcpInfo; /* just a placeholder */
#endif
@ -45,21 +45,17 @@ struct iperf_stream_result
void *data;
};
#define COOKIE_SIZE 37 /* size of an ascii uuid */
#define COOKIE_SIZE 37 /* size of an ascii uuid */
struct iperf_settings
{
int socket_bufsize; /* window size for TCP */
int blksize; /* size of read/writes (-l) */
uint64_t rate; /* target data rate, UDP only */
int mss; /* for TCP MSS */
int ttl;
int tos;
iperf_size_t bytes; /* -n option */
char unit_format; /* -f */
/* XXX: not sure about this design: everything else is this struct is static state,
but the last 2 are dynamic state. Should they be in iperf_stream instead? */
int state; /* This is state of a stream/test */
char cookie[COOKIE_SIZE];
int socket_bufsize; /* window size for TCP */
int blksize; /* size of read/writes (-l) */
uint64_t rate; /* target data rate, UDP only */
int mss; /* for TCP MSS */
int ttl; /* IP TTL option */
int tos; /* type of service bit */
iperf_size_t bytes; /* number of bytes to send */
char unit_format; /* -f */
};
struct iperf_stream
@ -76,7 +72,7 @@ struct iperf_stream
/* non configurable members */
struct iperf_stream_result *result; /* structure pointer to result */
struct timer *send_timer;
char *buffer; /* data to send */
char *buffer; /* data to send */
/*
* for udp measurements - This can be a structure outside stream, and
@ -94,7 +90,6 @@ struct iperf_stream
int (*rcv) (struct iperf_stream * stream);
int (*snd) (struct iperf_stream * stream);
int (*update_stats) (struct iperf_stream * stream);
struct iperf_stream *next;
@ -128,7 +123,7 @@ struct iperf_test
int listener;
int prot_listener;
/* boolen variables for Options */
/* boolean variables for Options */
int daemon; /* -D option */
int debug; /* -d option - debug mode */
int no_delay; /* -N option */
@ -144,8 +139,6 @@ struct iperf_test
fd_set read_set; /* set of read sockets */
fd_set write_set; /* set of write sockets */
int (*accept) (struct iperf_test *);
/* Interval related members */
int stats_interval;
int reporter_interval;
@ -157,12 +150,11 @@ struct iperf_test
int num_streams; /* total streams in the test (-P) */
int streams_accepted; /* total number of streams accepted (server only) */
iperf_size_t bytes_sent;
char cookie[COOKIE_SIZE];
struct iperf_stream *streams; /* pointer to list of struct stream */
struct iperf_settings *default_settings;
struct iperf_settings *settings;
SLIST_HEAD(slisthead, protocol) protocols;
};

View File

@ -174,7 +174,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
return (-1);
}
set_protocol(test, Pudp);
test->default_settings->blksize = DEFAULT_UDP_BLKSIZE;
test->settings->blksize = DEFAULT_UDP_BLKSIZE;
break;
case 'P':
if (test->role == 's') {
@ -192,15 +192,15 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
i_errno = IECLIENTONLY;
return (-1);
}
test->default_settings->rate = unit_atof(optarg);
test->settings->rate = unit_atof(optarg);
break;
case 'l':
if (test->role == 's') {
i_errno = IECLIENTONLY;
return (-1);
}
test->default_settings->blksize = unit_atoi(optarg);
if (test->default_settings->blksize > MAX_BLOCKSIZE) {
test->settings->blksize = unit_atoi(optarg);
if (test->settings->blksize > MAX_BLOCKSIZE) {
i_errno = IEBLOCKSIZE;
return (-1);
}
@ -211,8 +211,8 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
i_errno = IECLIENTONLY;
return (-1);
}
test->default_settings->socket_bufsize = unit_atof(optarg);
if (test->default_settings->socket_bufsize > MAX_TCP_BUFFER) {
test->settings->socket_bufsize = unit_atof(optarg);
if (test->settings->socket_bufsize > MAX_TCP_BUFFER) {
i_errno = IEBUFSIZE;
return (-1);
}
@ -232,7 +232,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
i_errno = IECLIENTONLY;
return (-1);
}
test->default_settings->bytes = unit_atoi(optarg);
test->settings->bytes = unit_atoi(optarg);
break;
case 'm':
test->print_mss = 1;
@ -249,14 +249,14 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
i_errno = IECLIENTONLY;
return (-1);
}
test->default_settings->mss = atoi(optarg);
if (test->default_settings->mss > MAX_MSS) {
test->settings->mss = atoi(optarg);
if (test->settings->mss > MAX_MSS) {
i_errno = IEMSS;
return (-1);
}
break;
case 'f':
test->default_settings->unit_format = *optarg;
test->settings->unit_format = *optarg;
break;
case 'T':
test->tcp_info = 1;
@ -300,8 +300,8 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
int
all_data_sent(struct iperf_test * test)
{
if (test->default_settings->bytes > 0) {
if (test->bytes_sent >= (test->num_streams * test->default_settings->bytes)) {
if (test->settings->bytes > 0) {
if (test->bytes_sent >= (test->num_streams * test->settings->bytes)) {
return (1);
}
}
@ -388,15 +388,15 @@ iperf_init_test(struct iperf_test *test)
}
/* Set timers */
if (test->default_settings->bytes == 0) {
if (test->settings->bytes == 0) {
test->timer = new_timer(test->duration, 0);
if (test->timer == NULL)
return (-1);
printf(test_start_time, test->protocol->name, test->num_streams, test->default_settings->blksize,
printf(test_start_time, test->protocol->name, test->num_streams, test->settings->blksize,
test->duration);
} else {
printf(test_start_bytes, test->protocol->name, test->num_streams, test->default_settings->blksize,
test->default_settings->bytes);
printf(test_start_bytes, test->protocol->name, test->num_streams, test->settings->blksize,
test->settings->bytes);
}
if (test->stats_interval != 0) {
@ -445,18 +445,18 @@ package_parameters(struct iperf_test *test)
if (test->reverse)
strncat(pstring, "-R ", sizeof(pstring));
if (test->default_settings->socket_bufsize) {
snprintf(optbuf, sizeof(optbuf), "-w %d ", test->default_settings->socket_bufsize);
if (test->settings->socket_bufsize) {
snprintf(optbuf, sizeof(optbuf), "-w %d ", test->settings->socket_bufsize);
strncat(pstring, optbuf, sizeof(pstring));
}
if (test->default_settings->rate) {
snprintf(optbuf, sizeof(optbuf), "-b %llu ", test->default_settings->rate);
if (test->settings->rate) {
snprintf(optbuf, sizeof(optbuf), "-b %llu ", test->settings->rate);
strncat(pstring, optbuf, sizeof(pstring));
}
if (test->default_settings->mss) {
snprintf(optbuf, sizeof(optbuf), "-m %d ", test->default_settings->mss);
if (test->settings->mss) {
snprintf(optbuf, sizeof(optbuf), "-m %d ", test->settings->mss);
strncat(pstring, optbuf, sizeof(pstring));
}
@ -465,8 +465,8 @@ package_parameters(struct iperf_test *test)
strncat(pstring, optbuf, sizeof(pstring));
}
if (test->default_settings->bytes) {
snprintf(optbuf, sizeof(optbuf), "-n %llu ", test->default_settings->bytes);
if (test->settings->bytes) {
snprintf(optbuf, sizeof(optbuf), "-n %llu ", test->settings->bytes);
strncat(pstring, optbuf, sizeof(pstring));
}
@ -475,8 +475,8 @@ package_parameters(struct iperf_test *test)
strncat(pstring, optbuf, sizeof(pstring));
}
if (test->default_settings->blksize) {
snprintf(optbuf, sizeof(optbuf), "-l %d ", test->default_settings->blksize);
if (test->settings->blksize) {
snprintf(optbuf, sizeof(optbuf), "-l %d ", test->settings->blksize);
strncat(pstring, optbuf, sizeof(pstring));
}
@ -530,10 +530,10 @@ parse_parameters(struct iperf_test *test)
test->duration = atoi(optarg);
break;
case 'n':
test->default_settings->bytes = atoll(optarg);
test->settings->bytes = atoll(optarg);
break;
case 'm':
test->default_settings->mss = atoi(optarg);
test->settings->mss = atoi(optarg);
break;
case 'u':
set_protocol(test, Pudp);
@ -548,13 +548,13 @@ parse_parameters(struct iperf_test *test)
test->reverse = 1;
break;
case 'w':
test->default_settings->socket_bufsize = atoi(optarg);
test->settings->socket_bufsize = atoi(optarg);
break;
case 'l':
test->default_settings->blksize = atoi(optarg);
test->settings->blksize = atoi(optarg);
break;
case 'b':
test->default_settings->rate = atoll(optarg);
test->settings->rate = atoll(optarg);
break;
}
}
@ -588,7 +588,7 @@ iperf_exchange_parameters(struct iperf_test * test)
if (parse_parameters(test) < 0)
return (-1);
printf(" cookie: %s\n", test->default_settings->cookie);
printf(" cookie: %s\n", test->cookie);
if ((s = test->protocol->listen(test)) < 0)
return (-1);
@ -813,20 +813,20 @@ connect_msg(struct iperf_stream * sp)
struct iperf_test *
iperf_new_test()
{
struct iperf_test *testp;
struct iperf_test *test;
testp = (struct iperf_test *) malloc(sizeof(struct iperf_test));
if (!testp) {
test = (struct iperf_test *) malloc(sizeof(struct iperf_test));
if (!test) {
i_errno = IENEWTEST;
return (NULL);
}
/* initialize everything to zero */
memset(testp, 0, sizeof(struct iperf_test));
memset(test, 0, sizeof(struct iperf_test));
testp->default_settings = (struct iperf_settings *) malloc(sizeof(struct iperf_settings));
memset(testp->default_settings, 0, sizeof(struct iperf_settings));
test->settings = (struct iperf_settings *) malloc(sizeof(struct iperf_settings));
memset(test->settings, 0, sizeof(struct iperf_settings));
return testp;
return (test);
}
/**************************************************************************/
@ -845,14 +845,13 @@ iperf_defaults(struct iperf_test * testp)
testp->reporter_interval = 0;
testp->num_streams = 1;
testp->default_settings->unit_format = 'a';
testp->default_settings->socket_bufsize = 0; /* use autotuning */
testp->default_settings->blksize = DEFAULT_TCP_BLKSIZE;
testp->default_settings->rate = RATE; /* UDP only */
testp->default_settings->state = TEST_START;
testp->default_settings->mss = 0;
testp->default_settings->bytes = 0;
memset(testp->default_settings->cookie, 0, COOKIE_SIZE);
testp->settings->unit_format = 'a';
testp->settings->socket_bufsize = 0; /* use autotuning */
testp->settings->blksize = DEFAULT_TCP_BLKSIZE;
testp->settings->rate = RATE; /* UDP only */
testp->settings->mss = 0;
testp->settings->bytes = 0;
memset(testp->cookie, 0, COOKIE_SIZE);
/* Set up protocol list */
SLIST_INIT(&testp->protocols);
@ -983,7 +982,7 @@ iperf_connect(struct iperf_test *test)
FD_ZERO(&test->read_set);
FD_ZERO(&test->write_set);
get_uuid(test->default_settings->cookie);
get_uuid(test->cookie);
/* Create and connect the control channel */
test->ctrl_sck = netdial(Ptcp, test->server_hostname, test->server_port);
@ -992,7 +991,7 @@ iperf_connect(struct iperf_test *test)
return (-1);
}
if (Nwrite(test->ctrl_sck, test->default_settings->cookie, COOKIE_SIZE, Ptcp) < 0) {
if (Nwrite(test->ctrl_sck, test->cookie, COOKIE_SIZE, Ptcp) < 0) {
i_errno = IESENDCOOKIE;
return (-1);
}
@ -1010,7 +1009,7 @@ iperf_free_test(struct iperf_test * test)
{
struct protocol *prot;
free(test->default_settings);
free(test->settings);
free_timer(test->timer);
free_timer(test->stats_timer);
free_timer(test->reporter_timer);
@ -1024,7 +1023,6 @@ iperf_free_test(struct iperf_test * test)
/* XXX: Why are we setting these values to NULL? */
test->streams = NULL;
test->accept = NULL;
test->stats_callback = NULL;
test->reporter_callback = NULL;
free(test);
@ -1113,7 +1111,7 @@ iperf_reporter_callback(struct iperf_test * test)
unit_snprintf(ubuf, UNIT_LEN, (double) (bytes), 'A');
unit_snprintf(nbuf, UNIT_LEN, (double) (bytes / ip->interval_duration),
test->default_settings->unit_format);
test->settings->unit_format);
start_time = timeval_diff(&sp->result->start_time,&ip->interval_start_time);
end_time = timeval_diff(&sp->result->start_time,&ip->interval_end_time);
@ -1147,7 +1145,7 @@ iperf_reporter_callback(struct iperf_test * test)
if (bytes_sent > 0) {
unit_snprintf(ubuf, UNIT_LEN, (double) (bytes_sent), 'A');
unit_snprintf(nbuf, UNIT_LEN, (double) (bytes_sent / end_time), test->default_settings->unit_format);
unit_snprintf(nbuf, UNIT_LEN, (double) (bytes_sent / end_time), test->settings->unit_format);
if (test->protocol->id == Ptcp) {
printf(" Sent\n");
printf(report_bw_format, sp->socket, start_time, end_time, ubuf, nbuf);
@ -1171,7 +1169,7 @@ iperf_reporter_callback(struct iperf_test * test)
}
if (bytes_received > 0) {
unit_snprintf(ubuf, UNIT_LEN, (double) bytes_received, 'A');
unit_snprintf(nbuf, UNIT_LEN, (double) (bytes_received / end_time), test->default_settings->unit_format);
unit_snprintf(nbuf, UNIT_LEN, (double) (bytes_received / end_time), test->settings->unit_format);
if (test->protocol->id == Ptcp) {
printf(" Received\n");
printf(report_bw_format, sp->socket, start_time, end_time, ubuf, nbuf);
@ -1181,12 +1179,12 @@ iperf_reporter_callback(struct iperf_test * test)
if (test->num_streams > 1) {
unit_snprintf(ubuf, UNIT_LEN, (double) total_sent, 'A');
unit_snprintf(nbuf, UNIT_LEN, (double) total_sent / end_time, test->default_settings->unit_format);
unit_snprintf(nbuf, UNIT_LEN, (double) total_sent / end_time, test->settings->unit_format);
if (test->protocol->id == Ptcp) {
printf(" Total sent\n");
printf(report_sum_bw_format, start_time, end_time, ubuf, nbuf);
unit_snprintf(ubuf, UNIT_LEN, (double) total_received, 'A');
unit_snprintf(nbuf, UNIT_LEN, (double) (total_received / end_time), test->default_settings->unit_format);
unit_snprintf(nbuf, UNIT_LEN, (double) (total_received / end_time), test->settings->unit_format);
printf(" Total received\n");
printf(report_sum_bw_format, start_time, end_time, ubuf, nbuf);
} else {
@ -1225,7 +1223,7 @@ print_interval_results(struct iperf_test * test, struct iperf_stream * sp)
unit_snprintf(ubuf, UNIT_LEN, (double) (ir->bytes_transferred), 'A');
unit_snprintf(nbuf, UNIT_LEN, (double) (ir->bytes_transferred / ir->interval_duration),
test->default_settings->unit_format);
test->settings->unit_format);
st = timeval_diff(&sp->result->start_time,&ir->interval_start_time);
et = timeval_diff(&sp->result->start_time,&ir->interval_end_time);
@ -1246,7 +1244,6 @@ iperf_free_stream(struct iperf_stream * sp)
/* XXX: need to free interval list too! */
free(sp->buffer);
free(sp->settings);
for (ip = sp->result->interval_results; ip; ip = np) {
np = ip->next;
free(ip);
@ -1271,19 +1268,14 @@ iperf_new_stream(struct iperf_test *test, int s)
memset(sp, 0, sizeof(struct iperf_stream));
sp->buffer = (char *) malloc(test->default_settings->blksize);
sp->settings = (struct iperf_settings *) malloc(sizeof(struct iperf_settings));
sp->buffer = (char *) malloc(test->settings->blksize);
sp->result = (struct iperf_stream_result *) malloc(sizeof(struct iperf_stream_result));
sp->settings = test->settings;
if (!sp->buffer) {
i_errno = IECREATESTREAM;
return (NULL);
}
if (!sp->settings) {
i_errno = IECREATESTREAM;
return (NULL);
}
if (!sp->result) {
i_errno = IECREATESTREAM;
return (NULL);
@ -1291,13 +1283,9 @@ iperf_new_stream(struct iperf_test *test, int s)
memset(sp->result, 0, sizeof(struct iperf_stream_result));
/* Make a per stream copy of default_settings in each stream structure */
// XXX: These settings need to be moved to the test struct
memcpy(sp->settings, test->default_settings, sizeof(struct iperf_settings));
/* Randomize the buffer */
srandom(time(NULL));
for (i = 0; i < test->default_settings->blksize; ++i)
for (i = 0; i < test->settings->blksize; ++i)
sp->buffer[i] = random();
/* Set socket */
@ -1332,7 +1320,7 @@ iperf_init_stream(struct iperf_stream * sp, struct iperf_test * testp)
}
if (testp->protocol->id == Ptcp) {
// XXX: This property is for all sockets, not just TCP
if (set_tcp_windowsize(sp->socket, testp->default_settings->socket_bufsize,
if (set_tcp_windowsize(sp->socket, testp->settings->socket_bufsize,
testp->role == 's' ? SO_RCVBUF : SO_SNDBUF) < 0) {
i_errno = IESETWINDOWSIZE;
return (-1);

View File

@ -73,7 +73,7 @@ iperf_server_listen(struct iperf_test *test)
// XXX: This code needs to be moved to after parameter exhange
/*
if (test->protocol->id == Ptcp) {
if (test->default_settings->socket_bufsize > 0) {
if (test->settings->socket_bufsize > 0) {
unit_snprintf(ubuf, UNIT_LEN, (double) x, 'A');
printf("TCP window size: %s\n", ubuf);
} else {
@ -110,7 +110,7 @@ iperf_accept(struct iperf_test *test)
if (test->ctrl_sck == -1) {
/* Server free, accept new client */
if (Nread(s, test->default_settings->cookie, COOKIE_SIZE, Ptcp) < 0) {
if (Nread(s, test->cookie, COOKIE_SIZE, Ptcp) < 0) {
i_errno = IERECVCOOKIE;
return (-1);
}
@ -265,18 +265,17 @@ iperf_test_reset(struct iperf_test *test)
test->max_fd = test->listener;
test->num_streams = 1;
test->streams_accepted = 0;
test->default_settings->socket_bufsize = 0;
test->default_settings->blksize = DEFAULT_TCP_BLKSIZE;
test->default_settings->rate = RATE; /* UDP only */
test->default_settings->mss = 0;
memset(test->default_settings->cookie, 0, COOKIE_SIZE);
test->settings->socket_bufsize = 0;
test->settings->blksize = DEFAULT_TCP_BLKSIZE;
test->settings->rate = RATE; /* UDP only */
test->settings->mss = 0;
memset(test->cookie, 0, COOKIE_SIZE);
}
int
iperf_run_server(struct iperf_test *test)
{
int result, s;
int result, s, streams_accepted;
fd_set temp_read_set, temp_write_set;
struct iperf_stream *sp;
struct timeval tv;
@ -301,6 +300,7 @@ iperf_run_server(struct iperf_test *test)
for ( ; ; ) {
test->state = IPERF_START;
streams_accepted = 0;
while (test->state != IPERF_DONE) {
@ -343,18 +343,18 @@ iperf_run_server(struct iperf_test *test)
FD_SET(s, &test->write_set);
test->max_fd = (s > test->max_fd) ? s : test->max_fd;
test->streams_accepted++;
streams_accepted++;
connect_msg(sp);
}
FD_CLR(test->prot_listener, &temp_read_set);
}
if (test->streams_accepted == test->num_streams) {
if (streams_accepted == test->num_streams) {
if (test->protocol->id != Ptcp) {
FD_CLR(test->prot_listener, &test->read_set);
close(test->prot_listener);
} else {
if (test->no_delay || test->default_settings->mss) {
if (test->no_delay || test->settings->mss) {
FD_CLR(test->listener, &test->read_set);
close(test->listener);
if ((s = netannounce(Ptcp, NULL, test->server_port)) < 0) {

View File

@ -95,7 +95,7 @@ iperf_tcp_accept(struct iperf_test * test)
return (-1);
}
if (strcmp(test->default_settings->cookie, cookie) != 0) {
if (strcmp(test->cookie, cookie) != 0) {
if (Nwrite(s, &rbuf, sizeof(char), Ptcp) < 0) {
i_errno = IESENDMESSAGE;
return (-1);
@ -118,7 +118,7 @@ iperf_tcp_listen(struct iperf_test *test)
struct sockaddr_in sa;
s = test->listener;
if (test->no_delay || test->default_settings->mss) {
if (test->no_delay || test->settings->mss) {
FD_CLR(s, &test->read_set);
close(s);
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
@ -134,7 +134,7 @@ iperf_tcp_listen(struct iperf_test *test)
printf(" TCP NODELAY: on\n");
}
// XXX: Setting MSS is very buggy!
if ((opt = test->default_settings->mss)) {
if ((opt = test->settings->mss)) {
if (setsockopt(s, IPPROTO_TCP, TCP_MAXSEG, &opt, sizeof(opt)) < 0) {
i_errno = IESETMSS;
return (-1);
@ -203,7 +203,7 @@ iperf_tcp_connect(struct iperf_test *test)
return (-1);
}
}
if ((opt = test->default_settings->mss)) {
if ((opt = test->settings->mss)) {
if (setsockopt(s, IPPROTO_TCP, TCP_MAXSEG, &opt, sizeof(opt)) < 0) {
i_errno = IESETMSS;
return (-1);
@ -216,7 +216,7 @@ iperf_tcp_connect(struct iperf_test *test)
}
/* Send cookie for verification */
if (Nwrite(s, test->default_settings->cookie, COOKIE_SIZE, Ptcp) < 0) {
if (Nwrite(s, test->cookie, COOKIE_SIZE, Ptcp) < 0) {
i_errno = IESENDCOOKIE;
return (-1);
}

View File

@ -249,8 +249,8 @@ iperf_udp_init(struct iperf_test *test)
struct iperf_stream *sp;
/* Calculate the send delay needed to hit target bandwidth (-b) */
dtargus = (int64_t) test->default_settings->blksize * SEC_TO_US * 8;
dtargus /= test->default_settings->rate;
dtargus = (int64_t) test->settings->blksize * SEC_TO_US * 8;
dtargus /= test->settings->rate;
assert(dtargus != 0);