mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 07:04:22 +01:00
channel: remove awaiting_revoke_and_ack flag.
We can tell this more generically because the count of revocations
received != count of commitments sent. This is the correct condition
which allows us to restore the test we had to eliminate in
c3cb7f1c85.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
committed by
Christian Decker
parent
fda77f27a5
commit
02411b04e4
@@ -692,7 +692,9 @@ static void send_commit(struct peer *peer)
|
|||||||
|
|
||||||
/* FIXME: Document this requirement in BOLT 2! */
|
/* FIXME: Document this requirement in BOLT 2! */
|
||||||
/* We can't send two commits in a row. */
|
/* We can't send two commits in a row. */
|
||||||
if (channel_awaiting_revoke_and_ack(peer->channel)) {
|
if (peer->revocations_received != peer->next_index[REMOTE] - 1) {
|
||||||
|
assert(peer->revocations_received
|
||||||
|
== peer->next_index[REMOTE] - 2);
|
||||||
status_trace("Can't send commit: waiting for revoke_and_ack");
|
status_trace("Can't send commit: waiting for revoke_and_ack");
|
||||||
/* Mark this as done and try again. */
|
/* Mark this as done and try again. */
|
||||||
peer->commit_timer = NULL;
|
peer->commit_timer = NULL;
|
||||||
@@ -1141,9 +1143,12 @@ static struct io_plan *handle_peer_revoke_and_ack(struct io_conn *conn,
|
|||||||
"Bad revoke_and_ack %s", tal_hex(msg, msg));
|
"Bad revoke_and_ack %s", tal_hex(msg, msg));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* FIXME: We can get unexpected revoke_and_ack due to retransmit; we
|
if (peer->revocations_received != peer->next_index[REMOTE] - 2) {
|
||||||
* should really detect this case and set
|
peer_failed(io_conn_fd(peer->peer_conn),
|
||||||
* channel_awaiting_revoke_and_ack; normally it will be true here. */
|
&peer->pcs.cs,
|
||||||
|
&peer->channel_id,
|
||||||
|
"Unexpected revoke_and_ack");
|
||||||
|
}
|
||||||
|
|
||||||
/* BOLT #2:
|
/* BOLT #2:
|
||||||
*
|
*
|
||||||
@@ -1178,7 +1183,7 @@ static struct io_plan *handle_peer_revoke_and_ack(struct io_conn *conn,
|
|||||||
status_trace("No commits outstanding after recv revoke_and_ack");
|
status_trace("No commits outstanding after recv revoke_and_ack");
|
||||||
|
|
||||||
/* Tell master about things this locks in, wait for response */
|
/* Tell master about things this locks in, wait for response */
|
||||||
msg = got_revoke_msg(tmpctx, peer->next_index[REMOTE] - 2,
|
msg = got_revoke_msg(tmpctx, peer->revocations_received++,
|
||||||
&old_commit_secret, &next_per_commit,
|
&old_commit_secret, &next_per_commit,
|
||||||
changed_htlcs);
|
changed_htlcs);
|
||||||
master_wait_sync_reply(tmpctx, peer, take(msg),
|
master_wait_sync_reply(tmpctx, peer, take(msg),
|
||||||
@@ -1605,8 +1610,7 @@ static void resend_commitment(struct peer *peer, const struct changed_htlc *last
|
|||||||
msg_enqueue(&peer->peer_out, take(msg));
|
msg_enqueue(&peer->peer_out, take(msg));
|
||||||
tal_free(commit_sigs);
|
tal_free(commit_sigs);
|
||||||
|
|
||||||
/* Now we have to wait for revoke_and_ack */
|
assert(peer->revocations_received == peer->next_index[REMOTE] - 2);
|
||||||
peer->channel->awaiting_revoke_and_ack = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void peer_reconnect(struct peer *peer)
|
static void peer_reconnect(struct peer *peer)
|
||||||
|
|||||||
@@ -773,8 +773,6 @@ bool channel_sending_commit(struct channel *channel,
|
|||||||
htlcs, "sending_commit");
|
htlcs, "sending_commit");
|
||||||
channel->changes_pending[REMOTE] = false;
|
channel->changes_pending[REMOTE] = false;
|
||||||
|
|
||||||
assert(!channel->awaiting_revoke_and_ack);
|
|
||||||
channel->awaiting_revoke_and_ack = true;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -795,8 +793,6 @@ bool channel_rcvd_revoke_and_ack(struct channel *channel,
|
|||||||
if (change & HTLC_LOCAL_F_PENDING)
|
if (change & HTLC_LOCAL_F_PENDING)
|
||||||
channel->changes_pending[LOCAL] = true;
|
channel->changes_pending[LOCAL] = true;
|
||||||
|
|
||||||
channel->awaiting_revoke_and_ack = false;
|
|
||||||
|
|
||||||
/* For funder, ack also means time to apply new feerate locally. */
|
/* For funder, ack also means time to apply new feerate locally. */
|
||||||
if (channel->funder == LOCAL &&
|
if (channel->funder == LOCAL &&
|
||||||
(channel->view[LOCAL].feerate_per_kw
|
(channel->view[LOCAL].feerate_per_kw
|
||||||
@@ -862,11 +858,6 @@ bool channel_sending_revoke_and_ack(struct channel *channel)
|
|||||||
return channel->changes_pending[REMOTE];
|
return channel->changes_pending[REMOTE];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool channel_awaiting_revoke_and_ack(const struct channel *channel)
|
|
||||||
{
|
|
||||||
return channel->awaiting_revoke_and_ack;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool channel_has_htlcs(const struct channel *channel)
|
bool channel_has_htlcs(const struct channel *channel)
|
||||||
{
|
{
|
||||||
struct htlc_map_iter it;
|
struct htlc_map_iter it;
|
||||||
|
|||||||
@@ -241,14 +241,6 @@ bool channel_rcvd_commit(struct channel *channel,
|
|||||||
* anything changed for the remote commitment (ie. send a new commit).*/
|
* anything changed for the remote commitment (ie. send a new commit).*/
|
||||||
bool channel_sending_revoke_and_ack(struct channel *channel);
|
bool channel_sending_revoke_and_ack(struct channel *channel);
|
||||||
|
|
||||||
/**
|
|
||||||
* channel_awaiting_revoke_and_ack: are we waiting for revoke_and_ack?
|
|
||||||
* @channel: the channel
|
|
||||||
*
|
|
||||||
* If true, we can't send a new commit message.
|
|
||||||
*/
|
|
||||||
bool channel_awaiting_revoke_and_ack(const struct channel *channel);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* channel_has_htlcs: are there any (live) HTLCs at all in channel?
|
* channel_has_htlcs: are there any (live) HTLCs at all in channel?
|
||||||
* @channel: the channel
|
* @channel: the channel
|
||||||
|
|||||||
@@ -40,7 +40,6 @@ struct channel *new_initial_channel(const tal_t *ctx,
|
|||||||
channel->htlcs = NULL;
|
channel->htlcs = NULL;
|
||||||
channel->changes_pending[LOCAL] = channel->changes_pending[REMOTE]
|
channel->changes_pending[LOCAL] = channel->changes_pending[REMOTE]
|
||||||
= false;
|
= false;
|
||||||
channel->awaiting_revoke_and_ack = false;
|
|
||||||
|
|
||||||
channel->view[LOCAL].feerate_per_kw
|
channel->view[LOCAL].feerate_per_kw
|
||||||
= channel->view[REMOTE].feerate_per_kw
|
= channel->view[REMOTE].feerate_per_kw
|
||||||
|
|||||||
@@ -55,9 +55,6 @@ struct channel {
|
|||||||
/* Do we have changes pending for ourselves/other? */
|
/* Do we have changes pending for ourselves/other? */
|
||||||
bool changes_pending[NUM_SIDES];
|
bool changes_pending[NUM_SIDES];
|
||||||
|
|
||||||
/* Are we waiting for their revoke_and_ack? */
|
|
||||||
bool awaiting_revoke_and_ack;
|
|
||||||
|
|
||||||
/* What it looks like to each side. */
|
/* What it looks like to each side. */
|
||||||
struct channel_view view[NUM_SIDES];
|
struct channel_view view[NUM_SIDES];
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user