diff --git a/src/iperf.h b/src/iperf.h index ac6fd22..145693a 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -40,8 +40,8 @@ struct iperf_stream_result iperf_size_t bytes_sent_this_interval; struct timeval start_time; struct timeval end_time; - struct iperf_interval_results *interval_results; /* head of list */ - struct iperf_interval_results *last_interval_results; /* end of list */ + struct iperf_interval_results *interval_results; // head of list + struct iperf_interval_results *last_interval_results; // end of list void *data; }; @@ -92,7 +92,8 @@ struct iperf_stream int (*rcv) (struct iperf_stream * stream); int (*snd) (struct iperf_stream * stream); - struct iperf_stream *next; +// struct iperf_stream *next; + SLIST_ENTRY(iperf_stream) streams; void *data; }; @@ -155,10 +156,11 @@ struct iperf_test iperf_size_t bytes_sent; char cookie[COOKIE_SIZE]; - struct iperf_stream *streams; /* pointer to list of struct stream */ +// struct iperf_stream *streams; /* pointer to list of struct stream */ + SLIST_HEAD(slisthead, iperf_stream) streams; struct iperf_settings *settings; - SLIST_HEAD(slisthead, protocol) protocols; + SLIST_HEAD(plisthead, protocol) protocols; /* callback functions */ void (*on_new_stream)(struct iperf_stream *); diff --git a/src/iperf_api.c b/src/iperf_api.c index c47fa38..2ca452c 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -400,7 +400,8 @@ iperf_send(struct iperf_test *test) return (-1); } if (result > 0) { - for (sp = test->streams; sp != NULL; sp = sp->next) { +// for (sp = test->streams; sp != NULL; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { if (FD_ISSET(sp->socket, &temp_write_set)) { if ((bytes_sent = sp->snd(sp)) < 0) { i_errno = IESTREAMWRITE; @@ -434,7 +435,8 @@ iperf_recv(struct iperf_test *test) return (-1); } if (result > 0) { - for (sp = test->streams; sp != NULL; sp = sp->next) { +// for (sp = test->streams; sp != NULL; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { if (FD_ISSET(sp->socket, &temp_read_set)) { if ((bytes_sent = sp->rcv(sp)) < 0) { i_errno = IESTREAMREAD; @@ -478,7 +480,8 @@ iperf_init_test(struct iperf_test *test) } /* Set start time */ - for (sp = test->streams; sp; sp = sp->next) { +// for (sp = test->streams; sp; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { if (gettimeofday(&sp->result->start_time, NULL) < 0) { i_errno = IEINITTEST; return (-1); @@ -691,7 +694,8 @@ iperf_exchange_results(struct iperf_test *test) /* Prepare results string and send to server */ results = NULL; size = 0; - for (sp = test->streams; sp; sp = sp->next) { +// for (sp = test->streams; sp; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { bytes_transferred = (test->reverse ? sp->result->bytes_received : sp->result->bytes_sent); snprintf(buf, 128, "%d:%llu,%lf,%d,%d\n", sp->id, bytes_transferred,sp->jitter, sp->cnt_error, sp->packet_count); @@ -700,7 +704,7 @@ iperf_exchange_results(struct iperf_test *test) i_errno = IEPACKAGERESULTS; return (-1); } - if (sp == test->streams) + if (sp == SLIST_FIRST(&test->streams)) *results = '\0'; strncat(results, buf, size+1); } @@ -764,7 +768,8 @@ iperf_exchange_results(struct iperf_test *test) /* Prepare results string and send to client */ results = NULL; size = 0; - for (sp = test->streams; sp; sp = sp->next) { +// for (sp = test->streams; sp; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { bytes_transferred = (test->reverse ? sp->result->bytes_sent : sp->result->bytes_received); snprintf(buf, 128, "%d:%llu,%lf,%d,%d\n", sp->id, bytes_transferred, sp->jitter, sp->cnt_error, sp->packet_count); @@ -773,7 +778,7 @@ iperf_exchange_results(struct iperf_test *test) i_errno = IEPACKAGERESULTS; return (-1); } - if (sp == test->streams) + if (sp == SLIST_FIRST(&test->streams)) *results = '\0'; strncat(results, buf, size+1); } @@ -808,7 +813,8 @@ parse_results(struct iperf_test *test, char *results) for (strp = results; *strp; strp = strchr(strp, '\n')+1) { sscanf(strp, "%d:%llu,%lf,%d,%d\n", &sid, &bytes_transferred, &jitter, &cerror, &pcount); - for (sp = test->streams; sp; sp = sp->next) +// for (sp = test->streams; sp; sp = sp->next) + SLIST_FOREACH(sp, &test->streams, streams) if (sp->id == sid) break; if (sp == NULL) { i_errno = IESTREAMID; @@ -930,6 +936,7 @@ iperf_defaults(struct iperf_test * testp) memset(testp->cookie, 0, COOKIE_SIZE); /* Set up protocol list */ + SLIST_INIT(&testp->streams); SLIST_INIT(&testp->protocols); struct protocol *tcp, *udp; @@ -992,7 +999,7 @@ iperf_free_test(struct iperf_test * test) } /* XXX: Why are we setting these values to NULL? */ - test->streams = NULL; + // test->streams = NULL; test->stats_callback = NULL; test->reporter_callback = NULL; free(test); @@ -1014,7 +1021,8 @@ iperf_stats_callback(struct iperf_test * test) struct iperf_stream_result *rp = NULL; struct iperf_interval_results *ip = NULL, temp; - for (sp = test->streams; sp != NULL; sp = sp->next) { +// for (sp = test->streams; sp != NULL; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { rp = sp->result; if (test->role == 'c') @@ -1065,7 +1073,8 @@ iperf_reporter_callback(struct iperf_test * test) case TEST_RUNNING: case STREAM_RUNNING: /* print interval results for each stream */ - for (sp = test->streams; sp != NULL; sp = sp->next) { +// for (sp = test->streams; sp != NULL; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { print_interval_results(test, sp); bytes += sp->result->interval_results->bytes_transferred; /* sum up all streams */ } @@ -1075,8 +1084,8 @@ iperf_reporter_callback(struct iperf_test * test) } /* next build string with sum of all streams */ if (test->num_streams > 1) { - sp = test->streams; /* reset back to 1st stream */ - ip = test->streams->result->last_interval_results; /* use 1st stream for timing info */ + sp = SLIST_FIRST(&test->streams); /* reset back to 1st stream */ + ip = sp->result->last_interval_results; /* use 1st stream for timing info */ unit_snprintf(ubuf, UNIT_LEN, (double) (bytes), 'A'); unit_snprintf(nbuf, UNIT_LEN, (double) (bytes / ip->interval_duration), @@ -1098,9 +1107,10 @@ iperf_reporter_callback(struct iperf_test * test) printf(report_bw_header); start_time = 0.; - sp = test->streams; + sp = SLIST_FIRST(&test->streams); end_time = timeval_diff(&sp->result->start_time, &sp->result->end_time); - for (sp = test->streams; sp != NULL; sp = sp->next) { +// for (sp = test->streams; sp != NULL; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { bytes_sent = sp->result->bytes_sent; bytes_received = sp->result->bytes_received; total_sent += bytes_sent; @@ -1186,7 +1196,7 @@ print_interval_results(struct iperf_test * test, struct iperf_stream * sp) printf("print_interval_results Error: interval_results = NULL \n"); return; } - if (sp == test->streams) { + if (sp == SLIST_FIRST(&test->streams)) { printf(report_bw_header); } @@ -1304,14 +1314,19 @@ void iperf_add_stream(struct iperf_test * test, struct iperf_stream * sp) { int i; - struct iperf_stream *n; + struct iperf_stream *n, *prev; - if (!test->streams) { - test->streams = sp; + if (SLIST_EMPTY(&test->streams)) { + SLIST_INSERT_HEAD(&test->streams, sp, streams); sp->id = 1; } else { - for (n = test->streams, i = 2; n->next; n = n->next, ++i); - n->next = sp; + // for (n = test->streams, i = 2; n->next; n = n->next, ++i); + i = 2; + SLIST_FOREACH(n, &test->streams, streams) { + prev = n; + ++i; + } + SLIST_INSERT_AFTER(prev, sp, streams); sp->id = i; } } diff --git a/src/iperf_client_api.c b/src/iperf_client_api.c index 41732a2..a431966 100644 --- a/src/iperf_client_api.c +++ b/src/iperf_client_api.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -140,11 +141,19 @@ iperf_client_end(struct iperf_test *test) test->reporter_callback(test); /* Deleting all streams - CAN CHANGE FREE_STREAM FN */ +/* for (sp = test->streams; sp; sp = np) { close(sp->socket); np = sp->next; iperf_free_stream(sp); } +*/ + while (!SLIST_EMPTY(&test->streams)) { + sp = SLIST_FIRST(&test->streams); + SLIST_REMOVE_HEAD(&test->streams, streams); + close(sp->socket); + iperf_free_stream(sp); + } test->state = IPERF_DONE; if (Nwrite(test->ctrl_sck, &test->state, sizeof(char), Ptcp) < 0) { diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index 31f76de..84ffbcc 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -170,7 +170,8 @@ iperf_handle_message_server(struct iperf_test *test) break; case TEST_END: test->stats_callback(test); - for (sp = test->streams; sp; sp = sp->next) { +// for (sp = test->streams; sp; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { FD_CLR(sp->socket, &test->read_set); FD_CLR(sp->socket, &test->write_set); close(sp->socket); @@ -198,7 +199,8 @@ iperf_handle_message_server(struct iperf_test *test) // XXX: Remove this line below! fprintf(stderr, "The client has terminated.\n"); - for (sp = test->streams; sp; sp = sp->next) { +// for (sp = test->streams; sp; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { FD_CLR(sp->socket, &test->read_set); FD_CLR(sp->socket, &test->write_set); close(sp->socket); @@ -221,10 +223,17 @@ iperf_test_reset(struct iperf_test *test) close(test->ctrl_sck); /* Free streams */ +/* for (sp = test->streams; sp; sp = np) { np = sp->next; iperf_free_stream(sp); } +*/ + while (!SLIST_EMPTY(&test->streams)) { + sp = SLIST_FIRST(&test->streams); + SLIST_REMOVE_HEAD(&test->streams, streams); + iperf_free_stream(sp); + } free_timer(test->timer); free_timer(test->stats_timer); free_timer(test->reporter_timer); @@ -232,7 +241,7 @@ iperf_test_reset(struct iperf_test *test) test->stats_timer = NULL; test->reporter_timer = NULL; - test->streams = NULL; + SLIST_INIT(&test->streams); test->role = 's'; set_protocol(test, Ptcp); diff --git a/src/iperf_udp.c b/src/iperf_udp.c index 6176a44..e287956 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -254,7 +255,8 @@ iperf_udp_init(struct iperf_test *test) assert(dtargus != 0); - for (sp = test->streams; sp; sp = sp->next) { +// for (sp = test->streams; sp; sp = sp->next) { + SLIST_FOREACH(sp, &test->streams, streams) { sp->send_timer = new_timer(dtargus / SEC_TO_US, dtargus % SEC_TO_US); if (sp->send_timer == NULL) return (-1); diff --git a/src/tcp_info.c b/src/tcp_info.c index 083781a..05c901d 100644 --- a/src/tcp_info.c +++ b/src/tcp_info.c @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -34,7 +35,7 @@ get_tcpinfo(struct iperf_test *test, struct iperf_interval_results *rp) { #if defined(linux) || defined(__FreeBSD__) socklen_t tcp_info_length; - struct iperf_stream *sp = test->streams; + struct iperf_stream *sp = SLIST_FIRST(&test->streams); tcp_info_length = sizeof(struct tcp_info); //printf("getting TCP_INFO for socket %d \n", sp->socket);