summaryrefslogtreecommitdiff
path: root/toxcore
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2015-05-16 21:57:07 -0400
committerirungentoo <irungentoo@gmail.com>2015-05-16 21:57:07 -0400
commite3ee9702fb296b966acb55b802e9e799bce490bd (patch)
tree64479281e43128cb196661632327fc1d29e6d60d /toxcore
parentb5d712502ba05cfc89edb6de04077f763effc445 (diff)
Don't resend the same packet twice within a short timeframe.
Diffstat (limited to 'toxcore')
-rw-r--r--toxcore/net_crypto.c21
-rw-r--r--toxcore/net_crypto.h5
2 files changed, 18 insertions, 8 deletions
diff --git a/toxcore/net_crypto.c b/toxcore/net_crypto.c
index 707b675d..83561d1f 100644
--- a/toxcore/net_crypto.c
+++ b/toxcore/net_crypto.c
@@ -676,6 +676,8 @@ static int handle_request_packet(Packets_Array *send_array, const uint8_t *data,
676 uint32_t i, n = 1; 676 uint32_t i, n = 1;
677 uint32_t requested = 0; 677 uint32_t requested = 0;
678 678
679 uint64_t temp_time = current_time_monotonic();
680
679 for (i = send_array->buffer_start; i != send_array->buffer_end; ++i) { 681 for (i = send_array->buffer_start; i != send_array->buffer_end; ++i) {
680 if (length == 0) 682 if (length == 0)
681 break; 683 break;
@@ -684,7 +686,11 @@ static int handle_request_packet(Packets_Array *send_array, const uint8_t *data,
684 686
685 if (n == data[0]) { 687 if (n == data[0]) {
686 if (send_array->buffer[num]) { 688 if (send_array->buffer[num]) {
687 send_array->buffer[num]->sent = 0; 689 uint64_t sent_time = send_array->buffer[num]->sent_time;
690
691 if ((sent_time + DEFAULT_PING_CONNECTION) < temp_time) {
692 send_array->buffer[num]->sent_time = 0;
693 }
688 } 694 }
689 695
690 ++data; 696 ++data;
@@ -788,12 +794,12 @@ static int reset_max_speed_reached(Net_Crypto *c, int crypt_connection_id)
788 uint8_t send_failed = 0; 794 uint8_t send_failed = 0;
789 795
790 if (ret == 1) { 796 if (ret == 1) {
791 if (!dt->sent) { 797 if (!dt->sent_time) {
792 if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, dt->data, 798 if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, dt->data,
793 dt->length) != 0) { 799 dt->length) != 0) {
794 send_failed = 1; 800 send_failed = 1;
795 } else { 801 } else {
796 dt->sent = 1; 802 dt->sent_time = 1;
797 } 803 }
798 } 804 }
799 } 805 }
@@ -831,7 +837,7 @@ static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, cons
831 } 837 }
832 838
833 Packet_Data dt; 839 Packet_Data dt;
834 dt.sent = 0; 840 dt.sent_time = 0;
835 dt.length = length; 841 dt.length = length;
836 memcpy(dt.data, data, length); 842 memcpy(dt.data, data, length);
837 pthread_mutex_lock(&conn->mutex); 843 pthread_mutex_lock(&conn->mutex);
@@ -849,7 +855,7 @@ static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, cons
849 Packet_Data *dt1 = NULL; 855 Packet_Data *dt1 = NULL;
850 856
851 if (get_data_pointer(&conn->send_array, &dt1, packet_num) == 1) 857 if (get_data_pointer(&conn->send_array, &dt1, packet_num) == 1)
852 dt1->sent = 1; 858 dt1->sent_time = 1;
853 } else { 859 } else {
854 conn->maximum_speed_reached = 1; 860 conn->maximum_speed_reached = 1;
855 LOGGER_ERROR("send_data_packet failed\n"); 861 LOGGER_ERROR("send_data_packet failed\n");
@@ -946,6 +952,7 @@ static int send_requested_packets(Net_Crypto *c, int crypt_connection_id, uint32
946 if (conn == 0) 952 if (conn == 0)
947 return -1; 953 return -1;
948 954
955 uint64_t temp_time = current_time_monotonic();
949 uint32_t i, num_sent = 0, array_size = num_packets_array(&conn->send_array); 956 uint32_t i, num_sent = 0, array_size = num_packets_array(&conn->send_array);
950 957
951 for (i = 0; i < array_size; ++i) { 958 for (i = 0; i < array_size; ++i) {
@@ -959,13 +966,13 @@ static int send_requested_packets(Net_Crypto *c, int crypt_connection_id, uint32
959 continue; 966 continue;
960 } 967 }
961 968
962 if (dt->sent) { 969 if (dt->sent_time) {
963 continue; 970 continue;
964 } 971 }
965 972
966 if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, dt->data, 973 if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, dt->data,
967 dt->length) == 0) { 974 dt->length) == 0) {
968 dt->sent = 1; 975 dt->sent_time = temp_time;
969 ++num_sent; 976 ++num_sent;
970 } 977 }
971 978
diff --git a/toxcore/net_crypto.h b/toxcore/net_crypto.h
index a0498b42..508d2a1c 100644
--- a/toxcore/net_crypto.h
+++ b/toxcore/net_crypto.h
@@ -82,8 +82,11 @@
82 at the dT defined in net_crypto.c */ 82 at the dT defined in net_crypto.c */
83#define CONGESTION_QUEUE_ARRAY_SIZE 24 83#define CONGESTION_QUEUE_ARRAY_SIZE 24
84 84
85/* Connection ping in ms. TODO: calculate it per connection. */
86#define DEFAULT_PING_CONNECTION 100
87
85typedef struct { 88typedef struct {
86 _Bool sent; 89 uint64_t sent_time;
87 uint16_t length; 90 uint16_t length;
88 uint8_t data[MAX_CRYPTO_DATA_SIZE]; 91 uint8_t data[MAX_CRYPTO_DATA_SIZE];
89} Packet_Data; 92} Packet_Data;