1
1

Moved client code from iperf_api.* to iperf_client_api.*

Этот коммит содержится в:
sethdelliott 2010-07-23 22:48:48 +00:00
родитель 2e3dfab7eb
Коммит 18631aacdb
7 изменённых файлов: 263 добавлений и 242 удалений

Просмотреть файл

@ -1,5 +1,5 @@
CFLAGS=-g -Wall
OBJS=main.o iperf_api.o iperf_server_api.o iperf_tcp.o iperf_udp.o timer.o net.o tcp_window_size.o units.o iperf_util.o tcp_info.o locale.o iperf_error.o
OBJS=main.o iperf_api.o iperf_server_api.o iperf_tcp.o iperf_udp.o timer.o net.o tcp_window_size.o units.o iperf_util.o tcp_info.o locale.o iperf_error.o iperf_client_api.o
LDFLAGS=
UNAME=$(shell uname)

Просмотреть файл

@ -450,16 +450,7 @@ iperf_init_test(struct iperf_test *test)
test->timer = new_timer(test->duration, 0);
if (test->timer == NULL)
return (-1);
/*
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->settings->blksize,
test->settings->bytes);
*/
}
}
if (test->stats_interval != 0) {
test->stats_timer = new_timer(test->stats_interval, 0);
@ -806,7 +797,6 @@ parse_results(struct iperf_test *test, char *results)
for (sp = test->streams; sp; sp = sp->next)
if (sp->id == sid) break;
if (sp == NULL) {
// fprintf(stderr, "error: No stream with id %d\n", sid);
i_errno = IESTREAMID;
return (-1);
}
@ -959,121 +949,6 @@ iperf_defaults(struct iperf_test * testp)
return (0);
}
/**************************************************************************/
int
iperf_create_streams(struct iperf_test *test)
{
int i, s;
struct iperf_stream *sp;
for (i = 0; i < test->num_streams; ++i) {
if ((s = test->protocol->connect(test)) < 0)
return (-1);
FD_SET(s, &test->read_set);
FD_SET(s, &test->write_set);
test->max_fd = (test->max_fd < s) ? s : test->max_fd;
sp = iperf_new_stream(test, s);
if (!sp)
return (-1);
/* Perform the new stream callback */
if (test->on_new_stream)
test->on_new_stream(sp);
}
return (0);
}
int
iperf_handle_message_client(struct iperf_test *test)
{
int rval;
if ((rval = read(test->ctrl_sck, &test->state, sizeof(char))) <= 0) {
if (rval == 0) {
i_errno = IECTRLCLOSE;
return (-1);
} else {
i_errno = IERECVMESSAGE;
return (-1);
}
}
switch (test->state) {
case PARAM_EXCHANGE:
if (iperf_exchange_parameters(test) < 0)
return (-1);
if (test->on_connect)
test->on_connect(test);
break;
case CREATE_STREAMS:
if (iperf_create_streams(test) < 0)
return (-1);
break;
case TEST_START:
if (iperf_init_test(test) < 0)
return (-1);
break;
case TEST_RUNNING:
break;
case EXCHANGE_RESULTS:
if (iperf_exchange_results(test) < 0)
return (-1);
break;
case DISPLAY_RESULTS:
if (test->on_test_finish)
test->on_test_finish(test);
iperf_client_end(test);
break;
case IPERF_DONE:
break;
case SERVER_TERMINATE:
i_errno = IESERVERTERM;
return (-1);
case ACCESS_DENIED:
i_errno = IEACCESSDENIED;
return (-1);
default:
i_errno = IEMESSAGE;
return (-1);
}
return 0;
}
/* iperf_connect -- client to server connection function */
int
iperf_connect(struct iperf_test *test)
{
// printf("Connecting to host %s, port %d\n", test->server_hostname, test->server_port);
FD_ZERO(&test->read_set);
FD_ZERO(&test->write_set);
get_uuid(test->cookie);
/* Create and connect the control channel */
test->ctrl_sck = netdial(Ptcp, test->server_hostname, test->server_port);
if (test->ctrl_sck < 0) {
i_errno = IECONNECT;
return (-1);
}
if (Nwrite(test->ctrl_sck, test->cookie, COOKIE_SIZE, Ptcp) < 0) {
i_errno = IESENDCOOKIE;
return (-1);
}
FD_SET(test->ctrl_sck, &test->read_set);
FD_SET(test->ctrl_sck, &test->write_set);
test->max_fd = (test->ctrl_sck > test->max_fd) ? test->ctrl_sck : test->max_fd;
return (0);
}
/**************************************************************************/
void
@ -1419,114 +1294,9 @@ iperf_add_stream(struct iperf_test * test, struct iperf_stream * sp)
}
/**************************************************************************/
int
iperf_client_end(struct iperf_test *test)
{
struct iperf_stream *sp, *np;
/* show final summary */
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);
}
test->state = IPERF_DONE;
if (Nwrite(test->ctrl_sck, &test->state, sizeof(char), Ptcp) < 0) {
i_errno = IESENDMESSAGE;
return (-1);
}
return (0);
}
void
sig_handler(int sig)
{
longjmp(env, 1);
}
int
iperf_run_client(struct iperf_test * test)
{
int result;
fd_set temp_read_set, temp_write_set;
struct timeval tv;
/* Start the client and connect to the server */
if (iperf_connect(test) < 0) {
return (-1);
}
// XXX: Do we need to check signal() for errors?
signal(SIGINT, sig_handler);
if (setjmp(env)) {
test->state = CLIENT_TERMINATE;
if (Nwrite(test->ctrl_sck, &test->state, sizeof(char), Ptcp) < 0) {
i_errno = IESENDMESSAGE;
return (-1);
}
exit(1);
}
while (test->state != IPERF_DONE) {
memcpy(&temp_read_set, &test->read_set, sizeof(fd_set));
memcpy(&temp_write_set, &test->write_set, sizeof(fd_set));
tv.tv_sec = 15;
tv.tv_usec = 0;
result = select(test->max_fd + 1, &temp_read_set, &temp_write_set, NULL, &tv);
if (result < 0 && errno != EINTR) {
i_errno = IESELECT;
return (-1);
} else if (result > 0) {
if (FD_ISSET(test->ctrl_sck, &temp_read_set)) {
if (iperf_handle_message_client(test) < 0)
return (-1);
FD_CLR(test->ctrl_sck, &temp_read_set);
}
if (test->state == TEST_RUNNING) {
if (test->reverse) {
// Reverse mode. Client receives.
if (iperf_recv(test) < 0)
return (-1);
} else {
// Regular mode. Client sends.
if (iperf_send(test) < 0)
return (-1);
}
/* Perform callbacks */
if (timer_expired(test->stats_timer)) {
test->stats_callback(test);
if (update_timer(test->stats_timer, test->stats_interval, 0) < 0)
return (-1);
}
if (timer_expired(test->reporter_timer)) {
test->reporter_callback(test);
if (update_timer(test->reporter_timer, test->reporter_interval, 0) < 0)
return (-1);
}
/* Send TEST_END if all data has been sent or timer expired */
if (all_data_sent(test) || timer_expired(test->timer)) {
test->stats_callback(test);
test->state = TEST_END;
if (Nwrite(test->ctrl_sck, &test->state, sizeof(char), Ptcp) < 0) {
i_errno = IESENDMESSAGE;
return (-1);
}
}
}
}
}
return (0);
}

