@@ -40,16 +40,21 @@ pub trait SocketDescriptor : cmp::Eq + hash::Hash + Clone {
40
40
/// generate no further read/write_events for the descriptor, only triggering a single
41
41
/// disconnect_event (unless it was provided in response to a new_*_connection event, in which case
42
42
/// no such disconnect_event must be generated and the socket be silently disconencted).
43
- pub struct PeerHandleError { }
43
+ pub struct PeerHandleError {
44
+ no_connection_possible : bool ,
45
+ }
44
46
impl fmt:: Debug for PeerHandleError {
45
47
fn fmt ( & self , formatter : & mut fmt:: Formatter ) -> Result < ( ) , fmt:: Error > {
46
- formatter. write_str ( "Peer Send Invalid Data" )
48
+ formatter. write_str ( "Peer Sent Invalid Data" )
47
49
}
48
50
}
49
51
50
52
struct Peer {
51
53
channel_encryptor : PeerChannelEncryptor ,
54
+ outbound : bool ,
52
55
their_node_id : Option < PublicKey > ,
56
+ their_global_features : Option < msgs:: GlobalFeatures > ,
57
+ their_local_features : Option < msgs:: LocalFeatures > ,
53
58
54
59
pending_outbound_buffer : LinkedList < Vec < u8 > > ,
55
60
pending_outbound_buffer_first_msg_offset : usize ,
@@ -112,7 +117,10 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
112
117
let mut peers = self . peers . lock ( ) . unwrap ( ) ;
113
118
if peers. peers . insert ( descriptor, Peer {
114
119
channel_encryptor : peer_encryptor,
120
+ outbound : true ,
115
121
their_node_id : Some ( their_node_id) ,
122
+ their_global_features : None ,
123
+ their_local_features : None ,
116
124
117
125
pending_outbound_buffer : LinkedList :: new ( ) ,
118
126
pending_outbound_buffer_first_msg_offset : 0 ,
@@ -141,7 +149,10 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
141
149
let mut peers = self . peers . lock ( ) . unwrap ( ) ;
142
150
if peers. peers . insert ( descriptor, Peer {
143
151
channel_encryptor : peer_encryptor,
152
+ outbound : false ,
144
153
their_node_id : None ,
154
+ their_global_features : None ,
155
+ their_local_features : None ,
145
156
146
157
pending_outbound_buffer : LinkedList :: new ( ) ,
147
158
pending_outbound_buffer_first_msg_offset : 0 ,
@@ -212,7 +223,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
212
223
match self . do_read_event ( peer_descriptor, data) {
213
224
Ok ( res) => Ok ( res) ,
214
225
Err ( e) => {
215
- self . disconnect_event ( peer_descriptor) ;
226
+ self . disconnect_event_internal ( peer_descriptor, e . no_connection_possible ) ;
216
227
Err ( e)
217
228
}
218
229
}
@@ -227,38 +238,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
227
238
assert ! ( peer. pending_read_buffer. len( ) > 0 ) ;
228
239
assert ! ( peer. pending_read_buffer. len( ) > peer. pending_read_buffer_pos) ;
229
240
230
- macro_rules! try_potential_handleerror {
231
- ( $thing: expr) => {
232
- match $thing {
233
- Ok ( x) => x,
234
- Err ( _e) => {
235
- //TODO: Handle e appropriately!
236
- return Err ( PeerHandleError { } ) ;
237
- }
238
- } ;
239
- }
240
- }
241
-
242
- macro_rules! try_potential_decodeerror {
243
- ( $thing: expr) => {
244
- match $thing {
245
- Ok ( x) => x,
246
- Err ( _e) => {
247
- //TODO: Handle e?
248
- return Err ( PeerHandleError { } ) ;
249
- }
250
- } ;
251
- }
252
- }
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
241
let mut insert_node_id = None ;
261
-
262
242
let mut read_pos = 0 ;
263
243
while read_pos < data. len ( ) {
264
244
{
@@ -267,7 +247,52 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
267
247
read_pos += data_to_copy;
268
248
peer. pending_read_buffer_pos += data_to_copy;
269
249
}
250
+
270
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
+
271
296
let next_step = peer. channel_encryptor . get_noise_step ( ) ;
272
297
match next_step {
273
298
NextNoiseStep :: ActOne => {
@@ -300,27 +325,41 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
300
325
peer. pending_read_buffer = Vec :: with_capacity ( msg_len as usize + 16 ) ;
301
326
peer. pending_read_buffer . resize ( msg_len as usize + 16 , 0 ) ;
302
327
if msg_len < 2 { // Need at least the message type tag
303
- return Err ( PeerHandleError { } ) ;
328
+ return Err ( PeerHandleError { no_connection_possible : false } ) ;
304
329
}
305
330
peer. pending_read_is_header = false ;
306
331
} else {
307
332
let msg_data = try_potential_handleerror ! ( peer. channel_encryptor. decrypt_message( & peer. pending_read_buffer[ ..] ) ) ;
308
333
assert ! ( msg_data. len( ) >= 2 ) ;
309
334
335
+ // Reset read buffer
336
+ peer. pending_read_buffer = [ 0 ; 18 ] . to_vec ( ) ;
337
+ peer. pending_read_is_header = true ;
338
+
310
339
let msg_type = byte_utils:: slice_to_be16 ( & msg_data[ 0 ..2 ] ) ;
340
+ if msg_type != 16 && peer. their_global_features . is_none ( ) {
341
+ // Need an init message as first message
342
+ return Err ( PeerHandleError { no_connection_possible : false } ) ;
343
+ }
311
344
match msg_type {
312
345
// Connection control:
313
346
16 => {
314
347
let msg = try_potential_decodeerror ! ( msgs:: Init :: decode( & msg_data[ 2 ..] ) ) ;
315
348
if msg. global_features . requires_unknown_bits ( ) {
316
- return Err ( PeerHandleError { } ) ;
349
+ return Err ( PeerHandleError { no_connection_possible : true } ) ;
317
350
}
318
351
if msg. local_features . requires_unknown_bits ( ) {
319
- return Err ( PeerHandleError { } ) ;
352
+ return Err ( PeerHandleError { no_connection_possible : true } ) ;
353
+ }
354
+ peer. their_global_features = Some ( msg. global_features ) ;
355
+ peer. their_local_features = Some ( msg. local_features ) ;
356
+
357
+ if !peer. outbound {
358
+ encode_and_send_msg ! ( msgs:: Init {
359
+ global_features: msgs:: GlobalFeatures :: new( ) ,
360
+ local_features: msgs:: LocalFeatures :: new( ) ,
361
+ } , 16 ) ;
320
362
}
321
- //TODO: Store features (and check that we've
322
- //received Init prior to any other messages)!
323
- //TODO: Respond to Init with Init if we're inbound.
324
363
} ,
325
364
17 => {
326
365
// Error msg
@@ -439,18 +478,13 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
439
478
} ,
440
479
_ => {
441
480
if ( msg_type & 1 ) == 0 {
442
- //TODO: Fail all channels. Kill the peer!
443
- return Err ( PeerHandleError { } ) ;
481
+ return Err ( PeerHandleError { no_connection_possible : true } ) ;
444
482
}
445
483
} ,
446
484
}
447
-
448
- peer. pending_read_buffer = [ 0 ; 18 ] . to_vec ( ) ;
449
- peer. pending_read_is_header = true ;
450
485
}
451
486
}
452
487
}
453
- peer. pending_read_buffer_pos = 0 ;
454
488
}
455
489
}
456
490
@@ -602,18 +636,22 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
602
636
/// but must NOT be called if a PeerHandleError was provided out of a new_*_connection event!
603
637
/// Panics if the descriptor was not previously registered in a successful new_*_connection event.
604
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 ) {
605
643
let mut peers = self . peers . lock ( ) . unwrap ( ) ;
606
644
let peer_option = peers. peers . remove ( descriptor) ;
607
645
match peer_option {
608
646
None => panic ! ( "Descriptor for disconnect_event is not already known to PeerManager" ) ,
609
647
Some ( peer) => {
610
648
match peer. their_node_id {
611
- 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
+ } ,
612
653
None => { }
613
654
}
614
- //TODO: Notify the chan_handler that this node disconnected, and do something about
615
- //handling response messages that were queued for sending (maybe the send buffer
616
- //needs to be unencrypted?)
617
655
}
618
656
} ;
619
657
}
0 commit comments