mirror of
https://github.com/oxen-io/lokinet
synced 2023-12-14 06:53:00 +01:00
llarp_buffer_t conversion, decode the header one less time, move up where packet hdr is set, use emplace_back instead of push_back
This commit is contained in:
parent
730fff7438
commit
adab894ffe
|
@ -82,13 +82,13 @@ struct dnsc_context
|
|||
struct llarp_logic *logic;
|
||||
};
|
||||
|
||||
/// async resolve a hostname using generic socks
|
||||
/// async (blocking w/callback) resolve a hostname using generic socks
|
||||
void
|
||||
raw_resolve_host(struct dnsc_context *const dnsc, const char *url,
|
||||
dnsc_answer_hook_func resolved, void *const user,
|
||||
uint16_t type);
|
||||
|
||||
/// async resolve a hostname using llarp platform framework
|
||||
/// async (non blocking w/callback) resolve a hostname using llarp platform framework
|
||||
bool
|
||||
llarp_resolve_host(struct dnsc_context *const dns, const char *url,
|
||||
dnsc_answer_hook_func resolved, void *const user,
|
||||
|
|
113
llarp/dnsc.cpp
113
llarp/dnsc.cpp
|
@ -155,7 +155,7 @@ void
|
|||
generic_handle_dnsc_recvfrom(dnsc_answer_request *request,
|
||||
__attribute__((unused))
|
||||
const struct sockaddr *saddr,
|
||||
const void *buf, ssize_t sz)
|
||||
llarp_buffer_t buffer, dns_msg_header *hdr)
|
||||
{
|
||||
if(!request)
|
||||
{
|
||||
|
@ -165,23 +165,15 @@ generic_handle_dnsc_recvfrom(dnsc_answer_request *request,
|
|||
return;
|
||||
}
|
||||
// llarp::LogInfo("got a response, udp user is ", udp->user);
|
||||
|
||||
unsigned char *castBuf = (unsigned char *)buf;
|
||||
const char *const castBufc = (const char *)buf;
|
||||
|
||||
//unsigned char *castBuf = (unsigned char *)buf;
|
||||
//const char *const castBufc = (const char *)buf;
|
||||
// auto buffer = llarp::StackBuffer< decltype(castBuf) >(castBuf);
|
||||
dns_msg_header *hdr = decode_hdr((const char *)castBuf);
|
||||
request->packet.header = hdr;
|
||||
size_t sz = buffer.sz;
|
||||
|
||||
llarp::LogDebug("Header got client responses for id: ", hdr->id);
|
||||
// llarp_dnsc_unbind(request);
|
||||
|
||||
if(sz < 0)
|
||||
{
|
||||
llarp::LogWarn("Error Receiving DNS Client Response");
|
||||
request->resolved(request);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// unsigned char *castBuf = (unsigned char *)buf;
|
||||
// auto buffer = llarp::StackBuffer< decltype(castBuf) >(castBuf);
|
||||
|
||||
|
@ -206,29 +198,29 @@ generic_handle_dnsc_recvfrom(dnsc_answer_request *request,
|
|||
// rcode = (buffer[3] & 0x0F);
|
||||
// llarp::LogInfo("dnsc rcode ", rcode);
|
||||
|
||||
dns_msg_header *msg = decode_hdr((const char *)castBuf);
|
||||
castBuf += 12;
|
||||
llarp::LogDebug("msg id ", msg->id);
|
||||
uint8_t qr = msg->qr;
|
||||
//dns_msg_header *msg = decode_hdr((const char *)castBuf);
|
||||
//dns_msg_header *msg = hdr;
|
||||
//castBuf += 12;
|
||||
llarp::LogDebug("msg id ", hdr->id);
|
||||
uint8_t qr = hdr->qr;
|
||||
llarp::LogDebug("msg qr ", qr);
|
||||
uint8_t opcode = msg->opcode;
|
||||
uint8_t opcode = hdr->opcode;
|
||||
llarp::LogDebug("msg op ", opcode);
|
||||
rcode = msg->rcode;
|
||||
rcode = hdr->rcode;
|
||||
llarp::LogDebug("msg rc ", rcode);
|
||||
|
||||
llarp::LogDebug("msg qdc ", msg->qdCount);
|
||||
llarp::LogDebug("msg anc ", msg->anCount);
|
||||
llarp::LogDebug("msg nsc ", msg->nsCount);
|
||||
llarp::LogDebug("msg arc ", msg->arCount);
|
||||
llarp::LogDebug("msg qdc ", hdr->qdCount);
|
||||
llarp::LogDebug("msg anc ", hdr->anCount);
|
||||
llarp::LogDebug("msg nsc ", hdr->nsCount);
|
||||
llarp::LogDebug("msg arc ", hdr->arCount);
|
||||
|
||||
// FIXME: only handling one atm
|
||||
uint32_t pos = 12; // just set after header
|
||||
dns_msg_question *question = nullptr;
|
||||
for(uint32_t i = 0; i < hdr->qdCount; i++)
|
||||
{
|
||||
question = decode_question(castBufc, &pos);
|
||||
std::unique_ptr< dns_msg_question > unique(question);
|
||||
request->packet.questions.push_back(std::move(unique));
|
||||
question = decode_question((char *)buffer.base, &pos);
|
||||
request->packet.questions.emplace_back(question);
|
||||
// llarp::LogDebug("Read a question, now at ", std::to_string(pos));
|
||||
// 1 dot: 1 byte for length + length
|
||||
// 4 bytes for class/type
|
||||
|
@ -246,10 +238,9 @@ generic_handle_dnsc_recvfrom(dnsc_answer_request *request,
|
|||
for(uint32_t i = 0; i < hdr->anCount; i++)
|
||||
{
|
||||
// pos = 0; // reset pos
|
||||
answer = decode_answer(castBufc, &pos);
|
||||
answer = decode_answer((char *)buffer.base, &pos);
|
||||
answers.push_back(answer);
|
||||
std::unique_ptr< dns_msg_answer > unique(answer);
|
||||
request->packet.answers.push_back(std::move(unique));
|
||||
request->packet.answers.emplace_back(answer);
|
||||
/*
|
||||
llarp::LogDebug("Read an answer ", answer->type, " for ",
|
||||
request->question.name, ", now at ", std::to_string(pos));
|
||||
|
@ -304,16 +295,15 @@ generic_handle_dnsc_recvfrom(dnsc_answer_request *request,
|
|||
for(uint32_t i = 0; i < hdr->nsCount; i++)
|
||||
{
|
||||
// pos = 0; // reset pos
|
||||
answer = decode_answer(castBufc, &pos);
|
||||
std::unique_ptr< dns_msg_answer > unique(answer);
|
||||
request->packet.auth_rrs.push_back(std::move(unique));
|
||||
answer = decode_answer((char *)buffer.base, &pos);
|
||||
request->packet.answers.emplace_back(answer);
|
||||
// answers.push_back(answer);
|
||||
/*
|
||||
llarp::LogDebug("Read an authority for ",
|
||||
request->question.name, " at ", std::to_string(pos));
|
||||
*/
|
||||
// castBuf += answer->name.length() + 4 + 4 + 4 + answer->rdLen;
|
||||
if((ssize_t)pos > sz)
|
||||
if((size_t)pos > sz)
|
||||
{
|
||||
llarp::LogWarn("Would read past end of dns packet. for ",
|
||||
request->question.name);
|
||||
|
@ -323,14 +313,13 @@ generic_handle_dnsc_recvfrom(dnsc_answer_request *request,
|
|||
|
||||
for(uint32_t i = 0; i < hdr->arCount; i++)
|
||||
{
|
||||
answer = decode_answer(castBufc, &pos);
|
||||
std::unique_ptr< dns_msg_answer > unique(answer);
|
||||
request->packet.additional_rrs.push_back(std::move(unique));
|
||||
answer = decode_answer((char *)buffer.base, &pos);
|
||||
request->packet.answers.emplace_back(answer);
|
||||
/*
|
||||
llarp::LogDebug("Read an addl RR for ",
|
||||
request->question.name, " at ", std::to_string(pos));
|
||||
*/
|
||||
if((ssize_t)pos > sz)
|
||||
if((size_t)pos > sz)
|
||||
{
|
||||
llarp::LogWarn("Would read past end of dns packet. for ",
|
||||
request->question.name);
|
||||
|
@ -625,7 +614,11 @@ raw_resolve_host(struct dnsc_context *const dnsc, const char *url,
|
|||
return;
|
||||
}
|
||||
llarp::LogInfo("closing new socket\n");
|
||||
|
||||
if(!size)
|
||||
{
|
||||
llarp::LogWarn("Error Receiving DNS Client Response");
|
||||
return;
|
||||
}
|
||||
// hexdump("received packet", &buffer, ret);
|
||||
|
||||
#ifndef _WIN32
|
||||
|
@ -634,15 +627,30 @@ raw_resolve_host(struct dnsc_context *const dnsc, const char *url,
|
|||
closesocket(sockfd);
|
||||
#endif
|
||||
|
||||
unsigned char *castBuf = (unsigned char *)buffer;
|
||||
llarp_buffer_t lbuffer;
|
||||
lbuffer.base = (byte_t *)buffer;
|
||||
lbuffer.cur = lbuffer.base;
|
||||
lbuffer.sz = size;
|
||||
|
||||
//unsigned char *castBuf = (unsigned char *)buffer;
|
||||
// auto buffer = llarp::StackBuffer< decltype(castBuf) >(castBuf);
|
||||
dns_msg_header *hdr = decode_hdr((const char *)castBuf);
|
||||
dns_msg_header *hdr = decode_hdr(lbuffer);
|
||||
llarp::LogInfo("response header says it belongs to id #", hdr->id);
|
||||
|
||||
// if we sent this out, then there's an id
|
||||
struct dns_tracker *tracker = (struct dns_tracker *)dnsc->tracker;
|
||||
generic_handle_dnsc_recvfrom(tracker->client_request[hdr->id].get(), nullptr,
|
||||
castBuf, size);
|
||||
struct dnsc_answer_request *request = tracker->client_request[hdr->id].get();
|
||||
|
||||
if (request)
|
||||
{
|
||||
request->packet.header = hdr;
|
||||
generic_handle_dnsc_recvfrom(tracker->client_request[hdr->id].get(), nullptr,
|
||||
lbuffer, hdr);
|
||||
}
|
||||
else
|
||||
{
|
||||
llarp::LogWarn("Ignoring multiple responses on ID #", hdr->id);
|
||||
}
|
||||
}
|
||||
|
||||
/// intermediate udp_io handler
|
||||
|
@ -655,9 +663,21 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *const udp,
|
|||
{
|
||||
llarp::LogWarn("saddr isnt set");
|
||||
}
|
||||
unsigned char *castBuf = (unsigned char *)buf;
|
||||
if(sz < 0)
|
||||
{
|
||||
llarp::LogWarn("Error Receiving DNS Client Response");
|
||||
return;
|
||||
}
|
||||
|
||||
llarp_buffer_t buffer;
|
||||
buffer.base = (byte_t *) buf;
|
||||
buffer.cur = buffer.base;
|
||||
buffer.sz = sz;
|
||||
|
||||
//unsigned char *castBuf = (unsigned char *)buf;
|
||||
// auto buffer = llarp::StackBuffer< decltype(castBuf) >(castBuf);
|
||||
dns_msg_header *hdr = decode_hdr((const char *)castBuf);
|
||||
dns_msg_header *hdr = decode_hdr(buffer);
|
||||
buffer.cur = buffer.base; // reset cursor to beginning
|
||||
|
||||
llarp::LogDebug("Header got client responses for id: ", hdr->id);
|
||||
|
||||
|
@ -668,7 +688,8 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *const udp,
|
|||
// sometimes we'll get double responses
|
||||
if(request)
|
||||
{
|
||||
generic_handle_dnsc_recvfrom(request, saddr, buf, sz);
|
||||
request->packet.header = hdr;
|
||||
generic_handle_dnsc_recvfrom(request, saddr, buffer, hdr);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue