From 3c1b7047332f4b5e9d5ae7109e696b33712a5fb2 Mon Sep 17 00:00:00 2001 From: Guus Sliepen Date: Mon, 19 Nov 2012 13:50:17 +0100 Subject: [PATCH] Improve UDP address selection. We don't need to search the whole edge tree, we can use the node's own edge tree since each edge has a pointer to its reverse. Also, we do need to make sure we try the reflexive address often. --- src/net_packet.c | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/net_packet.c b/src/net_packet.c index dbf361fd..902b0815 100644 --- a/src/net_packet.c +++ b/src/net_packet.c @@ -447,24 +447,28 @@ static void choose_udp_address(const node_t *n, const sockaddr_t **sa, int *sock if(n->status.udp_confirmed) return; - /* Otherwise, go through the list of known addresses of - this node. The first address we try is always the - one in n->address; that could be set to the node's - reflexive UDP address discovered during key - exchange. The other known addresses are those found - in edges to this node. */ + /* Send every third packet to n->address; that could be set + to the node's reflexive UDP address discovered during key + exchange. */ + static int x = 0; + if(++x >= 3) { + x = 0; + return; + } + + /* Otherwise, address are found in edges to this node. + So we pick a random edge and a random socket. */ int i = 0; int j = rand() % n->edge_tree->count; edge_t *candidate = NULL; - for splay_each(edge_t, e, edge_weight_tree) { - if(e->to != n) - continue; - i++; - if(!candidate || i == j) - candidate = e; + for splay_each(edge_t, e, n->edge_tree) { + if(i++ == j) { + candidate = e->reverse; + break; + } } if(candidate) { -- 2.20.1