Made the protocol implementation better. Lots of code clean up

This commit is contained in:
sethdelliott 2010-07-22 23:26:38 +00:00
parent 8a0b5a5d18
commit 66ce7ad49d
13 changed files with 148 additions and 374 deletions

View File

@ -118,15 +118,14 @@ struct protocol {
struct iperf_test struct iperf_test
{ {
char role; /* c' lient or 's' erver */ char role; /* c' lient or 's' erver */
int protocol; struct protocol *protocol;
char state; char state;
char *server_hostname; /* -c option */ char *server_hostname; /* -c option */
int server_port; int server_port;
int duration; /* total duration of test (-t flag) */ int duration; /* total duration of test (-t flag) */
int ctrl_sck; int ctrl_sck;
int listener_tcp; int listener;
int listener_udp;
int prot_listener; int prot_listener;
/* boolen variables for Options */ /* boolen variables for Options */
@ -146,7 +145,6 @@ struct iperf_test
fd_set write_set; /* set of write sockets */ fd_set write_set; /* set of write sockets */
int (*accept) (struct iperf_test *); int (*accept) (struct iperf_test *);
struct iperf_stream *(*new_stream) (struct iperf_test *);
/* Interval related members */ /* Interval related members */
int stats_interval; int stats_interval;

View File

@ -52,6 +52,7 @@ usage()
fprintf(stderr, usage_short); fprintf(stderr, usage_short);
} }
void void
usage_long() usage_long()
{ {
@ -59,6 +60,41 @@ usage_long()
fprintf(stderr, usage_long2); fprintf(stderr, usage_long2);
} }
struct protocol *
get_protocol(struct iperf_test *test, int prot_id)
{
struct protocol *prot;
SLIST_FOREACH(prot, &test->protocols, protocols) {
if (prot->id == prot_id)
break;
}
if (prot == NULL)
i_errno = IEPROTOCOL;
return (prot);
}
int
set_protocol(struct iperf_test *test, int prot_id)
{
struct protocol *prot = NULL;
SLIST_FOREACH(prot, &test->protocols, protocols) {
if (prot->id == prot_id) {
test->protocol = prot;
return (0);
}
}
i_errno = IEPROTOCOL;
return (-1);
}
int int
iperf_parse_arguments(struct iperf_test *test, int argc, char **argv) iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
{ {
@ -137,9 +173,8 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
i_errno = IECLIENTONLY; i_errno = IECLIENTONLY;
return (-1); return (-1);
} }
test->protocol = Pudp; set_protocol(test, Pudp);
test->default_settings->blksize = DEFAULT_UDP_BLKSIZE; test->default_settings->blksize = DEFAULT_UDP_BLKSIZE;
test->new_stream = iperf_new_udp_stream;
break; break;
case 'P': case 'P':
if (test->role == 's') { if (test->role == 's') {
@ -346,17 +381,10 @@ int
iperf_init_test(struct iperf_test *test) iperf_init_test(struct iperf_test *test)
{ {
struct iperf_stream *sp; struct iperf_stream *sp;
struct protocol *prot;
int64_t dtargus;
SLIST_FOREACH(prot, &test->protocols, protocols) { if (test->protocol->init) {
if (test->protocol == prot->id) { if (test->protocol->init(test) < 0)
if (prot->init) { return (-1);
if (prot->init(test) < 0)
return (-1);
}
break;
}
} }
/* Set timers */ /* Set timers */
@ -364,10 +392,10 @@ iperf_init_test(struct iperf_test *test)
test->timer = new_timer(test->duration, 0); test->timer = new_timer(test->duration, 0);
if (test->timer == NULL) if (test->timer == NULL)
return (-1); return (-1);
printf(test_start_time, prot->name, test->num_streams, test->default_settings->blksize, printf(test_start_time, test->protocol->name, test->num_streams, test->default_settings->blksize,
test->duration); test->duration);
} else { } else {
printf(test_start_bytes, prot->name, test->num_streams, test->default_settings->blksize, printf(test_start_bytes, test->protocol->name, test->num_streams, test->default_settings->blksize,
test->default_settings->bytes); test->default_settings->bytes);
} }
@ -405,9 +433,9 @@ package_parameters(struct iperf_test *test)
*pstring = ' '; *pstring = ' ';
if (test->protocol == Ptcp) { if (test->protocol->id == Ptcp) {
strncat(pstring, "-p ", sizeof(pstring)); strncat(pstring, "-p ", sizeof(pstring));
} else if (test->protocol == Pudp) { } else if (test->protocol->id == Pudp) {
strncat(pstring, "-u ", sizeof(pstring)); strncat(pstring, "-u ", sizeof(pstring));
} }
@ -496,7 +524,7 @@ parse_parameters(struct iperf_test *test)
while ((ch = getopt(n, params, "pt:n:m:uNP:Rw:l:b:")) != -1) { while ((ch = getopt(n, params, "pt:n:m:uNP:Rw:l:b:")) != -1) {
switch (ch) { switch (ch) {
case 'p': case 'p':
test->protocol = Ptcp; set_protocol(test, Ptcp);
break; break;
case 't': case 't':
test->duration = atoi(optarg); test->duration = atoi(optarg);
@ -508,8 +536,7 @@ parse_parameters(struct iperf_test *test)
test->default_settings->mss = atoi(optarg); test->default_settings->mss = atoi(optarg);
break; break;
case 'u': case 'u':
test->protocol = Pudp; set_protocol(test, Pudp);
test->new_stream = iperf_new_udp_stream;
break; break;
case 'N': case 'N':
test->no_delay = 1; test->no_delay = 1;
@ -550,28 +577,20 @@ int
iperf_exchange_parameters(struct iperf_test * test) iperf_exchange_parameters(struct iperf_test * test)
{ {
int s; int s;
struct protocol *prot;
/*
int s, opt, len;
struct sockaddr_in sa;
*/
if (test->role == 'c') { if (test->role == 'c') {
if (package_parameters(test) < 0) if (package_parameters(test) < 0)
return (-1); return (-1);
} else { } else {
if (parse_parameters(test) < 0) if (parse_parameters(test) < 0)
return (-1); return (-1);
printf(" cookie: %s\n", test->default_settings->cookie); printf(" cookie: %s\n", test->default_settings->cookie);
SLIST_FOREACH(prot, &test->protocols, protocols) { if ((s = test->protocol->listen(test)) < 0)
if (prot->id == test->protocol)
break;
}
if ((s = prot->listen(test)) < 0)
return (-1); return (-1);
FD_SET(s, &test->read_set); FD_SET(s, &test->read_set);
test->max_fd = (s > test->max_fd) ? s : test->max_fd; test->max_fd = (s > test->max_fd) ? s : test->max_fd;
@ -765,25 +784,6 @@ add_to_interval_list(struct iperf_stream_result * rp, struct iperf_interval_resu
} }
} }
/*************************************************************/
/* for debugging only */
void
display_interval_list(struct iperf_stream_result * rp, int tflag)
{
struct iperf_interval_results *n;
float gb = 0.;
n = rp->interval_results;
printf("----------------------------------------\n");
while (n != NULL) {
gb = (float) n->bytes_transferred / (1024. * 1024. * 1024.);
printf("Interval = %f\tGBytes transferred = %.3f\n", n->interval_duration, gb);
if (tflag)
print_tcpinfo(n);
n = n->next;
}
}
/************************************************************/ /************************************************************/
@ -807,36 +807,6 @@ connect_msg(struct iperf_stream * sp)
ipr, ntohs(((struct sockaddr_in *) & sp->remote_addr)->sin_port)); ipr, ntohs(((struct sockaddr_in *) & sp->remote_addr)->sin_port));
} }
/*************************************************************/
/**
* Display -- Displays results for test
* Mainly for DEBUG purpose
*
*/
void
Display(struct iperf_test * test)
{
int count = 1;
struct iperf_stream *n;
n = test->streams;
printf("===============DISPLAY==================\n");
while (n != NULL) {
if (test->role == 'c') {
printf("position-%d\tsp=%llu\tsocket=%d\tMbytes sent=%u\n",
count++, (uint64_t) n, n->socket, (unsigned int) (n->result->bytes_sent / (float) MB));
} else {
printf("position-%d\tsp=%llu\tsocket=%d\tMbytes received=%u\n",
count++, (uint64_t) n, n->socket, (unsigned int) (n->result->bytes_received / (float) MB));
}
n = n->next;
}
printf("=================END====================\n");
fflush(stdout);
}
/**************************************************************************/ /**************************************************************************/
@ -860,16 +830,14 @@ iperf_new_test()
} }
/**************************************************************************/ /**************************************************************************/
void int
iperf_defaults(struct iperf_test * testp) iperf_defaults(struct iperf_test * testp)
{ {
testp->protocol = Ptcp;
testp->duration = DURATION; testp->duration = DURATION;
testp->server_port = PORT; testp->server_port = PORT;
testp->ctrl_sck = -1; testp->ctrl_sck = -1;
testp->prot_listener = -1; testp->prot_listener = -1;
testp->new_stream = iperf_new_tcp_stream;
testp->stats_callback = iperf_stats_callback; testp->stats_callback = iperf_stats_callback;
testp->reporter_callback = iperf_reporter_callback; testp->reporter_callback = iperf_reporter_callback;
@ -917,7 +885,11 @@ iperf_defaults(struct iperf_test * testp)
udp->send = iperf_udp_send; udp->send = iperf_udp_send;
udp->recv = iperf_udp_recv; udp->recv = iperf_udp_recv;
udp->init = iperf_udp_init; udp->init = iperf_udp_init;
SLIST_INSERT_AFTER(tcp, udp, protocols); SLIST_INSERT_AFTER(tcp, udp, protocols);
set_protocol(testp, Ptcp);
return (0);
} }
/**************************************************************************/ /**************************************************************************/
@ -926,17 +898,11 @@ int
iperf_create_streams(struct iperf_test *test) iperf_create_streams(struct iperf_test *test)
{ {
int i, s; int i, s;
struct protocol *prot;
struct iperf_stream *sp; struct iperf_stream *sp;
for (i = 0; i < test->num_streams; ++i) { for (i = 0; i < test->num_streams; ++i) {
SLIST_FOREACH(prot, &test->protocols, protocols) { if ((s = test->protocol->connect(test)) < 0)
if (prot->id == test->protocol)
break;
}
if ((s = prot->connect(test)) < 0)
return (-1); return (-1);
FD_SET(s, &test->read_set); FD_SET(s, &test->read_set);
@ -944,13 +910,9 @@ iperf_create_streams(struct iperf_test *test)
test->max_fd = (test->max_fd < s) ? s : test->max_fd; test->max_fd = (test->max_fd < s) ? s : test->max_fd;
// XXX: This doesn't fit our API model! // XXX: This doesn't fit our API model!
sp = test->new_stream(test); sp = iperf_new_stream(test, s);
if (!sp) if (!sp)
return (-1); return (-1);
sp->socket = s;
if (iperf_init_stream(sp, test) < 0)
return (-1);
iperf_add_stream(test, sp);
connect_msg(sp); connect_msg(sp);
} }
@ -1065,7 +1027,6 @@ iperf_free_test(struct iperf_test * test)
test->accept = NULL; test->accept = NULL;
test->stats_callback = NULL; test->stats_callback = NULL;
test->reporter_callback = NULL; test->reporter_callback = NULL;
test->new_stream = NULL;
free(test); free(test);
} }
@ -1178,7 +1139,7 @@ iperf_reporter_callback(struct iperf_test * test)
total_sent += bytes_sent; total_sent += bytes_sent;
total_received += bytes_received; total_received += bytes_received;
if (test->protocol == Pudp) { if (test->protocol->id == Pudp) {
total_packets += sp->packet_count; total_packets += sp->packet_count;
lost_packets += sp->cnt_error; lost_packets += sp->cnt_error;
avg_jitter += sp->jitter; avg_jitter += sp->jitter;
@ -1187,7 +1148,7 @@ iperf_reporter_callback(struct iperf_test * test)
if (bytes_sent > 0) { if (bytes_sent > 0) {
unit_snprintf(ubuf, UNIT_LEN, (double) (bytes_sent), 'A'); 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->default_settings->unit_format);
if (test->protocol == Ptcp) { if (test->protocol->id == Ptcp) {
printf(" Sent\n"); printf(" Sent\n");
printf(report_bw_format, sp->socket, start_time, end_time, ubuf, nbuf); printf(report_bw_format, sp->socket, start_time, end_time, ubuf, nbuf);
@ -1211,7 +1172,7 @@ iperf_reporter_callback(struct iperf_test * test)
if (bytes_received > 0) { if (bytes_received > 0) {
unit_snprintf(ubuf, UNIT_LEN, (double) bytes_received, 'A'); 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->default_settings->unit_format);
if (test->protocol == Ptcp) { if (test->protocol->id == Ptcp) {
printf(" Received\n"); printf(" Received\n");
printf(report_bw_format, sp->socket, start_time, end_time, ubuf, nbuf); printf(report_bw_format, sp->socket, start_time, end_time, ubuf, nbuf);
} }
@ -1221,7 +1182,7 @@ iperf_reporter_callback(struct iperf_test * test)
if (test->num_streams > 1) { if (test->num_streams > 1) {
unit_snprintf(ubuf, UNIT_LEN, (double) total_sent, 'A'); 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->default_settings->unit_format);
if (test->protocol == Ptcp) { if (test->protocol->id == Ptcp) {
printf(" Total sent\n"); printf(" Total sent\n");
printf(report_sum_bw_format, start_time, end_time, ubuf, nbuf); printf(report_sum_bw_format, start_time, end_time, ubuf, nbuf);
unit_snprintf(ubuf, UNIT_LEN, (double) total_received, 'A'); unit_snprintf(ubuf, UNIT_LEN, (double) total_received, 'A');
@ -1297,7 +1258,7 @@ iperf_free_stream(struct iperf_stream * sp)
/**************************************************************************/ /**************************************************************************/
struct iperf_stream * struct iperf_stream *
iperf_new_stream(struct iperf_test *testp) iperf_new_stream(struct iperf_test *test, int s)
{ {
int i; int i;
struct iperf_stream *sp; struct iperf_stream *sp;
@ -1307,12 +1268,14 @@ iperf_new_stream(struct iperf_test *testp)
i_errno = IECREATESTREAM; i_errno = IECREATESTREAM;
return (NULL); return (NULL);
} }
memset(sp, 0, sizeof(struct iperf_stream)); memset(sp, 0, sizeof(struct iperf_stream));
sp->buffer = (char *) malloc(testp->default_settings->blksize); sp->buffer = (char *) malloc(test->default_settings->blksize);
sp->settings = (struct iperf_settings *) malloc(sizeof(struct iperf_settings)); sp->settings = (struct iperf_settings *) malloc(sizeof(struct iperf_settings));
sp->result = (struct iperf_stream_result *) malloc(sizeof(struct iperf_stream_result)); sp->result = (struct iperf_stream_result *) malloc(sizeof(struct iperf_stream_result));
if (!sp->buffer) { if (!sp->buffer) {
i_errno = IECREATESTREAM; i_errno = IECREATESTREAM;
return (NULL); return (NULL);
@ -1325,37 +1288,30 @@ iperf_new_stream(struct iperf_test *testp)
i_errno = IECREATESTREAM; i_errno = IECREATESTREAM;
return (NULL); return (NULL);
} }
memset(sp->result, 0, sizeof(struct iperf_stream_result));
/* Make a per stream copy of default_settings in each stream structure */ /* Make a per stream copy of default_settings in each stream structure */
// XXX: These settings need to be moved to the test struct // XXX: These settings need to be moved to the test struct
memcpy(sp->settings, testp->default_settings, sizeof(struct iperf_settings)); memcpy(sp->settings, test->default_settings, sizeof(struct iperf_settings));
/* Randomize the buffer */ /* Randomize the buffer */
srandom(time(0)); srandom(time(NULL));
for (i = 0; i < testp->default_settings->blksize; ++i) for (i = 0; i < test->default_settings->blksize; ++i)
sp->buffer[i] = random(); sp->buffer[i] = random();
sp->socket = -1; /* Set socket */
sp->socket = s;
// XXX: Some of this code is needed, even though everything is already zero. sp->snd = test->protocol->send;
sp->packet_count = 0; sp->rcv = test->protocol->recv;
sp->jitter = 0.0;
sp->prev_transit = 0.0;
sp->outoforder_packets = 0;
sp->cnt_error = 0;
sp->send_timer = NULL; /* Initialize stream */
sp->next = NULL; if (iperf_init_stream(sp, test) < 0)
return (NULL);
iperf_add_stream(test, sp);
sp->result->interval_results = NULL; return (sp);
sp->result->last_interval_results = NULL;
sp->result->bytes_received = 0;
sp->result->bytes_sent = 0;
sp->result->bytes_received_this_interval = 0;
sp->result->bytes_sent_this_interval = 0;
sp->settings->state = STREAM_BEGIN;
return sp;
} }
/**************************************************************************/ /**************************************************************************/
@ -1374,17 +1330,13 @@ iperf_init_stream(struct iperf_stream * sp, struct iperf_test * testp)
i_errno = IEINITSTREAM; i_errno = IEINITSTREAM;
return (-1); return (-1);
} }
if (testp->protocol == Ptcp) { if (testp->protocol->id == Ptcp) {
// XXX: This property is for all sockets, not just TCP // 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->default_settings->socket_bufsize,
testp->role == 's' ? SO_RCVBUF : SO_SNDBUF) < 0) { testp->role == 's' ? SO_RCVBUF : SO_SNDBUF) < 0) {
i_errno = IESETWINDOWSIZE; i_errno = IESETWINDOWSIZE;
return (-1); return (-1);
} }
/* set TCP_NODELAY and TCP_MAXSEG if requested */
// XXX: This has been moved
// set_tcp_options(sp->socket, testp->no_delay, testp->default_settings->mss);
} }
return (0); return (0);
@ -1518,5 +1470,5 @@ iperf_run_client(struct iperf_test * test)
} }
} }
return 0; return (0);
} }

