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

Function best_remote_addr

lightningd/peer_control.c:1680–1770  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1678}
1679
1680static 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;

Callers 1

update_remote_addrFunction · 0.85

Calls 5

fmt_node_idFunction · 0.85
fmt_wireaddrFunction · 0.85
wireaddr_eqFunction · 0.85
wireaddr_arr_containsFunction · 0.85
peer_any_channel_bystateFunction · 0.70

Tested by

no test coverage detected