askrene: remove now-unused bottleneck_idx from flow_max_deliverable.
What changed, and why it matters
This is a routine code cleanup in Core Lightning's payment routing plugin (askrene). It removes an unused output parameter called bottleneck_idx from an internal helper function and its callers. There is no change to behavior, no bug fix, and no security relevance visible in the commit.
No security action needed. Treat as normal maintenance/refactoring.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The commit removes the bottleneck_idx parameter from flow_max_deliverable() in plugins/askrene/refine.c and from refine_flows() in refine.h. All callers are updated to stop passing this argument. The function still computes the same maximum deliverable amount; it just no longer records which channel was the limiting constraint. This is a pure refactoring/dead-code removal.
Changed components
plugins/askrene/mcf.cplugins/askrene/refine.cplugins/askrene/refine.hInspect captured patch +11 / −24
diff --git a/plugins/askrene/mcf.c b/plugins/askrene/mcf.c
index c04f7202..a59c6feb 100644
--- a/plugins/askrene/mcf.c
+++ b/plugins/askrene/mcf.c
@@ -1412,7 +1412,7 @@ linear_routes(const tal_t *ctx, struct route_query *rq,
}
error_message =
- refine_flows(ctx, rq, amount_to_deliver, &new_flows, NULL);
+ refine_flows(ctx, rq, amount_to_deliver, &new_flows);
if (error_message)
goto fail;
diff --git a/plugins/askrene/refine.c b/plugins/askrene/refine.c
index 2babc216..3e2f9af8 100644
--- a/plugins/askrene/refine.c
+++ b/plugins/askrene/refine.c
@@ -184,33 +184,24 @@ static int revcmp_flows(struct flow *const *a, struct flow *const *b, void *unus
// -> check that htlc_max are all satisfied
// -> check that (x+1) at least one htlc_max is violated
/* Given the channel constraints, return the maximum amount that can be
- * delivered. Sets *bottleneck_idx to one of the contraining channels' idx, if non-NULL */
+ * delivered. */
static struct amount_msat flow_max_deliverable(const struct route_query *rq,
- const struct flow *flow,
- u32 *bottleneck_idx)
+ const struct flow *flow)
{
struct amount_msat deliver = AMOUNT_MSAT(-1);
for (size_t i = 0; i < tal_count(flow->path); i++) {
const struct half_chan *hc = &flow->path[i]->half[flow->dirs[i]];
struct amount_msat unused, known_max, htlc_max;
- size_t idx = flow->dirs[i]
- + 2 * gossmap_chan_idx(rq->gossmap, flow->path[i]);
-
deliver = amount_msat_sub_fee(deliver, hc->base_fee,
hc->proportional_fee);
htlc_max = get_chan_htlc_max(rq, flow->path[i], flow->dirs[i]);
- if (amount_msat_greater(deliver, htlc_max)) {
- if (bottleneck_idx)
- *bottleneck_idx = idx;
+ if (amount_msat_greater(deliver, htlc_max))
deliver = htlc_max;
- }
+
get_constraints(rq, flow->path[i], flow->dirs[i],
&unused, &known_max);
- if (amount_msat_greater(deliver, known_max)) {
- if (bottleneck_idx)
- *bottleneck_idx = idx;
+ if (amount_msat_greater(deliver, known_max))
deliver = known_max;
- }
}
return deliver;
}
@@ -436,7 +427,7 @@ static bool increase_flows(const struct route_query *rq,
* htlc_max. So remove this reservation, to get the
* real maximum for one flow, then replace it. */
tal_free(reservations[i]);
- capacity = flow_max_deliverable(rq, flows[i], NULL);
+ capacity = flow_max_deliverable(rq, flows[i]);
reservations[i] = new_reservations(reservations, rq);
create_flow_reservations(rq, &reservations[i], flows[i]);
@@ -475,8 +466,7 @@ static bool increase_flows(const struct route_query *rq,
}
const char *refine_flows(const tal_t *ctx, struct route_query *rq,
- struct amount_msat deliver, struct flow ***flows,
- u32 *bottleneck_idx)
+ struct amount_msat deliver, struct flow ***flows)
{
const tal_t *working_ctx = tal(ctx, tal_t);
const char *error_message = NULL;
@@ -487,7 +477,7 @@ const char *refine_flows(const tal_t *ctx, struct route_query *rq,
for (size_t i = 0; i < tal_count(*flows); i++) {
(*flows)[i]->delivers =
amount_msat_min((*flows)[i]->delivers,
- flow_max_deliverable(rq, (*flows)[i], bottleneck_idx));
+ flow_max_deliverable(rq, (*flows)[i]));
}
/* remove excess from MCF granularity if any */
@@ -570,7 +560,7 @@ void squash_flows(const tal_t *ctx, struct route_query *rq,
/* same path? We merge */
while (i + 1 < tal_count(*flows) &&
cmppath_flows(&flow, &(*flows)[i+1], NULL) == 0) {
- struct amount_msat combined, max = flow_max_deliverable(rq, flow, NULL);
+ struct amount_msat combined, max = flow_max_deliverable(rq, flow);
if (!amount_msat_add(&combined, flow->delivers, (*flows)[i+1]->delivers))
abort();
diff --git a/plugins/askrene/refine.h b/plugins/askrene/refine.h
index eeed8f28..7c1f1ecb 100644
--- a/plugins/askrene/refine.h
+++ b/plugins/askrene/refine.h
@@ -23,12 +23,9 @@ bool create_flow_reservations_verify(const struct route_query *rq,
/* Modify flows to meet HTLC min/max requirements.
* It takes into account the exact value of the fees expected at each hop.
- * If we reduce flows because it's too large for one channel, *bottleneck_idx
- * is set to the idx of a channel which caused a reduction (if non-NULL).
*/
const char *refine_flows(const tal_t *ctx, struct route_query *rq,
- struct amount_msat deliver, struct flow ***flows,
- u32 *bottleneck_idx);
+ struct amount_msat deliver, struct flow ***flows);
/* Duplicated flows are merged into one. This saves in base fee and HTLC fees.
*/
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.