Skip to content

Commit b9721c3

Browse files
committed
Handle many alt_addrs
This implementation utilizes a string with comma-separated alternative ddresses, future implementation will utilize an array of wireaddr_internal structs. Signed-off-by: Max Rantil <[email protected]>
1 parent e6ff7da commit b9721c3

File tree

15 files changed

+1204
-1068
lines changed

15 files changed

+1204
-1068
lines changed

.msggen.json

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1590,6 +1590,8 @@
15901590
"ListConfigs.configs.alias": 30,
15911591
"ListConfigs.configs.allow-deprecated-apis": 14,
15921592
"ListConfigs.configs.alt-addr": 71,
1593+
"ListConfigs.configs.alt-announce-addr": 73,
1594+
"ListConfigs.configs.alt-bind-addr": 72,
15931595
"ListConfigs.configs.always-use-proxy": 17,
15941596
"ListConfigs.configs.announce-addr": 48,
15951597
"ListConfigs.configs.announce-addr-discovered": 54,
@@ -1677,6 +1679,14 @@
16771679
"ListConfigs.configs.alt-addr.sources[]": 2,
16781680
"ListConfigs.configs.alt-addr.values_str[]": 1
16791681
},
1682+
"ListconfigsConfigsAlt-announce-addr": {
1683+
"ListConfigs.configs.alt-addr.sources[]": 2,
1684+
"ListConfigs.configs.alt-addr.values_str[]": 1
1685+
},
1686+
"ListconfigsConfigsAlt-bind-addr": {
1687+
"ListConfigs.configs.alt-addr.sources[]": 2,
1688+
"ListConfigs.configs.alt-addr.values_str[]": 1
1689+
},
16801690
"ListconfigsConfigsAlways-use-proxy": {
16811691
"ListConfigs.configs.always-use-proxy.source": 2,
16821692
"ListConfigs.configs.always-use-proxy.value_bool": 1
@@ -2366,6 +2376,7 @@
23662376
"ListPeerChannels.channels[]": 1
23672377
},
23682378
"ListpeersPeers": {
2379+
"ListPeers.peers[].alt_addrs[]": 9,
23692380
"ListPeers.peers[].channels[]": 4,
23702381
"ListPeers.peers[].connected": 2,
23712382
"ListPeers.peers[].features": 6,
@@ -6695,6 +6706,30 @@
66956706
"added": "v24.05",
66966707
"deprecated": false
66976708
},
6709+
"ListConfigs.configs.alt-announce-addr": {
6710+
"added": "v24.05",
6711+
"deprecated": false
6712+
},
6713+
"ListConfigs.configs.alt-announce-addr.sources[]": {
6714+
"added": "v24.05",
6715+
"deprecated": false
6716+
},
6717+
"ListConfigs.configs.alt-announce-addr.values_str[]": {
6718+
"added": "v24.05",
6719+
"deprecated": false
6720+
},
6721+
"ListConfigs.configs.alt-bind-addr": {
6722+
"added": "v24.05",
6723+
"deprecated": false
6724+
},
6725+
"ListConfigs.configs.alt-bind-addr.sources[]": {
6726+
"added": "v24.05",
6727+
"deprecated": false
6728+
},
6729+
"ListConfigs.configs.alt-bind-addr.values_str[]": {
6730+
"added": "v24.05",
6731+
"deprecated": false
6732+
},
66986733
"ListConfigs.configs.always-use-proxy": {
66996734
"added": "pre-v0.10.1",
67006735
"deprecated": false
@@ -8763,6 +8798,10 @@
87638798
"added": "pre-v0.10.1",
87648799
"deprecated": false
87658800
},
8801+
"ListPeers.peers[].alt_addrs[]": {
8802+
"added": "v24.05",
8803+
"deprecated": false
8804+
},
87668805
"ListPeers.peers[].channels[]": {
87678806
"added": "pre-v0.10.1",
87688807
"deprecated": "v23.02"

connectd/connectd.c

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -318,24 +318,25 @@ static struct io_plan *handshake_in_success(struct io_conn *conn,
318318
node_id_from_pubkey(&id, id_key);
319319
status_peer_debug(&id, "Connect IN");
320320

321-
/* FIXME(maxrantil): loop all alt_bind_addr after making it an array (code down-under)*/
322-
/* bool is_whitelisted = false;
323-
321+
/* Confirm that peer connects to the alt-bind-addr you sent */
324322
if (daemon->alt_bind_addr) {
325-
for (size_t i = 0; i < tal_count(daemon->alt_bind_addr); i++) {
326-
if (strcmp(incoming_addr, (char *)daemon->alt_bind_addr[i]) == 0) {
327-
is_whitelisted = true;
323+
char *incoming_addr = fmt_wireaddr_internal(tmpctx, addr);
324+
fprintf(stderr, "--> incoming connection addr: '%s'\n", incoming_addr);
325+
326+
char *bind_addrs = tal_strdup(NULL, (char *)daemon->alt_bind_addr);
327+
char *token = strtok(bind_addrs, ",");
328+
329+
while (token != NULL) {
330+
fprintf(stderr, "--> comparing '%s' with token '%s'\n", incoming_addr, token);
331+
if (strcmp(incoming_addr, token) == 0) {
332+
fprintf(stderr, "--> INSIDE\n");
333+
towire_connectd_alt_addr_whitelist(tmpctx, id_key, (u8 *)incoming_addr);
328334
break;
329335
}
336+
token = strtok(NULL, ",");
330337
}
331-
} */
332-
333-
char *incoming_addr = fmt_wireaddr_internal(tmpctx, addr);
334-
335-
/* Confirm that peer connects to the alt-bind-addr you sent */
336-
if (daemon->alt_bind_addr)
337-
if (strcmp(incoming_addr, (char *)daemon->alt_bind_addr) == 0)
338-
towire_connectd_alt_addr_whitelist(tmpctx, id_key, (u8 *)incoming_addr);
338+
tal_free(bind_addrs);
339+
}
339340

340341
return peer_exchange_initmsg(conn, daemon, daemon->our_features,
341342
cs, &id, addr, timeout, is_websocket, true);
@@ -655,6 +656,9 @@ static struct io_plan *handshake_out_success(struct io_conn *conn,
655656
node_id_from_pubkey(&id, key);
656657
connect->connstate = "Exchanging init messages";
657658
status_peer_debug(&id, "Connect OUT");
659+
660+
fprintf(stderr, "<-- outgoing connection addr: '%s'\n", fmt_wireaddr_internal(tmpctx, addr));
661+
658662
return peer_exchange_initmsg(conn, connect->daemon,
659663
connect->daemon->our_features,
660664
cs, &id, addr, timeout, is_websocket, false);
@@ -1719,6 +1723,7 @@ static void try_connect_peer(struct daemon *daemon,
17191723
const struct node_id *id,
17201724
struct wireaddr *gossip_addrs,
17211725
struct wireaddr_internal *addrhint STEALS,
1726+
struct wireaddr_internal *peer_alt_addrs STEALS,
17221727
bool dns_fallback,
17231728
bool transient)
17241729
{
@@ -1746,6 +1751,13 @@ static void try_connect_peer(struct daemon *daemon,
17461751
tal_arr_expand(&connect->addrs, *addrhint);
17471752
}
17481753

1754+
/* Update addrs with peer_alt_addrs if provided */
1755+
if (peer_alt_addrs) {
1756+
for (size_t i = 0; i < tal_count(peer_alt_addrs); i++) {
1757+
tal_arr_expand(&connect->addrs, peer_alt_addrs[i]);
1758+
}
1759+
}
1760+
17491761
return;
17501762
}
17511763

@@ -1764,6 +1776,22 @@ static void try_connect_peer(struct daemon *daemon,
17641776
&& !addrhint->u.wireaddr.is_websocket
17651777
? &addrhint->u.wireaddr.wireaddr : NULL);
17661778

1779+
/*
1780+
* FIXME(maxrantil): Question for Alex:
1781+
* Expanding the addrs array with peer_alt_addrs here (after addrhint) only allows
1782+
* using alt_addrs from node2 to node1 when connecting, but not from node1 to node2.
1783+
* If you start a regtest environment with (start_ln, fund_node, and then repeatedly
1784+
* stop_ln and start_ln), you will see that it only works about 50% of the time.
1785+
* This is because every second time or so, the nodes alternate as sender and receiver.
1786+
* If we move the for loop 10 lines up, before the addrhint if statement,
1787+
* the alt_addrs will be utilized by both nodes when initializing a connection.
1788+
* What are your thoughts on this?
1789+
*/
1790+
1791+
/* Add all peer_alt_addrs next so they're tried after addrhint by connectd */
1792+
for (size_t i = 0; i < tal_count(peer_alt_addrs); i++)
1793+
tal_arr_expand(&addrs, peer_alt_addrs[i]);
1794+
17671795
if (tal_count(addrs) == 0) {
17681796
/* Don't resolve via DNS seed if we're supposed to use proxy. */
17691797
if (use_proxy) {
@@ -1820,16 +1848,17 @@ static void connect_to_peer(struct daemon *daemon, const u8 *msg)
18201848
struct node_id id;
18211849
struct wireaddr_internal *addrhint;
18221850
struct wireaddr *addrs;
1851+
struct wireaddr_internal *peer_alt_addrs;
18231852
bool dns_fallback;
18241853
bool transient;
18251854

18261855
if (!fromwire_connectd_connect_to_peer(tmpctx, msg,
1827-
&id, &addrs, &addrhint,
1856+
&id, &addrs, &addrhint, &peer_alt_addrs,
18281857
&dns_fallback,
18291858
&transient))
18301859
master_badmsg(WIRE_CONNECTD_CONNECT_TO_PEER, msg);
18311860

1832-
try_connect_peer(daemon, &id, addrs, addrhint, dns_fallback, transient);
1861+
try_connect_peer(daemon, &id, addrs, addrhint, peer_alt_addrs, dns_fallback, transient);
18331862
}
18341863

18351864
/* lightningd tells us a peer should be disconnected. */
@@ -2098,13 +2127,16 @@ static void dev_exhaust_fds(struct daemon *daemon, const u8 *msg)
20982127
daemon->dev_exhausted_fds = true;
20992128
}
21002129

2130+
#include <stdio.h>
21012131
static void handle_alt_addr_whitelist_reply(struct daemon *daemon, const u8 *msg)
21022132
{
21032133
struct pubkey p_pk;
21042134
struct peer *peer;
21052135
u8 *incoming_addr;
21062136
bool is_whitelisted;
21072137

2138+
fprintf(stderr, "INSIDE WHITELIST\n");
2139+
21082140
if (!fromwire_connectd_alt_addr_whitelist_reply(tmpctx,
21092141
msg, &p_pk, &incoming_addr, &is_whitelisted)) {
21102142
master_badmsg(WIRE_CONNECTD_ALT_ADDR_WHITELIST_REPLY, msg);
@@ -2220,10 +2252,8 @@ static struct io_plan *recv_req(struct io_conn *conn,
22202252
goto out;
22212253
}
22222254
case WIRE_CONNECTD_ALT_ADDR_WHITELIST_REPLY:
2223-
if (daemon->developer) {
2224-
handle_alt_addr_whitelist_reply(daemon, msg);
2225-
goto out;
2226-
}
2255+
handle_alt_addr_whitelist_reply(daemon, msg);
2256+
goto out;
22272257
/* Fall thru */
22282258
/* We send these, we don't receive them */
22292259
case WIRE_CONNECTD_INIT_REPLY:

connectd/connectd_wire.csv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ msgdata,connectd_init,dev_disconnect,bool,
2727
msgdata,connectd_init,dev_no_ping_timer,bool,
2828
# Allow incoming connections, but don't talk.
2929
msgdata,connectd_init,dev_noreply,bool,
30-
# Whitelist for incomming alternative addrdress connections
30+
# Whitelist for incoming alternative address connections
3131
msgdata,connectd_init,bind_alt_addr_len,u8,
3232
msgdata,connectd_init,bind_alt_addr,byte,bind_alt_addr_len,
3333

@@ -59,6 +59,7 @@ msgdata,connectd_connect_to_peer,id,node_id,
5959
msgdata,connectd_connect_to_peer,len,u32,
6060
msgdata,connectd_connect_to_peer,addrs,wireaddr,len
6161
msgdata,connectd_connect_to_peer,addrhint,?wireaddr_internal,
62+
msgdata,connectd_connect_to_peer,peer_alt_addrs,?wireaddr_internal,
6263
msgdata,connectd_connect_to_peer,dns_fallback,bool,
6364
msgdata,connectd_connect_to_peer,transient,bool,
6465

contrib/msggen/msggen/schema.json

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4146,7 +4146,7 @@
41464146
"netaddr": [
41474147
"127.0.0.1:40119"
41484148
],
4149-
"alt_addr": "127.0.0.21:7171",
4149+
"alt_addr": "127.0.0.1:34321",
41504150
"features": "08a0000a8a5961",
41514151
"log": [
41524152
{
@@ -21204,7 +21204,19 @@
2120421204
]
2120521205
}
2120621206
},
21207-
"alt_addr": {},
21207+
"alt_addrs": {
21208+
"type": "array",
21209+
"description": [
21210+
"An array containing zero or more alternative addresses for the peer."
21211+
],
21212+
"items": {
21213+
"type": "string",
21214+
"description": [
21215+
"Address, e.g. 1.2.3.4:1234."
21216+
]
21217+
},
21218+
"added": "v24.05"
21219+
},
2120821220
"remote_addr": {
2120921221
"type": "string",
2121021222
"description": [
@@ -21249,7 +21261,7 @@
2124921261
"netaddr": [
2125021262
"127.0.0.1:44619"
2125121263
],
21252-
"alt_addr": "127.0.0.21:7171",
21264+
"alt_addr": "127.0.0.1:34321",
2125321265
"features": "08a0000a0a69a2"
2125421266
}
2125521267
]
@@ -21273,7 +21285,7 @@
2127321285
"netaddr": [
2127421286
"127.0.0.1:48862"
2127521287
],
21276-
"alt_addr": "127.0.0.21:7171",
21288+
"alt_addr": "127.0.0.1:34321",
2127721289
"features": "08a0000a0a69a2"
2127821290
}
2127921291
]

contrib/pyln-grpc-proto/pyln/grpc/node_pb2.py

Lines changed: 952 additions & 952 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

contrib/pyln-testing/pyln/testing/grpc2py.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ def listpeers_peers_log2py(m):
8484

8585
def listpeers_peers2py(m):
8686
return remove_default({
87+
"alt_addrs": [m.alt_addrs for i in m.alt_addrs], # ArrayField[primitive] in generate_composite
8788
"log": [listpeers_peers_log2py(i) for i in m.log], # ArrayField[composite] in generate_composite
8889
"netaddr": [m.netaddr for i in m.netaddr], # ArrayField[primitive] in generate_composite
8990
"connected": m.connected, # PrimitiveField in generate_composite

contrib/startup_regtest.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ start_nodes() {
184184
log-level=debug
185185
log-file=$LIGHTNING_DIR/l$i/log
186186
addr=localhost:$socket
187+
alt-addr=127.0.0.21:$socket
187188
allow-deprecated-apis=false
188189
developer
189190
dev-fast-gossip

doc/schemas/lightning-listpeers.json

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,19 @@
279279
]
280280
}
281281
},
282-
"alt_addr": {},
282+
"alt_addrs": {
283+
"type": "array",
284+
"description": [
285+
"An array containing zero or more alternative addresses for the peer."
286+
],
287+
"items": {
288+
"type": "string",
289+
"description": [
290+
"Address, e.g. 1.2.3.4:1234."
291+
]
292+
},
293+
"added": "v24.05"
294+
},
283295
"remote_addr": {
284296
"type": "string",
285297
"description": [

0 commit comments

Comments
 (0)