diff --git a/src/iperf.h b/src/iperf.h index c25adef..7b4f0f9 100644 --- a/src/iperf.h +++ b/src/iperf.h @@ -36,6 +36,7 @@ struct iperf_stream_result void *data; }; +#define COOKIE_SIZE 37 /* size of an ascii uuid */ struct iperf_settings { 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, but the last 2 are dymanic state. Should they be in iperf_stream instead? */ int state; /* This is state of a stream/test */ - char cookie[37]; /* XXX: why 37? This should be a constant - * -blt */ + char cookie[COOKIE_SIZE]; }; struct iperf_stream @@ -145,7 +145,7 @@ struct param_exchange int send_window; int mss; char format; - char cookie[37]; /* size 37 makes total size 64 */ + char cookie[COOKIE_SIZE]; }; enum @@ -172,6 +172,7 @@ enum STREAM_END = 8, ALL_STREAMS_END = 9, PARAM_EXCHANGE = 10, + PARAM_EXCHANGE_ACK = 11, ACCESS_DENIED = -1, }; diff --git a/src/iperf_api.c b/src/iperf_api.c index 6db78c6..9037b2f 100644 --- a/src/iperf_api.c +++ b/src/iperf_api.c @@ -97,7 +97,7 @@ exchange_parameters(struct iperf_test *test) param = (struct param_exchange *)sp->buffer; 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); /* setting up exchange parameters */ @@ -107,6 +107,7 @@ exchange_parameters(struct iperf_test *test) param->send_window = test->default_settings->socket_bufsize; param->format = test->default_settings->unit_format; +#ifdef OLD_WAY //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 */ 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"); result = recv(sp->socket, sp->buffer, sizeof(struct param_exchange), 0); } 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) perror("Error getting exchange params ack from server"); - if (result > 0 && sp->buffer[0] == ACCESS_DENIED) { fprintf(stderr, "Busy server Detected. Try again later. Exiting.\n"); exit(-1); @@ -196,8 +203,7 @@ receive_result_from_server(struct iperf_test *test) printf("in receive_result_from_server \n"); sp = test->streams; - size = sp->settings->blksize; /* XXX: Is blksize really what we - * want to use for the results? */ + size = MAX_RESULT_STRING; buf = (char *)malloc(size); @@ -325,7 +331,7 @@ iperf_defaults(struct iperf_test *testp) testp->default_settings->state = TEST_START; testp->default_settings->mss = 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) perror("unable to set TCP window"); } - /* XXX: why do we do this?? -blt */ - //setnonblocking(test->listener_sock_tcp); - //setnonblocking(test->listener_sock_udp); + /* make sure that accept call does not block */ + setnonblocking(test->listener_sock_tcp); + setnonblocking(test->listener_sock_udp); printf("-----------------------------------------------------------\n"); 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; char ubuf [UNIT_LEN]; char nbuf [UNIT_LEN]; - struct iperf_stream *sp = test->streams; + struct iperf_stream *sp = NULL; iperf_size_t bytes = 0; double start_time, end_time; char *message = (char *)malloc(MAX_RESULT_STRING); @@ -521,7 +527,7 @@ iperf_reporter_callback(struct iperf_test *test) sp = test->streams; 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) { /* print interval results */ @@ -671,7 +677,7 @@ safe_strcat(char *s1, char *s2) strcat(s1, s2); else { 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; } } diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c index e81f41b..aaf990d 100644 --- a/src/iperf_server_api.c +++ b/src/iperf_server_api.c @@ -57,9 +57,9 @@ param_received(struct iperf_stream * sp, struct param_exchange * param) char *buf = (char *) malloc(sizeof(struct param_exchange)); 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->socket_bufsize = param->recv_window; sp->settings->unit_format = param->format; @@ -70,15 +70,17 @@ param_received(struct iperf_stream * sp, struct param_exchange * param) } 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; buf[0] = ACCESS_DENIED; } - free(buf); - //printf("param_received: Sending message back to client \n"); - result = send(sp->socket, buf, sizeof(struct param_exchange), 0); + memcpy(sp->buffer, buf, sizeof(struct param_exchange));; + printf("param_received: Sending message (%d) back to client \n", sp->buffer[0]); + result = Nwrite(sp->socket, sp->buffer, sizeof(struct param_exchange), Ptcp); if (result < 0) perror("param_received: Error sending param ack to client"); + free(buf); return param->state; } @@ -127,7 +129,7 @@ iperf_run_server(struct iperf_test * test) 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; - 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->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); } /* 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++) { if (FD_ISSET(j, &test->temp_set)) @@ -206,10 +212,6 @@ iperf_run_server(struct iperf_test * test) } 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); } if (message == RESULT_REQUEST) @@ -221,6 +223,7 @@ iperf_run_server(struct iperf_test * test) } if (message == ALL_STREAMS_END) { + printf("client send ALL_STREAMS_END message, printing results \n"); /* print server results */ results_string = test->reporter_callback(test); puts(results_string); /* send to stdio */ @@ -242,7 +245,8 @@ iperf_run_server(struct iperf_test * test) test->default_settings->state = TEST_END; /* 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 */ } } /* end if (FD_ISSET(j, &temp_set)) */ diff --git a/src/iperf_tcp.c b/src/iperf_tcp.c index b9a1019..b081cbd 100644 --- a/src/iperf_tcp.c +++ b/src/iperf_tcp.c @@ -51,7 +51,7 @@ jmp_buf env; /* to handle longjmp on signal */ int iperf_tcp_recv(struct iperf_stream * sp) { - int result, message; + int result = 0, message = 0; int size = sp->settings->blksize; char *final_message = NULL; @@ -130,7 +130,6 @@ iperf_tcp_recv(struct iperf_stream * sp) break; case STREAM_END: 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); break; case ALL_STREAMS_END: @@ -144,11 +143,10 @@ iperf_tcp_recv(struct iperf_stream * sp) case RESULT_REQUEST: /* XXX: not working yet */ //final_message = iperf_reporter_callback(test); - final_message = "final server results string will go here \n"; //memcpy(sp->buffer, final_message, strlen(final_message)); - //result = send(sp->socket, sp->buffer, sp->settings->blksize, 0); - //if (result < 0) - // perror("Error sending results back to client"); + //result = send(sp->socket, sp->buffer, MAX_RESULT_STRING, 0); + if (result < 0) + perror("Error sending results back to client"); break; default: @@ -195,7 +193,7 @@ iperf_tcp_send(struct iperf_stream * sp) size = sizeof(struct param_exchange); break; case RESULT_REQUEST: - size = sp->settings->blksize; /* XXX: what size should this be? */ + size = MAX_RESULT_STRING; break; case ALL_STREAMS_END: size = sizeof(struct param_exchange); diff --git a/src/uuid.c b/src/uuid.c index 001f989..e75b542 100644 --- a/src/uuid.c +++ b/src/uuid.c @@ -25,7 +25,7 @@ get_uuid(char *temp) uuid_create(&uu, NULL); uuid_to_string(&uu, &s, 0); #else - s = (char *) malloc(37); /* UUID is 36 chars + \0 */ + s = (char *) malloc(37); uuid_generate(uu); uuid_unparse(uu, s); #endif