implmented code review changes and stats_callback, reporter_callback functions
This commit is contained in:
parent
d70a792d6c
commit
07222cef2f
196
src/iperf_api.c
196
src/iperf_api.c
@ -53,35 +53,6 @@ static struct option longopts[] =
|
|||||||
{ NULL, 0, NULL, 0 }
|
{ NULL, 0, NULL, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void Display(struct iperf_test *test);
|
|
||||||
|
|
||||||
int iperf_tcp_accept(struct iperf_test *test);
|
|
||||||
int iperf_udp_accept(struct iperf_test *test);
|
|
||||||
int iperf_tcp_recv(struct iperf_stream *sp);
|
|
||||||
int iperf_udp_recv(struct iperf_stream *sp);
|
|
||||||
int iperf_tcp_send(struct iperf_stream *sp);
|
|
||||||
int iperf_udp_send(struct iperf_stream *sp);
|
|
||||||
|
|
||||||
void iperf_defaults(struct iperf_test *testp);
|
|
||||||
|
|
||||||
struct iperf_test *iperf_new_test();
|
|
||||||
void iperf_init_test(struct iperf_test *test);
|
|
||||||
void iperf_free_test(struct iperf_test *test);
|
|
||||||
void *iperf_stats_callback(struct iperf_test *test);
|
|
||||||
|
|
||||||
struct iperf_stream *iperf_new_stream(struct iperf_test *testp);
|
|
||||||
struct iperf_stream *iperf_new_tcp_stream(struct iperf_test *testp);
|
|
||||||
struct iperf_stream * iperf_new_udp_stream(struct iperf_test *testp);
|
|
||||||
void iperf_init_stream(struct iperf_stream *sp, struct iperf_test *testp);
|
|
||||||
int iperf_add_stream(struct iperf_test *test, struct iperf_stream *sp);
|
|
||||||
struct iperf_stream * update_stream(struct iperf_test *test, int j, int add);
|
|
||||||
void iperf_free_stream(struct iperf_test *test, struct iperf_stream *sp);
|
|
||||||
|
|
||||||
void iperf_run_server(struct iperf_test *test);
|
|
||||||
void iperf_run_client(struct iperf_test *test);
|
|
||||||
int iperf_run(struct iperf_test *test);
|
|
||||||
|
|
||||||
void Display(struct iperf_test *test)
|
void Display(struct iperf_test *test)
|
||||||
{
|
{
|
||||||
struct iperf_stream *n;
|
struct iperf_stream *n;
|
||||||
@ -113,8 +84,8 @@ void Display(struct iperf_test *test)
|
|||||||
int iperf_tcp_recv(struct iperf_stream *sp)
|
int iperf_tcp_recv(struct iperf_stream *sp)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
int size = ((struct iperf_settings *) sp->settings)->bufsize;
|
int size = sp->settings->bufsize;
|
||||||
char* buf = (char *) malloc(size);
|
char *buf = (char *) malloc(size);
|
||||||
if(!buf)
|
if(!buf)
|
||||||
{
|
{
|
||||||
perror("malloc: unable to allocate receive buffer");
|
perror("malloc: unable to allocate receive buffer");
|
||||||
@ -126,8 +97,7 @@ int iperf_tcp_recv(struct iperf_stream *sp)
|
|||||||
|
|
||||||
} while (result == -1 && errno == EINTR);
|
} while (result == -1 && errno == EINTR);
|
||||||
|
|
||||||
sp->result->bytes_received+= result;
|
sp->result->bytes_received+= result;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,8 +105,8 @@ int iperf_udp_recv(struct iperf_stream *sp)
|
|||||||
{
|
{
|
||||||
|
|
||||||
int result;
|
int result;
|
||||||
int size = ((struct iperf_settings *) sp->settings)->bufsize;
|
int size = sp->settings->bufsize;
|
||||||
char* buf = (char *) malloc(size);
|
char *buf = (char *) malloc(size);
|
||||||
|
|
||||||
if(!buf)
|
if(!buf)
|
||||||
{
|
{
|
||||||
@ -150,13 +120,14 @@ int iperf_udp_recv(struct iperf_stream *sp)
|
|||||||
|
|
||||||
sp->result->bytes_received+= result;
|
sp->result->bytes_received+= result;
|
||||||
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
int iperf_tcp_send(struct iperf_stream *sp)
|
int iperf_tcp_send(struct iperf_stream *sp)
|
||||||
{
|
{
|
||||||
int result,i;
|
int result,i;
|
||||||
int size = ((struct iperf_settings *) sp->settings)->bufsize;
|
int size = sp->settings->bufsize;
|
||||||
|
|
||||||
char *buf = (char *) malloc(size);
|
char *buf = (char *) malloc(size);
|
||||||
if(!buf)
|
if(!buf)
|
||||||
@ -175,7 +146,8 @@ int iperf_tcp_send(struct iperf_stream *sp)
|
|||||||
int iperf_udp_send(struct iperf_stream *sp)
|
int iperf_udp_send(struct iperf_stream *sp)
|
||||||
{
|
{
|
||||||
int result,i;
|
int result,i;
|
||||||
int size = ((struct iperf_settings *) sp->settings)->bufsize;
|
int size = sp->settings->bufsize;
|
||||||
|
|
||||||
char *buf = (char *) malloc(size);
|
char *buf = (char *) malloc(size);
|
||||||
if(!buf)
|
if(!buf)
|
||||||
{
|
{
|
||||||
@ -187,6 +159,7 @@ int iperf_udp_send(struct iperf_stream *sp)
|
|||||||
result = send(sp->socket, buf, size, 0);
|
result = send(sp->socket, buf, size, 0);
|
||||||
sp->result->bytes_sent+= result;
|
sp->result->bytes_sent+= result;
|
||||||
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -224,6 +197,7 @@ void iperf_defaults(struct iperf_test *testp)
|
|||||||
testp->listener_port = 5001;
|
testp->listener_port = 5001;
|
||||||
testp->duration = 10;
|
testp->duration = 10;
|
||||||
|
|
||||||
|
|
||||||
testp->stats_interval = 0;
|
testp->stats_interval = 0;
|
||||||
testp->reporter_interval = 0;
|
testp->reporter_interval = 0;
|
||||||
|
|
||||||
@ -318,18 +292,96 @@ void iperf_free_test(struct iperf_test *test)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void *iperf_stats_callback(struct iperf_test *test)
|
void *iperf_stats_callback(struct iperf_test *test)
|
||||||
{
|
{
|
||||||
char ubuf[UNIT_LEN];
|
struct iperf_stream *sp = test->streams;
|
||||||
|
|
||||||
test->streams->result->interval_results->bytes_transferred = test->streams->result->bytes_sent - test->streams->result->interval_results->bytes_transferred;
|
|
||||||
|
|
||||||
unit_snprintf(ubuf, UNIT_LEN, (double) (test->streams->result->interval_results->bytes_transferred / test->stats_interval), 'a');
|
|
||||||
printf("interval === %llu bytes sent \t %s per sec \n", test->streams->result->interval_results->bytes_transferred , ubuf);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
while(sp)
|
||||||
|
{
|
||||||
|
if(test->role == 'c')
|
||||||
|
sp->result->interval_results->bytes_transferred = sp->result->bytes_sent - sp->result->interval_results->bytes_transferred;
|
||||||
|
else
|
||||||
|
sp->result->interval_results->bytes_transferred = sp->result->bytes_received - sp->result->interval_results->bytes_transferred;
|
||||||
|
|
||||||
|
sp->result->interval_results->interval_duration+= test->stats_interval;
|
||||||
|
|
||||||
|
sp = sp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void * iperf_reporter_callback(struct iperf_test *test)
|
||||||
|
{
|
||||||
|
char ubuf[UNIT_LEN];
|
||||||
|
struct iperf_stream *sp = test->streams;
|
||||||
|
iperf_size_t bytes=0.0;
|
||||||
|
|
||||||
|
printf("----------------INTERVAL [%d to %d]----------------\n", sp->result->interval_results->interval_duration - test->stats_interval,
|
||||||
|
sp->result->interval_results->interval_duration);
|
||||||
|
|
||||||
|
while(sp)
|
||||||
|
{
|
||||||
|
if(test->role == 'c')
|
||||||
|
{
|
||||||
|
bytes+= sp->result->interval_results->bytes_transferred;
|
||||||
|
unit_snprintf(ubuf, UNIT_LEN, (double) ( sp->result->interval_results->bytes_transferred / test->stats_interval), 'a');
|
||||||
|
printf("[%d]\t %llu bytes sent \t %s per sec \n",sp->socket, sp->result->interval_results->bytes_transferred , ubuf);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
else if(test->role == 's')
|
||||||
|
{
|
||||||
|
bytes+= sp->result->interval_results->bytes_transferred;
|
||||||
|
unit_snprintf(ubuf, UNIT_LEN, (double) ( sp->result->interval_results->bytes_transferred / test->stats_interval), 'a');
|
||||||
|
printf("[%d]\t %llu bytes received \t %s per sec \n",sp->socket, sp->result->interval_results->bytes_transferred , ubuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
sp = sp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("---------------------------------------------------\n");
|
||||||
|
unit_snprintf(ubuf, UNIT_LEN, (double) ( bytes / test->stats_interval), 'a');
|
||||||
|
printf("SUM\t%llu bytes COUNT \t %s per sec \n", bytes , ubuf);
|
||||||
|
printf("---------------------------------------------------\n\n");
|
||||||
|
|
||||||
|
|
||||||
|
// PRINT TOTAL
|
||||||
|
|
||||||
|
if(test->streams->result->interval_results->interval_duration >= test->duration)
|
||||||
|
{
|
||||||
|
bytes =0;
|
||||||
|
sp= test->streams;
|
||||||
|
printf("-----------------------TOTAL-----------------------\n");
|
||||||
|
|
||||||
|
while(sp)
|
||||||
|
{
|
||||||
|
if(test->role == 'c')
|
||||||
|
{
|
||||||
|
bytes+= sp->result->bytes_sent;
|
||||||
|
unit_snprintf(ubuf, UNIT_LEN, (double) ( sp->result->bytes_sent / test->duration), 'a');
|
||||||
|
printf("[%d]\t %llu bytes sent \t %s per sec \n",sp->socket, sp->result->bytes_sent , ubuf);
|
||||||
|
|
||||||
|
}
|
||||||
|
else if(test->role == 's')
|
||||||
|
{
|
||||||
|
bytes+= sp->result->bytes_received;
|
||||||
|
unit_snprintf(ubuf, UNIT_LEN, (double) ( sp->result->bytes_received / test->duration), 'a');
|
||||||
|
printf("[%d]\t %llu bytes sent \t %s per sec \n",sp->socket, sp->result->bytes_received, ubuf);
|
||||||
|
}
|
||||||
|
sp = sp->next;
|
||||||
|
}
|
||||||
|
printf("---------------------------------------------------\n");
|
||||||
|
unit_snprintf(ubuf, UNIT_LEN, (double) ( bytes / test->duration), 'a');
|
||||||
|
printf("SUM\t%llu bytes TOTAL \t %s per sec \n", bytes , ubuf);
|
||||||
|
printf("---------------------------------------------------\n\n");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void iperf_free_stream(struct iperf_test *test, struct iperf_stream *sp)
|
void iperf_free_stream(struct iperf_test *test, struct iperf_stream *sp)
|
||||||
{
|
{
|
||||||
@ -416,8 +468,6 @@ struct iperf_stream *iperf_new_tcp_stream(struct iperf_test *testp)
|
|||||||
perror("malloc");
|
perror("malloc");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
sp->settings = testp->default_settings;
|
|
||||||
|
|
||||||
sp->rcv = iperf_tcp_recv;
|
sp->rcv = iperf_tcp_recv;
|
||||||
sp->snd = iperf_tcp_send;
|
sp->snd = iperf_tcp_send;
|
||||||
@ -435,9 +485,7 @@ struct iperf_stream * iperf_new_udp_stream(struct iperf_test *testp)
|
|||||||
perror("malloc");
|
perror("malloc");
|
||||||
return(NULL);
|
return(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
sp->settings = testp->default_settings;
|
|
||||||
|
|
||||||
sp->rcv = iperf_udp_recv;
|
sp->rcv = iperf_udp_recv;
|
||||||
sp->snd = iperf_udp_send;
|
sp->snd = iperf_udp_send;
|
||||||
//sp->update_stats = iperf_udp_update_stats;
|
//sp->update_stats = iperf_udp_update_stats;
|
||||||
@ -586,7 +634,7 @@ int iperf_add_stream(struct iperf_test *test, struct iperf_stream *sp)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct iperf_stream * update_stream(struct iperf_test *test, int j, int add)
|
struct iperf_stream * find_stream_by_socket(struct iperf_test *test, int sock)
|
||||||
{
|
{
|
||||||
struct iperf_stream *n;
|
struct iperf_stream *n;
|
||||||
n=test->streams;
|
n=test->streams;
|
||||||
@ -594,9 +642,8 @@ struct iperf_stream * update_stream(struct iperf_test *test, int j, int add)
|
|||||||
//find the correct stream for update
|
//find the correct stream for update
|
||||||
while(1)
|
while(1)
|
||||||
{
|
{
|
||||||
if(n->socket == j)
|
if(n->socket == sock)
|
||||||
{
|
{
|
||||||
n->result->bytes_received+= add;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -660,17 +707,19 @@ void iperf_run_server(struct iperf_test *test)
|
|||||||
if (FD_ISSET(j, &test->temp_set))
|
if (FD_ISSET(j, &test->temp_set))
|
||||||
{
|
{
|
||||||
// find the correct stream
|
// find the correct stream
|
||||||
n = update_stream(test,j,0);
|
n = find_stream_by_socket(test,j);
|
||||||
result = n->rcv(n);
|
result = n->rcv(n);
|
||||||
|
|
||||||
if(result == 0)
|
if(result == 0)
|
||||||
{
|
{
|
||||||
// stream shutdown message
|
// stream shutdown message
|
||||||
|
// the duration at server can be wrong unles -t is provided
|
||||||
unit_snprintf(ubuf, UNIT_LEN, (double) (n->result->bytes_received / n->result->duration), 'a');
|
unit_snprintf(ubuf, UNIT_LEN, (double) (n->result->bytes_received / n->result->duration), 'a');
|
||||||
printf("%llu bytes received %s/sec for stream %d\n\n",n->result->bytes_received, ubuf,(int)n);
|
printf("%llu bytes received %s/sec for stream %d\n\n",n->result->bytes_received, ubuf,(int)n);
|
||||||
close(j);
|
close(j);
|
||||||
iperf_free_stream(test, n);
|
iperf_free_stream(test, n);
|
||||||
FD_CLR(j, &test->read_set);
|
FD_CLR(j, &test->read_set);
|
||||||
|
|
||||||
}
|
}
|
||||||
else if(result < 0)
|
else if(result < 0)
|
||||||
{
|
{
|
||||||
@ -679,6 +728,7 @@ void iperf_run_server(struct iperf_test *test)
|
|||||||
} // end if (FD_ISSET(j, &temp_set))
|
} // end if (FD_ISSET(j, &temp_set))
|
||||||
|
|
||||||
}// end for (j=0;...)
|
}// end for (j=0;...)
|
||||||
|
|
||||||
}// end else (result>0)
|
}// end else (result>0)
|
||||||
|
|
||||||
}// end while
|
}// end while
|
||||||
@ -690,7 +740,7 @@ void iperf_run_client(struct iperf_test *test)
|
|||||||
{
|
{
|
||||||
int i,result;
|
int i,result;
|
||||||
struct iperf_stream *sp, *np;
|
struct iperf_stream *sp, *np;
|
||||||
struct timer *timer, *interval;
|
struct timer *timer, *stats_interval, *reporter_interval;
|
||||||
char *buf;
|
char *buf;
|
||||||
int64_t delayns, adjustns, dtargns;
|
int64_t delayns, adjustns, dtargns;
|
||||||
struct timeval before, after;
|
struct timeval before, after;
|
||||||
@ -720,7 +770,11 @@ void iperf_run_client(struct iperf_test *test)
|
|||||||
timer = new_timer(test->duration, 0);
|
timer = new_timer(test->duration, 0);
|
||||||
|
|
||||||
if(test->stats_interval != 0)
|
if(test->stats_interval != 0)
|
||||||
interval = new_timer(test->stats_interval,0);
|
stats_interval = new_timer(test->stats_interval, 0);
|
||||||
|
|
||||||
|
if(test->reporter_interval != 0)
|
||||||
|
reporter_interval = new_timer(test->reporter_interval, 0);
|
||||||
|
|
||||||
|
|
||||||
//Display();
|
//Display();
|
||||||
// send data till the timer expires
|
// send data till the timer expires
|
||||||
@ -764,25 +818,29 @@ void iperf_run_client(struct iperf_test *test)
|
|||||||
}// FD_ISSET
|
}// FD_ISSET
|
||||||
}// for
|
}// for
|
||||||
|
|
||||||
if((test->stats_interval!=0) && interval->expired(interval))
|
if((test->stats_interval!= 0) && stats_interval->expired(stats_interval))
|
||||||
{
|
{
|
||||||
// call the reporter for interval
|
test->stats_callback(test);
|
||||||
test->stats_callback(test);
|
stats_interval = new_timer(test->stats_interval,0);
|
||||||
//reset the interval timer
|
}
|
||||||
interval = new_timer(test->stats_interval,0);
|
|
||||||
|
if((test->reporter_interval!= 0) && reporter_interval->expired(reporter_interval))
|
||||||
|
{
|
||||||
|
test->reporter_callback(test);
|
||||||
|
reporter_interval = new_timer(test->reporter_interval,0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}// while outer timer
|
}// while outer timer
|
||||||
|
|
||||||
Display(test);
|
|
||||||
/* XXX: report */
|
|
||||||
|
// Send the EOF - 0 buffer packets
|
||||||
sp = test->streams;
|
sp = test->streams;
|
||||||
np = sp;
|
np = sp;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
sp = np;
|
sp = np;
|
||||||
send(sp->socket, buf, 0, 0);
|
send(sp->socket, buf, 0, 0);
|
||||||
printf("%llu bytes sent\n", sp->result->bytes_sent);
|
|
||||||
np = sp->next;
|
np = sp->next;
|
||||||
close(sp->socket);
|
close(sp->socket);
|
||||||
iperf_free_stream(test, sp);
|
iperf_free_stream(test, sp);
|
||||||
@ -839,8 +897,7 @@ main(int argc, char **argv)
|
|||||||
addr_remote->sin_port = htons(atoi(optarg));
|
addr_remote->sin_port = htons(atoi(optarg));
|
||||||
break;
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
test->role = 's';
|
test->role = 's';
|
||||||
addr_local->sin_port = htons(5001);
|
|
||||||
test->listener_port = 5001;
|
test->listener_port = 5001;
|
||||||
break;
|
break;
|
||||||
case 't':
|
case 't':
|
||||||
@ -877,6 +934,7 @@ main(int argc, char **argv)
|
|||||||
test->local_addr = (struct sockaddr_storage *) addr_local;
|
test->local_addr = (struct sockaddr_storage *) addr_local;
|
||||||
test->remote_addr = (struct sockaddr_storage *) addr_remote;
|
test->remote_addr = (struct sockaddr_storage *) addr_remote;
|
||||||
test->stats_callback = iperf_stats_callback;
|
test->stats_callback = iperf_stats_callback;
|
||||||
|
test->reporter_callback = iperf_reporter_callback;
|
||||||
|
|
||||||
switch(test->protocol)
|
switch(test->protocol)
|
||||||
{
|
{
|
||||||
|
@ -32,10 +32,11 @@ struct iperf_settings
|
|||||||
|
|
||||||
struct iperf_stream
|
struct iperf_stream
|
||||||
{
|
{
|
||||||
|
|
||||||
/* configurable members */
|
/* configurable members */
|
||||||
int local_port; // local port
|
int local_port; // local port
|
||||||
int remote_port; // remote machine port
|
int remote_port; // remote machine port
|
||||||
void *settings; // pointer to structure settings
|
struct iperf_settings *settings; // pointer to structure settings
|
||||||
int protocol; // protocol- TCP/UDP
|
int protocol; // protocol- TCP/UDP
|
||||||
|
|
||||||
/* non configurable members */
|
/* non configurable members */
|
||||||
@ -86,13 +87,33 @@ struct iperf_test
|
|||||||
struct iperf_stream *streams; // pointer to list of struct stream
|
struct iperf_stream *streams; // pointer to list of struct stream
|
||||||
|
|
||||||
struct iperf_settings *default_settings;
|
struct iperf_settings *default_settings;
|
||||||
|
|
||||||
/* might be needed */
|
|
||||||
char *client_ip;
|
|
||||||
int remote_port;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void Display(struct iperf_test *test);
|
||||||
|
|
||||||
|
int iperf_tcp_accept(struct iperf_test *test);
|
||||||
|
int iperf_udp_accept(struct iperf_test *test);
|
||||||
|
int iperf_tcp_recv(struct iperf_stream *sp);
|
||||||
|
int iperf_udp_recv(struct iperf_stream *sp);
|
||||||
|
int iperf_tcp_send(struct iperf_stream *sp);
|
||||||
|
int iperf_udp_send(struct iperf_stream *sp);
|
||||||
|
|
||||||
|
void *iperf_stats_callback(struct iperf_test *test);
|
||||||
|
void *iperf_reporter_callback(struct iperf_test *test);
|
||||||
|
|
||||||
|
struct iperf_stream * update_stream(struct iperf_test *test, int j, int add);
|
||||||
|
|
||||||
|
void iperf_run_server(struct iperf_test *test);
|
||||||
|
void iperf_run_client(struct iperf_test *test);
|
||||||
|
int iperf_run(struct iperf_test *test);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* iperf_new_test -- return a new iperf_test with default values
|
* iperf_new_test -- return a new iperf_test with default values
|
||||||
*
|
*
|
||||||
@ -123,7 +144,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_stream *iperf_new_stream(struct iperf_test *testp);
|
||||||
|
|
||||||
struct iperf_stream *iperf_new_tcp_stream(struct iperf_test *testp);
|
struct iperf_stream *iperf_new_tcp_stream(struct iperf_test *testp);
|
||||||
struct iperf_stream *iperf_new_udp_stream(struct iperf_test *testp);
|
struct iperf_stream *iperf_new_udp_stream(struct iperf_test *testp);
|
||||||
|
Loading…
Reference in New Issue
Block a user