X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=src%2Fnet_packet.c;h=902b0815f561c195f814ec21d9153d3c03c4d6d6;hb=3c1b7047332f4b5e9d5ae7109e696b33712a5fb2;hp=dbf361fd38fe2c41b4484763045d266545c7be84;hpb=f57129ce3439f3826c12f15feb5df05e5ad8cab9;p=meshlink 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) {