Skip to content

Commit 3fb3218

Browse files
authored
Merge pull request #1701 from TheBlueMatt/2022-09-feature-or
Fetch InitFeatures from both Channel and Routing Message Handlers
2 parents ba69536 + 1b67b0b commit 3fb3218

File tree

7 files changed

+64
-11
lines changed

7 files changed

+64
-11
lines changed

lightning-net-tokio/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -582,6 +582,7 @@ mod tests {
582582
fn handle_reply_short_channel_ids_end(&self, _their_node_id: &PublicKey, _msg: ReplyShortChannelIdsEnd) -> Result<(), LightningError> { Ok(()) }
583583
fn handle_query_channel_range(&self, _their_node_id: &PublicKey, _msg: QueryChannelRange) -> Result<(), LightningError> { Ok(()) }
584584
fn handle_query_short_channel_ids(&self, _their_node_id: &PublicKey, _msg: QueryShortChannelIds) -> Result<(), LightningError> { Ok(()) }
585+
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { InitFeatures::known() }
585586
}
586587
impl ChannelMessageHandler for MsgHandler {
587588
fn handle_open_channel(&self, _their_node_id: &PublicKey, _their_features: InitFeatures, _msg: &OpenChannel) {}
@@ -614,6 +615,7 @@ mod tests {
614615
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &ChannelReestablish) {}
615616
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &ErrorMessage) {}
616617
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::known() }
618+
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures { InitFeatures::known() }
617619
}
618620
impl MessageSendEventsProvider for MsgHandler {
619621
fn get_and_clear_pending_msg_events(&self) -> Vec<MessageSendEvent> {

lightning/src/ln/channelmanager.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6124,6 +6124,10 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
61246124
fn provided_node_features(&self) -> NodeFeatures {
61256125
NodeFeatures::known()
61266126
}
6127+
6128+
fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures {
6129+
InitFeatures::known_channel_features()
6130+
}
61276131
}
61286132

61296133
const SERIALIZATION_VERSION: u8 = 1;

lightning/src/ln/features.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ mod sealed {
163163
,
164164
],
165165
optional_features: [
166+
// Note that if new "non-channel-related" flags are added here they should be
167+
// explicitly cleared in InitFeatures::known_channel_features.
166168
// Byte 0
167169
DataLossProtect | InitialRoutingSync | UpfrontShutdownScript | GossipQueries,
168170
// Byte 1
@@ -545,6 +547,14 @@ impl InitFeatures {
545547
pub(crate) fn to_context<C: sealed::Context>(&self) -> Features<C> {
546548
self.to_context_internal()
547549
}
550+
551+
/// Returns the set of known init features that are related to channels. At least some of
552+
/// these features are likely required for peers to talk to us.
553+
pub fn known_channel_features() -> InitFeatures {
554+
Self::known()
555+
.clear_initial_routing_sync()
556+
.clear_gossip_queries()
557+
}
548558
}
549559

550560
impl InvoiceFeatures {
@@ -763,20 +773,17 @@ impl<T: sealed::UpfrontShutdownScript> Features<T> {
763773

764774

765775
impl<T: sealed::GossipQueries> Features<T> {
766-
#[cfg(test)]
767776
pub(crate) fn clear_gossip_queries(mut self) -> Self {
768777
<T as sealed::GossipQueries>::clear_bits(&mut self.flags);
769778
self
770779
}
771780
}
772781

773782
impl<T: sealed::InitialRoutingSync> Features<T> {
774-
// We are no longer setting initial_routing_sync now that gossip_queries
775-
// is enabled. This feature is ignored by a peer when gossip_queries has
776-
// been negotiated.
777-
#[cfg(test)]
778-
pub(crate) fn clear_initial_routing_sync(&mut self) {
779-
<T as sealed::InitialRoutingSync>::clear_bits(&mut self.flags)
783+
// Note that initial_routing_sync is ignored if gossip_queries is set.
784+
pub(crate) fn clear_initial_routing_sync(mut self) -> Self {
785+
<T as sealed::InitialRoutingSync>::clear_bits(&mut self.flags);
786+
self
780787
}
781788
}
782789

@@ -915,7 +922,7 @@ mod tests {
915922

916923
let mut init_features = InitFeatures::known();
917924
assert!(init_features.initial_routing_sync());
918-
init_features.clear_initial_routing_sync();
925+
init_features = init_features.clear_initial_routing_sync();
919926
assert!(!init_features.initial_routing_sync());
920927
}
921928

lightning/src/ln/msgs.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -902,6 +902,13 @@ pub trait ChannelMessageHandler : MessageSendEventsProvider {
902902
/// queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`]
903903
/// which are broadcasted in our node_announcement message.
904904
fn provided_node_features(&self) -> NodeFeatures;
905+
906+
/// Gets the init feature flags which should be sent to the given peer. All available handlers
907+
/// are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
908+
/// which are sent in our [`Init`] message.
909+
///
910+
/// Note that this method is called before [`Self::peer_connected`].
911+
fn provided_init_features(&self, their_node_id: &PublicKey) -> InitFeatures;
905912
}
906913

907914
/// A trait to describe an object which can receive routing messages.
@@ -949,6 +956,14 @@ pub trait RoutingMessageHandler : MessageSendEventsProvider {
949956
/// Handles when a peer asks us to send routing gossip messages for a
950957
/// list of short_channel_ids.
951958
fn handle_query_short_channel_ids(&self, their_node_id: &PublicKey, msg: QueryShortChannelIds) -> Result<(), LightningError>;
959+
960+
// Handler information:
961+
/// Gets the init feature flags which should be sent to the given peer. All available handlers
962+
/// are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
963+
/// which are sent in our [`Init`] message.
964+
///
965+
/// Note that this method is called before [`Self::peer_connected`].
966+
fn provided_init_features(&self, their_node_id: &PublicKey) -> InitFeatures;
952967
}
953968

954969
/// A trait to describe an object that can receive onion messages.

lightning/src/ln/peer_handler.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,9 @@ impl RoutingMessageHandler for IgnoringMessageHandler {
7777
fn handle_reply_short_channel_ids_end(&self, _their_node_id: &PublicKey, _msg: msgs::ReplyShortChannelIdsEnd) -> Result<(), LightningError> { Ok(()) }
7878
fn handle_query_channel_range(&self, _their_node_id: &PublicKey, _msg: msgs::QueryChannelRange) -> Result<(), LightningError> { Ok(()) }
7979
fn handle_query_short_channel_ids(&self, _their_node_id: &PublicKey, _msg: msgs::QueryShortChannelIds) -> Result<(), LightningError> { Ok(()) }
80+
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
81+
InitFeatures::empty()
82+
}
8083
}
8184
impl OnionMessageProvider for IgnoringMessageHandler {
8285
fn next_onion_message_for_peer(&self, _peer_node_id: PublicKey) -> Option<msgs::OnionMessage> { None }
@@ -203,6 +206,11 @@ impl ChannelMessageHandler for ErroringMessageHandler {
203206
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
204207
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
205208
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
209+
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
210+
// Use our known channel feature set as peers may otherwise not be willing to talk to us at
211+
// all.
212+
InitFeatures::known_channel_features()
213+
}
206214
}
207215
impl Deref for ErroringMessageHandler {
208216
type Target = ErroringMessageHandler;
@@ -1052,7 +1060,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
10521060

10531061
peer.their_node_id = Some(their_node_id);
10541062
insert_node_id!();
1055-
let features = InitFeatures::known();
1063+
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
1064+
.or(self.message_handler.route_handler.provided_init_features(&their_node_id));
10561065
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
10571066
self.enqueue_message(peer, &resp);
10581067
peer.awaiting_pong_timer_tick_intervals = 0;
@@ -1064,7 +1073,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
10641073
peer.pending_read_is_header = true;
10651074
peer.their_node_id = Some(their_node_id);
10661075
insert_node_id!();
1067-
let features = InitFeatures::known();
1076+
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
1077+
.or(self.message_handler.route_handler.provided_init_features(&their_node_id));
10681078
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
10691079
self.enqueue_message(peer, &resp);
10701080
peer.awaiting_pong_timer_tick_intervals = 0;

lightning/src/routing/gossip.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use bitcoin::hash_types::BlockHash;
2222
use chain;
2323
use chain::Access;
2424
use ln::chan_utils::make_funding_redeemscript;
25-
use ln::features::{ChannelFeatures, NodeFeatures};
25+
use ln::features::{ChannelFeatures, NodeFeatures, InitFeatures};
2626
use ln::msgs::{DecodeError, ErrorAction, Init, LightningError, RoutingMessageHandler, NetAddress, MAX_VALUE_MSAT};
2727
use ln::msgs::{ChannelAnnouncement, ChannelUpdate, NodeAnnouncement, GossipTimestampFilter};
2828
use ln::msgs::{QueryChannelRange, ReplyChannelRange, QueryShortChannelIds, ReplyShortChannelIdsEnd};
@@ -570,6 +570,12 @@ where C::Target: chain::Access, L::Target: Logger
570570
action: ErrorAction::IgnoreError,
571571
})
572572
}
573+
574+
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
575+
let mut features = InitFeatures::empty();
576+
features.set_gossip_queries_optional();
577+
features
578+
}
573579
}
574580

575581
impl<G: Deref<Target=NetworkGraph<L>>, C: Deref, L: Deref> MessageSendEventsProvider for P2PGossipSync<G, C, L>

lightning/src/util/test_utils.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,9 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
360360
fn provided_node_features(&self) -> NodeFeatures {
361361
NodeFeatures::empty()
362362
}
363+
fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures {
364+
InitFeatures::known_channel_features()
365+
}
363366
}
364367

365368
impl events::MessageSendEventsProvider for TestChannelMessageHandler {
@@ -507,6 +510,12 @@ impl msgs::RoutingMessageHandler for TestRoutingMessageHandler {
507510
fn handle_query_short_channel_ids(&self, _their_node_id: &PublicKey, _msg: msgs::QueryShortChannelIds) -> Result<(), msgs::LightningError> {
508511
Ok(())
509512
}
513+
514+
fn provided_init_features(&self, _their_init_features: &PublicKey) -> InitFeatures {
515+
let mut features = InitFeatures::empty();
516+
features.set_gossip_queries_optional();
517+
features
518+
}
510519
}
511520

512521
impl events::MessageSendEventsProvider for TestRoutingMessageHandler {

0 commit comments

Comments
 (0)