mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Some optimizations and fixes.
This commit is contained in:
parent
8d1ef66892
commit
99ae23813b
|
@ -59,7 +59,7 @@ START_TEST(test_few_clients)
|
||||||
tox_callback_friend_request(tox2, accept_friend_request, tox2);
|
tox_callback_friend_request(tox2, accept_friend_request, tox2);
|
||||||
uint8_t address[TOX_FRIEND_ADDRESS_SIZE];
|
uint8_t address[TOX_FRIEND_ADDRESS_SIZE];
|
||||||
tox_get_address(tox2, address);
|
tox_get_address(tox2, address);
|
||||||
int test = tox_add_friend(tox3, address, "Gentoo", 7);
|
int test = tox_add_friend(tox3, address, (uint8_t *)"Gentoo", 7);
|
||||||
ck_assert_msg(test == 0, "Failed to add friend error code: %i", test);
|
ck_assert_msg(test == 0, "Failed to add friend error code: %i", test);
|
||||||
|
|
||||||
uint8_t off = 1;
|
uint8_t off = 1;
|
||||||
|
@ -84,7 +84,7 @@ START_TEST(test_few_clients)
|
||||||
printf("tox clients connected\n");
|
printf("tox clients connected\n");
|
||||||
uint32_t to_compare = 974536;
|
uint32_t to_compare = 974536;
|
||||||
tox_callback_friend_message(tox3, print_message, &to_compare);
|
tox_callback_friend_message(tox3, print_message, &to_compare);
|
||||||
tox_send_message(tox2, 0, "Install Gentoo", sizeof("Install Gentoo"));
|
tox_send_message(tox2, 0, (uint8_t *)"Install Gentoo", sizeof("Install Gentoo"));
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
messages_received = 0;
|
messages_received = 0;
|
||||||
|
@ -101,7 +101,7 @@ START_TEST(test_few_clients)
|
||||||
printf("tox clients messaging succeeded\n");
|
printf("tox clients messaging succeeded\n");
|
||||||
|
|
||||||
tox_callback_name_change(tox3, print_nickchange, &to_compare);
|
tox_callback_name_change(tox3, print_nickchange, &to_compare);
|
||||||
tox_set_name(tox2, "Gentoo", sizeof("Gentoo"));
|
tox_set_name(tox2, (uint8_t *)"Gentoo", sizeof("Gentoo"));
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
name_changes = 0;
|
name_changes = 0;
|
||||||
|
@ -122,8 +122,8 @@ START_TEST(test_few_clients)
|
||||||
}
|
}
|
||||||
END_TEST
|
END_TEST
|
||||||
|
|
||||||
#define NUM_TOXES 66
|
#define NUM_TOXES 33
|
||||||
#define NUM_FRIENDS 20
|
#define NUM_FRIENDS 10
|
||||||
|
|
||||||
START_TEST(test_many_clients)
|
START_TEST(test_many_clients)
|
||||||
{
|
{
|
||||||
|
@ -149,7 +149,7 @@ loop_top:
|
||||||
pairs[i].tox1 = rand() % NUM_TOXES;
|
pairs[i].tox1 = rand() % NUM_TOXES;
|
||||||
pairs[i].tox2 = (pairs[i].tox1 + rand() % (NUM_TOXES - 1) + 1) % NUM_TOXES;
|
pairs[i].tox2 = (pairs[i].tox1 + rand() % (NUM_TOXES - 1) + 1) % NUM_TOXES;
|
||||||
tox_get_address(toxes[pairs[i].tox1], address);
|
tox_get_address(toxes[pairs[i].tox1], address);
|
||||||
int test = tox_add_friend(toxes[pairs[i].tox2], address, "Gentoo", 7);
|
int test = tox_add_friend(toxes[pairs[i].tox2], address, (uint8_t *)"Gentoo", 7);
|
||||||
|
|
||||||
if (test == TOX_FAERR_ALREADYSENT) {
|
if (test == TOX_FAERR_ALREADYSENT) {
|
||||||
goto loop_top;
|
goto loop_top;
|
||||||
|
|
|
@ -308,7 +308,8 @@ static void get_close_nodes_inner(DHT *dht, uint8_t *client_id, Node_format *nod
|
||||||
if (LAN_ip(ipptp->ip_port.ip) == 0 && !is_LAN)
|
if (LAN_ip(ipptp->ip_port.ip) == 0 && !is_LAN)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (LAN_ip(ipptp->ip_port.ip) != 0 && want_good && hardening_correct(&ipptp->hardening) != HARDENING_ALL_OK && !id_equal(client_id, client->client_id))
|
if (LAN_ip(ipptp->ip_port.ip) != 0 && want_good && hardening_correct(&ipptp->hardening) != HARDENING_ALL_OK
|
||||||
|
&& !id_equal(client_id, client->client_id))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (num_nodes < MAX_SENT_NODES) {
|
if (num_nodes < MAX_SENT_NODES) {
|
||||||
|
@ -1838,7 +1839,7 @@ static void do_NAT(DHT *dht)
|
||||||
/*----------------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------------*/
|
||||||
/*-----------------------END OF NAT PUNCHING FUNCTIONS------------------------------*/
|
/*-----------------------END OF NAT PUNCHING FUNCTIONS------------------------------*/
|
||||||
|
|
||||||
#define HARDREQ_DATA_SIZE 768 /* Attempt to prevent amplification/other attacks*/
|
#define HARDREQ_DATA_SIZE 384 /* Attempt to prevent amplification/other attacks*/
|
||||||
|
|
||||||
#define CHECK_TYPE_ROUTE_REQ 0
|
#define CHECK_TYPE_ROUTE_REQ 0
|
||||||
#define CHECK_TYPE_ROUTE_RES 1
|
#define CHECK_TYPE_ROUTE_RES 1
|
||||||
|
|
|
@ -683,6 +683,8 @@ static void check_friend_connectionstatus(Messenger *m, int friendnumber, uint8_
|
||||||
const uint8_t was_online = m->friendlist[friendnumber].status == FRIEND_ONLINE;
|
const uint8_t was_online = m->friendlist[friendnumber].status == FRIEND_ONLINE;
|
||||||
const uint8_t is_online = status == FRIEND_ONLINE;
|
const uint8_t is_online = status == FRIEND_ONLINE;
|
||||||
|
|
||||||
|
onion_set_friend_online(m->onion_c, m->friendlist[friendnumber].onion_friendnum, is_online);
|
||||||
|
|
||||||
if (is_online != was_online) {
|
if (is_online != was_online) {
|
||||||
if (was_online)
|
if (was_online)
|
||||||
break_files(m, friendnumber);
|
break_files(m, friendnumber);
|
||||||
|
|
|
@ -582,6 +582,24 @@ int onion_getfriendip(Onion_Client *onion_c, int friend_num, IP_Port *ip_port)
|
||||||
return DHT_getfriendip(onion_c->dht, onion_c->friends_list[friend_num].fake_client_id, ip_port);
|
return DHT_getfriendip(onion_c->dht, onion_c->friends_list[friend_num].fake_client_id, ip_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set if friend is online or not.
|
||||||
|
* NOTE: This function is there and should be used so that we don't send useless packets to the friend if he is online.
|
||||||
|
*
|
||||||
|
* is_online 1 means friend is online.
|
||||||
|
* is_online 0 means friend is offline
|
||||||
|
*
|
||||||
|
* return -1 on failure.
|
||||||
|
* return 0 on success.
|
||||||
|
*/
|
||||||
|
int onion_set_friend_online(Onion_Client *onion_c, int friend_num, uint8_t is_online)
|
||||||
|
{
|
||||||
|
if ((uint32_t)friend_num >= onion_c->num_friends)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
onion_c->friends_list[friend_num].is_online = is_online;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Takes 3 random nodes that we know and puts them in nodes
|
/* Takes 3 random nodes that we know and puts them in nodes
|
||||||
*
|
*
|
||||||
* nodes must be longer than 3.
|
* nodes must be longer than 3.
|
||||||
|
@ -598,7 +616,7 @@ int random_path(Onion_Client *onion_c, Node_format *nodes)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ANNOUNCE_FRIEND 30
|
#define ANNOUNCE_FRIEND 120
|
||||||
|
|
||||||
static void do_friend(Onion_Client *onion_c, uint16_t friendnum)
|
static void do_friend(Onion_Client *onion_c, uint16_t friendnum)
|
||||||
{
|
{
|
||||||
|
@ -611,32 +629,35 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum)
|
||||||
uint32_t i, count = 0;
|
uint32_t i, count = 0;
|
||||||
Onion_Node *list_nodes = onion_c->friends_list[friendnum].clients_list;
|
Onion_Node *list_nodes = onion_c->friends_list[friendnum].clients_list;
|
||||||
|
|
||||||
for (i = 0; i < MAX_ONION_CLIENTS; ++i) {
|
if (!onion_c->friends_list[friendnum].is_online) {
|
||||||
if (is_timeout(list_nodes[i].timestamp, ONION_NODE_TIMEOUT))
|
for (i = 0; i < MAX_ONION_CLIENTS; ++i) {
|
||||||
continue;
|
if (is_timeout(list_nodes[i].timestamp, ONION_NODE_TIMEOUT))
|
||||||
|
continue;
|
||||||
|
|
||||||
++count;
|
++count;
|
||||||
|
|
||||||
if (is_timeout(list_nodes[i].last_pinged, ANNOUNCE_FRIEND)) {
|
if (is_timeout(list_nodes[i].last_pinged, ANNOUNCE_FRIEND)) {
|
||||||
if (client_send_announce_request(onion_c, friendnum + 1, list_nodes[i].ip_port, list_nodes[i].client_id, 0) == 0) {
|
if (client_send_announce_request(onion_c, friendnum + 1, list_nodes[i].ip_port, list_nodes[i].client_id, 0) == 0) {
|
||||||
list_nodes[i].last_pinged = unix_time();
|
list_nodes[i].last_pinged = unix_time();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (count < MAX_ONION_CLIENTS / 2) {
|
||||||
|
Node_format nodes_list[MAX_SENT_NODES];
|
||||||
|
uint32_t num_nodes = get_close_nodes(onion_c->dht, onion_c->friends_list[friendnum].real_client_id, nodes_list,
|
||||||
|
rand() % 2 ? AF_INET : AF_INET6, 1, 0);
|
||||||
|
|
||||||
|
for (i = 0; i < num_nodes; ++i)
|
||||||
|
client_send_announce_request(onion_c, friendnum + 1, nodes_list[i].ip_port, nodes_list[i].client_id, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* send packets to friend telling them our fake DHT id. */
|
||||||
|
if (is_timeout(onion_c->friends_list[friendnum].last_fakeid_sent, ONION_FAKEID_INTERVAL))
|
||||||
|
if (send_fakeid_announce(onion_c, friendnum) > 1)
|
||||||
|
onion_c->friends_list[friendnum].last_fakeid_sent = unix_time();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (count < MAX_ONION_CLIENTS / 2) {
|
|
||||||
Node_format nodes_list[MAX_SENT_NODES];
|
|
||||||
uint32_t num_nodes = get_close_nodes(onion_c->dht, onion_c->friends_list[friendnum].real_client_id, nodes_list,
|
|
||||||
rand() % 2 ? AF_INET : AF_INET6, 1, 0);
|
|
||||||
|
|
||||||
for (i = 0; i < num_nodes; ++i)
|
|
||||||
client_send_announce_request(onion_c, friendnum + 1, nodes_list[i].ip_port, nodes_list[i].client_id, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* send packets to friend telling them our fake DHT id. */
|
|
||||||
if (is_timeout(onion_c->friends_list[friendnum].last_fakeid_sent, ONION_FAKEID_INTERVAL))
|
|
||||||
if (send_fakeid_announce(onion_c, friendnum) > 1)
|
|
||||||
onion_c->friends_list[friendnum].last_fakeid_sent = unix_time();
|
|
||||||
}
|
}
|
||||||
/* Function to call when onion data packet with contents beginning with byte is received. */
|
/* Function to call when onion data packet with contents beginning with byte is received. */
|
||||||
void oniondata_registerhandler(Onion_Client *onion_c, uint8_t byte, oniondata_handler_callback cb, void *object)
|
void oniondata_registerhandler(Onion_Client *onion_c, uint8_t byte, oniondata_handler_callback cb, void *object)
|
||||||
|
@ -646,7 +667,7 @@ void oniondata_registerhandler(Onion_Client *onion_c, uint8_t byte, oniondata_ha
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ANNOUNCE_INTERVAL_NOT_ANNOUNCED 10
|
#define ANNOUNCE_INTERVAL_NOT_ANNOUNCED 10
|
||||||
#define ANNOUNCE_INTERVAL_ANNOUNCED 60
|
#define ANNOUNCE_INTERVAL_ANNOUNCED 120
|
||||||
|
|
||||||
static void do_announce(Onion_Client *onion_c)
|
static void do_announce(Onion_Client *onion_c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include "onion_announce.h"
|
#include "onion_announce.h"
|
||||||
|
|
||||||
#define MAX_ONION_CLIENTS 8
|
#define MAX_ONION_CLIENTS 8
|
||||||
#define ONION_NODE_TIMEOUT 200
|
#define ONION_NODE_TIMEOUT 240
|
||||||
|
|
||||||
/* The interval in seconds at which to tell our friends where we are */
|
/* The interval in seconds at which to tell our friends where we are */
|
||||||
#define ONION_FAKEID_INTERVAL 60
|
#define ONION_FAKEID_INTERVAL 60
|
||||||
|
@ -43,6 +43,7 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t status; /* 0 if friend is not valid, 1 if friend is valid.*/
|
uint8_t status; /* 0 if friend is not valid, 1 if friend is valid.*/
|
||||||
|
uint8_t is_online; /* Set by the onion_set_friend_status function. */
|
||||||
|
|
||||||
uint8_t fake_client_id[crypto_box_PUBLICKEYBYTES];
|
uint8_t fake_client_id[crypto_box_PUBLICKEYBYTES];
|
||||||
uint8_t real_client_id[crypto_box_PUBLICKEYBYTES];
|
uint8_t real_client_id[crypto_box_PUBLICKEYBYTES];
|
||||||
|
@ -94,6 +95,17 @@ int onion_addfriend(Onion_Client *onion_c, uint8_t *client_id);
|
||||||
*/
|
*/
|
||||||
int onion_delfriend(Onion_Client *onion_c, int friend_num);
|
int onion_delfriend(Onion_Client *onion_c, int friend_num);
|
||||||
|
|
||||||
|
/* Set if friend is online or not.
|
||||||
|
* NOTE: This function is there and should be used so that we don't send useless packets to the friend if he is online.
|
||||||
|
*
|
||||||
|
* is_online 1 means friend is online.
|
||||||
|
* is_online 0 means friend is offline
|
||||||
|
*
|
||||||
|
* return -1 on failure.
|
||||||
|
* return 0 on success.
|
||||||
|
*/
|
||||||
|
int onion_set_friend_online(Onion_Client *onion_c, int friend_num, uint8_t is_online);
|
||||||
|
|
||||||
/* Get the ip of friend friendnum and put it in ip_port
|
/* Get the ip of friend friendnum and put it in ip_port
|
||||||
*
|
*
|
||||||
* return -1, -- if client_id does NOT refer to a friend
|
* return -1, -- if client_id does NOT refer to a friend
|
||||||
|
|
Loading…
Reference in New Issue
Block a user