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
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 {
peers: Mutex<PeerHolder<Descriptor>>,
pending_events: Mutex<Vec<Event>>,
our_node_secret: SecretKey,
+ initial_syncs_sent: AtomicUsize,
}
}
}
+//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<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
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),
}
}
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 => {
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);
}
},