summaryrefslogtreecommitdiff
path: root/toxcore/net_crypto.c
diff options
context:
space:
mode:
Diffstat (limited to 'toxcore/net_crypto.c')
-rw-r--r--toxcore/net_crypto.c58
1 files changed, 30 insertions, 28 deletions
diff --git a/toxcore/net_crypto.c b/toxcore/net_crypto.c
index bae5ee19..f4c6335b 100644
--- a/toxcore/net_crypto.c
+++ b/toxcore/net_crypto.c
@@ -35,19 +35,19 @@
35 35
36#include "util.h" 36#include "util.h"
37 37
38typedef struct { 38typedef struct Packet_Data {
39 uint64_t sent_time; 39 uint64_t sent_time;
40 uint16_t length; 40 uint16_t length;
41 uint8_t data[MAX_CRYPTO_DATA_SIZE]; 41 uint8_t data[MAX_CRYPTO_DATA_SIZE];
42} Packet_Data; 42} Packet_Data;
43 43
44typedef struct { 44typedef struct Packets_Array {
45 Packet_Data *buffer[CRYPTO_PACKET_BUFFER_SIZE]; 45 Packet_Data *buffer[CRYPTO_PACKET_BUFFER_SIZE];
46 uint32_t buffer_start; 46 uint32_t buffer_start;
47 uint32_t buffer_end; /* packet numbers in array: {buffer_start, buffer_end) */ 47 uint32_t buffer_end; /* packet numbers in array: {buffer_start, buffer_end) */
48} Packets_Array; 48} Packets_Array;
49 49
50typedef struct { 50typedef struct Crypto_Connection {
51 uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE]; /* The real public key of the peer. */ 51 uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE]; /* The real public key of the peer. */
52 uint8_t recv_nonce[CRYPTO_NONCE_SIZE]; /* Nonce of received packets. */ 52 uint8_t recv_nonce[CRYPTO_NONCE_SIZE]; /* Nonce of received packets. */
53 uint8_t sent_nonce[CRYPTO_NONCE_SIZE]; /* Nonce of sent packets. */ 53 uint8_t sent_nonce[CRYPTO_NONCE_SIZE]; /* Nonce of sent packets. */
@@ -62,7 +62,7 @@ typedef struct {
62 * 3 if connection is not confirmed yet (we have received a handshake but no data packets yet), 62 * 3 if connection is not confirmed yet (we have received a handshake but no data packets yet),
63 * 4 if the connection is established. 63 * 4 if the connection is established.
64 */ 64 */
65 CRYPTO_CONN_STATE status; 65 Crypto_Conn_State status;
66 uint64_t cookie_request_number; /* number used in the cookie request packets for this connection */ 66 uint64_t cookie_request_number; /* number used in the cookie request packets for this connection */
67 uint8_t dht_public_key[CRYPTO_PUBLIC_KEY_SIZE]; /* The dht public key of the peer */ 67 uint8_t dht_public_key[CRYPTO_PUBLIC_KEY_SIZE]; /* The dht public key of the peer */
68 68
@@ -81,15 +81,15 @@ typedef struct {
81 Packets_Array send_array; 81 Packets_Array send_array;
82 Packets_Array recv_array; 82 Packets_Array recv_array;
83 83
84 int (*connection_status_callback)(void *object, int id, uint8_t status, void *userdata); 84 connection_status_cb *connection_status_callback;
85 void *connection_status_callback_object; 85 void *connection_status_callback_object;
86 int connection_status_callback_id; 86 int connection_status_callback_id;
87 87
88 int (*connection_data_callback)(void *object, int id, const uint8_t *data, uint16_t length, void *userdata); 88 connection_data_cb *connection_data_callback;
89 void *connection_data_callback_object; 89 void *connection_data_callback_object;
90 int connection_data_callback_id; 90 int connection_data_callback_id;
91 91
92 int (*connection_lossy_data_callback)(void *object, int id, const uint8_t *data, uint16_t length, void *userdata); 92 connection_lossy_data_cb *connection_lossy_data_callback;
93 void *connection_lossy_data_callback_object; 93 void *connection_lossy_data_callback_object;
94 int connection_lossy_data_callback_id; 94 int connection_lossy_data_callback_id;
95 95
@@ -110,10 +110,12 @@ typedef struct {
110 uint64_t last_packets_left_requested_set; 110 uint64_t last_packets_left_requested_set;
111 double last_packets_left_requested_rem; 111 double last_packets_left_requested_rem;
112 112
113 uint32_t last_sendqueue_size[CONGESTION_QUEUE_ARRAY_SIZE], last_sendqueue_counter; 113 uint32_t last_sendqueue_size[CONGESTION_QUEUE_ARRAY_SIZE];
114 long signed int last_num_packets_sent[CONGESTION_LAST_SENT_ARRAY_SIZE], 114 uint32_t last_sendqueue_counter;
115 last_num_packets_resent[CONGESTION_LAST_SENT_ARRAY_SIZE]; 115 long signed int last_num_packets_sent[CONGESTION_LAST_SENT_ARRAY_SIZE];
116 uint32_t packets_sent, packets_resent; 116 long signed int last_num_packets_resent[CONGESTION_LAST_SENT_ARRAY_SIZE];
117 uint32_t packets_sent;
118 uint32_t packets_resent;
117 uint64_t last_congestion_event; 119 uint64_t last_congestion_event;
118 uint64_t rtt_time; 120 uint64_t rtt_time;
119 121
@@ -124,7 +126,7 @@ typedef struct {
124 126
125 pthread_mutex_t mutex; 127 pthread_mutex_t mutex;
126 128
127 void (*dht_pk_callback)(void *data, int32_t number, const uint8_t *dht_public_key, void *userdata); 129 dht_pk_cb *dht_pk_callback;
128 void *dht_pk_callback_object; 130 void *dht_pk_callback_object;
129 uint32_t dht_pk_callback_number; 131 uint32_t dht_pk_callback_number;
130} Crypto_Connection; 132} Crypto_Connection;
@@ -150,7 +152,7 @@ struct Net_Crypto {
150 /* The secret key used for cookies */ 152 /* The secret key used for cookies */
151 uint8_t secret_symmetric_key[CRYPTO_SYMMETRIC_KEY_SIZE]; 153 uint8_t secret_symmetric_key[CRYPTO_SYMMETRIC_KEY_SIZE];
152 154
153 int (*new_connection_callback)(void *object, New_Connection *n_c); 155 new_connection_cb *new_connection_callback;
154 void *new_connection_callback_object; 156 void *new_connection_callback_object;
155 157
156 /* The current optimal sleep time */ 158 /* The current optimal sleep time */
@@ -1863,8 +1865,7 @@ static int crypto_connection_add_source(Net_Crypto *c, int crypt_connection_id,
1863 * 1865 *
1864 * n_c is only valid for the duration of the function call. 1866 * n_c is only valid for the duration of the function call.
1865 */ 1867 */
1866void new_connection_handler(Net_Crypto *c, int (*new_connection_callback)(void *object, New_Connection *n_c), 1868void new_connection_handler(Net_Crypto *c, new_connection_cb *new_connection_callback, void *object)
1867 void *object)
1868{ 1869{
1869 c->new_connection_callback = new_connection_callback; 1870 c->new_connection_callback = new_connection_callback;
1870 c->new_connection_callback_object = object; 1871 c->new_connection_callback_object = object;
@@ -2267,7 +2268,7 @@ static void do_tcp(Net_Crypto *c, void *userdata)
2267 * return 0 on success. 2268 * return 0 on success.
2268 */ 2269 */
2269int connection_status_handler(const Net_Crypto *c, int crypt_connection_id, 2270int connection_status_handler(const Net_Crypto *c, int crypt_connection_id,
2270 int (*connection_status_callback)(void *object, int id, uint8_t status, void *userdata), void *object, int id) 2271 connection_status_cb *connection_status_callback, void *object, int id)
2271{ 2272{
2272 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); 2273 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
2273 2274
@@ -2289,8 +2290,8 @@ int connection_status_handler(const Net_Crypto *c, int crypt_connection_id,
2289 * return -1 on failure. 2290 * return -1 on failure.
2290 * return 0 on success. 2291 * return 0 on success.
2291 */ 2292 */
2292int connection_data_handler(const Net_Crypto *c, int crypt_connection_id, int (*connection_data_callback)(void *object, 2293int connection_data_handler(const Net_Crypto *c, int crypt_connection_id,
2293 int id, const uint8_t *data, uint16_t length, void *userdata), void *object, int id) 2294 connection_data_cb *connection_data_callback, void *object, int id)
2294{ 2295{
2295 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); 2296 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
2296 2297
@@ -2313,7 +2314,7 @@ int connection_data_handler(const Net_Crypto *c, int crypt_connection_id, int (*
2313 * return 0 on success. 2314 * return 0 on success.
2314 */ 2315 */
2315int connection_lossy_data_handler(Net_Crypto *c, int crypt_connection_id, 2316int connection_lossy_data_handler(Net_Crypto *c, int crypt_connection_id,
2316 int (*connection_lossy_data_callback)(void *object, int id, const uint8_t *data, uint16_t length, void *userdata), 2317 connection_lossy_data_cb *connection_lossy_data_callback,
2317 void *object, int id) 2318 void *object, int id)
2318{ 2319{
2319 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); 2320 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
@@ -2339,8 +2340,7 @@ int connection_lossy_data_handler(Net_Crypto *c, int crypt_connection_id,
2339 * return -1 on failure. 2340 * return -1 on failure.
2340 * return 0 on success. 2341 * return 0 on success.
2341 */ 2342 */
2342int nc_dht_pk_callback(Net_Crypto *c, int crypt_connection_id, void (*function)(void *data, int32_t number, 2343int nc_dht_pk_callback(Net_Crypto *c, int crypt_connection_id, dht_pk_cb *function, void *object, uint32_t number)
2343 const uint8_t *dht_public_key, void *userdata), void *object, uint32_t number)
2344{ 2344{
2345 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); 2345 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
2346 2346
@@ -2523,9 +2523,8 @@ static void send_crypto_packets(Net_Crypto *c)
2523 bool direct_connected = 0; 2523 bool direct_connected = 0;
2524 crypto_connection_status(c, i, &direct_connected, nullptr); 2524 crypto_connection_status(c, i, &direct_connected, nullptr);
2525 2525
2526 if (direct_connected && conn->last_tcp_sent + CONGESTION_EVENT_TIMEOUT > temp_time) { 2526 /* When switching from TCP to UDP, don't change the packet send rate for CONGESTION_EVENT_TIMEOUT ms. */
2527 /* When switching from TCP to UDP, don't change the packet send rate for CONGESTION_EVENT_TIMEOUT ms. */ 2527 if (!(direct_connected && conn->last_tcp_sent + CONGESTION_EVENT_TIMEOUT > temp_time)) {
2528 } else {
2529 long signed int total_sent = 0, total_resent = 0; 2528 long signed int total_sent = 0, total_resent = 0;
2530 2529
2531 // TODO(irungentoo): use real delay 2530 // TODO(irungentoo): use real delay
@@ -2586,8 +2585,10 @@ static void send_crypto_packets(Net_Crypto *c)
2586 } 2585 }
2587 2586
2588 if (conn->last_packets_left_set == 0 || conn->last_packets_left_requested_set == 0) { 2587 if (conn->last_packets_left_set == 0 || conn->last_packets_left_requested_set == 0) {
2589 conn->last_packets_left_requested_set = conn->last_packets_left_set = temp_time; 2588 conn->last_packets_left_requested_set = temp_time;
2590 conn->packets_left_requested = conn->packets_left = CRYPTO_MIN_QUEUE_LENGTH; 2589 conn->last_packets_left_set = temp_time;
2590 conn->packets_left_requested = CRYPTO_MIN_QUEUE_LENGTH;
2591 conn->packets_left = CRYPTO_MIN_QUEUE_LENGTH;
2591 } else { 2592 } else {
2592 if (((uint64_t)((1000.0 / conn->packet_send_rate) + 0.5) + conn->last_packets_left_set) <= temp_time) { 2593 if (((uint64_t)((1000.0 / conn->packet_send_rate) + 0.5) + conn->last_packets_left_set) <= temp_time) {
2593 double n_packets = conn->packet_send_rate * (((double)(temp_time - conn->last_packets_left_set)) / 1000.0); 2594 double n_packets = conn->packet_send_rate * (((double)(temp_time - conn->last_packets_left_set)) / 1000.0);
@@ -2740,7 +2741,7 @@ int64_t write_cryptpacket(Net_Crypto *c, int crypt_connection_id, const uint8_t
2740 if (congestion_control) { 2741 if (congestion_control) {
2741 --conn->packets_left; 2742 --conn->packets_left;
2742 --conn->packets_left_requested; 2743 --conn->packets_left_requested;
2743 conn->packets_sent++; 2744 ++conn->packets_sent;
2744 } 2745 }
2745 2746
2746 return ret; 2747 return ret;
@@ -2868,7 +2869,7 @@ int crypto_kill(Net_Crypto *c, int crypt_connection_id)
2868 * sets direct_connected to 1 if connection connects directly to other, 0 if it isn't. 2869 * sets direct_connected to 1 if connection connects directly to other, 0 if it isn't.
2869 * sets online_tcp_relays to the number of connected tcp relays this connection has. 2870 * sets online_tcp_relays to the number of connected tcp relays this connection has.
2870 */ 2871 */
2871CRYPTO_CONN_STATE crypto_connection_status(const Net_Crypto *c, int crypt_connection_id, bool *direct_connected, 2872Crypto_Conn_State crypto_connection_status(const Net_Crypto *c, int crypt_connection_id, bool *direct_connected,
2872 unsigned int *online_tcp_relays) 2873 unsigned int *online_tcp_relays)
2873{ 2874{
2874 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); 2875 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id);
@@ -3002,6 +3003,7 @@ static void kill_timedout(Net_Crypto *c, void *userdata)
3002 3003
3003 if (conn->status == CRYPTO_CONN_ESTABLISHED) { 3004 if (conn->status == CRYPTO_CONN_ESTABLISHED) {
3004 // TODO(irungentoo): add a timeout here? 3005 // TODO(irungentoo): add a timeout here?
3006 do_timeout_here();
3005 } 3007 }
3006 3008
3007#endif 3009#endif