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};
logger: Arc<Logger>,
}
+struct VecWriter(Vec<u8>);
+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
}}
}
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);