diff options
author | Jef Poskanzer <jef@mail.acme.com> | 2013-02-22 15:54:05 -0800 |
---|---|---|
committer | Jef Poskanzer <jef@mail.acme.com> | 2013-02-22 15:54:05 -0800 |
commit | 43929b3698066f9cfda9523c19595e084a6658a9 (patch) | |
tree | ef2cf08e60281ecb755c46b2be3a506e03267562 /src/iperf_udp.c | |
parent | 231c56296e666e41ac5c6bb69eddd392f18619df (diff) | |
download | iperf3-43929b3698066f9cfda9523c19595e084a6658a9.tar.gz |
Added "burst mode" to send a bunch of packets in a row without
intervening select() calls. This increases performance quite a bit.
Diffstat (limited to 'src/iperf_udp.c')
-rw-r--r-- | src/iperf_udp.c | 92 |
1 files changed, 46 insertions, 46 deletions
diff --git a/src/iperf_udp.c b/src/iperf_udp.c index 538b790..768992a 100644 --- a/src/iperf_udp.c +++ b/src/iperf_udp.c @@ -35,20 +35,19 @@ int iperf_udp_recv(struct iperf_stream *sp) { - int result; + int r; int size = sp->settings->blksize; int sec, usec, pcount; double transit = 0, d = 0; struct timeval sent_time, arrival_time; - result = Nread(sp->socket, sp->buffer, size, Pudp); + r = Nread(sp->socket, sp->buffer, size, Pudp); - if (result < 0) { - return -1; - } + if (r < 0) + return r; - sp->result->bytes_received += result; - sp->result->bytes_received_this_interval += result; + sp->result->bytes_received += r; + sp->result->bytes_received_this_interval += r; memcpy(&sec, sp->buffer, sizeof(sec)); memcpy(&usec, sp->buffer+4, sizeof(usec)); @@ -82,7 +81,7 @@ iperf_udp_recv(struct iperf_stream *sp) // J = |(R1 - S1) - (R0 - S0)| [/ number of packets, for average] sp->jitter += (d - sp->jitter) / 16.0; - return result; + return r; } @@ -107,7 +106,7 @@ send_timer_proc(TimerClientData client_data, struct timeval* nowP) int iperf_udp_send(struct iperf_stream *sp) { - ssize_t result = 0; + int r; int64_t dtargus; int64_t adjustus; uint64_t sec, usec, pcount; @@ -115,46 +114,47 @@ iperf_udp_send(struct iperf_stream *sp) struct timeval before, after; TimerClientData cd; - if (sp->udp_green_light) { - gettimeofday(&before, 0); - - ++sp->packet_count; - sec = htonl(before.tv_sec); - usec = htonl(before.tv_usec); - pcount = htonl(sp->packet_count); - - memcpy(sp->buffer, &sec, sizeof(sec)); - memcpy(sp->buffer+4, &usec, sizeof(usec)); - memcpy(sp->buffer+8, &pcount, sizeof(pcount)); - - result = Nwrite(sp->socket, sp->buffer, size, Pudp); - - if (result < 0) - return -1; - - sp->result->bytes_sent += result; - sp->result->bytes_sent_this_interval += result; - - if (sp->settings->rate != 0) { - gettimeofday(&after, 0); - dtargus = (int64_t) (sp->settings->blksize) * SEC_TO_US * 8; - dtargus /= sp->settings->rate; - assert(dtargus != 0); - adjustus = dtargus; - adjustus += (before.tv_sec - after.tv_sec) * SEC_TO_US; - adjustus += (before.tv_usec - after.tv_usec); - if (adjustus > 0) { - dtargus = adjustus; - } - cd.p = sp; - sp->udp_green_light = 0; - sp->send_timer = tmr_create((struct timeval*) 0, send_timer_proc, cd, dtargus, 0); - if (sp->send_timer == NULL) - return -1; + if (! sp->udp_green_light) + return 0; + + gettimeofday(&before, 0); + + ++sp->packet_count; + sec = htonl(before.tv_sec); + usec = htonl(before.tv_usec); + pcount = htonl(sp->packet_count); + + memcpy(sp->buffer, &sec, sizeof(sec)); + memcpy(sp->buffer+4, &usec, sizeof(usec)); + memcpy(sp->buffer+8, &pcount, sizeof(pcount)); + + r = Nwrite(sp->socket, sp->buffer, size, Pudp); + + if (r < 0) + return r; + + sp->result->bytes_sent += r; + sp->result->bytes_sent_this_interval += r; + + if (sp->settings->rate != 0) { + gettimeofday(&after, 0); + dtargus = (int64_t) (sp->settings->blksize) * SEC_TO_US * 8; + dtargus /= sp->settings->rate; + assert(dtargus != 0); + adjustus = dtargus; + adjustus += (before.tv_sec - after.tv_sec) * SEC_TO_US; + adjustus += (before.tv_usec - after.tv_usec); + if (adjustus > 0) { + dtargus = adjustus; } + cd.p = sp; + sp->udp_green_light = 0; + sp->send_timer = tmr_create((struct timeval*) 0, send_timer_proc, cd, dtargus, 0); + if (sp->send_timer == NULL) + return -1; } - return result; + return r; } |