@@ -1075,31 +1075,34 @@ impl<Descriptor: SocketDescriptor, CM: Deref> PeerManager<Descriptor, CM> where
1075
1075
let peers = & mut peers. peers ;
1076
1076
1077
1077
peers. retain ( |descriptor, peer| {
1078
- if peer. awaiting_pong == true {
1078
+ if peer. awaiting_pong {
1079
1079
peers_needing_send. remove ( descriptor) ;
1080
1080
match peer. their_node_id {
1081
1081
Some ( node_id) => {
1082
1082
node_id_to_descriptor. remove ( & node_id) ;
1083
1083
self . message_handler . chan_handler . peer_disconnected ( & node_id, true ) ;
1084
- } ,
1084
+ }
1085
1085
None => { }
1086
1086
}
1087
+ return false ;
1088
+ }
1089
+
1090
+ if !peer. channel_encryptor . is_ready_for_encryption ( ) {
1091
+ // The peer needs to complete its handshake before we can exchange messages
1092
+ return true ;
1087
1093
}
1088
1094
1089
1095
let ping = msgs:: Ping {
1090
1096
ponglen : 0 ,
1091
1097
byteslen : 64 ,
1092
1098
} ;
1093
- peer. pending_outbound_buffer . push_back ( encode_msg ! ( & ping) ) ;
1099
+ peer. pending_outbound_buffer . push_back ( peer. channel_encryptor . encrypt_message ( & encode_msg ! ( & ping) ) ) ;
1100
+
1094
1101
let mut descriptor_clone = descriptor. clone ( ) ;
1095
1102
self . do_attempt_write_data ( & mut descriptor_clone, peer) ;
1096
1103
1097
- if peer. awaiting_pong {
1098
- false // Drop the peer
1099
- } else {
1100
- peer. awaiting_pong = true ;
1101
- true
1102
- }
1104
+ peer. awaiting_pong = true ;
1105
+ true
1103
1106
} ) ;
1104
1107
}
1105
1108
}
@@ -1118,15 +1121,29 @@ mod tests {
1118
1121
1119
1122
use rand:: { thread_rng, Rng } ;
1120
1123
1121
- use std:: sync:: { Arc } ;
1124
+ use std;
1125
+ use std:: sync:: { Arc , Mutex } ;
1122
1126
1123
- #[ derive( PartialEq , Eq , Clone , Hash ) ]
1127
+ #[ derive( Clone ) ]
1124
1128
struct FileDescriptor {
1125
1129
fd : u16 ,
1130
+ outbound_data : Arc < Mutex < Vec < u8 > > > ,
1131
+ }
1132
+ impl PartialEq for FileDescriptor {
1133
+ fn eq ( & self , other : & Self ) -> bool {
1134
+ self . fd == other. fd
1135
+ }
1136
+ }
1137
+ impl Eq for FileDescriptor { }
1138
+ impl std:: hash:: Hash for FileDescriptor {
1139
+ fn hash < H : std:: hash:: Hasher > ( & self , hasher : & mut H ) {
1140
+ self . fd . hash ( hasher)
1141
+ }
1126
1142
}
1127
1143
1128
1144
impl SocketDescriptor for FileDescriptor {
1129
1145
fn send_data ( & mut self , data : & [ u8 ] , _resume_read : bool ) -> usize {
1146
+ self . outbound_data . lock ( ) . unwrap ( ) . extend_from_slice ( data) ;
1130
1147
data. len ( )
1131
1148
}
1132
1149
@@ -1167,10 +1184,14 @@ mod tests {
1167
1184
1168
1185
fn establish_connection < ' a > ( peer_a : & PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler > , peer_b : & PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler > ) {
1169
1186
let secp_ctx = Secp256k1 :: new ( ) ;
1170
- let their_id = PublicKey :: from_secret_key ( & secp_ctx, & peer_b. our_node_secret ) ;
1171
- let fd = FileDescriptor { fd : 1 } ;
1172
- peer_a. new_inbound_connection ( fd. clone ( ) ) . unwrap ( ) ;
1173
- peer_a. peers . lock ( ) . unwrap ( ) . node_id_to_descriptor . insert ( their_id, fd. clone ( ) ) ;
1187
+ let a_id = PublicKey :: from_secret_key ( & secp_ctx, & peer_a. our_node_secret ) ;
1188
+ let mut fd_a = FileDescriptor { fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) } ;
1189
+ let mut fd_b = FileDescriptor { fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) } ;
1190
+ let initial_data = peer_b. new_outbound_connection ( a_id, fd_b. clone ( ) ) . unwrap ( ) ;
1191
+ peer_a. new_inbound_connection ( fd_a. clone ( ) ) . unwrap ( ) ;
1192
+ assert_eq ! ( peer_a. read_event( & mut fd_a, initial_data) . unwrap( ) , false ) ;
1193
+ assert_eq ! ( peer_b. read_event( & mut fd_b, fd_a. outbound_data. lock( ) . unwrap( ) . split_off( 0 ) ) . unwrap( ) , false ) ;
1194
+ assert_eq ! ( peer_a. read_event( & mut fd_a, fd_b. outbound_data. lock( ) . unwrap( ) . split_off( 0 ) ) . unwrap( ) , false ) ;
1174
1195
}
1175
1196
1176
1197
#[ test]
0 commit comments