MCPcopy Create free account
hub / github.com/ElementsProject/lightning / get_unannounced_nodes

Function get_unannounced_nodes

gossipd/seeker.c:481–544  ·  view source on GitHub ↗

We can't ask for channels by node_id, so probe at random */

Source from the content-addressed store, hash-verified

479
480/* We can't ask for channels by node_id, so probe at random */
481static bool get_unannounced_nodes(const tal_t *ctx,
482 struct daemon *daemon,
483 size_t max,
484 struct short_channel_id **scids,
485 u8 **query_flags)
486{
487 size_t num = 0, off, max_idx;
488 struct gossmap *gossmap = gossmap_manage_get_gossmap(daemon->gm);
489
490 /* No nodes? Nothing to ask for */
491 max_idx = gossmap_max_node_idx(gossmap);
492 if (max_idx == 0 || max == 0)
493 return false;
494
495 /* Start at random index */
496 off = pseudorand(max_idx);
497 *scids = tal_arr(ctx, struct short_channel_id, max);
498
499 for (size_t i = 0; i < max_idx; i++) {
500 const struct gossmap_node *node = gossmap_node_byidx(gossmap, (off + i) % max_idx);
501 const struct gossmap_chan *chan;
502
503 if (!node)
504 continue;
505 if (gossmap_node_announced(node))
506 continue;
507
508 /* Query first chan. */
509 chan = gossmap_nth_chan(gossmap, node, 0, NULL);
510 (*scids)[num++] = gossmap_chan_scid(gossmap, chan);
511
512 if (num == max)
513 break;
514 }
515
516 if (num == 0) {
517 *scids = tal_free(*scids);
518 return false;
519 }
520
521 if (num < max)
522 tal_resize(scids, num);
523
524 /* Sort them into order, and remove duplicates! */
525 asort(*scids, num, cmp_scid, NULL);
526 for (size_t i = 1; i < tal_count(*scids); i++) {
527 if (short_channel_id_eq((*scids)[i], (*scids)[i-1])) {
528 tal_arr_remove(scids, i);
529 }
530 }
531
532 /* Now get flags. */
533 *query_flags = tal_arr(ctx, u8, tal_count(*scids));
534 for (size_t i = 0; i < tal_count(*scids); i++) {
535 const struct gossmap_chan *chan = gossmap_find_chan(gossmap, &(*scids)[i]);
536
537 (*query_flags)[i] = 0;
538 if (!gossmap_node_announced(gossmap_nth_node(gossmap, chan, 0)))

Callers 2

nodeannounce_query_doneFunction · 0.85
process_scid_probeFunction · 0.85

Calls 10

gossmap_max_node_idxFunction · 0.85
gossmap_node_byidxFunction · 0.85
gossmap_node_announcedFunction · 0.85
gossmap_nth_chanFunction · 0.85
gossmap_chan_scidFunction · 0.85
tal_freeFunction · 0.85
short_channel_id_eqFunction · 0.85
gossmap_find_chanFunction · 0.85
gossmap_nth_nodeFunction · 0.85

Tested by

no test coverage detected