summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2014-09-12 17:07:27 -0400
committerirungentoo <irungentoo@gmail.com>2014-09-12 17:07:27 -0400
commit269fd6814e7040bcb47488b2b2b2d34b4c3c0a3e (patch)
tree6ff6d65db753b03fcd84e109190b935d731df509
parentd0448d3e7bb3e376fc6459b3f252ee663cdfbe9a (diff)
parent27369ac76278aace29b52eb5523af80f3d9a1880 (diff)
Merge branch 'tox_connect' of https://github.com/saneki/toxcore
-rw-r--r--toxcore/DHT.c85
-rw-r--r--toxcore/DHT.h14
-rw-r--r--toxcore/Messenger.c23
-rw-r--r--toxcore/Messenger.h4
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
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;
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);
332int DHT_bootstrap_from_address(DHT *dht, const char *address, uint8_t ipv6enabled, 340int 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 */
348int 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. */
2409void do_messenger(Messenger *m) 2409void 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
2559struct SAVED_FRIEND { 2569struct 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 *);