diff --git a/CMakeLists.txt b/CMakeLists.txt index 521b4a6eb..207a55304 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,6 +19,8 @@ else() message(ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.") endif() +set(THREAD_LIB pthread) + if(STATIC_LINK) set(STATIC_LINK_LIBS c) add_cflags("-static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive") @@ -101,7 +103,7 @@ else() ) endif() -set(LIBS ${SODIUM_LIB} pthread) +set(LIBS ${SODIUM_LIB} ${THREAD_LIB}) set(LIB llarp) set(SHARED_LIB ${LIB}) @@ -211,7 +213,6 @@ set(LIB_SRC llarp/service.cpp llarp/transit_hop.cpp llarp/testnet.c - llarp/api/create_session.cpp llarp/api/client.cpp llarp/api/message.cpp llarp/api/parser.cpp @@ -278,7 +279,7 @@ include_directories(llarp) include_directories(include) include_directories(vendor/cppbackport-master/lib) -include_directories(/usr/local/include) +#include_directories(/usr/local/include) include_directories(${sodium_INCLUDE_DIR}) if(SHADOW) @@ -305,6 +306,7 @@ else() add_library(${STATIC_LIB} STATIC ${LIB_SRC}) add_library(libbackport-static STATIC ${CPP_BACKPORT_SRC}) add_library(libllarpplatform-static STATIC ${LIB_PLATFORM_SRC}) + target_link_libraries(libllarpplatform-static ${THREAD_LIB}) target_link_libraries(${STATIC_LIB} ${LIBS} libbackport-static libllarpplatform-static) if(NOT WITH_SHARED) target_link_libraries(${EXE} ${STATIC_LINK_LIBS} ${STATIC_LIB} libbackport-static libllarpplatform-static) diff --git a/daemon/dns.cpp b/daemon/dns.cpp index 1cdeb7256..e0f9e705d 100644 --- a/daemon/dns.cpp +++ b/daemon/dns.cpp @@ -25,6 +25,7 @@ handle_signal(int sig) int main(int argc, char *argv[]) { + dns_context dns; int code = 1; llarp::LogInfo("Starting up server"); @@ -40,59 +41,16 @@ main(int argc, char *argv[]) llarp_ev_loop_alloc(&netloop); // configure main netloop - llarp_udp_io udp; - llarp::Addr p_addr; - sockaddr_in ip4addr; - sockaddr *addr = nullptr; - addr = (sockaddr *)&ip4addr; - llarp::Zero(addr, sizeof(ip4addr)); - addr->sa_family = AF_INET; - - // FIXME: make configureable - ip4addr.sin_port = htons(1053); - p_addr = *addr; - udp.user = nullptr; - udp.recvfrom = &llarp_handle_recvfrom; - llarp::LogDebug("bind DNS Server to ", addr); - if(llarp_ev_add_udp(netloop, &udp, p_addr) == -1) + if(!llarp_dns_init(&dns, netloop, "127.0.0.1", 1052)) { - llarp::LogError("failed to bind to ", addr); - return false; + llarp::LogError("failed to initialize dns subsystem"); + return 1; } - // singlethreaded - if(0) - { - llarp::LogInfo("singlethread start"); - worker = llarp_init_same_process_threadpool(); - logic = llarp_init_single_process_logic(worker); - llarp_ev_loop_run_single_process(netloop, worker, logic); - llarp::LogInfo("singlethread end"); - } - else - { - llarp::LogInfo("multithreaded start"); - // create 2 workers - worker = llarp_init_threadpool(2, "llarp-worker"); - logic = llarp_init_logic(); - auto netio = netloop; - int num_nethreads = 1; - std::vector< std::thread > netio_threads; - while(num_nethreads--) - { - netio_threads.emplace_back([netio]() { llarp_ev_loop_run(netio); }); -#if(__APPLE__ && __MACH__) - -#elif(__FreeBSD__) - pthread_set_name_np(netio_threads.back().native_handle(), "llarp-" - "netio"); -#else - pthread_setname_np(netio_threads.back().native_handle(), "llarp-netio"); -#endif - } - llarp_logic_mainloop(logic); - llarp::LogInfo("multithreaded end"); - } + worker = llarp_init_same_process_threadpool(); + logic = llarp_init_single_process_logic(worker); + llarp::LogInfo("running dns mainloop"); + llarp_ev_loop_run_single_process(netloop, worker, logic); llarp_ev_loop_free(&netloop); } else @@ -136,8 +94,8 @@ main(int argc, char *argv[]) continue; llarp::LogInfo("Received Bytes ", nbytes); - raw_handle_recvfrom(&m_sockfd, (const struct sockaddr *)&clientAddress, - buffer, nbytes); + // raw_handle_recvfrom(&m_sockfd, (const struct sockaddr *)&clientAddress, + // buffer, nbytes); } } diff --git a/include/llarp/dns.h b/include/llarp/dns.h index 28596e427..f6298af36 100644 --- a/include/llarp/dns.h +++ b/include/llarp/dns.h @@ -4,50 +4,87 @@ #include #include // for uint & ssize_t -/** - * dns.h - * - * dns client/server - */ +#ifdef __cplusplus +extern "C" +{ +#endif + /** + * dns.h + * + * dns client/server + */ #define DNC_BUF_SIZE 512 -struct dns_query -{ - uint16_t length; - char *url; - unsigned char request[DNC_BUF_SIZE]; - uint16_t reqType; -}; + struct dns_query + { + uint16_t length; + char *url; + unsigned char request[DNC_BUF_SIZE]; + uint16_t reqType; + }; -struct dns_client_request; + struct dns_client_request; -typedef void (*resolve_dns_hook_func)(dns_client_request *request, - struct sockaddr *); + typedef void (*resolve_dns_hook_func)(dns_client_request *request, + struct sockaddr *); -struct dns_client_request -{ - /// sock type - void *sock; - /// customizeable (used for outer request) - void *user; - /// storage - dns_query query; - /// hook - resolve_dns_hook_func resolved; -}; - -struct sockaddr * -resolveHost(const char *url); -bool -llarp_resolve_host(struct llarp_ev_loop *, const char *url, - resolve_dns_hook_func resolved, void *user); - -void -llarp_handle_recvfrom(struct llarp_udp_io *udp, const struct sockaddr *saddr, - const void *buf, ssize_t sz); -void -raw_handle_recvfrom(int *sockfd, const struct sockaddr *saddr, const void *buf, - ssize_t sz); + struct dns_client_request + { + /// sock type + void *sock; + /// customizeable (used for outer request) + void *user; + /// storage + dns_query query; + /// hook + resolve_dns_hook_func resolved; + }; + + // forward declare + struct dns_context; + + /// returns true if the dns query was intercepted + typedef bool (*intercept_query_hook)(struct dns_context *, const dns_query *); + + /// context for dns subsystem + struct dns_context + { + /// populated by llarp_dns_init + struct llarp_udp_io udp; + /// set by caller + void *user; + /// hook function for intercepting dns requests + intercept_query_hook intercept; + }; + struct sockaddr * + resolveHost(const char *url); + + /// initialize dns subsystem and bind socket + /// returns true on bind success otherwise returns false + bool + llarp_dns_init(struct dns_context *dns, struct llarp_ev_loop *loop, + const char *addr, uint16_t port); + + /// async resolve hostname + bool + llarp_resolve_host(struct dns_context *dns, const char *url, + resolve_dns_hook_func resolved, void *user); + + /* + + // XXX: these should be internal and not exposed + + void + llarp_handle_recvfrom(struct llarp_udp_io *udp, const struct sockaddr *saddr, + const void *buf, ssize_t sz); + void + raw_handle_recvfrom(int *sockfd, const struct sockaddr *saddr, const void + *buf, ssize_t sz); + */ + +#ifdef __cplusplus +} +#endif #endif diff --git a/llarp/dnsc.cpp b/llarp/dnsc.cpp index 960d41378..6f67b4d20 100644 --- a/llarp/dnsc.cpp +++ b/llarp/dnsc.cpp @@ -192,8 +192,8 @@ resolveHost(const char *url) buffer[i + 2], buffer[i + 3]); struct sockaddr *g_addr = new sockaddr; g_addr->sa_family = AF_INET; - g_addr->sa_len = sizeof(in_addr); - struct in_addr *addr = &((struct sockaddr_in *)g_addr)->sin_addr; + // g_addr->sa_len = sizeof(in_addr); + struct in_addr *addr = &((struct sockaddr_in *)g_addr)->sin_addr; unsigned char *ip; // have ip point to s_addr @@ -336,8 +336,8 @@ llarp_handle_dnsclient_recvfrom(struct llarp_udp_io *udp, buffer[i + 2], buffer[i + 3]); struct sockaddr *g_addr = new sockaddr; g_addr->sa_family = AF_INET; - g_addr->sa_len = sizeof(in_addr); - struct in_addr *addr = &((struct sockaddr_in *)g_addr)->sin_addr; + // g_addr->sa_len = sizeof(in_addr); + struct in_addr *addr = &((struct sockaddr_in *)g_addr)->sin_addr; unsigned char *ip; // have ip point to s_addr @@ -429,6 +429,7 @@ llarp_dns_resolve(dns_client_request *request) llarp_udp_io *udp = (llarp_udp_io *)request->sock; // llarp::LogDebug("dns client set to use "); + // XXX: udp user pointer should be set before binding to socket and once udp->user = request; // hexdump("sending packet", &dnsQuery.request, dnsQuery.length); diff --git a/llarp/dnsd.cpp b/llarp/dnsd.cpp index c578d6ee5..0f7bf9633 100644 --- a/llarp/dnsd.cpp +++ b/llarp/dnsd.cpp @@ -54,12 +54,12 @@ decode_hdr(const char *buffer) void code_domain(char *&buffer, const std::string &domain) throw() { - int start(0), end; // indexes + std::string::size_type start(0), end; // indexes // llarp::LogInfo("domain [", domain, "]"); while((end = domain.find('.', start)) != std::string::npos) { *buffer++ = end - start; // label length octet - for(int i = start; i < end; i++) + for(auto i = start; i < end; i++) { *buffer++ = domain[i]; // label octets // llarp::LogInfo("Writing ", domain[i], " at ", i); @@ -70,7 +70,7 @@ code_domain(char *&buffer, const std::string &domain) throw() // llarp::LogInfo("start ", start, " domain size ", domain.size()); *buffer++ = domain.size() - start; // last label length octet - for(int i = start; i < domain.size(); i++) + for(size_t i = start; i < domain.size(); i++) { *buffer++ = domain[i]; // last label octets // llarp::LogInfo("Writing ", domain[i], " at ", i); @@ -222,20 +222,19 @@ handle_recvfrom(const char *buffer, ssize_t nbytes, const struct sockaddr *from, } else { - llarp::Addr anIp; - struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user; + // llarp::Addr anIp; + // struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user; // hostRes = llarp_resolveHost(udp->parent, m_qName.c_str()); - llarp_resolve_host(udp->parent, m_qName.c_str(), &phase2, (void *)request); + // llarp_resolve_host(udp->parent, m_qName.c_str(), &phase2, (void + // *)request); } } -// this is called in net threadpool void -llarp_handle_recvfrom(struct llarp_udp_io *udp, const struct sockaddr *saddr, - const void *buf, ssize_t sz) +handle_dns_recvfrom(struct llarp_udp_io *udp, const struct sockaddr *saddr, + const void *buf, ssize_t sz) { - // llarp_link *link = static_cast< llarp_link * >(udp->user); - llarp::LogInfo("Received Bytes ", sz); + llarp::LogDebug("Received Bytes ", sz); dns_request llarp_dns_request; llarp_dns_request.from = (struct sockaddr *)saddr; llarp_dns_request.user = (void *)udp; @@ -243,14 +242,35 @@ llarp_handle_recvfrom(struct llarp_udp_io *udp, const struct sockaddr *saddr, handle_recvfrom((char *)buf, sz, saddr, &llarp_dns_request); } -void -raw_handle_recvfrom(int *sockfd, const struct sockaddr *saddr, const void *buf, - ssize_t sz) +extern "C" { - llarp::LogInfo("Received Bytes ", sz); - dns_request llarp_dns_request; - llarp_dns_request.from = (struct sockaddr *)saddr; - llarp_dns_request.user = (void *)sockfd; - llarp_dns_request.hook = &raw_sendto_dns_hook_func; - handle_recvfrom((char *)buf, sz, saddr, &llarp_dns_request); + bool + llarp_dns_init(struct dns_context *dns, struct llarp_ev_loop *mainloop, + const char *bindaddr, uint16_t bindport) + { + struct sockaddr_in srcaddr; + if(inet_pton(AF_INET, bindaddr, &srcaddr.sin_addr.s_addr) == -1) + return false; + srcaddr.sin_family = AF_INET; + srcaddr.sin_port = htons(bindport); + dns->udp.user = dns; + dns->udp.recvfrom = &handle_dns_recvfrom; + dns->udp.tick = nullptr; + return llarp_ev_add_udp(mainloop, &dns->udp, (const sockaddr *)&srcaddr) + != -1; + } + + // this is called in net threadpool + + void + raw_handle_recvfrom(int *sockfd, const struct sockaddr *saddr, + const void *buf, ssize_t sz) + { + llarp::LogInfo("Received Bytes ", sz); + dns_request llarp_dns_request; + llarp_dns_request.from = (struct sockaddr *)saddr; + llarp_dns_request.user = (void *)sockfd; + llarp_dns_request.hook = &raw_sendto_dns_hook_func; + handle_recvfrom((char *)buf, sz, saddr, &llarp_dns_request); + } }