We can't ask for channels by node_id, so probe at random */
| 479 | |
| 480 | /* We can't ask for channels by node_id, so probe at random */ |
| 481 | static 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))) |
no test coverage detected