diff options
Diffstat (limited to 'toxcore/DHT.c')
-rw-r--r-- | toxcore/DHT.c | 85 |
1 files changed, 70 insertions, 15 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; |