@@ -375,6 +375,56 @@ static void apply_layers(struct askrene *askrene, struct route_query *rq,
375
375
layer_clear_overridden_capacities (l , askrene -> gossmap , rq -> capacities );
376
376
}
377
377
}
378
+
379
+ /* Convert back into routes, with delay and other information fixed */
380
+ static struct route * * convert_flows_to_routes (const tal_t * ctx ,
381
+ struct route_query * rq ,
382
+ u32 finalcltv ,
383
+ struct flow * * flows ,
384
+ struct amount_msat * * amounts )
385
+ {
386
+ struct route * * routes ;
387
+ routes = tal_arr (ctx , struct route * , tal_count (flows ));
388
+ * amounts = tal_arr (ctx , struct amount_msat , tal_count (flows ));
389
+
390
+ for (size_t i = 0 ; i < tal_count (flows ); i ++ ) {
391
+ struct route * r ;
392
+ struct amount_msat msat ;
393
+ u32 delay ;
394
+
395
+ routes [i ] = r = tal (routes , struct route );
396
+ r -> success_prob = flow_probability (flows [i ], rq );
397
+ r -> hops = tal_arr (r , struct route_hop , tal_count (flows [i ]-> path ));
398
+
399
+ /* Fill in backwards to calc amount and delay */
400
+ msat = flows [i ]-> delivers ;
401
+ delay = finalcltv ;
402
+
403
+ for (int j = tal_count (flows [i ]-> path ) - 1 ; j >= 0 ; j -- ) {
404
+ struct route_hop * rh = & r -> hops [j ];
405
+ struct gossmap_node * far_end ;
406
+ const struct half_chan * h = flow_edge (flows [i ], j );
407
+
408
+ if (!amount_msat_add_fee (& msat , h -> base_fee , h -> proportional_fee ))
409
+ plugin_err (rq -> plugin , "Adding fee to amount" );
410
+ delay += h -> delay ;
411
+
412
+ rh -> scid = gossmap_chan_scid (rq -> gossmap , flows [i ]-> path [j ]);
413
+ rh -> direction = flows [i ]-> dirs [j ];
414
+ far_end = gossmap_nth_node (rq -> gossmap , flows [i ]-> path [j ], !flows [i ]-> dirs [j ]);
415
+ gossmap_node_get_id (rq -> gossmap , far_end , & rh -> node_id );
416
+ rh -> amount = msat ;
417
+ rh -> delay = delay ;
418
+ }
419
+ (* amounts )[i ] = flows [i ]-> delivers ;
420
+ rq_log (tmpctx , rq , LOG_INFORM , "Flow %zu/%zu: %s" ,
421
+ i , tal_count (flows ),
422
+ fmt_route (tmpctx , r , (* amounts )[i ], finalcltv ));
423
+ }
424
+
425
+ return routes ;
426
+ }
427
+
378
428
/* Returns an error message, or sets *routes */
379
429
static const char * get_routes (const tal_t * ctx ,
380
430
struct command * cmd ,
@@ -456,44 +506,12 @@ static const char *get_routes(const tal_t *ctx,
456
506
rq_log (tmpctx , rq , LOG_DBG , "Final answer has %zu flows" ,
457
507
tal_count (flows ));
458
508
459
- /* Convert back into routes, with delay and other information fixed */
460
- * routes = tal_arr (ctx , struct route * , tal_count (flows ));
461
- * amounts = tal_arr (ctx , struct amount_msat , tal_count (flows ));
462
- for (size_t i = 0 ; i < tal_count (flows ); i ++ ) {
463
- struct route * r ;
464
- struct amount_msat msat ;
465
- u32 delay ;
466
-
467
- (* routes )[i ] = r = tal (* routes , struct route );
468
- r -> success_prob = flow_probability (flows [i ], rq );
469
- r -> hops = tal_arr (r , struct route_hop , tal_count (flows [i ]-> path ));
470
-
471
- /* Fill in backwards to calc amount and delay */
472
- msat = flows [i ]-> delivers ;
473
- delay = finalcltv ;
474
-
475
- for (int j = tal_count (flows [i ]-> path ) - 1 ; j >= 0 ; j -- ) {
476
- struct route_hop * rh = & r -> hops [j ];
477
- struct gossmap_node * far_end ;
478
- const struct half_chan * h = flow_edge (flows [i ], j );
479
-
480
- if (!amount_msat_add_fee (& msat , h -> base_fee , h -> proportional_fee ))
481
- plugin_err (rq -> plugin , "Adding fee to amount" );
482
- delay += h -> delay ;
483
-
484
- rh -> scid = gossmap_chan_scid (rq -> gossmap , flows [i ]-> path [j ]);
485
- rh -> direction = flows [i ]-> dirs [j ];
486
- far_end = gossmap_nth_node (rq -> gossmap , flows [i ]-> path [j ], !flows [i ]-> dirs [j ]);
487
- gossmap_node_get_id (rq -> gossmap , far_end , & rh -> node_id );
488
- rh -> amount = msat ;
489
- rh -> delay = delay ;
490
- }
491
- (* amounts )[i ] = flows [i ]-> delivers ;
492
- rq_log (tmpctx , rq , LOG_INFORM , "Flow %zu/%zu: %s" ,
493
- i , tal_count (flows ),
494
- fmt_route (tmpctx , r , (* amounts )[i ], finalcltv ));
495
- }
509
+ /* convert flows to routes */
510
+ * routes = convert_flows_to_routes (rq , rq , finalcltv , flows , amounts );
511
+ assert (tal_count (* routes ) == tal_count (flows ));
512
+ assert (tal_count (* amounts ) == tal_count (flows ));
496
513
514
+ /* At last we remove the localmods from the gossmap. */
497
515
gossmap_remove_localmods (askrene -> gossmap , localmods );
498
516
time_delta = timemono_between (time_mono (), time_start );
499
517
rq_log (tmpctx , rq , LOG_DBG , "get_routes completed in %" PRIu64 " ms" ,
0 commit comments