diff options
author | notsecure <notsecure@marek.ca> | 2014-05-21 20:42:26 -0400 |
---|---|---|
committer | notsecure <notsecure@marek.ca> | 2014-05-21 20:49:37 -0400 |
commit | 1e4eb83880899f0e1d7c3bcc19f224c705194f25 (patch) | |
tree | 37e6ce55a3e066bc8242dff71b782dc6183c35ca /toxcore/net_crypto.c | |
parent | be4559de73c17bcfa396098d6cc48b7a4b1157c6 (diff) |
improved conjestion control
Diffstat (limited to 'toxcore/net_crypto.c')
-rw-r--r-- | toxcore/net_crypto.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/toxcore/net_crypto.c b/toxcore/net_crypto.c index 2269e041..196dde4b 100644 --- a/toxcore/net_crypto.c +++ b/toxcore/net_crypto.c | |||
@@ -30,6 +30,8 @@ | |||
30 | 30 | ||
31 | #include "net_crypto.h" | 31 | #include "net_crypto.h" |
32 | #include "util.h" | 32 | #include "util.h" |
33 | #include "math.h" | ||
34 | |||
33 | static uint8_t crypt_connection_id_not_valid(Net_Crypto *c, int crypt_connection_id) | 35 | static uint8_t crypt_connection_id_not_valid(Net_Crypto *c, int crypt_connection_id) |
34 | { | 36 | { |
35 | return (uint32_t)crypt_connection_id >= c->crypto_connections_length; | 37 | return (uint32_t)crypt_connection_id >= c->crypto_connections_length; |
@@ -2180,15 +2182,31 @@ static void send_crypto_packets(Net_Crypto *c) | |||
2180 | } | 2182 | } |
2181 | 2183 | ||
2182 | if ((PACKET_COUNTER_AVERAGE_INTERVAL + conn->packet_counter_set) < temp_time) { | 2184 | if ((PACKET_COUNTER_AVERAGE_INTERVAL + conn->packet_counter_set) < temp_time) { |
2183 | conn->packet_recv_rate = (double)conn->packet_counter / ((double)(temp_time - conn->packet_counter_set) / 1000.0); | 2185 | |
2186 | double dt = temp_time - conn->packet_counter_set; | ||
2187 | |||
2188 | conn->packet_recv_rate = (double)conn->packet_counter / (dt / 1000.0); | ||
2184 | conn->packet_counter = 0; | 2189 | conn->packet_counter = 0; |
2185 | conn->packet_counter_set = temp_time; | 2190 | conn->packet_counter_set = temp_time; |
2186 | 2191 | ||
2187 | if ((double)num_packets_array(&conn->send_array) < 0.3 * (conn->packet_send_rate)) { | 2192 | //most important constant, higher makes it less agressive (minimize packet loss) |
2188 | conn->packet_send_rate *= 1.2; | 2193 | //keep it >=0 |
2189 | } else if ((double)num_packets_array(&conn->send_array) > 0.4 * (conn->packet_send_rate)) { | 2194 | #define RATE_ADD_POWER 100.0 |
2190 | conn->packet_send_rate *= 0.8; | 2195 | |
2191 | } | 2196 | double dropped = (conn->dropped + (double)conn->packets_resent / dt) / 2.0; |
2197 | double realrate = (conn->packet_send_rate - dropped * 1000.0); | ||
2198 | |||
2199 | //newrate is reduced rate based on dropped packets | ||
2200 | double newrate = (realrate + conn->packet_send_rate) / 2.0; | ||
2201 | |||
2202 | //rate_add is rate increase (needs to be improved) | ||
2203 | double ratio = realrate / conn->packet_send_rate; | ||
2204 | double rate_add = (newrate / 40.0 + sqrt(newrate)) * pow(ratio, RATE_ADD_POWER);; | ||
2205 | |||
2206 | conn->packet_send_rate = newrate + rate_add; | ||
2207 | |||
2208 | conn->dropped = dropped; | ||
2209 | conn->packets_resent = 0; | ||
2192 | 2210 | ||
2193 | if (conn->packet_send_rate < CRYPTO_PACKET_MIN_RATE || !conn->sending) | 2211 | if (conn->packet_send_rate < CRYPTO_PACKET_MIN_RATE || !conn->sending) |
2194 | conn->packet_send_rate = CRYPTO_PACKET_MIN_RATE; | 2212 | conn->packet_send_rate = CRYPTO_PACKET_MIN_RATE; |
@@ -2202,7 +2220,7 @@ static void send_crypto_packets(Net_Crypto *c) | |||
2202 | conn->last_packets_left_set = temp_time; | 2220 | conn->last_packets_left_set = temp_time; |
2203 | conn->packets_left = conn->packet_send_rate; | 2221 | conn->packets_left = conn->packet_send_rate; |
2204 | } else if (((1000.0 / conn->packet_send_rate) + conn->last_packets_left_set) < temp_time) { | 2222 | } else if (((1000.0 / conn->packet_send_rate) + conn->last_packets_left_set) < temp_time) { |
2205 | uint32_t num_packets = conn->packet_send_rate * ((double)(temp_time - conn->last_packets_left_set) / 1000.0); | 2223 | uint32_t num_packets = conn->packet_send_rate * ((double)(temp_time - conn->last_packets_left_set) / 1000.0) + 0.5; |
2206 | 2224 | ||
2207 | if (conn->packets_left > num_packets * 2 + CRYPTO_MIN_QUEUE_LENGTH) { | 2225 | if (conn->packets_left > num_packets * 2 + CRYPTO_MIN_QUEUE_LENGTH) { |
2208 | conn->packets_left = num_packets * 2 + CRYPTO_MIN_QUEUE_LENGTH; | 2226 | conn->packets_left = num_packets * 2 + CRYPTO_MIN_QUEUE_LENGTH; |
@@ -2215,11 +2233,13 @@ static void send_crypto_packets(Net_Crypto *c) | |||
2215 | 2233 | ||
2216 | int ret = send_requested_packets(c, i, conn->packets_left); | 2234 | int ret = send_requested_packets(c, i, conn->packets_left); |
2217 | 2235 | ||
2236 | conn->packets_resent += ret; | ||
2237 | |||
2218 | if (ret != -1) { | 2238 | if (ret != -1) { |
2219 | conn->packets_left -= ret; | 2239 | conn->packets_left -= ret; |
2220 | } | 2240 | } |
2221 | 2241 | ||
2222 | if (conn->sending != 0 && num_packets_array(&conn->send_array) < CRYPTO_MIN_QUEUE_LENGTH) { | 2242 | if (conn->sending != 0 && num_packets_array(&conn->send_array) < CRYPTO_MIN_QUEUE_LENGTH / 2) { |
2223 | --conn->sending; | 2243 | --conn->sending; |
2224 | } | 2244 | } |
2225 | } | 2245 | } |