Skip to content

Commit fd4524b

Browse files
author
Antoine Riard
committed
Implement DisconnectPeer event + SendErrorMessage + test disconnection
1 parent 48b0d99 commit fd4524b

File tree

4 files changed

+162
-10
lines changed

4 files changed

+162
-10
lines changed

src/ln/channelmanager.rs

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -677,6 +677,14 @@ impl ChannelManager {
677677
/// Call this upon creation of a funding transaction for the given channel.
678678
/// Panics if a funding transaction has already been provided for this channel.
679679
pub fn funding_transaction_generated(&self, temporary_channel_id: &Uint256, funding_txo: OutPoint) {
680+
681+
macro_rules! add_pending_event {
682+
($event: expr) => {
683+
let mut pending_events = self.pending_events.lock().unwrap();
684+
pending_events.push($event);
685+
}
686+
}
687+
680688
let (chan, msg, chan_monitor) = {
681689
let mut channel_state = self.channel_state.lock().unwrap();
682690
match channel_state.by_id.remove(&temporary_channel_id) {
@@ -685,10 +693,22 @@ impl ChannelManager {
685693
Ok(funding_msg) => {
686694
(chan, funding_msg.0, funding_msg.1)
687695
},
688-
Err(_e) => {
689-
//TODO: Push e to pendingevents
696+
Err(e) => {
697+
println!("Got error handling message: {}!", e.err);
698+
if let Some(action) = e.msg {
699+
match action {
700+
msgs::ErrorAction::DisconnectPeer {} => {
701+
add_pending_event!(events::Event::DisconnectPeer {
702+
node_id: chan.get_their_node_id(),
703+
});
704+
},
705+
_ => panic!("Kind of error not implemented yet for funding_transaction_generated"),
706+
}
707+
} else {
708+
panic!("ErrorAction needed for this HandleError into funding_transaction_generated");
709+
}
690710
return;
691-
}
711+
},
692712
}
693713
},
694714
None => return
@@ -697,13 +717,10 @@ impl ChannelManager {
697717
if let Err(_e) = self.monitor.add_update_monitor(chan_monitor.get_funding_txo().unwrap(), chan_monitor) {
698718
unimplemented!(); // maybe remove from claimable_htlcs?
699719
}
700-
{
701-
let mut pending_events = self.pending_events.lock().unwrap();
702-
pending_events.push(events::Event::SendFundingCreated {
703-
node_id: chan.get_their_node_id(),
704-
msg: msg,
705-
});
706-
}
720+
add_pending_event!(events::Event::SendFundingCreated {
721+
node_id: chan.get_their_node_id(),
722+
msg: msg,
723+
});
707724

708725
let mut channel_state = self.channel_state.lock().unwrap();
709726
channel_state.by_id.insert(chan.channel_id(), chan);
@@ -1811,6 +1828,12 @@ impl ChannelMessageHandler for ChannelManager {
18111828
}
18121829
}
18131830
}
1831+
1832+
//For testing purpose in peer_handler
1833+
fn push_event(&self, event: events::Event) {
1834+
let mut pending_events = self.pending_events.lock().unwrap();
1835+
pending_events.push(event);
1836+
}
18141837
}
18151838

18161839
#[cfg(test)]

src/ln/msgs.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,10 @@ pub struct Init {
139139
pub local_features: LocalFeatures,
140140
}
141141

142+
pub struct ErrorMessage {
143+
pub err: &'static str,
144+
}
145+
142146
pub struct Ping {
143147
pub ponglen: u16,
144148
pub byteslen: u16,
@@ -435,6 +439,9 @@ pub trait ChannelMessageHandler : events::EventsProvider + Send + Sync {
435439
/// understand or indicate they require unknown feature bits), no_connection_possible is set
436440
/// and any outstanding channels should be failed.
437441
fn peer_disconnected(&self, their_node_id: &PublicKey, no_connection_possible: bool);
442+
443+
//Testing
444+
fn push_event(&self, event: events::Event);
438445
}
439446

440447
pub trait RoutingMessageHandler : Send + Sync {
@@ -1534,3 +1541,11 @@ impl MsgEncodable for OnionErrorPacket {
15341541
res
15351542
}
15361543
}
1544+
1545+
impl MsgEncodable for ErrorMessage {
1546+
fn encode(&self) -> Vec<u8> {
1547+
let mut res = Vec::with_capacity(self.err.len());
1548+
res.extend_from_slice(&self.err.as_bytes());
1549+
res
1550+
}
1551+
}

src/ln/peer_handler.rs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
576576
/// calls to ChannelManager::process_pending_htlc_forward.
577577
pub fn process_events(&self) {
578578
let mut upstream_events = Vec::new();
579+
let mut disconnect_peers = Vec::new();
579580
{
580581
// TODO: There are some DoS attacks here where you can flood someone's outbound send
581582
// buffer by doing things like announcing channels on another node. We should be willing to
@@ -710,12 +711,31 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
710711
}
711712
continue;
712713
},
714+
Event::SendErrorMessage { ref node_id, ref msg } => {
715+
let (mut descriptor, peer) = get_peer_for_forwarding!(node_id, {
716+
//TODO: Do whatever we're gonna do for handling dropped messages
717+
});
718+
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 17)));
719+
Self::do_attempt_write_data(&mut descriptor, peer);
720+
continue;
721+
},
722+
Event::DisconnectPeer { ref node_id } => {
723+
let (mut descriptor, peer) = get_peer_for_forwarding!(node_id, {
724+
//TODO: Do whatever we're gonna do for handling dropped messages
725+
});
726+
disconnect_peers.push(descriptor.clone());
727+
continue;
728+
}
713729
}
714730

