From e3effa4622b761e3bb74b33e6faca7bf56dfc0c6 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Sat, 16 Jun 2018 19:39:40 -0400 Subject: [PATCH] Send initial_routing_sync-filled Init messages to the first 5 peers --- src/ln/msgs.rs | 9 ++++++++- src/ln/peer_handler.rs | 20 ++++++++++++++++++-- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/ln/msgs.rs b/src/ln/msgs.rs index 869b5115..bc7c0ed9 100644 --- a/src/ln/msgs.rs +++ b/src/ln/msgs.rs @@ -61,9 +61,16 @@ impl LocalFeatures { self.flags.len() > 0 && (self.flags[0] & 1) != 0 } - pub fn supports_initial_routing_sync(&self) -> bool { + pub fn initial_routing_sync(&self) -> bool { self.flags.len() > 0 && (self.flags[0] & (1 << 3)) != 0 } + pub fn set_initial_routing_sync(&mut self) { + if self.flags.len() == 0 { + self.flags.resize(1, 1 << 3); + } else { + self.flags[0] |= 1 << 3; + } + } pub fn supports_upfront_shutdown_script(&self) -> bool { self.flags.len() > 0 && (self.flags[0] & (3 << 4)) != 0 diff --git a/src/ln/peer_handler.rs b/src/ln/peer_handler.rs index 30900cab..aec3a32e 100644 --- a/src/ln/peer_handler.rs +++ b/src/ln/peer_handler.rs @@ -8,6 +8,7 @@ use util::events::{EventsProvider,Event}; use std::collections::{HashMap,LinkedList}; use std::sync::{Arc, Mutex}; +use std::sync::atomic::{AtomicUsize, Ordering}; use std::{cmp,error,mem,hash,fmt}; pub struct MessageHandler { @@ -86,6 +87,7 @@ pub struct PeerManager { peers: Mutex>, pending_events: Mutex>, our_node_secret: SecretKey, + initial_syncs_sent: AtomicUsize, } @@ -101,6 +103,9 @@ macro_rules! encode_msg { } } +//TODO: Really should do something smarter for this +const INITIAL_SYNCS_TO_SEND: usize = 5; + /// Manages and reacts to connection events. You probably want to use file descriptors as PeerIds. /// PeerIds may repeat, but only after disconnect_event() has been called. impl PeerManager { @@ -110,6 +115,7 @@ impl PeerManager { peers: Mutex::new(PeerHolder { peers: HashMap::new(), node_id_to_descriptor: HashMap::new() }), pending_events: Mutex::new(Vec::new()), our_node_secret: our_node_secret, + initial_syncs_sent: AtomicUsize::new(0), } } @@ -333,9 +339,14 @@ impl PeerManager { peer.pending_read_is_header = true; insert_node_id = Some(peer.their_node_id.unwrap()); + let mut local_features = msgs::LocalFeatures::new(); + if self.initial_syncs_sent.load(Ordering::Acquire) < INITIAL_SYNCS_TO_SEND { + self.initial_syncs_sent.fetch_add(1, Ordering::AcqRel); + local_features.set_initial_routing_sync(); + } encode_and_send_msg!(msgs::Init { global_features: msgs::GlobalFeatures::new(), - local_features: msgs::LocalFeatures::new(), + local_features, }, 16); }, NextNoiseStep::ActThree => { @@ -381,9 +392,14 @@ impl PeerManager { peer.their_local_features = Some(msg.local_features); if !peer.outbound { + let mut local_features = msgs::LocalFeatures::new(); + if self.initial_syncs_sent.load(Ordering::Acquire) < INITIAL_SYNCS_TO_SEND { + self.initial_syncs_sent.fetch_add(1, Ordering::AcqRel); + local_features.set_initial_routing_sync(); + } encode_and_send_msg!(msgs::Init { global_features: msgs::GlobalFeatures::new(), - local_features: msgs::LocalFeatures::new(), + local_features, }, 16); } }, -- 2.30.2