mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 23:08:36 +01:00
Handle Error messages by closing channels as required by BOLT 1
This commit is contained in:
parent
8f36386bee
commit
a3247abb4e
4 changed files with 34 additions and 2 deletions
|
@ -2053,6 +2053,18 @@ impl ChannelMessageHandler for ChannelManager {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn handle_error(&self, their_node_id: &PublicKey, msg: &msgs::ErrorMessage) {
|
||||||
|
if msg.channel_id == [0; 32] {
|
||||||
|
for chan in self.list_channels() {
|
||||||
|
if chan.remote_network_id == *their_node_id {
|
||||||
|
self.force_close_channel(&chan.channel_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.force_close_channel(&msg.channel_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -439,12 +439,14 @@ pub trait ChannelMessageHandler : events::EventsProvider + Send + Sync {
|
||||||
// Channel-to-announce:
|
// Channel-to-announce:
|
||||||
fn handle_announcement_signatures(&self, their_node_id: &PublicKey, msg: &AnnouncementSignatures) -> Result<(), HandleError>;
|
fn handle_announcement_signatures(&self, their_node_id: &PublicKey, msg: &AnnouncementSignatures) -> Result<(), HandleError>;
|
||||||
|
|
||||||
// Informational:
|
// Error conditions:
|
||||||
/// Indicates a connection to the peer failed/an existing connection was lost. If no connection
|
/// Indicates a connection to the peer failed/an existing connection was lost. If no connection
|
||||||
/// is believed to be possible in the future (eg they're sending us messages we don't
|
/// is believed to be possible in the future (eg they're sending us messages we don't
|
||||||
/// understand or indicate they require unknown feature bits), no_connection_possible is set
|
/// understand or indicate they require unknown feature bits), no_connection_possible is set
|
||||||
/// and any outstanding channels should be failed.
|
/// and any outstanding channels should be failed.
|
||||||
fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
|
fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
|
||||||
|
|
||||||
|
fn handle_error(&self, their_node_id: &PublicKey, msg: &ErrorMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait RoutingMessageHandler : Send + Sync {
|
pub trait RoutingMessageHandler : Send + Sync {
|
||||||
|
|
|
@ -431,7 +431,24 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
17 => {
|
17 => {
|
||||||
// Error msg
|
let msg = try_potential_decodeerror!(msgs::ErrorMessage::decode(&msg_data[2..]));
|
||||||
|
let mut data_is_printable = true;
|
||||||
|
for b in msg.data.bytes() {
|
||||||
|
if b < 32 || b > 126 {
|
||||||
|
data_is_printable = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if data_is_printable {
|
||||||
|
log_debug!(self, "Got Err message from {}: {}", log_pubkey!(peer.their_node_id.unwrap()), msg.data);
|
||||||
|
} else {
|
||||||
|
log_debug!(self, "Got Err message from {} with non-ASCII error message", log_pubkey!(peer.their_node_id.unwrap()));
|
||||||
|
}
|
||||||
|
self.message_handler.chan_handler.handle_error(&peer.their_node_id.unwrap(), &msg);
|
||||||
|
if msg.channel_id == [0; 32] {
|
||||||
|
return Err(PeerHandleError{ no_connection_possible: true });
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
18 => {
|
18 => {
|
||||||
|
|
|
@ -115,6 +115,7 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
|
||||||
Err(HandleError { err: "", action: None })
|
Err(HandleError { err: "", action: None })
|
||||||
}
|
}
|
||||||
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
|
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
|
||||||
|
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl events::EventsProvider for TestChannelMessageHandler {
|
impl events::EventsProvider for TestChannelMessageHandler {
|
||||||
|
|
Loading…
Add table
Reference in a new issue