diff options
Diffstat (limited to 'toxcore')
-rw-r--r-- | toxcore/DHT.c | 85 | ||||
-rw-r--r-- | toxcore/DHT.h | 14 | ||||
-rw-r--r-- | toxcore/Messenger.c | 23 | ||||
-rw-r--r-- | toxcore/Messenger.h | 4 |
4 files changed, 101 insertions, 25 deletions
diff --git a/toxcore/DHT.c b/toxcore/DHT.c index fb326c9b..4830e2b1 100644 --- a/toxcore/DHT.c +++ b/toxcore/DHT.c | |||
@@ -2224,6 +2224,12 @@ DHT *new_DHT(Networking_Core *net) | |||
2224 | 2224 | ||
2225 | void do_DHT(DHT *dht) | 2225 | void do_DHT(DHT *dht) |
2226 | { | 2226 | { |
2227 | // Load friends/clients if first call to do_DHT | ||
2228 | if (dht->has_loaded_friends_clients == 0) { | ||
2229 | dht->has_loaded_friends_clients = 1; | ||
2230 | DHT_connect_after_load(dht); | ||
2231 | } | ||
2232 | |||
2227 | unix_time_update(); | 2233 | unix_time_update(); |
2228 | 2234 | ||
2229 | if (dht->last_run == unix_time()) { | 2235 | if (dht->last_run == unix_time()) { |
@@ -2328,6 +2334,58 @@ void DHT_save(DHT *dht, uint8_t *data) | |||
2328 | } | 2334 | } |
2329 | } | 2335 | } |
2330 | 2336 | ||
2337 | static void DHT_bootstrap_loaded_clients(DHT *dht) | ||
2338 | { | ||
2339 | uint32_t i; | ||
2340 | |||
2341 | Client_data *client_list = dht->loaded_clients_list; | ||
2342 | uint32_t client_count = dht->loaded_num_clients; | ||
2343 | |||
2344 | for (i = 0; i < client_count; ++i) { | ||
2345 | if (client_list[i].assoc4.timestamp != 0) | ||
2346 | DHT_bootstrap(dht, client_list[i].assoc4.ip_port, client_list[i].client_id); | ||
2347 | |||
2348 | if (client_list[i].assoc6.timestamp != 0) | ||
2349 | DHT_bootstrap(dht, client_list[i].assoc6.ip_port, client_list[i].client_id); | ||
2350 | } | ||
2351 | } | ||
2352 | |||
2353 | static void getnodes_of_loaded_friend_clients(DHT *dht) | ||
2354 | { | ||
2355 | uint32_t i, j; | ||
2356 | |||
2357 | DHT_Friend *friend_list = dht->loaded_friends_list; | ||
2358 | uint32_t friend_count = dht->loaded_num_friends; | ||
2359 | |||
2360 | for (i = 0; i < friend_count; ++i) { | ||
2361 | for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) { | ||
2362 | Client_data *client = &friend_list[i].client_list[j]; | ||
2363 | |||
2364 | if (client->assoc4.timestamp != 0) | ||
2365 | getnodes(dht, client->assoc4.ip_port, client->client_id, friend_list[i].client_id, NULL); | ||
2366 | |||
2367 | if (client->assoc6.timestamp != 0) | ||
2368 | getnodes(dht, client->assoc6.ip_port, client->client_id, friend_list[i].client_id, NULL); | ||
2369 | } | ||
2370 | } | ||
2371 | } | ||
2372 | |||
2373 | /* Start sending packets after DHT loaded_friends_list and loaded_clients_list are set */ | ||
2374 | int DHT_connect_after_load(DHT *dht) | ||
2375 | { | ||
2376 | if (dht == NULL || dht->loaded_friends_list == NULL || dht->loaded_clients_list == NULL) | ||
2377 | return -1; | ||
2378 | |||
2379 | getnodes_of_loaded_friend_clients(dht); | ||
2380 | DHT_bootstrap_loaded_clients(dht); | ||
2381 | |||
2382 | // Loaded lists were allocd, free them | ||
2383 | free(dht->loaded_friends_list); | ||
2384 | free(dht->loaded_clients_list); | ||
2385 | |||
2386 | return 0; | ||
2387 | } | ||
2388 | |||
2331 | static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t length, uint16_t type) | 2389 | static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t length, uint16_t type) |
2332 | { | 2390 | { |
2333 | DHT *dht = outer; | 2391 | DHT *dht = outer; |
@@ -2342,18 +2400,14 @@ static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t le | |||
2342 | DHT_Friend *friend_list = (DHT_Friend *)data; | 2400 | DHT_Friend *friend_list = (DHT_Friend *)data; |
2343 | num = length / sizeof(DHT_Friend); | 2401 | num = length / sizeof(DHT_Friend); |
2344 | 2402 | ||
2345 | for (i = 0; i < num; ++i) { | 2403 | // Copy to loaded_friends_list |
2404 | dht->loaded_friends_list = calloc(num, sizeof(DHT_Friend)); | ||
2346 | 2405 | ||
2347 | for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) { | 2406 | for (i = 0; i < num; i++) |
2348 | Client_data *client = &friend_list[i].client_list[j]; | 2407 | memcpy(&(dht->loaded_friends_list[i]), &(friend_list[i]), sizeof(DHT_Friend)); |
2349 | 2408 | ||
2350 | if (client->assoc4.timestamp != 0) | 2409 | dht->loaded_num_friends = num; |
2351 | getnodes(dht, client->assoc4.ip_port, client->client_id, friend_list[i].client_id, NULL); | ||
2352 | 2410 | ||
2353 | if (client->assoc6.timestamp != 0) | ||
2354 | getnodes(dht, client->assoc6.ip_port, client->client_id, friend_list[i].client_id, NULL); | ||
2355 | } | ||
2356 | } | ||
2357 | } /* localize declarations */ | 2411 | } /* localize declarations */ |
2358 | 2412 | ||
2359 | break; | 2413 | break; |
@@ -2366,13 +2420,14 @@ static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t le | |||
2366 | num = length / sizeof(Client_data); | 2420 | num = length / sizeof(Client_data); |
2367 | Client_data *client_list = (Client_data *)data; | 2421 | Client_data *client_list = (Client_data *)data; |
2368 | 2422 | ||
2369 | for (i = 0; i < num; ++i) { | 2423 | // Copy to loaded_clients_list |
2370 | if (client_list[i].assoc4.timestamp != 0) | 2424 | dht->loaded_clients_list = calloc(num, sizeof(Client_data)); |
2371 | DHT_bootstrap(dht, client_list[i].assoc4.ip_port, client_list[i].client_id); | 2425 | |
2426 | for (i = 0; i < num; i++) | ||
2427 | memcpy(&(dht->loaded_clients_list[i]), &(client_list[i]), sizeof(Client_data)); | ||
2428 | |||
2429 | dht->loaded_num_clients = num; | ||
2372 | 2430 | ||
2373 | if (client_list[i].assoc6.timestamp != 0) | ||
2374 | DHT_bootstrap(dht, client_list[i].assoc6.ip_port, client_list[i].client_id); | ||
2375 | } | ||
2376 | } /* localize declarations */ | 2431 | } /* localize declarations */ |
2377 | 2432 | ||
2378 | break; | 2433 | break; |
diff --git a/toxcore/DHT.h b/toxcore/DHT.h index 563ae08c..4beda37e 100644 --- a/toxcore/DHT.h +++ b/toxcore/DHT.h | |||
@@ -200,6 +200,14 @@ typedef struct { | |||
200 | DHT_Friend *friends_list; | 200 | DHT_Friend *friends_list; |
201 | uint16_t num_friends; | 201 | uint16_t num_friends; |
202 | 202 | ||
203 | // Used after loading of file (tox_load), but no longer needed after connect (tox_connect) | ||
204 | // Unsure if friends_list and num_friends could just be used instead? | ||
205 | int has_loaded_friends_clients; // Whether or not we have loaded on the first do_DHT | ||
206 | DHT_Friend *loaded_friends_list; | ||
207 | uint32_t loaded_num_friends; | ||
208 | Client_data *loaded_clients_list; | ||
209 | uint32_t loaded_num_clients; | ||
210 | |||
203 | Shared_Keys shared_keys_recv; | 211 | Shared_Keys shared_keys_recv; |
204 | Shared_Keys shared_keys_sent; | 212 | Shared_Keys shared_keys_sent; |
205 | 213 | ||
@@ -332,6 +340,12 @@ void DHT_bootstrap(DHT *dht, IP_Port ip_port, const uint8_t *public_key); | |||
332 | int DHT_bootstrap_from_address(DHT *dht, const char *address, uint8_t ipv6enabled, | 340 | int DHT_bootstrap_from_address(DHT *dht, const char *address, uint8_t ipv6enabled, |
333 | uint16_t port, const uint8_t *public_key); | 341 | uint16_t port, const uint8_t *public_key); |
334 | 342 | ||
343 | /* Start sending packets after DHT loaded_friends_list and loaded_clients_list are set. | ||
344 | * | ||
345 | * returns 0 if successful | ||
346 | * returns -1 otherwise | ||
347 | */ | ||
348 | int DHT_connect_after_load(DHT *dht); | ||
335 | 349 | ||
336 | /* ROUTING FUNCTIONS */ | 350 | /* ROUTING FUNCTIONS */ |
337 | 351 | ||
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c index 930ad67c..2a0e3f6b 100644 --- a/toxcore/Messenger.c +++ b/toxcore/Messenger.c | |||
@@ -2408,6 +2408,17 @@ uint32_t messenger_run_interval(Messenger *m) | |||
2408 | /* The main loop that needs to be run at least 20 times per second. */ | 2408 | /* The main loop that needs to be run at least 20 times per second. */ |
2409 | void do_messenger(Messenger *m) | 2409 | void do_messenger(Messenger *m) |
2410 | { | 2410 | { |
2411 | // Add the TCP relays, but only if this is the first time calling do_messenger | ||
2412 | if (m->has_added_relays == 0) { | ||
2413 | m->has_added_relays = 1; | ||
2414 | |||
2415 | int i; | ||
2416 | |||
2417 | for (i = 0; i < NUM_SAVED_TCP_RELAYS; ++i) { | ||
2418 | add_tcp_relay(m->net_crypto, m->loaded_relays[i].ip_port, m->loaded_relays[i].client_id); | ||
2419 | } | ||
2420 | } | ||
2421 | |||
2411 | unix_time_update(); | 2422 | unix_time_update(); |
2412 | 2423 | ||
2413 | if (!m->options.udp_disabled) { | 2424 | if (!m->options.udp_disabled) { |
@@ -2554,7 +2565,6 @@ void do_messenger(Messenger *m) | |||
2554 | #define MESSENGER_STATE_TYPE_PATH_NODE 11 | 2565 | #define MESSENGER_STATE_TYPE_PATH_NODE 11 |
2555 | 2566 | ||
2556 | #define SAVED_FRIEND_REQUEST_SIZE 1024 | 2567 | #define SAVED_FRIEND_REQUEST_SIZE 1024 |
2557 | #define NUM_SAVED_TCP_RELAYS 8 | ||
2558 | #define NUM_SAVED_PATH_NODES 8 | 2568 | #define NUM_SAVED_PATH_NODES 8 |
2559 | struct SAVED_FRIEND { | 2569 | struct SAVED_FRIEND { |
2560 | uint8_t status; | 2570 | uint8_t status; |
@@ -2803,18 +2813,11 @@ static int messenger_load_state_callback(void *outer, const uint8_t *data, uint3 | |||
2803 | break; | 2813 | break; |
2804 | 2814 | ||
2805 | case MESSENGER_STATE_TYPE_TCP_RELAY: { | 2815 | case MESSENGER_STATE_TYPE_TCP_RELAY: { |
2806 | Node_format relays[NUM_SAVED_TCP_RELAYS]; | 2816 | if (length != sizeof(m->loaded_relays)) { |
2807 | |||
2808 | if (length != sizeof(relays)) { | ||
2809 | return -1; | 2817 | return -1; |
2810 | } | 2818 | } |
2811 | 2819 | ||
2812 | memcpy(relays, data, length); | 2820 | memcpy(m->loaded_relays, data, length); |
2813 | uint32_t i; | ||
2814 | |||
2815 | for (i = 0; i < NUM_SAVED_TCP_RELAYS; ++i) { | ||
2816 | add_tcp_relay(m->net_crypto, relays[i].ip_port, relays[i].client_id); | ||
2817 | } | ||
2818 | 2821 | ||
2819 | break; | 2822 | break; |
2820 | } | 2823 | } |
diff --git a/toxcore/Messenger.h b/toxcore/Messenger.h index cead6411..6c641a9a 100644 --- a/toxcore/Messenger.h +++ b/toxcore/Messenger.h | |||
@@ -219,6 +219,10 @@ typedef struct Messenger { | |||
219 | 219 | ||
220 | uint64_t last_LANdiscovery; | 220 | uint64_t last_LANdiscovery; |
221 | 221 | ||
222 | #define NUM_SAVED_TCP_RELAYS 8 | ||
223 | uint8_t has_added_relays; // If the first connection has occurred in do_messenger | ||
224 | Node_format loaded_relays[NUM_SAVED_TCP_RELAYS]; // Relays loaded from config | ||
225 | |||
222 | void (*friend_message)(struct Messenger *m, int32_t, const uint8_t *, uint16_t, void *); | 226 | void (*friend_message)(struct Messenger *m, int32_t, const uint8_t *, uint16_t, void *); |
223 | void *friend_message_userdata; | 227 | void *friend_message_userdata; |
224 | void (*friend_action)(struct Messenger *m, int32_t, const uint8_t *, uint16_t, void *); | 228 | void (*friend_action)(struct Messenger *m, int32_t, const uint8_t *, uint16_t, void *); |