From 797da4805f1a7512119ffb102c2818356156c843 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 25 Jan 2022 06:39:52 +1030 Subject: [PATCH] gossipd: send all gossip msgs directly to connectd, not peer. Signed-off-by: Rusty Russell --- gossipd/gossipd.c | 12 ++++++------ gossipd/queries.c | 22 +++++++++++++++++++--- gossipd/queries.h | 4 ++-- gossipd/test/run-onion_message.c | 2 +- 4 files changed, 28 insertions(+), 12 deletions(-) diff --git a/gossipd/gossipd.c b/gossipd/gossipd.c index 88ab7bab3..0e8153ffa 100644 --- a/gossipd/gossipd.c +++ b/gossipd/gossipd.c @@ -125,8 +125,8 @@ void queue_peer_msg(struct peer *peer, const u8 *msg TAKES) u8 *outermsg = towire_gossipd_send_gossip(NULL, &peer->id, msg); daemon_conn_send(peer->daemon->connectd2, take(outermsg)); - /* FIXME: backwards compat! */ - daemon_conn_send(peer->dc, msg); + if (taken(msg)) + tal_free(msg); } /*~ We have a helper for messages from the store. */ @@ -798,11 +798,10 @@ static struct io_plan *connectd_new_peer(struct io_conn *conn, list_add_tail(&peer->daemon->peers, &peer->list); tal_add_destructor(peer, destroy_peer); - /* This is the new connection: calls maybe_send_query_responses when - * nothing else to send. */ + /* This is the new connection. */ peer->dc = daemon_conn_new(daemon, fds[0], peer_msg_in, - maybe_send_query_responses, peer); + NULL, peer); /* Free peer if conn closed (destroy_peer closes conn if peer freed) */ tal_steal(peer->dc, peer); @@ -1157,7 +1156,8 @@ static void gossip_init(struct daemon *daemon, const u8 *msg) /* connectd is already started, and uses this fd to ask us things. */ daemon->connectd = daemon_conn_new(daemon, CONNECTD_FD, - connectd_req, NULL, daemon); + connectd_req, + maybe_send_query_responses, daemon); daemon->connectd2 = daemon_conn_new(daemon, CONNECTD2_FD, connectd_gossip_req, NULL, daemon); diff --git a/gossipd/queries.c b/gossipd/queries.c index ccd8e2dc6..436ee9b2c 100644 --- a/gossipd/queries.c +++ b/gossipd/queries.c @@ -335,8 +335,8 @@ const u8 *handle_query_short_channel_ids(struct peer *peer, const u8 *msg) peer->scid_query_idx = 0; peer->scid_query_nodes = tal_arr(peer, struct node_id, 0); - /* Notify the daemon_conn-write loop to invoke create_next_scid_reply */ - daemon_conn_wake(peer->dc); + /* Notify the daemon_conn-write loop to invoke maybe_send_query_responses_peer */ + daemon_conn_wake(peer->daemon->connectd); return NULL; } @@ -985,7 +985,7 @@ static void uniquify_node_ids(struct node_id **ids) /* We are fairly careful to avoid the peer DoSing us with channel queries: * this routine sends information about a single short_channel_id, unless * it's finished all of them. */ -void maybe_send_query_responses(struct peer *peer) +static bool maybe_send_query_responses_peer(struct peer *peer) { struct routing_state *rstate = peer->daemon->rstate; size_t i, num; @@ -1119,6 +1119,22 @@ void maybe_send_query_responses(struct peer *peer) peer->scid_query_nodes = tal_free(peer->scid_query_nodes); peer->scid_query_nodes_idx = 0; } + return sent; +} + +void maybe_send_query_responses(struct daemon *daemon) +{ + /* Rotate through, so we don't favor a single peer. */ + struct list_head used; + struct peer *p; + + list_head_init(&used); + while ((p = list_pop(&daemon->peers, struct peer, list)) != NULL) { + list_add(&used, &p->list); + if (maybe_send_query_responses_peer(p)) + break; + } + list_append_list(&daemon->peers, &used); } bool query_channel_range(struct daemon *daemon, diff --git a/gossipd/queries.h b/gossipd/queries.h index 14ea121ae..1e4019f11 100644 --- a/gossipd/queries.h +++ b/gossipd/queries.h @@ -16,8 +16,8 @@ const u8 *handle_reply_short_channel_ids_end(struct peer *peer, const u8 *msg); const u8 *handle_query_channel_range(struct peer *peer, const u8 *msg); const u8 *handle_reply_channel_range(struct peer *peer, const u8 *msg); -/* This called when the peer is idle. */ -void maybe_send_query_responses(struct peer *peer); +/* This called when the connectd is idle. */ +void maybe_send_query_responses(struct daemon *daemon); /* BOLT #7: * diff --git a/gossipd/test/run-onion_message.c b/gossipd/test/run-onion_message.c index f1bedb5c7..13e47d554 100644 --- a/gossipd/test/run-onion_message.c +++ b/gossipd/test/run-onion_message.c @@ -210,7 +210,7 @@ void master_badmsg(u32 type_expected UNNEEDED, const u8 *msg) void maybe_send_own_node_announce(struct daemon *daemon UNNEEDED, bool startup UNNEEDED) { fprintf(stderr, "maybe_send_own_node_announce called!\n"); abort(); } /* Generated stub for maybe_send_query_responses */ -void maybe_send_query_responses(struct peer *peer UNNEEDED) +void maybe_send_query_responses(struct daemon *daemon UNNEEDED) { fprintf(stderr, "maybe_send_query_responses called!\n"); abort(); } /* Generated stub for memleak_find_allocations */ struct htable *memleak_find_allocations(const tal_t *ctx UNNEEDED,