mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Merge pull request #649 from FullName/DHT-client_id-change-wipe-other-address
On replacing a client with another, clear the stale association.
This commit is contained in:
commit
706b6ec11c
|
@ -115,21 +115,6 @@ static int client_id_cmp(ClientPair p1, ClientPair p2)
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int client_in_list(Client_data *list, uint32_t length, uint8_t *client_id)
|
|
||||||
{
|
|
||||||
uint32_t i;
|
|
||||||
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
|
|
||||||
/* Dead nodes are considered dead (not in the list)*/
|
|
||||||
if (!is_timeout(list[i].assoc4.timestamp, KILL_NODE_TIMEOUT) ||
|
|
||||||
!is_timeout(list[i].assoc6.timestamp, KILL_NODE_TIMEOUT))
|
|
||||||
if (id_equal(list[i].client_id, client_id))
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if client with client_id is already in list of length length.
|
/* Check if client with client_id is already in list of length length.
|
||||||
* If it is then set its corresponding timestamp to current time.
|
* If it is then set its corresponding timestamp to current time.
|
||||||
* If the id is already in the list with a different ip_port, update it.
|
* If the id is already in the list with a different ip_port, update it.
|
||||||
|
@ -387,21 +372,31 @@ static int replace_bad( Client_data *list,
|
||||||
for (i = 0; i < length; ++i) {
|
for (i = 0; i < length; ++i) {
|
||||||
/* If node is bad */
|
/* If node is bad */
|
||||||
Client_data *client = &list[i];
|
Client_data *client = &list[i];
|
||||||
IPPTsPng *ipptp = NULL;
|
|
||||||
|
|
||||||
if (ip_port.ip.family == AF_INET)
|
if (is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) &&
|
||||||
ipptp = &client->assoc4;
|
is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT)) {
|
||||||
else
|
|
||||||
ipptp = &client->assoc6;
|
IPPTsPng *ipptp_write = NULL;
|
||||||
|
IPPTsPng *ipptp_clear = NULL;
|
||||||
|
|
||||||
|
if (ip_port.ip.family == AF_INET) {
|
||||||
|
ipptp_write = &client->assoc4;
|
||||||
|
ipptp_clear = &client->assoc6;
|
||||||
|
} else {
|
||||||
|
ipptp_write = &client->assoc6;
|
||||||
|
ipptp_clear = &client->assoc4;
|
||||||
|
}
|
||||||
|
|
||||||
if (is_timeout(ipptp->timestamp, BAD_NODE_TIMEOUT)) {
|
|
||||||
memcpy(client->client_id, client_id, CLIENT_ID_SIZE);
|
memcpy(client->client_id, client_id, CLIENT_ID_SIZE);
|
||||||
ipptp->ip_port = ip_port;
|
ipptp_write->ip_port = ip_port;
|
||||||
ipptp->timestamp = unix_time();
|
ipptp_write->timestamp = unix_time();
|
||||||
|
|
||||||
ip_reset(&ipptp->ret_ip_port.ip);
|
ip_reset(&ipptp_write->ret_ip_port.ip);
|
||||||
ipptp->ret_ip_port.port = 0;
|
ipptp_write->ret_ip_port.port = 0;
|
||||||
ipptp->ret_timestamp = 0;
|
ipptp_write->ret_timestamp = 0;
|
||||||
|
|
||||||
|
/* zero out other address */
|
||||||
|
memset(ipptp_clear, 0, sizeof(*ipptp_clear));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -463,20 +458,28 @@ static int replace_good( Client_data *list,
|
||||||
assert(replace >= 0 && replace < length);
|
assert(replace >= 0 && replace < length);
|
||||||
#endif
|
#endif
|
||||||
Client_data *client = &list[replace];
|
Client_data *client = &list[replace];
|
||||||
IPPTsPng *ipptp = NULL;
|
IPPTsPng *ipptp_write = NULL;
|
||||||
|
IPPTsPng *ipptp_clear = NULL;
|
||||||
|
|
||||||
if (ip_port.ip.family == AF_INET)
|
if (ip_port.ip.family == AF_INET) {
|
||||||
ipptp = &client->assoc4;
|
ipptp_write = &client->assoc4;
|
||||||
else
|
ipptp_clear = &client->assoc6;
|
||||||
ipptp = &client->assoc6;
|
} else {
|
||||||
|
ipptp_write = &client->assoc6;
|
||||||
|
ipptp_clear = &client->assoc4;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(client->client_id, client_id, CLIENT_ID_SIZE);
|
memcpy(client->client_id, client_id, CLIENT_ID_SIZE);
|
||||||
ipptp->ip_port = ip_port;
|
ipptp_write->ip_port = ip_port;
|
||||||
ipptp->timestamp = unix_time();
|
ipptp_write->timestamp = unix_time();
|
||||||
|
|
||||||
|
ip_reset(&ipptp_write->ret_ip_port.ip);
|
||||||
|
ipptp_write->ret_ip_port.port = 0;
|
||||||
|
ipptp_write->ret_timestamp = 0;
|
||||||
|
|
||||||
|
/* zero out other address */
|
||||||
|
memset(ipptp_clear, 0, sizeof(*ipptp_clear));
|
||||||
|
|
||||||
ip_reset(&ipptp->ret_ip_port.ip);
|
|
||||||
ipptp->ret_ip_port.port = 0;
|
|
||||||
ipptp->ret_timestamp = 0;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user