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);
}
},
17 => {
// Error msg
},
- 18 => { }, // ping
- 19 => { }, // pong
+
+ 18 => {
+ let msg = try_potential_decodeerror!(msgs::Ping::decode(&msg_data[2..]));
+ if msg.ponglen < 65532 {
+ let resp = msgs::Pong { byteslen: msg.ponglen };
+ encode_and_send_msg!(resp, 19);
+ }
+ },
+ 19 => {
+ try_potential_decodeerror!(msgs::Pong::decode(&msg_data[2..]));
+ },
// Channel control:
32 => {