|
|
@ -48,7 +48,7 @@ write404_dnss_response(const dnsd_question_request *request)
|
|
|
|
// build header
|
|
|
|
// build header
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
// not found flag set
|
|
|
|
// not found flag set
|
|
|
|
put16bits(write_buffer, (1 << 15) | request->hdr.fields() | 3);
|
|
|
|
put16bits(write_buffer, (1 << 15) | request->hdr.fields() | 3);
|
|
|
|
|
|
|
|
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
put16bits(write_buffer, 0); // AN (number of answers)
|
|
|
|
put16bits(write_buffer, 0); // AN (number of answers)
|
|
|
@ -63,11 +63,13 @@ write404_dnss_response(const dnsd_question_request *request)
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
llarp::LogDebug("Sending 404, ", out_bytes, " bytes");
|
|
|
|
llarp::LogDebug("Sending 404, ", out_bytes, " bytes");
|
|
|
|
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
|
|
|
|
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
|
|
|
|
request->sendto_hook(request->user, request->from, llarp::InitBuffer(buf, out_bytes));
|
|
|
|
request->sendto_hook(request->user, request->from,
|
|
|
|
|
|
|
|
llarp::InitBuffer(buf, out_bytes));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
writecname_dnss_response(std::string cname, const dnsd_question_request *request)
|
|
|
|
writecname_dnss_response(std::string cname,
|
|
|
|
|
|
|
|
const dnsd_question_request *request)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char buf[BUFFER_SIZE] = {0};
|
|
|
|
char buf[BUFFER_SIZE] = {0};
|
|
|
|
|
|
|
|
|
|
|
@ -127,11 +129,13 @@ writecname_dnss_response(std::string cname, const dnsd_question_request *request
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
llarp::LogDebug("Sending cname, ", out_bytes, " bytes");
|
|
|
|
llarp::LogDebug("Sending cname, ", out_bytes, " bytes");
|
|
|
|
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
|
|
|
|
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
|
|
|
|
request->sendto_hook(request->user, request->from, llarp::InitBuffer(buf, out_bytes));
|
|
|
|
request->sendto_hook(request->user, request->from,
|
|
|
|
|
|
|
|
llarp::InitBuffer(buf, out_bytes));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|
writesend_dnss_revresponse(std::string reverse, const dnsd_question_request *request)
|
|
|
|
writesend_dnss_revresponse(std::string reverse,
|
|
|
|
|
|
|
|
const dnsd_question_request *request)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
char buf[BUFFER_SIZE] = {0};
|
|
|
|
char buf[BUFFER_SIZE] = {0};
|
|
|
|
|
|
|
|
|
|
|
@ -140,7 +144,7 @@ writesend_dnss_revresponse(std::string reverse, const dnsd_question_request *req
|
|
|
|
// build header
|
|
|
|
// build header
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
// response
|
|
|
|
// response
|
|
|
|
put16bits(write_buffer,request->hdr.fields() | (1 << 15) | (1 << 10));
|
|
|
|
put16bits(write_buffer, request->hdr.fields() | (1 << 15) | (1 << 10));
|
|
|
|
|
|
|
|
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
put16bits(write_buffer, 1); // AN (number of answers)
|
|
|
|
put16bits(write_buffer, 1); // AN (number of answers)
|
|
|
@ -156,14 +160,15 @@ writesend_dnss_revresponse(std::string reverse, const dnsd_question_request *req
|
|
|
|
code_domain(write_buffer, request->question.name); // com, type=6, ttl=0
|
|
|
|
code_domain(write_buffer, request->question.name); // com, type=6, ttl=0
|
|
|
|
put16bits(write_buffer, request->question.type);
|
|
|
|
put16bits(write_buffer, request->question.type);
|
|
|
|
put16bits(write_buffer, request->question.qClass);
|
|
|
|
put16bits(write_buffer, request->question.qClass);
|
|
|
|
put32bits(write_buffer, 1); // ttl
|
|
|
|
put32bits(write_buffer, 1); // ttl
|
|
|
|
put16bits(write_buffer, reverse.size() + 2); // rdLength
|
|
|
|
put16bits(write_buffer, reverse.size() + 2); // rdLength
|
|
|
|
code_domain(write_buffer, reverse);
|
|
|
|
code_domain(write_buffer, reverse);
|
|
|
|
|
|
|
|
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
llarp::LogDebug("Sending reverse: ", reverse, " ", out_bytes, " bytes");
|
|
|
|
llarp::LogDebug("Sending reverse: ", reverse, " ", out_bytes, " bytes");
|
|
|
|
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
|
|
|
|
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
|
|
|
|
request->sendto_hook(request->user, request->from, llarp::InitBuffer(buf, out_bytes));
|
|
|
|
request->sendto_hook(request->user, request->from,
|
|
|
|
|
|
|
|
llarp::InitBuffer(buf, out_bytes));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// FIXME: we need an DNS answer not a sockaddr
|
|
|
|
// FIXME: we need an DNS answer not a sockaddr
|
|
|
@ -228,7 +233,8 @@ writesend_dnss_response(llarp::huint32_t *hostRes,
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
llarp::LogDebug("Sending found, ", out_bytes, " bytes");
|
|
|
|
llarp::LogDebug("Sending found, ", out_bytes, " bytes");
|
|
|
|
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
|
|
|
|
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
|
|
|
|
request->sendto_hook(request->user, request->from, llarp::InitBuffer(buf, out_bytes));
|
|
|
|
request->sendto_hook(request->user, request->from,
|
|
|
|
|
|
|
|
llarp::InitBuffer(buf, out_bytes));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
@ -323,7 +329,7 @@ handle_dnsc_result(dnsc_answer_request *client_request)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
client_request->packet.header.id = server_request->hdr.id; // stomp ID
|
|
|
|
client_request->packet.header.id = server_request->hdr.id; // stomp ID
|
|
|
|
std::vector< byte_t > test = packet2bytes(client_request->packet);
|
|
|
|
std::vector< byte_t > test = packet2bytes(client_request->packet);
|
|
|
|
// llarp::LogInfo("packet2bytes figures we should send ", test.size(), "
|
|
|
|
// llarp::LogInfo("packet2bytes figures we should send ", test.size(), "
|
|
|
|
// bytes");
|
|
|
|
// bytes");
|
|
|
|
|
|
|
|
|
|
|
@ -371,7 +377,7 @@ handle_dnsc_result(dnsc_answer_request *client_request)
|
|
|
|
|
|
|
|
|
|
|
|
// our generic version
|
|
|
|
// our generic version
|
|
|
|
void
|
|
|
|
void
|
|
|
|
handle_recvfrom(llarp_buffer_t * buffer, dnsd_question_request *request)
|
|
|
|
handle_recvfrom(llarp_buffer_t *buffer, dnsd_question_request *request)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const size_t HDR_OFFSET = 12;
|
|
|
|
const size_t HDR_OFFSET = 12;
|
|
|
|
const char *p_buffer = (const char *)buffer->base;
|
|
|
|
const char *p_buffer = (const char *)buffer->base;
|
|
|
@ -379,7 +385,6 @@ handle_recvfrom(llarp_buffer_t * buffer, dnsd_question_request *request)
|
|
|
|
int rcode = (buffer->base[3] & 0x0F);
|
|
|
|
int rcode = (buffer->base[3] & 0x0F);
|
|
|
|
llarp::LogDebug("dnsd rcode ", rcode);
|
|
|
|
llarp::LogDebug("dnsd rcode ", rcode);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!decode_hdr(buffer, &request->hdr))
|
|
|
|
if(!decode_hdr(buffer, &request->hdr))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
llarp::LogError("failed to decode dns header");
|
|
|
|
llarp::LogError("failed to decode dns header");
|
|
|
|