Provide features in CustomMessageHandler

CustomMessageHandler implementations may need to advertise support for
features. Add methods to CustomMessageHandler to provide these and
combine them with features from other message handlers.
This commit is contained in:
Jeffrey Czyz 2023-04-13 13:08:45 -05:00
parent 687e587a73
commit 415973eaa3
No known key found for this signature in database
GPG Key ID: 3A4E08275D5E96D2
2 changed files with 61 additions and 3 deletions

View File

@ -20,6 +20,7 @@
//! # use bitcoin::secp256k1::PublicKey;
//! # use lightning::io;
//! # use lightning::ln::msgs::{DecodeError, LightningError};
//! # use lightning::ln::features::{InitFeatures, NodeFeatures};
//! use lightning::ln::peer_handler::CustomMessageHandler;
//! use lightning::ln::wire::{CustomMessageReader, self};
//! use lightning::util::ser::Writeable;
@ -66,6 +67,12 @@
//! # fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> {
//! # unimplemented!()
//! # }
//! # fn provided_node_features(&self) -> NodeFeatures {
//! # unimplemented!()
//! # }
//! # fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
//! # unimplemented!()
//! # }
//! }
//!
//! #[derive(Debug)]
@ -106,6 +113,12 @@
//! # fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> {
//! # unimplemented!()
//! # }
//! # fn provided_node_features(&self) -> NodeFeatures {
//! # unimplemented!()
//! # }
//! # fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
//! # unimplemented!()
//! # }
//! }
//!
//! #[derive(Debug)]
@ -146,6 +159,12 @@
//! # fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> {
//! # unimplemented!()
//! # }
//! # fn provided_node_features(&self) -> NodeFeatures {
//! # unimplemented!()
//! # }
//! # fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
//! # unimplemented!()
//! # }
//! }
//!
//! # fn main() {
@ -268,6 +287,22 @@ macro_rules! composite_custom_message_handler {
)*
.collect()
}
fn provided_node_features(&self) -> $crate::lightning::ln::features::NodeFeatures {
$crate::lightning::ln::features::NodeFeatures::empty()
$(
| self.$field.provided_node_features()
)*
}
fn provided_init_features(
&self, their_node_id: &$crate::bitcoin::secp256k1::PublicKey
) -> $crate::lightning::ln::features::InitFeatures {
$crate::lightning::ln::features::InitFeatures::empty()
$(
| self.$field.provided_init_features(their_node_id)
)*
}
}
impl $crate::lightning::ln::wire::CustomMessageReader for $handler {

View File

@ -64,6 +64,20 @@ pub trait CustomMessageHandler: wire::CustomMessageReader {
/// in the process. Each message is paired with the node id of the intended recipient. If no
/// connection to the node exists, then the message is simply not sent.
fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)>;
/// Gets the node feature flags which this handler itself supports. All available handlers are
/// queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`]
/// which are broadcasted in our [`NodeAnnouncement`] message.
///
/// [`NodeAnnouncement`]: crate::ln::msgs::NodeAnnouncement
fn provided_node_features(&self) -> NodeFeatures;
/// Gets the init feature flags which should be sent to the given peer. All available handlers
/// are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
/// which are sent in our [`Init`] message.
///
/// [`Init`]: crate::ln::msgs::Init
fn provided_init_features(&self, their_node_id: &PublicKey) -> InitFeatures;
}
/// A dummy struct which implements `RoutingMessageHandler` without storing any routing information
@ -149,6 +163,12 @@ impl CustomMessageHandler for IgnoringMessageHandler {
}
fn get_and_clear_pending_msg(&self) -> Vec<(PublicKey, Self::CustomMessage)> { Vec::new() }
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
InitFeatures::empty()
}
}
/// A dummy struct which implements `ChannelMessageHandler` without having any channels.
@ -1247,7 +1267,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
insert_node_id!();
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
| self.message_handler.route_handler.provided_init_features(&their_node_id)
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id);
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id)
| self.message_handler.custom_message_handler.provided_init_features(&their_node_id);
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
self.enqueue_message(peer, &resp);
peer.awaiting_pong_timer_tick_intervals = 0;
@ -1261,7 +1282,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
insert_node_id!();
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
| self.message_handler.route_handler.provided_init_features(&their_node_id)
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id);
| self.message_handler.onion_message_handler.provided_init_features(&their_node_id)
| self.message_handler.custom_message_handler.provided_init_features(&their_node_id);
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
self.enqueue_message(peer, &resp);
peer.awaiting_pong_timer_tick_intervals = 0;
@ -2203,7 +2225,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
let features = self.message_handler.chan_handler.provided_node_features()
| self.message_handler.route_handler.provided_node_features()
| self.message_handler.onion_message_handler.provided_node_features();
| self.message_handler.onion_message_handler.provided_node_features()
| self.message_handler.custom_message_handler.provided_node_features();
let announcement = msgs::UnsignedNodeAnnouncement {
features,
timestamp: self.last_node_announcement_serial.fetch_add(1, Ordering::AcqRel),