summaryrefslogtreecommitdiff
path: root/toxcore
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2015-11-19 17:04:39 -0500
committerirungentoo <irungentoo@gmail.com>2015-11-19 17:04:39 -0500
commit5a800fe467a7e9b22b15db62dbd0a0f269cdb386 (patch)
treed30a7322b9a985dd55240630e80860508eb75cf2 /toxcore
parent548fafc4ddef6c60d79498d59a576bd66e6a0373 (diff)
Send queue size should not affect the speed of packets being resent.
Diffstat (limited to 'toxcore')
-rw-r--r--toxcore/net_crypto.c57
-rw-r--r--toxcore/net_crypto.h4
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;