1616#include <common/gossmods_listpeerchannels.h>
1717#include <common/json_param.h>
1818#include <common/json_stream.h>
19+ #include <common/memleak.h>
1920#include <common/route.h>
2021#include <common/status_wiregen.h>
2122#include <errno.h>
2425#include <plugins/askrene/askrene.h>
2526#include <plugins/askrene/child/additional_costs.h>
2627#include <plugins/askrene/child/entry.h>
27- #include <plugins/askrene/child/route_query.h>
2828#include <plugins/askrene/layer.h>
2929#include <plugins/askrene/reserve.h>
3030#include <sys/wait.h>
@@ -329,43 +329,47 @@ struct getroutes_info {
329329 u32 maxparts ;
330330};
331331
332- static void apply_layers (struct askrene * askrene ,
333- struct command * cmd ,
334- struct route_query * rq ,
335- const struct node_id * source ,
336- struct amount_msat amount ,
337- struct gossmap_localmods * localmods ,
338- const char * * layers ,
339- const struct layer * local_layer )
332+ /* Gather layers, clear capacities where layers contains info */
333+ static const struct layer * * apply_layers (const tal_t * ctx ,
334+ struct askrene * askrene ,
335+ struct command * cmd ,
336+ const struct node_id * source ,
337+ struct amount_msat amount ,
338+ struct gossmap_localmods * localmods ,
339+ const char * * layernames ,
340+ const struct layer * local_layer ,
341+ fp16_t * capacities )
340342{
343+ const struct layer * * layers = tal_arr (ctx , const struct layer * , 0 );
341344 /* Layers must exist, but might be special ones! */
342- for (size_t i = 0 ; i < tal_count (layers ); i ++ ) {
343- const struct layer * l = find_layer (askrene , layers [i ]);
345+ for (size_t i = 0 ; i < tal_count (layernames ); i ++ ) {
346+ const struct layer * l = find_layer (askrene , layernames [i ]);
344347 if (!l ) {
345- if (streq (layers [i ], "auto.localchans" )) {
348+ if (streq (layernames [i ], "auto.localchans" )) {
346349 cmd_log (tmpctx , cmd , LOG_DBG ,
347350 "Adding auto.localchans" );
348351 l = local_layer ;
349- } else if (streq (layers [i ], "auto.no_mpp_support" )) {
352+ } else if (streq (layernames [i ], "auto.no_mpp_support" )) {
350353 cmd_log (tmpctx , cmd , LOG_DBG ,
351354 "Adding auto.no_mpp_support, sorry" );
352- l = remove_small_channel_layer (layers , askrene , amount , localmods );
355+ l = remove_small_channel_layer (layernames , askrene , amount , localmods );
353356 } else {
354- assert (streq (layers [i ], "auto.sourcefree" ));
357+ assert (streq (layernames [i ], "auto.sourcefree" ));
355358 cmd_log (tmpctx , cmd , LOG_DBG ,
356359 "Adding auto.sourcefree" );
357- l = source_free_layer (layers , askrene , source , localmods );
360+ l = source_free_layer (layernames , askrene , source , localmods );
358361 }
359362 }
360363
361- tal_arr_expand (& rq -> layers , l );
364+ tal_arr_expand (& layers , l );
362365 /* FIXME: Implement localmods_merge, and cache this in layer? */
363- layer_add_localmods (l , rq -> gossmap , localmods );
366+ layer_add_localmods (l , askrene -> gossmap , localmods );
364367
365368 /* Clear any entries in capacities array if we
366369 * override them (incl local channels) */
367- layer_clear_overridden_capacities (l , askrene -> gossmap , rq -> capacities );
370+ layer_clear_overridden_capacities (l , askrene -> gossmap , capacities );
368371 }
372+ return layers ;
369373}
370374
371375static void process_child_logs (struct command * cmd ,
@@ -386,11 +390,12 @@ static struct command_result *do_getroutes(struct command *cmd,
386390 struct getroutes_info * info )
387391{
388392 struct askrene * askrene = get_askrene (cmd -> plugin );
389- struct route_query * rq = tal (cmd , struct route_query );
390393 const char * err , * json ;
391394 struct timemono time_start , deadline ;
392395 int child_fd , log_fd , child_pid , child_status ;
396+ const struct layer * * layers ;
393397 s8 * biases ;
398+ fp16_t * capacities ;
394399
395400 /* update the gossmap */
396401 if (gossmap_refresh (askrene -> gossmap )) {
@@ -400,42 +405,28 @@ static struct command_result *do_getroutes(struct command *cmd,
400405 get_capacities (askrene , askrene -> plugin , askrene -> gossmap );
401406 }
402407
403- /* build this request structure */
404- rq -> cmd_id = cmd -> id ;
405- rq -> gossmap = askrene -> gossmap ;
406- rq -> reserved = askrene -> reserved ;
407- rq -> layers = tal_arr (rq , const struct layer * , 0 );
408- rq -> capacities = tal_dup_talarr (rq , fp16_t , askrene -> capacities );
409- /* FIXME: we still need to do something useful with these */
410- rq -> additional_costs = info -> additional_costs ;
408+ capacities = tal_dup_talarr (cmd , fp16_t , askrene -> capacities );
411409
412410 /* apply selected layers to the localmods */
413- apply_layers (askrene , cmd , rq , & info -> source , info -> amount , localmods ,
414- info -> layers , info -> local_layer );
411+ layers = apply_layers (cmd , askrene , cmd ,
412+ & info -> source , info -> amount , localmods ,
413+ info -> layers , info -> local_layer , capacities );
415414
416415 /* Clear scids with reservations, too, so we don't have to look up
417416 * all the time! */
418417 reserves_clear_capacities (askrene -> reserved , askrene -> gossmap ,
419- rq -> capacities );
418+ capacities );
420419
421420 /* we temporarily apply localmods */
422421 gossmap_apply_localmods (askrene -> gossmap , localmods );
423422
424- /* I want to be able to disable channels while working on this query.
425- * Layers are for user interaction and cannot be used for this purpose.
426- */
427- rq -> disabled_chans =
428- tal_arrz (rq , bitmap ,
429- 2 * BITMAP_NWORDS (gossmap_max_chan_idx (askrene -> gossmap )));
430-
431423 /* localmods can add channels, so we need to allocate biases array
432424 * *afterwards* */
433- rq -> biases = biases =
434- tal_arrz (rq , s8 , gossmap_max_chan_idx (askrene -> gossmap ) * 2 );
425+ biases = tal_arrz (cmd , s8 , gossmap_max_chan_idx (askrene -> gossmap ) * 2 );
435426
436427 /* Note any channel biases */
437- for (size_t i = 0 ; i < tal_count (rq -> layers ); i ++ )
438- layer_apply_biases (rq -> layers [i ], askrene -> gossmap , biases );
428+ for (size_t i = 0 ; i < tal_count (layers ); i ++ )
429+ layer_apply_biases (layers [i ], askrene -> gossmap , biases );
439430
440431 /* checkout the source */
441432 const struct gossmap_node * srcnode =
@@ -475,7 +466,13 @@ static struct command_result *do_getroutes(struct command *cmd,
475466 time_start = time_mono ();
476467 deadline = timemono_add (time_start ,
477468 time_from_sec (askrene -> route_seconds ));
478- child_fd = fork_router_child (rq , info -> dev_algo == ALGO_SINGLE_PATH ,
469+ child_fd = fork_router_child (askrene -> gossmap ,
470+ layers ,
471+ biases ,
472+ info -> additional_costs ,
473+ askrene -> reserved ,
474+ take (capacities ),
475+ info -> dev_algo == ALGO_SINGLE_PATH ,
479476 deadline , srcnode , dstnode , info -> amount ,
480477 info -> maxfee , info -> finalcltv , info -> maxdelay ,
481478 info -> maxparts , cmd -> id , cmd -> filter , & log_fd , & child_pid );
@@ -690,8 +687,7 @@ static struct command_result *json_getroutes(struct command *cmd,
690687 info -> finalcltv = * finalcltv ;
691688 info -> maxdelay = * maxdelay ;
692689 info -> dev_algo = * dev_algo ;
693- info -> additional_costs = tal (info , struct additional_cost_htable );
694- additional_cost_htable_init (info -> additional_costs );
690+ info -> additional_costs = new_htable (info , additional_cost_htable );
695691 info -> maxparts = * maxparts ;
696692
697693 if (have_layer (info -> layers , "auto.localchans" )) {
0 commit comments