X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Fpeer_handler.rs;fp=lightning%2Fsrc%2Fln%2Fpeer_handler.rs;h=9399cfecf69f890cbcf5b96c033c66b7b04945d5;hb=07cea6bfeda1641c2a1440f4e4847c747507c4f0;hp=15fa105d0c0465e5d3dd27ac421bca59e8004f91;hpb=c1db30d5be88e312e10efb47e26aade95413a01b;p=rust-lightning diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index 15fa105d..9399cfec 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -549,8 +549,8 @@ impl PeerManager where peer.their_node_id = Some(their_node_id); insert_node_id!(); let mut features = InitFeatures::supported(); - if self.message_handler.route_handler.should_request_full_sync(&peer.their_node_id.unwrap()) { - features.set_initial_routing_sync(); + if !self.message_handler.route_handler.should_request_full_sync(&peer.their_node_id.unwrap()) { + features.clear_initial_routing_sync(); } let resp = msgs::Init { features }; @@ -643,8 +643,8 @@ impl PeerManager where if !peer.outbound { let mut features = InitFeatures::supported(); - if self.message_handler.route_handler.should_request_full_sync(&peer.their_node_id.unwrap()) { - features.set_initial_routing_sync(); + if !self.message_handler.route_handler.should_request_full_sync(&peer.their_node_id.unwrap()) { + features.clear_initial_routing_sync(); } let resp = msgs::Init { features }; @@ -1247,6 +1247,13 @@ mod tests { (fd_a.clone(), fd_b.clone()) } + fn establish_connection_and_read_events<'a>(peer_a: &PeerManager, peer_b: &PeerManager) -> (FileDescriptor, FileDescriptor) { + let (mut fd_a, mut fd_b) = establish_connection(peer_a, peer_b); + assert_eq!(peer_b.read_event(&mut fd_b, &fd_a.outbound_data.lock().unwrap().split_off(0)).unwrap(), false); + assert_eq!(peer_a.read_event(&mut fd_a, &fd_b.outbound_data.lock().unwrap().split_off(0)).unwrap(), false); + (fd_a.clone(), fd_b.clone()) + } + #[test] fn test_disconnect_peer() { // Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and @@ -1421,4 +1428,47 @@ mod tests { assert_eq!(routing_handlers_concrete[1].clone().chan_upds_recvd.load(Ordering::Acquire), 100); assert_eq!(routing_handlers_concrete[1].clone().chan_anns_recvd.load(Ordering::Acquire), 50); } + + #[test] + fn limit_initial_routing_sync_requests() { + // Inbound peer 0 requests initial_routing_sync, but outbound peer 1 does not. + { + let chan_handlers = create_chan_handlers(2); + let routing_handlers: Vec> = vec![ + Arc::new(test_utils::TestRoutingMessageHandler::new().set_request_full_sync()), + Arc::new(test_utils::TestRoutingMessageHandler::new()), + ]; + let peers = create_network(2, &chan_handlers, Some(&routing_handlers)); + let (fd_0_to_1, fd_1_to_0) = establish_connection_and_read_events(&peers[0], &peers[1]); + + let peer_0 = peers[0].peers.lock().unwrap(); + let peer_1 = peers[1].peers.lock().unwrap(); + + let peer_0_features = peer_1.peers.get(&fd_1_to_0).unwrap().their_features.as_ref(); + let peer_1_features = peer_0.peers.get(&fd_0_to_1).unwrap().their_features.as_ref(); + + assert!(peer_0_features.unwrap().initial_routing_sync()); + assert!(!peer_1_features.unwrap().initial_routing_sync()); + } + + // Outbound peer 1 requests initial_routing_sync, but inbound peer 0 does not. + { + let chan_handlers = create_chan_handlers(2); + let routing_handlers: Vec> = vec![ + Arc::new(test_utils::TestRoutingMessageHandler::new()), + Arc::new(test_utils::TestRoutingMessageHandler::new().set_request_full_sync()), + ]; + let peers = create_network(2, &chan_handlers, Some(&routing_handlers)); + let (fd_0_to_1, fd_1_to_0) = establish_connection_and_read_events(&peers[0], &peers[1]); + + let peer_0 = peers[0].peers.lock().unwrap(); + let peer_1 = peers[1].peers.lock().unwrap(); + + let peer_0_features = peer_1.peers.get(&fd_1_to_0).unwrap().their_features.as_ref(); + let peer_1_features = peer_0.peers.get(&fd_0_to_1).unwrap().their_features.as_ref(); + + assert!(!peer_0_features.unwrap().initial_routing_sync()); + assert!(peer_1_features.unwrap().initial_routing_sync()); + } + } }