separate client/server in dns proxy

pull/103/head
Jeff Becker 6 years ago
parent 0f7053f77b
commit c27b7c2858
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -39,7 +39,11 @@ namespace llarp
private:
/// low level packet handler
static void
HandleUDPRecv(llarp_udp_io*, const struct sockaddr*, llarp_buffer_t);
HandleUDPRecv_client(llarp_udp_io*, const struct sockaddr*,
llarp_buffer_t);
static void
HandleUDPRecv_server(llarp_udp_io*, const struct sockaddr*,
llarp_buffer_t);
/// low level ticker
static void
@ -49,7 +53,10 @@ namespace llarp
Tick(llarp_time_t now);
void
HandlePkt(llarp::Addr from, llarp_buffer_t* buf);
HandlePktClient(llarp::Addr from, llarp_buffer_t* buf);
void
HandlePktServer(llarp::Addr from, llarp_buffer_t* buf);
void
SendMessageTo(llarp::Addr to, Message msg);
@ -58,7 +65,8 @@ namespace llarp
PickRandomResolver() const;
private:
llarp_udp_io m_UDP;
llarp_udp_io m_Server;
llarp_udp_io m_Client;
llarp_ev_loop* m_Loop;
IQueryHandler* m_QueryHandler;
std::vector< llarp::Addr > m_Resolvers;

@ -7,9 +7,12 @@ namespace llarp
Proxy::Proxy(llarp_ev_loop* loop, IQueryHandler* h)
: m_Loop(loop), m_QueryHandler(h)
{
m_UDP.user = this;
m_UDP.tick = &HandleTick;
m_UDP.recvfrom = &HandleUDPRecv;
m_Client.user = this;
m_Server.user = this;
m_Client.tick = nullptr;
m_Server.tick = nullptr;
m_Client.recvfrom = &HandleUDPRecv_client;
m_Server.recvfrom = &HandleUDPRecv_server;
}
void
@ -28,14 +31,23 @@ namespace llarp
llarp::LogError("no upstream dns provide specified");
return false;
}
return llarp_ev_add_udp(m_Loop, &m_UDP, addr) == 0;
llarp::Addr any("0.0.0.0", 0);
return llarp_ev_add_udp(m_Loop, &m_Server, addr) == 0
&& llarp_ev_add_udp(m_Loop, &m_Client, any);
}
void
Proxy::HandleUDPRecv(llarp_udp_io* u, const sockaddr* from,
llarp_buffer_t buf)
Proxy::HandleUDPRecv_server(llarp_udp_io* u, const sockaddr* from,
llarp_buffer_t buf)
{
static_cast< Proxy* >(u->user)->HandlePkt(*from, &buf);
static_cast< Proxy* >(u->user)->HandlePktServer(*from, &buf);
}
void
Proxy::HandleUDPRecv_client(llarp_udp_io* u, const sockaddr* from,
llarp_buffer_t buf)
{
static_cast< Proxy* >(u->user)->HandlePktClient(*from, &buf);
}
llarp::Addr
@ -65,14 +77,14 @@ namespace llarp
{
buf.sz = buf.cur - buf.base;
buf.cur = buf.base;
llarp_ev_udp_sendto(&m_UDP, to, buf);
llarp_ev_udp_sendto(&m_Server, to, buf);
}
else
llarp::LogWarn("failed to encode dns message when sending");
}
void
Proxy::HandlePkt(llarp::Addr from, llarp_buffer_t* pkt)
Proxy::HandlePktClient(llarp::Addr from, llarp_buffer_t* pkt)
{
MessageHeader hdr;
if(!hdr.Decode(pkt))
@ -88,13 +100,24 @@ namespace llarp
buf.sz = pkt->sz;
buf.base = pkt->base;
buf.cur = buf.base;
// forward
llarp_ev_udp_sendto(&m_UDP, itr->second, buf);
// forward reply
llarp_ev_udp_sendto(&m_Server, itr->second, buf);
// remove pending
m_Forwarded.erase(itr);
return;
}
}
void
Proxy::HandlePktServer(llarp::Addr from, llarp_buffer_t* pkt)
{
MessageHeader hdr;
if(!hdr.Decode(pkt))
{
llarp::LogWarn("failed to parse dns header from ", from);
return;
}
TX tx = {hdr.id, from};
auto itr = m_Forwarded.find(tx);
Message msg(hdr);
if(!msg.Decode(pkt))
{
@ -123,7 +146,7 @@ namespace llarp
buf.base = pkt->base;
buf.cur = buf.base;
// do query
llarp_ev_udp_sendto(&m_UDP, tx.from, buf);
llarp_ev_udp_sendto(&m_Client, tx.from, buf);
}
else
{

Loading…
Cancel
Save