From d7b33fcd847f5480e438b2df176449d73f582090 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Sat, 16 Jun 2018 19:04:42 -0400 Subject: [PATCH] Support ignoring some errors, deserialize empty flags types --- src/ln/msgs.rs | 8 +++++--- src/ln/peer_handler.rs | 8 ++++++-- src/ln/router.rs | 12 ++++++------ 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/ln/msgs.rs b/src/ln/msgs.rs index 0a86b031e..f0f1d4890 100644 --- a/src/ln/msgs.rs +++ b/src/ln/msgs.rs @@ -357,7 +357,9 @@ pub enum ErrorAction { msg: UpdateFailHTLC }, /// The peer took some action which made us think they were useless. Disconnect them. - DisconnectPeer {}, + DisconnectPeer, + /// The peer did something harmless that we weren't able to process, just log and ignore + IgnoreError, } pub struct HandleError { //TODO: rename me @@ -506,7 +508,7 @@ macro_rules! secp_signature { impl MsgDecodable for LocalFeatures { fn decode(v: &[u8]) -> Result { - if v.len() < 3 { return Err(DecodeError::WrongLength); } + if v.len() < 2 { return Err(DecodeError::WrongLength); } let len = byte_utils::slice_to_be16(&v[0..2]) as usize; if v.len() < len + 2 { return Err(DecodeError::WrongLength); } let mut flags = Vec::with_capacity(len); @@ -528,7 +530,7 @@ impl MsgEncodable for LocalFeatures { impl MsgDecodable for GlobalFeatures { fn decode(v: &[u8]) -> Result { - if v.len() < 3 { return Err(DecodeError::WrongLength); } + if v.len() < 2 { return Err(DecodeError::WrongLength); } let len = byte_utils::slice_to_be16(&v[0..2]) as usize; if v.len() < len + 2 { return Err(DecodeError::WrongLength); } let mut flags = Vec::with_capacity(len); diff --git a/src/ln/peer_handler.rs b/src/ln/peer_handler.rs index 7b140b079..bccfe5a03 100644 --- a/src/ln/peer_handler.rs +++ b/src/ln/peer_handler.rs @@ -272,16 +272,19 @@ impl PeerManager { 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 }); @@ -296,6 +299,7 @@ impl PeerManager { match $thing { Ok(x) => x, Err(_e) => { + println!("Error decoding message"); //TODO: Handle e? return Err(PeerHandleError{ no_connection_possible: false }); } diff --git a/src/ln/router.rs b/src/ln/router.rs index 19a677580..e4473fa41 100644 --- a/src/ln/router.rs +++ b/src/ln/router.rs @@ -3,7 +3,7 @@ use secp256k1::{Secp256k1,Message}; use bitcoin::util::hash::Sha256dHash; -use ln::msgs::{HandleError,RoutingMessageHandler,MsgEncodable,NetAddress,GlobalFeatures}; +use ln::msgs::{ErrorAction,HandleError,RoutingMessageHandler,MsgEncodable,NetAddress,GlobalFeatures}; use ln::msgs; use std::cmp; @@ -122,10 +122,10 @@ impl RoutingMessageHandler for Router { let mut network = self.network_map.write().unwrap(); match network.nodes.get_mut(&msg.contents.node_id) { - None => Err(HandleError{err: "No existing channels for node_announcement", msg: None}), + None => Err(HandleError{err: "No existing channels for node_announcement", msg: Some(ErrorAction::IgnoreError)}), Some(node) => { if node.last_update >= msg.contents.timestamp { - return Err(HandleError{err: "Update older than last processed update", msg: None}); + return Err(HandleError{err: "Update older than last processed update", msg: Some(ErrorAction::IgnoreError)}); } node.features = msg.contents.features.clone(); @@ -159,7 +159,7 @@ impl RoutingMessageHandler for Router { //TODO: because asking the blockchain if short_channel_id is valid is only optional //in the blockchain API, we need to handle it smartly here, though its unclear //exactly how... - return Err(HandleError{err: "Already have knowledge of channel", msg: None}) + return Err(HandleError{err: "Already have knowledge of channel", msg: Some(ErrorAction::IgnoreError)}) }, Entry::Vacant(entry) => { entry.insert(ChannelInfo { @@ -233,12 +233,12 @@ impl RoutingMessageHandler for Router { let chan_was_enabled; match network.channels.get_mut(&NetworkMap::get_key(msg.contents.short_channel_id, msg.contents.chain_hash)) { - None => return Err(HandleError{err: "Couldn't find channel for update", msg: None}), + None => return Err(HandleError{err: "Couldn't find channel for update", msg: Some(ErrorAction::IgnoreError)}), Some(channel) => { macro_rules! maybe_update_channel_info { ( $target: expr) => { if $target.last_update >= msg.contents.timestamp { - return Err(HandleError{err: "Update older than last processed update", msg: None}); + return Err(HandleError{err: "Update older than last processed update", msg: Some(ErrorAction::IgnoreError)}); } chan_was_enabled = $target.enabled; $target.last_update = msg.contents.timestamp; -- 2.39.5