Просмотреть файл

@ -44,12 +44,6 @@ void iperf_stats_callback(struct iperf_test * test);
void iperf_reporter_callback(struct iperf_test * test);
/**
* iperf_run_client -- Runs the client portion of a test
*
*/
int iperf_run_client(struct iperf_test * test);
/**
* iperf_new_test -- return a new iperf_test with default values
*
@ -100,8 +94,6 @@ void print_tcpinfo(struct iperf_interval_results *);
void build_tcpinfo_message(struct iperf_interval_results *r, char *message);
void print_interval_results(struct iperf_test * test, struct iperf_stream *sp);
int iperf_connect(struct iperf_test *);
int iperf_client_end(struct iperf_test *);
int iperf_send(struct iperf_test *);
int iperf_recv(struct iperf_test *);
void sig_handler(int);
@ -110,8 +102,6 @@ void usage_long();
int all_data_sent(struct iperf_test *);
int package_parameters(struct iperf_test *);
int parse_parameters(struct iperf_test *);
int iperf_create_streams(struct iperf_test *);
int iperf_handle_message_client(struct iperf_test *);
int iperf_exchange_results(struct iperf_test *);
int parse_results(struct iperf_test *, char *);
int iperf_init_test(struct iperf_test *);

240
src/iperf_client_api.c Обычный файл
Просмотреть файл

@ -0,0 +1,240 @@
#include <errno.h>
#include <setjmp.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/uio.h>
#include "iperf.h"
#include "iperf_api.h"
#include "iperf_client_api.h"
#include "iperf_error.h"
#include "iperf_util.h"
#include "net.h"
#include "timer.h"
int
iperf_create_streams(struct iperf_test *test)
{
int i, s;
struct iperf_stream *sp;
for (i = 0; i < test->num_streams; ++i) {
if ((s = test->protocol->connect(test)) < 0)
return (-1);
FD_SET(s, &test->read_set);
FD_SET(s, &test->write_set);
test->max_fd = (test->max_fd < s) ? s : test->max_fd;
sp = iperf_new_stream(test, s);
if (!sp)
return (-1);
/* Perform the new stream callback */
if (test->on_new_stream)
test->on_new_stream(sp);
}
return (0);
}
int
iperf_handle_message_client(struct iperf_test *test)
{
int rval;
if ((rval = read(test->ctrl_sck, &test->state, sizeof(char))) <= 0) {
if (rval == 0) {
i_errno = IECTRLCLOSE;
return (-1);
} else {
i_errno = IERECVMESSAGE;
return (-1);
}
}
switch (test->state) {
case PARAM_EXCHANGE:
if (iperf_exchange_parameters(test) < 0)
return (-1);
if (test->on_connect)
test->on_connect(test);
break;
case CREATE_STREAMS:
if (iperf_create_streams(test) < 0)
return (-1);
break;
case TEST_START:
if (iperf_init_test(test) < 0)
return (-1);
break;
case TEST_RUNNING:
break;
case EXCHANGE_RESULTS:
if (iperf_exchange_results(test) < 0)
return (-1);
break;
case DISPLAY_RESULTS:
if (test->on_test_finish)
test->on_test_finish(test);
iperf_client_end(test);
break;
case IPERF_DONE:
break;
case SERVER_TERMINATE:
i_errno = IESERVERTERM;
return (-1);
case ACCESS_DENIED:
i_errno = IEACCESSDENIED;
return (-1);
default:
i_errno = IEMESSAGE;
return (-1);
}
return 0;
}
/* iperf_connect -- client to server connection function */
int
iperf_connect(struct iperf_test *test)
{
// printf("Connecting to host %s, port %d\n", test->server_hostname, test->server_port);
FD_ZERO(&test->read_set);
FD_ZERO(&test->write_set);
get_uuid(test->cookie);
/* Create and connect the control channel */
test->ctrl_sck = netdial(Ptcp, test->server_hostname, test->server_port);
if (test->ctrl_sck < 0) {
i_errno = IECONNECT;
return (-1);
}
if (Nwrite(test->ctrl_sck, test->cookie, COOKIE_SIZE, Ptcp) < 0) {
i_errno = IESENDCOOKIE;
return (-1);
}
FD_SET(test->ctrl_sck, &test->read_set);
FD_SET(test->ctrl_sck, &test->write_set);
test->max_fd = (test->ctrl_sck > test->max_fd) ? test->ctrl_sck : test->max_fd;
return (0);
}
int
iperf_client_end(struct iperf_test *test)
{
struct iperf_stream *sp, *np;
/* show final summary */
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);
}
test->state = IPERF_DONE;
if (Nwrite(test->ctrl_sck, &test->state, sizeof(char), Ptcp) < 0) {
i_errno = IESENDMESSAGE;
return (-1);
}
return (0);
}
int
iperf_run_client(struct iperf_test * test)
{
int result;
fd_set temp_read_set, temp_write_set;
struct timeval tv;
/* Start the client and connect to the server */
if (iperf_connect(test) < 0) {
return (-1);
}
// XXX: Do we need to check signal() for errors?
signal(SIGINT, sig_handler);
if (setjmp(env)) {
test->state = CLIENT_TERMINATE;
if (Nwrite(test->ctrl_sck, &test->state, sizeof(char), Ptcp) < 0) {
i_errno = IESENDMESSAGE;
return (-1);
}
exit(1);
}
while (test->state != IPERF_DONE) {
memcpy(&temp_read_set, &test->read_set, sizeof(fd_set));
memcpy(&temp_write_set, &test->write_set, sizeof(fd_set));
tv.tv_sec = 15;
tv.tv_usec = 0;
result = select(test->max_fd + 1, &temp_read_set, &temp_write_set, NULL, &tv);
if (result < 0 && errno != EINTR) {
i_errno = IESELECT;
return (-1);
} else if (result > 0) {
if (FD_ISSET(test->ctrl_sck, &temp_read_set)) {
if (iperf_handle_message_client(test) < 0)
return (-1);
FD_CLR(test->ctrl_sck, &temp_read_set);
}
if (test->state == TEST_RUNNING) {
if (test->reverse) {
// Reverse mode. Client receives.
if (iperf_recv(test) < 0)
return (-1);
} else {
// Regular mode. Client sends.
if (iperf_send(test) < 0)
return (-1);
}
/* Perform callbacks */
if (timer_expired(test->stats_timer)) {
test->stats_callback(test);
if (update_timer(test->stats_timer, test->stats_interval, 0) < 0)
return (-1);
}
if (timer_expired(test->reporter_timer)) {
test->reporter_callback(test);
if (update_timer(test->reporter_timer, test->reporter_interval, 0) < 0)
return (-1);
}
/* Send TEST_END if all data has been sent or timer expired */
if (all_data_sent(test) || timer_expired(test->timer)) {
test->stats_callback(test);
test->state = TEST_END;
if (Nwrite(test->ctrl_sck, &test->state, sizeof(char), Ptcp) < 0) {
i_errno = IESENDMESSAGE;
return (-1);
}
}
}
}
}
return (0);
}

18
src/iperf_client_api.h Обычный файл
Просмотреть файл

@ -0,0 +1,18 @@
#ifndef __IPERF_CLIENT_API_H
#define __IPERF_CLIENT_API_H
#include "iperf.h"
int iperf_run_client(struct iperf_test *);
int iperf_connect(struct iperf_test *);
int iperf_create_streams(struct iperf_test *);
int iperf_handle_message_client(struct iperf_test *);
int iperf_client_end(struct iperf_test *);
#endif

Просмотреть файл

@ -1,3 +1,4 @@
#ifndef __IPERF_SERVER_API_H
#define __IPERF_SERVER_API_H
@ -14,3 +15,4 @@ int iperf_handle_message_server(struct iperf_test *);
void iperf_test_reset(struct iperf_test *);
#endif

Просмотреть файл

@ -25,6 +25,7 @@
#include "iperf.h"
#include "iperf_api.h"
#include "iperf_client_api.h"
#include "iperf_server_api.h"
#include "units.h"
#include "locale.h"