From 7545a34213ddaafe00482a0b9b83de8fdc73539d Mon Sep 17 00:00:00 2001 From: Ryan Tharp Date: Sat, 23 Jun 2018 07:52:15 -0700 Subject: [PATCH 1/6] c api for setting logging level --- include/llarp/logger.hpp | 1 + llarp/logger.c | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 llarp/logger.c diff --git a/include/llarp/logger.hpp b/include/llarp/logger.hpp index 0d38cd546..1ad9975ad 100644 --- a/include/llarp/logger.hpp +++ b/include/llarp/logger.hpp @@ -9,6 +9,7 @@ namespace llarp { + // probably will need to move out of llarp namespace for c api enum LogLevel { eLogDebug, diff --git a/llarp/logger.c b/llarp/logger.c new file mode 100644 index 000000000..3f37f58f7 --- /dev/null +++ b/llarp/logger.c @@ -0,0 +1,2 @@ +#include "logger.h" + From 7bfb0ad3e41d88de7adebc88f346587a94f85bb2 Mon Sep 17 00:00:00 2001 From: Ryan Tharp Date: Sat, 23 Jun 2018 07:52:38 -0700 Subject: [PATCH 2/6] c api implementation for setting log level --- llarp/logger.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/llarp/logger.cpp b/llarp/logger.cpp index 15636856b..c9db6eb5d 100644 --- a/llarp/logger.cpp +++ b/llarp/logger.cpp @@ -1,4 +1,5 @@ #include "logger.hpp" +#include namespace llarp { @@ -10,3 +11,12 @@ namespace llarp _glog.minlevel = lvl; } } + +extern "C" { +void +cSetLogLevel(LogLevel lvl) +{ + llarp::SetLogLevel((llarp::LogLevel)lvl); +} + +} From f0ba20741c271136ab6fdda4adf723c6ae041487 Mon Sep 17 00:00:00 2001 From: Ryan Tharp Date: Sat, 23 Jun 2018 07:53:57 -0700 Subject: [PATCH 3/6] remove unused variables --- llarp/api/message.cpp | 4 ++-- llarp/iwp_link.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/llarp/api/message.cpp b/llarp/api/message.cpp index 977731216..fc3c7b3f0 100644 --- a/llarp/api/message.cpp +++ b/llarp/api/message.cpp @@ -86,7 +86,7 @@ namespace llarp passbuf.sz = password.size(); crypto->shorthash(secret, passbuf); - llarp::ShortHash digest; + //llarp::ShortHash digest; // zero hash hash.Zero(); @@ -106,4 +106,4 @@ namespace llarp } } } // namespace api -} // namespace llarp \ No newline at end of file +} // namespace llarp diff --git a/llarp/iwp_link.cpp b/llarp/iwp_link.cpp index 8cb212e06..a2a1ab103 100644 --- a/llarp/iwp_link.cpp +++ b/llarp/iwp_link.cpp @@ -1663,7 +1663,7 @@ namespace iwp if(msg->completed()) { llarp::Debug("message transmitted msgid=", msgid); - session *impl = static_cast< session * >(parent->impl); + //session *impl = static_cast< session * >(parent->impl); tx.erase(msgid); delete msg; } From 16f7de99e4fcf7ed21f21199e3c2715483dee3eb Mon Sep 17 00:00:00 2001 From: Ryan Tharp Date: Sat, 23 Jun 2018 07:55:25 -0700 Subject: [PATCH 4/6] disable llarp_nodedb_async_load_rc --- llarp/nodedb.cpp | 6 ++++++ llarp/router.cpp | 32 +++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/llarp/nodedb.cpp b/llarp/nodedb.cpp index dd415ec2b..5cb738ac6 100644 --- a/llarp/nodedb.cpp +++ b/llarp/nodedb.cpp @@ -371,6 +371,8 @@ llarp_nodedb_load_dir(struct llarp_nodedb *n, const char *dir) return n->Load(dir); } +/// c api for nodedb::setRC +/// maybe better to use llarp_nodedb_async_verify bool llarp_nodedb_put_rc(struct llarp_nodedb *n, struct llarp_rc *rc) { return n->setRC(rc); @@ -382,6 +384,7 @@ llarp_nodedb_iterate_all(struct llarp_nodedb *n, struct llarp_nodedb_iter i) { return n->entries.size(); } +/// maybe rename to verify_and_set void llarp_nodedb_async_verify(struct llarp_async_verify_rc *job) { @@ -391,12 +394,15 @@ llarp_nodedb_async_verify(struct llarp_async_verify_rc *job) {job, &crypto_threadworker_verifyrc}); } +// disabled for now +/* void llarp_nodedb_async_load_rc(struct llarp_async_load_rc *job) { // call in the disk io thread so we don't bog down the others llarp_threadpool_queue_job(job->diskworker, {job, &nodedb_async_load_rc}); } +*/ struct llarp_rc * llarp_nodedb_get_rc(struct llarp_nodedb *n, const byte_t *pk) diff --git a/llarp/router.cpp b/llarp/router.cpp index 3bc5604ea..167eb0c83 100644 --- a/llarp/router.cpp +++ b/llarp/router.cpp @@ -93,6 +93,12 @@ llarp_router::SendToOrQueue(const llarp::RouterID &remote, llarp_router_try_connect(this, rc, 10); return true; } + + // this would never be true, as everything is in memory + // but we'll keep around if we ever need to swap them out of memory + // but it's best to keep the paradigm that everythign is in memory at this point in development + // as it will reduce complexity + /* // try requesting the rc from the disk llarp_async_load_rc *job = new llarp_async_load_rc; job->diskworker = disk; @@ -102,10 +108,19 @@ llarp_router::SendToOrQueue(const llarp::RouterID &remote, job->hook = &HandleAsyncLoadRCForSendTo; memcpy(job->pubkey, remote, PUBKEYSIZE); llarp_nodedb_async_load_rc(job); + */ + + // we don't have the RC locally so do a dht lookup + llarp_router_lookup_job *lookup = new llarp_router_lookup_job; + lookup->user = this; + memcpy(lookup->target, this->rc.pubkey, PUBKEYSIZE); + lookup->hook = &HandleDHTLookupForSendTo; + llarp_dht_lookup_router(this->dht, lookup); return true; } +/* void llarp_router::HandleAsyncLoadRCForSendTo(llarp_async_load_rc *job) { @@ -125,6 +140,7 @@ llarp_router::HandleAsyncLoadRCForSendTo(llarp_async_load_rc *job) } delete job; } +*/ void llarp_router::HandleDHTLookupForSendTo(llarp_router_lookup_job *job) @@ -144,6 +160,7 @@ llarp_router::HandleDHTLookupForSendTo(llarp_router_lookup_job *job) void llarp_router::try_connect(fs::path rcfile) { + // FIXME: update API byte_t tmp[MAX_RC_SIZE]; llarp_rc remote = {0}; llarp_buffer_t buf; @@ -295,7 +312,6 @@ llarp_router::on_verify_server_rc(llarp_async_verify_rc *job) llarp::async_verify_context *ctx = static_cast< llarp::async_verify_context * >(job->user); auto router = ctx->router; - llarp::Debug("rc verified? ", job->valid ? "valid" : "invalid"); llarp::PubKey pk(job->rc.pubkey); if(!job->valid) { @@ -312,8 +328,9 @@ llarp_router::on_verify_server_rc(llarp_async_verify_rc *job) router->DiscardOutboundFor(pk); return; } + // we're valid, which means it's already been committed to the nodedb - llarp::Debug("rc verified"); + llarp::Debug("rc verified and saved to nodedb"); // refresh valid routers RC value if it's there auto v = router->validRouters.find(pk); @@ -324,8 +341,6 @@ llarp_router::on_verify_server_rc(llarp_async_verify_rc *job) } router->validRouters[pk] = job->rc; - // TODO: update nodedb here (?) - // track valid router in dht llarp_dht_put_peer(router->dht, &router->validRouters[pk]); @@ -641,14 +656,12 @@ llarp_router::Run() // immediate connect all for service node uint64_t delay = rand() % 100; llarp_logic_call_later(logic, {delay, this, &ConnectAll}); - //llarp_logic_call_later(logic, {static_cast(delay), this, &ConnectAll}); } else { // delayed connect all for clients uint64_t delay = ((rand() % 10) * 500) + 1000; llarp_logic_call_later(logic, {delay, this, &ConnectAll}); - //llarp_logic_call_later(logic, {static_cast(delay), this, &ConnectAll}); } llarp::PubKey ourPubkey = pubkey(); @@ -1038,6 +1051,7 @@ namespace llarp { if(!StrEq(key, "*")) { + llarp::Info("interface specific binding activated"); link = new llarp_link; llarp::Zero(link, sizeof(llarp_link)); @@ -1070,8 +1084,12 @@ namespace llarp } } } + else + { + llarp::Error("link ", key, " failed to initialize. Link state", link); + } } - llarp::Error("link ", key, " failed to configure"); + llarp::Error("link ", key, " failed to configure. (Note: We don't support * yet)"); } else if(StrEq(section, "connect")) { From c31e5795fc0ede8b5238a89747a6e2ec1451279c Mon Sep 17 00:00:00 2001 From: Ryan Tharp Date: Sat, 23 Jun 2018 07:56:59 -0700 Subject: [PATCH 5/6] setup() refactor, llarp_main_queryDHT() --- include/llarp.h | 8 +++++ include/llarp.hpp | 3 ++ llarp/context.cpp | 77 ++++++++++++++++++++++++++++++++--------------- 3 files changed, 64 insertions(+), 24 deletions(-) diff --git a/include/llarp.h b/include/llarp.h index 97d1f89af..b2095c31c 100644 --- a/include/llarp.h +++ b/include/llarp.h @@ -27,6 +27,10 @@ llarp_main_signal(struct llarp_main *ptr, int sig); void llarp_main_set_dht_handler(struct llarp_main *ptr, llarp_dht_msg_handler h); +/// setup main context +int +llarp_main_setup(struct llarp_main *ptr); + /// run main context int llarp_main_run(struct llarp_main *ptr); @@ -44,9 +48,13 @@ llarp_main_iterateDatabase(struct llarp_main *ptr, struct llarp_nodedb_iter i); bool llarp_main_putDatabase(struct llarp_main *ptr, struct llarp_rc *rc); +/// get RC from nodeDB struct llarp_rc * llarp_main_getDatabase(struct llarp_main *ptr, byte_t *pk); +/// get RC from DHT +void +llarp_main_queryDHT(struct llarp_main *ptr, struct llarp_router_lookup_job *job); void llarp_main_free(struct llarp_main *ptr); diff --git a/include/llarp.hpp b/include/llarp.hpp index 8448dbb35..51289549c 100644 --- a/include/llarp.hpp +++ b/include/llarp.hpp @@ -45,6 +45,9 @@ namespace llarp struct llarp_rc * GetDatabase(const byte_t *pk); + int + Setup(); + int Run(); diff --git a/llarp/context.cpp b/llarp/context.cpp index c3b759e88..9e5571d70 100644 --- a/llarp/context.cpp +++ b/llarp/context.cpp @@ -125,7 +125,7 @@ namespace llarp } int - Context::Run() + Context::Setup() { llarp::Info("starting up"); this->LoadDatabase(); @@ -149,26 +149,48 @@ namespace llarp router = llarp_init_router(worker, mainloop, logic); - if(llarp_configure_router(router, config)) + if(!llarp_configure_router(router, config)) { - if(custom_dht_func) - { - llarp::Info("using custom dht function"); - llarp_dht_set_msg_handler(router->dht, custom_dht_func); - } - llarp_run_router(router, nodedb); - // run net io thread - if(singleThreaded) + llarp::Error("Failed to configure router"); + return 1; + } + if(custom_dht_func) + { + llarp::Info("using custom dht function"); + llarp_dht_set_msg_handler(router->dht, custom_dht_func); + } + // set nodedb, load our RC, establish DHT + llarp_run_router(router, nodedb); + + return 0; // success + } + + int + Context::Run() + { + // just check to make sure it's not already set up (either this or we add a bool and/or add another function) + if (!this->router) + { + // set up all requirements + if (this->Setup()) { - llarp::Info("running mainloop"); - llarp_ev_loop_run_single_process(mainloop, worker, logic); + llarp::Error("Failed to setup router"); + return 1; } - else + } + + // run net io thread + if(singleThreaded) + { + llarp::Info("running mainloop"); + llarp_ev_loop_run_single_process(mainloop, worker, logic); + } + else + { + auto netio = mainloop; + while(num_nethreads--) { - auto netio = mainloop; - while(num_nethreads--) - { - netio_threads.emplace_back([netio]() { llarp_ev_loop_run(netio); }); + netio_threads.emplace_back([netio]() { llarp_ev_loop_run(netio); }); #if(__APPLE__ && __MACH__) #elif(__FreeBSD__) @@ -178,15 +200,11 @@ namespace llarp pthread_setname_np(netio_threads.back().native_handle(), "llarp-netio"); #endif - } - llarp::Info("running mainloop"); - llarp_logic_mainloop(logic); } - return 0; + llarp::Info("running mainloop"); + llarp_logic_mainloop(logic); } - else - llarp::Error("Failed to configure router"); - return 1; + return 0; } void @@ -309,6 +327,12 @@ llarp_main_signal(struct llarp_main *ptr, int sig) ptr->ctx->HandleSignal(sig); } +int +llarp_main_setup(struct llarp_main *ptr) +{ + return ptr->ctx->Setup(); +} + int llarp_main_run(struct llarp_main *ptr) { @@ -339,6 +363,11 @@ llarp_main_getDatabase(struct llarp_main *ptr, byte_t *pk) return ptr->ctx->GetDatabase(pk); } +void llarp_main_queryDHT(struct llarp_main *ptr, llarp_router_lookup_job *job) +{ + llarp_dht_lookup_router(ptr->ctx->router->dht, job); +} + void llarp_main_free(struct llarp_main *ptr) { From 3a36f42e01eb7facbea2675680909ef89c9d25d9 Mon Sep 17 00:00:00 2001 From: Ryan Tharp Date: Sat, 23 Jun 2018 07:57:36 -0700 Subject: [PATCH 6/6] fix export help, started --locate support --- daemon/rcutil.cpp | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) diff --git a/daemon/rcutil.cpp b/daemon/rcutil.cpp index e49d9963d..5091185a5 100644 --- a/daemon/rcutil.cpp +++ b/daemon/rcutil.cpp @@ -35,6 +35,10 @@ bool printNode(struct llarp_nodedb_iter *iter) { return false; } +void HandleDHTLocate(llarp_router_lookup_job *job) { + llarp::Info("DHT result: ", job->found ? "found" : "not found"); + // save to nodedb? +} int main(int argc, char *argv[]) @@ -57,7 +61,8 @@ main(int argc, char *argv[]) "--update with a path to a router contact file\n" "--list \n" "--import with a path to a router contact file\n" - "--export with a path to a router contact file\n" + "--export a hex formatted public key\n" + "--locate a hex formatted public key" "\n"); return 0; } @@ -66,6 +71,7 @@ main(int argc, char *argv[]) bool listMode = false; bool importMode = false; bool exportMode = false; + bool locateMode = false; int c; char *conffname; char defaultConfName[] = "daemon.ini"; @@ -83,9 +89,10 @@ main(int argc, char *argv[]) {"list", no_argument, 0, 'l'}, {"import", required_argument, 0, 'i'}, {"export", required_argument, 0, 'e'}, + {"locate", required_argument, 0, 'q'}, {0, 0, 0, 0}}; int option_index = 0; - c = getopt_long(argc, argv, "cgluie", long_options, &option_index); + c = getopt_long(argc, argv, "cgluieq", long_options, &option_index); if(c == -1) break; switch(c) @@ -111,6 +118,12 @@ main(int argc, char *argv[]) haveRequiredOptions = true; exportMode = true; break; + case 'q': + // printf ("option -g with value `%s'\n", optarg); + rcfname = optarg; + haveRequiredOptions = true; + locateMode = true; + break; case 'g': // printf ("option -g with value `%s'\n", optarg); rcfname = optarg; @@ -132,7 +145,7 @@ main(int argc, char *argv[]) return 0; } printf("parsed options\n"); - if(!genMode && !updMode && !listMode &&!importMode && !exportMode) + if(!genMode && !updMode && !listMode &&!importMode && !exportMode && !locateMode) { llarp::Error("I don't know what to do, no generate or update parameter\n"); return 0; @@ -240,6 +253,24 @@ main(int argc, char *argv[]) llarp::Info("Writing out: ", filename); llarp_rc_write(rc, filename.c_str()); } + if (locateMode) { + llarp::Info("Going online"); + llarp_main_setup(ctx); + + llarp::PubKey binaryPK; + llarp::HexDecode(rcfname, binaryPK.data()); + + llarp::Info("Queueing job"); + llarp_router_lookup_job *job = new llarp_router_lookup_job; + job->found = false; + job->hook = &HandleDHTLocate; + memcpy(job->target, binaryPK, PUBKEYSIZE); // set job's target + llarp_main_queryDHT(ctx, job); + + llarp::Info("Processing"); + // run system and wait + llarp_main_run(ctx); + } llarp_main_free(ctx); return 1; // success }