mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Improved hole punching a bit.
This commit is contained in:
parent
0d53abebcd
commit
86ba735198
@ -46,11 +46,13 @@
|
|||||||
/* Ping interval in seconds for each random sending of a get nodes request. */
|
/* Ping interval in seconds for each random sending of a get nodes request. */
|
||||||
#define GET_NODE_INTERVAL 5
|
#define GET_NODE_INTERVAL 5
|
||||||
|
|
||||||
#define MAX_PUNCHING_PORTS 32
|
#define MAX_PUNCHING_PORTS 48
|
||||||
|
|
||||||
/* Interval in seconds between punching attempts*/
|
/* Interval in seconds between punching attempts*/
|
||||||
#define PUNCH_INTERVAL 3
|
#define PUNCH_INTERVAL 3
|
||||||
|
|
||||||
|
#define MAX_NORMAL_PUNCHING_TRIES 5
|
||||||
|
|
||||||
#define NAT_PING_REQUEST 0
|
#define NAT_PING_REQUEST 0
|
||||||
#define NAT_PING_RESPONSE 1
|
#define NAT_PING_RESPONSE 1
|
||||||
|
|
||||||
@ -1792,8 +1794,23 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
|
|||||||
ip_copy(&pinging.ip, &ip);
|
ip_copy(&pinging.ip, &ip);
|
||||||
pinging.port = htons(firstport);
|
pinging.port = htons(firstport);
|
||||||
send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].client_id);
|
send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].client_id);
|
||||||
|
|
||||||
|
if (dht->friends_list[friend_num].nat.tries > MAX_NORMAL_PUNCHING_TRIES) {
|
||||||
|
top = dht->friends_list[friend_num].nat.punching_index2 + MAX_PUNCHING_PORTS / 2;
|
||||||
|
uint16_t port1 = 1024;
|
||||||
|
uint16_t port2 = ~0;
|
||||||
|
|
||||||
|
for (i = dht->friends_list[friend_num].nat.punching_index2; i != top; ++i) {
|
||||||
|
pinging.port = htons(port1 + i);
|
||||||
|
send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].client_id);
|
||||||
|
pinging.port = htons(port2 - i);
|
||||||
|
send_ping_request(dht->ping, pinging, dht->friends_list[friend_num].client_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
dht->friends_list[friend_num].nat.punching_index2 = i;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = dht->friends_list[friend_num].nat.punching_index; i != top; i++) {
|
for (i = dht->friends_list[friend_num].nat.punching_index; i != top; ++i) {
|
||||||
/* TODO: Improve port guessing algorithm. */
|
/* TODO: Improve port guessing algorithm. */
|
||||||
uint16_t port = port_list[(i / 2) % numports] + (i / (2 * numports)) * ((i % 2) ? -1 : 1);
|
uint16_t port = port_list[(i / 2) % numports] + (i / (2 * numports)) * ((i % 2) ? -1 : 1);
|
||||||
IP_Port pinging;
|
IP_Port pinging;
|
||||||
@ -1804,6 +1821,8 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports,
|
|||||||
|
|
||||||
dht->friends_list[friend_num].nat.punching_index = i;
|
dht->friends_list[friend_num].nat.punching_index = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
++dht->friends_list[friend_num].nat.tries;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_NAT(DHT *dht)
|
static void do_NAT(DHT *dht)
|
||||||
|
@ -109,6 +109,9 @@ typedef struct {
|
|||||||
/* 1 if currently hole punching, otherwise 0 */
|
/* 1 if currently hole punching, otherwise 0 */
|
||||||
uint8_t hole_punching;
|
uint8_t hole_punching;
|
||||||
uint32_t punching_index;
|
uint32_t punching_index;
|
||||||
|
uint32_t tries;
|
||||||
|
uint32_t punching_index2;
|
||||||
|
|
||||||
uint64_t punching_timestamp;
|
uint64_t punching_timestamp;
|
||||||
uint64_t recvNATping_timestamp;
|
uint64_t recvNATping_timestamp;
|
||||||
uint64_t NATping_id;
|
uint64_t NATping_id;
|
||||||
|
@ -35,7 +35,7 @@
|
|||||||
#include "network.h"
|
#include "network.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
#define PING_NUM_MAX 384
|
#define PING_NUM_MAX 512
|
||||||
|
|
||||||
/* Ping newly announced nodes to ping per TIME_TOPING seconds*/
|
/* Ping newly announced nodes to ping per TIME_TOPING seconds*/
|
||||||
#define TIME_TOPING 5
|
#define TIME_TOPING 5
|
||||||
|
Loading…
x
Reference in New Issue
Block a user