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 => {
continue;
},
Event::BroadcastChannelAnnouncement { ref msg, ref update_msg } => {
- let encoded_msg = encode_msg!(msg, 256);
- let encoded_update_msg = encode_msg!(update_msg, 258);
+ if self.message_handler.route_handler.handle_channel_announcement(msg).is_ok() && self.message_handler.route_handler.handle_channel_update(update_msg).is_ok() {
+ let encoded_msg = encode_msg!(msg, 256);
+ 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() {
- continue
- }
- match peer.their_node_id {
- None => continue,
- Some(their_node_id) => {
- if their_node_id == msg.contents.node_id_1 || their_node_id == msg.contents.node_id_2 {
- continue
+ for (ref descriptor, ref mut peer) in peers.peers.iter_mut() {
+ if !peer.channel_encryptor.is_ready_for_encryption() {
+ continue
+ }
+ match peer.their_node_id {
+ None => continue,
+ Some(their_node_id) => {
+ if their_node_id == msg.contents.node_id_1 || their_node_id == msg.contents.node_id_2 {
+ continue
+ }
}
}
+ peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encoded_msg[..]));
+ peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encoded_update_msg[..]));
+ Self::do_attempt_write_data(&mut (*descriptor).clone(), peer);
+ }
+ }
+ continue;
+ },
+ Event::BroadcastChannelUpdate { ref msg } => {
+ if self.message_handler.route_handler.handle_channel_update(msg).is_ok() {
+ 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() {
+ continue
+ }
+ peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encoded_msg[..]));
+ Self::do_attempt_write_data(&mut (*descriptor).clone(), peer);
}
- peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encoded_msg[..]));
- peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encoded_update_msg[..]));
- Self::do_attempt_write_data(&mut (*descriptor).clone(), peer);
}
continue;
},