@@ -1635,16 +1635,18 @@ impl ClusterInfo {
16351635 id : & Pubkey ,
16361636 gossip_addr : & SocketAddr ,
16371637 ) -> ( ContactInfo , UdpSocket , Option < TcpListener > ) {
1638+ let bind_ip_addr = IpAddr :: V4 ( Ipv4Addr :: new ( 0 , 0 , 0 , 0 ) ) ;
16381639 let ( port, ( gossip_socket, ip_echo) ) =
1639- Node :: get_gossip_port ( gossip_addr, VALIDATOR_PORT_RANGE ) ;
1640+ Node :: get_gossip_port ( gossip_addr, VALIDATOR_PORT_RANGE , bind_ip_addr ) ;
16401641 let contact_info = Self :: gossip_contact_info ( id, SocketAddr :: new ( gossip_addr. ip ( ) , port) ) ;
16411642
16421643 ( contact_info, gossip_socket, Some ( ip_echo) )
16431644 }
16441645
16451646 /// A Node with dummy ports to spy on gossip via pull requests
16461647 pub fn spy_node ( id : & Pubkey ) -> ( ContactInfo , UdpSocket , Option < TcpListener > ) {
1647- let ( _, gossip_socket) = bind_in_range ( VALIDATOR_PORT_RANGE ) . unwrap ( ) ;
1648+ let bind_ip_addr = IpAddr :: V4 ( Ipv4Addr :: new ( 0 , 0 , 0 , 0 ) ) ;
1649+ let ( _, gossip_socket) = bind_in_range ( bind_ip_addr, VALIDATOR_PORT_RANGE ) . unwrap ( ) ;
16481650 let contact_info = Self :: spy_contact_info ( id) ;
16491651
16501652 ( contact_info, gossip_socket, None )
@@ -1759,16 +1761,18 @@ impl Node {
17591761 }
17601762 }
17611763 pub fn new_localhost_with_pubkey ( pubkey : & Pubkey ) -> Self {
1764+ let bind_ip_addr = IpAddr :: V4 ( Ipv4Addr :: new ( 0 , 0 , 0 , 0 ) ) ;
17621765 let tpu = UdpSocket :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
1763- let ( gossip_port, ( gossip, ip_echo) ) = bind_common_in_range ( ( 1024 , 65535 ) ) . unwrap ( ) ;
1766+ let ( gossip_port, ( gossip, ip_echo) ) =
1767+ bind_common_in_range ( bind_ip_addr, ( 1024 , 65535 ) ) . unwrap ( ) ;
17641768 let gossip_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ) , gossip_port) ;
17651769 let tvu = UdpSocket :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
17661770 let tvu_forwards = UdpSocket :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
17671771 let tpu_forwards = UdpSocket :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
17681772 let repair = UdpSocket :: bind ( "127.0.0.1:0" ) . unwrap ( ) ;
1769- let rpc_port = find_available_port_in_range ( ( 1024 , 65535 ) ) . unwrap ( ) ;
1773+ let rpc_port = find_available_port_in_range ( bind_ip_addr , ( 1024 , 65535 ) ) . unwrap ( ) ;
17701774 let rpc_addr = SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ) , rpc_port) ;
1771- let rpc_pubsub_port = find_available_port_in_range ( ( 1024 , 65535 ) ) . unwrap ( ) ;
1775+ let rpc_pubsub_port = find_available_port_in_range ( bind_ip_addr , ( 1024 , 65535 ) ) . unwrap ( ) ;
17721776 let rpc_pubsub_addr =
17731777 SocketAddr :: new ( IpAddr :: V4 ( Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ) , rpc_pubsub_port) ;
17741778
@@ -1811,45 +1815,52 @@ impl Node {
18111815 fn get_gossip_port (
18121816 gossip_addr : & SocketAddr ,
18131817 port_range : PortRange ,
1818+ bind_ip_addr : IpAddr ,
18141819 ) -> ( u16 , ( UdpSocket , TcpListener ) ) {
18151820 if gossip_addr. port ( ) != 0 {
18161821 (
18171822 gossip_addr. port ( ) ,
1818- bind_common ( gossip_addr. port ( ) , false ) . unwrap_or_else ( |e| {
1823+ bind_common ( bind_ip_addr , gossip_addr. port ( ) , false ) . unwrap_or_else ( |e| {
18191824 panic ! ( "gossip_addr bind_to port {}: {}" , gossip_addr. port( ) , e)
18201825 } ) ,
18211826 )
18221827 } else {
1823- bind_common_in_range ( port_range) . expect ( "Failed to bind" )
1828+ bind_common_in_range ( bind_ip_addr , port_range) . expect ( "Failed to bind" )
18241829 }
18251830 }
1826- fn bind ( port_range : PortRange ) -> ( u16 , UdpSocket ) {
1827- bind_in_range ( port_range) . expect ( "Failed to bind" )
1831+ fn bind ( bind_ip_addr : IpAddr , port_range : PortRange ) -> ( u16 , UdpSocket ) {
1832+ bind_in_range ( bind_ip_addr , port_range) . expect ( "Failed to bind" )
18281833 }
1834+
18291835 pub fn new_with_external_ip (
18301836 pubkey : & Pubkey ,
18311837 gossip_addr : & SocketAddr ,
18321838 port_range : PortRange ,
1839+ bind_ip_addr : IpAddr ,
18331840 ) -> Node {
1834- let ( gossip_port, ( gossip, ip_echo) ) = Self :: get_gossip_port ( gossip_addr, port_range) ;
1841+ let ( gossip_port, ( gossip, ip_echo) ) =
1842+ Self :: get_gossip_port ( gossip_addr, port_range, bind_ip_addr) ;
18351843
1836- let ( tvu_port, tvu_sockets) = multi_bind_in_range ( port_range, 8 ) . expect ( "tvu multi_bind" ) ;
1844+ let ( tvu_port, tvu_sockets) =
1845+ multi_bind_in_range ( bind_ip_addr, port_range, 8 ) . expect ( "tvu multi_bind" ) ;
18371846
18381847 let ( tvu_forwards_port, tvu_forwards_sockets) =
1839- multi_bind_in_range ( port_range, 8 ) . expect ( "tvu_forwards multi_bind" ) ;
1848+ multi_bind_in_range ( bind_ip_addr , port_range, 8 ) . expect ( "tvu_forwards multi_bind" ) ;
18401849
1841- let ( tpu_port, tpu_sockets) = multi_bind_in_range ( port_range, 32 ) . expect ( "tpu multi_bind" ) ;
1850+ let ( tpu_port, tpu_sockets) =
1851+ multi_bind_in_range ( bind_ip_addr, port_range, 32 ) . expect ( "tpu multi_bind" ) ;
18421852
18431853 let ( tpu_forwards_port, tpu_forwards_sockets) =
1844- multi_bind_in_range ( port_range, 8 ) . expect ( "tpu_forwards multi_bind" ) ;
1854+ multi_bind_in_range ( bind_ip_addr , port_range, 8 ) . expect ( "tpu_forwards multi_bind" ) ;
18451855
18461856 let ( _, retransmit_sockets) =
1847- multi_bind_in_range ( port_range, 8 ) . expect ( "retransmit multi_bind" ) ;
1857+ multi_bind_in_range ( bind_ip_addr , port_range, 8 ) . expect ( "retransmit multi_bind" ) ;
18481858
1849- let ( repair_port, repair) = Self :: bind ( port_range) ;
1850- let ( serve_repair_port, serve_repair) = Self :: bind ( port_range) ;
1859+ let ( repair_port, repair) = Self :: bind ( bind_ip_addr , port_range) ;
1860+ let ( serve_repair_port, serve_repair) = Self :: bind ( bind_ip_addr , port_range) ;
18511861
1852- let ( _, broadcast) = multi_bind_in_range ( port_range, 4 ) . expect ( "broadcast multi_bind" ) ;
1862+ let ( _, broadcast) =
1863+ multi_bind_in_range ( bind_ip_addr, port_range, 4 ) . expect ( "broadcast multi_bind" ) ;
18531864
18541865 let info = ContactInfo {
18551866 id : * pubkey,
@@ -1889,9 +1900,10 @@ impl Node {
18891900 pubkey : & Pubkey ,
18901901 gossip_addr : & SocketAddr ,
18911902 port_range : PortRange ,
1903+ bind_ip_addr : IpAddr ,
18921904 ) -> Node {
1893- let mut new = Self :: new_with_external_ip ( pubkey, gossip_addr, port_range) ;
1894- let ( storage_port, storage_socket) = Self :: bind ( port_range) ;
1905+ let mut new = Self :: new_with_external_ip ( pubkey, gossip_addr, port_range, bind_ip_addr ) ;
1906+ let ( storage_port, storage_socket) = Self :: bind ( bind_ip_addr , port_range) ;
18951907
18961908 new. info . storage_addr = SocketAddr :: new ( gossip_addr. ip ( ) , storage_port) ;
18971909 new. sockets . storage = Some ( storage_socket) ;
@@ -2025,6 +2037,7 @@ mod tests {
20252037 & Pubkey :: new_rand ( ) ,
20262038 & socketaddr ! ( ip, 0 ) ,
20272039 VALIDATOR_PORT_RANGE ,
2040+ IpAddr :: V4 ( ip) ,
20282041 ) ;
20292042
20302043 check_node_sockets ( & node, IpAddr :: V4 ( ip) , VALIDATOR_PORT_RANGE ) ;
@@ -2034,14 +2047,15 @@ mod tests {
20342047 fn new_with_external_ip_test_gossip ( ) {
20352048 let ip = IpAddr :: V4 ( Ipv4Addr :: from ( 0 ) ) ;
20362049 let port = {
2037- bind_in_range ( VALIDATOR_PORT_RANGE )
2050+ bind_in_range ( ip , VALIDATOR_PORT_RANGE )
20382051 . expect ( "Failed to bind" )
20392052 . 0
20402053 } ;
20412054 let node = Node :: new_with_external_ip (
20422055 & Pubkey :: new_rand ( ) ,
20432056 & socketaddr ! ( 0 , port) ,
20442057 VALIDATOR_PORT_RANGE ,
2058+ ip,
20452059 ) ;
20462060
20472061 check_node_sockets ( & node, ip, VALIDATOR_PORT_RANGE ) ;
@@ -2056,6 +2070,7 @@ mod tests {
20562070 & Pubkey :: new_rand ( ) ,
20572071 & socketaddr ! ( ip, 0 ) ,
20582072 VALIDATOR_PORT_RANGE ,
2073+ IpAddr :: V4 ( Ipv4Addr :: new ( 0 , 0 , 0 , 0 ) ) ,
20592074 ) ;
20602075
20612076 let ip = IpAddr :: V4 ( ip) ;
0 commit comments