Skip to content

Commit f238fa3

Browse files
committed
connectd: handle alt addr for outbound connection
1 parent 24952e8 commit f238fa3

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

connectd/connectd.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1709,6 +1709,7 @@ static void try_connect_peer(struct daemon *daemon,
17091709
const struct node_id *id,
17101710
struct wireaddr *gossip_addrs,
17111711
struct wireaddr_internal *addrhint STEALS,
1712+
struct wireaddr_internal *peer_alt_addr STEALS,
17121713
bool dns_fallback,
17131714
bool transient)
17141715
{
@@ -1736,6 +1737,11 @@ static void try_connect_peer(struct daemon *daemon,
17361737
tal_arr_expand(&connect->addrs, *addrhint);
17371738
}
17381739

1740+
/* Update addrs with peer_alt_addrs if provided */
1741+
for (size_t i = 0; i < tal_count(peer_alt_addr); i++)
1742+
if (peer_alt_addr[i].u.wireaddr.wireaddr.addrlen > 0)
1743+
tal_arr_expand(&connect->addrs, peer_alt_addr[i]);
1744+
17391745
return;
17401746
}
17411747

@@ -1749,10 +1755,15 @@ static void try_connect_peer(struct daemon *daemon,
17491755

17501756
/* Tell it to omit the existing hint (if that's a wireaddr itself) */
17511757
add_gossip_addrs(&addrs, gossip_addrs,
1752-
addrhint
1753-
&& addrhint->itype == ADDR_INTERNAL_WIREADDR
1754-
&& !addrhint->u.wireaddr.is_websocket
1755-
? &addrhint->u.wireaddr.wireaddr : NULL);
1758+
addrhint
1759+
&& addrhint->itype == ADDR_INTERNAL_WIREADDR
1760+
&& !addrhint->u.wireaddr.is_websocket
1761+
? &addrhint->u.wireaddr.wireaddr : NULL);
1762+
1763+
/* Add all peer_alt_addrs next so they're tried after addrhint by connectd */
1764+
for (size_t i = 0; i < tal_count(peer_alt_addr); i++)
1765+
if (peer_alt_addr[i].u.wireaddr.wireaddr.addrlen > 0)
1766+
tal_arr_expand(&addrs, peer_alt_addr[i]);
17561767

17571768
if (tal_count(addrs) == 0) {
17581769
/* Don't resolve via DNS seed if we're supposed to use proxy. */
@@ -1809,17 +1820,19 @@ static void connect_to_peer(struct daemon *daemon, const u8 *msg)
18091820
{
18101821
struct node_id id;
18111822
struct wireaddr_internal *addrhint;
1823+
struct wireaddr_internal *peer_alt_addr;
18121824
struct wireaddr *addrs;
18131825
bool dns_fallback;
18141826
bool transient;
18151827

18161828
if (!fromwire_connectd_connect_to_peer(tmpctx, msg,
18171829
&id, &addrs, &addrhint,
1818-
&dns_fallback,
1830+
&peer_alt_addr, &dns_fallback,
18191831
&transient))
18201832
master_badmsg(WIRE_CONNECTD_CONNECT_TO_PEER, msg);
18211833

1822-
try_connect_peer(daemon, &id, addrs, addrhint, dns_fallback, transient);
1834+
try_connect_peer(daemon, &id, addrs, addrhint,
1835+
peer_alt_addr, dns_fallback, transient);
18231836
}
18241837

18251838
/* lightningd tells us a peer should be disconnected. */

connectd/connectd_wire.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ msgdata,connectd_connect_to_peer,id,node_id,
6262
msgdata,connectd_connect_to_peer,len,u32,
6363
msgdata,connectd_connect_to_peer,addrs,wireaddr,len
6464
msgdata,connectd_connect_to_peer,addrhint,?wireaddr_internal,
65+
msgdata,connectd_connect_to_peer,peer_alt_addr,?wireaddr_internal,
6566
msgdata,connectd_connect_to_peer,dns_fallback,bool,
6667
msgdata,connectd_connect_to_peer,transient,bool,
6768

lightningd/connect_control.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ struct delayed_reconnect {
263263
struct lightningd *ld;
264264
struct node_id id;
265265
struct wireaddr_internal *addrhint;
266+
struct wireaddr_internal *peer_alt_addr;
266267
bool dns_fallback;
267268
};
268269

@@ -304,6 +305,7 @@ static void gossipd_got_addrs(struct subd *subd,
304305
&d->id,
305306
addrs,
306307
d->addrhint,
308+
d->peer_alt_addr,
307309
d->dns_fallback,
308310
transient);
309311
subd_send_msg(d->ld->connectd, take(connectmsg));
@@ -332,6 +334,7 @@ static void try_connect(const tal_t *ctx,
332334
{
333335
struct delayed_reconnect *d;
334336
struct peer *peer;
337+
struct wireaddr_internal *p_alt_addr;
335338

336339
/* Don't stack, unless this is an instant reconnect */
337340
d = delayed_reconnect_map_get(ld->delayed_reconnect_map, id);
@@ -343,10 +346,13 @@ static void try_connect(const tal_t *ctx,
343346
tal_free(d);
344347
}
345348

349+
p_alt_addr = wallet_get_alt_addr(ld->wallet, id, false);
350+
346351
d = tal(ctx, struct delayed_reconnect);
347352
d->ld = ld;
348353
d->id = *id;
349354
d->addrhint = tal_dup_or_null(d, struct wireaddr_internal, addrhint);
355+
d->peer_alt_addr = tal_dup_or_null(d, struct wireaddr_internal, p_alt_addr);
350356
d->dns_fallback = dns_fallback;
351357
delayed_reconnect_map_add(ld->delayed_reconnect_map, d);
352358
tal_add_destructor(d, destroy_delayed_reconnect);

0 commit comments

Comments
 (0)