|
@ -558,7 +558,6 @@ static bool open_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
|
|
|
|
|
|
assert(peer->state == STATE_OPEN_WAIT_FOR_OPENPKT); |
|
|
assert(peer->state == STATE_OPEN_WAIT_FOR_OPENPKT); |
|
|
|
|
|
|
|
|
/* FIXME: Handle PKT_SHUTDOWN? */ |
|
|
|
|
|
if (pkt->pkt_case != PKT__PKT_OPEN) |
|
|
if (pkt->pkt_case != PKT__PKT_OPEN) |
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
|
|
|
|
|
@ -595,7 +594,7 @@ static bool open_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
err = pkt_err(peer, "Own anchor has insufficient funds"); |
|
|
err = pkt_err(peer, "Own anchor has insufficient funds"); |
|
|
return peer_comms_err(peer, err); |
|
|
return peer_comms_err(peer, err); |
|
|
} |
|
|
} |
|
|
set_peer_state(peer, STATE_OPEN_WAIT_FOR_COMMIT_SIG, |
|
|
set_peer_state(peer, STATE_OPEN_WAIT_FOR_COMMIT_SIGPKT, |
|
|
__func__, false); |
|
|
__func__, false); |
|
|
if (db_commit_transaction(peer) != NULL) { |
|
|
if (db_commit_transaction(peer) != NULL) { |
|
|
err = pkt_err(peer, "database error"); |
|
|
err = pkt_err(peer, "database error"); |
|
@ -604,7 +603,7 @@ static bool open_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
queue_pkt_anchor(peer); |
|
|
queue_pkt_anchor(peer); |
|
|
return true; |
|
|
return true; |
|
|
} else { |
|
|
} else { |
|
|
set_peer_state(peer, STATE_OPEN_WAIT_FOR_ANCHOR, |
|
|
set_peer_state(peer, STATE_OPEN_WAIT_FOR_ANCHORPKT, |
|
|
__func__, false); |
|
|
__func__, false); |
|
|
if (db_commit_transaction(peer) != NULL) { |
|
|
if (db_commit_transaction(peer) != NULL) { |
|
|
err = pkt_err(peer, "database error"); |
|
|
err = pkt_err(peer, "database error"); |
|
@ -630,18 +629,6 @@ static bool open_ouranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
{ |
|
|
{ |
|
|
Pkt *err; |
|
|
Pkt *err; |
|
|
|
|
|
|
|
|
if (pkt->pkt_case == PKT__PKT_CLOSE_SHUTDOWN) { |
|
|
|
|
|
err = accept_pkt_close_shutdown(peer, pkt); |
|
|
|
|
|
if (err) |
|
|
|
|
|
return peer_comms_err(peer, err); |
|
|
|
|
|
|
|
|
|
|
|
set_peer_state(peer, STATE_SHUTDOWN, __func__, false); |
|
|
|
|
|
peer_breakdown(peer); |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
switch (peer->state) { |
|
|
|
|
|
case STATE_OPEN_WAIT_FOR_COMMIT_SIG: |
|
|
|
|
|
if (pkt->pkt_case != PKT__PKT_OPEN_COMMIT_SIG) |
|
|
if (pkt->pkt_case != PKT__PKT_OPEN_COMMIT_SIG) |
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
|
|
|
|
|
@ -659,8 +646,7 @@ static bool open_ouranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
err = pkt_err(peer, "Bad signature"); |
|
|
err = pkt_err(peer, "Bad signature"); |
|
|
|
|
|
|
|
|
if (err) { |
|
|
if (err) { |
|
|
peer->local.commit->sig |
|
|
peer->local.commit->sig = tal_free(peer->local.commit->sig); |
|
|
= tal_free(peer->local.commit->sig); |
|
|
|
|
|
return peer_comms_err(peer, err); |
|
|
return peer_comms_err(peer, err); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -669,7 +655,8 @@ static bool open_ouranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
db_start_transaction(peer); |
|
|
db_start_transaction(peer); |
|
|
db_set_anchor(peer); |
|
|
db_set_anchor(peer); |
|
|
db_new_commit_info(peer, LOCAL, NULL); |
|
|
db_new_commit_info(peer, LOCAL, NULL); |
|
|
set_peer_state(peer, STATE_OPEN_WAITING_OURANCHOR, |
|
|
set_peer_state(peer, |
|
|
|
|
|
STATE_OPEN_WAIT_ANCHORDEPTH_AND_THEIRCOMPLETE, |
|
|
__func__, false); |
|
|
__func__, false); |
|
|
if (db_commit_transaction(peer) != NULL) { |
|
|
if (db_commit_transaction(peer) != NULL) { |
|
|
err = pkt_err(peer, "database error"); |
|
|
err = pkt_err(peer, "database error"); |
|
@ -678,61 +665,14 @@ static bool open_ouranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
broadcast_tx(peer, peer->anchor.tx, funding_tx_failed); |
|
|
broadcast_tx(peer, peer->anchor.tx, funding_tx_failed); |
|
|
peer_watch_anchor(peer, peer->local.mindepth); |
|
|
peer_watch_anchor(peer, peer->local.mindepth); |
|
|
return true; |
|
|
return true; |
|
|
|
|
|
|
|
|
case STATE_OPEN_WAITING_OURANCHOR: |
|
|
|
|
|
case STATE_OPEN_WAIT_FOR_COMPLETE_OURANCHOR: |
|
|
|
|
|
if (pkt->pkt_case == PKT__PKT_OPEN_COMPLETE) { |
|
|
|
|
|
err = accept_pkt_open_complete(peer, pkt); |
|
|
|
|
|
if (err) |
|
|
|
|
|
return peer_comms_err(peer, err); |
|
|
|
|
|
|
|
|
|
|
|
db_start_transaction(peer); |
|
|
|
|
|
/* We've already noticed anchor reach depth? */ |
|
|
|
|
|
if (peer->state == STATE_OPEN_WAIT_FOR_COMPLETE_OURANCHOR) { |
|
|
|
|
|
peer_open_complete(peer, NULL); |
|
|
|
|
|
set_peer_state(peer, STATE_NORMAL, |
|
|
|
|
|
__func__, true); |
|
|
|
|
|
} else { |
|
|
|
|
|
set_peer_state(peer, |
|
|
|
|
|
STATE_OPEN_WAITING_OURANCHOR_THEYCOMPLETED, |
|
|
|
|
|
__func__, false); |
|
|
|
|
|
} |
|
|
} |
|
|
if (db_commit_transaction(peer) != NULL) { |
|
|
|
|
|
err = pkt_err(peer, "database error"); |
|
|
|
|
|
return peer_comms_err(peer, err); |
|
|
|
|
|
} |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
/* Fall thru */ |
|
|
|
|
|
case STATE_OPEN_WAITING_OURANCHOR_THEYCOMPLETED: |
|
|
|
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
|
log_unusual(peer->log, |
|
|
|
|
|
"%s: unexpected state %s", |
|
|
|
|
|
__func__, state_name(peer->state)); |
|
|
|
|
|
peer_fail(peer, __func__); |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static bool open_theiranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
static bool open_theiranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
{ |
|
|
{ |
|
|
Pkt *err; |
|
|
Pkt *err; |
|
|
const char *db_err; |
|
|
const char *db_err; |
|
|
|
|
|
|
|
|
if (pkt->pkt_case == PKT__PKT_CLOSE_SHUTDOWN) { |
|
|
|
|
|
err = accept_pkt_close_shutdown(peer, pkt); |
|
|
|
|
|
if (err) |
|
|
|
|
|
return peer_comms_err(peer, err); |
|
|
|
|
|
|
|
|
|
|
|
set_peer_state(peer, STATE_SHUTDOWN, __func__, false); |
|
|
|
|
|
peer_breakdown(peer); |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
switch (peer->state) { |
|
|
|
|
|
case STATE_OPEN_WAIT_FOR_ANCHOR: |
|
|
|
|
|
if (pkt->pkt_case != PKT__PKT_OPEN_ANCHOR) |
|
|
if (pkt->pkt_case != PKT__PKT_OPEN_ANCHOR) |
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
|
|
|
|
|
@ -768,8 +708,8 @@ static bool open_theiranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
peer_add_their_commit(peer, |
|
|
peer_add_their_commit(peer, |
|
|
&peer->remote.commit->txid, |
|
|
&peer->remote.commit->txid, |
|
|
peer->remote.commit->commit_num); |
|
|
peer->remote.commit->commit_num); |
|
|
set_peer_state(peer, STATE_OPEN_WAITING_THEIRANCHOR, __func__, |
|
|
set_peer_state(peer, STATE_OPEN_WAIT_ANCHORDEPTH_AND_THEIRCOMPLETE, |
|
|
false); |
|
|
__func__, false); |
|
|
db_err = db_commit_transaction(peer); |
|
|
db_err = db_commit_transaction(peer); |
|
|
if (db_err) { |
|
|
if (db_err) { |
|
|
err = pkt_err(peer, "database error"); |
|
|
err = pkt_err(peer, "database error"); |
|
@ -780,10 +720,36 @@ static bool open_theiranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
queue_pkt_open_commit_sig(peer); |
|
|
queue_pkt_open_commit_sig(peer); |
|
|
peer_watch_anchor(peer, peer->local.mindepth); |
|
|
peer_watch_anchor(peer, peer->local.mindepth); |
|
|
return true; |
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static bool open_wait_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
|
|
|
{ |
|
|
|
|
|
Pkt *err; |
|
|
|
|
|
const char *db_err; |
|
|
|
|
|
|
|
|
|
|
|
/* If they want to shutdown during this, we do mutual close dance. */ |
|
|
|
|
|
if (pkt->pkt_case == PKT__PKT_CLOSE_SHUTDOWN) { |
|
|
|
|
|
err = accept_pkt_close_shutdown(peer, pkt); |
|
|
|
|
|
if (err) |
|
|
|
|
|
return peer_comms_err(peer, err); |
|
|
|
|
|
|
|
|
|
|
|
/* FIXME: All in one transaction! */ |
|
|
|
|
|
if (!db_set_their_closing_script(peer)) |
|
|
|
|
|
err = pkt_err(peer, "database error"); |
|
|
|
|
|
else |
|
|
|
|
|
err = start_closing(peer); |
|
|
|
|
|
|
|
|
|
|
|
if (err) |
|
|
|
|
|
return peer_comms_err(peer, err); |
|
|
|
|
|
return false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
switch (peer->state) { |
|
|
|
|
|
case STATE_OPEN_WAIT_ANCHORDEPTH_AND_THEIRCOMPLETE: |
|
|
|
|
|
case STATE_OPEN_WAIT_THEIRCOMPLETE: |
|
|
|
|
|
if (pkt->pkt_case != PKT__PKT_OPEN_COMPLETE) |
|
|
|
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
|
|
|
|
|
|
case STATE_OPEN_WAITING_THEIRANCHOR: |
|
|
|
|
|
case STATE_OPEN_WAIT_FOR_COMPLETE_THEIRANCHOR: |
|
|
|
|
|
if (pkt->pkt_case == PKT__PKT_OPEN_COMPLETE) { |
|
|
|
|
|
err = accept_pkt_open_complete(peer, pkt); |
|
|
err = accept_pkt_open_complete(peer, pkt); |
|
|
if (err) { |
|
|
if (err) { |
|
|
peer_open_complete(peer, err->error->problem); |
|
|
peer_open_complete(peer, err->error->problem); |
|
@ -791,14 +757,12 @@ static bool open_theiranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
db_start_transaction(peer); |
|
|
db_start_transaction(peer); |
|
|
if (peer->state == STATE_OPEN_WAITING_THEIRANCHOR) { |
|
|
if (peer->state == STATE_OPEN_WAIT_THEIRCOMPLETE) { |
|
|
set_peer_state(peer, |
|
|
|
|
|
STATE_OPEN_WAITING_THEIRANCHOR_THEYCOMPLETED, |
|
|
|
|
|
__func__, false); |
|
|
|
|
|
} else { |
|
|
|
|
|
peer_open_complete(peer, NULL); |
|
|
peer_open_complete(peer, NULL); |
|
|
set_peer_state(peer, STATE_NORMAL, |
|
|
set_peer_state(peer, STATE_NORMAL, __func__, true); |
|
|
__func__, true); |
|
|
} else { |
|
|
|
|
|
set_peer_state(peer, STATE_OPEN_WAIT_ANCHORDEPTH, |
|
|
|
|
|
__func__, false); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
db_err = db_commit_transaction(peer); |
|
|
db_err = db_commit_transaction(peer); |
|
@ -808,9 +772,8 @@ static bool open_theiranchor_pkt_in(struct peer *peer, const Pkt *pkt) |
|
|
return peer_comms_err(peer, err); |
|
|
return peer_comms_err(peer, err); |
|
|
} |
|
|
} |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
|
|
|
/* Fall thru */ |
|
|
case STATE_OPEN_WAIT_ANCHORDEPTH: |
|
|
case STATE_OPEN_WAITING_THEIRANCHOR_THEYCOMPLETED: |
|
|
|
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
return peer_received_unexpected_pkt(peer, pkt, __func__); |
|
|
|
|
|
|
|
|
default: |
|
|
default: |
|
@ -2229,12 +2192,13 @@ static struct io_plan *pkt_in(struct io_conn *conn, struct peer *peer) |
|
|
keep_going = closing_pkt_in(peer, peer->inpkt); |
|
|
keep_going = closing_pkt_in(peer, peer->inpkt); |
|
|
else if (peer->state == STATE_OPEN_WAIT_FOR_OPENPKT) |
|
|
else if (peer->state == STATE_OPEN_WAIT_FOR_OPENPKT) |
|
|
keep_going = open_pkt_in(peer, peer->inpkt); |
|
|
keep_going = open_pkt_in(peer, peer->inpkt); |
|
|
else if (state_is_opening(peer->state)) { |
|
|
else if (peer->state == STATE_OPEN_WAIT_FOR_COMMIT_SIGPKT) |
|
|
if (peer->local.offer_anchor) |
|
|
|
|
|
keep_going = open_ouranchor_pkt_in(peer, peer->inpkt); |
|
|
keep_going = open_ouranchor_pkt_in(peer, peer->inpkt); |
|
|
else |
|
|
else if (peer->state == STATE_OPEN_WAIT_FOR_ANCHORPKT) |
|
|
keep_going = open_theiranchor_pkt_in(peer, peer->inpkt); |
|
|
keep_going = open_theiranchor_pkt_in(peer, peer->inpkt); |
|
|
} else { |
|
|
else if (state_is_openwait(peer->state)) |
|
|
|
|
|
keep_going = open_wait_pkt_in(peer, peer->inpkt); |
|
|
|
|
|
else { |
|
|
log_unusual(peer->log, |
|
|
log_unusual(peer->log, |
|
|
"Unexpected state %s", state_name(peer->state)); |
|
|
"Unexpected state %s", state_name(peer->state)); |
|
|
keep_going = false; |
|
|
keep_going = false; |
|
@ -3305,16 +3269,11 @@ static void peer_depth_ok(struct peer *peer) |
|
|
db_start_transaction(peer); |
|
|
db_start_transaction(peer); |
|
|
|
|
|
|
|
|
switch (peer->state) { |
|
|
switch (peer->state) { |
|
|
case STATE_OPEN_WAITING_OURANCHOR: |
|
|
case STATE_OPEN_WAIT_ANCHORDEPTH_AND_THEIRCOMPLETE: |
|
|
set_peer_state(peer, STATE_OPEN_WAIT_FOR_COMPLETE_OURANCHOR, |
|
|
set_peer_state(peer, STATE_OPEN_WAIT_THEIRCOMPLETE, |
|
|
__func__, false); |
|
|
|
|
|
break; |
|
|
|
|
|
case STATE_OPEN_WAITING_THEIRANCHOR: |
|
|
|
|
|
set_peer_state(peer, STATE_OPEN_WAIT_FOR_COMPLETE_THEIRANCHOR, |
|
|
|
|
|
__func__, false); |
|
|
__func__, false); |
|
|
break; |
|
|
break; |
|
|
case STATE_OPEN_WAITING_OURANCHOR_THEYCOMPLETED: |
|
|
case STATE_OPEN_WAIT_ANCHORDEPTH: |
|
|
case STATE_OPEN_WAITING_THEIRANCHOR_THEYCOMPLETED: |
|
|
|
|
|
peer_open_complete(peer, NULL); |
|
|
peer_open_complete(peer, NULL); |
|
|
set_peer_state(peer, STATE_NORMAL, __func__, true); |
|
|
set_peer_state(peer, STATE_NORMAL, __func__, true); |
|
|
break; |
|
|
break; |
|
|