mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-22 14:42:40 +01:00
channeld: return io_plan from handlers.
This prepares us for handlers turning off peer I/O, rather than assuming we always want to handle the next incoming message. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
1ca97a7913
commit
42ede14081
1 changed files with 51 additions and 40 deletions
|
@ -253,7 +253,11 @@ static struct io_plan *peer_out(struct io_conn *conn, struct peer *peer)
|
|||
return peer_write_message(conn, &peer->pcs, out, peer_out);
|
||||
}
|
||||
|
||||
static void handle_peer_funding_locked(struct peer *peer, const u8 *msg)
|
||||
static struct io_plan *peer_in(struct io_conn *conn, struct peer *peer, u8 *msg);
|
||||
|
||||
static struct io_plan *handle_peer_funding_locked(struct io_conn *conn,
|
||||
struct peer *peer,
|
||||
const u8 *msg)
|
||||
{
|
||||
struct channel_id chanid;
|
||||
|
||||
|
@ -275,9 +279,13 @@ static void handle_peer_funding_locked(struct peer *peer, const u8 *msg)
|
|||
daemon_conn_send(&peer->master,
|
||||
take(towire_channel_normal_operation(peer)));
|
||||
}
|
||||
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
}
|
||||
|
||||
static void handle_peer_announcement_signatures(struct peer *peer, const u8 *msg)
|
||||
static struct io_plan *handle_peer_announcement_signatures(struct io_conn *conn,
|
||||
struct peer *peer,
|
||||
const u8 *msg)
|
||||
{
|
||||
struct channel_id chanid;
|
||||
|
||||
|
@ -310,9 +318,12 @@ static void handle_peer_announcement_signatures(struct peer *peer, const u8 *msg
|
|||
* so it may announce the node */
|
||||
daemon_conn_send(&peer->master, take(towire_channel_announced(msg)));
|
||||
}
|
||||
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
}
|
||||
|
||||
static void handle_peer_add_htlc(struct peer *peer, const u8 *msg)
|
||||
static struct io_plan *handle_peer_add_htlc(struct io_conn *conn,
|
||||
struct peer *peer, const u8 *msg)
|
||||
{
|
||||
struct channel_id channel_id;
|
||||
u64 id;
|
||||
|
@ -340,6 +351,7 @@ static void handle_peer_add_htlc(struct peer *peer, const u8 *msg)
|
|||
&peer->channel_id,
|
||||
WIRE_CHANNEL_PEER_BAD_MESSAGE,
|
||||
"Bad peer_add_htlc: %u", add_err);
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
}
|
||||
|
||||
static void send_commit(struct peer *peer)
|
||||
|
@ -449,7 +461,8 @@ static void start_commit_timer(struct peer *peer)
|
|||
send_commit, peer);
|
||||
}
|
||||
|
||||
static void handle_peer_commit_sig(struct peer *peer, const u8 *msg)
|
||||
static struct io_plan *handle_peer_commit_sig(struct io_conn *conn,
|
||||
struct peer *peer, const u8 *msg)
|
||||
{
|
||||
tal_t *tmpctx = tal_tmpctx(peer);
|
||||
struct sha256 old_commit_secret;
|
||||
|
@ -475,8 +488,6 @@ static void handle_peer_commit_sig(struct peer *peer, const u8 *msg)
|
|||
"commit_sig with no changes");
|
||||
}
|
||||
|
||||
/* FIXME: Tell master about HTLC changes. */
|
||||
|
||||
if (!fromwire_commitment_signed(tmpctx, msg, NULL,
|
||||
&channel_id, &commit_sig, &htlc_sigs))
|
||||
peer_failed(io_conn_fd(peer->peer_conn),
|
||||
|
@ -584,6 +595,8 @@ static void handle_peer_commit_sig(struct peer *peer, const u8 *msg)
|
|||
&peer->current_per_commit[LOCAL]);
|
||||
msg_enqueue(&peer->peer_out, take(msg));
|
||||
tal_free(tmpctx);
|
||||
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
}
|
||||
|
||||
static void their_htlc_locked(const struct htlc *htlc, struct peer *peer)
|
||||
|
@ -652,7 +665,9 @@ bad_onion:
|
|||
tal_free(tmpctx);
|
||||
}
|
||||
|
||||
static void handle_peer_revoke_and_ack(struct peer *peer, const u8 *msg)
|
||||
static struct io_plan *handle_peer_revoke_and_ack(struct io_conn *conn,
|
||||
struct peer *peer,
|
||||
const u8 *msg)
|
||||
{
|
||||
struct sha256 old_commit_secret;
|
||||
struct privkey privkey;
|
||||
|
@ -730,9 +745,11 @@ static void handle_peer_revoke_and_ack(struct peer *peer, const u8 *msg)
|
|||
}
|
||||
|
||||
start_commit_timer(peer);
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
}
|
||||
|
||||
static void handle_peer_fulfill_htlc(struct peer *peer, const u8 *msg)
|
||||
static struct io_plan *handle_peer_fulfill_htlc(struct io_conn *conn,
|
||||
struct peer *peer, const u8 *msg)
|
||||
{
|
||||
struct channel_id channel_id;
|
||||
u64 id;
|
||||
|
@ -754,7 +771,7 @@ static void handle_peer_fulfill_htlc(struct peer *peer, const u8 *msg)
|
|||
msg = towire_channel_fulfilled_htlc(msg, id, &preimage);
|
||||
daemon_conn_send(&peer->master, take(msg));
|
||||
start_commit_timer(peer);
|
||||
return;
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
/* These shouldn't happen, because any offered HTLC (which would give
|
||||
* us the preimage) should have timed out long before. If we
|
||||
* were to get preimages from other sources, this could happen. */
|
||||
|
@ -773,7 +790,8 @@ static void handle_peer_fulfill_htlc(struct peer *peer, const u8 *msg)
|
|||
abort();
|
||||
}
|
||||
|
||||
static void handle_peer_fail_htlc(struct peer *peer, const u8 *msg)
|
||||
static struct io_plan *handle_peer_fail_htlc(struct io_conn *conn,
|
||||
struct peer *peer, const u8 *msg)
|
||||
{
|
||||
struct channel_id channel_id;
|
||||
u64 id;
|
||||
|
@ -795,7 +813,7 @@ static void handle_peer_fail_htlc(struct peer *peer, const u8 *msg)
|
|||
msg = towire_channel_failed_htlc(msg, id, reason);
|
||||
daemon_conn_send(&peer->master, take(msg));
|
||||
start_commit_timer(peer);
|
||||
return;
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
case CHANNEL_ERR_NO_SUCH_ID:
|
||||
case CHANNEL_ERR_ALREADY_FULFILLED:
|
||||
case CHANNEL_ERR_HTLC_UNCOMMITTED:
|
||||
|
@ -811,7 +829,9 @@ static void handle_peer_fail_htlc(struct peer *peer, const u8 *msg)
|
|||
abort();
|
||||
}
|
||||
|
||||
static void handle_peer_fail_malformed_htlc(struct peer *peer, const u8 *msg)
|
||||
static struct io_plan *handle_peer_fail_malformed_htlc(struct io_conn *conn,
|
||||
struct peer *peer,
|
||||
const u8 *msg)
|
||||
{
|
||||
struct channel_id channel_id;
|
||||
u64 id;
|
||||
|
@ -836,7 +856,7 @@ static void handle_peer_fail_malformed_htlc(struct peer *peer, const u8 *msg)
|
|||
failcode);
|
||||
daemon_conn_send(&peer->master, take(msg));
|
||||
start_commit_timer(peer);
|
||||
return;
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
case CHANNEL_ERR_NO_SUCH_ID:
|
||||
case CHANNEL_ERR_ALREADY_FULFILLED:
|
||||
case CHANNEL_ERR_HTLC_UNCOMMITTED:
|
||||
|
@ -852,7 +872,8 @@ static void handle_peer_fail_malformed_htlc(struct peer *peer, const u8 *msg)
|
|||
abort();
|
||||
}
|
||||
|
||||
static void handle_ping(struct peer *peer, const u8 *msg)
|
||||
static struct io_plan *handle_ping(struct io_conn *conn,
|
||||
struct peer *peer, const u8 *msg)
|
||||
{
|
||||
u8 *pong;
|
||||
|
||||
|
@ -869,9 +890,11 @@ static void handle_ping(struct peer *peer, const u8 *msg)
|
|||
|
||||
if (pong)
|
||||
msg_enqueue(&peer->peer_out, take(pong));
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
}
|
||||
|
||||
static void handle_pong(struct peer *peer, const u8 *pong)
|
||||
static struct io_plan *handle_pong(struct io_conn *conn,
|
||||
struct peer *peer, const u8 *pong)
|
||||
{
|
||||
u8 *ignored;
|
||||
|
||||
|
@ -885,6 +908,7 @@ static void handle_pong(struct peer *peer, const u8 *pong)
|
|||
peer->num_pings_outstanding--;
|
||||
daemon_conn_send(&peer->master,
|
||||
take(towire_channel_ping_reply(pong, tal_len(pong))));
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
}
|
||||
|
||||
static struct io_plan *peer_in(struct io_conn *conn, struct peer *peer, u8 *msg)
|
||||
|
@ -894,7 +918,7 @@ static struct io_plan *peer_in(struct io_conn *conn, struct peer *peer, u8 *msg)
|
|||
|
||||
/* Must get funding_locked before almost anything. */
|
||||
if (!peer->funding_locked[REMOTE]) {
|
||||
/* We can get gossup before funging, too */
|
||||
/* We can get gossip before funding, too */
|
||||
if (type != WIRE_FUNDING_LOCKED
|
||||
&& type != WIRE_CHANNEL_ANNOUNCEMENT
|
||||
&& type != WIRE_CHANNEL_UPDATE
|
||||
|
@ -910,41 +934,31 @@ static struct io_plan *peer_in(struct io_conn *conn, struct peer *peer, u8 *msg)
|
|||
|
||||
switch (type) {
|
||||
case WIRE_FUNDING_LOCKED:
|
||||
handle_peer_funding_locked(peer, msg);
|
||||
goto done;
|
||||
return handle_peer_funding_locked(conn, peer, msg);
|
||||
case WIRE_ANNOUNCEMENT_SIGNATURES:
|
||||
handle_peer_announcement_signatures(peer, msg);
|
||||
goto done;
|
||||
return handle_peer_announcement_signatures(conn, peer, msg);
|
||||
case WIRE_CHANNEL_ANNOUNCEMENT:
|
||||
case WIRE_CHANNEL_UPDATE:
|
||||
case WIRE_NODE_ANNOUNCEMENT:
|
||||
/* Forward to gossip daemon */
|
||||
daemon_conn_send(&peer->gossip_client, msg);
|
||||
goto done;
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
case WIRE_UPDATE_ADD_HTLC:
|
||||
handle_peer_add_htlc(peer, msg);
|
||||
goto done;
|
||||
return handle_peer_add_htlc(conn, peer, msg);
|
||||
case WIRE_COMMITMENT_SIGNED:
|
||||
handle_peer_commit_sig(peer, msg);
|
||||
goto done;
|
||||
return handle_peer_commit_sig(conn, peer, msg);
|
||||
case WIRE_REVOKE_AND_ACK:
|
||||
handle_peer_revoke_and_ack(peer, msg);
|
||||
goto done;
|
||||
return handle_peer_revoke_and_ack(conn, peer, msg);
|
||||
case WIRE_UPDATE_FULFILL_HTLC:
|
||||
handle_peer_fulfill_htlc(peer, msg);
|
||||
goto done;
|
||||
return handle_peer_fulfill_htlc(conn, peer, msg);
|
||||
case WIRE_UPDATE_FAIL_HTLC:
|
||||
handle_peer_fail_htlc(peer, msg);
|
||||
goto done;
|
||||
return handle_peer_fail_htlc(conn, peer, msg);
|
||||
case WIRE_UPDATE_FAIL_MALFORMED_HTLC:
|
||||
handle_peer_fail_malformed_htlc(peer, msg);
|
||||
goto done;
|
||||
return handle_peer_fail_malformed_htlc(conn, peer, msg);
|
||||
case WIRE_PING:
|
||||
handle_ping(peer, msg);
|
||||
goto done;
|
||||
return handle_ping(conn, peer, msg);
|
||||
case WIRE_PONG:
|
||||
handle_pong(peer, msg);
|
||||
goto done;
|
||||
return handle_pong(conn, peer, msg);
|
||||
|
||||
case WIRE_INIT:
|
||||
case WIRE_ERROR:
|
||||
|
@ -973,9 +987,6 @@ badmessage:
|
|||
WIRE_CHANNEL_PEER_BAD_MESSAGE,
|
||||
"Peer sent unknown message %u (%s)",
|
||||
type, wire_type_name(type));
|
||||
|
||||
done:
|
||||
return peer_read_message(conn, &peer->pcs, peer_in);
|
||||
}
|
||||
|
||||
static struct io_plan *setup_peer_conn(struct io_conn *conn, struct peer *peer)
|
||||
|
|
Loading…
Add table
Reference in a new issue