,
],
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
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 {
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
}
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)
}
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;