less allocations in message parsing and keep exit paths alive with activity

pull/183/head
Jeff Becker 6 years ago
parent 90a57da04a
commit 1b59cc491d
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -74,7 +74,13 @@ namespace llarp
{ {
if(ExpiresSoon(now, timeout)) if(ExpiresSoon(now, timeout))
return true; return true;
return now > m_LastActive && now - m_LastActive > timeout; auto path = GetCurrentPath();
if(!path)
return true;
auto lastPing = path->LastRemoteActivityAt();
if(now > lastPing && now - lastPing > timeout)
return now > m_LastActive && now - m_LastActive > timeout;
return true;
} }
bool bool

@ -24,6 +24,13 @@ namespace llarp
bool bool
HandleMessage(IMessageHandler* h, llarp::Router* r) const override; HandleMessage(IMessageHandler* h, llarp::Router* r) const override;
void
Clear() override
{
M.clear();
}
}; };
} // namespace routing } // namespace routing
} // namespace llarp } // namespace llarp

@ -61,6 +61,8 @@ namespace llarp
version = LLARP_PROTO_VERSION; version = LLARP_PROTO_VERSION;
} }
void Clear() override {}
bool bool
HandleMessage(IMessageHandler* h, llarp::Router* r) const override HandleMessage(IMessageHandler* h, llarp::Router* r) const override
{ {

@ -31,6 +31,13 @@ namespace llarp
ObtainExitMessage& ObtainExitMessage&
operator=(const ObtainExitMessage& other); operator=(const ObtainExitMessage& other);
void
Clear() override
{
B.clear();
W.clear();
}
/// populates I and signs /// populates I and signs
bool bool
Sign(llarp::Crypto* c, const llarp::SecretKey& sk); Sign(llarp::Crypto* c, const llarp::SecretKey& sk);
@ -79,6 +86,9 @@ namespace llarp
bool bool
HandleMessage(IMessageHandler* h, llarp::Router* r) const override; HandleMessage(IMessageHandler* h, llarp::Router* r) const override;
void
Clear() override {}
}; };
struct RejectExitMessage final : public IMessage struct RejectExitMessage final : public IMessage
@ -98,6 +108,12 @@ namespace llarp
{ {
} }
void
Clear() override
{
R.clear();
}
RejectExitMessage& RejectExitMessage&
operator=(const RejectExitMessage& other); operator=(const RejectExitMessage& other);
@ -132,6 +148,9 @@ namespace llarp
{ {
} }
void
Clear() override {}
UpdateExitVerifyMessage& UpdateExitVerifyMessage&
operator=(const UpdateExitVerifyMessage& other); operator=(const UpdateExitVerifyMessage& other);
@ -184,6 +203,9 @@ namespace llarp
bool bool
HandleMessage(IMessageHandler* h, llarp::Router* r) const override; HandleMessage(IMessageHandler* h, llarp::Router* r) const override;
void
Clear() override {}
}; };
struct CloseExitMessage final : public IMessage struct CloseExitMessage final : public IMessage
@ -218,6 +240,9 @@ namespace llarp
bool bool
Verify(llarp::Crypto* c, const llarp::PubKey& pk) const; Verify(llarp::Crypto* c, const llarp::PubKey& pk) const;
void
Clear() override {}
}; };
} // namespace routing } // namespace routing

@ -23,6 +23,9 @@ namespace llarp
bool bool
HandleMessage(IMessageHandler* h, llarp::Router* r) const override; HandleMessage(IMessageHandler* h, llarp::Router* r) const override;
void
Clear() override {};
}; };
} // namespace routing } // namespace routing
} // namespace llarp } // namespace llarp

@ -19,6 +19,8 @@ namespace llarp
bool bool
DecodeKey(llarp_buffer_t key, llarp_buffer_t* val) override; DecodeKey(llarp_buffer_t key, llarp_buffer_t* val) override;
void Clear() override {};
bool bool
HandleMessage(IMessageHandler* h, llarp::Router* r) const override; HandleMessage(IMessageHandler* h, llarp::Router* r) const override;
}; };

@ -32,6 +32,12 @@ namespace llarp
bool bool
HandleMessage(IMessageHandler*, llarp::Router* r) const override; HandleMessage(IMessageHandler*, llarp::Router* r) const override;
void
Clear() override
{
T.Clear();
}
}; };
} // namespace routing } // namespace routing

