mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Loading and saving added to DHT.
This commit is contained in:
parent
c8d046e348
commit
e63ba9c61b
103
core/DHT.c
103
core/DHT.c
|
@ -110,35 +110,22 @@ int id_closest(uint8_t * client_id, uint8_t * client_id1, uint8_t * client_id2)/
|
||||||
|
|
||||||
//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 set it's corresponding timestamp to current time.
|
//if it is set it's corresponding timestamp to current time.
|
||||||
//if the ip_port is already in the list but associated to a different ip, change it.
|
//if the id is already in the list with a different ip_port, update it.
|
||||||
//return True(1) or False(0)
|
//return True(1) or False(0)
|
||||||
//TODO: maybe optimize this.
|
//TODO: maybe optimize this.
|
||||||
int client_in_list(Client_data * list, uint32_t length, uint8_t * client_id, IP_Port ip_port)
|
int client_in_list(Client_data * list, uint32_t length, uint8_t * client_id, IP_Port ip_port)
|
||||||
{
|
{
|
||||||
uint32_t i, j;
|
uint32_t i;
|
||||||
uint32_t temp_time = unix_time();
|
uint32_t temp_time = unix_time();
|
||||||
|
|
||||||
for(i = 0; i < length; i++)
|
for(i = 0; i < length; i++)
|
||||||
{
|
{
|
||||||
//If the id for an ip/port changes, replace it.
|
if(memcmp(list[i].client_id, client_id, CLIENT_ID_SIZE) == 0)
|
||||||
if(list[i].ip_port.ip.i == ip_port.ip.i &&
|
|
||||||
list[i].ip_port.port == ip_port.port)
|
|
||||||
{
|
|
||||||
memcpy(list[i].client_id, client_id, CLIENT_ID_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(j = 0; j < CLIENT_ID_SIZE; j++)
|
|
||||||
{
|
|
||||||
|
|
||||||
if(list[i].client_id[j] != client_id[j])
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(j == CLIENT_ID_SIZE)
|
|
||||||
{
|
{
|
||||||
//Refresh the client timestamp.
|
//Refresh the client timestamp.
|
||||||
list[i].timestamp = temp_time;
|
list[i].timestamp = temp_time;
|
||||||
|
list[i].ip_port.ip.i = ip_port.ip.i;
|
||||||
|
list[i].ip_port.port = ip_port.port;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -150,18 +137,10 @@ int client_in_list(Client_data * list, uint32_t length, uint8_t * client_id, IP_
|
||||||
//return True(1) or False(0)
|
//return True(1) or False(0)
|
||||||
int client_in_nodelist(Node_format * list, uint32_t length, uint8_t * client_id)
|
int client_in_nodelist(Node_format * list, uint32_t length, uint8_t * client_id)
|
||||||
{
|
{
|
||||||
uint32_t i, j;
|
uint32_t i;
|
||||||
for(i = 0; i < length; i++)
|
for(i = 0; i < length; i++)
|
||||||
{
|
{
|
||||||
for(j = 0; j < CLIENT_ID_SIZE; j++)
|
if(memcmp(list[i].client_id, client_id, CLIENT_ID_SIZE) == 0)
|
||||||
{
|
|
||||||
|
|
||||||
if(list[i].client_id[j] != client_id[j])
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(j == CLIENT_ID_SIZE)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -290,7 +269,7 @@ void addto_lists(IP_Port ip_port, uint8_t * client_id)
|
||||||
{
|
{
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
|
|
||||||
//NOTE: current behavior if there are two clients with the same id is to only keep one (the first one)
|
//NOTE: current behavior if there are two clients with the same id is to replace the first ip by the second.
|
||||||
if(!client_in_list(close_clientlist, LCLIENT_LIST, client_id, ip_port))
|
if(!client_in_list(close_clientlist, LCLIENT_LIST, client_id, ip_port))
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -818,14 +797,15 @@ IP_Port DHT_getfriendip(uint8_t * client_id)
|
||||||
{
|
{
|
||||||
uint32_t i, j;
|
uint32_t i, j;
|
||||||
IP_Port empty = {{{0}}, 0};
|
IP_Port empty = {{{0}}, 0};
|
||||||
|
uint32_t temp_time = unix_time();
|
||||||
for(i = 0; i < num_friends; i++)
|
for(i = 0; i < num_friends; i++)
|
||||||
{
|
{
|
||||||
if(memcmp(friends_list[i].client_id, client_id, CLIENT_ID_SIZE) == 0)//Equal
|
if(memcmp(friends_list[i].client_id, client_id, CLIENT_ID_SIZE) == 0)//Equal
|
||||||
{
|
{
|
||||||
for(j = 0; j < MAX_FRIEND_CLIENTS; j++)
|
for(j = 0; j < MAX_FRIEND_CLIENTS; j++)
|
||||||
{
|
{
|
||||||
if(memcmp(friends_list[i].client_list[j].client_id, client_id, CLIENT_ID_SIZE) == 0)
|
if(memcmp(friends_list[i].client_list[j].client_id, client_id, CLIENT_ID_SIZE) == 0 &&
|
||||||
|
friends_list[i].client_list[j].timestamp + BAD_NODE_TIMEOUT > temp_time)
|
||||||
{
|
{
|
||||||
return friends_list[i].client_list[j].ip_port;
|
return friends_list[i].client_list[j].ip_port;
|
||||||
}
|
}
|
||||||
|
@ -976,3 +956,64 @@ void DHT_bootstrap(IP_Port ip_port, uint8_t * public_key)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//get the size of the DHT (for saving)
|
||||||
|
uint32_t DHT_size()
|
||||||
|
{
|
||||||
|
return sizeof(close_clientlist) + sizeof(Friend) * num_friends;
|
||||||
|
}
|
||||||
|
|
||||||
|
//save the DHT in data where data is an array of size DHT_size()
|
||||||
|
void DHT_save(uint8_t * data)
|
||||||
|
{
|
||||||
|
memcpy(data, close_clientlist, sizeof(close_clientlist));
|
||||||
|
memcpy(data + sizeof(close_clientlist), friends_list, sizeof(Friend) * num_friends);
|
||||||
|
}
|
||||||
|
|
||||||
|
//load the DHT from data of size size;
|
||||||
|
//return -1 if failure
|
||||||
|
//return 0 if success
|
||||||
|
int DHT_load(uint8_t * data, uint32_t size)
|
||||||
|
{
|
||||||
|
if(size < sizeof(close_clientlist))
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if((size - sizeof(close_clientlist)) % sizeof(Friend) != 0)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
uint32_t i, j;
|
||||||
|
//uint32_t temp_time = unix_time();
|
||||||
|
uint16_t temp;
|
||||||
|
|
||||||
|
temp = (size - sizeof(close_clientlist))/sizeof(Friend);
|
||||||
|
|
||||||
|
if(temp != 0)
|
||||||
|
{
|
||||||
|
Friend * tempfriends_list = (Friend *)(data + sizeof(close_clientlist));
|
||||||
|
|
||||||
|
for(i = 0; i < temp; i++)
|
||||||
|
{
|
||||||
|
DHT_addfriend(tempfriends_list[i].client_id);
|
||||||
|
for(j = 0; j < MAX_FRIEND_CLIENTS; j++)
|
||||||
|
{
|
||||||
|
if(tempfriends_list[i].client_list[j].timestamp != 0)
|
||||||
|
{
|
||||||
|
getnodes(tempfriends_list[i].client_list[j].ip_port,
|
||||||
|
tempfriends_list[i].client_list[j].client_id, tempfriends_list[i].client_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Client_data * tempclose_clientlist = (Client_data *)data;
|
||||||
|
|
||||||
|
for(i = 0; i < LCLIENT_LIST; i++)
|
||||||
|
{
|
||||||
|
if(tempclose_clientlist[i].timestamp != 0)
|
||||||
|
{
|
||||||
|
DHT_bootstrap(tempclose_clientlist[i].ip_port, tempclose_clientlist[i].client_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
12
core/DHT.h
12
core/DHT.h
|
@ -72,11 +72,19 @@ int DHT_handlepacket(uint8_t * packet, uint32_t length, IP_Port source);
|
||||||
void DHT_bootstrap(IP_Port ip_port, uint8_t * public_key);
|
void DHT_bootstrap(IP_Port ip_port, uint8_t * public_key);
|
||||||
|
|
||||||
|
|
||||||
//TODO:
|
//SAVE/LOAD functions
|
||||||
//Add functions to save and load the state(client list, friends list)
|
|
||||||
|
//get the size of the DHT (for saving)
|
||||||
|
uint32_t DHT_size();
|
||||||
|
|
||||||
|
|
||||||
|
//save the DHT in data where data is an array of size DHT_size()
|
||||||
|
void DHT_save(uint8_t * data);
|
||||||
|
|
||||||
|
//load the DHT from data of size size;
|
||||||
|
//return -1 if failure
|
||||||
|
//return 0 if success
|
||||||
|
int DHT_load(uint8_t * data, uint32_t size);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user