Browse Source

lightningd/peer_control: keep cryptostate.

Like the fd, it's only useful when the peer is not in a daemon, so we
free & NULL it when that happens.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
ppa-0.6.1
Rusty Russell 8 years ago
parent
commit
1e36a19164
  1. 5
      lightningd/gossip_control.c
  2. 32
      lightningd/peer_control.c
  3. 9
      lightningd/peer_control.h

5
lightningd/gossip_control.c

@ -87,12 +87,15 @@ static void peer_nongossip(struct subd *gossip, const u8 *msg,
/* It returned the fd. */
assert(peer->fd == -1);
peer->fd = peer_fd;
assert(peer->cs == NULL);
peer->cs = tal_dup(peer, struct crypto_state, &cs);
peer->gossip_client_fd = gossip_fd;
log_info(peer->log, "Gossip ended up receipt of %s",
wire_type_name(fromwire_peektype(inner)));
peer_accept_open(peer, &cs, inner);
peer_accept_open(peer, inner);
}
static int gossip_msg(struct subd *gossip, const u8 *msg, const int *fds)

32
lightningd/peer_control.c

@ -94,6 +94,7 @@ void add_peer(struct lightningd *ld, u64 unique_id,
peer->scid = NULL;
peer->id = tal_dup(peer, struct pubkey, id);
peer->fd = fd;
peer->cs = tal_dup(peer, struct crypto_state, cs);
peer->funding_txid = NULL;
peer->seed = NULL;
peer->balance = NULL;
@ -125,12 +126,13 @@ void add_peer(struct lightningd *ld, u64 unique_id,
tal_steal(peer->owner, peer);
peer_set_condition(peer, UNINITIALIZED, GOSSIPD);
msg = towire_gossipctl_new_peer(peer, peer->unique_id, cs);
msg = towire_gossipctl_new_peer(peer, peer->unique_id, peer->cs);
subd_send_msg(peer->ld->gossip, take(msg));
subd_send_fd(peer->ld->gossip, peer->fd);
/* Peer struct longer owns fd. */
peer->fd = -1;
peer->cs = tal_free(peer->cs);
}
struct peer *peer_by_unique_id(struct lightningd *ld, u64 unique_id)
@ -428,7 +430,6 @@ struct funding_channel {
const struct utxo **utxomap;
u64 change;
u32 change_keyindex;
struct crypto_state *cs;
struct pubkey local_fundingkey, remote_fundingkey;
struct bitcoin_tx *funding_tx;
@ -1332,6 +1333,7 @@ static bool peer_start_channeld_hsmfd(struct subd *hsm, const u8 *resp,
return true;
}
cds->peer->fd = -1;
cds->peer->cs = tal_free(cds->peer->cs);
log_debug(cds->peer->log, "Waiting for funding confirmations");
peer_set_condition(cds->peer, GETTING_HSMFD, CHANNELD_AWAITING_LOCKIN);
@ -1377,7 +1379,6 @@ static bool opening_release_tx(struct subd *opening, const u8 *resp,
u8 *msg;
size_t i;
struct channel_config their_config;
struct crypto_state crypto_state;
secp256k1_ecdsa_signature commit_sig;
struct pubkey their_per_commit_point;
struct basepoints theirbase;
@ -1387,11 +1388,12 @@ static bool opening_release_tx(struct subd *opening, const u8 *resp,
assert(tal_count(fds) == 1);
fc->peer->fd = fds[0];
fc->peer->cs = tal(fc->peer, struct crypto_state);
if (!fromwire_opening_open_funding_reply(resp, NULL,
&their_config,
&commit_sig,
&crypto_state,
fc->peer->cs,
&theirbase.revocation,
&theirbase.payment,
&theirbase.delayed_payment,
@ -1422,7 +1424,7 @@ static bool opening_release_tx(struct subd *opening, const u8 *resp,
&fc->peer->our_config,
&their_config,
&commit_sig,
&crypto_state,
fc->peer->cs,
&fc->remote_fundingkey,
&theirbase.revocation,
&theirbase.payment,
@ -1491,7 +1493,6 @@ static bool opening_accept_finish_response(struct subd *opening,
{
struct channel_config their_config;
secp256k1_ecdsa_signature first_commit_sig;
struct crypto_state crypto_state;
struct basepoints theirbase;
struct pubkey remote_fundingkey, their_per_commit_point;
struct config *cfg = &peer->ld->dstate.config;
@ -1500,12 +1501,13 @@ static bool opening_accept_finish_response(struct subd *opening,
log_debug(peer->log, "Got opening_accept_finish_response");
assert(tal_count(fds) == 1);
peer->fd = fds[0];
peer->cs = tal(peer, struct crypto_state);
if (!fromwire_opening_accept_finish_reply(reply, NULL,
&peer->funding_outnum,
&their_config,
&first_commit_sig,
&crypto_state,
peer->cs,
&remote_fundingkey,
&theirbase.revocation,
&theirbase.payment,
@ -1524,7 +1526,7 @@ static bool opening_accept_finish_response(struct subd *opening,
&peer->our_config,
&their_config,
&first_commit_sig,
&crypto_state,
peer->cs,
&remote_fundingkey,
&theirbase.revocation,
&theirbase.payment,
@ -1620,8 +1622,7 @@ static void channel_config(struct lightningd *ld,
};
/* Peer has spontaneously exited from gossip due to msg */
void peer_accept_open(struct peer *peer,
const struct crypto_state *cs, const u8 *from_peer)
void peer_accept_open(struct peer *peer, const u8 *from_peer)
{
struct lightningd *ld = peer->ld;
u32 max_to_self_delay, max_minimum_depth;
@ -1670,7 +1671,8 @@ void peer_accept_open(struct peer *peer,
msg = towire_opening_init(peer, &peer->our_config,
max_to_self_delay,
min_effective_htlc_capacity_msat,
cs, peer->seed);
peer->cs, peer->seed);
peer->cs = tal_free(peer->cs);
subd_send_msg(peer->owner, take(msg));
msg = towire_opening_accept(peer, peer->minimum_depth,
@ -1699,10 +1701,10 @@ static bool gossip_peer_released(struct subd *gossip,
assert(tal_count(fds) == 2);
fc->peer->fd = fds[0];
fc->peer->cs = tal(fc, struct crypto_state);
fc->peer->gossip_client_fd = fds[1];
fc->cs = tal(fc, struct crypto_state);
if (!fromwire_gossipctl_release_peer_reply(resp, NULL, &id, fc->cs))
if (!fromwire_gossipctl_release_peer_reply(resp, NULL, &id, fc->peer->cs))
fatal("Gossup daemon gave invalid reply %s",
tal_hex(gossip, resp));
@ -1737,12 +1739,14 @@ static bool gossip_peer_released(struct subd *gossip,
msg = towire_opening_init(fc, &fc->peer->our_config,
max_to_self_delay,
min_effective_htlc_capacity_msat,
fc->cs, fc->peer->seed);
fc->peer->cs, fc->peer->seed);
fc->peer->funding_satoshi = fc->satoshi;
/* FIXME: Support push_msat? */
fc->peer->push_msat = 0;
fc->peer->cs = tal_free(fc->peer->cs);
subd_send_msg(opening, take(msg));
/* FIXME: Real feerate! */
msg = towire_opening_open(fc, fc->peer->funding_satoshi,

9
lightningd/peer_control.h

@ -42,6 +42,9 @@ struct peer {
/* Our fd to the peer (-1 when we don't have it). */
int fd;
/* Crypto state (NULL if it's in daemon) */
struct crypto_state *cs;
/* Where we connected to, or it connected from. */
struct netaddr netaddr;
@ -62,6 +65,9 @@ struct peer {
/* Channel balance (LOCAL and REMOTE); if we have one. */
u64 *balance;
/* Keys for channel. */
struct channel_info *channel_info;
/* Secret seed (FIXME: Move to hsm!) */
struct privkey *seed;
@ -112,8 +118,7 @@ struct peer *peer_from_json(struct lightningd *ld,
const char *buffer,
jsmntok_t *peeridtok);
void peer_accept_open(struct peer *peer,
const struct crypto_state *cs, const u8 *msg);
void peer_accept_open(struct peer *peer, const u8 *msg);
void add_peer(struct lightningd *ld, u64 unique_id,
int fd, const struct pubkey *id,

Loading…
Cancel
Save