gossipd: generalize query_short_channel_ids to use a callback.

We currently use a flag, but that's inflexible.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
Rusty Russell 2019-09-30 14:27:12 +09:30
parent c07dff21dc
commit 8b3a298ce6
2 changed files with 26 additions and 20 deletions

View File

@ -101,9 +101,9 @@ struct peer {
struct node_id *scid_query_nodes;
size_t scid_query_nodes_idx;
/* Do we have an scid_query outstanding? Was it internal? */
/* Do we have an scid_query outstanding? What to call when it's done? */
bool scid_query_outstanding;
bool scid_query_was_internal;
void (*scid_query_cb)(struct peer *peer, bool complete);
/* How many pongs are we expecting? */
size_t num_pings_outstanding;

View File

@ -146,7 +146,7 @@ static UNNEEDED bool encoding_end_external_type(u8 **encoded, u8 *type, size_t m
static bool query_short_channel_ids(struct daemon *daemon,
struct peer *peer,
const struct short_channel_id *scids,
bool internal)
void (*cb)(struct peer *peer, bool complete))
{
u8 *encoded, *msg;
@ -189,7 +189,7 @@ static bool query_short_channel_ids(struct daemon *daemon,
encoded, NULL);
queue_peer_msg(peer, take(msg));
peer->scid_query_outstanding = true;
peer->scid_query_was_internal = internal;
peer->scid_query_cb = cb;
status_debug("%s: sending query for %zu scids",
type_to_string(tmpctx, struct node_id, &peer->id),
@ -215,7 +215,7 @@ void query_unknown_channel(struct daemon *daemon,
tal_arr_expand(&daemon->unknown_scids, *id);
/* This is best effort: if peer is busy, we'll try next time. */
query_short_channel_ids(daemon, peer, daemon->unknown_scids, true);
query_short_channel_ids(daemon, peer, daemon->unknown_scids, NULL);
}
/* The peer can ask about an array of short channel ids: we don't assemble the
@ -630,6 +630,10 @@ const u8 *handle_reply_channel_range(struct peer *peer, const u8 *msg)
struct short_channel_id *scids;
size_t n;
unsigned long b;
void (*cb)(struct peer *peer,
u32 first_blocknum, u32 number_of_blocks,
const struct short_channel_id *scids,
bool complete);
struct tlv_reply_channel_range_tlvs *tlvs
= tlv_reply_channel_range_tlvs_new(tmpctx);
@ -728,15 +732,16 @@ const u8 *handle_reply_channel_range(struct peer *peer, const u8 *msg)
if (peer->range_blocks_remaining)
return NULL;
peer->query_channel_range_cb(peer,
first_blocknum,
number_of_blocks,
peer->query_channel_scids,
complete);
/* Clear these immediately in case cb want to queue more */
scids = tal_steal(tmpctx, peer->query_channel_scids);
cb = peer->query_channel_range_cb;
tal_steal(tmpctx, peer->query_channel_blocks);
peer->query_channel_scids = tal_free(peer->query_channel_scids);
peer->query_channel_blocks = tal_free(peer->query_channel_blocks);
peer->query_channel_scids = NULL;
peer->query_channel_blocks = NULL;
peer->query_channel_range_cb = NULL;
cb(peer, first_blocknum, number_of_blocks, scids, complete);
return NULL;
}
@ -768,13 +773,8 @@ const u8 *handle_reply_short_channel_ids_end(struct peer *peer, const u8 *msg)
}
peer->scid_query_outstanding = false;
/* If it wasn't generated by us, it's the dev interface from lightningd
*/
if (!peer->scid_query_was_internal) {
msg = towire_gossip_scids_reply(msg, true, complete);
daemon_conn_send(peer->daemon->master, take(msg));
}
if (peer->scid_query_cb)
peer->scid_query_cb(peer, complete);
/* All good, no error. */
return NULL;
@ -998,6 +998,12 @@ bool query_channel_range(struct daemon *daemon,
}
#if DEVELOPER
static void query_scids_done(struct peer *peer, bool complete)
{
const u8 *msg = towire_gossip_scids_reply(NULL, true, complete);
daemon_conn_send(peer->daemon->master, take(msg));
}
struct io_plan *query_scids_req(struct io_conn *conn,
struct daemon *daemon,
const u8 *msg)
@ -1016,7 +1022,7 @@ struct io_plan *query_scids_req(struct io_conn *conn,
daemon_conn_send(daemon->master,
take(towire_gossip_scids_reply(NULL,
false, false)));
} else if (!query_short_channel_ids(daemon, peer, scids, false))
} else if (!query_short_channel_ids(daemon, peer, scids, query_scids_done))
daemon_conn_send(daemon->master,
take(towire_gossip_scids_reply(NULL,
false, false)));