X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Ffeatures.rs;h=3ce3d4fa7e604b9e0fb979dd8f4da0911adbdda2;hb=36cc5814c1802dee2541c52497f8b4f034876daa;hp=8966d8d40b31476c8ffb67e1e794d907823dd6b1;hpb=4395b92cc8bfe0cc803e70bba11f4db58d5d0dbf;p=rust-lightning diff --git a/lightning/src/ln/features.rs b/lightning/src/ln/features.rs index 8966d8d4..3ce3d4fa 100644 --- a/lightning/src/ln/features.rs +++ b/lightning/src/ln/features.rs @@ -104,7 +104,7 @@ mod sealed { ], optional_features: [ // Byte 0 - DataLossProtect | InitialRoutingSync | UpfrontShutdownScript, + DataLossProtect | InitialRoutingSync | UpfrontShutdownScript | GossipQueries, // Byte 1 VariableLengthOnion | PaymentSecret, // Byte 2 @@ -122,7 +122,7 @@ mod sealed { ], optional_features: [ // Byte 0 - DataLossProtect | UpfrontShutdownScript, + DataLossProtect | UpfrontShutdownScript | GossipQueries, // Byte 1 VariableLengthOnion | PaymentSecret, // Byte 2 @@ -243,6 +243,8 @@ mod sealed { "Feature flags for `initial_routing_sync`."); define_feature!(5, UpfrontShutdownScript, [InitContext, NodeContext], "Feature flags for `option_upfront_shutdown_script`."); + define_feature!(7, GossipQueries, [InitContext, NodeContext], + "Feature flags for `gossip_queries`."); define_feature!(9, VariableLengthOnion, [InitContext, NodeContext], "Feature flags for `var_onion_optin`."); define_feature!(13, StaticRemoteKey, [InitContext, NodeContext], @@ -279,6 +281,8 @@ mod sealed { /// Tracks the set of features which a node implements, templated by the context in which it /// appears. +/// +/// (C-not exported) as we map the concrete feature types below directly instead pub struct Features { /// Note that, for convenience, flags is LITTLE endian (despite being big-endian on the wire) flags: Vec, @@ -471,6 +475,22 @@ impl Features { } } + +impl Features { + #[cfg(test)] + pub(crate) fn requires_gossip_queries(&self) -> bool { + ::requires_feature(&self.flags) + } + pub(crate) fn supports_gossip_queries(&self) -> bool { + ::supports_feature(&self.flags) + } + #[cfg(test)] + pub(crate) fn clear_gossip_queries(mut self) -> Self { + ::clear_bits(&mut self.flags); + self + } +} + impl Features { #[cfg(test)] pub(crate) fn requires_variable_length_onion(&self) -> bool { @@ -495,6 +515,10 @@ impl Features { pub(crate) fn initial_routing_sync(&self) -> bool { ::supports_feature(&self.flags) } + // 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)] pub(crate) fn clear_initial_routing_sync(&mut self) { ::clear_bits(&mut self.flags) } @@ -566,6 +590,11 @@ mod tests { assert!(!InitFeatures::known().requires_upfront_shutdown_script()); assert!(!NodeFeatures::known().requires_upfront_shutdown_script()); + assert!(InitFeatures::known().supports_gossip_queries()); + assert!(NodeFeatures::known().supports_gossip_queries()); + assert!(!InitFeatures::known().requires_gossip_queries()); + assert!(!NodeFeatures::known().requires_gossip_queries()); + assert!(InitFeatures::known().supports_data_loss_protect()); assert!(NodeFeatures::known().supports_data_loss_protect()); assert!(!InitFeatures::known().requires_data_loss_protect()); @@ -618,9 +647,10 @@ mod tests { #[test] fn convert_to_context_with_relevant_flags() { - let init_features = InitFeatures::known().clear_upfront_shutdown_script(); + let init_features = InitFeatures::known().clear_upfront_shutdown_script().clear_gossip_queries(); assert!(init_features.initial_routing_sync()); assert!(!init_features.supports_upfront_shutdown_script()); + assert!(!init_features.supports_gossip_queries()); let node_features: NodeFeatures = init_features.to_context(); { @@ -637,8 +667,10 @@ mod tests { // Check that cleared flags are kept blank when converting back: // - initial_routing_sync was not applicable to NodeContext // - upfront_shutdown_script was cleared before converting + // - gossip_queries was cleared before converting let features: InitFeatures = node_features.to_context_internal(); assert!(!features.initial_routing_sync()); assert!(!features.supports_upfront_shutdown_script()); + assert!(!init_features.supports_gossip_queries()); } }