From e23d3a8edaa558d2dc3b41e7501f960a39cf2ba5 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Tue, 24 Jul 2018 08:36:46 +1000 Subject: [PATCH] * pad messages under 1KB to 1KB to reduce jitter * fix race --- include/llarp/iwp/server.hpp | 10 +++++++--- include/llarp/logger.hpp | 3 ++- include/llarp/path.h | 1 + llarp/iwp/session.cpp | 1 - llarp/iwp/transit_message.cpp | 6 ++++++ llarp/path.cpp | 12 +++++++++--- llarp/routing/message_parser.cpp | 1 + llarp/transit_hop.cpp | 10 ++++++++-- 8 files changed, 34 insertions(+), 10 deletions(-) diff --git a/include/llarp/iwp/server.hpp b/include/llarp/iwp/server.hpp index 127121393..6f4578a00 100644 --- a/include/llarp/iwp/server.hpp +++ b/include/llarp/iwp/server.hpp @@ -12,8 +12,12 @@ struct llarp_link { + /* typedef std::mutex mtx_t; typedef std::lock_guard< mtx_t > lock_t; + */ + typedef llarp::util::DummyMutex mtx_t; + typedef llarp::util::DummyLock lock_t; llarp_router *router; llarp_crypto *crypto; @@ -76,21 +80,21 @@ struct llarp_link bool has_intro_from(const llarp::Addr &from) { - std::unique_lock< std::mutex > lock(m_PendingSessions_Mutex); + lock_t lock(m_PendingSessions_Mutex); return m_PendingSessions.find(from) != m_PendingSessions.end(); } void put_intro_from(llarp_link_session *s) { - std::unique_lock< std::mutex > lock(m_PendingSessions_Mutex); + lock_t lock(m_PendingSessions_Mutex); m_PendingSessions[s->addr] = s; } void remove_intro_from(const llarp::Addr &from) { - std::unique_lock< std::mutex > lock(m_PendingSessions_Mutex); + lock_t lock(m_PendingSessions_Mutex); m_PendingSessions.erase(from); } diff --git a/include/llarp/logger.hpp b/include/llarp/logger.hpp index d2bb6c260..f2f9adbb6 100644 --- a/include/llarp/logger.hpp +++ b/include/llarp/logger.hpp @@ -84,9 +84,10 @@ namespace llarp tag = tag.substr(pos + 1); */ ss << std::put_time(std::localtime(&t), "%F %T") << " " << tag; + /* auto sz = tag.size() % 8; while(sz--) - ss << " "; + ss << " "; */ ss << "\t"; LogAppend(ss, std::forward< TArgs >(args)...); ss << (char)27 << "[0;0m"; diff --git a/include/llarp/path.h b/include/llarp/path.h index 996f5f172..d916e99ad 100644 --- a/include/llarp/path.h +++ b/include/llarp/path.h @@ -6,6 +6,7 @@ #define MAXHOPS (8) #define DEFAULT_PATH_LIFETIME (10 * 60 * 1000) #define PATH_BUILD_TIMEOUT (30 * 1000) +#define MESSAGE_PAD_SIZE (1024) struct llarp_path_hop { diff --git a/llarp/iwp/session.cpp b/llarp/iwp/session.cpp index 8bc51061f..7aa05b44d 100644 --- a/llarp/iwp/session.cpp +++ b/llarp/iwp/session.cpp @@ -282,7 +282,6 @@ void llarp_link_session::done() { auto logic = serv->logic; - serv->remove_intro_from(addr); if(establish_job_id) { llarp_logic_remove_call(logic, establish_job_id); diff --git a/llarp/iwp/transit_message.cpp b/llarp/iwp/transit_message.cpp index 4c1846228..466e6c62e 100644 --- a/llarp/iwp/transit_message.cpp +++ b/llarp/iwp/transit_message.cpp @@ -65,6 +65,8 @@ transit_message::ack(uint32_t bitmask) bool transit_message::should_send_ack(llarp_time_t now) const { + if(now < started) + return false; if(msginfo.numfrags() == 0) return true; if(status.count() == 0) @@ -75,12 +77,16 @@ transit_message::should_send_ack(llarp_time_t now) const bool transit_message::should_resend_xmit(llarp_time_t now) const { + if(now < started) + return false; return lastAck == 0 && now - started > 500; } bool transit_message::should_resend_frags(llarp_time_t now) const { + if(now < started) + return false; return lastAck > 0 && now - lastAck > 250 && !completed(); } diff --git a/llarp/path.cpp b/llarp/path.cpp index 505ee68d1..43ce5303a 100644 --- a/llarp/path.cpp +++ b/llarp/path.cpp @@ -406,12 +406,18 @@ namespace llarp auto buf = llarp::StackBuffer< decltype(tmp) >(tmp); if(!msg->BEncode(&buf)) return false; - // rewind - buf.sz = buf.cur - buf.base; - buf.cur = buf.base; // make nonce TunnelNonce N; N.Randomize(); + buf.sz = buf.cur - buf.base; + // pad smaller messages + if(buf.sz < MESSAGE_PAD_SIZE) + { + // randomize padding + r->crypto.randbytes(buf.cur, MESSAGE_PAD_SIZE - buf.sz); + buf.sz = MESSAGE_PAD_SIZE; + } + buf.cur = buf.base; llarp::LogInfo("send ", buf.sz, " bytes via ", TXID(), " on ", Upstream(), " to ", Endpoint()); return HandleUpstream(buf, N, r); diff --git a/llarp/routing/message_parser.cpp b/llarp/routing/message_parser.cpp index 074c52b0b..48b384a39 100644 --- a/llarp/routing/message_parser.cpp +++ b/llarp/routing/message_parser.cpp @@ -39,6 +39,7 @@ namespace llarp if(strbuf.sz != 1) return false; self->key = *strbuf.cur; + llarp::LogInfo("handle messgae ", self->key); switch(self->key) { case 'L': diff --git a/llarp/transit_hop.cpp b/llarp/transit_hop.cpp index bf48d1c21..21232be30 100644 --- a/llarp/transit_hop.cpp +++ b/llarp/transit_hop.cpp @@ -56,8 +56,14 @@ namespace llarp } TunnelNonce N; N.Randomize(); - // rewind - buf.sz = buf.cur - buf.base; + buf.sz = buf.cur - buf.base; + // pad smaller messages + if(buf.sz < MESSAGE_PAD_SIZE) + { + // randomize padding + r->crypto.randbytes(buf.cur, MESSAGE_PAD_SIZE - buf.sz); + buf.sz = MESSAGE_PAD_SIZE; + } buf.cur = buf.base; llarp::LogInfo("Send ", buf.sz, " bytes routing message from trasnit hop");