Browse Source

cryptomsg: add helpers to determine if we're partway through msg read/write.

For message read, we do it as header then body, so we can have
io_plan_in_started(conn) false, but we're between header and body.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 7 years ago
committed by Christian Decker
parent
commit
4e14185961
  1. 20
      common/cryptomsg.c
  2. 9
      common/cryptomsg.h

20
common/cryptomsg.c

@ -132,6 +132,8 @@ static struct io_plan *peer_decrypt_body(struct io_conn *conn,
struct io_plan *plan;
u8 *in, *decrypted;
pcs->reading_body = false;
decrypted = cryptomsg_decrypt_body(pcs->in, &pcs->cs, pcs->in);
if (!decrypted)
return io_close(conn);
@ -198,6 +200,8 @@ static struct io_plan *peer_decrypt_header(struct io_conn *conn,
tal_free(pcs->in);
pcs->reading_body = true;
/* BOLT #8:
*
* * Read _exactly_ `l+16` bytes from the network buffer, let
@ -224,6 +228,7 @@ struct io_plan *peer_read_message(struct io_conn *conn,
*
* * Read _exactly_ `18-bytes` from the network buffer.
*/
pcs->reading_body = false;
pcs->in = tal_arr(conn, u8, 18);
pcs->next_in = next;
return io_read(conn, pcs->in, 18, peer_decrypt_header, pcs);
@ -366,8 +371,23 @@ struct io_plan *peer_write_message(struct io_conn *conn,
return io_write(conn, pcs->out, tal_count(pcs->out), post, pcs);
}
/* We write in one op, so it's all or nothing. */
bool peer_out_started(const struct io_conn *conn,
const struct peer_crypto_state *cs)
{
return io_plan_out_started(conn);
}
/* We read in two parts, so we might have started body. */
bool peer_in_started(const struct io_conn *conn,
const struct peer_crypto_state *cs)
{
return io_plan_in_started(conn) || cs->reading_body;
}
void init_peer_crypto_state(struct peer *peer, struct peer_crypto_state *pcs)
{
pcs->peer = peer;
pcs->out = pcs->in = NULL;
pcs->reading_body = false;
}

9
common/cryptomsg.h

@ -14,6 +14,9 @@ struct peer_crypto_state {
/* Peer who owns us: peer->crypto_state == this */
struct peer *peer;
/* Where we are up to in reading (we do in two parts). */
bool reading_body;
/* Output and input buffers. */
u8 *out, *in;
struct io_plan *(*next_in)(struct io_conn *, struct peer *, u8 *);
@ -30,6 +33,12 @@ struct io_plan *peer_read_message(struct io_conn *conn,
struct peer *,
u8 *msg));
/* Have we already started writing/reading a message? */
bool peer_out_started(const struct io_conn *conn,
const struct peer_crypto_state *cs);
bool peer_in_started(const struct io_conn *conn,
const struct peer_crypto_state *cs);
/* Sends message: frees if taken(msg). */
struct io_plan *peer_write_message(struct io_conn *conn,
struct peer_crypto_state *cs,

Loading…
Cancel
Save