X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Fln%2Fpeer_handler.rs;h=481737f362adbef751ca121bf1a470ac00258f20;hb=d2ba7caf474218ab81d9aacfaeec97776a042f3c;hp=4d47d90987c78cb3e78e1d73540e6536ea526f88;hpb=a3064d99372f3e05f536613f5305b9f86a64f620;p=rust-lightning diff --git a/lightning/src/ln/peer_handler.rs b/lightning/src/ln/peer_handler.rs index 4d47d909..481737f3 100644 --- a/lightning/src/ln/peer_handler.rs +++ b/lightning/src/ln/peer_handler.rs @@ -8,6 +8,7 @@ use secp256k1::key::{SecretKey,PublicKey}; +use ln::features::InitFeatures; use ln::msgs; use util::ser::{Writeable, Writer, Readable}; use ln::peer_channel_encryptor::{PeerChannelEncryptor,NextNoiseStep}; @@ -103,8 +104,7 @@ struct Peer { channel_encryptor: PeerChannelEncryptor, outbound: bool, their_node_id: Option, - their_global_features: Option, - their_local_features: Option, + their_features: Option, pending_outbound_buffer: LinkedList>, pending_outbound_buffer_first_msg_offset: usize, @@ -143,20 +143,6 @@ struct PeerHolder { /// Only add to this set when noise completes: node_id_to_descriptor: HashMap, } -struct MutPeerHolder<'a, Descriptor: SocketDescriptor + 'a> { - peers: &'a mut HashMap, - peers_needing_send: &'a mut HashSet, - node_id_to_descriptor: &'a mut HashMap, -} -impl PeerHolder { - fn borrow_parts(&mut self) -> MutPeerHolder { - MutPeerHolder { - peers: &mut self.peers, - peers_needing_send: &mut self.peers_needing_send, - node_id_to_descriptor: &mut self.node_id_to_descriptor, - } - } -} #[cfg(not(any(target_pointer_width = "32", target_pointer_width = "64")))] fn _check_usize_is_32_or_64() { @@ -238,7 +224,7 @@ impl PeerManager { pub fn get_peer_node_ids(&self) -> Vec { let peers = self.peers.lock().unwrap(); peers.peers.values().filter_map(|p| { - if !p.channel_encryptor.is_ready_for_encryption() || p.their_global_features.is_none() { + if !p.channel_encryptor.is_ready_for_encryption() || p.their_features.is_none() { return None; } p.their_node_id @@ -276,8 +262,7 @@ impl PeerManager { channel_encryptor: peer_encryptor, outbound: true, their_node_id: None, - their_global_features: None, - their_local_features: None, + their_features: None, pending_outbound_buffer: LinkedList::new(), pending_outbound_buffer_first_msg_offset: 0, @@ -314,8 +299,7 @@ impl PeerManager { channel_encryptor: peer_encryptor, outbound: false, their_node_id: None, - their_global_features: None, - their_local_features: None, + their_features: None, pending_outbound_buffer: LinkedList::new(), pending_outbound_buffer_first_msg_offset: 0, @@ -453,7 +437,7 @@ impl PeerManager { fn do_read_event(&self, peer_descriptor: &mut Descriptor, data: Vec) -> Result { let pause_read = { let mut peers_lock = self.peers.lock().unwrap(); - let peers = peers_lock.borrow_parts(); + let peers = &mut *peers_lock; let pause_read = match peers.peers.get_mut(peer_descriptor) { None => panic!("Descriptor for read_event is not already known to PeerManager"), Some(peer) => { @@ -570,14 +554,13 @@ impl PeerManager { peer.their_node_id = Some(their_node_id); insert_node_id!(); - let mut local_features = msgs::LocalFeatures::new(); + let mut features = InitFeatures::supported(); 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(); + features.set_initial_routing_sync(); } encode_and_send_msg!(msgs::Init { - global_features: msgs::GlobalFeatures::new(), - local_features, + features, }, 16); }, NextNoiseStep::ActThree => { @@ -606,7 +589,7 @@ impl PeerManager { let msg_type = byte_utils::slice_to_be16(&msg_data[0..2]); log_trace!(self, "Received message of type {} from {}", msg_type, log_pubkey!(peer.their_node_id.unwrap())); - if msg_type != 16 && peer.their_global_features.is_none() { + if msg_type != 16 && peer.their_features.is_none() { // Need an init message as first message log_trace!(self, "Peer {} sent non-Init first message", log_pubkey!(peer.their_node_id.unwrap())); return Err(PeerHandleError{ no_connection_possible: false }); @@ -616,46 +599,44 @@ impl PeerManager { // Connection control: 16 => { let msg = try_potential_decodeerror!(msgs::Init::read(&mut reader)); - if msg.global_features.requires_unknown_bits() { + if msg.features.requires_unknown_bits() { log_info!(self, "Peer global features required unknown version bits"); return Err(PeerHandleError{ no_connection_possible: true }); } - if msg.local_features.requires_unknown_bits() { + if msg.features.requires_unknown_bits() { log_info!(self, "Peer local features required unknown version bits"); return Err(PeerHandleError{ no_connection_possible: true }); } - if peer.their_global_features.is_some() { + if peer.their_features.is_some() { return Err(PeerHandleError{ no_connection_possible: false }); } log_info!(self, "Received peer Init message: data_loss_protect: {}, initial_routing_sync: {}, upfront_shutdown_script: {}, unkown local flags: {}, unknown global flags: {}", - if msg.local_features.supports_data_loss_protect() { "supported" } else { "not supported"}, - if msg.local_features.initial_routing_sync() { "requested" } else { "not requested" }, - if msg.local_features.supports_upfront_shutdown_script() { "supported" } else { "not supported"}, - if msg.local_features.supports_unknown_bits() { "present" } else { "none" }, - if msg.global_features.supports_unknown_bits() { "present" } else { "none" }); + if msg.features.supports_data_loss_protect() { "supported" } else { "not supported"}, + if msg.features.initial_routing_sync() { "requested" } else { "not requested" }, + if msg.features.supports_upfront_shutdown_script() { "supported" } else { "not supported"}, + if msg.features.supports_unknown_bits() { "present" } else { "none" }, + if msg.features.supports_unknown_bits() { "present" } else { "none" }); - if msg.local_features.initial_routing_sync() { + if msg.features.initial_routing_sync() { peer.sync_status = InitSyncTracker::ChannelsSyncing(0); peers.peers_needing_send.insert(peer_descriptor.clone()); } - peer.their_global_features = Some(msg.global_features); - peer.their_local_features = Some(msg.local_features); if !peer.outbound { - let mut local_features = msgs::LocalFeatures::new(); + let mut features = InitFeatures::supported(); 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(); + features.set_initial_routing_sync(); } encode_and_send_msg!(msgs::Init { - global_features: msgs::GlobalFeatures::new(), - local_features, + features, }, 16); } - self.message_handler.chan_handler.peer_connected(&peer.their_node_id.unwrap()); + self.message_handler.chan_handler.peer_connected(&peer.their_node_id.unwrap(), &msg); + peer.their_features = Some(msg.features); }, 17 => { let msg = try_potential_decodeerror!(msgs::ErrorMessage::read(&mut reader)); @@ -692,73 +673,73 @@ impl PeerManager { // Channel control: 32 => { let msg = try_potential_decodeerror!(msgs::OpenChannel::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_open_channel(&peer.their_node_id.unwrap(), peer.their_local_features.clone().unwrap(), &msg)); + self.message_handler.chan_handler.handle_open_channel(&peer.their_node_id.unwrap(), peer.their_features.clone().unwrap(), &msg); }, 33 => { let msg = try_potential_decodeerror!(msgs::AcceptChannel::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_accept_channel(&peer.their_node_id.unwrap(), peer.their_local_features.clone().unwrap(), &msg)); + self.message_handler.chan_handler.handle_accept_channel(&peer.their_node_id.unwrap(), peer.their_features.clone().unwrap(), &msg); }, 34 => { let msg = try_potential_decodeerror!(msgs::FundingCreated::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_funding_created(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_funding_created(&peer.their_node_id.unwrap(), &msg); }, 35 => { let msg = try_potential_decodeerror!(msgs::FundingSigned::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_funding_signed(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_funding_signed(&peer.their_node_id.unwrap(), &msg); }, 36 => { let msg = try_potential_decodeerror!(msgs::FundingLocked::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_funding_locked(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_funding_locked(&peer.their_node_id.unwrap(), &msg); }, 38 => { let msg = try_potential_decodeerror!(msgs::Shutdown::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_shutdown(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_shutdown(&peer.their_node_id.unwrap(), &msg); }, 39 => { let msg = try_potential_decodeerror!(msgs::ClosingSigned::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_closing_signed(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_closing_signed(&peer.their_node_id.unwrap(), &msg); }, 128 => { let msg = try_potential_decodeerror!(msgs::UpdateAddHTLC::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_update_add_htlc(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_update_add_htlc(&peer.their_node_id.unwrap(), &msg); }, 130 => { let msg = try_potential_decodeerror!(msgs::UpdateFulfillHTLC::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_update_fulfill_htlc(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_update_fulfill_htlc(&peer.their_node_id.unwrap(), &msg); }, 131 => { let msg = try_potential_decodeerror!(msgs::UpdateFailHTLC::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_update_fail_htlc(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_update_fail_htlc(&peer.their_node_id.unwrap(), &msg); }, 135 => { let msg = try_potential_decodeerror!(msgs::UpdateFailMalformedHTLC::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_update_fail_malformed_htlc(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_update_fail_malformed_htlc(&peer.their_node_id.unwrap(), &msg); }, 132 => { let msg = try_potential_decodeerror!(msgs::CommitmentSigned::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_commitment_signed(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_commitment_signed(&peer.their_node_id.unwrap(), &msg); }, 133 => { let msg = try_potential_decodeerror!(msgs::RevokeAndACK::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_revoke_and_ack(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_revoke_and_ack(&peer.their_node_id.unwrap(), &msg); }, 134 => { let msg = try_potential_decodeerror!(msgs::UpdateFee::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_update_fee(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_update_fee(&peer.their_node_id.unwrap(), &msg); }, 136 => { let msg = try_potential_decodeerror!(msgs::ChannelReestablish::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_channel_reestablish(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_channel_reestablish(&peer.their_node_id.unwrap(), &msg); }, // Routing control: 259 => { let msg = try_potential_decodeerror!(msgs::AnnouncementSignatures::read(&mut reader)); - try_potential_handleerror!(self.message_handler.chan_handler.handle_announcement_signatures(&peer.their_node_id.unwrap(), &msg)); + self.message_handler.chan_handler.handle_announcement_signatures(&peer.their_node_id.unwrap(), &msg); }, 256 => { let msg = try_potential_decodeerror!(msgs::ChannelAnnouncement::read(&mut reader)); @@ -819,7 +800,7 @@ impl PeerManager { let mut events_generated = self.message_handler.chan_handler.get_and_clear_pending_msg_events(); let mut peers_lock = self.peers.lock().unwrap(); - let peers = peers_lock.borrow_parts(); + let peers = &mut *peers_lock; for event in events_generated.drain(..) { macro_rules! get_peer_for_forwarding { ($node_id: expr, $handle_no_such_peer: block) => { @@ -833,7 +814,7 @@ impl PeerManager { }; match peers.peers.get_mut(&descriptor) { Some(peer) => { - if peer.their_global_features.is_none() { + if peer.their_features.is_none() { $handle_no_such_peer; continue; } @@ -984,7 +965,7 @@ impl PeerManager { let encoded_update_msg = encode_msg!(update_msg, 258); for (ref descriptor, ref mut peer) in peers.peers.iter_mut() { - if !peer.channel_encryptor.is_ready_for_encryption() || peer.their_global_features.is_none() || + if !peer.channel_encryptor.is_ready_for_encryption() || peer.their_features.is_none() || !peer.should_forward_channel(msg.contents.short_channel_id) { continue } @@ -1008,7 +989,7 @@ impl PeerManager { let encoded_msg = encode_msg!(msg, 258); for (ref descriptor, ref mut peer) in peers.peers.iter_mut() { - if !peer.channel_encryptor.is_ready_for_encryption() || peer.their_global_features.is_none() || + if !peer.channel_encryptor.is_ready_for_encryption() || peer.their_features.is_none() || !peer.should_forward_channel(msg.contents.short_channel_id) { continue } @@ -1102,10 +1083,10 @@ impl PeerManager { pub fn timer_tick_occured(&self) { let mut peers_lock = self.peers.lock().unwrap(); { - let peers = peers_lock.borrow_parts(); - let peers_needing_send = peers.peers_needing_send; - let node_id_to_descriptor = peers.node_id_to_descriptor; - let peers = peers.peers; + let peers = &mut *peers_lock; + let peers_needing_send = &mut peers.peers_needing_send; + let node_id_to_descriptor = &mut peers.node_id_to_descriptor; + let peers = &mut peers.peers; peers.retain(|descriptor, peer| { if peer.awaiting_pong == true {