summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--other/bootstrap_serverdaemon/Makefile.inc12
-rw-r--r--other/bootstrap_serverdaemon/README.md22
-rw-r--r--other/bootstrap_serverdaemon/conf39
-rw-r--r--other/bootstrap_serverdaemon/tox_bootstrap_daemon.c (renamed from other/bootstrap_serverdaemon/tox_dht_bootstrap_server_daemon.c)96
-rw-r--r--other/bootstrap_serverdaemon/tox_bootstrap_daemon.sh (renamed from other/bootstrap_serverdaemon/tox_dht_bootstrap_server_daemon.sh)11
-rw-r--r--toxcore/DHT.c23
-rw-r--r--toxcore/DHT.h3
-rw-r--r--toxcore/ping.c2
8 files changed, 109 insertions, 99 deletions
diff --git a/other/bootstrap_serverdaemon/Makefile.inc b/other/bootstrap_serverdaemon/Makefile.inc
index 5ab17b56..effe59e8 100644
--- a/other/bootstrap_serverdaemon/Makefile.inc
+++ b/other/bootstrap_serverdaemon/Makefile.inc
@@ -1,17 +1,17 @@
1if BUILD_DHT_BOOTSTRAP_DAEMON 1if BUILD_DHT_BOOTSTRAP_DAEMON
2 2
3noinst_PROGRAMS += tox_dht_bootstrap_server_daemon 3noinst_PROGRAMS += tox_bootstrap_daemon
4 4
5tox_dht_bootstrap_server_daemon_SOURCES = \ 5tox_bootstrap_daemon_SOURCES = \
6 ../other/bootstrap_serverdaemon/tox_dht_bootstrap_server_daemon.c 6 ../other/bootstrap_serverdaemon/tox_bootstrap_daemon.c
7 7
8tox_dht_bootstrap_server_daemon_CFLAGS = \ 8tox_bootstrap_daemon_CFLAGS = \
9 -I$(top_srcdir)/other/bootstrap_serverdaemon \ 9 -I$(top_srcdir)/other/bootstrap_serverdaemon \
10 $(LIBSODIUM_CFLAGS) \ 10 $(LIBSODIUM_CFLAGS) \
11 $(NACL_CFLAGS) \ 11 $(NACL_CFLAGS) \
12 $(LIBCONFIG_CFLAGS) 12 $(LIBCONFIG_CFLAGS)
13 13
14tox_dht_bootstrap_server_daemon_LDADD = \ 14tox_bootstrap_daemon_LDADD = \
15 $(LIBSODIUM_LDFLAGS) \ 15 $(LIBSODIUM_LDFLAGS) \
16 $(NACL_LDFLAGS) \ 16 $(NACL_LDFLAGS) \
17 libtoxcore.la \ 17 libtoxcore.la \
@@ -23,5 +23,5 @@ endif
23 23
24EXTRA_DIST += \ 24EXTRA_DIST += \
25 $(top_srcdir)/other/bootstrap_serverdaemon/conf \ 25 $(top_srcdir)/other/bootstrap_serverdaemon/conf \
26 $(top_srcdir)/other/bootstrap_serverdaemon/tox_dht_bootstrap_server_daemon.sh 26 $(top_srcdir)/other/bootstrap_serverdaemon/tox_bootstrap_daemon.sh
27 \ No newline at end of file 27 \ No newline at end of file
diff --git a/other/bootstrap_serverdaemon/README.md b/other/bootstrap_serverdaemon/README.md
index 30cb14aa..53a25cdb 100644
--- a/other/bootstrap_serverdaemon/README.md
+++ b/other/bootstrap_serverdaemon/README.md
@@ -2,44 +2,44 @@
2 2
3The following commands are to be executed as root: 3The following commands are to be executed as root:
4 4
51. In `tox_dht_bootstrap_server_daemon.sh` file change: 51. In `tox_bootstrap_daemon.sh` file change:
6 - `CFG` to where your config file (`conf`) will be; read rights required 6 - `CFG` to where your config file (`conf`) will be; read rights required
7 - `DAEMON` to point to the executable 7 - `DAEMON` to point to the executable
8 - `PIDFILE` to point to a pid file daemon would have rights to create 8 - `PIDFILE` to point to a pid file daemon would have rights to create
9 9
102. Go over everything in `conf`. Make sure `pid_file_path` matches `PIDFILE` from `tox_dht_bootstrap_server_daemon.sh` 102. Go over everything in `conf`. Make sure `pid_file_path` matches `PIDFILE` from `tox_bootstrap_daemon.sh`
11 11
123. Execute: 123. Execute:
13``` 13```
14mv tox_dht_bootstrap_server_daemon.sh /etc/init.d/tox_dht_bootstrap_server_daemon 14mv tox_bootstrap_daemon.sh /etc/init.d/tox_bootstrap_daemon
15``` 15```
16*(note that we removed `.sh` ending)* 16*(note that we removed `.sh` ending)*
17 17
184. Give the right permissions to this file: 184. Give the right permissions to this file:
19``` 19```
20chmod 755 /etc/init.d/tox_dht_bootstrap_server_daemon 20chmod 755 /etc/init.d/tox_bootstrap_daemon
21``` 21```
22 22
235. Execute: 235. Execute:
24``` 24```
25update-rc.d tox_dht_bootstrap_server_daemon defaults 25update-rc.d tox_bootstrap_daemon defaults
26``` 26```
27 27
286. Start the service: 286. Start the service:
29``` 29```
30service tox_dht_bootstrap_server_daemon start 30service tox_bootstrap_daemon start
31``` 31```
32 32
337. Verify that the service is running: 337. Verify that the service is running:
34``` 34```
35service tox_dht_bootstrap_server_daemon status 35service tox_bootstrap_daemon status
36``` 36```
37 37
38-- 38--
39 39
40You can see daemon's log with 40You can see daemon's log with
41``` 41```
42grep "tox_dht_bootstrap_server_daemon" /var/log/syslog 42grep "tox_bootstrap_daemon" /var/log/syslog
43``` 43```
44 44
45**Note that system log is where you find your public key** 45**Note that system log is where you find your public key**
@@ -50,12 +50,12 @@ grep "tox_dht_bootstrap_server_daemon" /var/log/syslog
50 50
511. Check the log for errors with 511. Check the log for errors with
52``` 52```
53grep "tox_dht_bootstrap_server_daemon" /var/log/syslog 53grep "tox_bootstrap_daemon" /var/log/syslog
54``` 54```
55 55
562. Check that paths in the beginning of `/etc/init.d/tox_dht_bootstrap_server_daemon` are valid 562. Check that paths in the beginning of `/etc/init.d/tox_bootstrap_daemon` are valid
57 57
583. Make sure that `PIDFILE` from `/etc/init.d/tox_dht_bootstrap_server_daemon` matches with the `pid_file_path` from `conf` 583. Make sure that `PIDFILE` from `/etc/init.d/tox_bootstrap_daemon` matches with the `pid_file_path` from `conf`
59 59
604. Make sure you have write permission to keys and pid files 604. Make sure you have write permission to keys and pid files
61 61
diff --git a/other/bootstrap_serverdaemon/conf b/other/bootstrap_serverdaemon/conf
index 70dbdb14..8451d9a0 100644
--- a/other/bootstrap_serverdaemon/conf
+++ b/other/bootstrap_serverdaemon/conf
@@ -1,33 +1,34 @@
1// ProjectTox bootstrap server configuration file 1// ProjectTox dht bootstrap server daemon configuration file.
2 2
3// listening port 3// Listening port.
4port = 33445 4port = 33445
5 5
6// The key file is like a password, so keep it where no one can read it 6// The key file is like a password, so keep it where no one can read it.
7// The daemon should have permission to read/write to it 7// The daemon should have permission to read/write to it.
8// Remember to replace the provided example with 8// Remember to replace the provided example with your own path.
9// your own path 9keys_file_path = "/home/tom/.tox_bootstrap_daemon/keys"
10keys_file_path = "/home/tom/.tox_dht_bootstrap_server_daemon/keys"
11 10
12// The PID file written to by daemon, 11// The PID file written to by daemon.
13// make sure that the user who runs the server 12// Make sure that the user who runs the daemon has permissions to write to the
14// does have permissions to write to it 13// PID file.
15// Remember to replace the provided example with 14// Remember to replace the provided example with your own path.
16// your own path 15pid_file_path = "/home/tom/.tox_bootstrap_daemon/pid"
17pid_file_path = "/home/tom/.tox_dht_bootstrap_server_daemon/pid"
18 16
17// Enable IPv6.
19enable_ipv6 = false 18enable_ipv6 = false
20 19
21// Automatically bootstrap with nodes on local network 20// Automatically bootstrap with nodes on local area network.
22enable_lan_discovery = true 21enable_lan_discovery = true
23 22
24// Any number of nodes the daemon will bootstrap itself from 23// Any number of servers the daemon will bootstrap itself from.
25// Remember to replace the provided example with 24// Remember to replace the provided example with your own server list.
26// your own server list 25// You may leave the list empty or remove "bootstrap_servers" complitely,
26// in both cases this will be interpreted as if you don't want to bootstrap
27// from anyone.
27bootstrap_servers = ( 28bootstrap_servers = (
28 { // Server 1 29 { // Server 1
29 // any ipv4 or ipv6, depending if `enable_ipv6` is set or not 30 // Any ipv4 or ipv6, depending if `enable_ipv6` is set or not, and also
30 // also any US-ASCII domain name 31 // any US-ASCII domain name.
31 address = "198.46.136.167" 32 address = "198.46.136.167"
32 port = 33445 33 port = 33445
33 public_key = "728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854" 34 public_key = "728925473812C7AAC482BE7250BCCAD0B8CB9F737BF3D42ABD34459C1768F854"
diff --git a/other/bootstrap_serverdaemon/tox_dht_bootstrap_server_daemon.c b/other/bootstrap_serverdaemon/tox_bootstrap_daemon.c
index 24bb8266..e82e49cd 100644
--- a/other/bootstrap_serverdaemon/tox_dht_bootstrap_server_daemon.c
+++ b/other/bootstrap_serverdaemon/tox_bootstrap_daemon.c
@@ -1,6 +1,6 @@
1/* tox_dht_bootstrap_server_daemon 1/* tox_bootstrap_daemon.c
2 * 2 *
3 * A simple DHT bootstrap server for tox - daemon edition. 3 * Tox DHT bootstrap server daemon.
4 * 4 *
5 * Copyright (C) 2014 Tox project All Rights Reserved. 5 * Copyright (C) 2014 Tox project All Rights Reserved.
6 * 6 *
@@ -42,13 +42,13 @@
42 42
43#include "../../testing/misc_tools.c" 43#include "../../testing/misc_tools.c"
44 44
45#define DAEMON_NAME "tox_dht_bootstrap_server_daemon" 45#define DAEMON_NAME "tox_bootstrap_daemon"
46 46
47#define SLEEP_TIME_MILLISECONDS 30 47#define SLEEP_TIME_MILLISECONDS 30
48#define sleep usleep(1000*SLEEP_TIME_MILLISECONDS) 48#define sleep usleep(1000*SLEEP_TIME_MILLISECONDS)
49 49
50#define DEFAULT_PID_FILE_PATH ".tox_dht_bootstrap_server_daemon.pid" 50#define DEFAULT_PID_FILE_PATH ".tox_bootstrap_daemon.pid"
51#define DEFAULT_KEYS_FILE_PATH ".tox_dht_bootstrap_server_daemon.keys" 51#define DEFAULT_KEYS_FILE_PATH ".tox_bootstrap_daemon.keys"
52#define DEFAULT_PORT 33445 52#define DEFAULT_PORT 33445
53#define DEFAULT_ENABLE_IPV6 0 // 1 - true, 0 - false 53#define DEFAULT_ENABLE_IPV6 0 // 1 - true, 0 - false
54#define DEFAULT_ENABLE_LAN_DISCOVERY 1 // 1 - true, 0 - false 54#define DEFAULT_ENABLE_LAN_DISCOVERY 1 // 1 - true, 0 - false
@@ -186,8 +186,8 @@ int get_general_config(char *cfg_file_path, char **pid_file_path, char **keys_fi
186 186
187// Bootstraps servers listed in the config file 187// Bootstraps servers listed in the config file
188// 188//
189// returns 1 on success 189// returns 1 on success, some or no bootstrap servers were added
190// 0 on failure, either no or only some servers were bootstrapped 190// 0 on failure, a error accured while parsing config file
191 191
192int bootstrap_from_config(char *cfg_file_path, DHT *dht, int enable_ipv6) 192int bootstrap_from_config(char *cfg_file_path, DHT *dht, int enable_ipv6)
193{ 193{
@@ -210,9 +210,15 @@ int bootstrap_from_config(char *cfg_file_path, DHT *dht, int enable_ipv6)
210 config_setting_t *server_list = config_lookup(&cfg, NAME_BOOTSTRAP_SERVERS); 210 config_setting_t *server_list = config_lookup(&cfg, NAME_BOOTSTRAP_SERVERS);
211 211
212 if (server_list == NULL) { 212 if (server_list == NULL) {
213 syslog(LOG_ERR, "No '%s' setting in configuration file.\n", NAME_BOOTSTRAP_SERVERS); 213 syslog(LOG_WARNING, "No '%s' setting in the configuration file. Skipping bootstrapping.\n", NAME_BOOTSTRAP_SERVERS);
214 config_destroy(&cfg); 214 config_destroy(&cfg);
215 return 0; 215 return 1;
216 }
217
218 if (config_setting_length(server_list) == 0) {
219 syslog(LOG_WARNING, "No bootstrap servers found. Skipping bootstrapping.\n");
220 config_destroy(&cfg);
221 return 1;
216 } 222 }
217 223
218 int bs_port; 224 int bs_port;
@@ -232,21 +238,31 @@ int bootstrap_from_config(char *cfg_file_path, DHT *dht, int enable_ipv6)
232 return 0; 238 return 0;
233 } 239 }
234 240
235 // Proceed only if all parts are present 241 // Check that all settings are present
236 if (config_setting_lookup_string(server, NAME_PUBLIC_KEY, &bs_public_key) == CONFIG_FALSE || 242 if (config_setting_lookup_string(server, NAME_PUBLIC_KEY, &bs_public_key) == CONFIG_FALSE) {
237 config_setting_lookup_int (server, NAME_PORT, &bs_port) == CONFIG_FALSE || 243 syslog(LOG_WARNING, "Bootstrap server #%d: Couldn't find '%s' setting. Skipping the server.\n", i, NAME_PUBLIC_KEY);
238 config_setting_lookup_string(server, NAME_ADDRESS, &bs_address) == CONFIG_FALSE ) {
239 goto next; 244 goto next;
240 } 245 }
241 246
247 if (config_setting_lookup_int(server, NAME_PORT, &bs_port) == CONFIG_FALSE) {
248 syslog(LOG_WARNING, "Bootstrap server #%d: Couldn't find '%s' setting. Skipping the server.\n", i, NAME_PORT);
249 goto next;
250 }
251
252 if (config_setting_lookup_string(server, NAME_ADDRESS, &bs_address) == CONFIG_FALSE) {
253 syslog(LOG_WARNING, "Bootstrap server #%d: Couldn't find '%s' setting. Skipping the server.\n", i, NAME_ADDRESS);
254 goto next;
255 }
256
257 // Process settings
242 if (strlen(bs_public_key) != 64) { 258 if (strlen(bs_public_key) != 64) {
243 syslog(LOG_WARNING, "bootstrap_server #%d: Invalid '%s': %s.\n", i, NAME_PUBLIC_KEY, bs_public_key); 259 syslog(LOG_WARNING, "Bootstrap server #%d: Invalid '%s': %s. Skipping the server.\n", i, NAME_PUBLIC_KEY, bs_public_key);
244 goto next; 260 goto next;
245 } 261 }
246 262
247 // not (1 <= port <= 65535) 263 // not (1 <= port <= 65535)
248 if (bs_port < 1 || bs_port > 65535) { 264 if (bs_port < 1 || bs_port > 65535) {
249 syslog(LOG_WARNING, "bootstrap_server #%d: Invalid '%s': %d.\n", i, NAME_PORT, bs_port); 265 syslog(LOG_WARNING, "Bootstrap server #%d: Invalid '%s': %d. Skipping the server.\n", i, NAME_PORT, bs_port);
250 goto next; 266 goto next;
251 } 267 }
252 268
@@ -254,11 +270,11 @@ int bootstrap_from_config(char *cfg_file_path, DHT *dht, int enable_ipv6)
254 hex_string_to_bin((char *)bs_public_key)); 270 hex_string_to_bin((char *)bs_public_key));
255 271
256 if (!address_resolved) { 272 if (!address_resolved) {
257 syslog(LOG_WARNING, "bootstrap_server #%d: Invalid '%s': %s.\n", i, NAME_ADDRESS, bs_address); 273 syslog(LOG_WARNING, "Bootstrap server #%d: Invalid '%s': %s. Skipping the server.\n", i, NAME_ADDRESS, bs_address);
258 goto next; 274 goto next;
259 } 275 }
260 276
261 syslog(LOG_DEBUG, "Successfully connected to %s:%d %s\n", bs_address, bs_port, bs_public_key); 277 syslog(LOG_DEBUG, "Successfully added bootstrap server #%d: %s:%d %s\n", i, bs_address, bs_port, bs_public_key);
262 278
263next: 279next:
264 // config_setting_lookup_string() allocates string inside and doesn't allow us to free it 280 // config_setting_lookup_string() allocates string inside and doesn't allow us to free it
@@ -273,36 +289,6 @@ next:
273 return 1; 289 return 1;
274} 290}
275 291
276// Checks if we are connected to the DHT
277//
278// returns 1 on success
279// 0 on failure
280
281int try_connect(DHT *dht, int port, int enable_lan_discovery)
282{
283 uint16_t htons_port = htons(port);
284
285 int i;
286
287 for (i = 0; i < 100; i ++) {
288 do_DHT(dht);
289
290 if (enable_lan_discovery) {
291 send_LANdiscovery(htons_port, dht);
292 }
293
294 networking_poll(dht->c->lossless_udp->net);
295
296 if (DHT_isconnected(dht)) {
297 return 1;
298 }
299
300 sleep;
301 }
302
303 return 0;
304}
305
306// Prints public key 292// Prints public key
307 293
308void print_public_key(uint8_t *public_key) 294void print_public_key(uint8_t *public_key)
@@ -330,7 +316,7 @@ int main(int argc, char *argv[])
330 openlog(DAEMON_NAME, LOG_NOWAIT | LOG_PID, LOG_DAEMON); 316 openlog(DAEMON_NAME, LOG_NOWAIT | LOG_PID, LOG_DAEMON);
331 317
332 if (argc < 2) { 318 if (argc < 2) {
333 syslog(LOG_ERR, "Please specify a configuration file. Exiting.\n"); 319 syslog(LOG_ERR, "Please specify a path to a configuration file as the first argument. Exiting.\n");
334 return 1; 320 return 1;
335 } 321 }
336 322
@@ -395,13 +381,6 @@ int main(int argc, char *argv[])
395 return 1; 381 return 1;
396 } 382 }
397 383
398 if (try_connect(dht, port, enable_lan_discovery)) {
399 syslog(LOG_INFO, "Successfully connected to DHT\n");
400 } else {
401 syslog(LOG_ERR, "Couldn't connect to the DHT. Check settings and network connections. Exiting.\n");
402 return 1;
403 }
404
405 print_public_key(dht->c->self_public_key); 384 print_public_key(dht->c->self_public_key);
406 385
407 // Write the PID file 386 // Write the PID file
@@ -454,6 +433,8 @@ int main(int argc, char *argv[])
454 uint64_t last_LANdiscovery = 0; 433 uint64_t last_LANdiscovery = 0;
455 uint16_t htons_port = htons(port); 434 uint16_t htons_port = htons(port);
456 435
436 int waiting_for_dht_connection = 1;
437
457 while (1) { 438 while (1) {
458 do_DHT(dht); 439 do_DHT(dht);
459 440
@@ -464,6 +445,11 @@ int main(int argc, char *argv[])
464 445
465 networking_poll(dht->net); 446 networking_poll(dht->net);
466 447
448 if (waiting_for_dht_connection && DHT_isconnected(dht)) {
449 syslog(LOG_DEBUG, "Connected to other bootstrap server successfully.\n");
450 waiting_for_dht_connection = 0;
451 }
452
467 sleep; 453 sleep;
468 } 454 }
469 455
diff --git a/other/bootstrap_serverdaemon/tox_dht_bootstrap_server_daemon.sh b/other/bootstrap_serverdaemon/tox_bootstrap_daemon.sh
index 678db5e3..83d9a119 100644
--- a/other/bootstrap_serverdaemon/tox_dht_bootstrap_server_daemon.sh
+++ b/other/bootstrap_serverdaemon/tox_bootstrap_daemon.sh
@@ -1,18 +1,19 @@
1#! /bin/sh 1#! /bin/sh
2### BEGIN INIT INFO 2### BEGIN INIT INFO
3# Provides: tox_dht_bootstrap_server_daemon 3# Provides: tox_bootstrap_daemon
4# Required-Start: $remote_fs $syslog 4# Required-Start: $remote_fs $syslog
5# Required-Stop: $remote_fs $syslog 5# Required-Stop: $remote_fs $syslog
6# Default-Start: 2 3 4 5 6# Default-Start: 2 3 4 5
7# Default-Stop: 0 1 6 7# Default-Stop: 0 1 6
8# Short-Description: Starts the Tox bootstrapping server 8# Short-Description: Starts the Tox DHT bootstrapping server daemon
9# Description: Starts the Tox bootstrapping server 9# Description: Starts the Tox DHT bootstrapping server daemon
10### END INIT INFO 10### END INIT INFO
11 11
12# PATH should only include /usr/* if it runs after the mountnfs.sh script 12# PATH should only include /usr/* if it runs after the mountnfs.sh script
13PATH=/sbin:/usr/sbin:/bin:/usr/bin 13PATH=/sbin:/usr/sbin:/bin:/usr/bin
14DESC="ProjectTox bootstrap server daemon" 14DESC="Tox DHT bootstrap server daemon"
15NAME=tox_dht_bootstrap_server_daemon 15NAME=tox_bootstrap_daemon
16# You may want to change USER if you are using it anywhere else
16USER=tom 17USER=tom
17CFG=/home/$USER/.$NAME/conf 18CFG=/home/$USER/.$NAME/conf
18DAEMON=/home/$USER/$NAME 19DAEMON=/home/$USER/$NAME
diff --git a/toxcore/DHT.c b/toxcore/DHT.c
index d5808313..65fe6ae0 100644
--- a/toxcore/DHT.c
+++ b/toxcore/DHT.c
@@ -46,11 +46,13 @@
46/* Ping interval in seconds for each random sending of a get nodes request. */ 46/* Ping interval in seconds for each random sending of a get nodes request. */
47#define GET_NODE_INTERVAL 5 47#define GET_NODE_INTERVAL 5
48 48
49#define MAX_PUNCHING_PORTS 32 49#define MAX_PUNCHING_PORTS 48
50 50
51/* Interval in seconds between punching attempts*/ 51/* Interval in seconds between punching attempts*/
52#define PUNCH_INTERVAL 3 52#define PUNCH_INTERVAL 3
53 53
54#define MAX_NORMAL_PUNCHING_TRIES 5
55
54#define NAT_PING_REQUEST 0 56#define NAT_PING_REQUEST 0
55#define NAT_PING_RESPONSE 1 57#define NAT_PING_RESPONSE 1
56 58
@@ -1792,8 +1794,23 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
1792 ip_copy(&pinging.ip, &ip); 1794 ip_copy(&pinging.ip, &ip);
1793 pinging.port = htons(firstport); 1795 pinging.port = htons(firstport);
1794 send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].client_id); 1796 send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].client_id);
1797
1798 if (dht->friends_list[friend_num].nat.tries > MAX_NORMAL_PUNCHING_TRIES) {
1799 top = dht->friends_list[friend_num].nat.punching_index2 + MAX_PUNCHING_PORTS / 2;
1800 uint16_t port1 = 1024;
1801 uint16_t port2 = ~0;
1802
1803 for (i = dht->friends_list[friend_num].nat.punching_index2; i != top; ++i) {
1804 pinging.port = htons(port1 + i);
1805 send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].client_id);
1806 pinging.port = htons(port2 - i);
1807 send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].client_id);
1808 }
1809
1810 dht->friends_list[friend_num].nat.punching_index2 = i;
1811 }
1795 } else { 1812 } else {
1796 for (i = dht->friends_list[friend_num].nat.punching_index; i != top; i++) { 1813 for (i = dht->friends_list[friend_num].nat.punching_index; i != top; ++i) {
1797 /* TODO: Improve port guessing algorithm. */ 1814 /* TODO: Improve port guessing algorithm. */
1798 uint16_t port = port_list[(i / 2) % numports] + (i / (2 * numports)) * ((i % 2) ? -1 : 1); 1815 uint16_t port = port_list[(i / 2) % numports] + (i / (2 * numports)) * ((i % 2) ? -1 : 1);
1799 IP_Port pinging; 1816 IP_Port pinging;
@@ -1804,6 +1821,8 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
1804 1821
1805 dht->friends_list[friend_num].nat.punching_index = i; 1822 dht->friends_list[friend_num].nat.punching_index = i;
1806 } 1823 }
1824
1825 ++dht->friends_list[friend_num].nat.tries;
1807} 1826}
1808 1827
1809static void do_NAT(DHT *dht) 1828static void do_NAT(DHT *dht)
diff --git a/toxcore/DHT.h b/toxcore/DHT.h
index eb889d5d..b649338a 100644
--- a/toxcore/DHT.h
+++ b/toxcore/DHT.h
@@ -109,6 +109,9 @@ typedef struct {
109 /* 1 if currently hole punching, otherwise 0 */ 109 /* 1 if currently hole punching, otherwise 0 */
110 uint8_t hole_punching; 110 uint8_t hole_punching;
111 uint32_t punching_index; 111 uint32_t punching_index;
112 uint32_t tries;
113 uint32_t punching_index2;
114
112 uint64_t punching_timestamp; 115 uint64_t punching_timestamp;
113 uint64_t recvNATping_timestamp; 116 uint64_t recvNATping_timestamp;
114 uint64_t NATping_id; 117 uint64_t NATping_id;
diff --git a/toxcore/ping.c b/toxcore/ping.c
index a37b531d..6b1b906a 100644
--- a/toxcore/ping.c
+++ b/toxcore/ping.c
@@ -35,7 +35,7 @@
35#include "network.h" 35#include "network.h"
36#include "util.h" 36#include "util.h"
37 37
38#define PING_NUM_MAX 384 38#define PING_NUM_MAX 512
39 39
40/* Ping newly announced nodes to ping per TIME_TOPING seconds*/ 40/* Ping newly announced nodes to ping per TIME_TOPING seconds*/
41#define TIME_TOPING 5 41#define TIME_TOPING 5