Skip to content

Commit 0795b34

Browse files
committed
Fail payments backwards in delayed processing as well
1 parent 729f02d commit 0795b34

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

src/ln/channelmanager.rs

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ enum HTLCFailReason<'a> {
7878
},
7979
Reason {
8080
failure_code: u16,
81+
data: &'a[u8],
8182
}
8283
}
8384

@@ -571,6 +572,7 @@ impl ChannelManager {
571572

572573
pub fn process_pending_htlc_forward(&self) {
573574
let mut new_events = Vec::new();
575+
let mut failed_forwards = Vec::new();
574576
{
575577
let mut channel_state_lock = self.channel_state.lock().unwrap();
576578
let channel_state = channel_state_lock.borrow_parts();
@@ -584,6 +586,10 @@ impl ChannelManager {
584586
let forward_chan_id = match channel_state.short_to_id.get(&short_chan_id) {
585587
Some(chan_id) => chan_id.clone(),
586588
None => {
589+
failed_forwards.reserve(pending_forwards.len());
590+
for forward_info in pending_forwards {
591+
failed_forwards.push((forward_info.payment_hash, 0x4000 | 10, None));
592+
}
587593
// TODO: Send a failure packet back on each pending_forward
588594
continue;
589595
}
@@ -594,7 +600,8 @@ impl ChannelManager {
594600
for forward_info in pending_forwards {
595601
match forward_chan.send_htlc(forward_info.amt_to_forward, forward_info.payment_hash, forward_info.outgoing_cltv_value, forward_info.onion_packet.unwrap()) {
596602
Err(_e) => {
597-
// TODO: Send a failure packet back
603+
let chan_update = self.get_channel_update(forward_chan).unwrap();
604+
failed_forwards.push((forward_info.payment_hash, 0x4000 | 7, Some(chan_update)));
598605
continue;
599606
},
600607
Ok(update_add) => {
@@ -639,6 +646,13 @@ impl ChannelManager {
639646
}
640647
}
641648

649+
for failed_forward in failed_forwards.drain(..) {
650+
match failed_forward.2 {
651+
None => self.fail_htlc_backwards_internal(self.channel_state.lock().unwrap(), &failed_forward.0, HTLCFailReason::Reason { failure_code: failed_forward.1, data: &[0;0] }),
652+
Some(chan_update) => self.fail_htlc_backwards_internal(self.channel_state.lock().unwrap(), &failed_forward.0, HTLCFailReason::Reason { failure_code: failed_forward.1, data: &chan_update.encode()[..] }),
653+
};
654+
}
655+
642656
if new_events.is_empty() { return }
643657

644658
let mut events = self.pending_events.lock().unwrap();
@@ -650,7 +664,7 @@ impl ChannelManager {
650664

651665
/// Indicates that the preimage for payment_hash is unknown after a PaymentReceived event.
652666
pub fn fail_htlc_backwards(&self, payment_hash: &[u8; 32]) -> bool {
653-
self.fail_htlc_backwards_internal(self.channel_state.lock().unwrap(), payment_hash, HTLCFailReason::Reason { failure_code: 0x4000 | 15 })
667+
self.fail_htlc_backwards_internal(self.channel_state.lock().unwrap(), payment_hash, HTLCFailReason::Reason { failure_code: 0x4000 | 15, data: &[0;0] })
654668
}
655669

656670
fn fail_htlc_backwards_internal(&self, mut channel_state: MutexGuard<ChannelHolder>, payment_hash: &[u8; 32], onion_error: HTLCFailReason) -> bool {
@@ -681,8 +695,8 @@ impl ChannelManager {
681695
},
682696
PendingOutboundHTLC::IntermediaryHopData { source_short_channel_id, incoming_packet_shared_secret } => {
683697
let err_packet = match onion_error {
684-
HTLCFailReason::Reason { failure_code } => {
685-
let packet = ChannelManager::build_failure_packet(&incoming_packet_shared_secret, failure_code, &[0; 0]).encode();
698+
HTLCFailReason::Reason { failure_code, data } => {
699+
let packet = ChannelManager::build_failure_packet(&incoming_packet_shared_secret, failure_code, data).encode();
686700
ChannelManager::encrypt_failure_packet(&incoming_packet_shared_secret, &packet)
687701
},
688702
HTLCFailReason::ErrorPacket { err } => {
@@ -1244,7 +1258,7 @@ impl ChannelMessageHandler for ChannelManager {
12441258
},
12451259
None => return Err(HandleError{err: "Failed to find corresponding channel", msg: None})
12461260
}
1247-
self.fail_htlc_backwards_internal(channel_state, &res.0, HTLCFailReason::Reason { failure_code: msg.failure_code });
1261+
self.fail_htlc_backwards_internal(channel_state, &res.0, HTLCFailReason::Reason { failure_code: msg.failure_code, data: &[0;0] });
12481262
Ok(res.1)
12491263
}
12501264

0 commit comments

Comments
 (0)