@@ -49,6 +49,7 @@ use crate::ln::features::InvoiceFeatures;
49
49
use crate :: routing:: router:: { InFlightHtlcs , PaymentParameters , Route , RouteHop , RoutePath , RouteParameters } ;
50
50
use crate :: ln:: msgs;
51
51
use crate :: ln:: onion_utils;
52
+ use crate :: ln:: onion_utils:: HTLCFailReason ;
52
53
use crate :: ln:: msgs:: { ChannelMessageHandler , DecodeError , LightningError , MAX_VALUE_MSAT } ;
53
54
use crate :: ln:: wire:: Encode ;
54
55
use crate :: chain:: keysinterface:: { Sign , KeysInterface , KeysManager , Recipient } ;
@@ -276,82 +277,6 @@ impl HTLCSource {
276
277
}
277
278
}
278
279
279
- #[ derive( Clone ) ] // See Channel::revoke_and_ack for why, tl;dr: Rust bug
280
- pub ( super ) enum HTLCFailReason {
281
- LightningError {
282
- err : msgs:: OnionErrorPacket ,
283
- } ,
284
- Reason {
285
- failure_code : u16 ,
286
- data : Vec < u8 > ,
287
- }
288
- }
289
-
290
- impl core:: fmt:: Debug for HTLCFailReason {
291
- fn fmt ( & self , f : & mut core:: fmt:: Formatter ) -> Result < ( ) , core:: fmt:: Error > {
292
- match self {
293
- HTLCFailReason :: Reason { ref failure_code, .. } => {
294
- write ! ( f, "HTLC error code {}" , failure_code)
295
- } ,
296
- HTLCFailReason :: LightningError { .. } => {
297
- write ! ( f, "pre-built LightningError" )
298
- }
299
- }
300
- }
301
- }
302
-
303
- impl HTLCFailReason {
304
- pub ( super ) fn reason ( failure_code : u16 , data : Vec < u8 > ) -> Self {
305
- Self :: Reason { failure_code, data }
306
- }
307
-
308
- pub ( super ) fn from_failure_code ( failure_code : u16 ) -> Self {
309
- Self :: Reason { failure_code, data : Vec :: new ( ) }
310
- }
311
-
312
- pub ( super ) fn from_msg ( msg : & msgs:: UpdateFailHTLC ) -> Self {
313
- Self :: LightningError { err : msg. reason . clone ( ) }
314
- }
315
-
316
- fn get_encrypted_failure_packet ( & self , incoming_packet_shared_secret : & [ u8 ; 32 ] , phantom_shared_secret : & Option < [ u8 ; 32 ] > ) -> msgs:: OnionErrorPacket {
317
- match self {
318
- HTLCFailReason :: Reason { ref failure_code, ref data } => {
319
- if let Some ( phantom_ss) = phantom_shared_secret {
320
- let phantom_packet = onion_utils:: build_failure_packet ( phantom_ss, * failure_code, & data[ ..] ) . encode ( ) ;
321
- let encrypted_phantom_packet = onion_utils:: encrypt_failure_packet ( phantom_ss, & phantom_packet) ;
322
- onion_utils:: encrypt_failure_packet ( incoming_packet_shared_secret, & encrypted_phantom_packet. data [ ..] )
323
- } else {
324
- let packet = onion_utils:: build_failure_packet ( incoming_packet_shared_secret, * failure_code, & data[ ..] ) . encode ( ) ;
325
- onion_utils:: encrypt_failure_packet ( incoming_packet_shared_secret, & packet)
326
- }
327
- } ,
328
- HTLCFailReason :: LightningError { err } => {
329
- onion_utils:: encrypt_failure_packet ( incoming_packet_shared_secret, & err. data )
330
- }
331
- }
332
- }
333
-
334
- fn decode_onion_failure < T : secp256k1:: Signing , L : Deref > ( & self , secp_ctx : & Secp256k1 < T > , logger : & L , htlc_source : & HTLCSource ) -> ( Option < crate :: routing:: gossip:: NetworkUpdate > , Option < u64 > , bool , Option < u16 > , Option < Vec < u8 > > ) where L :: Target : Logger {
335
- match self {
336
- HTLCFailReason :: LightningError { ref err } => {
337
- onion_utils:: process_onion_failure ( secp_ctx, logger, & htlc_source, err. data . clone ( ) )
338
- } ,
339
- HTLCFailReason :: Reason { ref failure_code, ref data, .. } => {
340
- // we get a fail_malformed_htlc from the first hop
341
- // TODO: We'd like to generate a NetworkUpdate for temporary
342
- // failures here, but that would be insufficient as find_route
343
- // generally ignores its view of our own channels as we provide them via
344
- // ChannelDetails.
345
- // TODO: For non-temporary failures, we really should be closing the
346
- // channel here as we apparently can't relay through them anyway.
347
- if let & HTLCSource :: OutboundRoute { ref path, .. } = htlc_source {
348
- ( None , Some ( path. first ( ) . unwrap ( ) . short_channel_id ) , true , Some ( * failure_code) , Some ( data. clone ( ) ) )
349
- } else { unreachable ! ( ) ; }
350
- }
351
- }
352
- }
353
- }
354
-
355
280
struct ReceiveError {
356
281
err_code : u16 ,
357
282
err_data : Vec < u8 > ,
@@ -7031,16 +6956,6 @@ impl Writeable for HTLCSource {
7031
6956
}
7032
6957
}
7033
6958
7034
- impl_writeable_tlv_based_enum ! ( HTLCFailReason ,
7035
- ( 0 , LightningError ) => {
7036
- ( 0 , err, required) ,
7037
- } ,
7038
- ( 1 , Reason ) => {
7039
- ( 0 , failure_code, required) ,
7040
- ( 2 , data, vec_type) ,
7041
- } ,
7042
- ; ) ;
7043
-
7044
6959
impl_writeable_tlv_based ! ( PendingAddHTLCInfo , {
7045
6960
( 0 , forward_info, required) ,
7046
6961
( 1 , prev_user_channel_id, ( default_value, 0 ) ) ,
0 commit comments