diff options
-rw-r--r-- | toxcore/net_crypto.c | 39 | ||||
-rw-r--r-- | toxcore/net_crypto.h | 11 | ||||
-rw-r--r-- | toxcore/onion_client.c | 10 |
3 files changed, 48 insertions, 12 deletions
diff --git a/toxcore/net_crypto.c b/toxcore/net_crypto.c index 8af3cbbc..112931ad 100644 --- a/toxcore/net_crypto.c +++ b/toxcore/net_crypto.c | |||
@@ -2039,29 +2039,50 @@ int add_tcp_relay(Net_Crypto *c, IP_Port ip_port, const uint8_t *public_key) | |||
2039 | return -1; | 2039 | return -1; |
2040 | } | 2040 | } |
2041 | 2041 | ||
2042 | /* Send an onion packet via a random connected TCP relay. | 2042 | /* Return a random TCP connection number for use in send_tcp_onion_request. |
2043 | * | 2043 | * |
2044 | * return 0 on success. | 2044 | * TODO: This number is just the index of an array that the elements can |
2045 | * change without warning. | ||
2046 | * | ||
2047 | * return TCP connection number on success. | ||
2045 | * return -1 on failure. | 2048 | * return -1 on failure. |
2046 | */ | 2049 | */ |
2047 | int send_tcp_onion_request(Net_Crypto *c, const uint8_t *data, uint16_t length) | 2050 | int get_random_tcp_con_number(Net_Crypto *c) |
2048 | { | 2051 | { |
2049 | unsigned int i, r = rand(); | 2052 | unsigned int i, r = rand(); |
2050 | 2053 | ||
2051 | for (i = 0; i < MAX_TCP_CONNECTIONS; ++i) { | 2054 | for (i = 0; i < MAX_TCP_CONNECTIONS; ++i) { |
2052 | if (c->tcp_connections[(i + r) % MAX_TCP_CONNECTIONS]) { | 2055 | if (c->tcp_connections[(i + r) % MAX_TCP_CONNECTIONS]) { |
2053 | pthread_mutex_lock(&c->tcp_mutex); | 2056 | return (i + r) % MAX_TCP_CONNECTIONS; |
2054 | int ret = send_onion_request(c->tcp_connections[(i + r) % MAX_TCP_CONNECTIONS], data, length); | ||
2055 | pthread_mutex_unlock(&c->tcp_mutex); | ||
2056 | |||
2057 | if (ret == 1) | ||
2058 | return 0; | ||
2059 | } | 2057 | } |
2060 | } | 2058 | } |
2061 | 2059 | ||
2062 | return -1; | 2060 | return -1; |
2063 | } | 2061 | } |
2064 | 2062 | ||
2063 | /* Send an onion packet via the TCP relay corresponding to TCP_conn_number. | ||
2064 | * | ||
2065 | * return 0 on success. | ||
2066 | * return -1 on failure. | ||
2067 | */ | ||
2068 | int send_tcp_onion_request(Net_Crypto *c, unsigned int TCP_conn_number, const uint8_t *data, uint16_t length) | ||
2069 | { | ||
2070 | if (TCP_conn_number > MAX_TCP_CONNECTIONS) { | ||
2071 | return -1; | ||
2072 | } | ||
2073 | |||
2074 | if (c->tcp_connections[TCP_conn_number]) { | ||
2075 | pthread_mutex_lock(&c->tcp_mutex); | ||
2076 | int ret = send_onion_request(c->tcp_connections[TCP_conn_number], data, length); | ||
2077 | pthread_mutex_unlock(&c->tcp_mutex); | ||
2078 | |||
2079 | if (ret == 1) | ||
2080 | return 0; | ||
2081 | } | ||
2082 | |||
2083 | return -1; | ||
2084 | } | ||
2085 | |||
2065 | /* Set the function to be called when an onion response packet is received by one of the TCP connections. | 2086 | /* Set the function to be called when an onion response packet is received by one of the TCP connections. |
2066 | */ | 2087 | */ |
2067 | void tcp_onion_response_handler(Net_Crypto *c, int (*tcp_onion_callback)(void *object, const uint8_t *data, | 2088 | void tcp_onion_response_handler(Net_Crypto *c, int (*tcp_onion_callback)(void *object, const uint8_t *data, |
diff --git a/toxcore/net_crypto.h b/toxcore/net_crypto.h index b9fb1747..9d699340 100644 --- a/toxcore/net_crypto.h +++ b/toxcore/net_crypto.h | |||
@@ -364,12 +364,19 @@ int add_tcp_relay(Net_Crypto *c, IP_Port ip_port, const uint8_t *public_key); | |||
364 | void tcp_onion_response_handler(Net_Crypto *c, int (*tcp_onion_callback)(void *object, const uint8_t *data, | 364 | void tcp_onion_response_handler(Net_Crypto *c, int (*tcp_onion_callback)(void *object, const uint8_t *data, |
365 | uint16_t length), void *object); | 365 | uint16_t length), void *object); |
366 | 366 | ||
367 | /* Send an onion packet via a random connected TCP relay. | 367 | /* Return a random TCP connection number for use in send_tcp_onion_request. |
368 | * | ||
369 | * return TCP connection number on success. | ||
370 | * return -1 on failure. | ||
371 | */ | ||
372 | int get_random_tcp_con_number(Net_Crypto *c); | ||
373 | |||
374 | /* Send an onion packet via the TCP relay corresponding to TCP_conn_number. | ||
368 | * | 375 | * |
369 | * return 0 on success. | 376 | * return 0 on success. |
370 | * return -1 on failure. | 377 | * return -1 on failure. |
371 | */ | 378 | */ |
372 | int send_tcp_onion_request(Net_Crypto *c, const uint8_t *data, uint16_t length); | 379 | int send_tcp_onion_request(Net_Crypto *c, unsigned int TCP_conn_number, const uint8_t *data, uint16_t length); |
373 | 380 | ||
374 | /* Copy a maximum of num TCP relays we are connected to to tcp_relays. | 381 | /* Copy a maximum of num TCP relays we are connected to to tcp_relays. |
375 | * NOTE that the family of the copied ip ports will be set to TCP_INET or TCP_INET6. | 382 | * NOTE that the family of the copied ip ports will be set to TCP_INET or TCP_INET6. |
diff --git a/toxcore/onion_client.c b/toxcore/onion_client.c index f8d7630b..a9eb16a0 100644 --- a/toxcore/onion_client.c +++ b/toxcore/onion_client.c | |||
@@ -140,8 +140,15 @@ static uint16_t random_nodes_path_onion(const Onion_Client *onion_c, Node_format | |||
140 | nodes[i] = onion_c->path_nodes[rand() % num_nodes]; | 140 | nodes[i] = onion_c->path_nodes[rand() % num_nodes]; |
141 | } | 141 | } |
142 | } else { | 142 | } else { |
143 | int random_tcp = get_random_tcp_con_number(onion_c->c); | ||
144 | |||
145 | if (random_tcp == -1) { | ||
146 | return 0; | ||
147 | } | ||
148 | |||
143 | if (num_nodes >= 2) { | 149 | if (num_nodes >= 2) { |
144 | nodes[0].ip_port.ip.family = TCP_FAMILY; | 150 | nodes[0].ip_port.ip.family = TCP_FAMILY; |
151 | nodes[0].ip_port.ip.ip4.uint32 = random_tcp; | ||
145 | 152 | ||
146 | for (i = 1; i < max_num; ++i) { | 153 | for (i = 1; i < max_num; ++i) { |
147 | nodes[i] = onion_c->path_nodes[rand() % num_nodes]; | 154 | nodes[i] = onion_c->path_nodes[rand() % num_nodes]; |
@@ -154,6 +161,7 @@ static uint16_t random_nodes_path_onion(const Onion_Client *onion_c, Node_format | |||
154 | return 0; | 161 | return 0; |
155 | 162 | ||
156 | nodes[0].ip_port.ip.family = TCP_FAMILY; | 163 | nodes[0].ip_port.ip.family = TCP_FAMILY; |
164 | nodes[0].ip_port.ip.ip4.uint32 = random_tcp; | ||
157 | 165 | ||
158 | for (i = 1; i < max_num; ++i) { | 166 | for (i = 1; i < max_num; ++i) { |
159 | nodes[i] = onion_c->path_nodes_bs[rand() % num_nodes_bs]; | 167 | nodes[i] = onion_c->path_nodes_bs[rand() % num_nodes_bs]; |
@@ -301,7 +309,7 @@ static int send_onion_packet_tcp_udp(const Onion_Client *onion_c, const Onion_Pa | |||
301 | if (len == -1) | 309 | if (len == -1) |
302 | return -1; | 310 | return -1; |
303 | 311 | ||
304 | return send_tcp_onion_request(onion_c->c, packet, len); | 312 | return send_tcp_onion_request(onion_c->c, path->ip_port1.ip.ip4.uint32, packet, len); |
305 | } else { | 313 | } else { |
306 | return -1; | 314 | return -1; |
307 | } | 315 | } |