|
|
|
@ -39,21 +39,19 @@ llarp_sendto_dns_hook_func(void *sock, const struct sockaddr *from,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
write404_dnss_response(dnsd_question_request *request)
|
|
|
|
|
write404_dnss_response(const dnsd_question_request *request)
|
|
|
|
|
{
|
|
|
|
|
char buf[BUFFER_SIZE] = {0};
|
|
|
|
|
|
|
|
|
|
char *write_buffer = buf;
|
|
|
|
|
char *bufferBegin = buf;
|
|
|
|
|
// build header
|
|
|
|
|
put16bits(write_buffer, request->id);
|
|
|
|
|
int fields = (1 << 15); // QR => message type, 1 = response
|
|
|
|
|
fields += (0 << 14); // I think opcode is always 0
|
|
|
|
|
fields += 3; // response code (3 => not found, 0 = Ok)
|
|
|
|
|
put16bits(write_buffer, fields);
|
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
|
// not found flag set
|
|
|
|
|
put16bits(write_buffer, (1 << 15) | request->hdr.fields() | 3);
|
|
|
|
|
|
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
|
put16bits(write_buffer, 1); // AN (number of answers)
|
|
|
|
|
put16bits(write_buffer, 0); // AN (number of answers)
|
|
|
|
|
put16bits(write_buffer, 0); // NS (number of auth RRs)
|
|
|
|
|
put16bits(write_buffer, 0); // AR (number of Additional RRs)
|
|
|
|
|
|
|
|
|
@ -62,15 +60,6 @@ write404_dnss_response(dnsd_question_request *request)
|
|
|
|
|
put16bits(write_buffer, request->question.type);
|
|
|
|
|
put16bits(write_buffer, request->question.qClass);
|
|
|
|
|
|
|
|
|
|
// code answer
|
|
|
|
|
code_domain(write_buffer, request->question.name); // com, type=6, ttl=0
|
|
|
|
|
put16bits(write_buffer, request->question.type);
|
|
|
|
|
put16bits(write_buffer, request->question.qClass);
|
|
|
|
|
put32bits(write_buffer, 1); // ttl
|
|
|
|
|
|
|
|
|
|
put16bits(write_buffer, 1); // rdLength
|
|
|
|
|
*write_buffer++ = 0; // write a null byte
|
|
|
|
|
|
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
|
llarp::LogDebug("Sending 404, ", out_bytes, " bytes");
|
|
|
|
|
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
|
|
|
|
@ -78,21 +67,18 @@ write404_dnss_response(dnsd_question_request *request)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
writecname_dnss_response(std::string cname, dnsd_question_request *request)
|
|
|
|
|
writecname_dnss_response(std::string cname, const dnsd_question_request *request)
|
|
|
|
|
{
|
|
|
|
|
char buf[BUFFER_SIZE] = {0};
|
|
|
|
|
|
|
|
|
|
char *write_buffer = buf;
|
|
|
|
|
char *bufferBegin = buf;
|
|
|
|
|
// build header
|
|
|
|
|
put16bits(write_buffer, request->id);
|
|
|
|
|
int fields = (1 << 15); // QR => message type, 1 = response
|
|
|
|
|
fields += (0 << 14); // I think opcode is always 0
|
|
|
|
|
fields += 0; // response code (3 => not found, 0 = Ok)
|
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
|
// fields |= 1UL << 7; // RA recursion available
|
|
|
|
|
// fields |= 1UL << 8; // RD recursion desired
|
|
|
|
|
// fields |= 1UL << 9; // 9 is truncate, forces TCP
|
|
|
|
|
put16bits(write_buffer, fields);
|
|
|
|
|
put16bits(write_buffer, request->hdr.fields() | (1 << 15));
|
|
|
|
|
|
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
|
put16bits(write_buffer, 1); // AN (number of answers)
|
|
|
|
@ -145,18 +131,16 @@ writecname_dnss_response(std::string cname, dnsd_question_request *request)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
writesend_dnss_revresponse(std::string reverse, dnsd_question_request *request)
|
|
|
|
|
writesend_dnss_revresponse(std::string reverse, const dnsd_question_request *request)
|
|
|
|
|
{
|
|
|
|
|
char buf[BUFFER_SIZE] = {0};
|
|
|
|
|
|
|
|
|
|
char *write_buffer = buf;
|
|
|
|
|
char *bufferBegin = buf;
|
|
|
|
|
// build header
|
|
|
|
|
put16bits(write_buffer, request->id);
|
|
|
|
|
int fields = (1 << 15); // QR => message type, 1 = response
|
|
|
|
|
fields += (0 << 14); // I think opcode is always 0
|
|
|
|
|
fields += 0; // response code (3 => not found, 0 = Ok)
|
|
|
|
|
put16bits(write_buffer, fields);
|
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
|
// response
|
|
|
|
|
put16bits(write_buffer,request->hdr.fields() | (1 << 15) | (1 << 10));
|
|
|
|
|
|
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
|
put16bits(write_buffer, 1); // AN (number of answers)
|
|
|
|
@ -173,7 +157,7 @@ writesend_dnss_revresponse(std::string reverse, dnsd_question_request *request)
|
|
|
|
|
put16bits(write_buffer, request->question.type);
|
|
|
|
|
put16bits(write_buffer, request->question.qClass);
|
|
|
|
|
put32bits(write_buffer, 1); // ttl
|
|
|
|
|
put16bits(write_buffer, reverse.length() + 2); // rdLength
|
|
|
|
|
put16bits(write_buffer, reverse.size() + 2); // rdLength
|
|
|
|
|
code_domain(write_buffer, reverse);
|
|
|
|
|
|
|
|
|
|
uint32_t out_bytes = write_buffer - bufferBegin;
|
|
|
|
@ -186,7 +170,7 @@ writesend_dnss_revresponse(std::string reverse, dnsd_question_request *request)
|
|
|
|
|
// otherwise ttl, type and class can't be relayed correctly
|
|
|
|
|
void
|
|
|
|
|
writesend_dnss_response(llarp::huint32_t *hostRes,
|
|
|
|
|
dnsd_question_request *request)
|
|
|
|
|
const dnsd_question_request *request)
|
|
|
|
|
{
|
|
|
|
|
// llarp::Addr test(*from);
|
|
|
|
|
// llarp::LogInfo("from ", test);
|
|
|
|
@ -202,11 +186,8 @@ writesend_dnss_response(llarp::huint32_t *hostRes,
|
|
|
|
|
char *write_buffer = buf;
|
|
|
|
|
char *bufferBegin = buf;
|
|
|
|
|
// build header
|
|
|
|
|
put16bits(write_buffer, request->id);
|
|
|
|
|
int fields = (1 << 15); // QR => message type, 1 = response
|
|
|
|
|
fields += (0 << 14); // I think opcode is always 0
|
|
|
|
|
fields += 0; // response code (3 => not found, 0 = Ok)
|
|
|
|
|
put16bits(write_buffer, fields);
|
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
|
put16bits(write_buffer, request->hdr.fields() | (1 << 15));
|
|
|
|
|
|
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
|
put16bits(write_buffer, 1); // AN (number of answers)
|
|
|
|
@ -260,11 +241,8 @@ writesend_dnss_mxresponse(uint16_t priority, std::string mx,
|
|
|
|
|
char *write_buffer = buf;
|
|
|
|
|
char *bufferBegin = buf;
|
|
|
|
|
// build header
|
|
|
|
|
put16bits(write_buffer, request->id);
|
|
|
|
|
int fields = (1 << 15); // QR => message type, 1 = response
|
|
|
|
|
fields += (0 << 14); // I think opcode is always 0
|
|
|
|
|
fields += 0; // response code (3 => not found, 0 = Ok)
|
|
|
|
|
put16bits(write_buffer, fields);
|
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
|
put16bits(write_buffer, request->hdr.fields() | (1 << 15));
|
|
|
|
|
|
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
|
put16bits(write_buffer, 1); // AN (number of answers)
|
|
|
|
@ -302,11 +280,8 @@ writesend_dnss_txtresponse(std::string txt, const struct sockaddr *from,
|
|
|
|
|
char *write_buffer = buf;
|
|
|
|
|
char *bufferBegin = buf;
|
|
|
|
|
// build header
|
|
|
|
|
put16bits(write_buffer, request->id);
|
|
|
|
|
int fields = (1 << 15); // QR => message type, 1 = response
|
|
|
|
|
fields += (0 << 14); // I think opcode is always 0
|
|
|
|
|
fields += 0; // response code (3 => not found, 0 = Ok)
|
|
|
|
|
put16bits(write_buffer, fields);
|
|
|
|
|
put16bits(write_buffer, request->hdr.id);
|
|
|
|
|
put16bits(write_buffer, request->hdr.fields() | (1 << 15));
|
|
|
|
|
|
|
|
|
|
put16bits(write_buffer, 1); // QD (number of questions)
|
|
|
|
|
put16bits(write_buffer, 1); // AN (number of answers)
|
|
|
|
@ -347,7 +322,7 @@ handle_dnsc_result(dnsc_answer_request *client_request)
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
client_request->packet.header->id = server_request->id; // stomp ID
|
|
|
|
|
client_request->packet.header.id = server_request->hdr.id; // stomp ID
|
|
|
|
|
std::vector< byte_t > test = packet2bytes(client_request->packet);
|
|
|
|
|
// llarp::LogInfo("packet2bytes figures we should send ", test.size(), "
|
|
|
|
|
// bytes");
|
|
|
|
@ -396,17 +371,21 @@ handle_dnsc_result(dnsc_answer_request *client_request)
|
|
|
|
|
|
|
|
|
|
// our generic version
|
|
|
|
|
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 char *p_buffer = (const char *)buffer.base;
|
|
|
|
|
const char *p_buffer = (const char *)buffer->base;
|
|
|
|
|
|
|
|
|
|
int rcode = (buffer[3] & 0x0F);
|
|
|
|
|
int rcode = (buffer->base[3] & 0x0F);
|
|
|
|
|
llarp::LogDebug("dnsd rcode ", rcode);
|
|
|
|
|
|
|
|
|
|
dns_msg_header *msg = decode_hdr(buffer);
|
|
|
|
|
|
|
|
|
|
if(!decode_hdr(buffer, &request->hdr))
|
|
|
|
|
{
|
|
|
|
|
llarp::LogError("failed to decode dns header");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
p_buffer += HDR_OFFSET;
|
|
|
|
|
request->id = msg->id;
|
|
|
|
|
std::string m_qName = "";
|
|
|
|
|
int length = *p_buffer++;
|
|
|
|
|
while(length != 0)
|
|
|
|
@ -533,9 +512,8 @@ llarp_handle_dnsd_recvfrom(struct llarp_udp_io *udp,
|
|
|
|
|
llarp_dns_request->llarp = true;
|
|
|
|
|
llarp_dns_request->sendto_hook =
|
|
|
|
|
&llarp_sendto_dns_hook_func; // set sock hook
|
|
|
|
|
|
|
|
|
|
// llarp::LogInfo("Server request's UDP ", llarp_dns_request->user);
|
|
|
|
|
handle_recvfrom(buf, llarp_dns_request);
|
|
|
|
|
handle_recvfrom(&buf, llarp_dns_request);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@ -555,7 +533,7 @@ raw_handle_recvfrom(int *sockfd, const struct sockaddr *saddr,
|
|
|
|
|
llarp_dns_request->llarp = false;
|
|
|
|
|
llarp_dns_request->sendto_hook = &raw_sendto_dns_hook_func;
|
|
|
|
|
|
|
|
|
|
handle_recvfrom(buffer, llarp_dns_request);
|
|
|
|
|
handle_recvfrom(&buffer, llarp_dns_request);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|