summaryrefslogtreecommitdiff
path: root/toxcore
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2015-06-06 22:13:43 -0400
committerirungentoo <irungentoo@gmail.com>2015-06-06 22:13:43 -0400
commitf4d0b852847b850deba45958e05a4b9212c91709 (patch)
tree896ac2c5ab46089fd795723fea0d45aeb7f94e42 /toxcore
parentbf90c63c27c718aab840407320a0a89d233693e8 (diff)
Save DHT nodes in a smarter way.
Diffstat (limited to 'toxcore')
-rw-r--r--toxcore/DHT.c149
-rw-r--r--toxcore/DHT.h6
2 files changed, 45 insertions, 110 deletions
diff --git a/toxcore/DHT.c b/toxcore/DHT.c
index 8cd8852c..dd7c0acd 100644
--- a/toxcore/DHT.c
+++ b/toxcore/DHT.c
@@ -2282,8 +2282,7 @@ void kill_DHT(DHT *dht)
2282 ping_array_free_all(&dht->dht_harden_ping_array); 2282 ping_array_free_all(&dht->dht_harden_ping_array);
2283 kill_ping(dht->ping); 2283 kill_ping(dht->ping);
2284 free(dht->friends_list); 2284 free(dht->friends_list);
2285 free(dht->loaded_friends_list); 2285 free(dht->loaded_nodes_list);
2286 free(dht->loaded_clients_list);
2287 free(dht); 2286 free(dht);
2288} 2287}
2289 2288
@@ -2292,23 +2291,20 @@ void kill_DHT(DHT *dht)
2292#define DHT_STATE_COOKIE_GLOBAL 0x159000d 2291#define DHT_STATE_COOKIE_GLOBAL 0x159000d
2293 2292
2294#define DHT_STATE_COOKIE_TYPE 0x11ce 2293#define DHT_STATE_COOKIE_TYPE 0x11ce
2295#define DHT_STATE_TYPE_FRIENDS_ASSOC46 3 2294#define DHT_STATE_TYPE_NODES 4
2296#define DHT_STATE_TYPE_CLIENTS_ASSOC46 4
2297 2295
2298/* Get the size of the DHT (for saving). */ 2296/* Get the size of the DHT (for saving). */
2299uint32_t DHT_size(const DHT *dht) 2297uint32_t DHT_size(const DHT *dht)
2300{ 2298{
2301 uint32_t num = 0, i; 2299 uint32_t num = 0, i;
2302 2300
2303 for (i = 0; i < LCLIENT_LIST; ++i) 2301 for (i = 0; i < LCLIENT_LIST; ++i) {
2304 if ((dht->close_clientlist[i].assoc4.timestamp != 0) || 2302 num += (dht->close_clientlist[i].assoc4.timestamp != 0) + (dht->close_clientlist[i].assoc6.timestamp != 0);
2305 (dht->close_clientlist[i].assoc6.timestamp != 0)) 2303 }
2306 num++;
2307 2304
2308 uint32_t size32 = sizeof(uint32_t), sizesubhead = size32 * 2; 2305 uint32_t size32 = sizeof(uint32_t), sizesubhead = size32 * 2;
2309 return size32 2306 return size32
2310 + sizesubhead + sizeof(DHT_Friend) * dht->num_friends 2307 + sizesubhead + sizeof(Node_format) * num;
2311 + sizesubhead + sizeof(Client_data) * num;
2312} 2308}
2313 2309
2314static uint8_t *z_state_save_subheader(uint8_t *data, uint32_t len, uint16_t type) 2310static uint8_t *z_state_save_subheader(uint8_t *data, uint32_t len, uint16_t type)
@@ -2328,71 +2324,32 @@ void DHT_save(DHT *dht, uint8_t *data)
2328 *(uint32_t *)data = DHT_STATE_COOKIE_GLOBAL; 2324 *(uint32_t *)data = DHT_STATE_COOKIE_GLOBAL;
2329 data += sizeof(uint32_t); 2325 data += sizeof(uint32_t);
2330 2326
2331 len = sizeof(DHT_Friend) * dht->num_friends;
2332 type = DHT_STATE_TYPE_FRIENDS_ASSOC46;
2333 data = z_state_save_subheader(data, len, type);
2334 memcpy(data, dht->friends_list, len);
2335 data += len;
2336
2337 uint32_t num = 0, i; 2327 uint32_t num = 0, i;
2338 2328
2339 for (i = 0; i < LCLIENT_LIST; ++i) 2329 //TODO: don't only save close nodes.
2340 if ((dht->close_clientlist[i].assoc4.timestamp != 0) || 2330 for (i = 0; i < LCLIENT_LIST; ++i) {
2341 (dht->close_clientlist[i].assoc6.timestamp != 0)) 2331 num += (dht->close_clientlist[i].assoc4.timestamp != 0) + (dht->close_clientlist[i].assoc6.timestamp != 0);
2342 num++; 2332 }
2343 2333
2344 len = num * sizeof(Client_data); 2334 len = num * sizeof(Node_format);
2345 type = DHT_STATE_TYPE_CLIENTS_ASSOC46; 2335 type = DHT_STATE_TYPE_NODES;
2346 data = z_state_save_subheader(data, len, type); 2336 data = z_state_save_subheader(data, len, type);
2347 2337
2348 if (num) { 2338 if (num) {
2349 Client_data *clients = (Client_data *)data; 2339 Node_format *clients = (Node_format *)data;
2350
2351 for (num = 0, i = 0; i < LCLIENT_LIST; ++i)
2352 if ((dht->close_clientlist[i].assoc4.timestamp != 0) ||
2353 (dht->close_clientlist[i].assoc6.timestamp != 0))
2354 memcpy(&clients[num++], &dht->close_clientlist[i], sizeof(Client_data));
2355 }
2356}
2357
2358static void DHT_bootstrap_loaded_clients(DHT *dht)
2359{
2360 if (!dht->loaded_clients_list)
2361 return;
2362
2363 uint32_t i;
2364
2365 Client_data *client_list = dht->loaded_clients_list;
2366 uint32_t client_count = dht->loaded_num_clients;
2367
2368 for (i = 0; i < client_count; ++i) {
2369 if (client_list[i].assoc4.timestamp != 0)
2370 DHT_bootstrap(dht, client_list[i].assoc4.ip_port, client_list[i].client_id);
2371
2372 if (client_list[i].assoc6.timestamp != 0)
2373 DHT_bootstrap(dht, client_list[i].assoc6.ip_port, client_list[i].client_id);
2374 }
2375}
2376
2377static void getnodes_of_loaded_friend_clients(DHT *dht)
2378{
2379 if (!dht->loaded_friends_list)
2380 return;
2381
2382 uint32_t i, j;
2383
2384 DHT_Friend *friend_list = dht->loaded_friends_list;
2385 uint32_t friend_count = dht->loaded_num_friends;
2386 2340
2387 for (i = 0; i < friend_count; ++i) { 2341 for (num = 0, i = 0; i < LCLIENT_LIST; ++i) {
2388 for (j = 0; j < MAX_FRIEND_CLIENTS; ++j) { 2342 if (dht->close_clientlist[i].assoc4.timestamp != 0) {
2389 Client_data *client = &friend_list[i].client_list[j]; 2343 memcpy(&clients[num].public_key, &dht->close_clientlist[i].client_id, crypto_box_PUBLICKEYBYTES);
2390 2344 clients[num].ip_port = dht->close_clientlist[i].assoc4.ip_port;
2391 if (client->assoc4.timestamp != 0) 2345 ++num;
2392 getnodes(dht, client->assoc4.ip_port, client->client_id, friend_list[i].client_id, NULL); 2346 }
2393 2347
2394 if (client->assoc6.timestamp != 0) 2348 if (dht->close_clientlist[i].assoc6.timestamp != 0) {
2395 getnodes(dht, client->assoc6.ip_port, client->client_id, friend_list[i].client_id, NULL); 2349 memcpy(&clients[num].public_key, &dht->close_clientlist[i].client_id, crypto_box_PUBLICKEYBYTES);
2350 clients[num].ip_port = dht->close_clientlist[i].assoc6.ip_port;
2351 ++num;
2352 }
2396 } 2353 }
2397 } 2354 }
2398} 2355}
@@ -2403,17 +2360,19 @@ int DHT_connect_after_load(DHT *dht)
2403 if (dht == NULL) 2360 if (dht == NULL)
2404 return -1; 2361 return -1;
2405 2362
2406 getnodes_of_loaded_friend_clients(dht); 2363 if (!dht->loaded_nodes_list)
2407 DHT_bootstrap_loaded_clients(dht); 2364 return -1;
2365
2366 unsigned int i;
2408 2367
2409 // Loaded lists were allocd, free them 2368 for (i = 0; i < dht->loaded_num_nodes; ++i) {
2410 free(dht->loaded_friends_list); 2369 DHT_bootstrap(dht, dht->loaded_nodes_list[i].ip_port, dht->loaded_nodes_list[i].public_key);
2411 dht->loaded_friends_list = NULL; 2370 }
2412 dht->loaded_num_friends = 0;
2413 2371
2414 free(dht->loaded_clients_list); 2372 // Loaded lists were allocd, free them
2415 dht->loaded_clients_list = NULL; 2373 free(dht->loaded_nodes_list);
2416 dht->loaded_num_clients = 0; 2374 dht->loaded_nodes_list = NULL;
2375 dht->loaded_num_nodes = 0;
2417 2376
2418 return 0; 2377 return 0;
2419} 2378}
@@ -2424,44 +2383,22 @@ static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t le
2424 uint32_t num, i; 2383 uint32_t num, i;
2425 2384
2426 switch (type) { 2385 switch (type) {
2427 case DHT_STATE_TYPE_FRIENDS_ASSOC46: 2386 case DHT_STATE_TYPE_NODES:
2428 if (length % sizeof(DHT_Friend) != 0) 2387 if ((length % sizeof(Node_format)) != 0)
2429 break;
2430
2431 { /* localize declarations */
2432 DHT_Friend *friend_list = (DHT_Friend *)data;
2433 num = length / sizeof(DHT_Friend);
2434
2435 free(dht->loaded_friends_list);
2436 // Copy to loaded_friends_list
2437 dht->loaded_friends_list = calloc(num, sizeof(DHT_Friend));
2438
2439 for (i = 0; i < num; i++)
2440 memcpy(&(dht->loaded_friends_list[i]), &(friend_list[i]), sizeof(DHT_Friend));
2441
2442 dht->loaded_num_friends = num;
2443
2444 dht->has_loaded_friends_clients = 1;
2445 } /* localize declarations */
2446
2447 break;
2448
2449 case DHT_STATE_TYPE_CLIENTS_ASSOC46:
2450 if ((length % sizeof(Client_data)) != 0)
2451 break; 2388 break;
2452 2389
2453 { /* localize declarations */ 2390 { /* localize declarations */
2454 num = length / sizeof(Client_data); 2391 num = length / sizeof(Node_format);
2455 Client_data *client_list = (Client_data *)data; 2392 Node_format *client_list = (Node_format *)data;
2456 2393
2457 free(dht->loaded_clients_list); 2394 free(dht->loaded_nodes_list);
2458 // Copy to loaded_clients_list 2395 // Copy to loaded_clients_list
2459 dht->loaded_clients_list = calloc(num, sizeof(Client_data)); 2396 dht->loaded_nodes_list = calloc(num, sizeof(Node_format));
2460 2397
2461 for (i = 0; i < num; i++) 2398 for (i = 0; i < num; i++)
2462 memcpy(&(dht->loaded_clients_list[i]), &(client_list[i]), sizeof(Client_data)); 2399 memcpy(&(dht->loaded_nodes_list[i]), &(client_list[i]), sizeof(Node_format));
2463 2400
2464 dht->loaded_num_clients = num; 2401 dht->loaded_num_nodes = num;
2465 2402
2466 dht->has_loaded_friends_clients = 1; 2403 dht->has_loaded_friends_clients = 1;
2467 } /* localize declarations */ 2404 } /* localize declarations */
diff --git a/toxcore/DHT.h b/toxcore/DHT.h
index 318a6002..981728a1 100644
--- a/toxcore/DHT.h
+++ b/toxcore/DHT.h
@@ -214,10 +214,8 @@ typedef struct {
214 // Used after loading of file (tox_load), but no longer needed after connect (tox_connect) 214 // Used after loading of file (tox_load), but no longer needed after connect (tox_connect)
215 // Unsure if friends_list and num_friends could just be used instead? 215 // Unsure if friends_list and num_friends could just be used instead?
216 int has_loaded_friends_clients; // Whether or not we have loaded on the first do_DHT 216 int has_loaded_friends_clients; // Whether or not we have loaded on the first do_DHT
217 DHT_Friend *loaded_friends_list; 217 Node_format *loaded_nodes_list;
218 uint32_t loaded_num_friends; 218 uint32_t loaded_num_nodes;
219 Client_data *loaded_clients_list;
220 uint32_t loaded_num_clients;
221 219
222 Shared_Keys shared_keys_recv; 220 Shared_Keys shared_keys_recv;
223 Shared_Keys shared_keys_sent; 221 Shared_Keys shared_keys_sent;