@@ -18,6 +18,7 @@ use bitcoin::secp256k1::{self, PublicKey, Scalar, Secp256k1, SecretKey};
1818use crate :: blinded_path:: BlindedPath ;
1919use crate :: blinded_path:: message:: { advance_path_by_one, ForwardTlvs , ReceiveTlvs } ;
2020use crate :: blinded_path:: utils;
21+ use crate :: events:: { Event , EventHandler , EventsProvider } ;
2122use crate :: sign:: { EntropySource , KeysManager , NodeSigner , Recipient } ;
2223#[ cfg( not( c_bindings) ) ]
2324use crate :: ln:: channelmanager:: { SimpleArcChannelManager , SimpleRefChannelManager } ;
@@ -164,21 +165,21 @@ enum OnionMessageBuffer {
164165 ConnectedPeer ( VecDeque < OnionMessage > ) ,
165166
166167 /// Messages for a node that is not yet connected.
167- PendingConnection ( VecDeque < OnionMessage > ) ,
168+ PendingConnection ( VecDeque < OnionMessage > , Option < Vec < SocketAddress > > ) ,
168169}
169170
170171impl OnionMessageBuffer {
171172 fn pending_messages ( & self ) -> & VecDeque < OnionMessage > {
172173 match self {
173174 OnionMessageBuffer :: ConnectedPeer ( pending_messages) => pending_messages,
174- OnionMessageBuffer :: PendingConnection ( pending_messages) => pending_messages,
175+ OnionMessageBuffer :: PendingConnection ( pending_messages, _ ) => pending_messages,
175176 }
176177 }
177178
178179 fn enqueue_message ( & mut self , message : OnionMessage ) {
179180 let pending_messages = match self {
180181 OnionMessageBuffer :: ConnectedPeer ( pending_messages) => pending_messages,
181- OnionMessageBuffer :: PendingConnection ( pending_messages) => pending_messages,
182+ OnionMessageBuffer :: PendingConnection ( pending_messages, _ ) => pending_messages,
182183 } ;
183184
184185 pending_messages. push_back ( message) ;
@@ -187,7 +188,7 @@ impl OnionMessageBuffer {
187188 fn dequeue_message ( & mut self ) -> Option < OnionMessage > {
188189 let pending_messages = match self {
189190 OnionMessageBuffer :: ConnectedPeer ( pending_messages) => pending_messages,
190- OnionMessageBuffer :: PendingConnection ( pending_messages) => {
191+ OnionMessageBuffer :: PendingConnection ( pending_messages, _ ) => {
191192 debug_assert ! ( false ) ;
192193 pending_messages
193194 } ,
@@ -200,14 +201,14 @@ impl OnionMessageBuffer {
200201 fn release_pending_messages ( & mut self ) -> VecDeque < OnionMessage > {
201202 let pending_messages = match self {
202203 OnionMessageBuffer :: ConnectedPeer ( pending_messages) => pending_messages,
203- OnionMessageBuffer :: PendingConnection ( pending_messages) => pending_messages,
204+ OnionMessageBuffer :: PendingConnection ( pending_messages, _ ) => pending_messages,
204205 } ;
205206
206207 core:: mem:: take ( pending_messages)
207208 }
208209
209210 fn mark_connected ( & mut self ) {
210- if let OnionMessageBuffer :: PendingConnection ( pending_messages) = self {
211+ if let OnionMessageBuffer :: PendingConnection ( pending_messages, _ ) = self {
211212 let mut new_pending_messages = VecDeque :: new ( ) ;
212213 core:: mem:: swap ( pending_messages, & mut new_pending_messages) ;
213214 * self = OnionMessageBuffer :: ConnectedPeer ( new_pending_messages) ;
@@ -379,6 +380,8 @@ pub enum SendError {
379380 /// The provided [`Destination`] was an invalid [`BlindedPath`] due to not having any blinded
380381 /// hops.
381382 TooFewBlindedHops ,
383+ /// The first hop does not support onion message forwarding.
384+ InvalidFirstHop ( PublicKey ) ,
382385 /// A path from the sender to the destination could not be found by the [`MessageRouter`].
383386 PathNotFound ,
384387 /// Onion message contents must have a TLV type >= 64.
@@ -451,12 +454,12 @@ pub enum PeeledOnion<T: OnionMessageContents> {
451454pub fn create_onion_message < ES : Deref , NS : Deref , T : OnionMessageContents > (
452455 entropy_source : & ES , node_signer : & NS , secp_ctx : & Secp256k1 < secp256k1:: All > ,
453456 path : OnionMessagePath , contents : T , reply_path : Option < BlindedPath > ,
454- ) -> Result < ( PublicKey , OnionMessage ) , SendError >
457+ ) -> Result < ( PublicKey , OnionMessage , Option < Vec < SocketAddress > > ) , SendError >
455458where
456459 ES :: Target : EntropySource ,
457460 NS :: Target : NodeSigner ,
458461{
459- let OnionMessagePath { intermediate_nodes, mut destination, .. } = path;
462+ let OnionMessagePath { intermediate_nodes, mut destination, addresses } = path;
460463 if let Destination :: BlindedPath ( BlindedPath { ref blinded_hops, .. } ) = destination {
461464 if blinded_hops. is_empty ( ) {
462465 return Err ( SendError :: TooFewBlindedHops ) ;
@@ -497,10 +500,8 @@ where
497500 let onion_routing_packet = construct_onion_message_packet (
498501 packet_payloads, packet_keys, prng_seed) . map_err ( |( ) | SendError :: TooBigPacket ) ?;
499502
500- Ok ( ( first_node_id, OnionMessage {
501- blinding_point,
502- onion_routing_packet
503- } ) )
503+ let message = OnionMessage { blinding_point, onion_routing_packet } ;
504+ Ok ( ( first_node_id, message, addresses) )
504505}
505506
506507/// Decode one layer of an incoming [`OnionMessage`].
@@ -656,7 +657,7 @@ where
656657 pub ( super ) fn send_onion_message_using_path < T : OnionMessageContents > (
657658 & self , path : OnionMessagePath , contents : T , reply_path : Option < BlindedPath >
658659 ) -> Result < SendSuccess , SendError > {
659- let ( first_node_id, onion_message) = create_onion_message (
660+ let ( first_node_id, onion_message, addresses ) = create_onion_message (
660661 & self . entropy_source , & self . node_signer , & self . secp_ctx , path, contents, reply_path
661662 ) ?;
662663
@@ -666,10 +667,14 @@ where
666667 }
667668
668669 match message_buffers. entry ( first_node_id) {
669- hash_map:: Entry :: Vacant ( e) => {
670- e. insert ( OnionMessageBuffer :: PendingConnection ( VecDeque :: new ( ) ) )
671- . enqueue_message ( onion_message) ;
672- Ok ( SendSuccess :: BufferedAwaitingConnection ( first_node_id) )
670+ hash_map:: Entry :: Vacant ( e) => match addresses {
671+ None => Err ( SendError :: InvalidFirstHop ( first_node_id) ) ,
672+ Some ( addresses) => {
673+ e. insert (
674+ OnionMessageBuffer :: PendingConnection ( VecDeque :: new ( ) , Some ( addresses) )
675+ ) . enqueue_message ( onion_message) ;
676+ Ok ( SendSuccess :: BufferedAwaitingConnection ( first_node_id) )
677+ } ,
673678 } ,
674679 hash_map:: Entry :: Occupied ( mut e) => {
675680 e. get_mut ( ) . enqueue_message ( onion_message) ;
@@ -757,6 +762,27 @@ fn outbound_buffer_full(peer_node_id: &PublicKey, buffer: &HashMap<PublicKey, On
757762 false
758763}
759764
765+ impl < ES : Deref , NS : Deref , L : Deref , MR : Deref , OMH : Deref , CMH : Deref > EventsProvider
766+ for OnionMessenger < ES , NS , L , MR , OMH , CMH >
767+ where
768+ ES :: Target : EntropySource ,
769+ NS :: Target : NodeSigner ,
770+ L :: Target : Logger ,
771+ MR :: Target : MessageRouter ,
772+ OMH :: Target : OffersMessageHandler ,
773+ CMH :: Target : CustomOnionMessageHandler ,
774+ {
775+ fn process_pending_events < H : Deref > ( & self , handler : H ) where H :: Target : EventHandler {
776+ for ( node_id, recipient) in self . message_buffers . lock ( ) . unwrap ( ) . iter_mut ( ) {
777+ if let OnionMessageBuffer :: PendingConnection ( _, addresses) = recipient {
778+ if let Some ( addresses) = addresses. take ( ) {
779+ handler. handle_event ( Event :: ConnectionNeeded { node_id : * node_id, addresses } ) ;
780+ }
781+ }
782+ }
783+ }
784+ }
785+
760786impl < ES : Deref , NS : Deref , L : Deref , MR : Deref , OMH : Deref , CMH : Deref > OnionMessageHandler
761787for OnionMessenger < ES , NS , L , MR , OMH , CMH >
762788where
0 commit comments