@@ -130,8 +130,8 @@ pub use builder::BuildError;
130130pub use builder:: NodeBuilder as Builder ;
131131use chain:: ChainSource ;
132132use config:: {
133- default_user_config, may_announce_channel, AsyncPaymentsRole , ChannelConfig , Config ,
134- LNURL_AUTH_TIMEOUT_SECS , NODE_ANN_BCAST_INTERVAL , PEER_RECONNECTION_INTERVAL ,
133+ default_user_config, has_port_zero , may_announce_channel, AsyncPaymentsRole , ChannelConfig ,
134+ Config , LNURL_AUTH_TIMEOUT_SECS , NODE_ANN_BCAST_INTERVAL , PEER_RECONNECTION_INTERVAL ,
135135 RGS_SYNC_INTERVAL ,
136136} ;
137137use connection:: ConnectionManager ;
@@ -356,7 +356,12 @@ impl Node {
356356 ) ;
357357 }
358358
359- if let Some ( listening_addresses) = & self . config . listening_addresses {
359+ let effective_listening_addresses = self
360+ . connection_manager
361+ . last_bound_addresses ( )
362+ . or_else ( || self . config . listening_addresses . clone ( ) ) ;
363+
364+ if let Some ( listening_addresses) = & effective_listening_addresses {
360365 // Setup networking
361366 let peer_manager_connection_handler = Arc :: clone ( & self . peer_manager ) ;
362367 let listening_logger = Arc :: clone ( & self . logger ) ;
@@ -378,14 +383,31 @@ impl Node {
378383 }
379384
380385 let logger = Arc :: clone ( & listening_logger) ;
381- let listeners = self . runtime . block_on ( async move {
386+ let ( listeners, bound_addrs ) = self . runtime . block_on ( async move {
382387 let mut listeners = Vec :: new ( ) ;
388+ let mut bound_addrs = Vec :: new ( ) ;
383389
384- // Try to bind to all addresses
385390 for addr in & * bind_addrs {
386391 match tokio:: net:: TcpListener :: bind ( addr) . await {
387392 Ok ( listener) => {
388- log_trace ! ( logger, "Listener bound to {}" , addr) ;
393+ let local_addr = listener. local_addr ( ) . map_err ( |e| {
394+ log_error ! (
395+ logger,
396+ "Failed to retrieve local address from listener: {}" ,
397+ e
398+ ) ;
399+ Error :: InvalidSocketAddress
400+ } ) ?;
401+ let socket_address = match local_addr {
402+ std:: net:: SocketAddr :: V4 ( a) => {
403+ SocketAddress :: TcpIpV4 { addr : a. ip ( ) . octets ( ) , port : a. port ( ) }
404+ } ,
405+ std:: net:: SocketAddr :: V6 ( a) => {
406+ SocketAddress :: TcpIpV6 { addr : a. ip ( ) . octets ( ) , port : a. port ( ) }
407+ } ,
408+ } ;
409+ log_info ! ( logger, "Listening on {}" , socket_address) ;
410+ bound_addrs. push ( socket_address) ;
389411 listeners. push ( listener) ;
390412 } ,
391413 Err ( e) => {
@@ -400,9 +422,11 @@ impl Node {
400422 }
401423 }
402424
403- Ok ( listeners)
425+ Ok ( ( listeners, bound_addrs ) )
404426 } ) ?;
405427
428+ self . connection_manager . set_last_bound_addresses ( bound_addrs) ;
429+
406430 for listener in listeners {
407431 let logger = Arc :: clone ( & listening_logger) ;
408432 let peer_mgr = Arc :: clone ( & peer_manager_connection_handler) ;
@@ -526,6 +550,11 @@ impl Node {
526550 let addresses = if let Some ( announcement_addresses) = bcast_config. announcement_addresses. clone( ) {
527551 announcement_addresses
528552 } else if let Some ( listening_addresses) = bcast_config. listening_addresses. clone( ) {
553+ if listening_addresses. iter( ) . any( has_port_zero) {
554+ // Don't announce addresses that include port 0
555+ // since the OS-assigned port changes on restart.
556+ continue ;
557+ }
529558 listening_addresses
530559 } else {
531560 debug_assert!( false , "We checked whether the node may announce, so listening addresses should always be set" ) ;
@@ -842,16 +871,25 @@ impl Node {
842871 }
843872
844873 /// Returns our own listening addresses.
874+ ///
875+ /// If the node has been started, this returns the actual bound addresses (which may differ
876+ /// from the configured addresses if port 0 was used). Otherwise, this returns the configured
877+ /// addresses.
845878 pub fn listening_addresses ( & self ) -> Option < Vec < SocketAddress > > {
846- self . config . listening_addresses . clone ( )
879+ self . connection_manager
880+ . last_bound_addresses ( )
881+ . or_else ( || self . config . listening_addresses . clone ( ) )
847882 }
848883
849884 /// Returns the addresses that the node will announce to the network.
885+ ///
886+ /// Returns the configured announcement addresses if set, otherwise falls back to the
887+ /// configured listening addresses. Does not return OS-assigned addresses from port 0
888+ /// bindings, since those are ephemeral and change on restart.
850889 pub fn announcement_addresses ( & self ) -> Option < Vec < SocketAddress > > {
851- self . config
852- . announcement_addresses
853- . clone ( )
854- . or_else ( || self . config . listening_addresses . clone ( ) )
890+ self . config . announcement_addresses . clone ( ) . or_else ( || {
891+ self . config . listening_addresses . clone ( ) . filter ( |a| !a. iter ( ) . any ( has_port_zero) )
892+ } )
855893 }
856894
857895 /// Returns our node alias.
0 commit comments