Skip to content

Commit ec76826

Browse files
OR InitFeatures and NodeFeatures from onion message handler
Similar to how we OR our InitFeaures and NodeFeatures across both our channel and routing message handlers, we also want to OR the features of our onion message handler.
1 parent a562228 commit ec76826

File tree

3 files changed

+36
-3
lines changed

3 files changed

+36
-3
lines changed

lightning/src/ln/msgs.rs

+13
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,19 @@ pub trait OnionMessageHandler : OnionMessageProvider {
980980
/// Indicates a connection to the peer failed/an existing connection was lost. Allows handlers to
981981
/// drop and refuse to forward onion messages to this peer.
982982
fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
983+
984+
// Handler information:
985+
/// Gets the node feature flags which this handler itself supports. All available handlers are
986+
/// queried similarly and their feature flags are OR'd together to form the [`NodeFeatures`]
987+
/// which are broadcasted in our node_announcement message.
988+
fn provided_node_features(&self) -> NodeFeatures;
989+
990+
/// Gets the init feature flags which should be sent to the given peer. All available handlers
991+
/// are queried similarly and their feature flags are OR'd together to form the [`InitFeatures`]
992+
/// which are sent in our [`Init`] message.
993+
///
994+
/// Note that this method is called before [`Self::peer_connected`].
995+
fn provided_init_features(&self, their_node_id: &PublicKey) -> InitFeatures;
983996
}
984997

985998
mod fuzzy_internal_msgs {

lightning/src/ln/peer_handler.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,10 @@ impl OnionMessageHandler for IgnoringMessageHandler {
8989
fn handle_onion_message(&self, _their_node_id: &PublicKey, _msg: &msgs::OnionMessage) {}
9090
fn peer_connected(&self, _their_node_id: &PublicKey, _init: &msgs::Init) {}
9191
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
92+
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
93+
InitFeatures::empty()
94+
}
95+
fn provided_node_features(&self) -> NodeFeatures { NodeFeatures::empty() }
9296
}
9397
impl Deref for IgnoringMessageHandler {
9498
type Target = IgnoringMessageHandler;
@@ -1062,7 +1066,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
10621066
peer.their_node_id = Some(their_node_id);
10631067
insert_node_id!();
10641068
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
1065-
.or(self.message_handler.route_handler.provided_init_features(&their_node_id));
1069+
.or(self.message_handler.route_handler.provided_init_features(&their_node_id))
1070+
.or(self.message_handler.onion_message_handler.provided_init_features(&their_node_id));
10661071
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
10671072
self.enqueue_message(peer, &resp);
10681073
peer.awaiting_pong_timer_tick_intervals = 0;
@@ -1075,7 +1080,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
10751080
peer.their_node_id = Some(their_node_id);
10761081
insert_node_id!();
10771082
let features = self.message_handler.chan_handler.provided_init_features(&their_node_id)
1078-
.or(self.message_handler.route_handler.provided_init_features(&their_node_id));
1083+
.or(self.message_handler.route_handler.provided_init_features(&their_node_id))
1084+
.or(self.message_handler.onion_message_handler.provided_init_features(&their_node_id));
10791085
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone()) };
10801086
self.enqueue_message(peer, &resp);
10811087
peer.awaiting_pong_timer_tick_intervals = 0;
@@ -1971,7 +1977,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
19711977
addresses.sort_by_key(|addr| addr.get_id());
19721978

19731979
let features = self.message_handler.chan_handler.provided_node_features()
1974-
.or(self.message_handler.route_handler.provided_node_features());
1980+
.or(self.message_handler.route_handler.provided_node_features())
1981+
.or(self.message_handler.onion_message_handler.provided_node_features());
19751982
let announcement = msgs::UnsignedNodeAnnouncement {
19761983
features,
19771984
timestamp: self.last_node_announcement_serial.fetch_add(1, Ordering::AcqRel) as u32,

lightning/src/onion_message/messenger.rs

+13
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use bitcoin::hashes::sha256::Hash as Sha256;
1616
use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
1717

1818
use chain::keysinterface::{InMemorySigner, KeysInterface, KeysManager, Recipient, Sign};
19+
use ln::features::{InitFeatures, NodeFeatures};
1920
use ln::msgs::{self, OnionMessageHandler};
2021
use ln::onion_utils;
2122
use super::blinded_route::{BlindedRoute, ForwardTlvs, ReceiveTlvs};
@@ -345,6 +346,18 @@ impl<Signer: Sign, K: Deref, L: Deref> OnionMessageHandler for OnionMessenger<Si
345346
let mut pending_msgs = self.pending_messages.lock().unwrap();
346347
pending_msgs.remove(their_node_id);
347348
}
349+
350+
fn provided_init_features(&self, _their_node_id: &PublicKey) -> InitFeatures {
351+
let mut features = InitFeatures::empty();
352+
features.set_onion_messages_optional();
353+
features
354+
}
355+
356+
fn provided_node_features(&self) -> NodeFeatures {
357+
let mut features = NodeFeatures::empty();
358+
features.set_onion_messages_optional();
359+
features
360+
}
348361
}
349362

350363
impl<Signer: Sign, K: Deref, L: Deref> OnionMessageProvider for OnionMessenger<Signer, K, L>

0 commit comments

Comments
 (0)