X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=src%2Fln%2Fpeer_handler.rs;h=20faf2500b8ed40e911f018edba75b34828c28a4;hb=fe90e13f841548f2be0594854216c85889e71584;hp=52abecb4bc5f3128827e8cc3a259898c675be56e;hpb=1f1f82569a1774d2f6cb84e1de3c55dc733022c8;p=rust-lightning diff --git a/src/ln/peer_handler.rs b/src/ln/peer_handler.rs index 52abecb4..20faf250 100644 --- a/src/ln/peer_handler.rs +++ b/src/ln/peer_handler.rs @@ -1,7 +1,7 @@ use secp256k1::key::{SecretKey,PublicKey}; use ln::msgs; -use util::ser::{Writeable, Readable}; +use util::ser::{Writeable, Writer, Readable}; use ln::peer_channel_encryptor::{PeerChannelEncryptor,NextNoiseStep}; use util::byte_utils; use util::events::{EventsProvider,Event}; @@ -112,15 +112,23 @@ pub struct PeerManager { logger: Arc, } +struct VecWriter(Vec); +impl Writer for VecWriter { + fn write_all(&mut self, buf: &[u8]) -> Result<(), ::std::io::Error> { + self.0.extend_from_slice(buf); + Ok(()) + } + fn size_hint(&mut self, size: usize) { + self.0.reserve_exact(size); + } +} + macro_rules! encode_msg { ($msg: expr, $msg_code: expr) => {{ - let mut w = ::std::io::Cursor::new(vec![]); - 0u16.write(&mut w).unwrap(); - $msg.write(&mut w).unwrap(); - let mut msg = w.into_inner(); - let len = msg.len(); - msg[..2].copy_from_slice(&byte_utils::be16_to_array(len as u16 - 2)); - msg + let mut msg = VecWriter(Vec::new()); + ($msg_code as u16).write(&mut msg).unwrap(); + $msg.write(&mut msg).unwrap(); + msg.0 }} } @@ -443,14 +451,32 @@ impl PeerManager { 16 => { let msg = try_potential_decodeerror!(msgs::Init::read(&mut reader)); if msg.global_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() { + log_info!(self, "Peer local features required unknown version bits"); + return Err(PeerHandleError{ no_connection_possible: true }); + } + if msg.local_features.requires_data_loss_protect() { + log_info!(self, "Peer local features required data_loss_protect"); + return Err(PeerHandleError{ no_connection_possible: true }); + } + if msg.local_features.requires_upfront_shutdown_script() { + log_info!(self, "Peer local features required upfront_shutdown_script"); return Err(PeerHandleError{ no_connection_possible: true }); } if peer.their_global_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" }); + peer.their_global_features = Some(msg.global_features); peer.their_local_features = Some(msg.local_features);