diff --git a/performance_results/ideal/merged_stats.csv b/performance_results/ideal/merged_stats.csv new file mode 100644 index 0000000000000000000000000000000000000000..369aab13dff0643ebde87f7623b1a207e78f5b25 --- /dev/null +++ b/performance_results/ideal/merged_stats.csv @@ -0,0 +1,7 @@ +data_sent,data_received,data_truncated_received,fec_sent,fec_received,ack_sent,ack_received,nack_received,packet_ignored,throughput,min_rtt,max_rtt,packet_retransmitted,fec +43263.0,0.0,0.0,0.0,0.0,0.0,38716.0,30.0,0.0,996184.9375,7.0,222.0,38737.0,0 +43386.0,0.0,0.0,1132.0,0.0,0.0,38845.0,24.0,0.0,1002924.3125,4.0,294.0,38860.0,1 +44906.0,0.0,0.0,1132.0,0.0,0.0,40370.0,17.0,0.0,1033694.0,4.0,218.0,40380.0,1 +34710.0,0.0,0.0,0.0,0.0,0.0,30175.0,19.0,0.0,925487.25,6.0,545.0,30184.0,0 +36801.0,0.0,0.0,0.0,0.0,0.0,32265.0,19.0,0.0,968436.4375,4.0,300.0,32275.0,0 +30674.0,0.0,0.0,1132.0,0.0,0.0,26133.0,25.0,0.0,948363.9375,5.0,249.0,26148.0,1 diff --git a/performance_results/ideal/output.gif b/performance_results/ideal/output.gif new file mode 100644 index 0000000000000000000000000000000000000000..ae8a968b45b58c62a535e62648696f90a97b37d3 Binary files /dev/null and b/performance_results/ideal/output.gif differ diff --git a/performance_results/ideal/receiver_1_with_FEC.csv b/performance_results/ideal/receiver_1_with_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..6177c35a89de1a4159be0316a16ee8ff9a3e0828 --- /dev/null +++ b/performance_results/ideal/receiver_1_with_FEC.csv @@ -0,0 +1,12 @@ +data_sent:0 +data_received:5859 +data_truncated_received:19 +fec_sent:0 +fec_received:724 +ack_sent:39291 +ack_received:0 +nack_received:0 +packet_ignored:453 +throughput:1044119.437500 +packet_duplicated:1457 +packet_recovered:124 diff --git a/performance_results/ideal/receiver_1_without_FEC.csv b/performance_results/ideal/receiver_1_without_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..de8471fab8a1a875c241d9694f7d3f153ede6b7a --- /dev/null +++ b/performance_results/ideal/receiver_1_without_FEC.csv @@ -0,0 +1,12 @@ +data_sent:0 +data_received:5904 +data_truncated_received:23 +fec_sent:0 +fec_received:0 +ack_sent:39165 +ack_received:0 +nack_received:0 +packet_ignored:392 +throughput:1001298.562500 +packet_duplicated:1378 +packet_recovered:0 diff --git a/performance_results/ideal/receiver_2_with_FEC.csv b/performance_results/ideal/receiver_2_with_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..0787b14cbd88158b2e6a67802cfb72a6595b2b95 --- /dev/null +++ b/performance_results/ideal/receiver_2_with_FEC.csv @@ -0,0 +1,12 @@ +data_sent:0 +data_received:5853 +data_truncated_received:19 +fec_sent:0 +fec_received:721 +ack_sent:40197 +ack_received:0 +nack_received:0 +packet_ignored:467 +throughput:1029673.375000 +packet_duplicated:1450 +packet_recovered:123 diff --git a/performance_results/ideal/receiver_2_without_FEC.csv b/performance_results/ideal/receiver_2_without_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..c40a93eab833a87b56381be50973644aba18e783 --- /dev/null +++ b/performance_results/ideal/receiver_2_without_FEC.csv @@ -0,0 +1,12 @@ +data_sent:0 +data_received:5877 +data_truncated_received:27 +fec_sent:0 +fec_received:0 +ack_sent:37830 +ack_received:0 +nack_received:0 +packet_ignored:383 +throughput:993940.812500 +packet_duplicated:1351 +packet_recovered:0 diff --git a/performance_results/ideal/receiver_3_with_FEC.csv b/performance_results/ideal/receiver_3_with_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..108a0757ff3d62f915eb7449032a296965682cef --- /dev/null +++ b/performance_results/ideal/receiver_3_with_FEC.csv @@ -0,0 +1,12 @@ +data_sent:0 +data_received:5449 +data_truncated_received:18 +fec_sent:0 +fec_received:763 +ack_sent:27451 +ack_received:0 +nack_received:0 +packet_ignored:352 +throughput:971431.750000 +packet_duplicated:1072 +packet_recovered:149 diff --git a/performance_results/ideal/receiver_3_without_FEC.csv b/performance_results/ideal/receiver_3_without_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..22ca3b148e307d92c3920fe33d8aea21fbeaca08 --- /dev/null +++ b/performance_results/ideal/receiver_3_without_FEC.csv @@ -0,0 +1,12 @@ +data_sent:0 +data_received:5835 +data_truncated_received:27 +fec_sent:0 +fec_received:0 +ack_sent:38436 +ack_received:0 +nack_received:0 +packet_ignored:422 +throughput:992450.312500 +packet_duplicated:1309 +packet_recovered:0 diff --git a/performance_results/ideal/sender_1_with_FEC.csv b/performance_results/ideal/sender_1_with_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..d13c7407ddee13e74689be91d9a7dadb30cd6a04 --- /dev/null +++ b/performance_results/ideal/sender_1_with_FEC.csv @@ -0,0 +1,13 @@ +data_sent:43811 +data_received:0 +data_truncated_received:0 +fec_sent:1132 +fec_received:0 +ack_sent:0 +ack_received:39275 +nack_received:19 +packet_ignored:0 +throughput:1039259.312500 +min_rtt:4 +max_rtt:240 +packet_retransmitted:39285 diff --git a/performance_results/ideal/sender_1_without_FEC.csv b/performance_results/ideal/sender_1_without_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..f5cb9a721ce8edda9d1be664064bab690ee8d9bb --- /dev/null +++ b/performance_results/ideal/sender_1_without_FEC.csv @@ -0,0 +1,13 @@ +data_sent:43706 +data_received:0 +data_truncated_received:0 +fec_sent:0 +fec_received:0 +ack_sent:0 +ack_received:39165 +nack_received:23 +packet_ignored:0 +throughput:997203.437500 +min_rtt:5 +max_rtt:230 +packet_retransmitted:39180 diff --git a/performance_results/ideal/sender_2_with_FEC.csv b/performance_results/ideal/sender_2_with_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..aef860215a8d0267f082557c9888d928e107dfe1 --- /dev/null +++ b/performance_results/ideal/sender_2_with_FEC.csv @@ -0,0 +1,13 @@ +data_sent:44734 +data_received:0 +data_truncated_received:0 +fec_sent:1132 +fec_received:0 +ack_sent:0 +ack_received:40197 +nack_received:19 +packet_ignored:0 +throughput:1022288.937500 +min_rtt:2 +max_rtt:227 +packet_retransmitted:40208 diff --git a/performance_results/ideal/sender_2_without_FEC.csv b/performance_results/ideal/sender_2_without_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..6b2f8d3f29c5071792cf015b71c2fd69e546d1c4 --- /dev/null +++ b/performance_results/ideal/sender_2_without_FEC.csv @@ -0,0 +1,13 @@ +data_sent:42374 +data_received:0 +data_truncated_received:0 +fec_sent:0 +fec_received:0 +ack_sent:0 +ack_received:37829 +nack_received:27 +packet_ignored:0 +throughput:984541.062500 +min_rtt:4 +max_rtt:238 +packet_retransmitted:37848 diff --git a/performance_results/ideal/sender_3_with_FEC.csv b/performance_results/ideal/sender_3_with_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..e76ed44be6c77c075d1c301d0e06b1dfa307582d --- /dev/null +++ b/performance_results/ideal/sender_3_with_FEC.csv @@ -0,0 +1,13 @@ +data_sent:31985 +data_received:0 +data_truncated_received:0 +fec_sent:1132 +fec_received:0 +ack_sent:0 +ack_received:27451 +nack_received:18 +packet_ignored:0 +throughput:963552.000000 +min_rtt:1 +max_rtt:300 +packet_retransmitted:27459 diff --git a/performance_results/ideal/sender_3_without_FEC.csv b/performance_results/ideal/sender_3_without_FEC.csv new file mode 100644 index 0000000000000000000000000000000000000000..c8e0b2410ddde808b85103b03e1261a64f72f2b4 --- /dev/null +++ b/performance_results/ideal/sender_3_without_FEC.csv @@ -0,0 +1,13 @@ +data_sent:42970 +data_received:0 +data_truncated_received:0 +fec_sent:0 +fec_received:0 +ack_sent:0 +ack_received:38427 +nack_received:27 +packet_ignored:0 +throughput:990699.375000 +min_rtt:6 +max_rtt:251 +packet_retransmitted:38444 diff --git a/src/receiver.c b/src/receiver.c index 899f07301471cdf7219921c7c8952bb3e5d579c5..1efc9eb5cc1c1a6172b153f2c0e71037165c74e8 100644 --- a/src/receiver.c +++ b/src/receiver.c @@ -37,13 +37,9 @@ int main(int argc, char **argv) { return print_usage(argv[0]); } - ASSERT(1 == 1); // Try to change it to see what happens when it fails - // DEBUG_DUMP("Some bytes", 11); // You can use it with any pointer type - DEBUG("Receiver has following arguments: stats_filename is %s, listen_ip is %s, listen_port is %u", stats_filename, listen_ip, listen_port); - // 1. Bind address to port struct sockaddr_in6 * addr = (struct sockaddr_in6 *) malloc(sizeof(struct sockaddr_in6)); const char * res = real_address(listen_ip, addr); if (res != NULL) diff --git a/src/receiver_utils.c b/src/receiver_utils.c index ff3586eeb527ee80357424e3ec0e4ff6d3cd80e4..a25dd7e48a99f3ac3487c113e634db5f69c151d5 100644 --- a/src/receiver_utils.c +++ b/src/receiver_utils.c @@ -74,6 +74,7 @@ int send_if_inneed(struct pollfd * pfd, receiver_state_t * state) int consume_data_pkt(receiver_state_t * state, uint8_t seqnum_to_consume) { ASSERT(state->recvd_data_buf[seqnum_to_consume] != NULL); + state->bytes_received = state->bytes_received + pkt_get_length(state->recvd_data_buf[seqnum_to_consume]); size_t written = fwrite((void *) pkt_get_payload(state->recvd_data_buf[seqnum_to_consume]), sizeof(char), (size_t) pkt_get_length(state->recvd_data_buf[seqnum_to_consume]), stdout); if (written != pkt_get_length(state->recvd_data_buf[seqnum_to_consume])) { @@ -254,7 +255,7 @@ int prepare_ack_to_send(receiver_state_t * state) */ int handle_data_pkt(receiver_state_t * state, const pkt_t * pkt) { - state->stats->data_received++; + DEBUG("Received data packet seqnum %d with timestamp %d | current_window_size : %d, current_window_start : %d", pkt_get_seqnum(pkt), pkt_get_timestamp(pkt), state->curr_recv_window, state->recv_window_start); @@ -488,13 +489,14 @@ int handle_valid_pkt(receiver_state_t * state, const pkt_t * pkt) return prepare_ack_to_send(state); } - state->timestamp_last_packet = time((time_t *) &(state->timestamp_last_packet)); + gettimeofday(&(state->timestamp_last_packet), NULL); uint8_t tr = pkt_get_tr(pkt); if (tr == 1) { /* If truncated */ return handle_truncated_pkt(state, pkt); } else if (pkt_get_type(pkt) == PTYPE_DATA) { /* Type DATA */ + state->stats->data_received++; // Can't be put in handle data pckt cause it used by fec too return handle_data_pkt(state, pkt); } else if (pkt_get_type(pkt) == PTYPE_FEC) { /* Type FEC */ @@ -620,7 +622,8 @@ receiver_state_t * state_new() to_return->transfer_done = 0; to_return->next_to_consume = 0; to_return->last_packet = 256; // No valid seqnum will reach this value, max value 255 - to_return->last_data_packet = 256; + to_return->last_data_packet = 256; + to_return->bytes_received = 0; return to_return; } @@ -654,15 +657,15 @@ void receiver_read_write_loop(int sfd, const char * pathname) pfd->events = POLLIN | POLLOUT; if (wait_for_client(sfd) == 0) { - state->timestamp_first_packet = time((time_t *) &(state->timestamp_first_packet)); + gettimeofday(&(state->timestamp_first_packet), NULL); reception_loop(pfd, state); } DEBUG("Done the transfer with done status being %s", (state->transfer_done) ? "true" : "false"); sleep(2); - double time = difftime(state->timestamp_last_packet, state->timestamp_first_packet); - DEBUG("The difference between the two is %f seconds", (double) state->timestamp_last_packet - state->timestamp_first_packet); - DEBUG("The transfer took %f seconds", time); - state->stats->throughput = ((state->stats->data_received + state->stats->packet_recovered) * MAX_PAYLOAD_SIZE) / time; + double time_in_ms = time_milliseconds(&(state->timestamp_last_packet)) - time_milliseconds(&(state->timestamp_first_packet)); + DEBUG("The difference between the two is %f seconds", (double) time_in_ms * 1000); + DEBUG("The transfer took %f seconds", time_in_ms); + state->stats->throughput = (state->bytes_received * 8 ) / (time_in_ms / 1000); write_stats_to_file(pathname, state->stats, RECEIVER); state_del(state); free(pfd); diff --git a/src/receiver_utils.h b/src/receiver_utils.h index e34e503d4e995c3ef5ab9f80d2e705768d7d786c..3b265271661622be639ea82b39bb2d1d34dfa844 100644 --- a/src/receiver_utils.h +++ b/src/receiver_utils.h @@ -51,8 +51,9 @@ typedef struct uint16_t last_data_packet; uint16_t next_to_consume; transfer_stats_t * stats; - time_t timestamp_first_packet; - time_t timestamp_last_packet; + struct timeval timestamp_first_packet; + struct timeval timestamp_last_packet; + unsigned long long int bytes_received; } receiver_state_t; diff --git a/tests/extract_perfomance_stats.py b/tests/extract_perfomance_stats.py new file mode 100644 index 0000000000000000000000000000000000000000..061073808010e072ad42474579e5b2f4f2c86c1f --- /dev/null +++ b/tests/extract_perfomance_stats.py @@ -0,0 +1,66 @@ +"""" +Written by : Samuel de Meester and Van Ingenzi + +This code does data analysis on the results of our TRTP perfomance bash tests. +""" +from cmath import exp +import sys +import os +import pandas as pd + +""" +Return a dictionary of the different values found in the receiver stats (.csv) file +""" +def read_receiver_stats(filename): + dictionary = {} + with open(filename, 'r') as f: + for line in f.readlines(): + key, value = line.split(":") + dictionary[key] = float(value) + return dictionary + +""" +Return a dictionary of the different values found in the sender stats (.csv) file +""" +def read_sender_stats(filename): + dictionary = {} + with open(filename, 'r') as f: + for line in f.readlines(): + key, value = line.split(":") + dictionary[key] = float(value) + return dictionary + +""" +For each dataset we summarise the +""" +def merge_sender_stats(path_to_dir:str) -> list: + to_return = [] + for _, _, files in os.walk(path_to_dir, topdown=True): + for file_basename in files: + if (file_basename[-4:] == ".csv") and (file_basename[:6] == "sender"): + stats = read_receiver_stats(os.path.join(path_to_dir, file_basename)) + stats["fec"] = 0 if "without" in file_basename else 1 + to_return.append(stats) + return to_return + +def main(path_to_dir:str) -> None: + full_path = os.path.abspath(path_to_dir) + if not os.path.isdir(full_path): + print(f"The given path is not a directory, {full_path}") + return None + for root, _, _ in os.walk(full_path, topdown=True): + if (os.path.exists(os.path.join(root, 'sender_merged_stats.csv'))): + os.remove(os.path.join(root, 'sender_merged_stats.csv')) + if root != full_path: + merged_sender_stats = merge_sender_stats(root) + df = pd.DataFrame.from_dict(merged_sender_stats ) + df.to_csv(os.path.join(root, 'sender_merged_stats.csv'), index=False, header=True) + return None + +if __name__ == "__main__": + if (len(sys.argv) != 2): + print(f""" +This python is to be run as follow : {sys.argv[0]} <path_to_perfomance_results> + """) + path_to_results_dir = sys.argv[1] + main(path_to_results_dir) diff --git a/tests/perfomance_test.sh b/tests/perfomance_test.sh index 9a94fabd01af6cd0d2f6012d7d5812bb5b1eb0c0..50cf19f5417d5e807a8d0879cf1ccabe04495354 100755 --- a/tests/perfomance_test.sh +++ b/tests/perfomance_test.sh @@ -30,8 +30,8 @@ echo -e "The linksimulator paramateres are: \t\t-CUT RATE: ${CUT_RATE}% \t-JITTER: ${JITTER}ms \t\t-LOSS RATE: ${LOSS_RATE}%\n" -ITER=0 OUTPUT=${OUTPUT_DIR}/output.${BSN_EXT} +err=0 for ITER in 1 2 3; do for MODE in "${MODES[@]}"; do @@ -75,7 +75,7 @@ for ITER in 1 2 3; do fi fi - sleep 5 # We wait 5s for the receiver to finish up + sleep 20 # We wait 20s for the receiver to finish up if kill -0 $receiver_pid &> /dev/null ; then echo "The receiver didn't stop at the end of the transfer!" diff --git a/tests/performances_tests.py b/tests/performances_tests.py deleted file mode 100644 index 92b09e9b858ca3e17992a17a2f7399d105196e57..0000000000000000000000000000000000000000 --- a/tests/performances_tests.py +++ /dev/null @@ -1,23 +0,0 @@ - -""" -Return a dictionary of the different values found in the receiver stats (.csv) file -""" -def read_receiver_stats(filename): - dictionary = {} - with open(filename, 'r') as f: - for line in f.readlines(): - key, value = line.split(":") - dictionary[key] = int(value) - return dictionary - -""" -Return a dictionary of the different values found in the sender stats (.csv) file -""" -def read_sender_stats(filename): - dictionary = {} - with open(filename, 'r') as f: - for line in f.readlines(): - key, value = line.split(":") - dictionary[key] = int(value) - return dictionary -