From f31c5b7662b73f910e5c1b7798b2d5fa3a69ec14 Mon Sep 17 00:00:00 2001 From: Michael Schmoock Date: Fri, 20 Aug 2021 12:50:28 +0200 Subject: [PATCH] connectd: prefer non-TOR connections and filter wireaddr hint duplicate This does two things: - It moves non-tor addresses upfront so it prefers normal connection which are less laggy and more reliable. - It prevents connectd from trying the same wire_addr twice when the addr_hint was given and gossip also added the same address. Changelog-Changed: connectd: try non-TOR connections first Changelog-Fixed: connectd: do not try address hint twice --- connectd/connectd.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/connectd/connectd.c b/connectd/connectd.c index 80f97661f..2784d3301 100644 --- a/connectd/connectd.c +++ b/connectd/connectd.c @@ -1459,9 +1459,18 @@ static void add_seed_addrs(struct wireaddr_internal **addrs, } } +static bool wireaddr_int_equals_wireaddr(struct wireaddr_internal *addr_a, + struct wireaddr *addr_b) +{ + if (!addr_a || !addr_b) + return false; + return wireaddr_eq(&addr_a->u.wireaddr, addr_b); +} + /*~ This asks gossipd for any addresses advertized by the node. */ static void add_gossip_addrs(struct wireaddr_internal **addrs, - const struct node_id *id) + const struct node_id *id, + struct wireaddr_internal *addrhint) { u8 *msg; struct wireaddr *normal_addrs; @@ -1483,6 +1492,24 @@ static void add_gossip_addrs(struct wireaddr_internal **addrs, /* Wrap each one in a wireaddr_internal and add to addrs. */ for (size_t i = 0; i < tal_count(normal_addrs); i++) { + /* add TOR addresses in a second loop */ + if (normal_addrs[i].type == ADDR_TYPE_TOR_V2 || + normal_addrs[i].type == ADDR_TYPE_TOR_V3) + continue; + if (wireaddr_int_equals_wireaddr(addrhint, &normal_addrs[i])) + continue; + struct wireaddr_internal addr; + addr.itype = ADDR_INTERNAL_WIREADDR; + addr.u.wireaddr = normal_addrs[i]; + tal_arr_expand(addrs, addr); + } + /* so connectd prefers direct connections if possible. */ + for (size_t i = 0; i < tal_count(normal_addrs); i++) { + if (normal_addrs[i].type != ADDR_TYPE_TOR_V2 && + normal_addrs[i].type != ADDR_TYPE_TOR_V3) + continue; + if (wireaddr_int_equals_wireaddr(addrhint, &normal_addrs[i])) + continue; struct wireaddr_internal addr; addr.itype = ADDR_INTERNAL_WIREADDR; addr.u.wireaddr = normal_addrs[i]; @@ -1524,10 +1551,11 @@ static void try_connect_peer(struct daemon *daemon, addrs = tal_arr(tmpctx, struct wireaddr_internal, 0); /* They can supply an optional address for the connect RPC */ + /* We add this first so its tried first by connectd */ if (addrhint) tal_arr_expand(&addrs, *addrhint); - add_gossip_addrs(&addrs, id); + add_gossip_addrs(&addrs, id, addrhint); if (tal_count(addrs) == 0) { /* Don't resolve via DNS seed if we're supposed to use proxy. */