diff options
author | irungentoo <irungentoo@gmail.com> | 2015-11-19 17:04:39 -0500 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2015-11-19 17:04:39 -0500 |
commit | 5a800fe467a7e9b22b15db62dbd0a0f269cdb386 (patch) | |
tree | d30a7322b9a985dd55240630e80860508eb75cf2 /toxcore | |
parent | 548fafc4ddef6c60d79498d59a576bd66e6a0373 (diff) |
Send queue size should not affect the speed of packets being resent.
Diffstat (limited to 'toxcore')
-rw-r--r-- | toxcore/net_crypto.c | 57 | ||||
-rw-r--r-- | toxcore/net_crypto.h | 4 |
2 files changed, 46 insertions, 15 deletions
diff --git a/toxcore/net_crypto.c b/toxcore/net_crypto.c index 83b8b8cf..d90ab615 100644 --- a/toxcore/net_crypto.c +++ b/toxcore/net_crypto.c | |||
@@ -2235,41 +2235,67 @@ static void send_crypto_packets(Net_Crypto *c) | |||
2235 | //TODO: Improve formula? | 2235 | //TODO: Improve formula? |
2236 | if (send_array_ratio > SEND_QUEUE_RATIO && CRYPTO_MIN_QUEUE_LENGTH < npackets) { | 2236 | if (send_array_ratio > SEND_QUEUE_RATIO && CRYPTO_MIN_QUEUE_LENGTH < npackets) { |
2237 | conn->packet_send_rate = min_speed * (1.0 / (send_array_ratio / SEND_QUEUE_RATIO)); | 2237 | conn->packet_send_rate = min_speed * (1.0 / (send_array_ratio / SEND_QUEUE_RATIO)); |
2238 | conn->packet_send_rate_requested = min_speed; | ||
2238 | } else if (conn->last_congestion_event + CONGESTION_EVENT_TIMEOUT < temp_time) { | 2239 | } else if (conn->last_congestion_event + CONGESTION_EVENT_TIMEOUT < temp_time) { |
2239 | conn->packet_send_rate = min_speed * 1.2; | 2240 | conn->packet_send_rate_requested = conn->packet_send_rate = min_speed * 1.2; |
2240 | } else { | 2241 | } else { |
2241 | conn->packet_send_rate = min_speed * 0.9; | 2242 | conn->packet_send_rate = min_speed * 0.9; |
2243 | conn->packet_send_rate_requested = min_speed; | ||
2242 | } | 2244 | } |
2243 | 2245 | ||
2244 | if (conn->packet_send_rate < CRYPTO_PACKET_MIN_RATE) { | 2246 | if (conn->packet_send_rate < CRYPTO_PACKET_MIN_RATE) { |
2245 | conn->packet_send_rate = CRYPTO_PACKET_MIN_RATE; | 2247 | conn->packet_send_rate = CRYPTO_PACKET_MIN_RATE; |
2246 | } | 2248 | } |
2249 | |||
2250 | if (conn->packet_send_rate_requested < conn->packet_send_rate) { | ||
2251 | conn->packet_send_rate_requested = conn->packet_send_rate; | ||
2252 | } | ||
2247 | } | 2253 | } |
2248 | 2254 | ||
2249 | } | 2255 | } |
2250 | 2256 | ||
2251 | if (conn->last_packets_left_set == 0) { | 2257 | if (conn->last_packets_left_set == 0 || conn->last_packets_left_requested_set == 0) { |
2252 | conn->last_packets_left_set = temp_time; | 2258 | conn->last_packets_left_requested_set = conn->last_packets_left_set = temp_time; |
2253 | conn->packets_left = CRYPTO_MIN_QUEUE_LENGTH; | 2259 | conn->packets_left_requested = conn->packets_left = CRYPTO_MIN_QUEUE_LENGTH; |
2254 | } else if (((uint64_t)((1000.0 / conn->packet_send_rate) + 0.5) + conn->last_packets_left_set) <= temp_time) { | 2260 | } else { |
2255 | double n_packets = conn->packet_send_rate * (((double)(temp_time - conn->last_packets_left_set)) / 1000.0); | 2261 | if (((uint64_t)((1000.0 / conn->packet_send_rate) + 0.5) + conn->last_packets_left_set) <= temp_time) { |
2262 | double n_packets = conn->packet_send_rate * (((double)(temp_time - conn->last_packets_left_set)) / 1000.0); | ||
2256 | 2263 | ||
2257 | uint32_t num_packets = n_packets; | 2264 | uint32_t num_packets = n_packets; |
2258 | double rem = n_packets - (double)num_packets; | 2265 | double rem = n_packets - (double)num_packets; |
2259 | uint64_t adj = (uint64_t)((rem * (1000.0 / conn->packet_send_rate)) + 0.5); | 2266 | uint64_t adj = (uint64_t)((rem * (1000.0 / conn->packet_send_rate)) + 0.5); |
2260 | 2267 | ||
2261 | if (conn->packets_left > num_packets * 4 + CRYPTO_MIN_QUEUE_LENGTH) { | 2268 | if (conn->packets_left > num_packets * 4 + CRYPTO_MIN_QUEUE_LENGTH) { |
2262 | conn->packets_left = num_packets * 4 + CRYPTO_MIN_QUEUE_LENGTH; | 2269 | conn->packets_left = num_packets * 4 + CRYPTO_MIN_QUEUE_LENGTH; |
2263 | } else { | 2270 | } else { |
2264 | conn->packets_left += num_packets; | 2271 | conn->packets_left += num_packets; |
2272 | } | ||
2273 | |||
2274 | conn->last_packets_left_set = temp_time - adj; | ||
2275 | } | ||
2276 | |||
2277 | if (((uint64_t)((1000.0 / conn->packet_send_rate_requested) + 0.5) + conn->last_packets_left_requested_set) <= | ||
2278 | temp_time) { | ||
2279 | double n_packets = conn->packet_send_rate_requested * (((double)(temp_time - conn->last_packets_left_requested_set)) / | ||
2280 | 1000.0); | ||
2281 | |||
2282 | uint32_t num_packets = n_packets; | ||
2283 | double rem = n_packets - (double)num_packets; | ||
2284 | uint64_t adj = (uint64_t)((rem * (1000.0 / conn->packet_send_rate_requested)) + 0.5); | ||
2285 | conn->packets_left_requested = num_packets; | ||
2286 | |||
2287 | conn->last_packets_left_requested_set = temp_time - adj; | ||
2265 | } | 2288 | } |
2266 | 2289 | ||
2267 | conn->last_packets_left_set = temp_time - adj; | 2290 | if (conn->packets_left > conn->packets_left_requested) |
2291 | conn->packets_left_requested = conn->packets_left; | ||
2268 | } | 2292 | } |
2269 | 2293 | ||
2270 | int ret = send_requested_packets(c, i, conn->packets_left); | 2294 | int ret = send_requested_packets(c, i, conn->packets_left_requested); |
2271 | 2295 | ||
2272 | if (ret != -1) { | 2296 | if (ret != -1) { |
2297 | conn->packets_left_requested -= ret; | ||
2298 | |||
2273 | if ((unsigned int)ret < conn->packets_left) { | 2299 | if ((unsigned int)ret < conn->packets_left) { |
2274 | conn->packets_left -= ret; | 2300 | conn->packets_left -= ret; |
2275 | } else { | 2301 | } else { |
@@ -2370,6 +2396,7 @@ int64_t write_cryptpacket(Net_Crypto *c, int crypt_connection_id, const uint8_t | |||
2370 | 2396 | ||
2371 | if (congestion_control) { | 2397 | if (congestion_control) { |
2372 | --conn->packets_left; | 2398 | --conn->packets_left; |
2399 | --conn->packets_left_requested; | ||
2373 | conn->packets_sent++; | 2400 | conn->packets_sent++; |
2374 | } | 2401 | } |
2375 | 2402 | ||
diff --git a/toxcore/net_crypto.h b/toxcore/net_crypto.h index 1e118b70..cecf6df1 100644 --- a/toxcore/net_crypto.h +++ b/toxcore/net_crypto.h | |||
@@ -151,6 +151,10 @@ typedef struct { | |||
151 | uint32_t packets_left; | 151 | uint32_t packets_left; |
152 | uint64_t last_packets_left_set; | 152 | uint64_t last_packets_left_set; |
153 | 153 | ||
154 | double packet_send_rate_requested; | ||
155 | uint32_t packets_left_requested; | ||
156 | uint64_t last_packets_left_requested_set; | ||
157 | |||
154 | uint32_t last_sendqueue_size[CONGESTION_QUEUE_ARRAY_SIZE], last_sendqueue_counter; | 158 | uint32_t last_sendqueue_size[CONGESTION_QUEUE_ARRAY_SIZE], last_sendqueue_counter; |
155 | long signed int last_num_packets_sent[CONGESTION_LAST_SENT_ARRAY_SIZE]; | 159 | long signed int last_num_packets_sent[CONGESTION_LAST_SENT_ARRAY_SIZE]; |
156 | uint32_t packets_sent; | 160 | uint32_t packets_sent; |