1
1
Fork 0
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:
Ryan Tharp 2018-11-21 15:34:26 -08:00
parent 730fff7438
commit adab894ffe
2 changed files with 69 additions and 48 deletions

View file

@ -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,

View file

@ -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
{