mirror of
https://github.com/lightningdevkit/rust-lightning.git
synced 2025-01-19 05:43:55 +01:00
Pass channel updates to ChannelManager and Channel.
This will be used to expose forwarding info for route hints in the next commit. Co-authored-by: Valentine Wallace <vwallace@protonmail.com> Co-authored-by: Antoine Riard <ariard@student.42.fr>
This commit is contained in:
parent
5b28744755
commit
e8a0824dd4
@ -561,6 +561,7 @@ mod tests {
|
||||
fn handle_revoke_and_ack(&self, _their_node_id: &PublicKey, _msg: &RevokeAndACK) {}
|
||||
fn handle_update_fee(&self, _their_node_id: &PublicKey, _msg: &UpdateFee) {}
|
||||
fn handle_announcement_signatures(&self, _their_node_id: &PublicKey, _msg: &AnnouncementSignatures) {}
|
||||
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &ChannelUpdate) {}
|
||||
fn peer_disconnected(&self, their_node_id: &PublicKey, _no_connection_possible: bool) {
|
||||
if *their_node_id == self.expected_pubkey {
|
||||
self.disconnected_flag.store(true, Ordering::SeqCst);
|
||||
|
@ -4132,6 +4132,20 @@ impl<Signer: Sign> Channel<Signer> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn channel_update(&mut self, msg: &msgs::ChannelUpdate) -> Result<(), ChannelError> {
|
||||
let usable_channel_value_msat = (self.channel_value_satoshis - self.counterparty_selected_channel_reserve_satoshis) * 1000;
|
||||
if msg.contents.htlc_minimum_msat >= usable_channel_value_msat {
|
||||
return Err(ChannelError::Close("Minimum htlc value is greater than channel value".to_string()));
|
||||
}
|
||||
self.counterparty_forwarding_info = Some(CounterpartyForwardingInfo {
|
||||
fee_base_msat: msg.contents.fee_base_msat,
|
||||
fee_proportional_millionths: msg.contents.fee_proportional_millionths,
|
||||
cltv_expiry_delta: msg.contents.cltv_expiry_delta
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Begins the shutdown process, getting a message for the remote peer and returning all
|
||||
/// holding cell HTLCs for payment failure.
|
||||
pub fn get_shutdown(&mut self) -> Result<(msgs::Shutdown, Vec<(HTLCSource, PaymentHash)>), APIError> {
|
||||
|
@ -2994,6 +2994,29 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn internal_channel_update(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelUpdate) -> Result<(), MsgHandleErrInternal> {
|
||||
let mut channel_state_lock = self.channel_state.lock().unwrap();
|
||||
let channel_state = &mut *channel_state_lock;
|
||||
let chan_id = match channel_state.short_to_id.get(&msg.contents.short_channel_id) {
|
||||
Some(chan_id) => chan_id.clone(),
|
||||
None => {
|
||||
// It's not a local channel
|
||||
return Ok(())
|
||||
}
|
||||
};
|
||||
match channel_state.by_id.entry(chan_id) {
|
||||
hash_map::Entry::Occupied(mut chan) => {
|
||||
if chan.get().get_counterparty_node_id() != *counterparty_node_id {
|
||||
// TODO: see issue #153, need a consistent behavior on obnoxious behavior from random node
|
||||
return Err(MsgHandleErrInternal::send_err_msg_no_close("Got a message for a channel from the wrong node!".to_owned(), chan_id));
|
||||
}
|
||||
try_chan_entry!(self, chan.get_mut().channel_update(&msg), channel_state, chan);
|
||||
},
|
||||
hash_map::Entry::Vacant(_) => unreachable!()
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn internal_channel_reestablish(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReestablish) -> Result<(), MsgHandleErrInternal> {
|
||||
let mut channel_state_lock = self.channel_state.lock().unwrap();
|
||||
let channel_state = &mut *channel_state_lock;
|
||||
@ -3517,6 +3540,11 @@ impl<Signer: Sign, M: Deref + Sync + Send, T: Deref + Sync + Send, K: Deref + Sy
|
||||
let _ = handle_error!(self, self.internal_announcement_signatures(counterparty_node_id, msg), *counterparty_node_id);
|
||||
}
|
||||
|
||||
fn handle_channel_update(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelUpdate) {
|
||||
let _persistence_guard = PersistenceNotifierGuard::new(&self.total_consistency_lock, &self.persistence_notifier);
|
||||
let _ = handle_error!(self, self.internal_channel_update(counterparty_node_id, msg), *counterparty_node_id);
|
||||
}
|
||||
|
||||
fn handle_channel_reestablish(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReestablish) {
|
||||
let _persistence_guard = PersistenceNotifierGuard::new(&self.total_consistency_lock, &self.persistence_notifier);
|
||||
let _ = handle_error!(self, self.internal_channel_reestablish(counterparty_node_id, msg), *counterparty_node_id);
|
||||
|
@ -796,6 +796,9 @@ pub trait ChannelMessageHandler : MessageSendEventsProvider + Send + Sync {
|
||||
/// Handle an incoming channel_reestablish message from the given peer.
|
||||
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &ChannelReestablish);
|
||||
|
||||
/// Handle an incoming channel update from the given peer.
|
||||
fn handle_channel_update(&self, their_node_id: &PublicKey, msg: &ChannelUpdate);
|
||||
|
||||
// Error:
|
||||
/// Handle an incoming error message from the given peer.
|
||||
fn handle_error(&self, their_node_id: &PublicKey, msg: &ErrorMessage);
|
||||
|
@ -142,6 +142,8 @@ impl ChannelMessageHandler for ErroringMessageHandler {
|
||||
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &msgs::ChannelReestablish) {
|
||||
ErroringMessageHandler::push_error(self, their_node_id, msg.channel_id);
|
||||
}
|
||||
// msgs::ChannelUpdate does not contain the channel_id field, so we just drop them.
|
||||
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelUpdate) {}
|
||||
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
|
||||
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
|
||||
fn handle_error(&self, _their_node_id: &PublicKey, _msg: &msgs::ErrorMessage) {}
|
||||
@ -970,6 +972,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
|
||||
}
|
||||
},
|
||||
wire::Message::ChannelUpdate(msg) => {
|
||||
self.message_handler.chan_handler.handle_channel_update(&peer.their_node_id.unwrap(), &msg);
|
||||
let should_forward = match self.message_handler.route_handler.handle_channel_update(&msg) {
|
||||
Ok(v) => v,
|
||||
Err(e) => { return Err(e.into()); },
|
||||
|
@ -231,6 +231,7 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
|
||||
fn handle_commitment_signed(&self, _their_node_id: &PublicKey, _msg: &msgs::CommitmentSigned) {}
|
||||
fn handle_revoke_and_ack(&self, _their_node_id: &PublicKey, _msg: &msgs::RevokeAndACK) {}
|
||||
fn handle_update_fee(&self, _their_node_id: &PublicKey, _msg: &msgs::UpdateFee) {}
|
||||
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelUpdate) {}
|
||||
fn handle_announcement_signatures(&self, _their_node_id: &PublicKey, _msg: &msgs::AnnouncementSignatures) {}
|
||||
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelReestablish) {}
|
||||
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
|
||||
|
Loading…
Reference in New Issue
Block a user