summaryrefslogtreecommitdiff
path: root/toxcore
diff options
context:
space:
mode:
authorCoren[m] <Break@Ocean>2013-11-17 19:44:17 +0100
committerCoren[m] <Break@Ocean>2013-11-17 19:44:51 +0100
commit81b472df0d39781d9e40d6369abb477dcb1f301f (patch)
tree0f45180102c23d52d5dc02a10ad7ea74899fc690 /toxcore
parentda21a8f84483602dcaed09be615ce97c878d847b (diff)
Tolerate instable connectivity: if *all* set close nodes are in terminal timeout (KILL_NODE_TIMEOUT), reset them all to BAD_NODE_TIMEOUT.
That keeps the client trying to at least ping the nodes in the hopes of the connection coming back up.
Diffstat (limited to 'toxcore')
-rw-r--r--toxcore/DHT.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/toxcore/DHT.c b/toxcore/DHT.c
index 5e356b0a..4076826a 100644
--- a/toxcore/DHT.c
+++ b/toxcore/DHT.c
@@ -1025,10 +1025,12 @@ int DHT_getfriendip(DHT *dht, uint8_t *client_id, IP_Port *ip_port)
1025 return -1; 1025 return -1;
1026} 1026}
1027 1027
1028static void do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, uint8_t *client_id, 1028/* returns number of nodes not in kill-timeout */
1029static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, uint8_t *client_id,
1029 Client_data *list, uint32_t list_count) 1030 Client_data *list, uint32_t list_count)
1030{ 1031{
1031 uint32_t i; 1032 uint32_t i;
1033 uint8_t not_kill = 0;
1032 uint64_t temp_time = unix_time(); 1034 uint64_t temp_time = unix_time();
1033 1035
1034 uint32_t num_nodes = 0; 1036 uint32_t num_nodes = 0;
@@ -1043,6 +1045,8 @@ static void do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, uint8
1043 1045
1044 for (a = 0, assoc = &client->assoc6; a < 2; a++, assoc = &client->assoc4) 1046 for (a = 0, assoc = &client->assoc6; a < 2; a++, assoc = &client->assoc4)
1045 if (!is_timeout(assoc->timestamp, KILL_NODE_TIMEOUT)) { 1047 if (!is_timeout(assoc->timestamp, KILL_NODE_TIMEOUT)) {
1048 not_kill++;
1049
1046 if (is_timeout(assoc->last_pinged, PING_INTERVAL)) { 1050 if (is_timeout(assoc->last_pinged, PING_INTERVAL)) {
1047 send_ping_request(dht->ping, assoc->ip_port, client->client_id ); 1051 send_ping_request(dht->ping, assoc->ip_port, client->client_id );
1048 assoc->last_pinged = temp_time; 1052 assoc->last_pinged = temp_time;
@@ -1063,6 +1067,8 @@ static void do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, uint8
1063 client_id); 1067 client_id);
1064 *lastgetnode = temp_time; 1068 *lastgetnode = temp_time;
1065 } 1069 }
1070
1071 return not_kill;
1066} 1072}
1067 1073
1068/* Ping each client in the "friends" list every PING_INTERVAL seconds. Send a get nodes request 1074/* Ping each client in the "friends" list every PING_INTERVAL seconds. Send a get nodes request
@@ -1082,8 +1088,28 @@ static void do_DHT_friends(DHT *dht)
1082 */ 1088 */
1083static void do_Close(DHT *dht) 1089static void do_Close(DHT *dht)
1084{ 1090{
1085 do_ping_and_sendnode_requests(dht, &dht->close_lastgetnodes, dht->c->self_public_key, 1091 uint8_t not_killed = do_ping_and_sendnode_requests(dht, &dht->close_lastgetnodes, dht->c->self_public_key,
1086 dht->close_clientlist, LCLIENT_LIST); 1092 dht->close_clientlist, LCLIENT_LIST);
1093
1094 if (!not_killed) {
1095 /* all existing nodes are at least KILL_NODE_TIMEOUT,
1096 * which means we are mute, as we only send packets to
1097 * nodes NOT in KILL_NODE_TIMEOUT
1098 *
1099 * so: reset all nodes to be BAD_NODE_TIMEOUT, but not
1100 * KILL_NODE_TIMEOUT, so we at least keep trying pings */
1101 uint64_t badonly = unix_time() - BAD_NODE_TIMEOUT;
1102 size_t i, a;
1103
1104 for (i = 0; i < LCLIENT_LIST; i++) {
1105 Client_data *client = &dht->close_clientlist[i];
1106 IPPTsPng *assoc;
1107
1108 for (a = 0, assoc = &client->assoc4; a < 2; a++, assoc = &client->assoc6)
1109 if (assoc->timestamp)
1110 assoc->timestamp = badonly;
1111 }
1112 }
1087} 1113}
1088 1114
1089void DHT_bootstrap(DHT *dht, IP_Port ip_port, uint8_t *public_key) 1115void DHT_bootstrap(DHT *dht, IP_Port ip_port, uint8_t *public_key)