mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-02-24 23:08:36 +01:00
Merge pull request #1326 from Psycho-Pirate/peers
Added option to send remote IP to peers
This commit is contained in:
commit
b010aeb5f1
15 changed files with 280 additions and 91 deletions
|
@ -411,8 +411,8 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
let mut channel_txn = Vec::new();
|
||||
macro_rules! make_channel {
|
||||
($source: expr, $dest: expr, $chan_id: expr) => { {
|
||||
$source.peer_connected(&$dest.get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
$dest.peer_connected(&$source.get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
$source.peer_connected(&$dest.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
$dest.peer_connected(&$source.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
|
||||
$source.create_channel($dest.get_our_node_id(), 100_000, 42, 0, None).unwrap();
|
||||
let open_channel = {
|
||||
|
@ -921,15 +921,15 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
},
|
||||
0x0e => {
|
||||
if chan_a_disconnected {
|
||||
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
chan_a_disconnected = false;
|
||||
}
|
||||
},
|
||||
0x0f => {
|
||||
if chan_b_disconnected {
|
||||
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
chan_b_disconnected = false;
|
||||
}
|
||||
},
|
||||
|
@ -1124,13 +1124,13 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out) {
|
|||
|
||||
// Next, make sure peers are all connected to each other
|
||||
if chan_a_disconnected {
|
||||
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[0].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].peer_connected(&nodes[0].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
chan_a_disconnected = false;
|
||||
}
|
||||
if chan_b_disconnected {
|
||||
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[1].peer_connected(&nodes[2].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[2].peer_connected(&nodes[1].get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
chan_b_disconnected = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -422,7 +422,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
|
|||
}
|
||||
}
|
||||
if new_id == 0 { return; }
|
||||
loss_detector.handler.new_outbound_connection(get_pubkey!(), Peer{id: (new_id - 1) as u8, peers_connected: &peers}).unwrap();
|
||||
loss_detector.handler.new_outbound_connection(get_pubkey!(), Peer{id: (new_id - 1) as u8, peers_connected: &peers}, None).unwrap();
|
||||
peers.borrow_mut()[new_id - 1] = true;
|
||||
},
|
||||
1 => {
|
||||
|
@ -434,7 +434,7 @@ pub fn do_test(data: &[u8], logger: &Arc<dyn Logger>) {
|
|||
}
|
||||
}
|
||||
if new_id == 0 { return; }
|
||||
loss_detector.handler.new_inbound_connection(Peer{id: (new_id - 1) as u8, peers_connected: &peers}).unwrap();
|
||||
loss_detector.handler.new_inbound_connection(Peer{id: (new_id - 1) as u8, peers_connected: &peers}, None).unwrap();
|
||||
peers.borrow_mut()[new_id - 1] = true;
|
||||
},
|
||||
2 => {
|
||||
|
|
|
@ -435,8 +435,8 @@ mod tests {
|
|||
|
||||
for i in 0..num_nodes {
|
||||
for j in (i+1)..num_nodes {
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -81,10 +81,11 @@ use tokio::io::{AsyncReadExt, AsyncWrite, AsyncWriteExt};
|
|||
use lightning::ln::peer_handler;
|
||||
use lightning::ln::peer_handler::SocketDescriptor as LnSocketTrait;
|
||||
use lightning::ln::peer_handler::CustomMessageHandler;
|
||||
use lightning::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler};
|
||||
use lightning::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler, NetAddress};
|
||||
use lightning::util::logger::Logger;
|
||||
|
||||
use std::task;
|
||||
use std::net::IpAddr;
|
||||
use std::net::SocketAddr;
|
||||
use std::net::TcpStream as StdTcpStream;
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
@ -222,11 +223,21 @@ pub fn setup_inbound<CMH, RMH, L, UMH>(peer_manager: Arc<peer_handler::PeerManag
|
|||
RMH: RoutingMessageHandler + 'static + Send + Sync,
|
||||
L: Logger + 'static + ?Sized + Send + Sync,
|
||||
UMH: CustomMessageHandler + 'static + Send + Sync {
|
||||
let ip_addr = stream.peer_addr().unwrap();
|
||||
let (reader, write_receiver, read_receiver, us) = Connection::new(stream);
|
||||
#[cfg(debug_assertions)]
|
||||
let last_us = Arc::clone(&us);
|
||||
|
||||
let handle_opt = if let Ok(_) = peer_manager.new_inbound_connection(SocketDescriptor::new(us.clone())) {
|
||||
let handle_opt = if let Ok(_) = peer_manager.new_inbound_connection(SocketDescriptor::new(us.clone()), match ip_addr.ip() {
|
||||
IpAddr::V4(ip) => Some(NetAddress::IPv4 {
|
||||
addr: ip.octets(),
|
||||
port: ip_addr.port(),
|
||||
}),
|
||||
IpAddr::V6(ip) => Some(NetAddress::IPv6 {
|
||||
addr: ip.octets(),
|
||||
port: ip_addr.port(),
|
||||
}),
|
||||
}) {
|
||||
Some(tokio::spawn(Connection::schedule_read(peer_manager, us, reader, read_receiver, write_receiver)))
|
||||
} else {
|
||||
// Note that we will skip socket_disconnected here, in accordance with the PeerManager
|
||||
|
@ -263,11 +274,20 @@ pub fn setup_outbound<CMH, RMH, L, UMH>(peer_manager: Arc<peer_handler::PeerMana
|
|||
RMH: RoutingMessageHandler + 'static + Send + Sync,
|
||||
L: Logger + 'static + ?Sized + Send + Sync,
|
||||
UMH: CustomMessageHandler + 'static + Send + Sync {
|
||||
let ip_addr = stream.peer_addr().unwrap();
|
||||
let (reader, mut write_receiver, read_receiver, us) = Connection::new(stream);
|
||||
#[cfg(debug_assertions)]
|
||||
let last_us = Arc::clone(&us);
|
||||
|
||||
let handle_opt = if let Ok(initial_send) = peer_manager.new_outbound_connection(their_node_id, SocketDescriptor::new(us.clone())) {
|
||||
let handle_opt = if let Ok(initial_send) = peer_manager.new_outbound_connection(their_node_id, SocketDescriptor::new(us.clone()), match ip_addr.ip() {
|
||||
IpAddr::V4(ip) => Some(NetAddress::IPv4 {
|
||||
addr: ip.octets(),
|
||||
port: ip_addr.port(),
|
||||
}),
|
||||
IpAddr::V6(ip) => Some(NetAddress::IPv6 {
|
||||
addr: ip.octets(),
|
||||
port: ip_addr.port(),
|
||||
}),
|
||||
}) {
|
||||
Some(tokio::spawn(async move {
|
||||
// We should essentially always have enough room in a TCP socket buffer to send the
|
||||
// initial 10s of bytes. However, tokio running in single-threaded mode will always
|
||||
|
|
|
@ -334,10 +334,10 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
@ -356,10 +356,10 @@ fn do_test_monitor_temporary_update_fail(disconnect_count: usize) {
|
|||
assert!(nodes[0].node.get_and_clear_pending_events().is_empty());
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
@ -1108,8 +1108,8 @@ fn test_monitor_update_fail_reestablish() {
|
|||
commitment_signed_dance!(nodes[1], nodes[2], updates.commitment_signed, false);
|
||||
|
||||
chanmon_cfgs[1].persister.set_update_ret(Err(ChannelMonitorUpdateErr::TemporaryFailure));
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
|
||||
let as_reestablish = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
let bs_reestablish = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
|
@ -1127,8 +1127,8 @@ fn test_monitor_update_fail_reestablish() {
|
|||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
|
||||
assert!(as_reestablish == get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id()));
|
||||
assert!(bs_reestablish == get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id()));
|
||||
|
@ -1300,8 +1300,8 @@ fn claim_while_disconnected_monitor_update_fail() {
|
|||
assert!(nodes[1].node.claim_funds(payment_preimage_1));
|
||||
check_added_monitors!(nodes[1], 1);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
|
||||
let as_reconnect = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
let bs_reconnect = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
|
@ -1432,8 +1432,8 @@ fn monitor_failed_no_reestablish_response() {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
|
||||
let as_reconnect = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
let bs_reconnect = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
|
@ -2012,9 +2012,9 @@ fn test_pending_update_fee_ack_on_reconnect() {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
let as_connect_msg = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
let bs_connect_msg = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_connect_msg);
|
||||
|
@ -2094,9 +2094,9 @@ fn do_update_fee_resend_test(deliver_update: bool, parallel_updates: bool) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
let as_connect_msg = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
let bs_connect_msg = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_connect_msg);
|
||||
|
@ -2258,10 +2258,10 @@ fn do_channel_holding_cell_serialize(disconnect: bool, reload_a: bool) {
|
|||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
// Now reconnect the two
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
|
|
@ -7351,8 +7351,8 @@ mod tests {
|
|||
|
||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||
let payee_pubkey = nodes[1].node.get_our_node_id();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||
let route_params = RouteParameters {
|
||||
|
@ -7395,8 +7395,8 @@ mod tests {
|
|||
|
||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||
let payee_pubkey = nodes[1].node.get_our_node_id();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||
let route_params = RouteParameters {
|
||||
|
@ -7561,8 +7561,8 @@ pub mod bench {
|
|||
});
|
||||
let node_b_holder = NodeHolder { node: &node_b };
|
||||
|
||||
node_a.peer_connected(&node_b.get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
node_b.peer_connected(&node_a.get_our_node_id(), &Init { features: InitFeatures::known() });
|
||||
node_a.peer_connected(&node_b.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
node_b.peer_connected(&node_a.get_our_node_id(), &Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
node_a.create_channel(node_b.get_our_node_id(), 8_000_000, 100_000_000, 42, None).unwrap();
|
||||
node_b.handle_open_channel(&node_a.get_our_node_id(), InitFeatures::known(), &get_event_msg!(node_a_holder, MessageSendEvent::SendOpenChannel, node_b.get_our_node_id()));
|
||||
node_a.handle_accept_channel(&node_b.get_our_node_id(), InitFeatures::known(), &get_event_msg!(node_b_holder, MessageSendEvent::SendAcceptChannel, node_a.get_our_node_id()));
|
||||
|
|
|
@ -1877,8 +1877,8 @@ pub fn create_network<'a, 'b: 'a, 'c: 'b>(node_count: usize, cfgs: &'b Vec<NodeC
|
|||
|
||||
for i in 0..node_count {
|
||||
for j in (i+1)..node_count {
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &msgs::Init { features: cfgs[j].features.clone() });
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &msgs::Init { features: cfgs[i].features.clone() });
|
||||
nodes[i].node.peer_connected(&nodes[j].node.get_our_node_id(), &msgs::Init { features: cfgs[j].features.clone(), remote_network_address: None });
|
||||
nodes[j].node.peer_connected(&nodes[i].node.get_our_node_id(), &msgs::Init { features: cfgs[i].features.clone(), remote_network_address: None });
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2137,9 +2137,9 @@ macro_rules! handle_chan_reestablish_msgs {
|
|||
/// pending_htlc_adds includes both the holding cell and in-flight update_add_htlcs, whereas
|
||||
/// for claims/fails they are separated out.
|
||||
pub fn reconnect_nodes<'a, 'b, 'c>(node_a: &Node<'a, 'b, 'c>, node_b: &Node<'a, 'b, 'c>, send_funding_locked: (bool, bool), pending_htlc_adds: (i64, i64), pending_htlc_claims: (usize, usize), pending_htlc_fails: (usize, usize), pending_cell_htlc_claims: (usize, usize), pending_cell_htlc_fails: (usize, usize), pending_raa: (bool, bool)) {
|
||||
node_a.node.peer_connected(&node_b.node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
node_a.node.peer_connected(&node_b.node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(node_a, node_b);
|
||||
node_b.node.peer_connected(&node_a.node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
node_b.node.peer_connected(&node_a.node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(node_b, node_a);
|
||||
|
||||
if send_funding_locked.0 {
|
||||
|
|
|
@ -3779,9 +3779,9 @@ fn test_funding_peer_disconnect() {
|
|||
let events_2 = nodes[1].node.get_and_clear_pending_msg_events();
|
||||
assert!(events_2.is_empty());
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let as_reestablish = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let bs_reestablish = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
|
||||
// nodes[0] hasn't yet received a funding_locked, so it only sends that on reconnect.
|
||||
|
@ -4026,10 +4026,10 @@ fn test_drop_messages_peer_disconnect_dual_htlc() {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
|
||||
|
@ -4305,9 +4305,9 @@ fn test_no_txn_manager_serialize_deserialize() {
|
|||
assert_eq!(nodes[0].node.list_channels().len(), 1);
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &reestablish_1[0]);
|
||||
|
@ -4425,9 +4425,9 @@ fn test_manager_serialize_deserialize_events() {
|
|||
assert_eq!(nodes[0].node.list_channels().len(), 1);
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &reestablish_1[0]);
|
||||
|
@ -4620,9 +4620,9 @@ fn test_manager_serialize_deserialize_inconsistent_monitor() {
|
|||
//... and we can even still claim the payment!
|
||||
claim_payment(&nodes[2], &[&nodes[0], &nodes[1]], our_payment_preimage);
|
||||
|
||||
nodes[3].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[3].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish = get_event_msg!(nodes[3], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.peer_connected(&nodes[3].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[3].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[3].node.get_our_node_id(), &reestablish);
|
||||
let msg_events = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
assert_eq!(msg_events.len(), 1);
|
||||
|
@ -6681,10 +6681,10 @@ fn test_update_add_htlc_bolt2_receiver_check_repeated_id_ignore() {
|
|||
//Disconnect and Reconnect
|
||||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 1);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 1);
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &reestablish_2[0]);
|
||||
|
@ -7329,8 +7329,8 @@ fn test_data_loss_protect() {
|
|||
|
||||
check_added_monitors!(nodes[0], 1);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
|
||||
let reestablish_0 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
|
||||
|
@ -7478,10 +7478,10 @@ fn test_announce_disable_channels() {
|
|||
}
|
||||
}
|
||||
// Reconnect peers
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_1 = get_chan_reestablish_msgs!(nodes[0], nodes[1]);
|
||||
assert_eq!(reestablish_1.len(), 3);
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let reestablish_2 = get_chan_reestablish_msgs!(nodes[1], nodes[0]);
|
||||
assert_eq!(reestablish_2.len(), 3);
|
||||
|
||||
|
@ -9514,8 +9514,8 @@ fn test_keysend_payments_to_private_node() {
|
|||
|
||||
let payer_pubkey = nodes[0].node.get_our_node_id();
|
||||
let payee_pubkey = nodes[1].node.get_our_node_id();
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[0].node.peer_connected(&payee_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&payer_pubkey, &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
|
||||
let _chan = create_chan_between_nodes(&nodes[0], &nodes[1], InitFeatures::known(), InitFeatures::known());
|
||||
let route_params = RouteParameters {
|
||||
|
|
|
@ -75,6 +75,11 @@ pub enum DecodeError {
|
|||
pub struct Init {
|
||||
/// The relevant features which the sender supports
|
||||
pub features: InitFeatures,
|
||||
/// The receipient's network address. This adds the option to report a remote IP address
|
||||
/// back to a connecting peer using the init message. A node can decide to use that information
|
||||
/// to discover a potential update to its public IPv4 address (NAT) and use
|
||||
/// that for a node_announcement update message containing the new address.
|
||||
pub remote_network_address: Option<NetAddress>,
|
||||
}
|
||||
|
||||
/// An error message to be sent or received from a peer
|
||||
|
@ -1167,7 +1172,11 @@ impl Writeable for Init {
|
|||
// global_features gets the bottom 13 bits of our features, and local_features gets all of
|
||||
// our relevant feature bits. This keeps us compatible with old nodes.
|
||||
self.features.write_up_to_13(w)?;
|
||||
self.features.write(w)
|
||||
self.features.write(w)?;
|
||||
encode_tlv_stream!(w, {
|
||||
(3, self.remote_network_address, option)
|
||||
});
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1175,8 +1184,13 @@ impl Readable for Init {
|
|||
fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
|
||||
let global_features: InitFeatures = Readable::read(r)?;
|
||||
let features: InitFeatures = Readable::read(r)?;
|
||||
let mut remote_network_address: Option<NetAddress> = None;
|
||||
decode_tlv_stream!(r, {
|
||||
(3, remote_network_address, option)
|
||||
});
|
||||
Ok(Init {
|
||||
features: features.or(global_features),
|
||||
remote_network_address,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -2447,13 +2461,27 @@ mod tests {
|
|||
fn encoding_init() {
|
||||
assert_eq!(msgs::Init {
|
||||
features: InitFeatures::from_le_bytes(vec![0xFF, 0xFF, 0xFF]),
|
||||
remote_network_address: None,
|
||||
}.encode(), hex::decode("00023fff0003ffffff").unwrap());
|
||||
assert_eq!(msgs::Init {
|
||||
features: InitFeatures::from_le_bytes(vec![0xFF]),
|
||||
remote_network_address: None,
|
||||
}.encode(), hex::decode("0001ff0001ff").unwrap());
|
||||
assert_eq!(msgs::Init {
|
||||
features: InitFeatures::from_le_bytes(vec![]),
|
||||
remote_network_address: None,
|
||||
}.encode(), hex::decode("00000000").unwrap());
|
||||
|
||||
let init_msg = msgs::Init { features: InitFeatures::from_le_bytes(vec![]),
|
||||
remote_network_address: Some(msgs::NetAddress::IPv4 {
|
||||
addr: [127, 0, 0, 1],
|
||||
port: 1000,
|
||||
}),
|
||||
};
|
||||
let encoded_value = init_msg.encode();
|
||||
let target_value = hex::decode("000000000307017f00000103e8").unwrap();
|
||||
assert_eq!(encoded_value, target_value);
|
||||
assert_eq!(msgs::Init::read(&mut Cursor::new(&target_value)).unwrap(), init_msg);
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
@ -449,12 +449,12 @@ fn do_retry_with_no_persist(confirm_before_reload: bool) {
|
|||
assert_eq!(as_broadcasted_txn[0], as_commitment_tx);
|
||||
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known()});
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
|
||||
|
||||
// Now nodes[1] should send a channel reestablish, which nodes[0] will respond to with an
|
||||
// error, as the channel has hit the chain.
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known()});
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
let bs_reestablish = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
|
||||
let as_err = nodes[0].node.get_and_clear_pending_msg_events();
|
||||
|
|
|
@ -19,7 +19,7 @@ use bitcoin::secp256k1::key::{SecretKey,PublicKey};
|
|||
|
||||
use ln::features::InitFeatures;
|
||||
use ln::msgs;
|
||||
use ln::msgs::{ChannelMessageHandler, LightningError, RoutingMessageHandler};
|
||||
use ln::msgs::{ChannelMessageHandler, LightningError, NetAddress, RoutingMessageHandler};
|
||||
use ln::channelmanager::{SimpleArcChannelManager, SimpleRefChannelManager};
|
||||
use util::ser::{VecWriter, Writeable, Writer};
|
||||
use ln::peer_channel_encryptor::{PeerChannelEncryptor,NextNoiseStep};
|
||||
|
@ -324,6 +324,7 @@ struct Peer {
|
|||
channel_encryptor: PeerChannelEncryptor,
|
||||
their_node_id: Option<PublicKey>,
|
||||
their_features: Option<InitFeatures>,
|
||||
their_net_address: Option<NetAddress>,
|
||||
|
||||
pending_outbound_buffer: LinkedList<Vec<u8>>,
|
||||
pending_outbound_buffer_first_msg_offset: usize,
|
||||
|
@ -499,6 +500,36 @@ impl core::fmt::Display for OptionalFromDebugger<'_> {
|
|||
}
|
||||
}
|
||||
|
||||
/// A function used to filter out local or private addresses
|
||||
/// https://www.iana.org./assignments/ipv4-address-space/ipv4-address-space.xhtml
|
||||
/// https://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xhtml
|
||||
fn filter_addresses(ip_address: Option<NetAddress>) -> Option<NetAddress> {
|
||||
match ip_address{
|
||||
// For IPv4 range 10.0.0.0 - 10.255.255.255 (10/8)
|
||||
Some(NetAddress::IPv4{addr: [10, _, _, _], port: _}) => None,
|
||||
// For IPv4 range 0.0.0.0 - 0.255.255.255 (0/8)
|
||||
Some(NetAddress::IPv4{addr: [0, _, _, _], port: _}) => None,
|
||||
// For IPv4 range 100.64.0.0 - 100.127.255.255 (100.64/10)
|
||||
Some(NetAddress::IPv4{addr: [100, 64..=127, _, _], port: _}) => None,
|
||||
// For IPv4 range 127.0.0.0 - 127.255.255.255 (127/8)
|
||||
Some(NetAddress::IPv4{addr: [127, _, _, _], port: _}) => None,
|
||||
// For IPv4 range 169.254.0.0 - 169.254.255.255 (169.254/16)
|
||||
Some(NetAddress::IPv4{addr: [169, 254, _, _], port: _}) => None,
|
||||
// For IPv4 range 172.16.0.0 - 172.31.255.255 (172.16/12)
|
||||
Some(NetAddress::IPv4{addr: [172, 16..=31, _, _], port: _}) => None,
|
||||
// For IPv4 range 192.168.0.0 - 192.168.255.255 (192.168/16)
|
||||
Some(NetAddress::IPv4{addr: [192, 168, _, _], port: _}) => None,
|
||||
// For IPv4 range 192.88.99.0 - 192.88.99.255 (192.88.99/24)
|
||||
Some(NetAddress::IPv4{addr: [192, 88, 99, _], port: _}) => None,
|
||||
// For IPv6 range 2000:0000:0000:0000:0000:0000:0000:0000 - 3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff (2000::/3)
|
||||
Some(NetAddress::IPv6{addr: [0x20..=0x3F, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], port: _}) => ip_address,
|
||||
// For remaining addresses
|
||||
Some(NetAddress::IPv6{addr: _, port: _}) => None,
|
||||
Some(..) => ip_address,
|
||||
None => None,
|
||||
}
|
||||
}
|
||||
|
||||
impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> PeerManager<Descriptor, CM, RM, L, CMH> where
|
||||
CM::Target: ChannelMessageHandler,
|
||||
RM::Target: RoutingMessageHandler,
|
||||
|
@ -547,7 +578,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
|
|||
SecretKey::from_slice(&Sha256::from_engine(ephemeral_hash).into_inner()).expect("You broke SHA-256!")
|
||||
}
|
||||
|
||||
/// Indicates a new outbound connection has been established to a node with the given node_id.
|
||||
/// Indicates a new outbound connection has been established to a node with the given node_id
|
||||
/// and an optional remote network address.
|
||||
///
|
||||
/// The remote network address adds the option to report a remote IP address back to a connecting
|
||||
/// peer using the init message.
|
||||
/// The user should pass the remote network address of the host they are connected to.
|
||||
///
|
||||
/// Note that if an Err is returned here you MUST NOT call socket_disconnected for the new
|
||||
/// descriptor but must disconnect the connection immediately.
|
||||
///
|
||||
|
@ -557,7 +594,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
|
|||
/// [`socket_disconnected()`].
|
||||
///
|
||||
/// [`socket_disconnected()`]: PeerManager::socket_disconnected
|
||||
pub fn new_outbound_connection(&self, their_node_id: PublicKey, descriptor: Descriptor) -> Result<Vec<u8>, PeerHandleError> {
|
||||
pub fn new_outbound_connection(&self, their_node_id: PublicKey, descriptor: Descriptor, remote_network_address: Option<NetAddress>) -> Result<Vec<u8>, PeerHandleError> {
|
||||
let mut peer_encryptor = PeerChannelEncryptor::new_outbound(their_node_id.clone(), self.get_ephemeral_key());
|
||||
let res = peer_encryptor.get_act_one().to_vec();
|
||||
let pending_read_buffer = [0; 50].to_vec(); // Noise act two is 50 bytes
|
||||
|
@ -567,6 +604,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
|
|||
channel_encryptor: peer_encryptor,
|
||||
their_node_id: None,
|
||||
their_features: None,
|
||||
their_net_address: remote_network_address,
|
||||
|
||||
pending_outbound_buffer: LinkedList::new(),
|
||||
pending_outbound_buffer_first_msg_offset: 0,
|
||||
|
@ -587,7 +625,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
|
|||
Ok(res)
|
||||
}
|
||||
|
||||
/// Indicates a new inbound connection has been established.
|
||||
/// Indicates a new inbound connection has been established to a node with an optional remote
|
||||
/// network address.
|
||||
///
|
||||
/// The remote network address adds the option to report a remote IP address back to a connecting
|
||||
/// peer using the init message.
|
||||
/// The user should pass the remote network address of the host they are connected to.
|
||||
///
|
||||
/// May refuse the connection by returning an Err, but will never write bytes to the remote end
|
||||
/// (outbound connector always speaks first). Note that if an Err is returned here you MUST NOT
|
||||
|
@ -598,7 +641,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
|
|||
/// [`socket_disconnected()`].
|
||||
///
|
||||
/// [`socket_disconnected()`]: PeerManager::socket_disconnected
|
||||
pub fn new_inbound_connection(&self, descriptor: Descriptor) -> Result<(), PeerHandleError> {
|
||||
pub fn new_inbound_connection(&self, descriptor: Descriptor, remote_network_address: Option<NetAddress>) -> Result<(), PeerHandleError> {
|
||||
let peer_encryptor = PeerChannelEncryptor::new_inbound(&self.our_node_secret);
|
||||
let pending_read_buffer = [0; 50].to_vec(); // Noise act one is 50 bytes
|
||||
|
||||
|
@ -607,6 +650,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
|
|||
channel_encryptor: peer_encryptor,
|
||||
their_node_id: None,
|
||||
their_features: None,
|
||||
their_net_address: remote_network_address,
|
||||
|
||||
pending_outbound_buffer: LinkedList::new(),
|
||||
pending_outbound_buffer_first_msg_offset: 0,
|
||||
|
@ -868,7 +912,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
|
|||
peer.their_node_id = Some(their_node_id);
|
||||
insert_node_id!();
|
||||
let features = InitFeatures::known();
|
||||
let resp = msgs::Init { features };
|
||||
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone())};
|
||||
self.enqueue_message(peer, &resp);
|
||||
peer.awaiting_pong_timer_tick_intervals = 0;
|
||||
},
|
||||
|
@ -879,7 +923,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref, CMH: Deref> P
|
|||
peer.their_node_id = Some(their_node_id);
|
||||
insert_node_id!();
|
||||
let features = InitFeatures::known();
|
||||
let resp = msgs::Init { features };
|
||||
let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone())};
|
||||
self.enqueue_message(peer, &resp);
|
||||
peer.awaiting_pong_timer_tick_intervals = 0;
|
||||
},
|
||||
|
@ -1670,8 +1714,9 @@ fn is_gossip_msg(type_id: u16) -> bool {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler};
|
||||
use ln::peer_handler::{PeerManager, MessageHandler, SocketDescriptor, IgnoringMessageHandler, filter_addresses};
|
||||
use ln::msgs;
|
||||
use ln::msgs::NetAddress;
|
||||
use util::events;
|
||||
use util::test_utils;
|
||||
|
||||
|
@ -1747,8 +1792,8 @@ mod tests {
|
|||
let a_id = PublicKey::from_secret_key(&secp_ctx, &peer_a.our_node_secret);
|
||||
let mut fd_a = FileDescriptor { fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())) };
|
||||
let mut fd_b = FileDescriptor { fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())) };
|
||||
let initial_data = peer_b.new_outbound_connection(a_id, fd_b.clone()).unwrap();
|
||||
peer_a.new_inbound_connection(fd_a.clone()).unwrap();
|
||||
let initial_data = peer_b.new_outbound_connection(a_id, fd_b.clone(), None).unwrap();
|
||||
peer_a.new_inbound_connection(fd_a.clone(), None).unwrap();
|
||||
assert_eq!(peer_a.read_event(&mut fd_a, &initial_data).unwrap(), false);
|
||||
peer_a.process_events();
|
||||
assert_eq!(peer_b.read_event(&mut fd_b, &fd_a.outbound_data.lock().unwrap().split_off(0)).unwrap(), false);
|
||||
|
@ -1855,8 +1900,8 @@ mod tests {
|
|||
let a_id = PublicKey::from_secret_key(&secp_ctx, &peers[0].our_node_secret);
|
||||
let mut fd_a = FileDescriptor { fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())) };
|
||||
let mut fd_b = FileDescriptor { fd: 1, outbound_data: Arc::new(Mutex::new(Vec::new())) };
|
||||
let initial_data = peers[1].new_outbound_connection(a_id, fd_b.clone()).unwrap();
|
||||
peers[0].new_inbound_connection(fd_a.clone()).unwrap();
|
||||
let initial_data = peers[1].new_outbound_connection(a_id, fd_b.clone(), None).unwrap();
|
||||
peers[0].new_inbound_connection(fd_a.clone(), None).unwrap();
|
||||
|
||||
// If we get a single timer tick before completion, that's fine
|
||||
assert_eq!(peers[0].peers.lock().unwrap().peers.len(), 1);
|
||||
|
@ -1874,4 +1919,100 @@ mod tests {
|
|||
|
||||
assert!(peers[0].read_event(&mut fd_a, &fd_b.outbound_data.lock().unwrap().split_off(0)).is_err());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_filter_addresses(){
|
||||
// Tests the filter_addresses function.
|
||||
|
||||
// For (10/8)
|
||||
let ip_address = NetAddress::IPv4{addr: [10, 0, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [10, 0, 255, 201], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [10, 255, 255, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
|
||||
// For (0/8)
|
||||
let ip_address = NetAddress::IPv4{addr: [0, 0, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [0, 0, 255, 187], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [0, 255, 255, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
|
||||
// For (100.64/10)
|
||||
let ip_address = NetAddress::IPv4{addr: [100, 64, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [100, 78, 255, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [100, 127, 255, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
|
||||
// For (127/8)
|
||||
let ip_address = NetAddress::IPv4{addr: [127, 0, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [127, 65, 73, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [127, 255, 255, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
|
||||
// For (169.254/16)
|
||||
let ip_address = NetAddress::IPv4{addr: [169, 254, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [169, 254, 221, 101], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [169, 254, 255, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
|
||||
// For (172.16/12)
|
||||
let ip_address = NetAddress::IPv4{addr: [172, 16, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [172, 27, 101, 23], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [172, 31, 255, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
|
||||
// For (192.168/16)
|
||||
let ip_address = NetAddress::IPv4{addr: [192, 168, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [192, 168, 205, 159], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [192, 168, 255, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
|
||||
// For (192.88.99/24)
|
||||
let ip_address = NetAddress::IPv4{addr: [192, 88, 99, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [192, 88, 99, 140], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv4{addr: [192, 88, 99, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
|
||||
// For other IPv4 addresses
|
||||
let ip_address = NetAddress::IPv4{addr: [188, 255, 99, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), Some(ip_address.clone()));
|
||||
let ip_address = NetAddress::IPv4{addr: [123, 8, 129, 14], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), Some(ip_address.clone()));
|
||||
let ip_address = NetAddress::IPv4{addr: [2, 88, 9, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), Some(ip_address.clone()));
|
||||
|
||||
// For (2000::/3)
|
||||
let ip_address = NetAddress::IPv6{addr: [32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), Some(ip_address.clone()));
|
||||
let ip_address = NetAddress::IPv6{addr: [45, 34, 209, 190, 0, 123, 55, 34, 0, 0, 3, 27, 201, 0, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), Some(ip_address.clone()));
|
||||
let ip_address = NetAddress::IPv6{addr: [63, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), Some(ip_address.clone()));
|
||||
|
||||
// For other IPv6 addresses
|
||||
let ip_address = NetAddress::IPv6{addr: [24, 240, 12, 32, 0, 0, 0, 0, 20, 97, 0, 32, 121, 254, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv6{addr: [68, 23, 56, 63, 0, 0, 2, 7, 75, 109, 0, 39, 0, 0, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
let ip_address = NetAddress::IPv6{addr: [101, 38, 140, 230, 100, 0, 30, 98, 0, 26, 0, 0, 57, 96, 0, 0], port: 1000};
|
||||
assert_eq!(filter_addresses(Some(ip_address.clone())), None);
|
||||
|
||||
// For (None)
|
||||
assert_eq!(filter_addresses(None), None);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -132,8 +132,8 @@ fn test_priv_forwarding_rejection() {
|
|||
check_added_monitors!(nodes[1], 2);
|
||||
nodes[1].node = &nodes_1_deserialized;
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let as_reestablish = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
let bs_reestablish = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_reestablish);
|
||||
|
@ -141,8 +141,8 @@ fn test_priv_forwarding_rejection() {
|
|||
get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
|
||||
get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.peer_connected(&nodes[2].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known() });
|
||||
nodes[2].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[2].node.get_our_node_id(), &msgs::Init { features: InitFeatures::known(), remote_network_address: None });
|
||||
nodes[2].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let bs_reestablish = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[2].node.get_our_node_id());
|
||||
let cs_reestablish = get_event_msg!(nodes[2], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
nodes[2].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
|
||||
|
|
|
@ -245,9 +245,9 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let node_0_reestablish = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let node_1_reestablish = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
|
||||
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &node_0_reestablish);
|
||||
|
@ -305,9 +305,9 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
|
|||
nodes[0].node.peer_disconnected(&nodes[1].node.get_our_node_id(), false);
|
||||
nodes[1].node.peer_disconnected(&nodes[0].node.get_our_node_id(), false);
|
||||
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[1].node.peer_connected(&nodes[0].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
let node_1_2nd_reestablish = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty() });
|
||||
nodes[0].node.peer_connected(&nodes[1].node.get_our_node_id(), &msgs::Init { features: InitFeatures::empty(), remote_network_address: None });
|
||||
if recv_count == 0 {
|
||||
// If all closing_signeds weren't delivered we can just resume where we left off...
|
||||
let node_0_2nd_reestablish = get_event_msg!(nodes[0], MessageSendEvent::SendChannelReestablish, nodes[1].node.get_our_node_id());
|
||||
|
|
|
@ -505,7 +505,7 @@ mod tests {
|
|||
let mut reader = io::Cursor::new(buffer);
|
||||
let decoded_msg = read(&mut reader, &IgnoringMessageHandler{}).unwrap();
|
||||
match decoded_msg {
|
||||
Message::Init(msgs::Init { features }) => {
|
||||
Message::Init(msgs::Init { features, .. }) => {
|
||||
assert!(features.supports_variable_length_onion());
|
||||
assert!(features.supports_upfront_shutdown_script());
|
||||
assert!(features.supports_gossip_queries());
|
||||
|
|
|
@ -2284,7 +2284,7 @@ mod tests {
|
|||
|
||||
// It should ignore if gossip_queries feature is not enabled
|
||||
{
|
||||
let init_msg = Init { features: InitFeatures::known().clear_gossip_queries() };
|
||||
let init_msg = Init { features: InitFeatures::known().clear_gossip_queries(), remote_network_address: None };
|
||||
net_graph_msg_handler.peer_connected(&node_id_1, &init_msg);
|
||||
let events = net_graph_msg_handler.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 0);
|
||||
|
@ -2292,7 +2292,7 @@ mod tests {
|
|||
|
||||
// It should send a query_channel_message with the correct information
|
||||
{
|
||||
let init_msg = Init { features: InitFeatures::known() };
|
||||
let init_msg = Init { features: InitFeatures::known(), remote_network_address: None };
|
||||
net_graph_msg_handler.peer_connected(&node_id_1, &init_msg);
|
||||
let events = net_graph_msg_handler.get_and_clear_pending_msg_events();
|
||||
assert_eq!(events.len(), 2);
|
||||
|
@ -2322,7 +2322,7 @@ mod tests {
|
|||
{
|
||||
let network_graph = create_network_graph();
|
||||
let (secp_ctx, net_graph_msg_handler) = create_net_graph_msg_handler(&network_graph);
|
||||
let init_msg = Init { features: InitFeatures::known() };
|
||||
let init_msg = Init { features: InitFeatures::known(), remote_network_address: None };
|
||||
for n in 1..7 {
|
||||
let node_privkey = &SecretKey::from_slice(&[n; 32]).unwrap();
|
||||
let node_id = PublicKey::from_secret_key(&secp_ctx, node_privkey);
|
||||
|
|
Loading…
Add table
Reference in a new issue