View File

@ -8,6 +8,7 @@
#ifndef __IPERF_API_H #ifndef __IPERF_API_H
#define __IPERF_API_H #define __IPERF_API_H
#include <setjmp.h>
#include "iperf.h" #include "iperf.h"
/** /**
@ -22,13 +23,6 @@ int iperf_exchange_parameters(struct iperf_test * test);
*/ */
void add_to_interval_list(struct iperf_stream_result * rp, struct iperf_interval_results *temp); void add_to_interval_list(struct iperf_stream_result * rp, struct iperf_interval_results *temp);
/**
* Display -- Displays interval results for test
* Mainly for DEBUG purpose
*
*/
void display_interval_list(struct iperf_stream_result * rp, int tflag);
/** /**
* connect_msg -- displays connection message * connect_msg -- displays connection message
* denoting senfer/receiver details * denoting senfer/receiver details
@ -36,16 +30,6 @@ void display_interval_list(struct iperf_stream_result * rp, int tflag);
*/ */
void connect_msg(struct iperf_stream * sp); void connect_msg(struct iperf_stream * sp);
/**
* Display -- Displays streams in a test
* Mainly for DEBUG purpose
*
*/
void Display(struct iperf_test * test);
/** /**
* iperf_stats_callback -- handles the statistic gathering * iperf_stats_callback -- handles the statistic gathering
* *
@ -74,7 +58,7 @@ int iperf_run_client(struct iperf_test * test);
*/ */
struct iperf_test *iperf_new_test(); struct iperf_test *iperf_new_test();
void iperf_defaults(struct iperf_test * testp); int iperf_defaults(struct iperf_test * testp);
/** /**
@ -91,9 +75,7 @@ void iperf_free_test(struct iperf_test * testp);
* returns NULL on failure * returns NULL on failure
* *
*/ */
struct iperf_stream *iperf_new_stream(struct iperf_test * testp); struct iperf_stream *iperf_new_stream(struct iperf_test *, int);
struct iperf_stream *iperf_new_udp_stream(struct iperf_test * testp);
/** /**
* iperf_add_stream -- add a stream to a test * iperf_add_stream -- add a stream to a test
@ -116,6 +98,7 @@ void iperf_free_stream(struct iperf_stream * sp);
void get_tcpinfo(struct iperf_test *test, struct iperf_interval_results *rp); void get_tcpinfo(struct iperf_test *test, struct iperf_interval_results *rp);
void print_tcpinfo(struct iperf_interval_results *); void print_tcpinfo(struct iperf_interval_results *);
void build_tcpinfo_message(struct iperf_interval_results *r, char *message); void build_tcpinfo_message(struct iperf_interval_results *r, char *message);
void print_interval_results(struct iperf_test * test, struct iperf_stream *sp); void print_interval_results(struct iperf_test * test, struct iperf_stream *sp);
int iperf_connect(struct iperf_test *); int iperf_connect(struct iperf_test *);
int iperf_client_end(struct iperf_test *); int iperf_client_end(struct iperf_test *);
@ -134,5 +117,10 @@ int parse_results(struct iperf_test *, char *);
int iperf_init_test(struct iperf_test *); int iperf_init_test(struct iperf_test *);
int iperf_parse_arguments(struct iperf_test *, int, char **); int iperf_parse_arguments(struct iperf_test *, int, char **);
struct protocol *get_protocol(struct iperf_test *, int);
int set_protocol(struct iperf_test *, int);
extern jmp_buf env;
#endif #endif

View File

@ -125,6 +125,9 @@ iperf_strerror(int i_errno)
case IESETWINDOWSIZE: case IESETWINDOWSIZE:
snprintf(errstr, len, "unable to set socket window size"); snprintf(errstr, len, "unable to set socket window size");
break; break;
case IEPROTOCOL:
snprintf(errstr, len, "protocol does not exist");
break;
case IECREATESTREAM: case IECREATESTREAM:
snprintf(errstr, len, "unable to create a new stream"); snprintf(errstr, len, "unable to create a new stream");
break; break;

View File

@ -52,21 +52,22 @@ enum {
IEREUSEADDR = 33, // Unable to set reuse address on socket (check perror) IEREUSEADDR = 33, // Unable to set reuse address on socket (check perror)
IENONBLOCKING = 34, // Unable to set socket to non-blocking (check perror) IENONBLOCKING = 34, // Unable to set socket to non-blocking (check perror)
IESETWINDOWSIZE = 35, // Unable to set socket window size (check perror) IESETWINDOWSIZE = 35, // Unable to set socket window size (check perror)
IEPROTOCOL = 36, // Protocol does not exist
/* Stream errors */ /* Stream errors */
IECREATESTREAM = 36, // Unable to create a new stream (check herror/perror) IECREATESTREAM = 37, // Unable to create a new stream (check herror/perror)
IEINITSTREAM = 37, // Unable to initialize stream (check herror/perror) IEINITSTREAM = 38, // Unable to initialize stream (check herror/perror)
IESTREAMLISTEN = 38, // Unable to start stream listener (check perror) IESTREAMLISTEN = 39, // Unable to start stream listener (check perror)
IESTREAMCONNECT = 39, // Unable to connect stream (check herror/perror) IESTREAMCONNECT = 40, // Unable to connect stream (check herror/perror)
IESTREAMACCEPT = 40, // Unable to accepte stream connection (check perror) IESTREAMACCEPT = 41, // Unable to accepte stream connection (check perror)
IESTREAMWRITE = 41, // Unable to write to stream socket (check perror) IESTREAMWRITE = 42, // Unable to write to stream socket (check perror)
IESTREAMREAD = 42, // Unable to read from stream (check perror) IESTREAMREAD = 43, // Unable to read from stream (check perror)
IESTREAMCLOSE = 43, // Stream has closed unexpectedly IESTREAMCLOSE = 44, // Stream has closed unexpectedly
IESTREAMID = 44, // Stream has invalid ID IESTREAMID = 45, // Stream has invalid ID
/* Timer errors */ /* Timer errors */
IENEWTIMER = 45, // Unable to create new timer (check perror) IENEWTIMER = 46, // Unable to create new timer (check perror)
IEUPDATETIMER = 46, // Unable to update timer (check perror) IEUPDATETIMER = 47, // Unable to update timer (check perror)
}; };
#endif #endif

