Skip to content

Commit

Permalink
connectd: temporarily have two fds to gossipd.
Browse files Browse the repository at this point in the history
We want to stream gossip through this, but currently connectd treats the
fd as synchronous.  While we work on getting rid of that, it's easiest to
have two fds.

Signed-off-by: Rusty Russell <[email protected]>
  • Loading branch information
rustyrussell committed Feb 8, 2022
1 parent 4dc72dd commit bba468a
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 13 deletions.
17 changes: 16 additions & 1 deletion connectd/connectd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions connectd/connectd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
12 changes: 9 additions & 3 deletions lightningd/connect_control.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 ?
Expand Down Expand Up @@ -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];
}

Expand Down
2 changes: 1 addition & 1 deletion lightningd/connect_control.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
7 changes: 5 additions & 2 deletions lightningd/gossip_control.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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");

Expand Down
2 changes: 1 addition & 1 deletion lightningd/gossip_control.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 3 additions & 3 deletions lightningd/lightningd.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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`. */
Expand Down
4 changes: 2 additions & 2 deletions lightningd/test/run-find_my_abspath.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand Down

0 comments on commit bba468a

Please sign in to comment.