@@ -57,15 +57,19 @@ use std::ops::Deref;
5757// forward the HTLC with information it will give back to us when it does so, or if it should Fail
5858// the HTLC with the relevant message for the Channel to handle giving to the remote peer.
5959//
60- // When a Channel forwards an HTLC to its peer, it will give us back the PendingForwardHTLCInfo
61- // which we will use to construct an outbound HTLC, with a relevant HTLCSource::PreviousHopData
62- // filled in to indicate where it came from (which we can use to either fail-backwards or fulfill
63- // the HTLC backwards along the relevant path).
60+ // Once said HTLC is committed in the Channel, if the PendingHTLCStatus indicated Forward, the
61+ // Channel will return the PendingHTLCInfo back to us, and we will create an HTLCForwardInfo
62+ // with it to track where it came from (in case of onwards-forward error), waiting a random delay
63+ // before we forward it.
64+ //
65+ // We will then use HTLCForwardInfo's PendingHTLCInfo to construct an outbound HTLC, with a
66+ // relevant HTLCSource::PreviousHopData filled in to indicate where it came from (which we can use
67+ // to either fail-backwards or fulfill the HTLC backwards along the relevant path).
6468// Alternatively, we can fill an outbound HTLC with a HTLCSource::OutboundRoute indicating this is
6569// our payment, which we can use to decode errors or inform the user that the payment was sent.
66- /// Stores the info we will need to send when we want to forward an HTLC onwards
70+
6771#[ derive( Clone ) ] // See Channel::revoke_and_ack for why, tl;dr: Rust bug
68- pub ( super ) struct PendingForwardHTLCInfo {
72+ pub ( super ) struct PendingHTLCInfo {
6973 onion_packet : Option < msgs:: OnionPacket > ,
7074 incoming_shared_secret : [ u8 ; 32 ] ,
7175 payment_hash : PaymentHash ,
@@ -83,10 +87,22 @@ pub(super) enum HTLCFailureMsg {
8387/// Stores whether we can't forward an HTLC or relevant forwarding info
8488#[ derive( Clone ) ] // See Channel::revoke_and_ack for why, tl;dr: Rust bug
8589pub ( super ) enum PendingHTLCStatus {
86- Forward ( PendingForwardHTLCInfo ) ,
90+ Forward ( PendingHTLCInfo ) ,
8791 Fail ( HTLCFailureMsg ) ,
8892}
8993
94+ pub ( super ) enum HTLCForwardInfo {
95+ AddHTLC {
96+ prev_short_channel_id : u64 ,
97+ prev_htlc_id : u64 ,
98+ forward_info : PendingHTLCInfo ,
99+ } ,
100+ FailHTLC {
101+ htlc_id : u64 ,
102+ err_packet : msgs:: OnionErrorPacket ,
103+ } ,
104+ }
105+
90106/// Tracks the inbound corresponding to an outbound HTLC
91107#[ derive( Clone , PartialEq ) ]
92108pub ( super ) struct HTLCPreviousHopData {
@@ -231,18 +247,6 @@ impl MsgHandleErrInternal {
231247/// second to 30 seconds, but people expect lightning to be, you know, kinda fast, sadly.
232248const MIN_HTLC_RELAY_HOLDING_CELL_MILLIS : u64 = 100 ;
233249
234- pub ( super ) enum HTLCForwardInfo {
235- AddHTLC {
236- prev_short_channel_id : u64 ,
237- prev_htlc_id : u64 ,
238- forward_info : PendingForwardHTLCInfo ,
239- } ,
240- FailHTLC {
241- htlc_id : u64 ,
242- err_packet : msgs:: OnionErrorPacket ,
243- } ,
244- }
245-
246250/// For events which result in both a RevokeAndACK and a CommitmentUpdate, by default they should
247251/// be sent in the order they appear in the return value, however sometimes the order needs to be
248252/// variable at runtime (eg Channel::channel_reestablish needs to re-send messages in the order
@@ -262,7 +266,7 @@ pub(super) struct ChannelHolder<ChanSigner: ChannelKeys> {
262266 /// short channel id -> forward infos. Key of 0 means payments received
263267 /// Note that while this is held in the same mutex as the channels themselves, no consistency
264268 /// guarantees are made about the existence of a channel with the short id here, nor the short
265- /// ids in the PendingForwardHTLCInfo !
269+ /// ids in the PendingHTLCInfo !
266270 pub ( super ) forward_htlcs : HashMap < u64 , Vec < HTLCForwardInfo > > ,
267271 /// payment_hash -> Vec<(amount_received, htlc_source)> for tracking things that were to us and
268272 /// can be failed/claimed by the user
@@ -571,7 +575,7 @@ macro_rules! handle_monitor_err {
571575 } else if $resend_commitment { "commitment" }
572576 else if $resend_raa { "RAA" }
573577 else { "nothing" } ,
574- ( & $failed_forwards as & Vec <( PendingForwardHTLCInfo , u64 ) >) . len( ) ,
578+ ( & $failed_forwards as & Vec <( PendingHTLCInfo , u64 ) >) . len( ) ,
575579 ( & $failed_fails as & Vec <( HTLCSource , PaymentHash , HTLCFailReason ) >) . len( ) ) ;
576580 if !$resend_commitment {
577581 debug_assert!( $action_type == RAACommitmentOrder :: RevokeAndACKFirst || !$resend_raa) ;
@@ -963,7 +967,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
963967 // instead we stay symmetric with the forwarding case, only responding (after a
964968 // delay) once they've send us a commitment_signed!
965969
966- PendingHTLCStatus :: Forward ( PendingForwardHTLCInfo {
970+ PendingHTLCStatus :: Forward ( PendingHTLCInfo {
967971 onion_packet : None ,
968972 payment_hash : msg. payment_hash . clone ( ) ,
969973 short_channel_id : 0 ,
@@ -1015,7 +1019,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
10151019 } ,
10161020 } ;
10171021
1018- PendingHTLCStatus :: Forward ( PendingForwardHTLCInfo {
1022+ PendingHTLCStatus :: Forward ( PendingHTLCInfo {
10191023 onion_packet : Some ( outgoing_packet) ,
10201024 payment_hash : msg. payment_hash . clone ( ) ,
10211025 short_channel_id : short_channel_id,
@@ -1026,7 +1030,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
10261030 } ;
10271031
10281032 channel_state = Some ( self . channel_state . lock ( ) . unwrap ( ) ) ;
1029- if let & PendingHTLCStatus :: Forward ( PendingForwardHTLCInfo { ref onion_packet, ref short_channel_id, ref amt_to_forward, ref outgoing_cltv_value, .. } ) = & pending_forward_info {
1033+ if let & PendingHTLCStatus :: Forward ( PendingHTLCInfo { ref onion_packet, ref short_channel_id, ref amt_to_forward, ref outgoing_cltv_value, .. } ) = & pending_forward_info {
10301034 if onion_packet. is_some ( ) { // If short_channel_id is 0 here, we'll reject them in the body here
10311035 let id_option = channel_state. as_ref ( ) . unwrap ( ) . short_to_id . get ( & short_channel_id) . cloned ( ) ;
10321036 let forwarding_id = match id_option {
@@ -2152,7 +2156,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
21522156 // If the update_add is completely bogus, the call will Err and we will close,
21532157 // but if we've sent a shutdown and they haven't acknowledged it yet, we just
21542158 // want to reject the new HTLC and fail it backwards instead of forwarding.
2155- if let PendingHTLCStatus :: Forward ( PendingForwardHTLCInfo { incoming_shared_secret, .. } ) = pending_forward_info {
2159+ if let PendingHTLCStatus :: Forward ( PendingHTLCInfo { incoming_shared_secret, .. } ) = pending_forward_info {
21562160 let chan_update = self . get_channel_update ( chan. get ( ) ) ;
21572161 pending_forward_info = PendingHTLCStatus :: Fail ( HTLCFailureMsg :: Relay ( msgs:: UpdateFailHTLC {
21582162 channel_id : msg. channel_id ,
@@ -2283,7 +2287,7 @@ impl<ChanSigner: ChannelKeys, M: Deref> ChannelManager<ChanSigner, M> where M::T
22832287 }
22842288
22852289 #[ inline]
2286- fn forward_htlcs ( & self , per_source_pending_forwards : & mut [ ( u64 , Vec < ( PendingForwardHTLCInfo , u64 ) > ) ] ) {
2290+ fn forward_htlcs ( & self , per_source_pending_forwards : & mut [ ( u64 , Vec < ( PendingHTLCInfo , u64 ) > ) ] ) {
22872291 for & mut ( prev_short_channel_id, ref mut pending_forwards) in per_source_pending_forwards {
22882292 let mut forward_event = None ;
22892293 if !pending_forwards. is_empty ( ) {
@@ -2998,7 +3002,7 @@ impl<ChanSigner: ChannelKeys, M: Deref + Sync + Send> ChannelMessageHandler for
29983002const SERIALIZATION_VERSION : u8 = 1 ;
29993003const MIN_SERIALIZATION_VERSION : u8 = 1 ;
30003004
3001- impl Writeable for PendingForwardHTLCInfo {
3005+ impl Writeable for PendingHTLCInfo {
30023006 fn write < W : Writer > ( & self , writer : & mut W ) -> Result < ( ) , :: std:: io:: Error > {
30033007 self . onion_packet . write ( writer) ?;
30043008 self . incoming_shared_secret . write ( writer) ?;
@@ -3010,9 +3014,9 @@ impl Writeable for PendingForwardHTLCInfo {
30103014 }
30113015}
30123016
3013- impl < R : :: std:: io:: Read > Readable < R > for PendingForwardHTLCInfo {
3014- fn read ( reader : & mut R ) -> Result < PendingForwardHTLCInfo , DecodeError > {
3015- Ok ( PendingForwardHTLCInfo {
3017+ impl < R : :: std:: io:: Read > Readable < R > for PendingHTLCInfo {
3018+ fn read ( reader : & mut R ) -> Result < PendingHTLCInfo , DecodeError > {
3019+ Ok ( PendingHTLCInfo {
30163020 onion_packet : Readable :: read ( reader) ?,
30173021 incoming_shared_secret : Readable :: read ( reader) ?,
30183022 payment_hash : Readable :: read ( reader) ?,
0 commit comments