Skip to content

Commit fda1096

Browse files
committed
Handle-initial_routing_sync-requests-from-peers-in-their-Init-messages
1 parent 74f59a2 commit fda1096

File tree

4 files changed

+232
-45
lines changed

4 files changed

+232
-45
lines changed

src/ln/msgs.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ pub struct AnnouncementSignatures {
334334
}
335335

336336
/// An address which can be used to connect to a remote peer
337-
#[derive(Clone)]
337+
#[derive(Clone, PartialEq)]
338338
pub enum NetAddress {
339339
/// An IPv4 address/port on which the peer is listenting.
340340
IPv4 {
@@ -381,7 +381,7 @@ impl NetAddress {
381381
}
382382
}
383383
}
384-
384+
#[derive(Clone, PartialEq)]
385385
// Only exposed as broadcast of node_announcement should be filtered by node_id
386386
/// The unsigned part of a node_announcement
387387
pub struct UnsignedNodeAnnouncement {
@@ -398,6 +398,7 @@ pub struct UnsignedNodeAnnouncement {
398398
pub(crate) excess_address_data: Vec<u8>,
399399
pub(crate) excess_data: Vec<u8>,
400400
}
401+
#[derive(Clone, PartialEq)]
401402
/// A node_announcement message to be sent or received from a peer
402403
pub struct NodeAnnouncement {
403404
pub(crate) signature: Signature,
@@ -574,6 +575,18 @@ pub trait ChannelMessageHandler : events::MessageSendEventsProvider + Send + Syn
574575
/// Handle an incoming error message from the given peer.
575576
fn handle_error(&self, their_node_id: &PublicKey, msg: &ErrorMessage);
576577
}
578+
#[derive(PartialEq)]
579+
///Enum used to keep track of syncing information/state of peer and if a sync is required
580+
pub enum InitSyncTracker{
581+
///This indicates if a sync is required or not, false is no sync required, true is sync required but not started
582+
Sync(bool),
583+
///This is the last synced node's public key
584+
///During this state it is syncing nodes
585+
NodeCounter(PublicKey),
586+
///This is the last synced channel _id
587+
///During this state it is syncing nodes
588+
ChannelCounter(u64),
589+
}
577590

578591
/// A trait to describe an object which can receive routing messages.
579592
pub trait RoutingMessageHandler : Send + Sync {
@@ -588,6 +601,12 @@ pub trait RoutingMessageHandler : Send + Sync {
588601
fn handle_channel_update(&self, msg: &ChannelUpdate) -> Result<bool, HandleError>;
589602
/// Handle some updates to the route graph that we learned due to an outbound failed payment.
590603
fn handle_htlc_fail_channel_update(&self, update: &HTLCFailChannelUpdate);
604+
///Gets a subset of the channel announcements and updates required to dump our routing table to a remote node, starting at the short_channel_id indicated by starting_point.channelcounter and including batch_amount entries
605+
/// This function will start iterating at 0 if the starting_point is < 0.
606+
fn get_next_channel_announcements(&self, starting_point: &mut InitSyncTracker, batch_amount: u8)->(Vec<(ChannelAnnouncement, ChannelUpdate,ChannelUpdate)>);
607+
///Gets a subset of the node announcements required to dump our routing table to a remote node, starting at the PublicKey indicated by starting_point.nodecounter and including batch_amount entries
608+
/// This function will start iterating at 0 if the starting_point is < 0.
609+
fn get_next_node_announcements(&self, starting_point: &mut InitSyncTracker, batch_amount: u8)->(Vec<NodeAnnouncement>);
591610
}
592611

593612
pub(crate) struct OnionRealm0HopData {

src/ln/peer_handler.rs

Lines changed: 72 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,24 @@ struct Peer {
102102
pending_read_buffer: Vec<u8>,
103103
pending_read_buffer_pos: usize,
104104
pending_read_is_header: bool,
105+
sync_status : msgs::InitSyncTracker,
106+
}
107+
108+
impl Peer {
109+
pub fn require_sync(&self)->bool{
110+
if let msgs::InitSyncTracker::Sync(i) = self.sync_status {i} else {false}
111+
}
112+
113+
/// this function checks if the the channel announcements and updates are allowed to be forwarded to a specific peer.
114+
/// If the peer is in syncing state and the channel_id has not been synced then the function returns false as this info will forward at a later stage and
115+
/// we dont want to send duplicate messages. If the channel was already synced then we can forward those messages and the function will then return true.
116+
pub fn is_channel_allowed_to_forward(&self, channel_id : u64)->bool{
117+
match self.sync_status {
118+
msgs::InitSyncTracker::Sync(i) => !i,
119+
msgs::InitSyncTracker::NodeCounter(_i) => false,
120+
msgs::InitSyncTracker::ChannelCounter(i) => (i < channel_id),
121+
}
122+
}
105123
}
106124

107125
struct PeerHolder<Descriptor: SocketDescriptor> {
@@ -221,6 +239,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
221239
pending_read_buffer: pending_read_buffer,
222240
pending_read_buffer_pos: 0,
223241
pending_read_is_header: false,
242+
sync_status : msgs::InitSyncTracker::Sync(false),
224243
}).is_some() {
225244
panic!("PeerManager driver duplicated descriptors!");
226245
};
@@ -255,22 +274,47 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
255274
pending_read_buffer: pending_read_buffer,
256275
pending_read_buffer_pos: 0,
257276
pending_read_is_header: false,
277+
sync_status : msgs::InitSyncTracker::Sync(false),
258278
}).is_some() {
259279
panic!("PeerManager driver duplicated descriptors!");
260280
};
261281
Ok(())
262282
}
263283

