@@ -8029,56 +8029,82 @@ where
8029
8029
&payment_hash,
8030
8030
onion_error
8031
8031
);
8032
- let failure = match blinded_failure {
8033
- Some(BlindedFailure::FromIntroductionNode) => {
8034
- let blinded_onion_error = HTLCFailReason::reason(
8035
- LocalHTLCFailureReason::InvalidOnionBlinding,
8036
- vec![0; 32],
8037
- );
8038
- let err_packet = blinded_onion_error.get_encrypted_failure_packet(
8039
- incoming_packet_shared_secret,
8040
- phantom_shared_secret,
8041
- );
8042
- HTLCForwardInfo::FailHTLC { htlc_id: *htlc_id, err_packet }
8043
- },
8044
- Some(BlindedFailure::FromBlindedNode) => HTLCForwardInfo::FailMalformedHTLC {
8045
- htlc_id: *htlc_id,
8046
- failure_code: LocalHTLCFailureReason::InvalidOnionBlinding.failure_code(),
8047
- sha256_of_onion: [0; 32],
8048
- },
8049
- None => {
8050
- let err_packet = onion_error.get_encrypted_failure_packet(
8051
- incoming_packet_shared_secret,
8052
- phantom_shared_secret,
8053
- );
8054
- HTLCForwardInfo::FailHTLC { htlc_id: *htlc_id, err_packet }
8055
- },
8056
- };
8057
-
8058
- let mut forward_htlcs = self.forward_htlcs.lock().unwrap();
8059
- match forward_htlcs.entry(*short_channel_id) {
8060
- hash_map::Entry::Occupied(mut entry) => {
8061
- entry.get_mut().push(failure);
8062
- },
8063
- hash_map::Entry::Vacant(entry) => {
8064
- entry.insert(vec![failure]);
8065
- },
8066
- }
8067
- mem::drop(forward_htlcs);
8068
- let mut pending_events = self.pending_events.lock().unwrap();
8069
- pending_events.push_back((
8070
- events::Event::HTLCHandlingFailed {
8071
- prev_channel_id: *channel_id,
8072
- failure_type,
8073
- failure_reason: Some(onion_error.into()),
8074
- },
8075
- None,
8076
- ));
8032
+ let htlc_failure_reason = self.get_htlc_failure_from_blinded_failure_forward(
8033
+ blinded_failure,
8034
+ onion_error,
8035
+ incoming_packet_shared_secret,
8036
+ phantom_shared_secret,
8037
+ htlc_id,
8038
+ );
8039
+ self.fail_htlc_backwards_from_forward(
8040
+ &onion_error,
8041
+ failure_type,
8042
+ short_channel_id,
8043
+ channel_id,
8044
+ htlc_failure_reason,
8045
+ );
8077
8046
},
8078
8047
HTLCSource::TrampolineForward { .. } => todo!(),
8079
8048
}
8080
8049
}
8081
8050
8051
+ fn get_htlc_failure_from_blinded_failure_forward(
8052
+ &self, blinded_failure: &Option<BlindedFailure>, onion_error: &HTLCFailReason,
8053
+ incoming_packet_shared_secret: &[u8; 32], secondary_shared_secret: &Option<[u8; 32]>,
8054
+ htlc_id: &u64,
8055
+ ) -> HTLCForwardInfo {
8056
+ match blinded_failure {
8057
+ Some(BlindedFailure::FromIntroductionNode) => {
8058
+ let blinded_onion_error = HTLCFailReason::reason(
8059
+ LocalHTLCFailureReason::InvalidOnionBlinding,
8060
+ vec![0; 32],
8061
+ );
8062
+ let err_packet = blinded_onion_error.get_encrypted_failure_packet(
8063
+ incoming_packet_shared_secret,
8064
+ secondary_shared_secret,
8065
+ );
8066
+ HTLCForwardInfo::FailHTLC { htlc_id: *htlc_id, err_packet }
8067
+ },
8068
+ Some(BlindedFailure::FromBlindedNode) => HTLCForwardInfo::FailMalformedHTLC {
8069
+ htlc_id: *htlc_id,
8070
+ failure_code: LocalHTLCFailureReason::InvalidOnionBlinding.failure_code(),
8071
+ sha256_of_onion: [0; 32],
8072
+ },
8073
+ None => {
8074
+ let err_packet = onion_error.get_encrypted_failure_packet(
8075
+ incoming_packet_shared_secret,
8076
+ secondary_shared_secret,
8077
+ );
8078
+ HTLCForwardInfo::FailHTLC { htlc_id: *htlc_id, err_packet }
8079
+ },
8080
+ }
8081
+ }
8082
+
8083
+ fn fail_htlc_backwards_from_forward(
8084
+ &self, onion_error: &HTLCFailReason, failure_type: HTLCHandlingFailureType,
8085
+ short_channel_id: &u64, channel_id: &ChannelId, failure: HTLCForwardInfo,
8086
+ ) {
8087
+ let mut forward_htlcs = self.forward_htlcs.lock().unwrap();
8088
+ match forward_htlcs.entry(*short_channel_id) {
8089
+ hash_map::Entry::Occupied(mut entry) => {
8090
+ entry.get_mut().push(failure);
8091
+ },
8092
+ hash_map::Entry::Vacant(entry) => {
8093
+ entry.insert(vec![failure]);
8094
+ },
8095
+ }
8096
+ mem::drop(forward_htlcs);
8097
+ let mut pending_events = self.pending_events.lock().unwrap();
8098
+ pending_events.push_back((
8099
+ events::Event::HTLCHandlingFailed {
8100
+ prev_channel_id: *channel_id,
8101
+ failure_type,
8102
+ failure_reason: Some(onion_error.into()),
8103
+ },
8104
+ None,
8105
+ ));
8106
+ }
8107
+
8082
8108
/// Provides a payment preimage in response to [`Event::PaymentClaimable`], generating any
8083
8109
/// [`MessageSendEvent`]s needed to claim the payment.
8084
8110
///
0 commit comments