@@ -223,7 +223,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
223
223
match self . do_read_event ( peer_descriptor, data) {
224
224
Ok ( res) => Ok ( res) ,
225
225
Err ( e) => {
226
- self . disconnect_event ( peer_descriptor) ;
226
+ self . disconnect_event_internal ( peer_descriptor, e . no_connection_possible ) ;
227
227
Err ( e)
228
228
}
229
229
}
@@ -238,38 +238,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
238
238
assert ! ( peer. pending_read_buffer. len( ) > 0 ) ;
239
239
assert ! ( peer. pending_read_buffer. len( ) > peer. pending_read_buffer_pos) ;
240
240
241
- macro_rules! try_potential_handleerror {
242
- ( $thing: expr) => {
243
- match $thing {
244
- Ok ( x) => x,
245
- Err ( _e) => {
246
- //TODO: Handle e appropriately!
247
- return Err ( PeerHandleError { } ) ;
248
- }
249
- } ;
250
- }
251
- }
252
-
253
- macro_rules! try_potential_decodeerror {
254
- ( $thing: expr) => {
255
- match $thing {
256
- Ok ( x) => x,
257
- Err ( _e) => {
258
- //TODO: Handle e?
259
- return Err ( PeerHandleError { } ) ;
260
- }
261
- } ;
262
- }
263
- }
264
-
265
- macro_rules! encode_and_send_msg {
266
- ( $msg: expr, $msg_code: expr) => {
267
- peer. pending_outbound_buffer. push_back( peer. channel_encryptor. encrypt_message( & encode_msg!( $msg, $msg_code) [ ..] ) ) ;
268
- }
269
- }
270
-
271
241
let mut insert_node_id = None ;
272
-
273
242
let mut read_pos = 0 ;
274
243
while read_pos < data. len ( ) {
275
244
{
@@ -278,7 +247,52 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
278
247
read_pos += data_to_copy;
279
248
peer. pending_read_buffer_pos += data_to_copy;
280
249
}
250
+
281
251
if peer. pending_read_buffer_pos == peer. pending_read_buffer . len ( ) {
252
+ peer. pending_read_buffer_pos = 0 ;
253
+
254
+ macro_rules! encode_and_send_msg {
255
+ ( $msg: expr, $msg_code: expr) => {
256
+ peer. pending_outbound_buffer. push_back( peer. channel_encryptor. encrypt_message( & encode_msg!( $msg, $msg_code) [ ..] ) ) ;
257
+ }
258
+ }
259
+
260
+ macro_rules! try_potential_handleerror {
261
+ ( $thing: expr) => {
262
+ match $thing {
263
+ Ok ( x) => x,
264
+ Err ( e) => {
265
+ // TODO: Log e.err
266
+ if let Some ( action) = e. msg {
267
+ match action {
268
+ msgs:: ErrorAction :: UpdateFailHTLC { msg } => {
269
+ encode_and_send_msg!( msg, 131 ) ;
270
+ continue ;
271
+ } ,
272
+ msgs:: ErrorAction :: DisconnectPeer { } => {
273
+ return Err ( PeerHandleError { no_connection_possible: false } ) ;
274
+ } ,
275
+ }
276
+ } else {
277
+ return Err ( PeerHandleError { no_connection_possible: false } ) ;
278
+ }
279
+ }
280
+ } ;
281
+ }
282
+ }
283
+
284
+ macro_rules! try_potential_decodeerror {
285
+ ( $thing: expr) => {
286
+ match $thing {
287
+ Ok ( x) => x,
288
+ Err ( _e) => {
289
+ //TODO: Handle e?
290
+ return Err ( PeerHandleError { no_connection_possible: false } ) ;
291
+ }
292
+ } ;
293
+ }
294
+ }
295
+
282
296
let next_step = peer. channel_encryptor . get_noise_step ( ) ;
283
297
match next_step {
284
298
NextNoiseStep :: ActOne => {
@@ -311,27 +325,31 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
311
325
peer. pending_read_buffer = Vec :: with_capacity ( msg_len as usize + 16 ) ;
312
326
peer. pending_read_buffer . resize ( msg_len as usize + 16 , 0 ) ;
313
327
if msg_len < 2 { // Need at least the message type tag
314
- return Err ( PeerHandleError { } ) ;
328
+ return Err ( PeerHandleError { no_connection_possible : false } ) ;
315
329
}
316
330
peer. pending_read_is_header = false ;
317
331
} else {
318
332
let msg_data = try_potential_handleerror ! ( peer. channel_encryptor. decrypt_message( & peer. pending_read_buffer[ ..] ) ) ;
319
333
assert ! ( msg_data. len( ) >= 2 ) ;
320
334
335
+ // Reset read buffer
336
+ peer. pending_read_buffer = [ 0 ; 18 ] . to_vec ( ) ;
337
+ peer. pending_read_is_header = true ;
338
+
321
339
let msg_type = byte_utils:: slice_to_be16 ( & msg_data[ 0 ..2 ] ) ;
322
340
if msg_type != 16 && peer. their_global_features . is_none ( ) {
323
341
// Need an init message as first message
324
- return Err ( PeerHandleError { } ) ;
342
+ return Err ( PeerHandleError { no_connection_possible : false } ) ;
325
343
}
326
344
match msg_type {
327
345
// Connection control:
328
346
16 => {
329
347
let msg = try_potential_decodeerror ! ( msgs:: Init :: decode( & msg_data[ 2 ..] ) ) ;
330
348
if msg. global_features . requires_unknown_bits ( ) {
331
- return Err ( PeerHandleError { } ) ;
349
+ return Err ( PeerHandleError { no_connection_possible : true } ) ;
332
350
}
333
351
if msg. local_features . requires_unknown_bits ( ) {
334
- return Err ( PeerHandleError { } ) ;
352
+ return Err ( PeerHandleError { no_connection_possible : true } ) ;
335
353
}
336
354
peer. their_global_features = Some ( msg. global_features ) ;
337
355
peer. their_local_features = Some ( msg. local_features ) ;
@@ -460,18 +478,13 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
460
478
} ,
461
479
_ => {
462
480
if ( msg_type & 1 ) == 0 {
463
- //TODO: Fail all channels. Kill the peer!
464
- return Err ( PeerHandleError { } ) ;
481
+ return Err ( PeerHandleError { no_connection_possible : true } ) ;
465
482
}
466
483
} ,
467
484
}
468
-
469
- peer. pending_read_buffer = [ 0 ; 18 ] . to_vec ( ) ;
470
- peer. pending_read_is_header = true ;
471
485
}
472
486
}
473
487
}
474
- peer. pending_read_buffer_pos = 0 ;
475
488
}
476
489
}
477
490
@@ -623,18 +636,22 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
623
636
/// but must NOT be called if a PeerHandleError was provided out of a new_*_connection event!
624
637
/// Panics if the descriptor was not previously registered in a successful new_*_connection event.
625
638
pub fn disconnect_event ( & self , descriptor : & Descriptor ) {
639
+ self . disconnect_event_internal ( descriptor, false ) ;
640
+ }
641
+
642
+ fn disconnect_event_internal ( & self , descriptor : & Descriptor , no_connection_possible : bool ) {
626
643
let mut peers = self . peers . lock ( ) . unwrap ( ) ;
627
644
let peer_option = peers. peers . remove ( descriptor) ;
628
645
match peer_option {
629
646
None => panic ! ( "Descriptor for disconnect_event is not already known to PeerManager" ) ,
630
647
Some ( peer) => {
631
648
match peer. their_node_id {
632
- Some ( node_id) => { peers. node_id_to_descriptor . remove ( & node_id) ; } ,
649
+ Some ( node_id) => {
650
+ peers. node_id_to_descriptor . remove ( & node_id) ;
651
+ self . message_handler . chan_handler . peer_disconnected ( & node_id, no_connection_possible) ;
652
+ } ,
633
653
None => { }
634
654
}
635
- //TODO: Notify the chan_handler that this node disconnected, and do something about
636
- //handling response messages that were queued for sending (maybe the send buffer
637
- //needs to be unencrypted?)
638
655
}
639
656
} ;
640
657
}
0 commit comments