From 0bb183e0281e19c74534056e4d0c77cb7899c680 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 18 Aug 2016 14:25:13 +0930 Subject: [PATCH] peer: split and expose new_peer function. More of a pure allocator, for when we load peers from db. Also moves shachain_init out of secrets and into new_peer where it logically belongs. Signed-off-by: Rusty Russell --- daemon/peer.c | 83 +++++++++++++++++++++++++++--------------------- daemon/peer.h | 4 +++ daemon/secrets.c | 1 - 3 files changed, 50 insertions(+), 38 deletions(-) diff --git a/daemon/peer.c b/daemon/peer.c index ecff327a3..283d7cb9b 100644 --- a/daemon/peer.c +++ b/daemon/peer.c @@ -1941,26 +1941,19 @@ static bool peer_reconnected(struct peer *peer, return true; } -static struct peer *new_peer(struct lightningd_state *dstate, - struct io_conn *conn, - int addr_type, int addr_protocol, - enum state_input offer_anchor, - bool we_connected) +struct peer *new_peer(struct lightningd_state *dstate, + enum state state, + enum state_input offer_anchor) { struct peer *peer = tal(dstate, struct peer); assert(offer_anchor == CMD_OPEN_WITH_ANCHOR || offer_anchor == CMD_OPEN_WITHOUT_ANCHOR); - /* FIXME: Stop listening if too many peers? */ - list_add(&dstate->peers, &peer->list); - - peer->state = STATE_INIT; + peer->state = state; peer->connected = false; peer->id = NULL; peer->dstate = dstate; - peer->addr.type = addr_type; - peer->addr.protocol = addr_protocol; peer->io_data = NULL; peer->secrets = NULL; list_head_init(&peer->watches); @@ -1985,47 +1978,66 @@ static struct peer *new_peer(struct lightningd_state *dstate, peer->onchain.wscripts = NULL; peer->commit_timer = NULL; peer->nc = NULL; + peer->log = NULL; peer->their_prev_revocation_hash = NULL; - /* Make it different from other node (to catch bugs!), but a - * round number for simple eyeballing. */ - peer->htlc_id_counter = pseudorand(1ULL << 32) * 1000; - - /* If we free peer, conn should be closed, but can't be freed - * immediately so don't make peer a parent. */ - peer->conn = conn; + peer->conn = NULL; peer->fake_close = false; peer->output_enabled = true; - io_set_finish(conn, peer_disconnect, peer); - peer->local.offer_anchor = offer_anchor; if (!blocks_to_rel_locktime(dstate->config.locktime_blocks, &peer->local.locktime)) fatal("Could not convert locktime_blocks"); peer->local.mindepth = dstate->config.anchor_confirms; + peer->local.commit = peer->remote.commit = NULL; + peer->local.staging_cstate = peer->remote.staging_cstate = NULL; + + htlc_map_init(&peer->htlcs); + shachain_init(&peer->their_preimages); + + list_add(&dstate->peers, &peer->list); + tal_add_destructor(peer, destroy_peer); + return peer; +} + +static bool peer_first_connected(struct peer *peer, + struct io_conn *conn, + int addr_type, int addr_protocol, + struct io_data *iod, + const struct pubkey *id, + bool we_connected) +{ + peer->io_data = tal_steal(peer, iod); + peer->id = tal_dup(peer, struct pubkey, id); /* FIXME: Make this dynamic! */ peer->local.commit_fee_rate = get_feerate(peer->dstate) * peer->dstate->config.commitment_fee_percent / 100; - peer->local.commit = peer->remote.commit = NULL; - peer->local.staging_cstate = peer->remote.staging_cstate = NULL; - peer->anchor.min_depth = get_block_height(peer->dstate); - htlc_map_init(&peer->htlcs); + /* Make it different from other node (to catch bugs!), but a + * round number for simple eyeballing. */ + peer->htlc_id_counter = pseudorand(1ULL << 32) * 1000; + + /* If we free peer, conn should be closed, but can't be freed + * immediately so don't make peer a parent. */ + peer->conn = conn; + io_set_finish(conn, peer_disconnect, peer); /* FIXME: Attach IO logging for this peer. */ - tal_add_destructor(peer, destroy_peer); + peer->addr.type = addr_type; + peer->addr.protocol = addr_protocol; peer->addr.addrlen = sizeof(peer->addr.saddr); if (getpeername(io_conn_fd(conn), &peer->addr.saddr.s, &peer->addr.addrlen) != 0) { - log_unusual(dstate->base_log, + log_unusual(peer->dstate->base_log, "Could not get address for peer: %s", strerror(errno)); return tal_free(peer); } + peer->anchor.min_depth = get_block_height(peer->dstate); - peer->log = new_log(peer, dstate->log_record, "%s%s:%s:", - log_prefix(dstate->base_log), + peer->log = new_log(peer, peer->dstate->log_record, "%s%s:%s:", + log_prefix(peer->dstate->base_log), we_connected ? "out" : "in", netaddr_name(peer, &peer->addr)); @@ -2063,7 +2075,6 @@ struct htlc *peer_new_htlc(struct peer *peer, { struct htlc *h = tal(peer, struct htlc); h->peer = peer; - assert(state == SENT_ADD_HTLC || state == RCVD_ADD_HTLC); h->state = state; h->id = id; h->msatoshis = msatoshis; @@ -2191,9 +2202,9 @@ static struct io_plan *crypto_on_out(struct io_conn *conn, struct json_connecting *connect) { /* Initiator currently funds channel */ - struct peer *peer = new_peer(dstate, conn, SOCK_STREAM, IPPROTO_TCP, - CMD_OPEN_WITH_ANCHOR, true); - if (!peer) { + struct peer *peer = new_peer(dstate, STATE_INIT, CMD_OPEN_WITH_ANCHOR); + if (!peer_first_connected(peer, conn, SOCK_STREAM, IPPROTO_TCP, + iod, id, true)) { command_fail(connect->cmd, "Failed to make peer for %s:%s", connect->name, connect->port); return io_close(conn); @@ -2243,13 +2254,11 @@ static struct io_plan *crypto_on_in(struct io_conn *conn, } /* Initiator currently funds channel */ - peer = new_peer(dstate, conn, SOCK_STREAM, IPPROTO_TCP, - CMD_OPEN_WITHOUT_ANCHOR, false); - if (!peer) + peer = new_peer(dstate, STATE_INIT, CMD_OPEN_WITHOUT_ANCHOR); + if (!peer_first_connected(peer, conn, SOCK_STREAM, IPPROTO_TCP, + iod, id, false)) return io_close(conn); - peer->io_data = tal_steal(peer, iod); - peer->id = tal_dup(peer, struct pubkey, id); return peer_crypto_on(conn, peer); } diff --git a/daemon/peer.h b/daemon/peer.h index daadeb3c7..2172e6532 100644 --- a/daemon/peer.h +++ b/daemon/peer.h @@ -232,6 +232,10 @@ void setup_listeners(struct lightningd_state *dstate, unsigned int portnum); struct peer *find_peer(struct lightningd_state *dstate, const struct pubkey *id); +struct peer *new_peer(struct lightningd_state *dstate, + enum state state, + enum state_input offer_anchor); + /* Populates very first peer->{local,remote}.commit->{tx,cstate} */ bool setup_first_commit(struct peer *peer); diff --git a/daemon/secrets.c b/daemon/secrets.c index 81a3ec862..784c3b0b1 100644 --- a/daemon/secrets.c +++ b/daemon/secrets.c @@ -157,7 +157,6 @@ void peer_secrets_init(struct peer *peer) new_keypair(peer->dstate, &peer->secrets->commit, &peer->local.commitkey); new_keypair(peer->dstate, &peer->secrets->final, &peer->local.finalkey); randombytes_buf(peer->secrets->revocation_seed.u.u8, sizeof(peer->secrets->revocation_seed.u.u8)); - shachain_init(&peer->their_preimages); } void peer_get_revocation_preimage(const struct peer *peer, u64 index,