Skip to content

Commit 109280a

Browse files
valentinewallaceAntoine Riard
and
Antoine Riard
committed
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 <[email protected]> Co-authored-by: Antoine Riard <[email protected]>
1 parent 318797b commit 109280a

File tree

6 files changed

+50
-0
lines changed

6 files changed

+50
-0
lines changed

lightning-net-tokio/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,7 @@ mod tests {
561561
fn handle_revoke_and_ack(&self, _their_node_id: &PublicKey, _msg: &RevokeAndACK) {}
562562
fn handle_update_fee(&self, _their_node_id: &PublicKey, _msg: &UpdateFee) {}
563563
fn handle_announcement_signatures(&self, _their_node_id: &PublicKey, _msg: &AnnouncementSignatures) {}
564+
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &ChannelUpdate) {}
564565
fn peer_disconnected(&self, their_node_id: &PublicKey, _no_connection_possible: bool) {
565566
if *their_node_id == self.expected_pubkey {
566567
self.disconnected_flag.store(true, Ordering::SeqCst);

lightning/src/ln/channel.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4126,6 +4126,20 @@ impl<Signer: Sign> Channel<Signer> {
41264126
}
41274127
}
41284128

4129+
pub fn channel_update(&mut self, msg: &msgs::ChannelUpdate) -> Result<(), ChannelError> {
4130+
let usable_channel_value_msat = (self.channel_value_satoshis - self.counterparty_selected_channel_reserve_satoshis) * 1000;
4131+
if msg.contents.htlc_minimum_msat > usable_channel_value_msat {
4132+
return Err(ChannelError::Close("Minimum htlc value is greater than channel value".to_string()));
4133+
}
4134+
self.counterparty_forwarding_info = Some(CounterpartyForwardingInfo {
4135+
fee_base_msat: msg.contents.fee_base_msat,
4136+
fee_proportional_millionths: msg.contents.fee_proportional_millionths,
4137+
cltv_expiry_delta: msg.contents.cltv_expiry_delta
4138+
});
4139+
4140+
Ok(())
4141+
}
4142+
41294143
/// Begins the shutdown process, getting a message for the remote peer and returning all
41304144
/// holding cell HTLCs for payment failure.
41314145
pub fn get_shutdown(&mut self) -> Result<(msgs::Shutdown, Vec<(HTLCSource, PaymentHash)>), APIError> {

lightning/src/ln/channelmanager.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2994,6 +2994,29 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
29942994
Ok(())
29952995
}
29962996

2997+
fn internal_channel_update(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelUpdate) -> Result<(), MsgHandleErrInternal> {
2998+
let mut channel_state_lock = self.channel_state.lock().unwrap();
2999+
let channel_state = &mut *channel_state_lock;
3000+
let chan_id = match channel_state.short_to_id.get(&msg.contents.short_channel_id) {
3001+
Some(chan_id) => chan_id.clone(),
3002+
None => {
3003+
// It's not a local channel
3004+
return Ok(())
3005+
}
3006+
};
3007+
match channel_state.by_id.entry(chan_id) {
3008+
hash_map::Entry::Occupied(mut chan) => {
3009+
if chan.get().get_counterparty_node_id() != *counterparty_node_id {
3010+
// TODO: see issue #153, need a consistent behavior on obnoxious behavior from random node
3011+
return Err(MsgHandleErrInternal::send_err_msg_no_close("Got a message for a channel from the wrong node!".to_owned(), chan_id));
3012+
}
3013+
try_chan_entry!(self, chan.get_mut().channel_update(&msg), channel_state, chan);
3014+
},
3015+
hash_map::Entry::Vacant(_) => unreachable!()
3016+
}
3017+
Ok(())
3018+
}
3019+
29973020
fn internal_channel_reestablish(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReestablish) -> Result<(), MsgHandleErrInternal> {
29983021
let mut channel_state_lock = self.channel_state.lock().unwrap();
29993022
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
35173540
let _ = handle_error!(self, self.internal_announcement_signatures(counterparty_node_id, msg), *counterparty_node_id);
35183541
}
35193542

3543+
fn handle_channel_update(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelUpdate) {
3544+
let _persistence_guard = PersistenceNotifierGuard::new(&self.total_consistency_lock, &self.persistence_notifier);
3545+
let _ = handle_error!(self, self.internal_channel_update(counterparty_node_id, msg), *counterparty_node_id);
3546+
}
3547+
35203548
fn handle_channel_reestablish(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReestablish) {
35213549
let _persistence_guard = PersistenceNotifierGuard::new(&self.total_consistency_lock, &self.persistence_notifier);
35223550
let _ = handle_error!(self, self.internal_channel_reestablish(counterparty_node_id, msg), *counterparty_node_id);

lightning/src/ln/msgs.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,9 @@ pub trait ChannelMessageHandler : MessageSendEventsProvider + Send + Sync {
789789
/// Handle an incoming channel_reestablish message from the given peer.
790790
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &ChannelReestablish);
791791

792+
/// Handle an incoming channel update from the given peer.
793+
fn handle_channel_update(&self, their_node_id: &PublicKey, msg: &ChannelUpdate);
794+
792795
// Error:
793796
/// Handle an incoming error message from the given peer.
794797
fn handle_error(&self, their_node_id: &PublicKey, msg: &ErrorMessage);

lightning/src/ln/peer_handler.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ impl ChannelMessageHandler for ErroringMessageHandler {
142142
fn handle_channel_reestablish(&self, their_node_id: &PublicKey, msg: &msgs::ChannelReestablish) {
143143
ErroringMessageHandler::push_error(self, their_node_id, msg.channel_id);
144144
}
145+
// msgs::ChannelUpdate do not contain the channel_id field, so we just drop them.
146+
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelUpdate) {}
145147
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}
146148
fn peer_connected(&self, _their_node_id: &PublicKey, _msg: &msgs::Init) {}
147149
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
970972
}
971973
},
972974
wire::Message::ChannelUpdate(msg) => {
975+
self.message_handler.chan_handler.handle_channel_update(&peer.their_node_id.unwrap(), &msg);
973976
let should_forward = match self.message_handler.route_handler.handle_channel_update(&msg) {
974977
Ok(v) => v,
975978
Err(e) => { return Err(e.into()); },

lightning/src/util/test_utils.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ impl msgs::ChannelMessageHandler for TestChannelMessageHandler {
231231
fn handle_commitment_signed(&self, _their_node_id: &PublicKey, _msg: &msgs::CommitmentSigned) {}
232232
fn handle_revoke_and_ack(&self, _their_node_id: &PublicKey, _msg: &msgs::RevokeAndACK) {}
233233
fn handle_update_fee(&self, _their_node_id: &PublicKey, _msg: &msgs::UpdateFee) {}
234+
fn handle_channel_update(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelUpdate) {}
234235
fn handle_announcement_signatures(&self, _their_node_id: &PublicKey, _msg: &msgs::AnnouncementSignatures) {}
235236
fn handle_channel_reestablish(&self, _their_node_id: &PublicKey, _msg: &msgs::ChannelReestablish) {}
236237
fn peer_disconnected(&self, _their_node_id: &PublicKey, _no_connection_possible: bool) {}

0 commit comments

Comments
 (0)