715731
upstream_events.push(event);
716732
}
717733
}
718734

735+
for descriptor in disconnect_peers {
736+
self.disconnect_event(&descriptor);
737+
}
738+
719739
let mut pending_events = self.pending_events.lock().unwrap();
720740
for event in upstream_events.drain(..) {
721741
pending_events.push(event);
@@ -756,3 +776,87 @@ impl<Descriptor: SocketDescriptor> EventsProvider for PeerManager<Descriptor> {
756776
ret
757777
}
758778
}
779+
780+
#[cfg(test)]
781+
mod tests {
782+
use chain::chaininterface;
783+
use ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor};
784+
use ln::channelmanager::{ChannelManager};
785+
use ln::router::{Router};
786+
use ln::msgs;
787+
use ln::msgs::{HandleError};
788+
use util::test_utils;
789+
use util::events;
790+
791+
use bitcoin::network::constants::Network;
792+
use bitcoin::util::misc::hex_bytes;
793+
794+
use secp256k1::Secp256k1;
795+
use secp256k1::key::{SecretKey, PublicKey};
796+
797+
use rand::{thread_rng,Rng};
798+
799+
use std::sync::{Arc, Mutex};
800+
801+
#[derive(PartialEq, Eq, Clone, Hash)]
802+
struct FileDescriptor {
803+
fd: u16,
804+
}
805+
806+
impl SocketDescriptor for FileDescriptor {
807+
fn send_data(&mut self, data: &Vec<u8>, _write_offset: usize, _resume_read: bool) -> usize {
808+
data.len()
809+
}
810+
}
811+
812+
fn create_network(peer_count: usize) -> Vec<PeerManager<FileDescriptor>> {
813+
let secp_ctx = Secp256k1::new();
814+
let mut peers = Vec::new();
815+
let mut rng = thread_rng();
816+
817+
for _ in 0..peer_count {
818+
let feeest = Arc::new(test_utils::TestFeeEstimator { sat_per_vbyte: 1 });
819+
let chain_monitor = Arc::new(chaininterface::ChainWatchInterfaceUtil::new());
820+
let tx_broadcaster = Arc::new(test_utils::TestBroadcaster{txn_broadcasted: Mutex::new(Vec::new())});
821+
let chan_monitor = Arc::new(test_utils::TestChannelMonitor::new(chain_monitor.clone(), tx_broadcaster.clone()));
822+
let node_id = {
823+
let mut key_slice = [0;32];
824+
rng.fill_bytes(&mut key_slice);
825+
SecretKey::from_slice(&secp_ctx, &key_slice).unwrap()
826+
};
827+
let node = ChannelManager::new(node_id.clone(), 0, true, Network::Testnet, feeest.clone(), chan_monitor.clone(), chain_monitor.clone(), tx_broadcaster.clone()).unwrap();
828+
let router = Router::new(PublicKey::from_secret_key(&secp_ctx, &node_id).unwrap());
829+
let msg_handler = MessageHandler { chan_handler: node, route_handler: Arc::new(router) };
830+
let peer = PeerManager::new(msg_handler, node_id);
831+
peers.push(peer);
832+
}
833+
834+
peers
835+
}
836+
837+
fn establish_connection(peer_a: &PeerManager<FileDescriptor>, peer_b: &PeerManager<FileDescriptor>) {
838+
let secp_ctx = Secp256k1::new();
839+
let their_id = PublicKey::from_secret_key(&secp_ctx, &peer_b.our_node_secret).unwrap();
840+
let fd = FileDescriptor { fd: 1};
841+
peer_a.new_inbound_connection(fd.clone());
842+
peer_a.peers.lock().unwrap().node_id_to_descriptor.insert(their_id, fd.clone());
843+
}
844+
845+
#[test]
846+
fn test_disconnect_peer() {
847+
// Simple test which builds a network of PeerManager, connects and brings them to NoiseState::Finished and
848+
// push an DisconnectPeer event to remove the node flagged by id
849+
let peers = create_network(2);
850+
establish_connection(&peers[0], &peers[1]);
851+
assert_eq!(peers[0].peers.lock().unwrap().peers.len(), 1);
852+
853+
let secp_ctx = Secp256k1::new();
854+
let their_id = PublicKey::from_secret_key(&secp_ctx, &peers[1].our_node_secret).unwrap();
855+
peers[0].message_handler.chan_handler.push_event(events::Event::DisconnectPeer {
856+
node_id: their_id,
857+
});
858+
859+
peers[0].process_events();
860+
assert_eq!(peers[0].peers.lock().unwrap().peers.len(), 0);
861+
}
862+
}

src/util/events.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,16 @@ pub enum Event {
100100
BroadcastChannelUpdate {
101101
msg: msgs::ChannelUpdate,
102102
},
103+
/// Used to tell a peer that something is incorrect
104+
SendErrorMessage {
105+
node_id: PublicKey,
106+
msg: msgs::ErrorMessage,
107+
},
108+
// Events indicating the network loop should change the state of peer connection:
109+
/// Used to indicate that the peer connection should be closed with a message holding the reason
110+
DisconnectPeer {
111+
node_id: PublicKey,
112+
}
103113
}
104114

105115
pub trait EventsProvider {

0 commit comments

Comments
 (0)