diff --git a/include/llarp/pathbuilder.h b/include/llarp/pathbuilder.h index 6f1332381..54fcacfa6 100644 --- a/include/llarp/pathbuilder.h +++ b/include/llarp/pathbuilder.h @@ -33,7 +33,7 @@ struct llarp_pathbuild_job; typedef void (*llarp_pathbuilder_hook)(struct llarp_pathbuild_job*); // select hop function (user, nodedb, prevhop, result, hopnnumber) called in // logic thread -typedef void (*llarp_pathbuilder_select_hop_func)(void*, struct llarp_nodedb*, +typedef bool (*llarp_pathbuilder_select_hop_func)(void*, struct llarp_nodedb*, struct llarp_rc*, struct llarp_rc*, size_t); diff --git a/include/llarp/pathset.hpp b/include/llarp/pathset.hpp index dc11055f2..5d3b392b5 100644 --- a/include/llarp/pathset.hpp +++ b/include/llarp/pathset.hpp @@ -98,12 +98,12 @@ namespace llarp SelectHop(llarp_nodedb* db, llarp_rc* prev, llarp_rc* cur, size_t hop) = 0; - static void + static bool SelectHopCallback(void* user, llarp_nodedb* db, llarp_rc* prev, llarp_rc* cur, size_t hopno) { PathSet* self = static_cast< PathSet* >(user); - self->SelectHop(db, prev, cur, hopno); + return self->SelectHop(db, prev, cur, hopno); } private: diff --git a/llarp/pathbuilder.cpp b/llarp/pathbuilder.cpp index 83962993a..ae8d294ac 100644 --- a/llarp/pathbuilder.cpp +++ b/llarp/pathbuilder.cpp @@ -156,7 +156,12 @@ namespace llarp { llarp_rc* rc = &job->hops.hops[idx].router; llarp_rc_clear(rc); - job->selectHop(job->user, job->router->nodedb, prev, rc, idx); + if(!job->selectHop(job->user, job->router->nodedb, prev, rc, idx)) + { + /// TODO: handle this failure properly + llarp::LogWarn("Failed to select hop ", idx); + return; + } prev = rc; ++idx; }