fix intercept api, implement new intercept api, logging clean up

This commit is contained in:
Ryan Tharp 2018-07-23 16:56:26 -07:00
parent ca06f1dded
commit b93ea8a087
6 changed files with 62 additions and 38 deletions

View File

@ -20,6 +20,13 @@ handle_signal(int sig)
done = true;
}
sockaddr *
hookChecker(std::string name)
{
llarp::LogInfo("Hooked ", name);
return nullptr;
}
// FIXME: make configurable
#define SERVER "8.8.8.8"
#define PORT 53
@ -47,6 +54,8 @@ main(int argc, char *argv[])
llarp::LogError("Couldnt init dns daemon");
return 0;
}
// Configure intercept
dnsd.intercept = &hookChecker;
// singlethreaded
if(0)

View File

@ -33,6 +33,7 @@ struct dns_tracker
//uint c_responses;
uint c_requests;
std::map< uint, dnsc_answer_request * > client_request;
// FIXME: support multiple dns server contexts
dnsd_context *dnsd;
//std::map< uint, dnsd_question_request * > daemon_request;
};

View File

@ -154,16 +154,16 @@ llarp_handle_dns_recvfrom(struct llarp_udp_io *udp,
// auto buffer = llarp::StackBuffer< decltype(castBuf) >(castBuf);
dns_msg_header *hdr = decode_hdr((const char *)castBuf);
// castBuf += 12;
llarp::LogInfo("msg id ", hdr->id);
llarp::LogInfo("msg qr ", (uint8_t)hdr->qr);
llarp::LogDebug("msg id ", hdr->id);
llarp::LogDebug("msg qr ", (uint8_t)hdr->qr);
if(hdr->qr)
{
llarp::LogInfo("handling as dnsc answer");
llarp::LogDebug("handling as dnsc answer");
llarp_handle_dnsc_recvfrom(udp, saddr, buf, sz);
}
else
{
llarp::LogInfo("handling as dnsd question");
llarp::LogDebug("handling as dnsd question");
llarp_handle_dnsd_recvfrom(udp, saddr, buf, sz);
}
/*

View File

@ -39,7 +39,7 @@ build_dns_packet(char *url, uint16_t id, uint16_t reqType)
// ID
// buffer[0] = (value & 0xFF00) >> 8;
// buffer[1] = value & 0xFF;
llarp::LogInfo("building request ", id);
llarp::LogDebug("building request ", id);
dnsQuery->request[0] = (id & 0xFF00) >> 8;
dnsQuery->request[1] = (id & 0x00FF) >> 0;
@ -306,7 +306,7 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *udp,
auto buffer = llarp::StackBuffer< decltype(castBuf) >(castBuf);
dns_msg_header *hdr = decode_hdr((const char *)castBuf);
llarp::LogInfo("Header got client responses for id: ", hdr->id);
llarp::LogDebug("Header got client responses for id: ", hdr->id);
// if we sent this out, then there's an id
struct dns_tracker *tracker = (struct dns_tracker *)udp->user;
@ -354,18 +354,18 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *udp,
dns_msg_header *msg = decode_hdr((const char *)castBuf);
castBuf += 12;
llarp::LogInfo("msg id ", msg->id);
llarp::LogDebug("msg id ", msg->id);
uint8_t qr = msg->qr;
llarp::LogInfo("msg qr ", qr);
llarp::LogDebug("msg qr ", qr);
uint8_t opcode = msg->opcode;
llarp::LogInfo("msg op ", opcode);
llarp::LogDebug("msg op ", opcode);
rcode = msg->rcode;
llarp::LogInfo("msg rc ", rcode);
llarp::LogDebug("msg rc ", rcode);
llarp::LogInfo("msg qdc ", msg->qdCount);
llarp::LogInfo("msg anc ", msg->anCount);
llarp::LogInfo("msg nsc ", msg->nsCount);
llarp::LogInfo("msg arc ", msg->arCount);
llarp::LogDebug("msg qdc ", msg->qdCount);
llarp::LogDebug("msg anc ", msg->anCount);
llarp::LogDebug("msg nsc ", msg->nsCount);
llarp::LogDebug("msg arc ", msg->arCount);
// we may need to parse question first
@ -384,7 +384,7 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *udp,
for(uint i = 0; i < hdr->qdCount; i++)
{
question = decode_question((const char*)castBuf);
llarp::LogInfo("Read a question");
llarp::LogDebug("Read a question");
castBuf += question->name.length() + 8;
}
@ -393,7 +393,7 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *udp,
for(uint i = 0; i < hdr->anCount; i++)
{
answer = decode_answer((const char*)castBuf);
llarp::LogInfo("Read an answer");
llarp::LogDebug("Read an answer");
castBuf += answer->name.length() + 4 + 4 + 4 + answer->rdLen;
}
// handle authority records (usually no answers with these, so we'll just stomp)
@ -401,7 +401,7 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *udp,
for(uint i = 0; i < hdr->nsCount; i++)
{
answer = decode_answer((const char*)castBuf);
llarp::LogInfo("Read an authority");
llarp::LogDebug("Read an authority");
castBuf += answer->name.length() + 4 + 4 + 4 + answer->rdLen;
}
@ -437,10 +437,10 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *udp,
return;
}
llarp::LogInfo("ans class ", answer->aClass);
llarp::LogInfo("ans type ", answer->type);
llarp::LogInfo("ans ttl ", answer->ttl);
llarp::LogInfo("ans rdlen ", answer->rdLen);
llarp::LogDebug("ans class ", answer->aClass);
llarp::LogDebug("ans type ", answer->type);
llarp::LogDebug("ans ttl ", answer->ttl);
llarp::LogDebug("ans rdlen ", answer->rdLen);
/*
llarp::LogInfo("ans2 class ", answer2->aClass);
@ -474,7 +474,7 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *udp,
if(request->question.type == 1)
{
//llarp::LogInfo("DNS server's answer is: (type#=", ATYPE, "):");
llarp::LogInfo("IPv4 address(es) for ", request->question.name, ":");
llarp::LogDebug("IPv4 address(es) for ", request->question.name, ":");
if (answer->rdLen == 4)
{
@ -490,7 +490,7 @@ llarp_handle_dnsc_recvfrom(struct llarp_udp_io *udp,
ip[3] = answer->rData[3];
llarp::Addr test(request->result);
llarp::LogInfo(test);
llarp::LogDebug(test);
request->found = true;
request->resolved(request);
return;

View File

@ -5,6 +5,8 @@
#include "logger.hpp"
#include "net.hpp"
dns_tracker dns_udp_tracker;
ssize_t
raw_sendto_dns_hook_func(void *sock, const struct sockaddr *from,
const void *buffer, size_t length)
@ -92,7 +94,7 @@ writesend_dnss_response(struct sockaddr *hostRes, const struct sockaddr *from,
*write_buffer++ = ip[3];
uint out_bytes = write_buffer - bufferBegin;
llarp::LogInfo("Sending ", out_bytes, " bytes");
llarp::LogDebug("Sending ", out_bytes, " bytes");
// struct llarp_udp_io *udp = (struct llarp_udp_io *)request->user;
request->hook(request->user, from, buf, out_bytes);
}
@ -123,7 +125,7 @@ handle_recvfrom(const char *buffer, ssize_t nbytes, const struct sockaddr *from,
const char *p_buffer = buffer;
int rcode = (buffer[3] & 0x0F);
llarp::LogInfo("dnsd rcode ", rcode);
llarp::LogDebug("dnsd rcode ", rcode);
dns_msg_header *msg = decode_hdr(p_buffer);
// llarp::LogInfo("DNS_MSG size", sizeof(dns_msg));
@ -150,9 +152,9 @@ handle_recvfrom(const char *buffer, ssize_t nbytes, const struct sockaddr *from,
//request->m_qName = m_qName;
//request->m_qType = request->question.type;
//request->m_qClass = request->question.qClass;
llarp::LogInfo("qName ", request->question.name);
llarp::LogInfo("qType ", request->question.type);
llarp::LogInfo("qClass ", request->question.qClass);
llarp::LogDebug("qName ", request->question.name);
llarp::LogDebug("qType ", request->question.type);
llarp::LogDebug("qClass ", request->question.qClass);
/*
llarp::Addr test(*request->from);
@ -160,11 +162,18 @@ handle_recvfrom(const char *buffer, ssize_t nbytes, const struct sockaddr *from,
llarp::Addr test2(from);
llarp::LogInfo("DNS request from ", test2);
*/
if(!forward_dns_request(m_qName))
if (request->context->intercept)
{
// told that hook will handle overrides
return;
sockaddr *intercept = request->context->intercept(request->question.name);
//if(!forward_dns_request(m_qName))
if (intercept != nullptr)
{
// told that hook will handle overrides
sockaddr *fromCopy = new sockaddr(*from);
writesend_dnss_response(intercept, fromCopy, request);
return;
}
}
sockaddr *hostRes = nullptr;
@ -187,7 +196,7 @@ handle_recvfrom(const char *buffer, ssize_t nbytes, const struct sockaddr *from,
{
hostRes = raw_resolve_host(m_qName.c_str());
llarp::Addr anIp(*hostRes);
llarp::LogInfo("DNS got ", anIp);
llarp::LogDebug("DNSc got ", anIp);
// writesend_dnss_response(struct sockaddr *hostRes, const struct sockaddr
// *from, dnsd_question_request *request)
sockaddr *fromCopy = new sockaddr(*from);
@ -202,11 +211,11 @@ llarp_handle_dnsd_recvfrom(struct llarp_udp_io *udp, const struct sockaddr *padd
{
//lock_t lock(m_dnsd3_Mutex);
// llarp_link *link = static_cast< llarp_link * >(udp->user);
llarp::LogInfo("llarp Received Bytes ", sz);
llarp::LogDebug("llarp Received Bytes ", sz);
dnsd_question_request *llarp_dns_request = new dnsd_question_request;
// llarp::LogInfo("Creating server request ", &llarp_dns_request);
// llarp::LogInfo("Server UDP address ", udp);
llarp_dns_request->context = dns_udp_tracker.dnsd;
// make a copy of the sockaddr
llarp_dns_request->from = new sockaddr(*paddr);
llarp_dns_request->user = (void *)udp;
@ -231,8 +240,6 @@ raw_handle_recvfrom(int *sockfd, const struct sockaddr *saddr, const void *buf,
handle_recvfrom((char *)buf, sz, saddr, llarp_dns_request);
}
dns_tracker dns_udp_tracker;
bool
llarp_dnsd_init(struct dnsd_context *dnsd, struct llarp_ev_loop *netloop,
const char *dnsd_ifname, uint16_t dnsd_port,
@ -249,6 +256,8 @@ llarp_dnsd_init(struct dnsd_context *dnsd, struct llarp_ev_loop *netloop,
dns_udp_tracker.dnsd = dnsd;
dnsd->intercept = nullptr;
// configure dns client
if(!llarp_dnsc_init(&dnsd->client, &dnsd->udp, dnsc_hostname, dnsc_port))
{

View File

@ -5,6 +5,8 @@
#include "dnsc.hpp"
#include <llarp/ev.h> // for sockaadr
struct dnsd_context;
typedef ssize_t (*sendto_dns_hook_func)(void *sock, const struct sockaddr *from,
const void *buffer, size_t length);
@ -22,9 +24,12 @@ struct dnsd_question_request
struct sockaddr *from;
sendto_dns_hook_func hook; // sendto hook tbh
// maybe a reference to dnsd_context incase of multiple
dnsd_context *context; // or you can access it via user (udp)
};
typedef bool (*intercept_query_hook)(struct dnsc_context *);
// we could have passed in the source sockaddr in case you wanted to
// handle the response yourself
typedef sockaddr *(*intercept_query_hook)(std::string name);
struct dnsd_context
{