diff --git a/connectd/connectd.c b/connectd/connectd.c index 01be81414..64dac1035 100644 --- a/connectd/connectd.c +++ b/connectd/connectd.c @@ -52,6 +52,7 @@ * thus may know how to reach certain peers. */ #define HSM_FD 3 #define GOSSIPCTL_FD 4 +#define GOSSIPCTL2_FD 5 /*~ In C convention, constants are UPPERCASE macros. Not everything needs to * be a constant, but it soothes the programmer's conscience to encapsulate @@ -1577,7 +1578,7 @@ static void connect_init(struct daemon *daemon, const u8 *msg) announcable))); #if DEVELOPER if (dev_disconnect) - dev_disconnect_init(5); + dev_disconnect_init(6); #endif } @@ -2001,6 +2002,15 @@ static void master_gone(struct daemon_conn *master UNUSED) exit(2); } +/*~ gossipd sends us gossip to send to the peers. */ +static struct io_plan *recv_gossip(struct io_conn *conn, + const u8 *msg, + struct daemon *daemon) +{ + /* FIXME! */ + return daemon_conn_read_next(conn, daemon->gossipd); +} + /*~ This is a hook used by the memleak code (if DEVELOPER=1): it can't see * pointers inside hash tables, so we give it a hint here. */ #if DEVELOPER @@ -2037,6 +2047,11 @@ int main(int argc, char *argv[]) * our status_ and failed messages. */ status_setup_async(daemon->master); + /* This streams gossip to and from gossipd */ + daemon->gossipd = daemon_conn_new(daemon, GOSSIPCTL2_FD, + recv_gossip, NULL, + daemon); + /* Set up ecdh() function so it uses our HSM fd, and calls * status_failed on error. */ ecdh_hsmd_setup(HSM_FD, status_failed); diff --git a/connectd/connectd.h b/connectd/connectd.h index aa151ea89..86800f1e9 100644 --- a/connectd/connectd.h +++ b/connectd/connectd.h @@ -126,6 +126,9 @@ struct daemon { /* Connection to main daemon. */ struct daemon_conn *master; + /* Connection to gossip daemon. */ + struct daemon_conn *gossipd; + /* Allow localhost to be considered "public": DEVELOPER-only option, * but for simplicity we don't #if DEVELOPER-wrap it here. */ bool dev_allow_localhost; diff --git a/lightningd/connect_control.c b/lightningd/connect_control.c index a8861aad1..e46305595 100644 --- a/lightningd/connect_control.c +++ b/lightningd/connect_control.c @@ -403,9 +403,9 @@ static void connect_init_done(struct subd *connectd, io_break(connectd); } -int connectd_init(struct lightningd *ld) +int connectd_init(struct lightningd *ld, int *gossipd_fd2) { - int fds[2]; + int fds[2], fds2[2]; u8 *msg; int hsmfd; struct wireaddr_internal *wireaddrs = ld->proposed_wireaddr; @@ -418,11 +418,16 @@ int connectd_init(struct lightningd *ld) if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds) != 0) fatal("Could not socketpair for connectd<->gossipd"); + if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fds2) != 0) + fatal("Could not socketpair for connectd<->gossipd 2"); + hsmfd = hsm_get_global_fd(ld, HSM_CAP_ECDH); ld->connectd = new_global_subd(ld, "lightning_connectd", connectd_wire_name, connectd_msg, - take(&hsmfd), take(&fds[1]), + take(&hsmfd), + take(&fds[1]), + take(&fds2[1]), #if DEVELOPER /* Not take(): we share it */ ld->dev_disconnect_fd >= 0 ? @@ -463,6 +468,7 @@ int connectd_init(struct lightningd *ld) /* Wait for init_reply */ io_loop(NULL, NULL); + *gossipd_fd2 = fds2[0]; return fds[0]; } diff --git a/lightningd/connect_control.h b/lightningd/connect_control.h index 67beb0037..681c5c7a1 100644 --- a/lightningd/connect_control.h +++ b/lightningd/connect_control.h @@ -7,7 +7,7 @@ struct pubkey; struct wireaddr_internal; /* Returns fd for gossipd to talk to connectd */ -int connectd_init(struct lightningd *ld); +int connectd_init(struct lightningd *ld, int *gossipd_fd2); void connectd_activate(struct lightningd *ld); void try_reconnect(struct channel *channel, u32 seconds_delay, diff --git a/lightningd/gossip_control.c b/lightningd/gossip_control.c index 3b13a1021..f6895fd69 100644 --- a/lightningd/gossip_control.c +++ b/lightningd/gossip_control.c @@ -239,7 +239,7 @@ static void gossipd_init_done(struct subd *gossipd, /* Create the `gossipd` subdaemon and send the initialization * message */ -void gossip_init(struct lightningd *ld, int connectd_fd) +void gossip_init(struct lightningd *ld, int connectd_fd, int connectd_fd2) { u8 *msg; int hsmfd; @@ -248,7 +248,10 @@ void gossip_init(struct lightningd *ld, int connectd_fd) ld->gossip = new_global_subd(ld, "lightning_gossipd", gossipd_wire_name, gossip_msg, - take(&hsmfd), take(&connectd_fd), NULL); + take(&hsmfd), + take(&connectd_fd), + take(&connectd_fd2), + NULL); if (!ld->gossip) err(1, "Could not subdaemon gossip"); diff --git a/lightningd/gossip_control.h b/lightningd/gossip_control.h index c1d587902..869f53930 100644 --- a/lightningd/gossip_control.h +++ b/lightningd/gossip_control.h @@ -8,7 +8,7 @@ struct channel; struct lightningd; -void gossip_init(struct lightningd *ld, int connectd_fd); +void gossip_init(struct lightningd *ld, int connectd_fd, int connectd_fd2); void gossipd_notify_spend(struct lightningd *ld, const struct short_channel_id *scid); diff --git a/lightningd/lightningd.c b/lightningd/lightningd.c index cedc20e77..b8ec5851f 100644 --- a/lightningd/lightningd.c +++ b/lightningd/lightningd.c @@ -850,7 +850,7 @@ int main(int argc, char *argv[]) { struct lightningd *ld; u32 min_blockheight, max_blockheight; - int connectd_gossipd_fd; + int connectd_gossipd_fd, connectd_gossipd_fd2; int stop_fd; struct timers *timers; const char *stop_response; @@ -1022,7 +1022,7 @@ int main(int argc, char *argv[]) * which knows (via node_announcement messages) the public * addresses of nodes, so connectd_init hands it one end of a * socket pair, and gives us the other */ - connectd_gossipd_fd = connectd_init(ld); + connectd_gossipd_fd = connectd_init(ld, &connectd_gossipd_fd2); /*~ We do every database operation within a transaction; usually this * is covered by the infrastructure (eg. opening a transaction before @@ -1074,7 +1074,7 @@ int main(int argc, char *argv[]) * channel_announcement, channel_update, node_announcement and gossip * queries. It also hands us the latest channel_updates for our * channels. */ - gossip_init(ld, connectd_gossipd_fd); + gossip_init(ld, connectd_gossipd_fd, connectd_gossipd_fd2); /*~ Create RPC socket: now lightning-cli can send us JSON RPC commands * over a UNIX domain socket specified by `ld->rpc_filename`. */ diff --git a/lightningd/test/run-find_my_abspath.c b/lightningd/test/run-find_my_abspath.c index 9cac29111..ac79fffe3 100644 --- a/lightningd/test/run-find_my_abspath.c +++ b/lightningd/test/run-find_my_abspath.c @@ -23,7 +23,7 @@ void channel_notify_new_block(struct lightningd *ld UNNEEDED, void connectd_activate(struct lightningd *ld UNNEEDED) { fprintf(stderr, "connectd_activate called!\n"); abort(); } /* Generated stub for connectd_init */ -int connectd_init(struct lightningd *ld UNNEEDED) +int connectd_init(struct lightningd *ld UNNEEDED, int *gossipd_fd2 UNNEEDED) { fprintf(stderr, "connectd_init called!\n"); abort(); } /* Generated stub for daemon_poll */ int daemon_poll(struct pollfd *fds UNNEEDED, nfds_t nfds UNNEEDED, int timeout UNNEEDED) @@ -92,7 +92,7 @@ bool fromwire_status_peer_error(const tal_t *ctx UNNEEDED, const void *p UNNEEDE bool fromwire_status_version(const tal_t *ctx UNNEEDED, const void *p UNNEEDED, wirestring **version UNNEEDED) { fprintf(stderr, "fromwire_status_version called!\n"); abort(); } /* Generated stub for gossip_init */ -void gossip_init(struct lightningd *ld UNNEEDED, int connectd_fd UNNEEDED) +void gossip_init(struct lightningd *ld UNNEEDED, int connectd_fd UNNEEDED, int connectd_fd2 UNNEEDED) { fprintf(stderr, "gossip_init called!\n"); abort(); } /* Generated stub for gossip_notify_new_block */ void gossip_notify_new_block(struct lightningd *ld UNNEEDED, u32 blockheight UNNEEDED)