@@ -977,7 +977,9 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
977
977
lock_fundings ! ( nodes) ;
978
978
979
979
let chan_a = nodes[ 0 ] . list_usable_channels ( ) [ 0 ] . short_channel_id . unwrap ( ) ;
980
+ let chan_a_id = nodes[ 0 ] . list_usable_channels ( ) [ 0 ] . channel_id ;
980
981
let chan_b = nodes[ 2 ] . list_usable_channels ( ) [ 0 ] . short_channel_id . unwrap ( ) ;
982
+ let chan_b_id = nodes[ 2 ] . list_usable_channels ( ) [ 0 ] . channel_id ;
981
983
982
984
let mut p_id: u8 = 0 ;
983
985
let mut p_idx: u64 = 0 ;
@@ -1038,6 +1040,10 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1038
1040
if Some ( * node_id) == expect_drop_id { panic!( "peer_disconnected should drop msgs bound for the disconnected peer" ) ; }
1039
1041
* node_id == a_id
1040
1042
} ,
1043
+ events:: MessageSendEvent :: SendStfu { ref node_id, .. } => {
1044
+ if Some ( * node_id) == expect_drop_id { panic!( "peer_disconnected should drop msgs bound for the disconnected peer" ) ; }
1045
+ * node_id == a_id
1046
+ } ,
1041
1047
events:: MessageSendEvent :: SendChannelReady { .. } => continue ,
1042
1048
events:: MessageSendEvent :: SendAnnouncementSignatures { .. } => continue ,
1043
1049
events:: MessageSendEvent :: SendChannelUpdate { ref node_id, ref msg } => {
@@ -1100,7 +1106,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1100
1106
for ( idx, dest) in nodes. iter( ) . enumerate( ) {
1101
1107
if dest. get_our_node_id( ) == node_id {
1102
1108
for update_add in update_add_htlcs. iter( ) {
1103
- out. locked_write( format!( "Delivering update_add_htlc to node {}.\n " , idx) . as_bytes( ) ) ;
1109
+ out. locked_write( format!( "Delivering update_add_htlc from node {} to node {}.\n " , $node , idx) . as_bytes( ) ) ;
1104
1110
if !$corrupt_forward {
1105
1111
dest. handle_update_add_htlc( nodes[ $node] . get_our_node_id( ) , update_add) ;
1106
1112
} else {
@@ -1115,19 +1121,19 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1115
1121
}
1116
1122
}
1117
1123
for update_fulfill in update_fulfill_htlcs. iter( ) {
1118
- out. locked_write( format!( "Delivering update_fulfill_htlc to node {}.\n " , idx) . as_bytes( ) ) ;
1124
+ out. locked_write( format!( "Delivering update_fulfill_htlc from node {} to node {}.\n " , $node , idx) . as_bytes( ) ) ;
1119
1125
dest. handle_update_fulfill_htlc( nodes[ $node] . get_our_node_id( ) , update_fulfill) ;
1120
1126
}
1121
1127
for update_fail in update_fail_htlcs. iter( ) {
1122
- out. locked_write( format!( "Delivering update_fail_htlc to node {}.\n " , idx) . as_bytes( ) ) ;
1128
+ out. locked_write( format!( "Delivering update_fail_htlc from node {} to node {}.\n " , $node , idx) . as_bytes( ) ) ;
1123
1129
dest. handle_update_fail_htlc( nodes[ $node] . get_our_node_id( ) , update_fail) ;
1124
1130
}
1125
1131
for update_fail_malformed in update_fail_malformed_htlcs. iter( ) {
1126
- out. locked_write( format!( "Delivering update_fail_malformed_htlc to node {}.\n " , idx) . as_bytes( ) ) ;
1132
+ out. locked_write( format!( "Delivering update_fail_malformed_htlc from node {} to node {}.\n " , $node , idx) . as_bytes( ) ) ;
1127
1133
dest. handle_update_fail_malformed_htlc( nodes[ $node] . get_our_node_id( ) , update_fail_malformed) ;
1128
1134
}
1129
1135
if let Some ( msg) = update_fee {
1130
- out. locked_write( format!( "Delivering update_fee to node {}.\n " , idx) . as_bytes( ) ) ;
1136
+ out. locked_write( format!( "Delivering update_fee from node {} to node {}.\n " , $node , idx) . as_bytes( ) ) ;
1131
1137
dest. handle_update_fee( nodes[ $node] . get_our_node_id( ) , & msg) ;
1132
1138
}
1133
1139
let processed_change = !update_add_htlcs. is_empty( ) || !update_fulfill_htlcs. is_empty( ) ||
@@ -1144,7 +1150,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1144
1150
} } ) ;
1145
1151
break ;
1146
1152
}
1147
- out. locked_write( format!( "Delivering commitment_signed to node {}.\n " , idx) . as_bytes( ) ) ;
1153
+ out. locked_write( format!( "Delivering commitment_signed from node {} to node {}.\n " , $node , idx) . as_bytes( ) ) ;
1148
1154
dest. handle_commitment_signed( nodes[ $node] . get_our_node_id( ) , & commitment_signed) ;
1149
1155
break ;
1150
1156
}
@@ -1153,19 +1159,27 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1153
1159
events:: MessageSendEvent :: SendRevokeAndACK { ref node_id, ref msg } => {
1154
1160
for ( idx, dest) in nodes. iter( ) . enumerate( ) {
1155
1161
if dest. get_our_node_id( ) == * node_id {
1156
- out. locked_write( format!( "Delivering revoke_and_ack to node {}.\n " , idx) . as_bytes( ) ) ;
1162
+ out. locked_write( format!( "Delivering revoke_and_ack from node {} to node {}.\n " , $node , idx) . as_bytes( ) ) ;
1157
1163
dest. handle_revoke_and_ack( nodes[ $node] . get_our_node_id( ) , msg) ;
1158
1164
}
1159
1165
}
1160
1166
} ,
1161
1167
events:: MessageSendEvent :: SendChannelReestablish { ref node_id, ref msg } => {
1162
1168
for ( idx, dest) in nodes. iter( ) . enumerate( ) {
1163
1169
if dest. get_our_node_id( ) == * node_id {
1164
- out. locked_write( format!( "Delivering channel_reestablish to node {}.\n " , idx) . as_bytes( ) ) ;
1170
+ out. locked_write( format!( "Delivering channel_reestablish from node {} to node {}.\n " , $node , idx) . as_bytes( ) ) ;
1165
1171
dest. handle_channel_reestablish( nodes[ $node] . get_our_node_id( ) , msg) ;
1166
1172
}
1167
1173
}
1168
1174
} ,
1175
+ events:: MessageSendEvent :: SendStfu { ref node_id, ref msg } => {
1176
+ for ( idx, dest) in nodes. iter( ) . enumerate( ) {
1177
+ if dest. get_our_node_id( ) == * node_id {
1178
+ out. locked_write( format!( "Delivering stfu from node {} to node {}.\n " , $node, idx) . as_bytes( ) ) ;
1179
+ dest. handle_stfu( nodes[ $node] . get_our_node_id( ) , msg) ;
1180
+ }
1181
+ }
1182
+ }
1169
1183
events:: MessageSendEvent :: SendChannelReady { .. } => {
1170
1184
// Can be generated as a reestablish response
1171
1185
} ,
@@ -1218,6 +1232,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1218
1232
events:: MessageSendEvent :: UpdateHTLCs { .. } => { } ,
1219
1233
events:: MessageSendEvent :: SendRevokeAndACK { .. } => { } ,
1220
1234
events:: MessageSendEvent :: SendChannelReestablish { .. } => { } ,
1235
+ events:: MessageSendEvent :: SendStfu { .. } => { } ,
1221
1236
events:: MessageSendEvent :: SendChannelReady { .. } => { } ,
1222
1237
events:: MessageSendEvent :: SendAnnouncementSignatures { .. } => { } ,
1223
1238
events:: MessageSendEvent :: SendChannelUpdate { ref msg, .. } => {
@@ -1244,6 +1259,7 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1244
1259
events:: MessageSendEvent :: UpdateHTLCs { .. } => { } ,
1245
1260
events:: MessageSendEvent :: SendRevokeAndACK { .. } => { } ,
1246
1261
events:: MessageSendEvent :: SendChannelReestablish { .. } => { } ,
1262
+ events:: MessageSendEvent :: SendStfu { .. } => { } ,
1247
1263
events:: MessageSendEvent :: SendChannelReady { .. } => { } ,
1248
1264
events:: MessageSendEvent :: SendAnnouncementSignatures { .. } => { } ,
1249
1265
events:: MessageSendEvent :: SendChannelUpdate { ref msg, .. } => {
@@ -1687,6 +1703,11 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1687
1703
nodes[ 2 ] . maybe_update_chan_fees ( ) ;
1688
1704
} ,
1689
1705
1706
+ 0xa0 => nodes[ 0 ] . maybe_propose_quiescence ( & nodes[ 1 ] . get_our_node_id ( ) , & chan_a_id) ,
1707
+ 0xa1 => nodes[ 1 ] . maybe_propose_quiescence ( & nodes[ 0 ] . get_our_node_id ( ) , & chan_a_id) ,
1708
+ 0xa2 => nodes[ 1 ] . maybe_propose_quiescence ( & nodes[ 2 ] . get_our_node_id ( ) , & chan_b_id) ,
1709
+ 0xa3 => nodes[ 2 ] . maybe_propose_quiescence ( & nodes[ 1 ] . get_our_node_id ( ) , & chan_b_id) ,
1710
+
1690
1711
0xf0 => complete_monitor_update ( & monitor_a, & chan_1_id, & complete_first) ,
1691
1712
0xf1 => complete_monitor_update ( & monitor_a, & chan_1_id, & complete_second) ,
1692
1713
0xf2 => complete_monitor_update ( & monitor_a, & chan_1_id, & Vec :: pop) ,
@@ -1752,34 +1773,49 @@ pub fn do_test<Out: Output>(data: &[u8], underlying_out: Out, anchors: bool) {
1752
1773
chan_b_disconnected = false ;
1753
1774
}
1754
1775
1755
- for i in 0 ..std:: usize:: MAX {
1756
- if i == 100 {
1757
- panic ! ( "It may take may iterations to settle the state, but it should not take forever" ) ;
1758
- }
1759
- // Then, make sure any current forwards make their way to their destination
1760
- if process_msg_events ! ( 0 , false , ProcessMessages :: AllMessages ) {
1761
- continue ;
1762
- }
1763
- if process_msg_events ! ( 1 , false , ProcessMessages :: AllMessages ) {
1764
- continue ;
1765
- }
1766
- if process_msg_events ! ( 2 , false , ProcessMessages :: AllMessages ) {
1767
- continue ;
1768
- }
1769
- // ...making sure any pending PendingHTLCsForwardable events are handled and
1770
- // payments claimed.
1771
- if process_events ! ( 0 , false ) {
1772
- continue ;
1773
- }
1774
- if process_events ! ( 1 , false ) {
1775
- continue ;
1776
- }
1777
- if process_events ! ( 2 , false ) {
1778
- continue ;
1779
- }
1780
- break ;
1776
+ macro_rules! process_all_events {
1777
+ ( ) => {
1778
+ for i in 0 ..std:: usize :: MAX {
1779
+ if i == 100 {
1780
+ panic!( "It may take may iterations to settle the state, but it should not take forever" ) ;
1781
+ }
1782
+ // Then, make sure any current forwards make their way to their destination
1783
+ if process_msg_events!( 0 , false , ProcessMessages :: AllMessages ) {
1784
+ continue ;
1785
+ }
1786
+ if process_msg_events!( 1 , false , ProcessMessages :: AllMessages ) {
1787
+ continue ;
1788
+ }
1789
+ if process_msg_events!( 2 , false , ProcessMessages :: AllMessages ) {
1790
+ continue ;
1791
+ }
1792
+ // ...making sure any pending PendingHTLCsForwardable events are handled and
1793
+ // payments claimed.
1794
+ if process_events!( 0 , false ) {
1795
+ continue ;
1796
+ }
1797
+ if process_events!( 1 , false ) {
1798
+ continue ;
1799
+ }
1800
+ if process_events!( 2 , false ) {
1801
+ continue ;
1802
+ }
1803
+ break ;
1804
+ }
1805
+ } ;
1781
1806
}
1782
1807
1808
+ // At this point, we may be pending quiescence, so we'll process all messages to
1809
+ // ensure we can complete its handshake. We'll then exit quiescence and process all
1810
+ // messages again, to resolve any pending HTLCs (only irrevocably committed ones)
1811
+ // before attempting to send more payments.
1812
+ process_all_events ! ( ) ;
1813
+ nodes[ 0 ] . exit_quiescence ( & nodes[ 1 ] . get_our_node_id ( ) , & chan_a_id) . unwrap ( ) ;
1814
+ nodes[ 1 ] . exit_quiescence ( & nodes[ 0 ] . get_our_node_id ( ) , & chan_a_id) . unwrap ( ) ;
1815
+ nodes[ 1 ] . exit_quiescence ( & nodes[ 2 ] . get_our_node_id ( ) , & chan_b_id) . unwrap ( ) ;
1816
+ nodes[ 2 ] . exit_quiescence ( & nodes[ 1 ] . get_our_node_id ( ) , & chan_b_id) . unwrap ( ) ;
1817
+ process_all_events ! ( ) ;
1818
+
1783
1819
// Finally, make sure that at least one end of each channel can make a substantial payment
1784
1820
assert ! (
1785
1821
send_payment( & nodes[ 0 ] , & nodes[ 1 ] , chan_a, 10_000_000 , & mut p_id, & mut p_idx)
0 commit comments