| 1678 | } |
| 1679 | |
| 1680 | static const struct wireaddr *best_remote_addr(const tal_t *ctx, |
| 1681 | struct lightningd *ld, |
| 1682 | enum wire_addr_type atype) |
| 1683 | { |
| 1684 | struct peer *peer; |
| 1685 | struct peer_node_id_map_iter it; |
| 1686 | struct discovered_addr *daddrs; |
| 1687 | const struct wireaddr *best, *prev; |
| 1688 | size_t best_score, cur_score, preferred_bonus; |
| 1689 | |
| 1690 | daddrs = tal_arr(tmpctx, struct discovered_addr, 0); |
| 1691 | for (peer = peer_node_id_map_first(ld->peers, &it); |
| 1692 | peer; |
| 1693 | peer = peer_node_id_map_next(ld->peers, &it)) { |
| 1694 | struct discovered_addr daddr; |
| 1695 | if (!peer->remote_addr) |
| 1696 | continue; |
| 1697 | if (peer->remote_addr->type != atype) |
| 1698 | continue; |
| 1699 | daddr.preferred = peer_any_channel_bystate(peer, |
| 1700 | channel_state_relationship, |
| 1701 | NULL); |
| 1702 | daddr.addr = *peer->remote_addr; |
| 1703 | daddr.addr.port = ld->config.ip_discovery_port; |
| 1704 | log_debug(ld->log, "best_remote_addr: peer %s gave addr %s (%s)", |
| 1705 | fmt_node_id(tmpctx, &peer->id), |
| 1706 | fmt_wireaddr(tmpctx, &daddr.addr), |
| 1707 | daddr.preferred ? "preferred" : "no chan"); |
| 1708 | tal_arr_expand(&daddrs, daddr); |
| 1709 | } |
| 1710 | |
| 1711 | /* Sort into matching addresses */ |
| 1712 | asort(daddrs, tal_count(daddrs), daddr_cmp, NULL); |
| 1713 | |
| 1714 | /* All the non-preferred peers cannot outvote 1 preferred peer */ |
| 1715 | preferred_bonus = tal_count(daddrs); |
| 1716 | best_score = cur_score = 0; |
| 1717 | best = prev = NULL; |
| 1718 | for (size_t i = 0; i < tal_count(daddrs); i++) { |
| 1719 | if (prev && !wireaddr_eq(prev, &daddrs[i].addr)) { |
| 1720 | if (cur_score > best_score) { |
| 1721 | best_score = cur_score; |
| 1722 | best = prev; |
| 1723 | } |
| 1724 | cur_score = 0; |
| 1725 | } |
| 1726 | cur_score += daddrs[i].preferred ? preferred_bonus : 1; |
| 1727 | prev = &daddrs[i].addr; |
| 1728 | } |
| 1729 | if (cur_score > best_score) { |
| 1730 | best_score = cur_score; |
| 1731 | best = prev; |
| 1732 | } |
| 1733 | |
| 1734 | if (!best) { |
| 1735 | log_debug(ld->log, |
| 1736 | "node_address: no peers gave remote addresses"); |
| 1737 | return NULL; |
no test coverage detected