From 3babbc52013de2fbe4021b4c29ea207afad41121 Mon Sep 17 00:00:00 2001 From: Michael Schmoock Date: Tue, 20 Dec 2022 17:49:03 +0100 Subject: [PATCH] opts: announce-addr-discovered on/off/auto switch This adds the option to explicitly enable ip-discovery, which maybe helpful for example when a user wants TOR announced along with discovered IPs to improve connectivity and have TOR just as a fallback. Changelog-Added: Adds config switch 'announce-addr-discovered': on/off/auto --- doc/lightning-listconfigs.7.md | 3 ++- doc/schemas/listconfigs.schema.json | 5 +++++ gossipd/gossip_generation.c | 7 +++++-- gossipd/gossipd.c | 12 +++++++++--- gossipd/gossipd.h | 2 ++ gossipd/gossipd_wire.csv | 1 + lightningd/gossip_control.c | 3 ++- lightningd/lightningd.h | 3 +++ lightningd/options.c | 8 ++++++++ tests/test_connection.py | 3 ++- 10 files changed, 39 insertions(+), 8 deletions(-) diff --git a/doc/lightning-listconfigs.7.md b/doc/lightning-listconfigs.7.md index 9b7759336..5fcd1a941 100644 --- a/doc/lightning-listconfigs.7.md +++ b/doc/lightning-listconfigs.7.md @@ -88,7 +88,8 @@ On success, an object is returned, containing: - **autolisten** (boolean, optional): `autolisten` field from config or cmdline, or default - **proxy** (string, optional): `proxy` field from config or cmdline, or default - **disable-dns** (boolean, optional): `true` if `disable-dns` was set in config or cmdline -- **disable-ip-discovery** (boolean, optional): `true` if `disable-ip-discovery` was set in config or cmdline +- **disable-ip-discovery** (boolean, optional): `true` if `disable-ip-discovery` was set in config or cmdline (DEPRECATED) +- **ip-discovery** (string, optional): `true` if `ip-discovery` was set in config or cmdline - **encrypted-hsm** (boolean, optional): `true` if `encrypted-hsm` was set in config or cmdline - **rpc-file-mode** (string, optional): `rpc-file-mode` field from config or cmdline, or default - **log-level** (string, optional): `log-level` field from config or cmdline, or default diff --git a/doc/schemas/listconfigs.schema.json b/doc/schemas/listconfigs.schema.json index 714540873..fc52dffb6 100644 --- a/doc/schemas/listconfigs.schema.json +++ b/doc/schemas/listconfigs.schema.json @@ -247,6 +247,11 @@ "type": "boolean", "description": "`true` if `disable-ip-discovery` was set in config or cmdline" }, + "announce-addr-discovered": { + "type": "string", + "description": "`true`/`false`/`auto` depending on how `announce-addr-discovered` was set in config or cmdline", + "added": "v23.02" + }, "encrypted-hsm": { "type": "boolean", "description": "`true` if `encrypted-hsm` was set in config or cmdline" diff --git a/gossipd/gossip_generation.c b/gossipd/gossip_generation.c index 44c4afa8b..755a887d2 100644 --- a/gossipd/gossip_generation.c +++ b/gossipd/gossip_generation.c @@ -3,6 +3,7 @@ #include "config.h" #include #include +#include #include #include #include @@ -44,8 +45,10 @@ static u8 *create_node_announcement(const tal_t *ctx, struct daemon *daemon, tal_arr_expand(&was, daemon->announceable[i]); /* Add discovered IPs v4/v6 verified by peer `remote_addr` feature. */ - /* Only do that if we don't have addresses announced. */ - if (count_announceable == 0) { + /* Only do that if we don't have any addresses announced or + * `config.ip_discovery` is explicitly enabled. */ + if ((daemon->ip_discovery == OPT_AUTOBOOL_AUTO && count_announceable == 0) || + daemon->ip_discovery == OPT_AUTOBOOL_TRUE) { if (daemon->discovered_ip_v4 != NULL && !wireaddr_arr_contains(was, daemon->discovered_ip_v4)) tal_arr_expand(&was, *daemon->discovered_ip_v4); diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c index d96c752a2..e6ec91a74 100644 --- a/gossipd/gossipd.c +++ b/gossipd/gossipd.c @@ -346,6 +346,7 @@ static void handle_local_private_channel(struct daemon *daemon, const u8 *msg) static void handle_discovered_ip(struct daemon *daemon, const u8 *msg) { struct wireaddr discovered_ip; + size_t count_announceable; if (!fromwire_gossipd_discovered_ip(msg, &discovered_ip)) master_badmsg(WIRE_GOSSIPD_DISCOVERED_IP, msg); @@ -380,8 +381,11 @@ static void handle_discovered_ip(struct daemon *daemon, const u8 *msg) return; update_node_annoucement: - status_debug("Update our node_announcement for discovered address: %s", - fmt_wireaddr(tmpctx, &discovered_ip)); + count_announceable = tal_count(daemon->announceable); + if ((daemon->ip_discovery == OPT_AUTOBOOL_AUTO && count_announceable == 0) || + daemon->ip_discovery == OPT_AUTOBOOL_TRUE) + status_debug("Update our node_announcement for discovered address: %s", + fmt_wireaddr(tmpctx, &discovered_ip)); maybe_send_own_node_announce(daemon, false); } @@ -727,7 +731,8 @@ static void gossip_init(struct daemon *daemon, const u8 *msg) &daemon->announceable, &dev_gossip_time, &dev_fast_gossip, - &dev_fast_gossip_prune)) { + &dev_fast_gossip_prune, + &daemon->ip_discovery)) { master_badmsg(WIRE_GOSSIPD_INIT, msg); } @@ -1096,6 +1101,7 @@ int main(int argc, char *argv[]) daemon->rates = NULL; daemon->discovered_ip_v4 = NULL; daemon->discovered_ip_v6 = NULL; + daemon->ip_discovery = OPT_AUTOBOOL_AUTO; list_head_init(&daemon->deferred_updates); /* Tell the ecdh() function how to talk to hsmd */ diff --git a/gossipd/gossipd.h b/gossipd/gossipd.h index 0b3b26455..5a1c9ce4a 100644 --- a/gossipd/gossipd.h +++ b/gossipd/gossipd.h @@ -1,6 +1,7 @@ #ifndef LIGHTNING_GOSSIPD_GOSSIPD_H #define LIGHTNING_GOSSIPD_GOSSIPD_H #include "config.h" +#include #include #include #include @@ -52,6 +53,7 @@ struct daemon { /* verified remote_addr as reported by recent peers */ struct wireaddr *discovered_ip_v4; struct wireaddr *discovered_ip_v6; + enum opt_autobool ip_discovery; /* Timer until we can send an updated node_announcement */ struct oneshot *node_announce_timer; diff --git a/gossipd/gossipd_wire.csv b/gossipd/gossipd_wire.csv index 2c266584e..2e0b47c1f 100644 --- a/gossipd/gossipd_wire.csv +++ b/gossipd/gossipd_wire.csv @@ -16,6 +16,7 @@ msgdata,gossipd_init,announceable,wireaddr,num_announceable msgdata,gossipd_init,dev_gossip_time,?u32, msgdata,gossipd_init,dev_fast_gossip,bool, msgdata,gossipd_init,dev_fast_gossip_prune,bool, +msgdata,gossipd_init,ip_discovery,u32, msgtype,gossipd_init_reply,3100 diff --git a/lightningd/gossip_control.c b/lightningd/gossip_control.c index b4665cddb..d606b57b5 100644 --- a/lightningd/gossip_control.c +++ b/lightningd/gossip_control.c @@ -262,7 +262,8 @@ void gossip_init(struct lightningd *ld, int connectd_fd) ld->announceable, IFDEV(ld->dev_gossip_time ? &ld->dev_gossip_time: NULL, NULL), IFDEV(ld->dev_fast_gossip, false), - IFDEV(ld->dev_fast_gossip_prune, false)); + IFDEV(ld->dev_fast_gossip_prune, false), + ld->config.ip_discovery); subd_req(ld->gossip, ld->gossip, take(msg), -1, 0, gossipd_init_done, NULL); diff --git a/lightningd/lightningd.h b/lightningd/lightningd.h index b41b86c8b..3d1d367e8 100644 --- a/lightningd/lightningd.h +++ b/lightningd/lightningd.h @@ -1,6 +1,7 @@ #ifndef LIGHTNING_LIGHTNINGD_LIGHTNINGD_H #define LIGHTNING_LIGHTNINGD_LIGHTNINGD_H #include "config.h" +#include #include #include #include @@ -58,6 +59,8 @@ struct config { /* Are we allowed to use DNS lookup for peers. */ bool use_dns; + /* Excplicitly turns 'on' or 'off' IP discovery feature. */ + enum opt_autobool ip_discovery; /* Turn off IP address announcement discovered via peer `remote_addr` */ bool disable_ip_discovery; diff --git a/lightningd/options.c b/lightningd/options.c index d5311314c..f3b72e9a2 100644 --- a/lightningd/options.c +++ b/lightningd/options.c @@ -843,6 +843,8 @@ static const struct config testnet_config = { .use_dns = true, + /* Excplicitly turns 'on' or 'off' IP discovery feature. */ + .ip_discovery = OPT_AUTOBOOL_AUTO, /* Turn off IP address announcement discovered via peer `remote_addr` */ .disable_ip_discovery = false, @@ -909,6 +911,8 @@ static const struct config mainnet_config = { .use_dns = true, + /* Excplicitly turns 'on' or 'off' IP discovery feature. */ + .ip_discovery = OPT_AUTOBOOL_AUTO, /* Turn off IP address announcement discovered via peer `remote_addr` */ .disable_ip_discovery = false, @@ -1211,9 +1215,13 @@ static void register_opts(struct lightningd *ld) opt_register_arg("--announce-addr", opt_add_announce_addr, NULL, ld, "Set an IP address (v4 or v6) or .onion v3 to announce, but not listen on"); + opt_register_noarg("--disable-ip-discovery", opt_set_bool, &ld->config.disable_ip_discovery, "Turn off announcement of discovered public IPs"); + opt_register_arg("--announce-addr-discovered", opt_set_autobool_arg, opt_show_autobool, + &ld->config.ip_discovery, + "Explicitly turns IP discovery 'on' or 'off'."); opt_register_noarg("--offline", opt_set_offline, ld, "Start in offline-mode (do not automatically reconnect and do not accept incoming connections)"); diff --git a/tests/test_connection.py b/tests/test_connection.py index ab6c34b73..c6010fcea 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -73,7 +73,8 @@ def test_remote_addr(node_factory, bitcoind): # don't announce anything per se opts = {'may_reconnect': True, 'dev-allow-localhost': None, - 'dev-no-reconnect': None} + 'dev-no-reconnect': None, + 'ip-discovery': True} l1, l2, l3 = node_factory.get_nodes(3, opts) # Disable announcing local autobind addresses with dev-allow-localhost.