@@ -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