random.snode

pull/143/head
Jeff Becker 6 years ago
parent cb685aaaab
commit bb0cd81f02
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -189,6 +189,30 @@ namespace llarp
} }
} }
void
Message::AddCNAMEReply(std::string name, uint32_t ttl)
{
if(questions.size())
{
hdr_fields |= (1 << 15);
const auto& question = questions[0];
answers.emplace_back();
auto& rec = answers.back();
rec.rr_name = question.qname;
rec.rr_type = 5;
rec.rr_class = 1;
rec.ttl = ttl;
byte_t tmp[512] = {0};
auto buf = llarp::StackBuffer< decltype(tmp) >(tmp);
if(EncodeName(&buf, name))
{
buf.sz = buf.cur - buf.base;
rec.rData.resize(buf.sz);
memcpy(rec.rData.data(), buf.base, buf.sz);
}
}
}
void void
Message::AddMXReply(std::string name, uint16_t priority) Message::AddMXReply(std::string name, uint16_t priority)
{ {

@ -56,6 +56,9 @@ namespace llarp
void void
AddMXReply(std::string name, uint16_t priority); AddMXReply(std::string name, uint16_t priority);
void
AddCNAMEReply(std::string name, uint32_t ttl);
void void
AddINReply(llarp::huint32_t addr); AddINReply(llarp::huint32_t addr);

@ -200,8 +200,15 @@ namespace llarp
{ {
// forward dns // forward dns
llarp::service::Address addr; llarp::service::Address addr;
if(qname == "random.snode" || qname == "random.snode.")
if(addr.FromString(qname, ".loki")) {
RouterID random;
if(Router()->GetRandomGoodRouter(random))
msg.AddCNAMEReply(random.ToString(), 1);
else
msg.AddNXReply();
}
else if(addr.FromString(qname, ".loki"))
{ {
if(HasAddress(addr.data())) if(HasAddress(addr.data()))
{ {
@ -274,6 +281,9 @@ namespace llarp
// always hook mx records // always hook mx records
if(msg.questions[0].qtype == 15) if(msg.questions[0].qtype == 15)
return true; return true;
if(msg.questions[0].qname == "random.snode"
|| msg.questions[0].qname == "random.snode.")
return true;
// 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;

@ -10,6 +10,7 @@
#include <router.hpp> #include <router.hpp>
#include <rpc.hpp> #include <rpc.hpp>
#include <str.hpp> #include <str.hpp>
#include <crypto.hpp>
#include <fstream> #include <fstream>
#include <cstdlib> #include <cstdlib>
@ -233,6 +234,19 @@ namespace llarp
std::max(until, m_PersistingSessions[remote]); std::max(until, m_PersistingSessions[remote]);
} }
bool
Router::GetRandomGoodRouter(RouterID &router)
{
auto sz = nodedb->entries.size();
if(sz == 0)
return false;
auto itr = nodedb->entries.begin();
if(sz > 1)
std::advance(itr, randint() % sz);
router = itr->first;
return true;
}
constexpr size_t MaxPendingSendQueueSize = 8; constexpr size_t MaxPendingSendQueueSize = 8;
bool bool

@ -199,6 +199,9 @@ namespace llarp
bool bool
InitOutboundLink(); InitOutboundLink();
bool
GetRandomGoodRouter(RouterID &r);
/// initialize us as a service node /// initialize us as a service node
/// return true on success /// return true on success
bool bool

@ -179,7 +179,7 @@ namespace llarp
struct Handler : public ::abyss::httpd::IRPCHandler struct Handler : public ::abyss::httpd::IRPCHandler
{ {
llarp::Router* router; llarp::Router* router;
Handler(::abyss::httpd::ConnImpl* conn, llarp::Router* r) Handler(::abyss::httpd::ConnImpl* conn, llarp::Router* r)
: ::abyss::httpd::IRPCHandler(conn), router(r) : ::abyss::httpd::IRPCHandler(conn), router(r)
{ {
@ -273,7 +273,7 @@ namespace llarp
struct ServerImpl struct ServerImpl
{ {
llarp::Router* router; llarp::Router* router;
ReqHandlerImpl _handler; ReqHandlerImpl _handler;
ServerImpl(llarp::Router* r) : router(r), _handler(r, 2000) ServerImpl(llarp::Router* r) : router(r), _handler(r, 2000)

Loading…
Cancel
Save