mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
reserve lower half of client lists for ipv4 for now
also rename client_in_list() to client_or_ip_port_in_list(), it also checks for an identical ip/port and replaces the client_id, recycling the entry DHT.c: - rename client_in_list() to client_or_ip_port_in_list() - replace_bad(), replace_good(): if IPv6, only insert into the upper half of the given list - addto_lists(): convert ipv4-in-ipv6 mapped to ipv4
This commit is contained in:
parent
0b7479e758
commit
f10c94a17a
|
@ -134,7 +134,7 @@ static int is_timeout(uint64_t time_now, uint64_t timestamp, uint64_t timeout)
|
||||||
*
|
*
|
||||||
* return True(1) or False(0)
|
* return True(1) or False(0)
|
||||||
*/
|
*/
|
||||||
static int client_in_list(Client_data *list, uint32_t length, uint8_t *client_id, IP_Port ip_port)
|
static int client_or_ip_port_in_list(Client_data *list, uint32_t length, uint8_t *client_id, IP_Port ip_port)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
uint64_t temp_time = unix_time();
|
uint64_t temp_time = unix_time();
|
||||||
|
@ -299,10 +299,14 @@ static int replace_bad( Client_data *list,
|
||||||
uint8_t *client_id,
|
uint8_t *client_id,
|
||||||
IP_Port ip_port )
|
IP_Port ip_port )
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i = 0;
|
||||||
uint64_t temp_time = unix_time();
|
uint64_t temp_time = unix_time();
|
||||||
|
|
||||||
for (i = 0; i < length; ++i) {
|
/* reserve the lower end to IPv4 for now */
|
||||||
|
if (ip_port.ip.family == AF_INET6)
|
||||||
|
i = length / 2;
|
||||||
|
|
||||||
|
for (; i < length; ++i) {
|
||||||
/* If node is bad */
|
/* If node is bad */
|
||||||
if (is_timeout(temp_time, list[i].timestamp, BAD_NODE_TIMEOUT)) {
|
if (is_timeout(temp_time, list[i].timestamp, BAD_NODE_TIMEOUT)) {
|
||||||
memcpy(list[i].client_id, client_id, CLIENT_ID_SIZE);
|
memcpy(list[i].client_id, client_id, CLIENT_ID_SIZE);
|
||||||
|
@ -347,11 +351,15 @@ static int replace_good( Client_data *list,
|
||||||
IP_Port ip_port,
|
IP_Port ip_port,
|
||||||
uint8_t *comp_client_id )
|
uint8_t *comp_client_id )
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i = 0;
|
||||||
uint64_t temp_time = unix_time();
|
uint64_t temp_time = unix_time();
|
||||||
sort_list(list, length, comp_client_id);
|
sort_list(list, length, comp_client_id);
|
||||||
|
|
||||||
for (i = 0; i < length; ++i)
|
/* reserve the lower end to IPv4 for now */
|
||||||
|
if (ip_port.ip.family == AF_INET6)
|
||||||
|
i = length / 2;
|
||||||
|
|
||||||
|
for (; i < length; ++i)
|
||||||
if (id_closest(comp_client_id, list[i].client_id, client_id) == 2) {
|
if (id_closest(comp_client_id, list[i].client_id, client_id) == 2) {
|
||||||
memcpy(list[i].client_id, client_id, CLIENT_ID_SIZE);
|
memcpy(list[i].client_id, client_id, CLIENT_ID_SIZE);
|
||||||
list[i].ip_port = ip_port;
|
list[i].ip_port = ip_port;
|
||||||
|
@ -372,36 +380,32 @@ void addto_lists(DHT *dht, IP_Port ip_port, uint8_t *client_id)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
|
/* convert IPv4-in-IPv6 to IPv4 */
|
||||||
|
if ((ip_port.ip.family == AF_INET6) && IN6_IS_ADDR_V4MAPPED(&ip_port.ip.ip6)) {
|
||||||
|
ip_port.ip.family = AF_INET;
|
||||||
|
ip_port.ip.ip4.uint32 = ip_port.ip.ip6.uint32[3];
|
||||||
|
}
|
||||||
|
|
||||||
/* NOTE: Current behavior if there are two clients with the same id is
|
/* NOTE: Current behavior if there are two clients with the same id is
|
||||||
* to replace the first ip by the second.
|
* to replace the first ip by the second.
|
||||||
*/
|
*/
|
||||||
if (!client_in_list(dht->close_clientlist, LCLIENT_LIST, client_id, ip_port)) {
|
if (!client_or_ip_port_in_list(dht->close_clientlist, LCLIENT_LIST, client_id, ip_port)) {
|
||||||
if (replace_bad(dht->close_clientlist, LCLIENT_LIST, client_id, ip_port)) {
|
if (replace_bad(dht->close_clientlist, LCLIENT_LIST, client_id, ip_port)) {
|
||||||
/* If we can't replace bad nodes we try replacing good ones. */
|
/* If we can't replace bad nodes we try replacing good ones. */
|
||||||
replace_good( dht->close_clientlist,
|
replace_good(dht->close_clientlist, LCLIENT_LIST, client_id, ip_port,
|
||||||
LCLIENT_LIST,
|
dht->c->self_public_key);
|
||||||
client_id,
|
|
||||||
ip_port,
|
|
||||||
dht->c->self_public_key );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < dht->num_friends; ++i) {
|
for (i = 0; i < dht->num_friends; ++i) {
|
||||||
if (!client_in_list( dht->friends_list[i].client_list,
|
if (!client_or_ip_port_in_list(dht->friends_list[i].client_list,
|
||||||
MAX_FRIEND_CLIENTS,
|
MAX_FRIEND_CLIENTS, client_id, ip_port)) {
|
||||||
client_id,
|
|
||||||
ip_port )) {
|
|
||||||
|
|
||||||
if (replace_bad( dht->friends_list[i].client_list,
|
if (replace_bad(dht->friends_list[i].client_list, MAX_FRIEND_CLIENTS,
|
||||||
MAX_FRIEND_CLIENTS,
|
client_id, ip_port)) {
|
||||||
client_id,
|
|
||||||
ip_port )) {
|
|
||||||
/* If we can't replace bad nodes we try replacing good ones. */
|
/* If we can't replace bad nodes we try replacing good ones. */
|
||||||
replace_good( dht->friends_list[i].client_list,
|
replace_good(dht->friends_list[i].client_list, MAX_FRIEND_CLIENTS,
|
||||||
MAX_FRIEND_CLIENTS,
|
client_id, ip_port, dht->friends_list[i].client_id);
|
||||||
client_id,
|
|
||||||
ip_port,
|
|
||||||
dht->friends_list[i].client_id );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user