mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-01-18 05:12:45 +01:00
lightningd/gossip: use daemon_conn for master daemon interaction.
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
parent
6dd07801d4
commit
1f894b6234
@ -35,7 +35,9 @@
|
|||||||
|
|
||||||
struct daemon {
|
struct daemon {
|
||||||
struct list_head peers;
|
struct list_head peers;
|
||||||
u8 *msg_in;
|
|
||||||
|
/* Connection to main daemon. */
|
||||||
|
struct daemon_conn master;
|
||||||
|
|
||||||
/* Routing information */
|
/* Routing information */
|
||||||
struct routing_state *rstate;
|
struct routing_state *rstate;
|
||||||
@ -352,8 +354,10 @@ static struct io_plan *peer_parse_init(struct io_conn *conn,
|
|||||||
* Each node MUST wait to receive `init` before sending any other
|
* Each node MUST wait to receive `init` before sending any other
|
||||||
* messages.
|
* messages.
|
||||||
*/
|
*/
|
||||||
status_send(towire_gossipstatus_peer_ready(msg, peer->unique_id));
|
daemon_conn_send(&peer->daemon->master,
|
||||||
status_send_fd(client_fd);
|
take(towire_gossipstatus_peer_ready(msg,
|
||||||
|
peer->unique_id)));
|
||||||
|
daemon_conn_send_fd(&peer->daemon->master, client_fd);
|
||||||
|
|
||||||
/* Need to go duplex here, otherwise backpressure would mean
|
/* Need to go duplex here, otherwise backpressure would mean
|
||||||
* we both wait indefinitely */
|
* we both wait indefinitely */
|
||||||
@ -382,8 +386,6 @@ static struct io_plan *peer_send_init(struct io_conn *conn, struct peer *peer)
|
|||||||
peer_init_sent);
|
peer_init_sent);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct io_plan *next_req_in(struct io_conn *conn, struct daemon *daemon);
|
|
||||||
|
|
||||||
static struct io_plan *new_peer_got_fd(struct io_conn *conn, struct peer *peer)
|
static struct io_plan *new_peer_got_fd(struct io_conn *conn, struct peer *peer)
|
||||||
{
|
{
|
||||||
peer->conn = io_new_conn(conn, peer->fd, peer_send_init, peer);
|
peer->conn = io_new_conn(conn, peer->fd, peer_send_init, peer);
|
||||||
@ -391,7 +393,7 @@ static struct io_plan *new_peer_got_fd(struct io_conn *conn, struct peer *peer)
|
|||||||
peer->error = "Could not create connection";
|
peer->error = "Could not create connection";
|
||||||
tal_free(peer);
|
tal_free(peer);
|
||||||
}
|
}
|
||||||
return next_req_in(conn, peer->daemon);
|
return daemon_conn_read_next(conn,&peer->daemon->master);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct io_plan *new_peer(struct io_conn *conn, struct daemon *daemon,
|
static struct io_plan *new_peer(struct io_conn *conn, struct daemon *daemon,
|
||||||
@ -404,15 +406,6 @@ static struct io_plan *new_peer(struct io_conn *conn, struct daemon *daemon,
|
|||||||
return io_recv_fd(conn, &peer->fd, new_peer_got_fd, peer);
|
return io_recv_fd(conn, &peer->fd, new_peer_got_fd, peer);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct io_plan *release_peer_fd(struct io_conn *conn, struct peer *peer)
|
|
||||||
{
|
|
||||||
int fd = peer->fd;
|
|
||||||
|
|
||||||
/* This will be closed after sending. */
|
|
||||||
peer->fd = -1;
|
|
||||||
return io_send_fd(conn, fd, true, next_req_in, peer->daemon);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct io_plan *release_peer(struct io_conn *conn, struct daemon *daemon,
|
static struct io_plan *release_peer(struct io_conn *conn, struct daemon *daemon,
|
||||||
const u8 *msg)
|
const u8 *msg)
|
||||||
{
|
{
|
||||||
@ -436,7 +429,10 @@ static struct io_plan *release_peer(struct io_conn *conn, struct daemon *daemon,
|
|||||||
unique_id,
|
unique_id,
|
||||||
&peer->pcs.cs);
|
&peer->pcs.cs);
|
||||||
peer->local = false;
|
peer->local = false;
|
||||||
return io_write_wire(conn, out, release_peer_fd, peer);
|
daemon_conn_send(&daemon->master, take(out));
|
||||||
|
daemon_conn_send_fd(&daemon->master, peer->fd);
|
||||||
|
peer->fd = -1;
|
||||||
|
return daemon_conn_read_next(conn, &daemon->master);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
status_failed(WIRE_GOSSIPSTATUS_BAD_RELEASE_REQUEST,
|
status_failed(WIRE_GOSSIPSTATUS_BAD_RELEASE_REQUEST,
|
||||||
@ -463,22 +459,24 @@ static struct io_plan *getnodes(struct io_conn *conn, struct daemon *daemon)
|
|||||||
n = node_map_next(daemon->rstate->nodes, &i);
|
n = node_map_next(daemon->rstate->nodes, &i);
|
||||||
}
|
}
|
||||||
out = towire_gossip_getnodes_reply(daemon, nodes);
|
out = towire_gossip_getnodes_reply(daemon, nodes);
|
||||||
|
daemon_conn_send(&daemon->master, take(out));
|
||||||
tal_free(tmpctx);
|
tal_free(tmpctx);
|
||||||
return io_write_wire(conn, take(out), next_req_in, daemon);
|
return daemon_conn_read_next(conn, &daemon->master);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct io_plan *recv_req(struct io_conn *conn, struct daemon *daemon)
|
static struct io_plan *recv_req(struct io_conn *conn, struct daemon_conn *master)
|
||||||
{
|
{
|
||||||
enum gossip_wire_type t = fromwire_peektype(daemon->msg_in);
|
struct daemon *daemon = container_of(master, struct daemon, master);
|
||||||
|
enum gossip_wire_type t = fromwire_peektype(master->msg_in);
|
||||||
|
|
||||||
status_trace("req: type %s len %zu",
|
status_trace("req: type %s len %zu",
|
||||||
gossip_wire_type_name(t), tal_count(daemon->msg_in));
|
gossip_wire_type_name(t), tal_count(master->msg_in));
|
||||||
|
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case WIRE_GOSSIPCTL_NEW_PEER:
|
case WIRE_GOSSIPCTL_NEW_PEER:
|
||||||
return new_peer(conn, daemon, daemon->msg_in);
|
return new_peer(conn, daemon, master->msg_in);
|
||||||
case WIRE_GOSSIPCTL_RELEASE_PEER:
|
case WIRE_GOSSIPCTL_RELEASE_PEER:
|
||||||
return release_peer(conn, daemon, daemon->msg_in);
|
return release_peer(conn, daemon, master->msg_in);
|
||||||
|
|
||||||
case WIRE_GOSSIP_GETNODES_REQUEST:
|
case WIRE_GOSSIP_GETNODES_REQUEST:
|
||||||
return getnodes(conn, daemon);
|
return getnodes(conn, daemon);
|
||||||
@ -500,12 +498,6 @@ static struct io_plan *recv_req(struct io_conn *conn, struct daemon *daemon)
|
|||||||
status_failed(WIRE_GOSSIPSTATUS_BAD_REQUEST, "%i", t);
|
status_failed(WIRE_GOSSIPSTATUS_BAD_REQUEST, "%i", t);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct io_plan *next_req_in(struct io_conn *conn, struct daemon *daemon)
|
|
||||||
{
|
|
||||||
daemon->msg_in = tal_free(daemon->msg_in);
|
|
||||||
return io_read_wire(conn, daemon, &daemon->msg_in, recv_req, daemon);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef TESTING
|
#ifndef TESTING
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@ -530,12 +522,10 @@ int main(int argc, char *argv[])
|
|||||||
daemon->rstate = new_routing_state(daemon, base_log);
|
daemon->rstate = new_routing_state(daemon, base_log);
|
||||||
list_head_init(&daemon->peers);
|
list_head_init(&daemon->peers);
|
||||||
timers_init(&daemon->timers, time_mono());
|
timers_init(&daemon->timers, time_mono());
|
||||||
daemon->msg_in = NULL;
|
|
||||||
|
|
||||||
/* stdin == control */
|
/* stdin == control */
|
||||||
status_setup(STDIN_FILENO);
|
status_setup(STDIN_FILENO);
|
||||||
io_new_conn(NULL, STDIN_FILENO, next_req_in, daemon);
|
daemon_conn_init(daemon, &daemon->master, STDIN_FILENO, recv_req);
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
struct timer *expired = NULL;
|
struct timer *expired = NULL;
|
||||||
io_loop(&daemon->timers, &expired);
|
io_loop(&daemon->timers, &expired);
|
||||||
|
Loading…
Reference in New Issue
Block a user