|
|
|
@ -94,7 +94,7 @@ dns_query *
|
|
|
|
|
answer_request_alloc(struct dnsc_context *dnsc, void *sock, const char *url,
|
|
|
|
|
dnsc_answer_hook_func resolved, void *user)
|
|
|
|
|
{
|
|
|
|
|
dnsc_answer_request *request = new dnsc_answer_request;
|
|
|
|
|
std::unique_ptr< dnsc_answer_request > request(new dnsc_answer_request);
|
|
|
|
|
if(!request)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("Couldn't make dnsc request");
|
|
|
|
@ -123,14 +123,23 @@ answer_request_alloc(struct dnsc_context *dnsc, void *sock, const char *url,
|
|
|
|
|
|
|
|
|
|
// register our self with the tracker
|
|
|
|
|
dns_tracker *tracker = request->context->tracker;
|
|
|
|
|
uint16_t id = ++tracker->c_requests;
|
|
|
|
|
if(!tracker)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("no tracker in DNSc context");
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint16_t id = ++tracker->c_requests;
|
|
|
|
|
if(id == 65535)
|
|
|
|
|
id = 0;
|
|
|
|
|
tracker->client_request[id] = std::unique_ptr< dnsc_answer_request >(request);
|
|
|
|
|
// conflict: do we need this?
|
|
|
|
|
//tracker->client_request[id] = std::unique_ptr< dnsc_answer_request >(request);
|
|
|
|
|
|
|
|
|
|
dns_query *dns_packet = build_dns_packet(
|
|
|
|
|
(char *)request->question.name.c_str(), id, request->question.type);
|
|
|
|
|
|
|
|
|
|
tracker->client_request[id] = std::move(request);
|
|
|
|
|
|
|
|
|
|
return dns_packet;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -306,7 +315,7 @@ generic_handle_dnsc_recvfrom(dnsc_answer_request *request,
|
|
|
|
|
MSGID = (uint16_t)buffer[0] * 0x100 + buffer[1];
|
|
|
|
|
// llarp::LogDebug("answer msg id: %u\n", MSGID);
|
|
|
|
|
*/
|
|
|
|
|
llarp::Addr upstreamAddr(*request->context->server);
|
|
|
|
|
llarp::Addr upstreamAddr = request->context->resolvers[0];
|
|
|
|
|
|
|
|
|
|
if(answer == nullptr)
|
|
|
|
|
{
|
|
|
|
@ -390,7 +399,7 @@ generic_handle_dnsc_recvfrom(dnsc_answer_request *request,
|
|
|
|
|
}
|
|
|
|
|
else if(request->question.type == 12)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogInfo("Resolving PTR");
|
|
|
|
|
llarp::LogDebug("Resolving PTR");
|
|
|
|
|
request->found = true;
|
|
|
|
|
request->revDNS = std::string((char *)answer->rData);
|
|
|
|
|
request->resolved(request);
|
|
|
|
@ -411,7 +420,7 @@ raw_resolve_host(struct dnsc_context *dnsc, const char *url,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// char *word;
|
|
|
|
|
llarp::Addr upstreamAddr(*dnsc->server);
|
|
|
|
|
llarp::Addr upstreamAddr = dnsc->resolvers[0];
|
|
|
|
|
llarp::LogDebug("Asking DNS server ", upstreamAddr, " about ", url);
|
|
|
|
|
|
|
|
|
|
struct sockaddr_in addr;
|
|
|
|
@ -432,7 +441,7 @@ raw_resolve_host(struct dnsc_context *dnsc, const char *url,
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// socket = sockfd;
|
|
|
|
|
sockaddr_in *dnscSock = ((sockaddr_in *)dnsc->server);
|
|
|
|
|
sockaddr_in *dnscSock = ((sockaddr_in *)dnsc->resolvers[0].addr4());
|
|
|
|
|
|
|
|
|
|
memset(&addr, 0, sizeof(addr));
|
|
|
|
|
addr.sin_family = AF_INET;
|
|
|
|
@ -522,6 +531,7 @@ bool
|
|
|
|
|
llarp_resolve_host(struct dnsc_context *dnsc, const char *url,
|
|
|
|
|
dnsc_answer_hook_func resolved, void *user)
|
|
|
|
|
{
|
|
|
|
|
// FIXME: probably can be stack allocated
|
|
|
|
|
dns_query *dns_packet =
|
|
|
|
|
answer_request_alloc(dnsc, &dnsc->udp, url, resolved, user);
|
|
|
|
|
if(!dns_packet)
|
|
|
|
@ -571,7 +581,7 @@ llarp_resolve_host(struct dnsc_context *dnsc, const char *url,
|
|
|
|
|
// bytes");
|
|
|
|
|
|
|
|
|
|
// ssize_t ret = llarp_ev_udp_sendto(dnsc->udp, dnsc->server, bytes, length);
|
|
|
|
|
ssize_t ret = llarp_ev_udp_sendto(dnsc->udp, dnsc->server,
|
|
|
|
|
ssize_t ret = llarp_ev_udp_sendto(dnsc->udp, dnsc->resolvers[0],
|
|
|
|
|
dns_packet->request, dns_packet->length);
|
|
|
|
|
delete dns_packet;
|
|
|
|
|
if(ret < 0)
|
|
|
|
@ -599,28 +609,39 @@ llarp_host_resolved(dnsc_answer_request *request)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogWarn("Couldn't disable ", request);
|
|
|
|
|
}
|
|
|
|
|
// delete request;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_dnsc_init(struct dnsc_context *dnsc, struct llarp_logic *logic,
|
|
|
|
|
struct llarp_udp_io *udp, const char *dnsc_hostname,
|
|
|
|
|
uint16_t dnsc_port)
|
|
|
|
|
struct llarp_ev_loop *netloop, const llarp::Addr &dnsc_sockaddr)
|
|
|
|
|
{
|
|
|
|
|
sockaddr_in *trgaddr = new sockaddr_in;
|
|
|
|
|
trgaddr->sin_addr.s_addr = inet_addr(dnsc_hostname);
|
|
|
|
|
trgaddr->sin_port = htons(dnsc_port);
|
|
|
|
|
trgaddr->sin_family = AF_INET;
|
|
|
|
|
dnsc->server = (sockaddr *)trgaddr;
|
|
|
|
|
dnsc->udp = udp;
|
|
|
|
|
dnsc->tracker = &dns_udp_tracker;
|
|
|
|
|
dnsc->logic = logic;
|
|
|
|
|
// create client socket
|
|
|
|
|
if(netloop)
|
|
|
|
|
{
|
|
|
|
|
if(!dnsc->udp)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("DNSc udp isn't set");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
llarp::Addr dnsc_srcsockaddr(0, 0, 0, 0, 0); // just find a public udp port
|
|
|
|
|
int bind_res = llarp_ev_add_udp(netloop, dnsc->udp,
|
|
|
|
|
(const sockaddr *)dnsc_srcsockaddr);
|
|
|
|
|
if(bind_res == -1)
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("Couldn't bind to ", dnsc_srcsockaddr);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
llarp::LogInfo("DNSc adding relay ", dnsc_sockaddr);
|
|
|
|
|
dnsc->resolvers.push_back(dnsc_sockaddr);
|
|
|
|
|
dnsc->tracker = &dns_udp_tracker;
|
|
|
|
|
dnsc->logic = logic;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
llarp_dnsc_stop(struct dnsc_context *dnsc)
|
|
|
|
|
{
|
|
|
|
|
delete(sockaddr_in *)dnsc->server; // deallocation
|
|
|
|
|
// delete(sockaddr_in *)dnsc->server; // deallocation
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|