|
|
@ -34,7 +34,11 @@ namespace llarp
|
|
|
|
namespace service
|
|
|
|
namespace service
|
|
|
|
{
|
|
|
|
{
|
|
|
|
Endpoint::Endpoint(AbstractRouter* r, Context* parent)
|
|
|
|
Endpoint::Endpoint(AbstractRouter* r, Context* parent)
|
|
|
|
: path::Builder(r, 3, path::default_len), context(parent), m_RecvQueue(128)
|
|
|
|
: path::Builder(r, 3, path::default_len)
|
|
|
|
|
|
|
|
, context(parent)
|
|
|
|
|
|
|
|
, m_InboundTrafficQueue(512)
|
|
|
|
|
|
|
|
, m_SendQueue(512)
|
|
|
|
|
|
|
|
, m_RecvQueue(512)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
m_state = std::make_unique<EndpointState>();
|
|
|
|
m_state = std::make_unique<EndpointState>();
|
|
|
|
m_state->m_Router = r;
|
|
|
|
m_state->m_Router = r;
|
|
|
@ -846,8 +850,7 @@ namespace llarp
|
|
|
|
&& (m_state->m_ExitEnabled || m_ExitMap.ContainsValue(msg->sender.Addr())))
|
|
|
|
&& (m_state->m_ExitEnabled || m_ExitMap.ContainsValue(msg->sender.Addr())))
|
|
|
|
|| msg->proto == eProtocolTrafficV4 || msg->proto == eProtocolTrafficV6)
|
|
|
|
|| msg->proto == eProtocolTrafficV4 || msg->proto == eProtocolTrafficV6)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
util::Lock l(m_state->m_InboundTrafficQueueMutex);
|
|
|
|
m_InboundTrafficQueue.tryPushBack(std::move(msg));
|
|
|
|
m_state->m_InboundTrafficQueue.emplace(msg);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (msg->proto == eProtocolControl)
|
|
|
|
if (msg->proto == eProtocolControl)
|
|
|
@ -886,9 +889,8 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
|
|
if (f.Sign(m_Identity))
|
|
|
|
if (f.Sign(m_Identity))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
util::Lock lock(m_state->m_SendQueueMutex);
|
|
|
|
m_SendQueue.tryPushBack(
|
|
|
|
m_state->m_SendQueue.emplace_back(
|
|
|
|
SendEvent_t{std::make_shared<const routing::PathTransferMessage>(f, replyPath), path});
|
|
|
|
std::make_shared<const routing::PathTransferMessage>(f, replyPath), path);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -927,9 +929,8 @@ namespace llarp
|
|
|
|
{
|
|
|
|
{
|
|
|
|
LogWarn("invalidating convotag T=", frame.T);
|
|
|
|
LogWarn("invalidating convotag T=", frame.T);
|
|
|
|
RemoveConvoTag(frame.T);
|
|
|
|
RemoveConvoTag(frame.T);
|
|
|
|
util::Lock lock(m_state->m_SendQueueMutex);
|
|
|
|
m_SendQueue.tryPushBack(
|
|
|
|
m_state->m_SendQueue.emplace_back(
|
|
|
|
SendEvent_t{std::make_shared<const routing::PathTransferMessage>(f, frame.F), p});
|
|
|
|
std::make_shared<const routing::PathTransferMessage>(f, frame.F), p);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
@ -1141,7 +1142,7 @@ namespace llarp
|
|
|
|
void Endpoint::Pump(llarp_time_t)
|
|
|
|
void Endpoint::Pump(llarp_time_t)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const auto& sessions = m_state->m_SNodeSessions;
|
|
|
|
const auto& sessions = m_state->m_SNodeSessions;
|
|
|
|
auto& queue = m_state->m_InboundTrafficQueue;
|
|
|
|
auto& queue = m_InboundTrafficQueue;
|
|
|
|
|
|
|
|
|
|
|
|
auto epPump = [&]() {
|
|
|
|
auto epPump = [&]() {
|
|
|
|
FlushRecvData();
|
|
|
|
FlushRecvData();
|
|
|
@ -1149,13 +1150,11 @@ namespace llarp
|
|
|
|
for (const auto& item : sessions)
|
|
|
|
for (const auto& item : sessions)
|
|
|
|
item.second.first->FlushDownstream();
|
|
|
|
item.second.first->FlushDownstream();
|
|
|
|
// send downstream traffic to user for hidden service
|
|
|
|
// send downstream traffic to user for hidden service
|
|
|
|
util::Lock lock(m_state->m_InboundTrafficQueueMutex);
|
|
|
|
|
|
|
|
while (not queue.empty())
|
|
|
|
while (not queue.empty())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
const auto& msg = queue.top();
|
|
|
|
auto msg = queue.popFront();
|
|
|
|
const llarp_buffer_t buf(msg->payload);
|
|
|
|
const llarp_buffer_t buf(msg->payload);
|
|
|
|
HandleInboundPacket(msg->tag, buf, msg->proto);
|
|
|
|
HandleInboundPacket(msg->tag, buf, msg->proto);
|
|
|
|
queue.pop();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
@ -1174,16 +1173,15 @@ namespace llarp
|
|
|
|
// TODO: locking on this container
|
|
|
|
// TODO: locking on this container
|
|
|
|
for (const auto& item : sessions)
|
|
|
|
for (const auto& item : sessions)
|
|
|
|
item.second.first->FlushUpstream();
|
|
|
|
item.second.first->FlushUpstream();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// send queue flush
|
|
|
|
|
|
|
|
while (not m_SendQueue.empty())
|
|
|
|
{
|
|
|
|
{
|
|
|
|
util::Lock lock(m_state->m_SendQueueMutex);
|
|
|
|
auto item = m_SendQueue.popFront();
|
|
|
|
// send outbound traffic
|
|
|
|
|
|
|
|
for (const auto& item : m_state->m_SendQueue)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
item.second->SendRoutingMessage(*item.first, router);
|
|
|
|
item.second->SendRoutingMessage(*item.first, router);
|
|
|
|
MarkConvoTagActive(item.first->T.T);
|
|
|
|
MarkConvoTagActive(item.first->T.T);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
m_state->m_SendQueue.clear();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
UpstreamFlush(router);
|
|
|
|
UpstreamFlush(router);
|
|
|
|
router->linkManager().PumpLinks();
|
|
|
|
router->linkManager().PumpLinks();
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1274,9 +1272,8 @@ namespace llarp
|
|
|
|
LogError("failed to encrypt and sign");
|
|
|
|
LogError("failed to encrypt and sign");
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
self->m_SendQueue.pushBack(SendEvent_t{transfer, p});
|
|
|
|
util::Lock lock(self->m_state->m_SendQueueMutex);
|
|
|
|
;
|
|
|
|
self->m_state->m_SendQueue.emplace_back(transfer, p);
|
|
|
|
|
|
|
|
});
|
|
|
|
});
|
|
|
|
return true;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|