Add a new InitFeatures constructor to capture the types of flags
authorMatt Corallo <git@bluematt.me>
Wed, 7 Sep 2022 17:55:01 +0000 (17:55 +0000)
committerMatt Corallo <git@bluematt.me>
Fri, 9 Sep 2022 15:36:46 +0000 (15:36 +0000)
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
lightning/src/ln/features.rs
lightning/src/ln/peer_handler.rs
lightning/src/util/test_utils.rs

index 20fd5a38bd7ae38057fbbcbea8fcddeb70a6226f..7d09a5b81a839241d13003f2f4d9a947cf44b808 100644 (file)
@@ -6126,7 +6126,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
        }
 
        fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures {
-               InitFeatures::known()
+               InitFeatures::known_channel_features()
        }
 }
 
index c978c61a3a563428e38f3368e557e544a6c623b9..e5e9db0352b1a45785fbec38507b31e1b3605c72 100644 (file)
@@ -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<C: sealed::Context>(&self) -> Features<C> {
                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<T: sealed::UpfrontShutdownScript> Features<T> {
 
 
 impl<T: sealed::GossipQueries> Features<T> {
-       #[cfg(test)]
        pub(crate) fn clear_gossip_queries(mut self) -> Self {
                <T as sealed::GossipQueries>::clear_bits(&mut self.flags);
                self
@@ -771,10 +780,7 @@ impl<T: sealed::GossipQueries> Features<T> {
 }
 
 impl<T: sealed::InitialRoutingSync> Features<T> {
-       // 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) {
                <T as sealed::InitialRoutingSync>::clear_bits(&mut self.flags)
        }
index 4c83c8cf42da117052868fb7d999f7b73bc03e09..417b14d15b2c9637d64d78997cbae2d2b56de201 100644 (file)
@@ -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;
index a5389f92b50194a2e90e0c0dfaa3fa3006897cb4..7c7aeb5d44f03da527b549f6d816c0ae1a3fce3b 100644 (file)
@@ -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()
        }
 }