@@ -479,6 +479,13 @@ pub(crate) const MIN_AFFORDABLE_HTLC_COUNT: usize = 4;
479
479
/// * `EXPIRE_PREV_CONFIG_TICKS` = convergence_delay / tick_interval
480
480
pub ( crate ) const EXPIRE_PREV_CONFIG_TICKS : usize = 5 ;
481
481
482
+ /// The number of ticks that may elapse while we're waiting for a response to a
483
+ /// [`msgs::RevokeAndACK`] or [`msgs::ChannelReestablish`] message before we attempt to disconnect
484
+ /// them.
485
+ ///
486
+ /// See [`Channel::sent_message_awaiting_response`] for more information.
487
+ pub ( crate ) const DISCONNECT_PEER_AWAITING_RESPONSE_TICKS : usize = 2 ;
488
+
482
489
struct PendingChannelMonitorUpdate {
483
490
update : ChannelMonitorUpdate ,
484
491
/// In some cases we need to delay letting the [`ChannelMonitorUpdate`] go until after an
@@ -715,6 +722,19 @@ pub(super) struct Channel<Signer: ChannelSigner> {
715
722
/// See-also <https://github.com/lightningnetwork/lnd/issues/4006>
716
723
pub workaround_lnd_bug_4006 : Option < msgs:: ChannelReady > ,
717
724
725
+ /// An option set when we wish to track how many ticks have elapsed while waiting for a response
726
+ /// from our counterparty after sending a message. If the peer has yet to respond after reaching
727
+ /// `DISCONNECT_PEER_AWAITING_RESPONSE_TICKS`, a reconnection should be attempted to try to
728
+ /// unblock the state machine.
729
+ ///
730
+ /// This behavior is mostly motivated by a lnd bug in which we don't receive a message we expect
731
+ /// to in a timely manner, which may lead to channels becoming unusable and/or force-closed. An
732
+ /// example of such can be found at <https://github.com/lightningnetwork/lnd/issues/7682>.
733
+ ///
734
+ /// This is currently only used when waiting for a [`msgs::ChannelReestablish`] or
735
+ /// [`msgs::RevokeAndACK`] message from the counterparty.
736
+ sent_message_awaiting_response : Option < usize > ,
737
+
718
738
#[ cfg( any( test, fuzzing) ) ]
719
739
// When we receive an HTLC fulfill on an outbound path, we may immediately fulfill the
720
740
// corresponding HTLC on the inbound path. If, then, the outbound path channel is
@@ -1130,6 +1150,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
1130
1150
next_remote_commitment_tx_fee_info_cached : Mutex :: new ( None ) ,
1131
1151
1132
1152
workaround_lnd_bug_4006 : None ,
1153
+ sent_message_awaiting_response : None ,
1133
1154
1134
1155
latest_inbound_scid_alias : None ,
1135
1156
outbound_scid_alias,
@@ -1489,6 +1510,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
1489
1510
next_remote_commitment_tx_fee_info_cached : Mutex :: new ( None ) ,
1490
1511
1491
1512
workaround_lnd_bug_4006 : None ,
1513
+ sent_message_awaiting_response : None ,
1492
1514
1493
1515
latest_inbound_scid_alias : None ,
1494
1516
outbound_scid_alias,
@@ -3526,6 +3548,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
3526
3548
// OK, we step the channel here and *then* if the new generation fails we can fail the
3527
3549
// channel based on that, but stepping stuff here should be safe either way.
3528
3550
self . channel_state &= !( ChannelState :: AwaitingRemoteRevoke as u32 ) ;
3551
+ self . sent_message_awaiting_response = None ;
3529
3552
self . counterparty_prev_commitment_point = self . counterparty_cur_commitment_point ;
3530
3553
self . counterparty_cur_commitment_point = Some ( msg. next_per_commitment_point ) ;
3531
3554
self . cur_counterparty_commitment_transaction_number -= 1 ;
@@ -3841,6 +3864,8 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
3841
3864
}
3842
3865
}
3843
3866
3867
+ self . sent_message_awaiting_response = None ;
3868
+
3844
3869
self . channel_state |= ChannelState :: PeerDisconnected as u32 ;
3845
3870
log_trace ! ( logger, "Peer disconnection resulted in {} remote-announced HTLC drops on channel {}" , inbound_drop_count, log_bytes!( self . channel_id( ) ) ) ;
3846
3871
}
@@ -3943,6 +3968,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
3943
3968
Some ( self . get_last_revoke_and_ack ( ) )
3944
3969
} else { None } ;
3945
3970
let commitment_update = if self . monitor_pending_commitment_signed {
3971
+ self . mark_awaiting_response ( ) ;
3946
3972
Some ( self . get_last_commitment_update ( logger) )
3947
3973
} else { None } ;
3948
3974
@@ -4132,6 +4158,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
4132
4158
// Go ahead and unmark PeerDisconnected as various calls we may make check for it (and all
4133
4159
// remaining cases either succeed or ErrorMessage-fail).
4134
4160
self . channel_state &= !( ChannelState :: PeerDisconnected as u32 ) ;
4161
+ self . sent_message_awaiting_response = None ;
4135
4162
4136
4163
let shutdown_msg = if self . channel_state & ( ChannelState :: LocalShutdownSent as u32 ) != 0 {
4137
4164
assert ! ( self . shutdown_scriptpubkey. is_some( ) ) ;
@@ -4192,7 +4219,11 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
4192
4219
// revoke_and_ack, not on sending commitment_signed, so we add one if have
4193
4220
// AwaitingRemoteRevoke set, which indicates we sent a commitment_signed but haven't gotten
4194
4221
// the corresponding revoke_and_ack back yet.
4195
- let next_counterparty_commitment_number = INITIAL_COMMITMENT_NUMBER - self . cur_counterparty_commitment_transaction_number + if ( self . channel_state & ChannelState :: AwaitingRemoteRevoke as u32 ) != 0 { 1 } else { 0 } ;
4222
+ let is_awaiting_remote_revoke = self . channel_state & ChannelState :: AwaitingRemoteRevoke as u32 != 0 ;
4223
+ if is_awaiting_remote_revoke && !self . is_awaiting_monitor_update ( ) {
4224
+ self . mark_awaiting_response ( ) ;
4225
+ }
4226
+ let next_counterparty_commitment_number = INITIAL_COMMITMENT_NUMBER - self . cur_counterparty_commitment_transaction_number + if is_awaiting_remote_revoke { 1 } else { 0 } ;
4196
4227
4197
4228
let channel_ready = if msg. next_local_commitment_number == 1 && INITIAL_COMMITMENT_NUMBER - self . cur_holder_commitment_transaction_number == 1 {
4198
4229
// We should never have to worry about MonitorUpdateInProgress resending ChannelReady
@@ -4361,6 +4392,28 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
4361
4392
} ) , None ) )
4362
4393
}
4363
4394
4395
+ // Marks a channel as waiting for a response from the counterparty. If it's not received
4396
+ // [`DISCONNECT_PEER_AWAITING_RESPONSE_TICKS`] after sending our own to them, then we'll attempt
4397
+ // a reconnection.
4398
+ fn mark_awaiting_response ( & mut self ) {
4399
+ self . sent_message_awaiting_response = Some ( 0 ) ;
4400
+ }
4401
+
4402
+ /// Determines whether we should disconnect the counterparty due to not receiving a response
4403
+ /// within our expected timeframe.
4404
+ ///
4405
+ /// This should be called on every [`super::channelmanager::ChannelManager::timer_tick_occurred`].
4406
+ pub fn should_disconnect_peer_awaiting_response ( & mut self ) -> bool {
4407
+ let ticks_elapsed = if let Some ( ticks_elapsed) = self . sent_message_awaiting_response . as_mut ( ) {
4408
+ ticks_elapsed
4409
+ } else {
4410
+ // Don't disconnect when we're not waiting on a response.
4411
+ return false ;
4412
+ } ;
4413
+ * ticks_elapsed += 1 ;
4414
+ * ticks_elapsed >= DISCONNECT_PEER_AWAITING_RESPONSE_TICKS
4415
+ }
4416
+
4364
4417
pub fn shutdown < SP : Deref > (
4365
4418
& mut self , signer_provider : & SP , their_features : & InitFeatures , msg : & msgs:: Shutdown
4366
4419
) -> Result < ( Option < msgs:: Shutdown > , Option < & ChannelMonitorUpdate > , Vec < ( HTLCSource , PaymentHash ) > ) , ChannelError >
@@ -5733,7 +5786,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
5733
5786
5734
5787
/// May panic if called on a channel that wasn't immediately-previously
5735
5788
/// self.remove_uncommitted_htlcs_and_mark_paused()'d
5736
- pub fn get_channel_reestablish < L : Deref > ( & self , logger : & L ) -> msgs:: ChannelReestablish where L :: Target : Logger {
5789
+ pub fn get_channel_reestablish < L : Deref > ( & mut self , logger : & L ) -> msgs:: ChannelReestablish where L :: Target : Logger {
5737
5790
assert_eq ! ( self . channel_state & ChannelState :: PeerDisconnected as u32 , ChannelState :: PeerDisconnected as u32 ) ;
5738
5791
assert_ne ! ( self . cur_counterparty_commitment_transaction_number, INITIAL_COMMITMENT_NUMBER ) ;
5739
5792
// Prior to static_remotekey, my_current_per_commitment_point was critical to claiming
@@ -5752,6 +5805,7 @@ impl<Signer: WriteableEcdsaChannelSigner> Channel<Signer> {
5752
5805
log_info ! ( logger, "Sending a data_loss_protect with no previous remote per_commitment_secret for channel {}" , log_bytes!( self . channel_id( ) ) ) ;
5753
5806
[ 0 ; 32 ]
5754
5807
} ;
5808
+ self . mark_awaiting_response ( ) ;
5755
5809
msgs:: ChannelReestablish {
5756
5810
channel_id : self . channel_id ( ) ,
5757
5811
// The protocol has two different commitment number concepts - the "commitment
@@ -7090,6 +7144,7 @@ impl<'a, 'b, 'c, ES: Deref, SP: Deref> ReadableArgs<(&'a ES, &'b SP, u32, &'c Ch
7090
7144
next_remote_commitment_tx_fee_info_cached : Mutex :: new ( None ) ,
7091
7145
7092
7146
workaround_lnd_bug_4006 : None ,
7147
+ sent_message_awaiting_response : None ,
7093
7148
7094
7149
latest_inbound_scid_alias,
7095
7150
// Later in the ChannelManager deserialization phase we scan for channels and assign scid aliases if its missing
0 commit comments