From 2cd8d0c0b716448f7e038960c08232e9fb7fde83 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 16 Oct 2014 21:11:02 -0400 Subject: [PATCH] delete expired unconfirmed tags --- Garlic.cpp | 23 +++++++++++++++++++---- Garlic.h | 5 +++-- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Garlic.cpp b/Garlic.cpp index 6424b258..053d54e0 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -51,16 +51,31 @@ namespace garlic void GarlicRoutingSession::TagsConfirmed (uint32_t msgID) { + uint32_t ts = i2p::util::GetSecondsSinceEpoch (); auto it = m_UnconfirmedTagsMsgs.find (msgID); if (it != m_UnconfirmedTagsMsgs.end ()) { UnconfirmedTags * tags = it->second; - for (int i = 0; i < tags->numTags; i++) - m_SessionTags.push_back (tags->sessionTags[i]); - m_TagsCreationTime = i2p::util::GetSecondsSinceEpoch (); + if (ts < tags->tagsCreationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT) + { + for (int i = 0; i < tags->numTags; i++) + m_SessionTags.push_back (tags->sessionTags[i]); + m_TagsCreationTime = ts; + } m_UnconfirmedTagsMsgs.erase (it); delete tags; } + // delete expired unconfirmed tags + for (auto it = m_UnconfirmedTagsMsgs.begin (); it != m_UnconfirmedTagsMsgs.end ();) + { + if (ts >= it->second->tagsCreationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT) + { + delete it->second; + it = m_UnconfirmedTagsMsgs.erase (it); + } + else + it++; + } } I2NPMessage * GarlicRoutingSession::WrapSingleMessage (I2NPMessage * msg) @@ -72,7 +87,7 @@ namespace garlic // take care about tags if (m_NumTags > 0) { - if (m_TagsCreationTime && i2p::util::GetSecondsSinceEpoch () >= m_TagsCreationTime + TAGS_EXPIRATION_TIMEOUT) + if (m_TagsCreationTime && i2p::util::GetSecondsSinceEpoch () >= m_TagsCreationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT) { // old tags expired create new set LogPrint ("Garlic tags expired"); diff --git a/Garlic.h b/Garlic.h index 05b3cba3..fade33c3 100644 --- a/Garlic.h +++ b/Garlic.h @@ -37,8 +37,9 @@ namespace garlic }; #pragma pack() - const int TAGS_EXPIRATION_TIMEOUT = 900; // 15 minutes - + const int INCOMING_TAGS_EXPIRATION_TIMEOUT = 900; // 15 minutes + const int OUTGOING_TAGS_EXPIRATION_TIMEOUT = 720; // 12 minutes + typedef i2p::data::Tag<32> SessionTag; class GarlicDestination; class GarlicRoutingSession