diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f164dad..bc846554 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -228,6 +228,7 @@ endif() # LAYER 3: Distributed Hash Table # ------------------------------- +apidsl(toxcore/ping.api.h) apidsl(toxcore/ping_array.api.h) add_submodule(toxcore toxdht toxcore/DHT.c diff --git a/toxcore/DHT.c b/toxcore/DHT.c index 141ae533..4e089180 100644 --- a/toxcore/DHT.c +++ b/toxcore/DHT.c @@ -1285,7 +1285,7 @@ static int handle_getnodes(void *object, IP_Port source, const uint8_t *packet, sendnodes_ipv6(dht, source, packet + 1, plain, plain + CRYPTO_PUBLIC_KEY_SIZE, sizeof(uint64_t), shared_key); - add_to_ping(dht->ping, packet + 1, source); + ping_add(dht->ping, packet + 1, source); return 0; } @@ -2069,7 +2069,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports, IP_Port pinging; ip_copy(&pinging.ip, &ip); pinging.port = net_htons(first_port); - send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].public_key); + ping_send_request(dht->ping, pinging, dht->friends_list[friend_num].public_key); } else { for (i = 0; i < MAX_PUNCHING_PORTS; ++i) { /* TODO(irungentoo): Improve port guessing algorithm. */ @@ -2081,7 +2081,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports, IP_Port pinging; ip_copy(&pinging.ip, &ip); pinging.port = net_htons(port); - send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].public_key); + ping_send_request(dht->ping, pinging, dht->friends_list[friend_num].public_key); } dht->friends_list[friend_num].nat.punching_index += i; @@ -2095,7 +2095,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports, for (i = 0; i < MAX_PUNCHING_PORTS; ++i) { uint32_t it = i + dht->friends_list[friend_num].nat.punching_index2; pinging.port = net_htons(port + it); - send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].public_key); + ping_send_request(dht->ping, pinging, dht->friends_list[friend_num].public_key); } dht->friends_list[friend_num].nat.punching_index2 += i - (MAX_PUNCHING_PORTS / 2); @@ -2562,7 +2562,7 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled) dht->hole_punching_enabled = holepunching_enabled; - dht->ping = new_ping(dht); + dht->ping = ping_new(dht); if (dht->ping == NULL) { kill_DHT(dht); @@ -2610,7 +2610,7 @@ void do_DHT(DHT *dht) do_Close(dht); do_DHT_friends(dht); do_NAT(dht); - do_to_ping(dht->ping); + ping_iterate(dht->ping); #if DHT_HARDENING do_hardening(dht); #endif @@ -2624,7 +2624,7 @@ void kill_DHT(DHT *dht) cryptopacket_registerhandler(dht, CRYPTO_PACKET_HARDENING, NULL, NULL); ping_array_kill(dht->dht_ping_array); ping_array_kill(dht->dht_harden_ping_array); - kill_ping(dht->ping); + ping_kill(dht->ping); free(dht->friends_list); free(dht->loaded_nodes_list); free(dht); diff --git a/toxcore/DHT.h b/toxcore/DHT.h index dae6ea31..624bc690 100644 --- a/toxcore/DHT.h +++ b/toxcore/DHT.h @@ -225,7 +225,8 @@ typedef struct { void *object; } Cryptopacket_Handles; -typedef struct { +#define DHT_DEFINED +typedef struct DHT { Logger *log; Networking_Core *net; @@ -251,7 +252,7 @@ typedef struct { Shared_Keys shared_keys_recv; Shared_Keys shared_keys_sent; - struct PING *ping; + struct Ping *ping; Ping_Array *dht_ping_array; Ping_Array *dht_harden_ping_array; uint64_t last_run; diff --git a/toxcore/network.h b/toxcore/network.h index 943030e5..c8671f57 100644 --- a/toxcore/network.h +++ b/toxcore/network.h @@ -155,11 +155,11 @@ typedef struct { } IP; -typedef struct { +#define IP_PORT_DEFINED +typedef struct IP_Port { IP ip; uint16_t port; -} -IP_Port; +} IP_Port; /* Convert values between host and network byte order. */ diff --git a/toxcore/ping.api.h b/toxcore/ping.api.h new file mode 100644 index 00000000..edc04723 --- /dev/null +++ b/toxcore/ping.api.h @@ -0,0 +1,65 @@ +%{ +/* + * Buffered pinging using cyclic arrays. + */ + +/* + * Copyright © 2016-2017 The TokTok team. + * Copyright © 2013 Tox project. + * Copyright © 2013 plutooo + * + * This file is part of Tox, the free peer to peer instant messenger. + * This file is donated to the Tox Project. + * + * Tox is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tox is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Tox. If not, see . + */ +#ifndef PING_H +#define PING_H + +#include "DHT.h" +#include "network.h" + +#include +%} + +class iP_Port { struct this; } +class dHT { struct this; } + +class ping { + +struct this; + +static this new(dHT::this *dht); +void kill(); + +/** Add nodes to the to_ping list. + * All nodes in this list are pinged every TIME_TOPING seconds + * and are then removed from the list. + * If the list is full the nodes farthest from our public_key are replaced. + * The purpose of this list is to enable quick integration of new nodes into the + * network while preventing amplification attacks. + * + * return 0 if node was added. + * return -1 if node was not added. + */ +int32_t add(const uint8_t *public_key, iP_Port::this ip_port); +void iterate(); + +int32_t send_request(iP_Port::this ipp, const uint8_t *public_key); + +} + +%{ +#endif /* PING_H */ +%} diff --git a/toxcore/ping.c b/toxcore/ping.c index b99c2a8c..f2f56013 100644 --- a/toxcore/ping.c +++ b/toxcore/ping.c @@ -45,7 +45,7 @@ #define TIME_TO_PING 2 -struct PING { +struct Ping { DHT *dht; Ping_Array *ping_array; @@ -58,7 +58,7 @@ struct PING { #define DHT_PING_SIZE (1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE + PING_PLAIN_SIZE + CRYPTO_MAC_SIZE) #define PING_DATA_SIZE (CRYPTO_PUBLIC_KEY_SIZE + sizeof(IP_Port)) -int send_ping_request(PING *ping, IP_Port ipp, const uint8_t *public_key) +int32_t ping_send_request(Ping *ping, IP_Port ipp, const uint8_t *public_key) { uint8_t pk[DHT_PING_SIZE]; int rc; @@ -103,7 +103,7 @@ int send_ping_request(PING *ping, IP_Port ipp, const uint8_t *public_key) return sendpacket(ping->dht->net, ipp, pk, sizeof(pk)); } -static int send_ping_response(PING *ping, IP_Port ipp, const uint8_t *public_key, uint64_t ping_id, +static int ping_send_response(Ping *ping, IP_Port ipp, const uint8_t *public_key, uint64_t ping_id, uint8_t *shared_encryption_key) { uint8_t pk[DHT_PING_SIZE]; @@ -143,7 +143,7 @@ static int handle_ping_request(void *object, IP_Port source, const uint8_t *pack return 1; } - PING *ping = dht->ping; + Ping *ping = dht->ping; if (id_equal(packet + 1, ping->dht->self_public_key)) { return 1; @@ -171,8 +171,8 @@ static int handle_ping_request(void *object, IP_Port source, const uint8_t *pack uint64_t ping_id; memcpy(&ping_id, ping_plain + 1, sizeof(ping_id)); // Send response - send_ping_response(ping, source, packet + 1, ping_id, shared_key); - add_to_ping(ping, packet + 1, source); + ping_send_response(ping, source, packet + 1, ping_id, shared_key); + ping_add(ping, packet + 1, source); return 0; } @@ -186,7 +186,7 @@ static int handle_ping_response(void *object, IP_Port source, const uint8_t *pac return 1; } - PING *ping = dht->ping; + Ping *ping = dht->ping; if (id_equal(packet + 1, ping->dht->self_public_key)) { return 1; @@ -274,7 +274,7 @@ static int in_list(const Client_data *list, uint16_t length, const uint8_t *publ * return 0 if node was added. * return -1 if node was not added. */ -int add_to_ping(PING *ping, const uint8_t *public_key, IP_Port ip_port) +int32_t ping_add(Ping *ping, const uint8_t *public_key, IP_Port ip_port) { if (!ip_isset(&ip_port.ip)) { return -1; @@ -291,7 +291,7 @@ int add_to_ping(PING *ping, const uint8_t *public_key, IP_Port ip_port) IP_Port temp; if (DHT_getfriendip(ping->dht, public_key, &temp) == 0) { - send_ping_request(ping, ip_port, public_key); + ping_send_request(ping, ip_port, public_key); return -1; } @@ -320,7 +320,7 @@ int add_to_ping(PING *ping, const uint8_t *public_key, IP_Port ip_port) /* Ping all the valid nodes in the to_ping list every TIME_TO_PING seconds. * This function must be run at least once every TIME_TO_PING seconds. */ -void do_to_ping(PING *ping) +void ping_iterate(Ping *ping) { if (!is_timeout(ping->last_to_ping, TIME_TO_PING)) { return; @@ -341,7 +341,7 @@ void do_to_ping(PING *ping) continue; } - send_ping_request(ping, ping->to_ping[i].ip_port, ping->to_ping[i].public_key); + ping_send_request(ping, ping->to_ping[i].ip_port, ping->to_ping[i].public_key); ip_reset(&ping->to_ping[i].ip_port.ip); } @@ -351,9 +351,9 @@ void do_to_ping(PING *ping) } -PING *new_ping(DHT *dht) +Ping *ping_new(DHT *dht) { - PING *ping = (PING *)calloc(1, sizeof(PING)); + Ping *ping = (Ping *)calloc(1, sizeof(Ping)); if (ping == NULL) { return NULL; @@ -373,7 +373,7 @@ PING *new_ping(DHT *dht) return ping; } -void kill_ping(PING *ping) +void ping_kill(Ping *ping) { networking_registerhandler(ping->dht->net, NET_PACKET_PING_REQUEST, NULL, NULL); networking_registerhandler(ping->dht->net, NET_PACKET_PING_RESPONSE, NULL, NULL); diff --git a/toxcore/ping.h b/toxcore/ping.h index cc3428c5..61875a0b 100644 --- a/toxcore/ping.h +++ b/toxcore/ping.h @@ -31,9 +31,26 @@ #include -typedef struct PING PING; +#ifndef IP_PORT_DEFINED +#define IP_PORT_DEFINED +typedef struct IP_Port IP_Port; +#endif /* IP_PORT_DEFINED */ -/* Add nodes to the to_ping list. +#ifndef DHT_DEFINED +#define DHT_DEFINED +typedef struct DHT DHT; +#endif /* DHT_DEFINED */ + +#ifndef PING_DEFINED +#define PING_DEFINED +typedef struct Ping Ping; +#endif /* PING_DEFINED */ + +Ping *ping_new(DHT *dht); + +void ping_kill(Ping *ping); + +/** Add nodes to the to_ping list. * All nodes in this list are pinged every TIME_TOPING seconds * and are then removed from the list. * If the list is full the nodes farthest from our public_key are replaced. @@ -43,12 +60,10 @@ typedef struct PING PING; * return 0 if node was added. * return -1 if node was not added. */ -int add_to_ping(PING *ping, const uint8_t *public_key, IP_Port ip_port); -void do_to_ping(PING *ping); +int32_t ping_add(Ping *ping, const uint8_t *public_key, struct IP_Port ip_port); -PING *new_ping(DHT *dht); -void kill_ping(PING *ping); +void ping_iterate(Ping *ping); -int send_ping_request(PING *ping, IP_Port ipp, const uint8_t *public_key); +int32_t ping_send_request(Ping *ping, struct IP_Port ipp, const uint8_t *public_key); #endif /* PING_H */