diff --git a/llarp/dht.cpp b/llarp/dht.cpp index 0394a338d..503f48673 100644 --- a/llarp/dht.cpp +++ b/llarp/dht.cpp @@ -630,8 +630,8 @@ llarp_dht_context_start(struct llarp_dht_context *ctx, const byte_t *key) } void -llarp_dh_lookup_router(struct llarp_dht_context *ctx, - struct llarp_router_lookup_job *job) +llarp_dht_lookup_router(struct llarp_dht_context *ctx, + struct llarp_router_lookup_job *job) { job->dht = ctx; llarp_logic_queue_job(ctx->parent->logic, diff --git a/llarp/router.cpp b/llarp/router.cpp index 62b87cecd..b16d30933 100644 --- a/llarp/router.cpp +++ b/llarp/router.cpp @@ -104,12 +104,28 @@ llarp_router::HandleAsyncLoadRCForSendTo(llarp_async_load_rc *job) } else { - // we don't have the RC locally - // TODO: dht lookup + // we don't have the RC locally so do a dht lookup + llarp_router_lookup_job *lookup = new llarp_router_lookup_job; + lookup->user = router; + memcpy(lookup->target, job->rc.pubkey, PUBKEYSIZE); + lookup->hook = &HandleDHTLookupForSendTo; + llarp_dht_lookup_router(router->dht, lookup); + } +} - // discard pending messages - router->DiscardOutboundFor(job->pubkey); +void +llarp_router::HandleDHTLookupForSendTo(llarp_router_lookup_job *job) +{ + llarp_router *self = static_cast< llarp_router * >(job->user); + if(job->found) + { + llarp_router_try_connect(self, &job->result, 10); } + else + { + self->DiscardOutboundFor(job->target); + } + delete job; } void diff --git a/llarp/router.hpp b/llarp/router.hpp index 109c3fa34..3c75720c2 100644 --- a/llarp/router.hpp +++ b/llarp/router.hpp @@ -193,6 +193,9 @@ struct llarp_router static void HandleAsyncLoadRCForSendTo(llarp_async_load_rc *async); + + static void + HandleDHTLookupForSendTo(llarp_router_lookup_job *job); }; #endif