@@ -1346,11 +1346,17 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1346
1346
1347
1347
// Need an Init as first message
1348
1348
if let wire:: Message :: Init ( msg) = message {
1349
- let additional_features = msg . features . clone ( ) - self . init_features ( & their_node_id) ;
1350
- if additional_features . requires_unknown_bits ( ) {
1351
- log_debug ! ( self . logger, "Peer features required unknown version bits " ) ;
1349
+ let our_features = self . init_features ( & their_node_id) ;
1350
+ if msg . features . requires_unknown_bits_from ( & our_features ) {
1351
+ log_debug ! ( self . logger, "Peer requires features unknown to us " ) ;
1352
1352
return Err ( PeerHandleError { } . into ( ) ) ;
1353
1353
}
1354
+
1355
+ if our_features. requires_unknown_bits_from ( & msg. features ) {
1356
+ log_debug ! ( self . logger, "We require features unknown to our peer" ) ;
1357
+ return Err ( PeerHandleError { } . into ( ) ) ;
1358
+ }
1359
+
1354
1360
if peer_lock. their_features . is_some ( ) {
1355
1361
return Err ( PeerHandleError { } . into ( ) ) ;
1356
1362
}
@@ -2325,8 +2331,8 @@ mod tests {
2325
2331
for i in 0 ..peer_count {
2326
2332
let node_secret = SecretKey :: from_slice ( & [ 42 + i as u8 ; 32 ] ) . unwrap ( ) ;
2327
2333
let features = {
2328
- let mut feature_bits = vec ! [ 0u8 ; 32 + i + 1 ] ;
2329
- feature_bits[ 32 + i] = 0b00000001 ;
2334
+ let mut feature_bits = vec ! [ 0u8 ; 33 + i + 1 ] ;
2335
+ feature_bits[ 33 + i] = 0b00000001 ;
2330
2336
InitFeatures :: from_le_bytes ( feature_bits)
2331
2337
} ;
2332
2338
cfgs. push (
@@ -2472,35 +2478,38 @@ mod tests {
2472
2478
2473
2479
#[ test]
2474
2480
fn test_incompatible_peers ( ) {
2475
- let cfgs = create_incompatible_peermgr_cfgs ( 2 ) ;
2476
- let peers = create_network ( 2 , & cfgs) ;
2477
- let peer_a = & peers[ 0 ] ;
2478
- let peer_b = & peers[ 1 ] ;
2481
+ let cfgs = create_peermgr_cfgs ( 2 ) ;
2482
+ let incompatible_cfgs = create_incompatible_peermgr_cfgs ( 2 ) ;
2479
2483
2480
- let id_a = peer_a. node_signer . get_node_id ( Recipient :: Node ) . unwrap ( ) ;
2481
- let mut fd_a = FileDescriptor {
2482
- fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
2483
- disconnect : Arc :: new ( AtomicBool :: new ( false ) ) ,
2484
- } ;
2485
- let addr_a = NetAddress :: IPv4 { addr : [ 127 , 0 , 0 , 1 ] , port : 1000 } ;
2486
- let mut fd_b = FileDescriptor {
2487
- fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
2488
- disconnect : Arc :: new ( AtomicBool :: new ( false ) ) ,
2489
- } ;
2490
- let addr_b = NetAddress :: IPv4 { addr : [ 127 , 0 , 0 , 1 ] , port : 1001 } ;
2491
- let initial_data = peer_b. new_outbound_connection ( id_a, fd_b. clone ( ) , Some ( addr_a. clone ( ) ) ) . unwrap ( ) ;
2492
- peer_a. new_inbound_connection ( fd_a. clone ( ) , Some ( addr_b. clone ( ) ) ) . unwrap ( ) ;
2493
- assert_eq ! ( peer_a. read_event( & mut fd_a, & initial_data) . unwrap( ) , false ) ;
2494
- peer_a. process_events ( ) ;
2484
+ let peers = create_network ( 2 , & cfgs) ;
2485
+ let incompatible_peers = create_network ( 2 , & incompatible_cfgs) ;
2486
+ let peer_pairs = [ ( & peers[ 0 ] , & incompatible_peers[ 0 ] ) , ( & incompatible_peers[ 1 ] , & peers[ 1 ] ) ] ;
2487
+ for ( peer_a, peer_b) in peer_pairs {
2488
+ let id_a = peer_a. node_signer . get_node_id ( Recipient :: Node ) . unwrap ( ) ;
2489
+ let mut fd_a = FileDescriptor {
2490
+ fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
2491
+ disconnect : Arc :: new ( AtomicBool :: new ( false ) ) ,
2492
+ } ;
2493
+ let addr_a = NetAddress :: IPv4 { addr : [ 127 , 0 , 0 , 1 ] , port : 1000 } ;
2494
+ let mut fd_b = FileDescriptor {
2495
+ fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
2496
+ disconnect : Arc :: new ( AtomicBool :: new ( false ) ) ,
2497
+ } ;
2498
+ let addr_b = NetAddress :: IPv4 { addr : [ 127 , 0 , 0 , 1 ] , port : 1001 } ;
2499
+ let initial_data = peer_b. new_outbound_connection ( id_a, fd_b. clone ( ) , Some ( addr_a. clone ( ) ) ) . unwrap ( ) ;
2500
+ peer_a. new_inbound_connection ( fd_a. clone ( ) , Some ( addr_b. clone ( ) ) ) . unwrap ( ) ;
2501
+ assert_eq ! ( peer_a. read_event( & mut fd_a, & initial_data) . unwrap( ) , false ) ;
2502
+ peer_a. process_events ( ) ;
2495
2503
2496
- let a_data = fd_a. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2497
- assert_eq ! ( peer_b. read_event( & mut fd_b, & a_data) . unwrap( ) , false ) ;
2504
+ let a_data = fd_a. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2505
+ assert_eq ! ( peer_b. read_event( & mut fd_b, & a_data) . unwrap( ) , false ) ;
2498
2506
2499
- peer_b. process_events ( ) ;
2500
- let b_data = fd_b. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2507
+ peer_b. process_events ( ) ;
2508
+ let b_data = fd_b. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2501
2509
2502
- // Should fail because of unknown required features
2503
- assert ! ( peer_a. read_event( & mut fd_a, & b_data) . is_err( ) ) ;
2510
+ // Should fail because of unknown required features
2511
+ assert ! ( peer_a. read_event( & mut fd_a, & b_data) . is_err( ) ) ;
2512
+ }
2504
2513
}
2505
2514
2506
2515
#[ test]
0 commit comments