@@ -30,6 +30,7 @@ use lightning::events::{Event, PathFailure};
3030#[ cfg( feature = "std" ) ]
3131use lightning:: events:: { EventHandler , EventsProvider } ;
3232use lightning:: ln:: channelmanager:: ChannelManager ;
33+ use lightning:: ln:: msgs:: OnionMessageHandler ;
3334use lightning:: ln:: peer_handler:: APeerManager ;
3435use lightning:: routing:: gossip:: { NetworkGraph , P2PGossipSync } ;
3536use lightning:: routing:: utxo:: UtxoLookup ;
@@ -104,6 +105,11 @@ const PING_TIMER: u64 = 30;
104105#[ cfg( test) ]
105106const PING_TIMER : u64 = 1 ;
106107
108+ #[ cfg( not( test) ) ]
109+ const ONION_MESSAGE_HANDLER_TIMER : u64 = 10 ;
110+ #[ cfg( test) ]
111+ const ONION_MESSAGE_HANDLER_TIMER : u64 = 1 ;
112+
107113/// Prune the network graph of stale entries hourly.
108114const NETWORK_PRUNE_TIMER : u64 = 60 * 60 ;
109115
@@ -270,18 +276,20 @@ fn update_scorer<'a, S: 'static + Deref<Target = SC> + Send + Sync, SC: 'a + Wri
270276}
271277
272278macro_rules! define_run_body {
273- ( $persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
274- $channel_manager: ident, $process_channel_manager_events: expr,
275- $gossip_sync: ident, $peer_manager: ident, $logger: ident, $scorer: ident,
276- $loop_exit_check: expr, $await: expr, $get_timer: expr, $timer_elapsed: expr,
277- $check_slow_await: expr)
278- => { {
279+ (
280+ $persister: ident, $chain_monitor: ident, $process_chain_monitor_events: expr,
281+ $channel_manager: ident, $process_channel_manager_events: expr,
282+ $peer_manager: ident, $process_onion_message_handler_events: expr, $gossip_sync: ident,
283+ $logger: ident, $scorer: ident, $loop_exit_check: expr, $await: expr, $get_timer: expr,
284+ $timer_elapsed: expr, $check_slow_await: expr
285+ ) => { {
279286 log_trace!( $logger, "Calling ChannelManager's timer_tick_occurred on startup" ) ;
280287 $channel_manager. timer_tick_occurred( ) ;
281288 log_trace!( $logger, "Rebroadcasting monitor's pending claims on startup" ) ;
282289 $chain_monitor. rebroadcast_pending_claims( ) ;
283290
284291 let mut last_freshness_call = $get_timer( FRESHNESS_TIMER ) ;
292+ let mut last_onion_message_handler_call = $get_timer( ONION_MESSAGE_HANDLER_TIMER ) ;
285293 let mut last_ping_call = $get_timer( PING_TIMER ) ;
286294 let mut last_prune_call = $get_timer( FIRST_NETWORK_PRUNE_TIMER ) ;
287295 let mut last_scorer_persist_call = $get_timer( SCORER_PERSIST_TIMER ) ;
@@ -291,6 +299,7 @@ macro_rules! define_run_body {
291299 loop {
292300 $process_channel_manager_events;
293301 $process_chain_monitor_events;
302+ $process_onion_message_handler_events;
294303
295304 // Note that the PeerManager::process_events may block on ChannelManager's locks,
296305 // hence it comes last here. When the ChannelManager finishes whatever it's doing,
@@ -334,6 +343,11 @@ macro_rules! define_run_body {
334343 $channel_manager. timer_tick_occurred( ) ;
335344 last_freshness_call = $get_timer( FRESHNESS_TIMER ) ;
336345 }
346+ if $timer_elapsed( & mut last_onion_message_handler_call, ONION_MESSAGE_HANDLER_TIMER ) {
347+ log_trace!( $logger, "Calling OnionMessageHandler's timer_tick_occurred" ) ;
348+ $peer_manager. onion_message_handler( ) . timer_tick_occurred( ) ;
349+ last_onion_message_handler_call = $get_timer( ONION_MESSAGE_HANDLER_TIMER ) ;
350+ }
337351 if await_slow {
338352 // On various platforms, we may be starved of CPU cycles for several reasons.
339353 // E.g. on iOS, if we've been in the background, we will be entirely paused.
@@ -603,8 +617,7 @@ pub async fn process_events_async<
603617 CM : ' static + Deref < Target = ChannelManager < CW , T , ES , NS , SP , F , R , L > > + Send + Sync ,
604618 PGS : ' static + Deref < Target = P2PGossipSync < G , UL , L > > + Send + Sync ,
605619 RGS : ' static + Deref < Target = RapidGossipSync < G , L > > + Send ,
606- APM : APeerManager + Send + Sync ,
607- PM : ' static + Deref < Target = APM > + Send + Sync ,
620+ PM : ' static + Deref + Send + Sync ,
608621 S : ' static + Deref < Target = SC > + Send + Sync ,
609622 SC : for < ' b > WriteableScore < ' b > ,
610623 SleepFuture : core:: future:: Future < Output = bool > + core:: marker:: Unpin ,
@@ -627,6 +640,7 @@ where
627640 L :: Target : ' static + Logger ,
628641 P :: Target : ' static + Persist < <SP :: Target as SignerProvider >:: EcdsaSigner > ,
629642 PS :: Target : ' static + Persister < ' a , CW , T , ES , NS , SP , F , R , L , SC > ,
643+ PM :: Target : APeerManager + Send + Sync ,
630644{
631645 let mut should_break = false ;
632646 let async_event_handler = |event| {
@@ -650,10 +664,12 @@ where
650664 event_handler ( event) . await ;
651665 }
652666 } ;
653- define_run_body ! ( persister,
654- chain_monitor, chain_monitor. process_pending_events_async( async_event_handler) . await ,
667+ define_run_body ! (
668+ persister, chain_monitor,
669+ chain_monitor. process_pending_events_async( async_event_handler) . await ,
655670 channel_manager, channel_manager. process_pending_events_async( async_event_handler) . await ,
656- gossip_sync, peer_manager, logger, scorer, should_break, {
671+ peer_manager, process_onion_message_handler_events_async( & peer_manager, async_event_handler) . await ,
672+ gossip_sync, logger, scorer, should_break, {
657673 let fut = Selector {
658674 a: channel_manager. get_event_or_persistence_needed_future( ) ,
659675 b: chain_monitor. get_update_future( ) ,
@@ -673,7 +689,29 @@ where
673689 task:: Poll :: Ready ( exit) => { should_break = exit; true } ,
674690 task:: Poll :: Pending => false ,
675691 }
676- } , mobile_interruptable_platform)
692+ } , mobile_interruptable_platform
693+ )
694+ }
695+
696+ #[ cfg( feature = "futures" ) ]
697+ async fn process_onion_message_handler_events_async <
698+ EventHandlerFuture : core:: future:: Future < Output = ( ) > ,
699+ EventHandler : Fn ( Event ) -> EventHandlerFuture ,
700+ PM : ' static + Deref + Send + Sync ,
701+ > (
702+ peer_manager : & PM , handler : EventHandler
703+ )
704+ where
705+ PM :: Target : APeerManager + Send + Sync ,
706+ {
707+ use lightning:: events:: EventsProvider ;
708+
709+ let events = core:: cell:: RefCell :: new ( Vec :: new ( ) ) ;
710+ peer_manager. onion_message_handler ( ) . process_pending_events ( & |e| events. borrow_mut ( ) . push ( e) ) ;
711+
712+ for event in events. into_inner ( ) {
713+ handler ( event) . await
714+ }
677715}
678716
679717#[ cfg( feature = "std" ) ]
@@ -742,8 +780,7 @@ impl BackgroundProcessor {
742780 CM : ' static + Deref < Target = ChannelManager < CW , T , ES , NS , SP , F , R , L > > + Send + Sync ,
743781 PGS : ' static + Deref < Target = P2PGossipSync < G , UL , L > > + Send + Sync ,
744782 RGS : ' static + Deref < Target = RapidGossipSync < G , L > > + Send ,
745- APM : APeerManager + Send + Sync ,
746- PM : ' static + Deref < Target = APM > + Send + Sync ,
783+ PM : ' static + Deref + Send + Sync ,
747784 S : ' static + Deref < Target = SC > + Send + Sync ,
748785 SC : for < ' b > WriteableScore < ' b > ,
749786 > (
@@ -763,6 +800,7 @@ impl BackgroundProcessor {
763800 L :: Target : ' static + Logger ,
764801 P :: Target : ' static + Persist < <SP :: Target as SignerProvider >:: EcdsaSigner > ,
765802 PS :: Target : ' static + Persister < ' a , CW , T , ES , NS , SP , F , R , L , SC > ,
803+ PM :: Target : APeerManager + Send + Sync ,
766804 {
767805 let stop_thread = Arc :: new ( AtomicBool :: new ( false ) ) ;
768806 let stop_thread_clone = stop_thread. clone ( ) ;
@@ -782,14 +820,18 @@ impl BackgroundProcessor {
782820 }
783821 event_handler. handle_event ( event) ;
784822 } ;
785- define_run_body ! ( persister, chain_monitor, chain_monitor. process_pending_events( & event_handler) ,
823+ define_run_body ! (
824+ persister, chain_monitor, chain_monitor. process_pending_events( & event_handler) ,
786825 channel_manager, channel_manager. process_pending_events( & event_handler) ,
787- gossip_sync, peer_manager, logger, scorer, stop_thread. load( Ordering :: Acquire ) ,
826+ peer_manager,
827+ peer_manager. onion_message_handler( ) . process_pending_events( & event_handler) ,
828+ gossip_sync, logger, scorer, stop_thread. load( Ordering :: Acquire ) ,
788829 { Sleeper :: from_two_futures(
789830 channel_manager. get_event_or_persistence_needed_future( ) ,
790831 chain_monitor. get_update_future( )
791832 ) . wait_timeout( Duration :: from_millis( 100 ) ) ; } ,
792- |_| Instant :: now( ) , |time: & Instant , dur| time. elapsed( ) . as_secs( ) > dur, false )
833+ |_| Instant :: now( ) , |time: & Instant , dur| time. elapsed( ) . as_secs( ) > dur, false
834+ )
793835 } ) ;
794836 Self { stop_thread : stop_thread_clone, thread_handle : Some ( handle) }
795837 }
@@ -1362,9 +1404,11 @@ mod tests {
13621404
13631405 #[ test]
13641406 fn test_timer_tick_called ( ) {
1365- // Test that `ChannelManager::timer_tick_occurred` is called every `FRESHNESS_TIMER`,
1366- // `ChainMonitor::rebroadcast_pending_claims` is called every `REBROADCAST_TIMER`, and
1367- // `PeerManager::timer_tick_occurred` every `PING_TIMER`.
1407+ // Test that:
1408+ // - `ChannelManager::timer_tick_occurred` is called every `FRESHNESS_TIMER`,
1409+ // - `ChainMonitor::rebroadcast_pending_claims` is called every `REBROADCAST_TIMER`,
1410+ // - `PeerManager::timer_tick_occurred` is called every `PING_TIMER`, and
1411+ // - `OnionMessageHandler::timer_tick_occurred` is called every `ONION_MESSAGE_HANDLER_TIMER`.
13681412 let ( _, nodes) = create_nodes ( 1 , "test_timer_tick_called" ) ;
13691413 let data_dir = nodes[ 0 ] . kv_store . get_data_dir ( ) ;
13701414 let persister = Arc :: new ( Persister :: new ( data_dir) ) ;
@@ -1375,9 +1419,11 @@ mod tests {
13751419 let desired_log_1 = "Calling ChannelManager's timer_tick_occurred" . to_string ( ) ;
13761420 let desired_log_2 = "Calling PeerManager's timer_tick_occurred" . to_string ( ) ;
13771421 let desired_log_3 = "Rebroadcasting monitor's pending claims" . to_string ( ) ;
1422+ let desired_log_4 = "Calling OnionMessageHandler's timer_tick_occurred" . to_string ( ) ;
13781423 if log_entries. get ( & ( "lightning_background_processor" , desired_log_1) ) . is_some ( ) &&
13791424 log_entries. get ( & ( "lightning_background_processor" , desired_log_2) ) . is_some ( ) &&
1380- log_entries. get ( & ( "lightning_background_processor" , desired_log_3) ) . is_some ( ) {
1425+ log_entries. get ( & ( "lightning_background_processor" , desired_log_3) ) . is_some ( ) &&
1426+ log_entries. get ( & ( "lightning_background_processor" , desired_log_4) ) . is_some ( ) {
13811427 break
13821428 }
13831429 }
0 commit comments