264-
fn do_attempt_write_data(descriptor: &mut Descriptor, peer: &mut Peer) {
284+
fn do_attempt_write_data(&self, descriptor: &mut Descriptor, peer: &mut Peer) {
285+
macro_rules! encode_and_send_msg {
286+
($msg: expr, $msg_code: expr) => {
287+
{
288+
log_trace!(self, "Encoding and sending message of type {} to {}", $msg_code, log_pubkey!(peer.their_node_id.unwrap()));
289+
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!($msg, $msg_code)[..]));
290+
}
291+
}
292+
}
265293
while !peer.awaiting_write_event {
266294
if {
295+
let should_be_reading = peer.pending_outbound_buffer.len() < 10;
296+
if (peer.require_sync()) &&(should_be_reading){
297+
match peer.sync_status{
298+
msgs::InitSyncTracker::ChannelCounter(_c) => {
299+
let all_messages_tuple = self.message_handler.route_handler.get_next_channel_announcements(&mut peer.sync_status,(10-peer.pending_outbound_buffer.len()) as u8);
300+
for tuple in all_messages_tuple.iter(){
301+
encode_and_send_msg!(tuple.0, 256);
302+
encode_and_send_msg!(tuple.1, 258);
303+
encode_and_send_msg!(tuple.2, 258);
304+
}
305+
},
306+
_=>{let all_messages = self.message_handler.route_handler.get_next_node_announcements(&mut peer.sync_status,(10-peer.pending_outbound_buffer.len()) as u8);
307+
for message in all_messages.iter(){
308+
encode_and_send_msg!(message, 256);
309+
}},
310+
};
311+
}
267312
let next_buff = match peer.pending_outbound_buffer.front() {
268313
None => return,
269314
Some(buff) => buff,
270315
};
271-
let should_be_reading = peer.pending_outbound_buffer.len() < 10;
272316

273-
let data_sent = descriptor.send_data(next_buff, peer.pending_outbound_buffer_first_msg_offset, should_be_reading);
317+
let data_sent = descriptor.send_data(&next_buff, peer.pending_outbound_buffer_first_msg_offset, should_be_reading);
274318
peer.pending_outbound_buffer_first_msg_offset += data_sent;
275319
if peer.pending_outbound_buffer_first_msg_offset == next_buff.len() { true } else { false }
276320
} {
@@ -297,7 +341,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
297341
None => panic!("Descriptor for write_event is not already known to PeerManager"),
298342
Some(peer) => {
299343
peer.awaiting_write_event = false;
300-
Self::do_attempt_write_data(descriptor, peer);
344+
self.do_attempt_write_data(descriptor, peer);
301345
}
302346
};
303347
Ok(())
@@ -522,6 +566,10 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
522566
if msg.local_features.supports_unknown_bits() { "present" } else { "none" },
523567
if msg.global_features.supports_unknown_bits() { "present" } else { "none" });
524568

569+
if msg.local_features.initial_routing_sync() {
570+
peer.sync_status = msgs::InitSyncTracker::Sync(true);
571+
peers.peers_needing_send.insert(peer_descriptor.clone());
572+
}
525573
peer.their_global_features = Some(msg.global_features);
526574
peer.their_local_features = Some(msg.local_features);
527575

