@@ -393,6 +393,11 @@ struct Peer {
393
393
/// We cache a `NodeId` here to avoid serializing peers' keys every time we forward gossip
394
394
/// messages in `PeerManager`. Use `Peer::set_their_node_id` to modify this field.
395
395
their_node_id : Option < ( PublicKey , NodeId ) > ,
396
+ /// The features provided in the peer's [`msgs::Init`] message.
397
+ ///
398
+ /// This is set only after we've processed the [`msgs::Init`] message and called relevant
399
+ /// `peer_connected` handler methods. Thus, this field is set *iff* we've finished our
400
+ /// handshake and can talk to this peer normally.
396
401
their_features : Option < InitFeatures > ,
397
402
their_net_address : Option < NetAddress > ,
398
403
@@ -1877,24 +1882,21 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1877
1882
// thread can be holding the peer lock if we have the global write
1878
1883
// lock).
1879
1884
1880
- if let Some ( mut descriptor) = self . node_id_to_descriptor . lock ( ) . unwrap ( ) . remove ( & node_id) {
1885
+ let descriptor_opt = self . node_id_to_descriptor . lock ( ) . unwrap ( ) . remove ( & node_id) ;
1886
+ if let Some ( mut descriptor) = descriptor_opt {
1881
1887
if let Some ( peer_mutex) = peers. remove ( & descriptor) {
1888
+ let mut peer = peer_mutex. lock ( ) . unwrap ( ) ;
1882
1889
if let Some ( msg) = msg {
1883
1890
log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
1884
1891
log_pubkey!( node_id) ,
1885
1892
msg. data) ;
1886
- let mut peer = peer_mutex. lock ( ) . unwrap ( ) ;
1887
1893
self . enqueue_message ( & mut * peer, & msg) ;
1888
1894
// This isn't guaranteed to work, but if there is enough free
1889
1895
// room in the send buffer, put the error message there...
1890
1896
self . do_attempt_write_data ( & mut descriptor, & mut * peer, false ) ;
1891
- } else {
1892
- log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {} with no message" , log_pubkey!( node_id) ) ;
1893
1897
}
1898
+ self . do_disconnect ( descriptor, & * peer, "DisconnectPeer HandleError" ) ;
1894
1899
}
1895
- descriptor. disconnect_socket ( ) ;
1896
- self . message_handler . chan_handler . peer_disconnected ( & node_id, false ) ;
1897
- self . message_handler . onion_message_handler . peer_disconnected ( & node_id, false ) ;
1898
1900
}
1899
1901
}
1900
1902
}
@@ -1905,6 +1907,22 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1905
1907
self . disconnect_event_internal ( descriptor, false ) ;
1906
1908
}
1907
1909
1910
+ fn do_disconnect ( & self , mut descriptor : Descriptor , peer : & Peer , reason : & ' static str ) {
1911
+ if peer. their_features . is_none ( ) {
1912
+ log_trace ! ( self . logger, "Disconnecting peer which hasn't completed handshake due to {}" , reason) ;
1913
+ descriptor. disconnect_socket ( ) ;
1914
+ return ;
1915
+ }
1916
+
1917
+ debug_assert ! ( peer. their_node_id. is_some( ) ) ;
1918
+ if let Some ( ( node_id, _) ) = peer. their_node_id {
1919
+ log_trace ! ( self . logger, "Disconnecting peer with id {} due to {}" , node_id, reason) ;
1920
+ self . message_handler . chan_handler . peer_disconnected ( & node_id, false ) ;
1921
+ self . message_handler . onion_message_handler . peer_disconnected ( & node_id, false ) ;
1922
+ }
1923
+ descriptor. disconnect_socket ( ) ;
1924
+ }
1925
+
1908
1926
fn disconnect_event_internal ( & self , descriptor : & Descriptor , no_connection_possible : bool ) {
1909
1927
let mut peers = self . peers . write ( ) . unwrap ( ) ;
1910
1928
let peer_option = peers. remove ( descriptor) ;
@@ -1916,6 +1934,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1916
1934
} ,
1917
1935
Some ( peer_lock) => {
1918
1936
let peer = peer_lock. lock ( ) . unwrap ( ) ;
1937
+ if peer. their_features . is_none ( ) { return ; }
1938
+ debug_assert ! ( peer. their_node_id. is_some( ) ) ;
1919
1939
if let Some ( ( node_id, _) ) = peer. their_node_id {
1920
1940
log_trace ! ( self . logger,
1921
1941
"Handling disconnection of peer {}, with {}future connection to the peer possible." ,
@@ -1937,14 +1957,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1937
1957
/// peer. Thus, be very careful about reentrancy issues.
1938
1958
///
1939
1959
/// [`disconnect_socket`]: SocketDescriptor::disconnect_socket
1940
- pub fn disconnect_by_node_id ( & self , node_id : PublicKey , no_connection_possible : bool ) {
1960
+ pub fn disconnect_by_node_id ( & self , node_id : PublicKey , _no_connection_possible : bool ) {
1941
1961
let mut peers_lock = self . peers . write ( ) . unwrap ( ) ;
1942
- if let Some ( mut descriptor) = self . node_id_to_descriptor . lock ( ) . unwrap ( ) . remove ( & node_id) {
1943
- log_trace ! ( self . logger, "Disconnecting peer with id {} due to client request" , node_id) ;
1944
- peers_lock. remove ( & descriptor) ;
1945
- self . message_handler . chan_handler . peer_disconnected ( & node_id, no_connection_possible) ;
1946
- self . message_handler . onion_message_handler . peer_disconnected ( & node_id, no_connection_possible) ;
1947
- descriptor. disconnect_socket ( ) ;
1962
+ if let Some ( descriptor) = self . node_id_to_descriptor . lock ( ) . unwrap ( ) . remove ( & node_id) {
1963
+ let peer_opt = peers_lock. remove ( & descriptor) ;
1964
+ if let Some ( peer_mutex) = peer_opt {
1965
+ self . do_disconnect ( descriptor, & * peer_mutex. lock ( ) . unwrap ( ) , "client request" ) ;
1966
+ } else { debug_assert ! ( false , "node_id_to_descriptor thought we had a peer" ) ; }
1948
1967
}
1949
1968
}
1950
1969
@@ -1955,13 +1974,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1955
1974
let mut peers_lock = self . peers . write ( ) . unwrap ( ) ;
1956
1975
self . node_id_to_descriptor . lock ( ) . unwrap ( ) . clear ( ) ;
1957
1976
let peers = & mut * peers_lock;
1958
- for ( mut descriptor, peer) in peers. drain ( ) {
1959
- if let Some ( ( node_id, _) ) = peer. lock ( ) . unwrap ( ) . their_node_id {
1960
- log_trace ! ( self . logger, "Disconnecting peer with id {} due to client request to disconnect all peers" , node_id) ;
1961
- self . message_handler . chan_handler . peer_disconnected ( & node_id, false ) ;
1962
- self . message_handler . onion_message_handler . peer_disconnected ( & node_id, false ) ;
1963
- }
1964
- descriptor. disconnect_socket ( ) ;
1977
+ for ( descriptor, peer_mutex) in peers. drain ( ) {
1978
+ self . do_disconnect ( descriptor, & * peer_mutex. lock ( ) . unwrap ( ) , "client request to disconnect all peers" ) ;
1965
1979
}
1966
1980
}
1967
1981
@@ -2052,21 +2066,16 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2052
2066
if !descriptors_needing_disconnect. is_empty ( ) {
2053
2067
{
2054
2068
let mut peers_lock = self . peers . write ( ) . unwrap ( ) ;
2055
- for descriptor in descriptors_needing_disconnect. iter ( ) {
2056
- if let Some ( peer ) = peers_lock. remove ( descriptor) {
2057
- if let Some ( ( node_id , _ ) ) = peer . lock ( ) . unwrap ( ) . their_node_id {
2058
- log_trace ! ( self . logger , "Disconnecting peer with id {} due to ping timeout" , node_id ) ;
2069
+ for descriptor in descriptors_needing_disconnect. drain ( .. ) {
2070
+ if let Some ( peer_mutex ) = peers_lock. remove ( & descriptor) {
2071
+ let peer = peer_mutex . lock ( ) . unwrap ( ) ;
2072
+ if let Some ( ( node_id , _ ) ) = peer. their_node_id {
2059
2073
self . node_id_to_descriptor . lock ( ) . unwrap ( ) . remove ( & node_id) ;
2060
- self . message_handler . chan_handler . peer_disconnected ( & node_id, false ) ;
2061
- self . message_handler . onion_message_handler . peer_disconnected ( & node_id, false ) ;
2062
2074
}
2075
+ self . do_disconnect ( descriptor, & * peer, "ping timeout" ) ;
2063
2076
}
2064
2077
}
2065
2078
}
2066
-
2067
- for mut descriptor in descriptors_needing_disconnect. drain ( ..) {
2068
- descriptor. disconnect_socket ( ) ;
2069
- }
2070
2079
}
2071
2080
}
2072
2081
0 commit comments