@@ -393,6 +393,12 @@ 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 (though use [`Peer::handshake_complete`] to
401
+ /// check this.
396
402
their_features : Option < InitFeatures > ,
397
403
their_net_address : Option < NetAddress > ,
398
404
@@ -424,6 +430,13 @@ struct Peer {
424
430
}
425
431
426
432
impl Peer {
433
+ /// True after we've processed the [`msgs::Init`] message and called relevant `peer_connected`
434
+ /// handler methods. Thus, this implies we've finished our handshake and can talk to this peer
435
+ /// normally.
436
+ fn handshake_complete ( & self ) -> bool {
437
+ self . their_features . is_some ( )
438
+ }
439
+
427
440
/// Returns true if the channel announcements/updates for the given channel should be
428
441
/// forwarded to this peer.
429
442
/// If we are sending our routing table to this peer and we have not yet sent channel
@@ -1877,24 +1890,21 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1877
1890
// thread can be holding the peer lock if we have the global write
1878
1891
// lock).
1879
1892
1880
- if let Some ( mut descriptor) = self . node_id_to_descriptor . lock ( ) . unwrap ( ) . remove ( & node_id) {
1893
+ let descriptor_opt = self . node_id_to_descriptor . lock ( ) . unwrap ( ) . remove ( & node_id) ;
1894
+ if let Some ( mut descriptor) = descriptor_opt {
1881
1895
if let Some ( peer_mutex) = peers. remove ( & descriptor) {
1896
+ let mut peer = peer_mutex. lock ( ) . unwrap ( ) ;
1882
1897
if let Some ( msg) = msg {
1883
1898
log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
1884
1899
log_pubkey!( node_id) ,
1885
1900
msg. data) ;
1886
- let mut peer = peer_mutex. lock ( ) . unwrap ( ) ;
1887
1901
self . enqueue_message ( & mut * peer, & msg) ;
1888
1902
// This isn't guaranteed to work, but if there is enough free
1889
1903
// room in the send buffer, put the error message there...
1890
1904
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
1905
}
1906
+ self . do_disconnect ( descriptor, & * peer, "DisconnectPeer HandleError" ) ;
1894
1907
}
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
1908
}
1899
1909
}
1900
1910
}
@@ -1905,6 +1915,22 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1905
1915
self . disconnect_event_internal ( descriptor, false ) ;
1906
1916
}
1907
1917
1918
+ fn do_disconnect ( & self , mut descriptor : Descriptor , peer : & Peer , reason : & ' static str ) {
1919
+ if !peer. handshake_complete ( ) {
1920
+ log_trace ! ( self . logger, "Disconnecting peer which hasn't completed handshake due to {}" , reason) ;
1921
+ descriptor. disconnect_socket ( ) ;
1922
+ return ;
1923
+ }
1924
+
1925
+ debug_assert ! ( peer. their_node_id. is_some( ) ) ;
1926
+ if let Some ( ( node_id, _) ) = peer. their_node_id {
1927
+ log_trace ! ( self . logger, "Disconnecting peer with id {} due to {}" , node_id, reason) ;
1928
+ self . message_handler . chan_handler . peer_disconnected ( & node_id, false ) ;
1929
+ self . message_handler . onion_message_handler . peer_disconnected ( & node_id, false ) ;
1930
+ }
1931
+ descriptor. disconnect_socket ( ) ;
1932
+ }
1933
+
1908
1934
fn disconnect_event_internal ( & self , descriptor : & Descriptor , no_connection_possible : bool ) {
1909
1935
let mut peers = self . peers . write ( ) . unwrap ( ) ;
1910
1936
let peer_option = peers. remove ( descriptor) ;
@@ -1916,6 +1942,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1916
1942
} ,
1917
1943
Some ( peer_lock) => {
1918
1944
let peer = peer_lock. lock ( ) . unwrap ( ) ;
1945
+ if !peer. handshake_complete ( ) { return ; }
1946
+ debug_assert ! ( peer. their_node_id. is_some( ) ) ;
1919
1947
if let Some ( ( node_id, _) ) = peer. their_node_id {
1920
1948
log_trace ! ( self . logger,
1921
1949
"Handling disconnection of peer {}, with {}future connection to the peer possible." ,
@@ -1937,14 +1965,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1937
1965
/// peer. Thus, be very careful about reentrancy issues.
1938
1966
///
1939
1967
/// [`disconnect_socket`]: SocketDescriptor::disconnect_socket
1940
- pub fn disconnect_by_node_id ( & self , node_id : PublicKey , no_connection_possible : bool ) {
1968
+ pub fn disconnect_by_node_id ( & self , node_id : PublicKey , _no_connection_possible : bool ) {
1941
1969
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 ( ) ;
1970
+ if let Some ( descriptor) = self . node_id_to_descriptor . lock ( ) . unwrap ( ) . remove ( & node_id) {
1971
+ let peer_opt = peers_lock. remove ( & descriptor) ;
1972
+ if let Some ( peer_mutex) = peer_opt {
1973
+ self . do_disconnect ( descriptor, & * peer_mutex. lock ( ) . unwrap ( ) , "client request" ) ;
1974
+ } else { debug_assert ! ( false , "node_id_to_descriptor thought we had a peer" ) ; }
1948
1975
}
1949
1976
}
1950
1977
@@ -1955,13 +1982,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1955
1982
let mut peers_lock = self . peers . write ( ) . unwrap ( ) ;
1956
1983
self . node_id_to_descriptor . lock ( ) . unwrap ( ) . clear ( ) ;
1957
1984
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 ( ) ;
1985
+ for ( descriptor, peer_mutex) in peers. drain ( ) {
1986
+ self . do_disconnect ( descriptor, & * peer_mutex. lock ( ) . unwrap ( ) , "client request to disconnect all peers" ) ;
1965
1987
}
1966
1988
}
1967
1989
@@ -2052,21 +2074,16 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2052
2074
if !descriptors_needing_disconnect. is_empty ( ) {
2053
2075
{
2054
2076
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 ) ;
2077
+ for descriptor in descriptors_needing_disconnect {
2078
+ if let Some ( peer_mutex ) = peers_lock. remove ( & descriptor) {
2079
+ let peer = peer_mutex . lock ( ) . unwrap ( ) ;
2080
+ if let Some ( ( node_id , _ ) ) = peer. their_node_id {
2059
2081
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
2082
}
2083
+ self . do_disconnect ( descriptor, & * peer, "ping timeout" ) ;
2063
2084
}
2064
2085
}
2065
2086
}
2066
-
2067
- for mut descriptor in descriptors_needing_disconnect. drain ( ..) {
2068
- descriptor. disconnect_socket ( ) ;
2069
- }
2070
2087
}
2071
2088
}
2072
2089
0 commit comments