@@ -531,6 +579,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
531579
self.initial_syncs_sent.fetch_add(1, Ordering::AcqRel);
532580
local_features.set_initial_routing_sync();
533581
}
582+
534583
encode_and_send_msg!(msgs::Init {
535584
global_features: msgs::GlobalFeatures::new(),
536585
local_features,
@@ -678,7 +727,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
678727
}
679728
}
680729

681-
Self::do_attempt_write_data(peer_descriptor, peer);
730+
self.do_attempt_write_data(peer_descriptor, peer);
682731

683732
peer.pending_outbound_buffer.len() > 10 // pause_read
684733
}
@@ -735,7 +784,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
735784
//TODO: Drop the pending channel? (or just let it timeout, but that sucks)
736785
});
737786
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 33)));
738-
Self::do_attempt_write_data(&mut descriptor, peer);
787+
self.do_attempt_write_data(&mut descriptor, peer);
739788
},
740789
MessageSendEvent::SendOpenChannel { ref node_id, ref msg } => {
741790
log_trace!(self, "Handling SendOpenChannel event in peer_handler for node {} for channel {}",
@@ -745,7 +794,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
745794
//TODO: Drop the pending channel? (or just let it timeout, but that sucks)
746795
});
747796
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 32)));
748-
Self::do_attempt_write_data(&mut descriptor, peer);
797+
self.do_attempt_write_data(&mut descriptor, peer);
749798
},
750799
MessageSendEvent::SendFundingCreated { ref node_id, ref msg } => {
751800
log_trace!(self, "Handling SendFundingCreated event in peer_handler for node {} for channel {} (which becomes {})",
@@ -757,7 +806,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
757806
//they should just throw away this funding transaction
758807
});
759808
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 34)));
760-
Self::do_attempt_write_data(&mut descriptor, peer);
809+
self.do_attempt_write_data(&mut descriptor, peer);
761810
},
762811
MessageSendEvent::SendFundingSigned { ref node_id, ref msg } => {
763812
log_trace!(self, "Handling SendFundingSigned event in peer_handler for node {} for channel {}",
@@ -768,7 +817,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
768817
//they should just throw away this funding transaction
769818
});
770819
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 35)));
771-
Self::do_attempt_write_data(&mut descriptor, peer);
820+
self.do_attempt_write_data(&mut descriptor, peer);
772821
},
773822
MessageSendEvent::SendFundingLocked { ref node_id, ref msg } => {
774823
log_trace!(self, "Handling SendFundingLocked event in peer_handler for node {} for channel {}",
@@ -778,7 +827,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
778827
//TODO: Do whatever we're gonna do for handling dropped messages
779828
});
780829
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 36)));
781-
Self::do_attempt_write_data(&mut descriptor, peer);
830+
self.do_attempt_write_data(&mut descriptor, peer);
782831
},
783832
MessageSendEvent::SendAnnouncementSignatures { ref node_id, ref msg } => {
784833
log_trace!(self, "Handling SendAnnouncementSignatures event in peer_handler for node {} for channel {})",
@@ -789,7 +838,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
789838
//they should just throw away this funding transaction
790839
});
791840
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 259)));
792-
Self::do_attempt_write_data(&mut descriptor, peer);
841+
self.do_attempt_write_data(&mut descriptor, peer);
793842
},
794843
MessageSendEvent::UpdateHTLCs { ref node_id, updates: msgs::CommitmentUpdate { ref update_add_htlcs, ref update_fulfill_htlcs, ref update_fail_htlcs, ref update_fail_malformed_htlcs, ref update_fee, ref commitment_signed } } => {
795844
log_trace!(self, "Handling UpdateHTLCs event in peer_handler for node {} with {} adds, {} fulfills, {} fails for channel {}",
@@ -817,7 +866,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
817866
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 134)));
818867
}
819868
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(commitment_signed, 132)));
820-
Self::do_attempt_write_data(&mut descriptor, peer);
869+
self.do_attempt_write_data(&mut descriptor, peer);
821870
},
822871
MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
823872
log_trace!(self, "Handling SendRevokeAndACK event in peer_handler for node {} for channel {}",
@@ -827,7 +876,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
827876
//TODO: Do whatever we're gonna do for handling dropped messages
828877
});
829878
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 133)));
830-
Self::do_attempt_write_data(&mut descriptor, peer);
879+
self.do_attempt_write_data(&mut descriptor, peer);
831880
},
832881
MessageSendEvent::SendClosingSigned { ref node_id, ref msg } => {
833882
log_trace!(self, "Handling SendClosingSigned event in peer_handler for node {} for channel {}",
@@ -837,7 +886,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
837886
//TODO: Do whatever we're gonna do for handling dropped messages
838887
});
839888
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 39)));
840-
Self::do_attempt_write_data(&mut descriptor, peer);
889+
self.do_attempt_write_data(&mut descriptor, peer);
841890
},
842891
MessageSendEvent::SendShutdown { ref node_id, ref msg } => {
843892
log_trace!(self, "Handling Shutdown event in peer_handler for node {} for channel {}",
@@ -847,7 +896,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
847896
//TODO: Do whatever we're gonna do for handling dropped messages
848897
});
849898
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 38)));
850-
Self::do_attempt_write_data(&mut descriptor, peer);
899+
self.do_attempt_write_data(&mut descriptor, peer);
851900
},
852901
MessageSendEvent::SendChannelReestablish { ref node_id, ref msg } => {
853902
log_trace!(self, "Handling SendChannelReestablish event in peer_handler for node {} for channel {}",
@@ -857,7 +906,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
857906
//TODO: Do whatever we're gonna do for handling dropped messages
858907
});
859908
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 136)));
860-
Self::do_attempt_write_data(&mut descriptor, peer);
909+
self.do_attempt_write_data(&mut descriptor, peer);
861910
},
862911
MessageSendEvent::BroadcastChannelAnnouncement { ref msg, ref update_msg } => {
863912
log_trace!(self, "Handling BroadcastChannelAnnouncement event in peer_handler for short channel id {}", msg.contents.short_channel_id);
@@ -866,7 +915,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
866915
let encoded_update_msg = encode_msg!(update_msg, 258);
867916

868917
for (ref descriptor, ref mut peer) in peers.peers.iter_mut() {
869-
if !peer.channel_encryptor.is_ready_for_encryption() || peer.their_global_features.is_none() {
918+
if !peer.channel_encryptor.is_ready_for_encryption() || peer.their_global_features.is_none() ||!peer.is_channel_allowed_to_forward(msg.contents.short_channel_id) {
870919
continue
871920
}
872921
match peer.their_node_id {
@@ -879,7 +928,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
879928
}
880929
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encoded_msg[..]));
881930
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encoded_update_msg[..]));
882-
Self::do_attempt_write_data(&mut (*descriptor).clone(), peer);
931+
self.do_attempt_write_data(&mut (*descriptor).clone(), peer);
883932
}
884933
}
885934
},
@@ -889,11 +938,11 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
889938
let encoded_msg = encode_msg!(msg, 258);
890939