@ -19,6 +19,11 @@ namespace llarp
std::vector< llarp::Encrypted< MaxExitMTU + ExitOverhead > > X; std::vector< llarp::Encrypted< MaxExitMTU + ExitOverhead > > X;
size_t _size = 0; size_t _size = 0;
void Clear() override
{
X.clear();
}
size_t size_t
Size() const Size() const
{ {

@ -553,7 +553,7 @@ namespace llarp
bool bool
Path::HandleRoutingMessage(llarp_buffer_t buf, llarp::Router* r) Path::HandleRoutingMessage(llarp_buffer_t buf, llarp::Router* r)
{ {
if(!m_InboundMessageParser.ParseMessageBuffer(buf, this, RXID(), r)) if(!r->ParseRoutingMessageBuffer(buf, this, RXID()))
{ {
llarp::LogWarn("Failed to parse inbound routing message"); llarp::LogWarn("Failed to parse inbound routing message");
return false; return false;

@ -122,6 +122,10 @@ namespace llarp
HandleDownstream(llarp_buffer_t X, const TunnelNonce& Y, HandleDownstream(llarp_buffer_t X, const TunnelNonce& Y,
llarp::Router* r) = 0; llarp::Router* r) = 0;
/// return timestamp last remote activity happened at
virtual llarp_time_t
LastRemoteActivityAt() const = 0;
uint64_t uint64_t
NextSeqNo() NextSeqNo()
{ {
@ -146,6 +150,7 @@ namespace llarp
// 10 minutes default // 10 minutes default
llarp_time_t lifetime = DEFAULT_PATH_LIFETIME; llarp_time_t lifetime = DEFAULT_PATH_LIFETIME;
llarp_proto_version_t version; llarp_proto_version_t version;
llarp_time_t m_LastActivity = 0;
bool bool
IsEndpoint(const RouterID& us) const IsEndpoint(const RouterID& us) const
@ -155,7 +160,12 @@ namespace llarp
llarp_time_t llarp_time_t
ExpireTime() const; ExpireTime() const;
llarp::routing::InboundMessageParser m_MessageParser;
llarp_time_t
LastRemoteActivityAt() const override
{
return m_LastActivity;
}
friend std::ostream& friend std::ostream&
operator<<(std::ostream& out, const TransitHop& h) operator<<(std::ostream& out, const TransitHop& h)
@ -337,6 +347,12 @@ namespace llarp
return _status; return _status;
} }
llarp_time_t
LastRemoteActivityAt() const override
{
return m_LastRecvMessage;
}
void void
SetBuildResultHook(BuildResultHookFunc func); SetBuildResultHook(BuildResultHookFunc func);
@ -509,9 +525,6 @@ namespace llarp
SendExitClose(const llarp::routing::CloseExitMessage* msg, SendExitClose(const llarp::routing::CloseExitMessage* msg,
llarp::Router* r); llarp::Router* r);
protected:
llarp::routing::InboundMessageParser m_InboundMessageParser;
private: private:
/// call obtained exit hooks /// call obtained exit hooks
bool bool

@ -525,6 +525,12 @@ namespace llarp
self->ScheduleTicker(orig); self->ScheduleTicker(orig);
} }
bool
Router::ParseRoutingMessageBuffer(llarp_buffer_t buf, routing::IMessageHandler * h, PathID_t rxid)
{
return inbound_routing_msg_parser.ParseMessageBuffer(buf, h, rxid, this);
}
bool bool
Router::ConnectionToRouterAllowed(const llarp::RouterID &router) const Router::ConnectionToRouterAllowed(const llarp::RouterID &router) const
{ {

@ -13,6 +13,7 @@
#include <handlers/tun.hpp> #include <handlers/tun.hpp>
#include <link_layer.hpp> #include <link_layer.hpp>
#include <link_message_parser.hpp> #include <link_message_parser.hpp>
#include <routing/message_parser.hpp>
#include <logic.hpp> #include <logic.hpp>
#include <mem.hpp> #include <mem.hpp>
#include <nodedb.hpp> #include <nodedb.hpp>
@ -339,6 +340,12 @@ namespace llarp
llarp::ILinkLayer * llarp::ILinkLayer *
GetLinkWithSessionByPubkey(const llarp::RouterID &remote); GetLinkWithSessionByPubkey(const llarp::RouterID &remote);
/// parse a routing message in a buffer and handle it with a handler if successful parsing
/// return true on parse and handle success otherwise return false
bool
ParseRoutingMessageBuffer(llarp_buffer_t buf, routing::IMessageHandler * h, PathID_t rxid);
void void
ConnectToRandomRouters(int N); ConnectToRandomRouters(int N);

@ -18,6 +18,8 @@ namespace llarp
// handles messages on the routing level // handles messages on the routing level
struct IMessageHandler struct IMessageHandler
{ {
virtual bool virtual bool
HandleObtainExitMessage(const ObtainExitMessage *msg, HandleObtainExitMessage(const ObtainExitMessage *msg,
llarp::Router *r) = 0; llarp::Router *r) = 0;

@ -25,23 +25,12 @@ namespace llarp
virtual bool virtual bool
HandleMessage(IMessageHandler* h, llarp::Router* r) const = 0; HandleMessage(IMessageHandler* h, llarp::Router* r) const = 0;
};
struct InboundMessageParser virtual void
{ Clear() = 0;
InboundMessageParser();
bool
ParseMessageBuffer(llarp_buffer_t buf, IMessageHandler* handler,
const PathID_t& from, llarp::Router* r);
private:
static bool
OnKey(dict_reader* r, llarp_buffer_t* key);
bool firstKey;
char key;
dict_reader reader;
std::unique_ptr< IMessage > msg;
}; };
} // namespace routing } // namespace routing
} // namespace llarp } // namespace llarp

@ -1,10 +1,5 @@
#include <mem.hpp> #include <mem.hpp>
#include <messages/dht.hpp> #include <routing/message_parser.hpp>
#include <messages/discard.hpp>
#include <messages/path_confirm.hpp>
#include <messages/path_latency.hpp>
#include <messages/path_transfer.hpp>
#include <routing/message.hpp>
namespace llarp namespace llarp
{ {
@ -43,40 +38,40 @@ namespace llarp
switch(self->key) switch(self->key)
{ {
case 'D': case 'D':
self->msg.reset(new DataDiscardMessage()); self->msg = &self->m_Holder.D;
break; break;
case 'L': case 'L':
self->msg.reset(new PathLatencyMessage()); self->msg = &self->m_Holder.L;
break; break;
case 'M': case 'M':
self->msg.reset(new DHTMessage()); self->msg = &self->m_Holder.M;
break; break;
case 'P': case 'P':
self->msg.reset(new PathConfirmMessage()); self->msg = &self->m_Holder.P;
break; break;
case 'T': case 'T':
self->msg.reset(new PathTransferMessage()); self->msg = &self->m_Holder.T;
break; break;
case 'H': case 'H':
self->msg.reset(new service::ProtocolFrame()); self->msg = &self->m_Holder.H;
break; break;
case 'I': case 'I':
self->msg.reset(new TransferTrafficMessage()); self->msg = &self->m_Holder.I;
break; break;
case 'G': case 'G':
self->msg.reset(new GrantExitMessage()); self->msg = &self->m_Holder.G;
break; break;
case 'J': case 'J':
self->msg.reset(new RejectExitMessage()); self->msg = &self->m_Holder.J;
break; break;
case 'O': case 'O':
self->msg.reset(new ObtainExitMessage()); self->msg = &self->m_Holder.O;
break; break;
case 'U': case 'U':
self->msg.reset(new UpdateExitMessage()); self->msg = &self->m_Holder.U;
break; break;
case 'C': case 'C':
self->msg.reset(new CloseExitMessage()); self->msg = &self->m_Holder.C;
break; break;
default: default:
llarp::LogError("invalid routing message id: ", *strbuf.cur); llarp::LogError("invalid routing message id: ", *strbuf.cur);
@ -111,7 +106,8 @@ namespace llarp
llarp::LogError("read dict failed in routing layer"); llarp::LogError("read dict failed in routing layer");
llarp::DumpBuffer< llarp_buffer_t, 128 >(buf); llarp::DumpBuffer< llarp_buffer_t, 128 >(buf);
} }
msg.reset(); msg->Clear();
msg = nullptr;
return result; return result;
} }
} // namespace routing } // namespace routing

@ -0,0 +1,56 @@
#ifndef LLARP_ROUTING_MESSAGE_PARSER_HPP
#define LLARP_ROUTING_MESSAGE_PARSER_HPP
#include <bencode.hpp>
#include <buffer.h>
#include <path_types.hpp>
#include <messages/dht.hpp>
#include <messages/discard.hpp>
#include <messages/path_confirm.hpp>
#include <messages/path_latency.hpp>
#include <messages/path_transfer.hpp>
namespace llarp
{
struct Router;
namespace routing
{
struct IMessageHandler;
struct InboundMessageParser
{
InboundMessageParser();
bool
ParseMessageBuffer(llarp_buffer_t buf, IMessageHandler* handler,
const PathID_t& from, llarp::Router* r);
private:
static bool
OnKey(dict_reader* r, llarp_buffer_t* key);
bool firstKey;
char key;
dict_reader reader;
struct MessageHolder
{
DataDiscardMessage D;
PathLatencyMessage L;
DHTMessage M;
PathConfirmMessage P;
PathTransferMessage T;
service::ProtocolFrame H;
TransferTrafficMessage I;
GrantExitMessage G;
RejectExitMessage J;
ObtainExitMessage O;
UpdateExitMessage U;
CloseExitMessage C;
};
IMessage * msg = nullptr;
MessageHolder m_Holder;
};
}
}
#endif

@ -116,6 +116,12 @@ namespace llarp
bool bool
BEncode(llarp_buffer_t* buf) const override; BEncode(llarp_buffer_t* buf) const override;
void
Clear() override
{
D.Clear();
}
bool bool
Verify(llarp::Crypto* c, const ServiceInfo& from) const; Verify(llarp::Crypto* c, const ServiceInfo& from) const;

@ -101,7 +101,12 @@ namespace llarp
r->crypto.xchacha20(buf, pathKey, Y); r->crypto.xchacha20(buf, pathKey, Y);
if(IsEndpoint(r->pubkey())) if(IsEndpoint(r->pubkey()))
{ {
return m_MessageParser.ParseMessageBuffer(buf, this, info.rxID, r); if(r->ParseRoutingMessageBuffer(buf, this, info.rxID))
{
m_LastActivity = r->Now();
return true;
}
return false;
} }
else else
{ {

Loading…
Cancel
Save