state: use INPUT_RVALUE instead of CMD_SEND_HTLC_FULFILL during closing.

We'd expect stop_commands to stop all commands, but we (ab)used
CMD_SEND_HTLC_FULFILL to send us R values even in closing state.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2015-09-25 11:51:19 +09:30
parent 80d23a0a61
commit ba73787ecc
3 changed files with 15 additions and 6 deletions

View File

@ -740,7 +740,7 @@ enum state state(const enum state state, const struct state_data *sdata,
idata->cmd,
BITCOIN_HTLC_RETURN_SPEND_DONE));
return state;
} else if (input_is(input, CMD_SEND_HTLC_FULFILL)) {
} else if (input_is(input, INPUT_RVALUE)) {
/* This gives us the r value. */
set_effect(effect, r_value,
r_value_from_cmd(effect, sdata,
@ -1060,8 +1060,8 @@ fail_during_close:
BITCOIN_HTLC_TOTHEM_TIMEOUT);
/* Expect either close or spendthem to complete */
if (htlcs) {
/* FIXME: Make sure caller uses CMD_HTLC_FULFILL again
* if they were in the middle of one! */
/* FIXME: Make sure caller uses INPUT_RVAL
* if they were in the middle of FULFILL! */
set_effect(effect, watch_htlcs, htlcs);
return STATE_CLOSE_WAIT_SPENDTHEM_CLOSE_WITH_HTLCS;
}

View File

@ -257,7 +257,15 @@ enum state_input {
* Timeouts.
*/
INPUT_CLOSE_COMPLETE_TIMEOUT,
/*
* Inject a known R value.
*
* In normal operation, use CMD_SEND_HTLC_FULFILL; this is for
* after a unilateral close.
*/
INPUT_RVALUE,
/* Commands */
CMD_SEND_HTLC_UPDATE,
CMD_SEND_HTLC_FULFILL,

View File

@ -1019,6 +1019,7 @@ static struct trail *add_trail(enum state_input input,
t->before = *before;
t->after = *after;
if (input == CMD_SEND_HTLC_FULFILL
|| input == INPUT_RVALUE
|| input == BITCOIN_HTLC_TOTHEM_TIMEOUT
|| input == BITCOIN_HTLC_TOTHEM_SPENT
|| input == BITCOIN_HTLC_TOUS_TIMEOUT
@ -1741,7 +1742,7 @@ static bool can_refire(enum state_input i)
/* They could have lots of htlcs. */
if (i == BITCOIN_HTLC_TOTHEM_SPENT || i == BITCOIN_HTLC_TOTHEM_TIMEOUT
|| i == BITCOIN_HTLC_TOUS_TIMEOUT || i == CMD_SEND_HTLC_FULFILL)
|| i == BITCOIN_HTLC_TOUS_TIMEOUT)
return true;
/* We manually remove these if they're not watching any more spends */
@ -1870,7 +1871,7 @@ static struct trail *run_peer(const struct state_data *sdata,
idata->htlc = (struct htlc *)&copy.live_htlcs_to_us[i];
/* Only send this once. */
if (!rval_known(sdata, idata->htlc->id)) {
t = try_input(&copy, CMD_SEND_HTLC_FULFILL,
t = try_input(&copy, INPUT_RVALUE,
idata, normalpath, errorpath,
depth, hist);
if (t)