891940
for (ref descriptor, ref mut peer) in peers.peers.iter_mut() {
892-
if !peer.channel_encryptor.is_ready_for_encryption() || peer.their_global_features.is_none() {
941+
if !peer.channel_encryptor.is_ready_for_encryption() || peer.their_global_features.is_none() || !peer.is_channel_allowed_to_forward(msg.contents.short_channel_id) {
893942
continue
894943
}
895944
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encoded_msg[..]));
896-
Self::do_attempt_write_data(&mut (*descriptor).clone(), peer);
945+
self.do_attempt_write_data(&mut (*descriptor).clone(), peer);
897946
}
898947
}
899948
},
@@ -914,7 +963,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
914963
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 17)));
915964
// This isn't guaranteed to work, but if there is enough free
916965
// room in the send buffer, put the error message there...
917-
Self::do_attempt_write_data(&mut descriptor, &mut peer);
966+
self.do_attempt_write_data(&mut descriptor, &mut peer);
918967
} else {
919968
log_trace!(self, "Handling DisconnectPeer HandleError event in peer_handler for node {} with no message", log_pubkey!(node_id));
920969
}
@@ -932,7 +981,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
932981
//TODO: Do whatever we're gonna do for handling dropped messages
933982
});
934983
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg, 17)));
935-
Self::do_attempt_write_data(&mut descriptor, peer);
984+
self.do_attempt_write_data(&mut descriptor, peer);
936985
},
937986
}
938987
} else {
@@ -944,7 +993,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
944993

945994
for mut descriptor in peers.peers_needing_send.drain() {
946995
match peers.peers.get_mut(&descriptor) {
947-
Some(peer) => Self::do_attempt_write_data(&mut descriptor, peer),
996+
Some(peer) => self.do_attempt_write_data(&mut descriptor, peer),
948997
None => panic!("Inconsistent peers set state!"),
949998
}
950999
}

0 commit comments

Comments
 (0)