@@ -1346,7 +1346,8 @@ 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
- if msg. features . requires_unknown_bits ( ) {
1349
+ let additional_features = msg. features . clone ( ) - self . init_features ( & their_node_id) ;
1350
+ if additional_features. requires_unknown_bits ( ) {
1350
1351
log_debug ! ( self . logger, "Peer features required unknown version bits" ) ;
1351
1352
return Err ( PeerHandleError { } . into ( ) ) ;
1352
1353
}
@@ -2221,16 +2222,19 @@ fn is_gossip_msg(type_id: u16) -> bool {
2221
2222
mod tests {
2222
2223
use crate :: chain:: keysinterface:: { NodeSigner , Recipient } ;
2223
2224
use crate :: events;
2225
+ use crate :: io;
2226
+ use crate :: ln:: features:: { InitFeatures , NodeFeatures } ;
2224
2227
use crate :: ln:: peer_channel_encryptor:: PeerChannelEncryptor ;
2225
- use crate :: ln:: peer_handler:: { PeerManager , MessageHandler , SocketDescriptor , IgnoringMessageHandler , filter_addresses} ;
2228
+ use crate :: ln:: peer_handler:: { CustomMessageHandler , PeerManager , MessageHandler , SocketDescriptor , IgnoringMessageHandler , filter_addresses} ;
2226
2229
use crate :: ln:: { msgs, wire} ;
2227
- use crate :: ln:: msgs:: NetAddress ;
2230
+ use crate :: ln:: msgs:: { LightningError , NetAddress } ;
2228
2231
use crate :: util:: test_utils;
2229
2232
2230
- use bitcoin:: secp256k1:: SecretKey ;
2233
+ use bitcoin:: secp256k1:: { PublicKey , SecretKey } ;
2231
2234
2232
2235
use crate :: prelude:: * ;
2233
2236
use crate :: sync:: { Arc , Mutex } ;
2237
+ use core:: convert:: Infallible ;
2234
2238
use core:: sync:: atomic:: { AtomicBool , Ordering } ;
2235
2239
2236
2240
#[ derive( Clone ) ]
@@ -2263,19 +2267,51 @@ mod tests {
2263
2267
struct PeerManagerCfg {
2264
2268
chan_handler : test_utils:: TestChannelMessageHandler ,
2265
2269
routing_handler : test_utils:: TestRoutingMessageHandler ,
2270
+ custom_handler : TestCustomMessageHandler ,
2266
2271
logger : test_utils:: TestLogger ,
2267
2272
node_signer : test_utils:: TestNodeSigner ,
2268
2273
}
2269
2274
2275
+ struct TestCustomMessageHandler {
2276
+ features : InitFeatures ,
2277
+ }
2278
+
2279
+ impl wire:: CustomMessageReader for TestCustomMessageHandler {
2280
+ type CustomMessage = Infallible ;
2281
+ fn read < R : io:: Read > ( & self , _: u16 , _: & mut R ) -> Result < Option < Self :: CustomMessage > , msgs:: DecodeError > {
2282
+ Ok ( None )
2283
+ }
2284
+ }
2285
+
2286
+ impl CustomMessageHandler for TestCustomMessageHandler {
2287
+ fn handle_custom_message ( & self , _: Infallible , _: & PublicKey ) -> Result < ( ) , LightningError > {
2288
+ unreachable ! ( ) ;
2289
+ }
2290
+
2291
+ fn get_and_clear_pending_msg ( & self ) -> Vec < ( PublicKey , Self :: CustomMessage ) > { Vec :: new ( ) }
2292
+
2293
+ fn provided_node_features ( & self ) -> NodeFeatures { NodeFeatures :: empty ( ) }
2294
+
2295
+ fn provided_init_features ( & self , _: & PublicKey ) -> InitFeatures {
2296
+ self . features . clone ( )
2297
+ }
2298
+ }
2299
+
2270
2300
fn create_peermgr_cfgs ( peer_count : usize ) -> Vec < PeerManagerCfg > {
2271
2301
let mut cfgs = Vec :: new ( ) ;
2272
2302
for i in 0 ..peer_count {
2273
2303
let node_secret = SecretKey :: from_slice ( & [ 42 + i as u8 ; 32 ] ) . unwrap ( ) ;
2304
+ let features = {
2305
+ let mut feature_bits = vec ! [ 0u8 ; 33 ] ;
2306
+ feature_bits[ 32 ] = 0b00000001 ;
2307
+ InitFeatures :: from_le_bytes ( feature_bits)
2308
+ } ;
2274
2309
cfgs. push (
2275
2310
PeerManagerCfg {
2276
2311
chan_handler : test_utils:: TestChannelMessageHandler :: new ( ) ,
2277
2312
logger : test_utils:: TestLogger :: new ( ) ,
2278
2313
routing_handler : test_utils:: TestRoutingMessageHandler :: new ( ) ,
2314
+ custom_handler : TestCustomMessageHandler { features } ,
2279
2315
node_signer : test_utils:: TestNodeSigner :: new ( node_secret) ,
2280
2316
}
2281
2317
) ;
@@ -2284,19 +2320,42 @@ mod tests {
2284
2320
cfgs
2285
2321
}
2286
2322
2287
- fn create_network < ' a > ( peer_count : usize , cfgs : & ' a Vec < PeerManagerCfg > ) -> Vec < PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler , & ' a test_utils:: TestRoutingMessageHandler , IgnoringMessageHandler , & ' a test_utils:: TestLogger , IgnoringMessageHandler , & ' a test_utils:: TestNodeSigner > > {
2323
+ fn create_incompatible_peermgr_cfgs ( peer_count : usize ) -> Vec < PeerManagerCfg > {
2324
+ let mut cfgs = Vec :: new ( ) ;
2325
+ for i in 0 ..peer_count {
2326
+ let node_secret = SecretKey :: from_slice ( & [ 42 + i as u8 ; 32 ] ) . unwrap ( ) ;
2327
+ let features = {
2328
+ let mut feature_bits = vec ! [ 0u8 ; 32 + i + 1 ] ;
2329
+ feature_bits[ 32 + i] = 0b00000001 ;
2330
+ InitFeatures :: from_le_bytes ( feature_bits)
2331
+ } ;
2332
+ cfgs. push (
2333
+ PeerManagerCfg {
2334
+ chan_handler : test_utils:: TestChannelMessageHandler :: new ( ) ,
2335
+ logger : test_utils:: TestLogger :: new ( ) ,
2336
+ routing_handler : test_utils:: TestRoutingMessageHandler :: new ( ) ,
2337
+ custom_handler : TestCustomMessageHandler { features } ,
2338
+ node_signer : test_utils:: TestNodeSigner :: new ( node_secret) ,
2339
+ }
2340
+ ) ;
2341
+ }
2342
+
2343
+ cfgs
2344
+ }
2345
+
2346
+ fn create_network < ' a > ( peer_count : usize , cfgs : & ' a Vec < PeerManagerCfg > ) -> Vec < PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler , & ' a test_utils:: TestRoutingMessageHandler , IgnoringMessageHandler , & ' a test_utils:: TestLogger , & ' a TestCustomMessageHandler , & ' a test_utils:: TestNodeSigner > > {
2288
2347
let mut peers = Vec :: new ( ) ;
2289
2348
for i in 0 ..peer_count {
2290
2349
let ephemeral_bytes = [ i as u8 ; 32 ] ;
2291
2350
let msg_handler = MessageHandler { chan_handler : & cfgs[ i] . chan_handler , route_handler : & cfgs[ i] . routing_handler , onion_message_handler : IgnoringMessageHandler { } } ;
2292
- let peer = PeerManager :: new ( msg_handler, 0 , & ephemeral_bytes, & cfgs[ i] . logger , IgnoringMessageHandler { } , & cfgs[ i] . node_signer ) ;
2351
+ let peer = PeerManager :: new ( msg_handler, 0 , & ephemeral_bytes, & cfgs[ i] . logger , & cfgs [ i ] . custom_handler , & cfgs[ i] . node_signer ) ;
2293
2352
peers. push ( peer) ;
2294
2353
}
2295
2354
2296
2355
peers
2297
2356
}
2298
2357
2299
- fn establish_connection < ' a > ( peer_a : & PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler , & ' a test_utils:: TestRoutingMessageHandler , IgnoringMessageHandler , & ' a test_utils:: TestLogger , IgnoringMessageHandler , & ' a test_utils:: TestNodeSigner > , peer_b : & PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler , & ' a test_utils:: TestRoutingMessageHandler , IgnoringMessageHandler , & ' a test_utils:: TestLogger , IgnoringMessageHandler , & ' a test_utils:: TestNodeSigner > ) -> ( FileDescriptor , FileDescriptor ) {
2358
+ fn establish_connection < ' a > ( peer_a : & PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler , & ' a test_utils:: TestRoutingMessageHandler , IgnoringMessageHandler , & ' a test_utils:: TestLogger , & ' a TestCustomMessageHandler , & ' a test_utils:: TestNodeSigner > , peer_b : & PeerManager < FileDescriptor , & ' a test_utils:: TestChannelMessageHandler , & ' a test_utils:: TestRoutingMessageHandler , IgnoringMessageHandler , & ' a test_utils:: TestLogger , & ' a TestCustomMessageHandler , & ' a test_utils:: TestNodeSigner > ) -> ( FileDescriptor , FileDescriptor ) {
2300
2359
let id_a = peer_a. node_signer . get_node_id ( Recipient :: Node ) . unwrap ( ) ;
2301
2360
let mut fd_a = FileDescriptor {
2302
2361
fd : 1 , outbound_data : Arc :: new ( Mutex :: new ( Vec :: new ( ) ) ) ,
@@ -2411,6 +2470,39 @@ mod tests {
2411
2470
thrd_b. join ( ) . unwrap ( ) ;
2412
2471
}
2413
2472
2473
+ #[ test]
2474
+ 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 ] ;
2479
+
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 ( ) ;
2495
+
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 ) ;
2498
+
2499
+ peer_b. process_events ( ) ;
2500
+ let b_data = fd_b. outbound_data . lock ( ) . unwrap ( ) . split_off ( 0 ) ;
2501
+
2502
+ // Should fail because of unknown required features
2503
+ assert ! ( peer_a. read_event( & mut fd_a, & b_data) . is_err( ) ) ;
2504
+ }
2505
+
2414
2506
#[ test]
2415
2507
fn test_disconnect_peer ( ) {
2416
2508
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and
0 commit comments