interrim commit: work in progress
Этот коммит содержится в:
родитель
8d41fbd712
Коммит
8f4e66c9d0
@ -36,6 +36,7 @@ struct iperf_stream_result
|
|||||||
void *data;
|
void *data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define COOKIE_SIZE 37 /* size of an ascii uuid */
|
||||||
struct iperf_settings
|
struct iperf_settings
|
||||||
{
|
{
|
||||||
int socket_bufsize; /* window size for TCP */
|
int socket_bufsize; /* window size for TCP */
|
||||||
@ -49,8 +50,7 @@ struct iperf_settings
|
|||||||
/* XXX: not sure about this design: everything else is this struct is static state,
|
/* XXX: not sure about this design: everything else is this struct is static state,
|
||||||
but the last 2 are dymanic state. Should they be in iperf_stream instead? */
|
but the last 2 are dymanic state. Should they be in iperf_stream instead? */
|
||||||
int state; /* This is state of a stream/test */
|
int state; /* This is state of a stream/test */
|
||||||
char cookie[37]; /* XXX: why 37? This should be a constant
|
char cookie[COOKIE_SIZE];
|
||||||
* -blt */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct iperf_stream
|
struct iperf_stream
|
||||||
@ -145,7 +145,7 @@ struct param_exchange
|
|||||||
int send_window;
|
int send_window;
|
||||||
int mss;
|
int mss;
|
||||||
char format;
|
char format;
|
||||||
char cookie[37]; /* size 37 makes total size 64 */
|
char cookie[COOKIE_SIZE];
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@ -172,6 +172,7 @@ enum
|
|||||||
STREAM_END = 8,
|
STREAM_END = 8,
|
||||||
ALL_STREAMS_END = 9,
|
ALL_STREAMS_END = 9,
|
||||||
PARAM_EXCHANGE = 10,
|
PARAM_EXCHANGE = 10,
|
||||||
|
PARAM_EXCHANGE_ACK = 11,
|
||||||
ACCESS_DENIED = -1,
|
ACCESS_DENIED = -1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ exchange_parameters(struct iperf_test *test)
|
|||||||
param = (struct param_exchange *)sp->buffer;
|
param = (struct param_exchange *)sp->buffer;
|
||||||
|
|
||||||
get_uuid(test->default_settings->cookie);
|
get_uuid(test->default_settings->cookie);
|
||||||
strncpy(param->cookie, test->default_settings->cookie, 37);
|
strncpy(param->cookie, test->default_settings->cookie, COOKIE_SIZE);
|
||||||
//printf("client cookie: %s \n", param->cookie);
|
//printf("client cookie: %s \n", param->cookie);
|
||||||
|
|
||||||
/* setting up exchange parameters */
|
/* setting up exchange parameters */
|
||||||
@ -107,6 +107,7 @@ exchange_parameters(struct iperf_test *test)
|
|||||||
param->send_window = test->default_settings->socket_bufsize;
|
param->send_window = test->default_settings->socket_bufsize;
|
||||||
param->format = test->default_settings->unit_format;
|
param->format = test->default_settings->unit_format;
|
||||||
|
|
||||||
|
#ifdef OLD_WAY
|
||||||
//printf(" sending exchange params: size = %d \n", (int)sizeof(struct param_exchange));
|
//printf(" sending exchange params: size = %d \n", (int)sizeof(struct param_exchange));
|
||||||
/* XXX: can we use iperf_tcp_send for this? that would be cleaner */
|
/* XXX: can we use iperf_tcp_send for this? that would be cleaner */
|
||||||
result = send(sp->socket, sp->buffer, sizeof(struct param_exchange), 0);
|
result = send(sp->socket, sp->buffer, sizeof(struct param_exchange), 0);
|
||||||
@ -120,9 +121,15 @@ exchange_parameters(struct iperf_test *test)
|
|||||||
//printf("exchange_parameters: reading result from server .. \n");
|
//printf("exchange_parameters: reading result from server .. \n");
|
||||||
result = recv(sp->socket, sp->buffer, sizeof(struct param_exchange), 0);
|
result = recv(sp->socket, sp->buffer, sizeof(struct param_exchange), 0);
|
||||||
} while (result == -1 && errno == EINTR);
|
} while (result == -1 && errno == EINTR);
|
||||||
|
#else
|
||||||
|
result = sp->snd(sp);
|
||||||
|
if (result < 0)
|
||||||
|
perror("Error sending exchange params to server");
|
||||||
|
result = Nread(sp->socket, sp->buffer, sizeof(struct param_exchange), Ptcp);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
perror("Error getting exchange params ack from server");
|
perror("Error getting exchange params ack from server");
|
||||||
|
|
||||||
if (result > 0 && sp->buffer[0] == ACCESS_DENIED) {
|
if (result > 0 && sp->buffer[0] == ACCESS_DENIED) {
|
||||||
fprintf(stderr, "Busy server Detected. Try again later. Exiting.\n");
|
fprintf(stderr, "Busy server Detected. Try again later. Exiting.\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
@ -196,8 +203,7 @@ receive_result_from_server(struct iperf_test *test)
|
|||||||
|
|
||||||
printf("in receive_result_from_server \n");
|
printf("in receive_result_from_server \n");
|
||||||
sp = test->streams;
|
sp = test->streams;
|
||||||
size = sp->settings->blksize; /* XXX: Is blksize really what we
|
size = MAX_RESULT_STRING;
|
||||||
* want to use for the results? */
|
|
||||||
|
|
||||||
buf = (char *)malloc(size);
|
buf = (char *)malloc(size);
|
||||||
|
|
||||||
@ -325,7 +331,7 @@ iperf_defaults(struct iperf_test *testp)
|
|||||||
testp->default_settings->state = TEST_START;
|
testp->default_settings->state = TEST_START;
|
||||||
testp->default_settings->mss = 0;
|
testp->default_settings->mss = 0;
|
||||||
testp->default_settings->bytes = 0;
|
testp->default_settings->bytes = 0;
|
||||||
memset(testp->default_settings->cookie, '\0', 37);
|
memset(testp->default_settings->cookie, '\0', COOKIE_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@ -353,9 +359,9 @@ iperf_init_test(struct iperf_test *test)
|
|||||||
if (set_tcp_windowsize(test->listener_sock_tcp, test->default_settings->socket_bufsize, SO_RCVBUF) < 0)
|
if (set_tcp_windowsize(test->listener_sock_tcp, test->default_settings->socket_bufsize, SO_RCVBUF) < 0)
|
||||||
perror("unable to set TCP window");
|
perror("unable to set TCP window");
|
||||||
}
|
}
|
||||||
/* XXX: why do we do this?? -blt */
|
/* make sure that accept call does not block */
|
||||||
//setnonblocking(test->listener_sock_tcp);
|
setnonblocking(test->listener_sock_tcp);
|
||||||
//setnonblocking(test->listener_sock_udp);
|
setnonblocking(test->listener_sock_udp);
|
||||||
|
|
||||||
printf("-----------------------------------------------------------\n");
|
printf("-----------------------------------------------------------\n");
|
||||||
printf("Server listening on %d\n", test->server_port);
|
printf("Server listening on %d\n", test->server_port);
|
||||||
@ -508,7 +514,7 @@ iperf_reporter_callback(struct iperf_test *test)
|
|||||||
int total_packets = 0, lost_packets = 0, curr_state = 0;
|
int total_packets = 0, lost_packets = 0, curr_state = 0;
|
||||||
char ubuf [UNIT_LEN];
|
char ubuf [UNIT_LEN];
|
||||||
char nbuf [UNIT_LEN];
|
char nbuf [UNIT_LEN];
|
||||||
struct iperf_stream *sp = test->streams;
|
struct iperf_stream *sp = NULL;
|
||||||
iperf_size_t bytes = 0;
|
iperf_size_t bytes = 0;
|
||||||
double start_time, end_time;
|
double start_time, end_time;
|
||||||
char *message = (char *)malloc(MAX_RESULT_STRING);
|
char *message = (char *)malloc(MAX_RESULT_STRING);
|
||||||
@ -521,7 +527,7 @@ iperf_reporter_callback(struct iperf_test *test)
|
|||||||
|
|
||||||
sp = test->streams;
|
sp = test->streams;
|
||||||
curr_state = sp->settings->state;
|
curr_state = sp->settings->state;
|
||||||
//printf("in iperf_reporter_callback: state = %d \n", curr_state);
|
printf("in iperf_reporter_callback: state = %d \n", curr_state);
|
||||||
|
|
||||||
if (curr_state == TEST_RUNNING) {
|
if (curr_state == TEST_RUNNING) {
|
||||||
/* print interval results */
|
/* print interval results */
|
||||||
@ -671,7 +677,7 @@ safe_strcat(char *s1, char *s2)
|
|||||||
strcat(s1, s2);
|
strcat(s1, s2);
|
||||||
else {
|
else {
|
||||||
printf("Error: results string too long \n");
|
printf("Error: results string too long \n");
|
||||||
exit(-1); /* XXX: should return an error instead */
|
exit(-1); /* XXX: should return an error instead! */
|
||||||
//return -1;
|
//return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,9 +57,9 @@ param_received(struct iperf_stream * sp, struct param_exchange * param)
|
|||||||
char *buf = (char *) malloc(sizeof(struct param_exchange));
|
char *buf = (char *) malloc(sizeof(struct param_exchange));
|
||||||
|
|
||||||
if (sp->settings->cookie[0] == '\0' ||
|
if (sp->settings->cookie[0] == '\0' ||
|
||||||
(strncmp(param->cookie, sp->settings->cookie, 37) == 0))
|
(strncmp(param->cookie, sp->settings->cookie, COOKIE_SIZE) == 0))
|
||||||
{
|
{
|
||||||
strncpy(sp->settings->cookie, param->cookie, 37);
|
strncpy(sp->settings->cookie, param->cookie, COOKIE_SIZE);
|
||||||
sp->settings->blksize = param->blksize;
|
sp->settings->blksize = param->blksize;
|
||||||
sp->settings->socket_bufsize = param->recv_window;
|
sp->settings->socket_bufsize = param->recv_window;
|
||||||
sp->settings->unit_format = param->format;
|
sp->settings->unit_format = param->format;
|
||||||
@ -70,15 +70,17 @@ param_received(struct iperf_stream * sp, struct param_exchange * param)
|
|||||||
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Connection from new client denied\n");
|
fprintf(stderr, "Connection from new client denied.\n");
|
||||||
|
printf("cookie still set to %s \n", sp->settings->cookie);
|
||||||
param->state = ACCESS_DENIED;
|
param->state = ACCESS_DENIED;
|
||||||
buf[0] = ACCESS_DENIED;
|
buf[0] = ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
free(buf);
|
memcpy(sp->buffer, buf, sizeof(struct param_exchange));;
|
||||||
//printf("param_received: Sending message back to client \n");
|
printf("param_received: Sending message (%d) back to client \n", sp->buffer[0]);
|
||||||
result = send(sp->socket, buf, sizeof(struct param_exchange), 0);
|
result = Nwrite(sp->socket, sp->buffer, sizeof(struct param_exchange), Ptcp);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
perror("param_received: Error sending param ack to client");
|
perror("param_received: Error sending param ack to client");
|
||||||
|
free(buf);
|
||||||
return param->state;
|
return param->state;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,7 +129,7 @@ iperf_run_server(struct iperf_test * test)
|
|||||||
FD_SET(test->listener_sock_udp, &test->read_set);
|
FD_SET(test->listener_sock_udp, &test->read_set);
|
||||||
|
|
||||||
test->max_fd = test->listener_sock_tcp > test->listener_sock_udp ? test->listener_sock_tcp : test->listener_sock_udp;
|
test->max_fd = test->listener_sock_tcp > test->listener_sock_udp ? test->listener_sock_tcp : test->listener_sock_udp;
|
||||||
printf("iperf_run_server: max_fd set to %d \n", test->max_fd);
|
//printf("iperf_run_server: max_fd set to %d \n", test->max_fd);
|
||||||
|
|
||||||
test->num_streams = 0;
|
test->num_streams = 0;
|
||||||
test->default_settings->state = TEST_RUNNING;
|
test->default_settings->state = TEST_RUNNING;
|
||||||
@ -174,6 +176,10 @@ iperf_run_server(struct iperf_test * test)
|
|||||||
FD_CLR(test->listener_sock_udp, &test->temp_set);
|
FD_CLR(test->listener_sock_udp, &test->temp_set);
|
||||||
}
|
}
|
||||||
/* Process the sockets for read operation */
|
/* Process the sockets for read operation */
|
||||||
|
/* XXX: Need to try to read equal amounts from each socket, so keep
|
||||||
|
track of last socket read from, and always start with the next
|
||||||
|
socket
|
||||||
|
*/
|
||||||
for (j = 0; j < test->max_fd + 1; j++)
|
for (j = 0; j < test->max_fd + 1; j++)
|
||||||
{
|
{
|
||||||
if (FD_ISSET(j, &test->temp_set))
|
if (FD_ISSET(j, &test->temp_set))
|
||||||
@ -206,10 +212,6 @@ iperf_run_server(struct iperf_test * test)
|
|||||||
}
|
}
|
||||||
if (message == STREAM_END)
|
if (message == STREAM_END)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
* should get one of these for each stream
|
|
||||||
*/
|
|
||||||
/* XXX: fixme: use this timestamp for all streams */
|
|
||||||
gettimeofday(&np->result->end_time, NULL);
|
gettimeofday(&np->result->end_time, NULL);
|
||||||
}
|
}
|
||||||
if (message == RESULT_REQUEST)
|
if (message == RESULT_REQUEST)
|
||||||
@ -221,6 +223,7 @@ iperf_run_server(struct iperf_test * test)
|
|||||||
}
|
}
|
||||||
if (message == ALL_STREAMS_END)
|
if (message == ALL_STREAMS_END)
|
||||||
{
|
{
|
||||||
|
printf("client send ALL_STREAMS_END message, printing results \n");
|
||||||
/* print server results */
|
/* print server results */
|
||||||
results_string = test->reporter_callback(test);
|
results_string = test->reporter_callback(test);
|
||||||
puts(results_string); /* send to stdio */
|
puts(results_string); /* send to stdio */
|
||||||
@ -242,7 +245,8 @@ iperf_run_server(struct iperf_test * test)
|
|||||||
|
|
||||||
test->default_settings->state = TEST_END;
|
test->default_settings->state = TEST_END;
|
||||||
/* reset cookie when client is finished */
|
/* reset cookie when client is finished */
|
||||||
memset(test->default_settings->cookie, '\0', 37);
|
printf("got TEST_END message, reseting cookie \n");
|
||||||
|
memset(test->default_settings->cookie, '\0', COOKIE_SIZE);
|
||||||
break; /* always break out of for loop on TEST_END message */
|
break; /* always break out of for loop on TEST_END message */
|
||||||
}
|
}
|
||||||
} /* end if (FD_ISSET(j, &temp_set)) */
|
} /* end if (FD_ISSET(j, &temp_set)) */
|
||||||
|
@ -51,7 +51,7 @@ jmp_buf env; /* to handle longjmp on signal */
|
|||||||
int
|
int
|
||||||
iperf_tcp_recv(struct iperf_stream * sp)
|
iperf_tcp_recv(struct iperf_stream * sp)
|
||||||
{
|
{
|
||||||
int result, message;
|
int result = 0, message = 0;
|
||||||
int size = sp->settings->blksize;
|
int size = sp->settings->blksize;
|
||||||
char *final_message = NULL;
|
char *final_message = NULL;
|
||||||
|
|
||||||
@ -130,7 +130,6 @@ iperf_tcp_recv(struct iperf_stream * sp)
|
|||||||
break;
|
break;
|
||||||
case STREAM_END:
|
case STREAM_END:
|
||||||
size = sizeof(struct param_exchange);
|
size = sizeof(struct param_exchange);
|
||||||
/* XXX: Fixme: neeed to read from all sockets if find a STREAM_END message */
|
|
||||||
result = Nread(sp->socket, sp->buffer, size, Ptcp);
|
result = Nread(sp->socket, sp->buffer, size, Ptcp);
|
||||||
break;
|
break;
|
||||||
case ALL_STREAMS_END:
|
case ALL_STREAMS_END:
|
||||||
@ -144,11 +143,10 @@ iperf_tcp_recv(struct iperf_stream * sp)
|
|||||||
case RESULT_REQUEST:
|
case RESULT_REQUEST:
|
||||||
/* XXX: not working yet */
|
/* XXX: not working yet */
|
||||||
//final_message = iperf_reporter_callback(test);
|
//final_message = iperf_reporter_callback(test);
|
||||||
final_message = "final server results string will go here \n";
|
|
||||||
//memcpy(sp->buffer, final_message, strlen(final_message));
|
//memcpy(sp->buffer, final_message, strlen(final_message));
|
||||||
//result = send(sp->socket, sp->buffer, sp->settings->blksize, 0);
|
//result = send(sp->socket, sp->buffer, MAX_RESULT_STRING, 0);
|
||||||
//if (result < 0)
|
if (result < 0)
|
||||||
// perror("Error sending results back to client");
|
perror("Error sending results back to client");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -195,7 +193,7 @@ iperf_tcp_send(struct iperf_stream * sp)
|
|||||||
size = sizeof(struct param_exchange);
|
size = sizeof(struct param_exchange);
|
||||||
break;
|
break;
|
||||||
case RESULT_REQUEST:
|
case RESULT_REQUEST:
|
||||||
size = sp->settings->blksize; /* XXX: what size should this be? */
|
size = MAX_RESULT_STRING;
|
||||||
break;
|
break;
|
||||||
case ALL_STREAMS_END:
|
case ALL_STREAMS_END:
|
||||||
size = sizeof(struct param_exchange);
|
size = sizeof(struct param_exchange);
|
||||||
|
@ -25,7 +25,7 @@ get_uuid(char *temp)
|
|||||||
uuid_create(&uu, NULL);
|
uuid_create(&uu, NULL);
|
||||||
uuid_to_string(&uu, &s, 0);
|
uuid_to_string(&uu, &s, 0);
|
||||||
#else
|
#else
|
||||||
s = (char *) malloc(37); /* UUID is 36 chars + \0 */
|
s = (char *) malloc(37);
|
||||||
uuid_generate(uu);
|
uuid_generate(uu);
|
||||||
uuid_unparse(uu, s);
|
uuid_unparse(uu, s);
|
||||||
#endif
|
#endif
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user