summaryrefslogtreecommitdiff
path: root/toxcore/DHT.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/DHT.c')
-rw-r--r--toxcore/DHT.c85
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
2225void do_DHT(DHT *dht) 2225void 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
2337static 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
2353static 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 */
2374int 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
2331static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t length, uint16_t type) 2389static 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;