implemented code review changes - r100/101, added a check on failure to receive STREAM_END message

This commit is contained in:
kaustubhprabhu 2009-06-30 23:41:23 +00:00
parent 6044ffd6f5
commit 8b44cd5a88
2 changed files with 64 additions and 25 deletions

View File

@ -254,7 +254,12 @@ int iperf_tcp_recv(struct iperf_stream *sp)
{ {
ch = buf[0]; ch = buf[0];
message = (int) ch; message = (int) ch;
} }
if(message == 3 || message == 9 || message == 8)
{
printf(" Recieved %d from client\n", message);
}
if(message!= STREAM_END) if(message!= STREAM_END)
sp->result->bytes_received+= result; sp->result->bytes_received+= result;
@ -310,7 +315,8 @@ int iperf_tcp_send(struct iperf_stream *sp)
buf[0]= STREAM_BEGIN; buf[0]= STREAM_BEGIN;
break; break;
case STREAM_END: case STREAM_END:
buf[0]= STREAM_END; printf("STREAM END STARTING\n");
buf[0]= STREAM_END;
break; break;
case RESULT_REQUEST: case RESULT_REQUEST:
buf[0]= RESULT_REQUEST; buf[0]= RESULT_REQUEST;
@ -324,15 +330,22 @@ int iperf_tcp_send(struct iperf_stream *sp)
} }
for(i=1; i < size; i++) for(i=1; i < size; i++)
buf[i] = i % 37; buf[i] = i % 37;
//applicable for 1st packet sent //applicable for 1st packet sent
if(sp->settings->state == STREAM_BEGIN) if(sp->settings->state == STREAM_BEGIN)
{ {
sp->settings->state = TEST_RUNNING; sp->settings->state = STREAM_RUNNING;
}
result = send(sp->socket, buf, size , 0);
if(result <=0)
{
perror("send:");
return -1;
} }
result = send(sp->socket, buf, size , 0);
sp->result->bytes_sent+= size; sp->result->bytes_sent+= size;
free(buf); free(buf);
@ -347,7 +360,7 @@ int iperf_udp_send(struct iperf_stream *sp)
// the || part ensures that last packet is sent to server - the STREAM_END MESSAGE // the || part ensures that last packet is sent to server - the STREAM_END MESSAGE
if(((struct timer *) sp->data)->expired((struct timer *) sp->data) || sp->settings->state == STREAM_END) if(sp->send_timer->expired(sp->send_timer) || sp->settings->state == STREAM_END)
{ {
int size = sp->settings->blksize; int size = sp->settings->blksize;
char *buf = (char *) malloc(size); char *buf = (char *) malloc(size);
@ -385,14 +398,21 @@ int iperf_udp_send(struct iperf_stream *sp)
// applicable for 1st packet sent // applicable for 1st packet sent
if(sp->settings->state == STREAM_BEGIN) if(sp->settings->state == STREAM_BEGIN)
{ {
sp->settings->state = TEST_RUNNING; sp->settings->state = STREAM_RUNNING;
} }
if(gettimeofday(&before, 0) < 0) if(gettimeofday(&before, 0) < 0)
perror("gettimeofday"); perror("gettimeofday");
result = send(sp->socket, buf, size, 0); result = send(sp->socket, buf, size, 0);
if(result <=0)
{
perror("send:");
return -1;
}
sp->result->bytes_sent+= result; sp->result->bytes_sent+= result;
if(gettimeofday(&after, 0) < 0) if(gettimeofday(&after, 0) < 0)
@ -409,7 +429,7 @@ int iperf_udp_send(struct iperf_stream *sp)
memcpy(&before, &after, sizeof before); memcpy(&before, &after, sizeof before);
// RESET THE TIMER // RESET THE TIMER
sp->data = new_timer(0, dtargus); sp->send_timer = new_timer(0, dtargus);
//printf(" new timer is %lld usec\n", dtargus); //printf(" new timer is %lld usec\n", dtargus);
} // timer_expired_micro } // timer_expired_micro
@ -658,10 +678,12 @@ char *iperf_reporter_callback(struct iperf_test *test)
if(test->role == 'c') if(test->role == 'c')
bytes+= sp->result->bytes_sent; bytes+= sp->result->bytes_sent;
else else
bytes+= sp->result->bytes_received; {
bytes+= sp->result->bytes_received;
}
sprintf(message,report_bw_header); sprintf(message,report_bw_header);
strcat(message_final, message); strcat(message_final, message);
start_time = timeval_diff(&sp->result->start_time, &sp->result->start_time); start_time = timeval_diff(&sp->result->start_time, &sp->result->start_time);
end_time = timeval_diff(&sp->result->start_time, &sp->result->end_time); end_time = timeval_diff(&sp->result->start_time, &sp->result->end_time);
@ -1014,7 +1036,7 @@ void iperf_run_server(struct iperf_test *test)
if (FD_ISSET(test->listener_sock, &test->temp_set)) if (FD_ISSET(test->listener_sock, &test->temp_set))
{ {
test->accept(test); test->accept(test);
test->default_settings->state = TEST_RUNNING; test->default_settings->state = TEST_RUNNING;
FD_CLR(test->listener_sock, &test->temp_set); FD_CLR(test->listener_sock, &test->temp_set);
} }
@ -1029,18 +1051,18 @@ void iperf_run_server(struct iperf_test *test)
message = n->rcv(n); message = n->rcv(n);
if(message == STREAM_END) if(message == STREAM_END)
{ {
n->settings->state = STREAM_END; n->settings->state = STREAM_END;
gettimeofday(&n->result->end_time, NULL); printf("stream ended \n");
FD_CLR(j, &test->read_set); gettimeofday(&n->result->end_time, NULL);
FD_CLR(j, &test->read_set);
} }
if(message == RESULT_REQUEST) if(message == RESULT_REQUEST)
{ {
n->settings->state = RESULT_RESPOND; n->settings->state = RESULT_RESPOND;
n->data = read; n->data = read;
send_result_to_client(n); send_result_to_client(n);
// FREE ALL STREAMS // FREE ALL STREAMS
n = test->streams; n = test->streams;
while(n) while(n)
@ -1056,8 +1078,21 @@ void iperf_run_server(struct iperf_test *test)
test->max_fd = test->listener_sock; test->max_fd = test->listener_sock;
} }
if( message == ALL_STREAMS_END ) if(message == ALL_STREAMS_END)
{ {
//sometimes the server is not getting the STREAM_END message
// hence changing the state of all but last stream forcefully
n = test->streams;
while(n->next)
{
if(n->settings->state == STREAM_BEGIN)
{
n->settings->state = STREAM_END;
gettimeofday(&n->result->end_time, NULL);
}
n= n->next;
}
test->default_settings->state = RESULT_REQUEST; test->default_settings->state = RESULT_REQUEST;
read = test->reporter_callback(test); read = test->reporter_callback(test);
puts(read); puts(read);
@ -1076,7 +1111,6 @@ void iperf_run_server(struct iperf_test *test)
test->max_fd = test->listener_sock; test->max_fd = test->listener_sock;
} }
} }
}// end if (FD_ISSET(j, &temp_set)) }// end if (FD_ISSET(j, &temp_set))
@ -1117,7 +1151,7 @@ void iperf_run_client(struct iperf_test *test)
sp = test->streams; sp = test->streams;
for(i=0; i< test->num_streams; i++) for(i=0; i< test->num_streams; i++)
{ {
sp->data = new_timer(0, dtargus); sp->send_timer = new_timer(0, dtargus);
sp= sp->next; sp= sp->next;
} }
} }
@ -1179,8 +1213,10 @@ void iperf_run_client(struct iperf_test *test)
{ {
sp = np; sp = np;
sp->settings->state = STREAM_END; sp->settings->state = STREAM_END;
sp->snd(sp); sp->snd(sp);
np = sp->next; printf("sent the STREAM_END message \n");
np = sp->next;
} while (np); } while (np);
test->default_settings->state = RESULT_REQUEST; test->default_settings->state = RESULT_REQUEST;

View File

@ -47,6 +47,8 @@ struct iperf_stream
int socket; // socket int socket; // socket
struct timer *send_timer;
struct sockaddr_storage local_addr; struct sockaddr_storage local_addr;
struct sockaddr_storage remote_addr; struct sockaddr_storage remote_addr;
@ -132,8 +134,9 @@ enum {
RESULT_RESPOND = 4, RESULT_RESPOND = 4,
TEST_END = 5, TEST_END = 5,
STREAM_BEGIN = 6, STREAM_BEGIN = 6,
STREAM_END = 7, STREAM_RUNNING = 7,
ALL_STREAMS_END = 8, STREAM_END = 8,
ALL_STREAMS_END = 9,
SEC_TO_US = 1000000 SEC_TO_US = 1000000
}; };