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