View File

@ -45,7 +45,6 @@
#include "iperf_util.h" #include "iperf_util.h"
#include "locale.h" #include "locale.h"
jmp_buf env;
int int
iperf_server_listen(struct iperf_test *test) iperf_server_listen(struct iperf_test *test)
@ -53,7 +52,7 @@ iperf_server_listen(struct iperf_test *test)
char ubuf[UNIT_LEN]; char ubuf[UNIT_LEN];
int x; int x;
if((test->listener_tcp = netannounce(Ptcp, NULL, test->server_port)) < 0) { if((test->listener = netannounce(Ptcp, NULL, test->server_port)) < 0) {
i_errno = IELISTEN; i_errno = IELISTEN;
return (-1); return (-1);
} }
@ -64,7 +63,7 @@ iperf_server_listen(struct iperf_test *test)
// This needs to be changed to reflect if client has different window size // This needs to be changed to reflect if client has different window size
// make sure we got what we asked for // make sure we got what we asked for
/* XXX: This needs to be moved to the stream listener /* XXX: This needs to be moved to the stream listener
if ((x = get_tcp_windowsize(test->listener_tcp, SO_RCVBUF)) < 0) { if ((x = get_tcp_windowsize(test->listener, SO_RCVBUF)) < 0) {
// Needs to set some sort of error number/message // Needs to set some sort of error number/message
perror("SO_RCVBUF"); perror("SO_RCVBUF");
return -1; return -1;
@ -73,7 +72,7 @@ iperf_server_listen(struct iperf_test *test)
// XXX: This code needs to be moved to after parameter exhange // XXX: This code needs to be moved to after parameter exhange
/* /*
if (test->protocol == Ptcp) { if (test->protocol->id == Ptcp) {
if (test->default_settings->socket_bufsize > 0) { if (test->default_settings->socket_bufsize > 0) {
unit_snprintf(ubuf, UNIT_LEN, (double) x, 'A'); unit_snprintf(ubuf, UNIT_LEN, (double) x, 'A');
printf("TCP window size: %s\n", ubuf); printf("TCP window size: %s\n", ubuf);
@ -86,8 +85,8 @@ iperf_server_listen(struct iperf_test *test)
FD_ZERO(&test->read_set); FD_ZERO(&test->read_set);
FD_ZERO(&test->write_set); FD_ZERO(&test->write_set);
FD_SET(test->listener_tcp, &test->read_set); FD_SET(test->listener, &test->read_set);
test->max_fd = (test->listener_tcp > test->max_fd) ? test->listener_tcp : test->max_fd; test->max_fd = (test->listener > test->max_fd) ? test->listener : test->max_fd;
return 0; return 0;
} }
@ -104,7 +103,7 @@ iperf_accept(struct iperf_test *test)
struct sockaddr_in temp1, temp2; struct sockaddr_in temp1, temp2;
len = sizeof(addr); len = sizeof(addr);
if ((s = accept(test->listener_tcp, (struct sockaddr *) &addr, &len)) < 0) { if ((s = accept(test->listener, (struct sockaddr *) &addr, &len)) < 0) {
i_errno = IEACCEPT; i_errno = IEACCEPT;
return (-1); return (-1);
} }
@ -162,51 +161,6 @@ iperf_accept(struct iperf_test *test)
} }
int
iperf_accept_tcp_stream(struct iperf_test *test)
{
int s;
int rbuf = ACCESS_DENIED;
char cookie[COOKIE_SIZE];
socklen_t len;
struct sockaddr_in addr;
struct iperf_stream *sp;
len = sizeof(addr);
if ((s = accept(test->listener_tcp, (struct sockaddr *) &addr, &len)) < 0) {
i_errno = IESTREAMCONNECT;
return (-1);
}
if (Nread(s, cookie, COOKIE_SIZE, Ptcp) < 0) {
i_errno = IERECVCOOKIE;
return (-1);
}
if (strcmp(test->default_settings->cookie, cookie) == 0) {
// XXX: CANNOT USE iperf_tcp_accept since stream is already accepted at this point. New model needed!
sp = test->new_stream(test);
if (!sp)
return (-1);
sp->socket = s;
if (iperf_init_stream(sp, test) < 0)
return (-1);
iperf_add_stream(test, sp);
FD_SET(s, &test->read_set);
FD_SET(s, &test->write_set);
test->max_fd = (s > test->max_fd) ? s : test->max_fd;
test->streams_accepted++;
connect_msg(sp);
} else {
if (Nwrite(s, &rbuf, sizeof(char), Ptcp) < 0) {
i_errno = IESENDMESSAGE;
return (-1);
}
close(s);
}
return (0);
}
/**************************************************************************/ /**************************************************************************/
int int
iperf_handle_message_server(struct iperf_test *test) iperf_handle_message_server(struct iperf_test *test)
@ -292,23 +246,23 @@ iperf_test_reset(struct iperf_test *test)
test->streams = NULL; test->streams = NULL;
test->role = 's'; test->role = 's';
test->protocol = Ptcp; set_protocol(test, Ptcp);
test->duration = DURATION; test->duration = DURATION;
test->state = 0; test->state = 0;
test->server_hostname = NULL; test->server_hostname = NULL;
test->ctrl_sck = -1; test->ctrl_sck = -1;
test->prot_listener = -1;
test->bytes_sent = 0; test->bytes_sent = 0;
test->new_stream = iperf_new_tcp_stream;
test->reverse = 0; test->reverse = 0;
test->no_delay = 0; test->no_delay = 0;
FD_ZERO(&test->read_set); FD_ZERO(&test->read_set);
FD_ZERO(&test->write_set); FD_ZERO(&test->write_set);
FD_SET(test->listener_tcp, &test->read_set); FD_SET(test->listener, &test->read_set);
test->max_fd = test->listener_tcp; test->max_fd = test->listener;
test->num_streams = 1; test->num_streams = 1;
test->streams_accepted = 0; test->streams_accepted = 0;
@ -325,7 +279,6 @@ iperf_run_server(struct iperf_test *test)
int result, s; int result, s;
fd_set temp_read_set, temp_write_set; fd_set temp_read_set, temp_write_set;
struct iperf_stream *sp; struct iperf_stream *sp;
struct protocol *prot;
struct timeval tv; struct timeval tv;
// Open socket and listen // Open socket and listen
@ -342,7 +295,7 @@ iperf_run_server(struct iperf_test *test)
return (-1); return (-1);
} }
} }
return 0; return (0);
} }
for ( ; ; ) { for ( ; ; ) {
@ -361,12 +314,12 @@ iperf_run_server(struct iperf_test *test)
i_errno = IESELECT; i_errno = IESELECT;
return (-1); return (-1);
} else if (result > 0) { } else if (result > 0) {
if (FD_ISSET(test->listener_tcp, &temp_read_set)) { if (FD_ISSET(test->listener, &temp_read_set)) {
if (test->state != CREATE_STREAMS) { if (test->state != CREATE_STREAMS) {
if (iperf_accept(test) < 0) { if (iperf_accept(test) < 0) {
return (-1); return (-1);
} }
FD_CLR(test->listener_tcp, &temp_read_set); FD_CLR(test->listener, &temp_read_set);
} }
} }
if (FD_ISSET(test->ctrl_sck, &temp_read_set)) { if (FD_ISSET(test->ctrl_sck, &temp_read_set)) {
@ -378,25 +331,18 @@ iperf_run_server(struct iperf_test *test)
if (test->state == CREATE_STREAMS) { if (test->state == CREATE_STREAMS) {
if (FD_ISSET(test->prot_listener, &temp_read_set)) { if (FD_ISSET(test->prot_listener, &temp_read_set)) {
SLIST_FOREACH(prot, &test->protocols, protocols) { if ((s = test->protocol->accept(test)) < 0)
if (prot->id == test->protocol)
break;
}
if ((s = prot->accept(test)) < 0)
return (-1); return (-1);
if (!is_closed(s)) { if (!is_closed(s)) {
sp = test->new_stream(test); sp = iperf_new_stream(test, s);
if (!sp) if (!sp)
return (-1); return (-1);
sp->socket = s;
if (iperf_init_stream(sp, test) < 0)
return (-1);
iperf_add_stream(test, sp);
FD_SET(s, &test->read_set); FD_SET(s, &test->read_set);
FD_SET(s, &test->write_set); FD_SET(s, &test->write_set);
test->max_fd = (s > test->max_fd) ? s : test->max_fd; test->max_fd = (s > test->max_fd) ? s : test->max_fd;
test->streams_accepted++; test->streams_accepted++;
connect_msg(sp); connect_msg(sp);
} }
@ -404,20 +350,20 @@ iperf_run_server(struct iperf_test *test)
} }
if (test->streams_accepted == test->num_streams) { if (test->streams_accepted == test->num_streams) {
if (test->protocol != Ptcp) { if (test->protocol->id != Ptcp) {
FD_CLR(test->prot_listener, &test->read_set); FD_CLR(test->prot_listener, &test->read_set);
close(test->prot_listener); close(test->prot_listener);
} else if (test->protocol == Ptcp) { } else {
if (test->no_delay || test->default_settings->mss) { if (test->no_delay || test->default_settings->mss) {
FD_CLR(test->listener_tcp, &test->read_set); FD_CLR(test->listener, &test->read_set);
close(test->listener_tcp); close(test->listener);
if ((s = netannounce(Ptcp, NULL, test->server_port)) < 0) { if ((s = netannounce(Ptcp, NULL, test->server_port)) < 0) {
i_errno = IELISTEN; i_errno = IELISTEN;
return (-1); return (-1);
} }
test->listener_tcp = s; test->listener = s;
test->max_fd = (s > test->max_fd ? s : test->max_fd); test->max_fd = (s > test->max_fd ? s : test->max_fd);
FD_SET(test->listener_tcp, &test->read_set); FD_SET(test->listener, &test->read_set);
} }
} }
test->prot_listener = -1; test->prot_listener = -1;

View File

@ -9,10 +9,6 @@ int iperf_server_listen(struct iperf_test *);
int iperf_accept(struct iperf_test *); int iperf_accept(struct iperf_test *);
int iperf_accept_tcp_stream(struct iperf_test *);
int iperf_accept_udp_stream(struct iperf_test *);
int iperf_handle_message_server(struct iperf_test *); int iperf_handle_message_server(struct iperf_test *);
void iperf_test_reset(struct iperf_test *); void iperf_test_reset(struct iperf_test *);

View File

@ -5,43 +5,24 @@
* approvals from the U.S. Dept. of Energy). All rights reserved. * approvals from the U.S. Dept. of Energy). All rights reserved.
*/ */
// XXX: Surely we do not need all these headers!
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <getopt.h>
#include <errno.h> #include <errno.h>
#include <signal.h>
#include <unistd.h> #include <unistd.h>
#include <assert.h>
#include <fcntl.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h> #include <netdb.h>
#include <pthread.h>
#include <stdint.h>
#include <netinet/tcp.h> #include <netinet/tcp.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/resource.h> #include <sys/select.h>
#include <sched.h>
#include <signal.h>
#include <setjmp.h>
#include "iperf.h" #include "iperf.h"
#include "iperf_api.h" #include "iperf_api.h"
#include "iperf_error.h"
#include "iperf_server_api.h"
#include "iperf_tcp.h" #include "iperf_tcp.h"
#include "timer.h" #include "iperf_error.h"
#include "net.h" #include "net.h"
#include "tcp_window_size.h"
#include "iperf_util.h"
#include "locale.h"
// XXX: Does this belong here? We should probably declare this in iperf_api.c then put an extern in the header
jmp_buf env; /* to handle longjmp on signal */
/* iperf_tcp_recv /* iperf_tcp_recv
@ -49,7 +30,7 @@ jmp_buf env; /* to handle longjmp on signal */
* receives the data for TCP * receives the data for TCP
*/ */
int int
iperf_tcp_recv(struct iperf_stream * sp) iperf_tcp_recv(struct iperf_stream *sp)
{ {
int result = 0; int result = 0;
int size = sp->settings->blksize; int size = sp->settings->blksize;
@ -72,7 +53,7 @@ iperf_tcp_recv(struct iperf_stream * sp)
* sends the data for TCP * sends the data for TCP
*/ */
int int
iperf_tcp_send(struct iperf_stream * sp) iperf_tcp_send(struct iperf_stream *sp)
{ {
int result; int result;
int size = sp->settings->blksize; int size = sp->settings->blksize;
@ -90,24 +71,6 @@ iperf_tcp_send(struct iperf_stream * sp)
} }
// XXX: This function is now deprecated
/**************************************************************************/
struct iperf_stream *
iperf_new_tcp_stream(struct iperf_test * testp)
{
struct iperf_stream *sp;
sp = (struct iperf_stream *) iperf_new_stream(testp);
if (!sp) {
return (NULL);
}
sp->rcv = iperf_tcp_recv; /* pointer to receive function */
sp->snd = iperf_tcp_send; /* pointer to send function */
return sp;
}
/* iperf_tcp_accept /* iperf_tcp_accept
* *
* accept a new TCP stream connection * accept a new TCP stream connection
@ -122,7 +85,7 @@ iperf_tcp_accept(struct iperf_test * test)
struct sockaddr_in addr; struct sockaddr_in addr;
len = sizeof(addr); len = sizeof(addr);
if ((s = accept(test->listener_tcp, (struct sockaddr *) &addr, &len)) < 0) { if ((s = accept(test->listener, (struct sockaddr *) &addr, &len)) < 0) {
i_errno = IESTREAMCONNECT; i_errno = IESTREAMCONNECT;
return (-1); return (-1);
} }
@ -153,7 +116,7 @@ iperf_tcp_listen(struct iperf_test *test)
{ {
int s, opt; int s, opt;
struct sockaddr_in sa; struct sockaddr_in sa;
s = test->listener_tcp; s = test->listener;
if (test->no_delay || test->default_settings->mss) { if (test->no_delay || test->default_settings->mss) {
FD_CLR(s, &test->read_set); FD_CLR(s, &test->read_set);
@ -200,11 +163,7 @@ iperf_tcp_listen(struct iperf_test *test)
return (-1); return (-1);
} }
test->listener_tcp = s; test->listener = s;
/*
test->max_fd = (s > test->max_fd) ? s : test->max_fd;
FD_SET(test->listener_tcp, &test->read_set);
*/
} }
return (s); return (s);
@ -244,7 +203,7 @@ iperf_tcp_connect(struct iperf_test *test)
return (-1); return (-1);
} }
} }
if (opt = test->default_settings->mss) { if ((opt = test->default_settings->mss)) {
if (setsockopt(s, IPPROTO_TCP, TCP_MAXSEG, &opt, sizeof(opt)) < 0) { if (setsockopt(s, IPPROTO_TCP, TCP_MAXSEG, &opt, sizeof(opt)) < 0) {
i_errno = IESETMSS; i_errno = IESETMSS;
return (-1); return (-1);

View File

@ -7,6 +7,7 @@
#ifndef IPERF_TCP_H #ifndef IPERF_TCP_H
#define IPERF_TCP_H #define IPERF_TCP_H
/** /**
* iperf_tcp_accept -- accepts a new TCP connection * iperf_tcp_accept -- accepts a new TCP connection
* on tcp_listener_socket for TCP data and param/result * on tcp_listener_socket for TCP data and param/result
@ -14,7 +15,7 @@
*returns 0 on success *returns 0 on success
* *
*/ */
int iperf_tcp_accept(struct iperf_test *); int iperf_tcp_accept(struct iperf_test *);
/** /**
* iperf_tcp_recv -- receives the data for TCP * iperf_tcp_recv -- receives the data for TCP
@ -22,7 +23,7 @@ int iperf_tcp_accept(struct iperf_test *);
*returns state of packet received *returns state of packet received
* *
*/ */
int iperf_tcp_recv(struct iperf_stream *); int iperf_tcp_recv(struct iperf_stream *);
/** /**
@ -31,7 +32,7 @@ int iperf_tcp_recv(struct iperf_stream *);
* returns: bytes sent * returns: bytes sent
* *
*/ */
int iperf_tcp_send(struct iperf_stream *); int iperf_tcp_send(struct iperf_stream *);
int iperf_tcp_listen(struct iperf_test *); int iperf_tcp_listen(struct iperf_test *);
@ -39,7 +40,5 @@ int iperf_tcp_listen(struct iperf_test *);
int iperf_tcp_connect(struct iperf_test *); int iperf_tcp_connect(struct iperf_test *);
struct iperf_stream *iperf_new_tcp_stream(struct iperf_test * testp); #endif
#endif /* IPERF_TCP_H */

View File

@ -5,34 +5,19 @@
* approvals from the U.S. Dept. of Energy). All rights reserved. * approvals from the U.S. Dept. of Energy). All rights reserved.
*/ */
/* iperf_udp.c: UDP specific routines for iperf
*
* NOTE: not yet finished / working
*/
// XXX: Do we really need all these headers?
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <getopt.h>
#include <errno.h> #include <errno.h>
#include <signal.h>
#include <unistd.h> #include <unistd.h>
#include <assert.h> #include <assert.h>
#include <fcntl.h>
#include <sys/socket.h> #include <sys/socket.h>
#include <sys/types.h> #include <sys/types.h>
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <pthread.h>
#include <stdint.h> #include <stdint.h>
#include <netinet/tcp.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/resource.h> #include <sys/select.h>
#include <sched.h>
#include <signal.h>
#include <setjmp.h>
#include "iperf.h" #include "iperf.h"
#include "iperf_api.h" #include "iperf_api.h"
@ -40,7 +25,6 @@
#include "iperf_error.h" #include "iperf_error.h"
#include "timer.h" #include "timer.h"
#include "net.h" #include "net.h"
#include "locale.h"
/* iperf_udp_recv /* iperf_udp_recv
@ -158,22 +142,6 @@ iperf_udp_send(struct iperf_stream *sp)
return (result); return (result);
} }
/**************************************************************************/
// XXX: This function is deprecated
struct iperf_stream *
iperf_new_udp_stream(struct iperf_test * testp)
{
struct iperf_stream *sp;
sp = (struct iperf_stream *) iperf_new_stream(testp);
if (!sp) {
return (NULL);
}
sp->rcv = iperf_udp_recv;
sp->snd = iperf_udp_send;
return sp;
}
/**************************************************************************/ /**************************************************************************/
@ -184,7 +152,6 @@ iperf_new_udp_stream(struct iperf_test * testp)
int int
iperf_udp_accept(struct iperf_test *test) iperf_udp_accept(struct iperf_test *test)
{ {
struct iperf_stream *sp;
struct sockaddr_in sa_peer; struct sockaddr_in sa_peer;
int buf; int buf;
socklen_t len; socklen_t len;
@ -202,18 +169,6 @@ iperf_udp_accept(struct iperf_test *test)
i_errno = IESTREAMACCEPT; i_errno = IESTREAMACCEPT;
return (-1); return (-1);
} }
/*
sp = test->new_stream(test);
if (!sp)
return (-1);
sp->socket = s;
if (iperf_init_stream(sp, test) < 0)
return (-1);
iperf_add_stream(test, sp);
FD_SET(s, &test->read_set);
FD_SET(s, &test->write_set);
test->max_fd = (s > test->max_fd) ? s : test->max_fd;
*/
test->prot_listener = netannounce(Pudp, NULL, test->server_port); test->prot_listener = netannounce(Pudp, NULL, test->server_port);
if (test->prot_listener < 0) { if (test->prot_listener < 0) {

View File

@ -9,22 +9,13 @@
#define __IPERF_UDP_H #define __IPERF_UDP_H
/**
* iperf_udp_accept -- accepts a new UDP connection
* on udp_listener_socket
*returns 0 on success
*
*/
int iperf_udp_accept(struct iperf_test *);
/** /**
* iperf_udp_recv -- receives the client data for UDP * iperf_udp_recv -- receives the client data for UDP
* *
*returns state of packet received *returns state of packet received
* *
*/ */
int iperf_udp_recv(struct iperf_stream *); int iperf_udp_recv(struct iperf_stream *);
/** /**
* iperf_udp_send -- sends the client data for UDP * iperf_udp_send -- sends the client data for UDP
@ -32,7 +23,7 @@ int iperf_udp_recv(struct iperf_stream *);
* returns: bytes sent * returns: bytes sent
* *
*/ */
int iperf_udp_send(struct iperf_stream *); int iperf_udp_send(struct iperf_stream *);
/** /**
@ -41,7 +32,7 @@ int iperf_udp_send(struct iperf_stream *);
*returns 0 on success *returns 0 on success
* *
*/ */
int iperf_udp_accept(struct iperf_test *); int iperf_udp_accept(struct iperf_test *);
int iperf_udp_listen(struct iperf_test *); int iperf_udp_listen(struct iperf_test *);
@ -50,8 +41,6 @@ int iperf_udp_connect(struct iperf_test *);
int iperf_udp_init(struct iperf_test *); int iperf_udp_init(struct iperf_test *);
struct iperf_stream *iperf_new_udp_stream(struct iperf_test * testp);
#endif
#endif /* IPERF_UDP_H */

View File

@ -38,9 +38,7 @@ int iperf_run(struct iperf_test *);
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
char ch, role;
struct iperf_test *test; struct iperf_test *test;
int port = PORT;
// XXX: Setting the process affinity requires root on most systems. // XXX: Setting the process affinity requires root on most systems.
// Is this a feature we really need? // Is this a feature we really need?

View File

@ -25,7 +25,6 @@ netdial(int proto, char *client, int port)
int s; int s;
struct hostent *hent; struct hostent *hent;
struct sockaddr_in sa; struct sockaddr_in sa;
socklen_t sn;
/* XXX: This is not working for non-fully qualified host names use getaddrinfo() instead? */ /* XXX: This is not working for non-fully qualified host names use getaddrinfo() instead? */
if ((hent = gethostbyname(client)) == 0) { if ((hent = gethostbyname(client)) == 0) {
@ -46,15 +45,6 @@ netdial(int proto, char *client, int port)
return (-1); return (-1);
} }
/* XXX: Consider deleting
sn = sizeof sa;
// XXX: Is there a reason to call getpeername() if none of the return values are used?
if (getpeername(s, (struct sockaddr *) & sa, &sn) < 0) {
return (-1);
}
*/
return (s); return (s);
} }