From 30bf6706b7738779f5dd920a8c22a6d340854792 Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Tue, 20 Oct 2020 14:28:06 +1030 Subject: [PATCH] route: return NULL if destination is unreachable. Signed-off-by: Rusty Russell --- common/route.c | 8 ++++++-- common/route.h | 5 +++-- devtools/route.c | 2 +- devtools/topology.c | 2 +- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/common/route.c b/common/route.c index e734a3cbe..e07737138 100644 --- a/common/route.c +++ b/common/route.c @@ -61,16 +61,20 @@ u64 route_score_cheaper(u32 distance, return (costs << 32) + distance; } -struct route **route_from_dijkstra(const struct gossmap *map, +struct route **route_from_dijkstra(const tal_t *ctx, + const struct gossmap *map, const struct dijkstra *dij, const struct gossmap_node *cur) { - struct route **path = tal_arr(map, struct route *, 0); + struct route **path = tal_arr(ctx, struct route *, 0); u32 curidx = gossmap_node_idx(map, cur); while (dijkstra_distance(dij, curidx) != 0) { struct route *r; + if (dijkstra_distance(dij, curidx) == UINT_MAX) + return tal_free(path); + r = tal(path, struct route); r->c = dijkstra_best_chan(dij, curidx); if (r->c->half[0].nodeidx == curidx) { diff --git a/common/route.h b/common/route.h index b864c23d1..78631670a 100644 --- a/common/route.h +++ b/common/route.h @@ -36,8 +36,9 @@ u64 route_score_cheaper(u32 distance, struct amount_msat cost, struct amount_msat risk); -/* Extract route tal_arr from completed dijkstra */ -struct route **route_from_dijkstra(const struct gossmap *map, +/* Extract route tal_arr from completed dijkstra: NULL if none. */ +struct route **route_from_dijkstra(const tal_t *ctx, + const struct gossmap *map, const struct dijkstra *dij, const struct gossmap_node *cur); #endif /* LIGHTNING_COMMON_ROUTE_H */ diff --git a/devtools/route.c b/devtools/route.c index 91d54f6af..ffca5d458 100644 --- a/devtools/route.c +++ b/devtools/route.c @@ -69,7 +69,7 @@ static struct route **least_cost(struct gossmap *map, return NULL; } - path = route_from_dijkstra(map, dij, src); + path = route_from_dijkstra(map, map, dij, src); printf("# path length %zu\n", tal_count(path)); /* We don't pay fee on first hop! */ if (!amount_msat_sub(&fee, diff --git a/devtools/topology.c b/devtools/topology.c index e2eb2d9ff..2965fb73e 100644 --- a/devtools/topology.c +++ b/devtools/topology.c @@ -209,7 +209,7 @@ static bool measure_least_cost(struct gossmap *map, return false; } - path = route_from_dijkstra(map, dij, src); + path = route_from_dijkstra(map, map, dij, src); printf("# path length %zu\n", tal_count(path)); if (!amount_msat_sub(&fee, dijkstra_amount(dij, srcidx), sent)) abort();