From e34a2bc722a998376576eb5f2e60bbafefaed7f4 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 7 Sep 2022 17:55:01 +0000 Subject: [PATCH] Add a new InitFeatures constructor to capture the types of flags When `ChannelMessageHandler` implementations wish to return an `InitFeatures` which contain all the known flags that are relevant to channel handling, but not gossip handling, they currently need to do so by manually constructing an InitFeatures with all known flags and then clearing the ones they dont want. Instead of spreading this logic out across the codebase, this consolidates such construction to one place in features.rs. --- lightning/src/ln/channelmanager.rs | 2 +- lightning/src/ln/features.rs | 16 +++++++++++----- lightning/src/ln/peer_handler.rs | 6 +++++- lightning/src/util/test_utils.rs | 2 +- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/lightning/src/ln/channelmanager.rs b/lightning/src/ln/channelmanager.rs index 20fd5a38..7d09a5b8 100644 --- a/lightning/src/ln/channelmanager.rs +++ b/lightning/src/ln/channelmanager.rs @@ -6126,7 +6126,7 @@ impl } fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures { - InitFeatures::known() + InitFeatures::known_channel_features() } } diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index c978c61a..e5e9db03 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -163,6 +163,8 @@ mod sealed { , ], optional_features: [ + // Note that if new "non-channel-related" flags are added here they should be + // explicitly cleared in InitFeatures::known_channel_features. // Byte 0 DataLossProtect | InitialRoutingSync | UpfrontShutdownScript | GossipQueries, // Byte 1 @@ -545,6 +547,14 @@ impl InitFeatures { pub(crate) fn to_context(&self) -> Features { self.to_context_internal() } + + /// Returns the set of known init features that are related to channels. At least some of + /// these features are likely required for peers to talk to us. + pub fn known_channel_features() -> InitFeatures { + let mut features = Self::known().clear_gossip_queries(); + features.clear_initial_routing_sync(); + features + } } impl InvoiceFeatures { @@ -763,7 +773,6 @@ impl Features { impl Features { - #[cfg(test)] pub(crate) fn clear_gossip_queries(mut self) -> Self { ::clear_bits(&mut self.flags); self @@ -771,10 +780,7 @@ impl Features { } impl Features { - // We are no longer setting initial_routing_sync now that gossip_queries - // is enabled. This feature is ignored by a peer when gossip_queries has - // been negotiated. - #[cfg(test)] + // Note that initial_routing_sync is ignored if gossip_queries is set. pub(crate) fn clear_initial_routing_sync(&mut self) { ::clear_bits(&mut self.flags) } diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index 4c83c8cf..417b14d1 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -206,7 +206,11 @@ impl ChannelMessageHandler for ErroringMessageHandler { fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {} fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {} fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() } - fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { InitFeatures::known() } + fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { + // Use our known channel feature set as peers may otherwise not be willing to talk to us at + // all. + InitFeatures::known_channel_features() + } } impl Deref for ErroringMessageHandler { type Target = ErroringMessageHandler; diff --git a/lightning/src/util/test_utils.rs b/lightning/src/util/test_utils.rs index a5389f92..7c7aeb5d 100644 --- a/lightning/src/util/test_utils.rs +++ b/lightning/src/util/test_utils.rs @@ -361,7 +361,7 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler { NodeFeatures::empty() } fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures { - InitFeatures::known() + InitFeatures::known_channel_features() } } -- 2.30.2