|
|
@ -29,8 +29,9 @@ namespace llarp
|
|
|
|
self->Flush();
|
|
|
|
self->Flush();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
TunEndpoint::TunEndpoint(const std::string &nickname, llarp::Router *r)
|
|
|
|
TunEndpoint::TunEndpoint(const std::string &nickname, llarp::Router *r,
|
|
|
|
: service::Endpoint(nickname, r)
|
|
|
|
service::Context *parent)
|
|
|
|
|
|
|
|
: service::Endpoint(nickname, r, parent)
|
|
|
|
, m_UserToNetworkPktQueue(nickname + "_sendq", r->netloop, r->netloop)
|
|
|
|
, m_UserToNetworkPktQueue(nickname + "_sendq", r->netloop, r->netloop)
|
|
|
|
, m_NetworkToUserPktQueue(nickname + "_recvq", r->netloop, r->netloop)
|
|
|
|
, m_NetworkToUserPktQueue(nickname + "_recvq", r->netloop, r->netloop)
|
|
|
|
, m_Resolver(r->netloop, this)
|
|
|
|
, m_Resolver(r->netloop, this)
|
|
|
@ -204,10 +205,7 @@ namespace llarp
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
std::string qname = msg.questions[0].qname;
|
|
|
|
std::string qname = msg.questions[0].qname;
|
|
|
|
if(msg.questions[0].qtype == dns::qTypeCNAME)
|
|
|
|
if(msg.questions[0].qtype == dns::qTypeMX)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if(msg.questions[0].qtype == dns::qTypeMX)
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// mx record
|
|
|
|
// mx record
|
|
|
|
llarp::service::Address addr;
|
|
|
|
llarp::service::Address addr;
|
|
|
@ -228,6 +226,21 @@ namespace llarp
|
|
|
|
else
|
|
|
|
else
|
|
|
|
msg.AddNXReply();
|
|
|
|
msg.AddNXReply();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if(msg.questions[0].qname == "localhost.loki"
|
|
|
|
|
|
|
|
|| msg.questions[0].qname == "localhost.loki.")
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
size_t counter = 0;
|
|
|
|
|
|
|
|
context->ForEachService(
|
|
|
|
|
|
|
|
[&](const std::string &,
|
|
|
|
|
|
|
|
const std::unique_ptr< service::Endpoint > &service) -> bool {
|
|
|
|
|
|
|
|
service::Address addr = service->GetIdentity().pub.Addr();
|
|
|
|
|
|
|
|
msg.AddCNAMEReply(addr.ToString(), 1);
|
|
|
|
|
|
|
|
++counter;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
if(counter == 0)
|
|
|
|
|
|
|
|
msg.AddNXReply();
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
msg.AddNXReply();
|
|
|
|
msg.AddNXReply();
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -243,6 +256,24 @@ namespace llarp
|
|
|
|
else
|
|
|
|
else
|
|
|
|
msg.AddNXReply();
|
|
|
|
msg.AddNXReply();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else if(msg.questions[0].qname == "localhost.loki"
|
|
|
|
|
|
|
|
|| msg.questions[0].qname == "localhost.loki.")
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
size_t counter = 0;
|
|
|
|
|
|
|
|
context->ForEachService(
|
|
|
|
|
|
|
|
[&](const std::string &,
|
|
|
|
|
|
|
|
const std::unique_ptr< service::Endpoint > &service) -> bool {
|
|
|
|
|
|
|
|
if(service->HasIfAddr())
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
huint32_t ip = service->GetIfAddr();
|
|
|
|
|
|
|
|
msg.AddINReply(ip);
|
|
|
|
|
|
|
|
++counter;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
if(counter == 0)
|
|
|
|
|
|
|
|
msg.AddNXReply();
|
|
|
|
|
|
|
|
}
|
|
|
|
else if(addr.FromString(qname, ".loki"))
|
|
|
|
else if(addr.FromString(qname, ".loki"))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(HasAddress(addr))
|
|
|
|
if(HasAddress(addr))
|
|
|
@ -321,6 +352,10 @@ namespace llarp
|
|
|
|
if(msg.questions[0].qname == "random.snode"
|
|
|
|
if(msg.questions[0].qname == "random.snode"
|
|
|
|
|| msg.questions[0].qname == "random.snode.")
|
|
|
|
|| msg.questions[0].qname == "random.snode.")
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if(msg.questions[0].qname == "localhost.loki"
|
|
|
|
|
|
|
|
|| msg.questions[0].qname == "localhost.loki.")
|
|
|
|
|
|
|
|
return msg.questions[0].qtype == llarp::dns::qTypeCNAME
|
|
|
|
|
|
|
|
|| msg.questions[0].qtype == llarp::dns::qTypeA;
|
|
|
|
// always hook .loki
|
|
|
|
// always hook .loki
|
|
|
|
if(addr.FromString(msg.questions[0].qname, ".loki"))
|
|
|
|
if(addr.FromString(msg.questions[0].qname, ".loki"))
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|