use std::collections::{HashMap,LinkedList};
use std::sync::{Arc, Mutex};
-use std::{cmp,mem,hash,fmt};
+use std::{cmp,error,mem,hash,fmt};
pub struct MessageHandler {
pub chan_handler: Arc<msgs::ChannelMessageHandler>,
formatter.write_str("Peer Sent Invalid Data")
}
}
+impl fmt::Display for PeerHandleError {
+ fn fmt(&self, formatter: &mut fmt::Formatter) -> Result<(), fmt::Error> {
+ formatter.write_str("Peer Sent Invalid Data")
+ }
+}
+impl error::Error for PeerHandleError {
+ fn description(&self) -> &str {
+ "Peer Sent Invalid Data"
+ }
+}
struct Peer {
channel_encryptor: PeerChannelEncryptor,
match $thing {
Ok(x) => x,
Err(e) => {
- // TODO: Log e.err
+ println!("Got error handling message: {}!", e.err);
if let Some(action) = e.msg {
match action {
msgs::ErrorAction::UpdateFailHTLC { msg } => {
encode_and_send_msg!(msg, 131);
continue;
},
- msgs::ErrorAction::DisconnectPeer {} => {
+ msgs::ErrorAction::DisconnectPeer => {
return Err(PeerHandleError{ no_connection_possible: false });
},
+ msgs::ErrorAction::IgnoreError => {
+ continue;
+ },
}
} else {
return Err(PeerHandleError{ no_connection_possible: false });
match $thing {
Ok(x) => x,
Err(_e) => {
+ println!("Error decoding message");
//TODO: Handle e?
return Err(PeerHandleError{ no_connection_possible: false });
}
}
}
+ macro_rules! try_ignore_potential_decodeerror {
+ ($thing: expr) => {
+ match $thing {
+ Ok(x) => x,
+ Err(_e) => {
+ println!("Error decoding message, ignoring due to lnd spec incompatibility. See https://github.com/lightningnetwork/lnd/issues/1407");
+ continue;
+ }
+ };
+ }
+ }
+
let next_step = peer.channel_encryptor.get_noise_step();
match next_step {
NextNoiseStep::ActOne => {
17 => {
// Error msg
},
- 18 => { }, // ping
- 19 => { }, // pong
+
+ 18 => {
+ let msg = try_potential_decodeerror!(msgs::Ping::decode(&msg_data[2..]));
+ 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 => {
}
},
257 => {
- let msg = try_potential_decodeerror!(msgs::NodeAnnouncement::decode(&msg_data[2..]));
+ let msg = try_ignore_potential_decodeerror!(msgs::NodeAnnouncement::decode(&msg_data[2..]));
try_potential_handleerror!(self.message_handler.route_handler.handle_node_announcement(&msg));
},
258 => {