assign GarlicRoutingSession to stream

This commit is contained in:
orignal 2014-08-29 22:10:00 -04:00
parent b6a3f64ee9
commit 17725acda2
4 changed files with 41 additions and 30 deletions

View file

@ -15,7 +15,7 @@ namespace i2p
namespace garlic
{
GarlicRoutingSession::GarlicRoutingSession (const i2p::data::RoutingDestination * destination, int numTags):
m_Destination (destination), m_FirstMsgID (0), m_IsAcknowledged (false), m_NumTags (numTags),
m_Destination (destination), m_IsAcknowledged (false), m_NumTags (numTags),
m_NextTag (-1), m_SessionTags (0), m_TagsCreationTime (0), m_LocalLeaseSet (nullptr)
{
// create new session tags and session key
@ -31,7 +31,7 @@ namespace garlic
}
GarlicRoutingSession::GarlicRoutingSession (const uint8_t * sessionKey, const SessionTag& sessionTag):
m_Destination (nullptr), m_FirstMsgID (0), m_IsAcknowledged (true), m_NumTags (1), m_NextTag (0),
m_Destination (nullptr), m_IsAcknowledged (true), m_NumTags (1), m_NextTag (0),
m_LocalLeaseSet (nullptr)
{
memcpy (m_SessionKey, sessionKey, 32);
@ -175,7 +175,7 @@ namespace garlic
if (size > 0) // successive?
{
(*numCloves)++;
m_FirstMsgID = msgID;
routing.DeliveryStatusSent (this, msgID);
}
else
LogPrint ("DeliveryStatus clove was not created");
@ -292,6 +292,22 @@ namespace garlic
decryption->SetTagCount (1);
m_SessionTags[SessionTag(tag)] = decryption;
}
GarlicRoutingSession * GarlicRouting::GetRoutingSession (
const i2p::data::RoutingDestination& destination, int numTags)
{
auto it = m_Sessions.find (destination.GetIdentHash ());
GarlicRoutingSession * session = nullptr;
if (it != m_Sessions.end ())
session = it->second;
if (!session)
{
session = new GarlicRoutingSession (&destination, numTags);
std::unique_lock<std::mutex> l(m_SessionsMutex);
m_Sessions[destination.GetIdentHash ()] = session;
}
return session;
}
I2NPMessage * GarlicRouting::WrapSingleMessage (const i2p::data::RoutingDestination& destination, I2NPMessage * msg)
{
@ -301,25 +317,15 @@ namespace garlic
I2NPMessage * GarlicRouting::WrapMessage (const i2p::data::RoutingDestination& destination,
I2NPMessage * msg, const i2p::data::LeaseSet * leaseSet)
{
auto it = m_Sessions.find (destination.GetIdentHash ());
GarlicRoutingSession * session = nullptr;
if (it != m_Sessions.end ())
session = it->second;
if (!session)
{
session = new GarlicRoutingSession (&destination, 32);
std::unique_lock<std::mutex> l(m_SessionsMutex);
m_Sessions[destination.GetIdentHash ()] = session;
}
I2NPMessage * ret = session->WrapSingleMessage (msg, leaseSet);
if (!session->GetNextTag ()) // tags have beed recreated
{
std::unique_lock<std::mutex> l(m_SessionsMutex);
m_CreatedSessions[session->GetFirstMsgID ()] = session;
}
return ret;
auto session = GetRoutingSession (destination, leaseSet ? 32 : 0); // don't use tag if no LeaseSet
return session->WrapSingleMessage (msg, leaseSet);
}
void GarlicRouting::DeliveryStatusSent (GarlicRoutingSession * session, uint32_t msgID)
{
std::unique_lock<std::mutex> l(m_SessionsMutex);
m_CreatedSessions[msgID] = session;
}
void GarlicRouting::HandleGarlicMessage (I2NPMessage * msg)
{