moved local LeaseSet update from Stream to RoutingSession

This commit is contained in:
orignal 2014-10-08 12:11:39 -04:00
parent 296b2d7372
commit 911ad52989
7 changed files with 35 additions and 29 deletions

View file

@ -17,7 +17,8 @@ namespace garlic
GarlicRoutingSession::GarlicRoutingSession (GarlicDestination * owner,
const i2p::data::RoutingDestination * destination, int numTags):
m_Owner (owner), m_Destination (destination), m_IsAcknowledged (false),
m_NumTags (numTags), m_NextTag (-1), m_SessionTags (0), m_TagsCreationTime (0)
m_NumTags (numTags), m_NextTag (-1), m_SessionTags (0), m_TagsCreationTime (0),
m_LeaseSetUpdated (numTags > 0)
{
// create new session tags and session key
m_Rnd.GenerateBlock (m_SessionKey, 32);
@ -33,7 +34,7 @@ namespace garlic
GarlicRoutingSession::GarlicRoutingSession (const uint8_t * sessionKey, const SessionTag& sessionTag):
m_Owner (nullptr), m_Destination (nullptr), m_IsAcknowledged (true), m_NumTags (1),
m_NextTag (0)
m_NextTag (0), m_LeaseSetUpdated (false)
{
memcpy (m_SessionKey, sessionKey, 32);
m_Encryption.SetKey (m_SessionKey);
@ -58,7 +59,7 @@ namespace garlic
}
}
I2NPMessage * GarlicRoutingSession::WrapSingleMessage (I2NPMessage * msg, bool attachLeaseSet)
I2NPMessage * GarlicRoutingSession::WrapSingleMessage (I2NPMessage * msg)
{
I2NPMessage * m = NewI2NPMessage ();
size_t len = 0;
@ -117,7 +118,7 @@ namespace garlic
}
}
// AES block
len += CreateAESBlock (buf, msg, attachLeaseSet);
len += CreateAESBlock (buf, msg);
m_NextTag++;
*(uint32_t *)(m->GetPayload ()) = htobe32 (len);
m->len += len + 4;
@ -127,7 +128,7 @@ namespace garlic
return m;
}
size_t GarlicRoutingSession::CreateAESBlock (uint8_t * buf, const I2NPMessage * msg, bool attachLeaseSet)
size_t GarlicRoutingSession::CreateAESBlock (uint8_t * buf, const I2NPMessage * msg)
{
size_t blockSize = 0;
*(uint16_t *)buf = m_NextTag < 0 ? htobe16 (m_NumTags) : 0; // tag count
@ -146,7 +147,7 @@ namespace garlic
blockSize += 32;
buf[blockSize] = 0; // flag
blockSize++;
size_t len = CreateGarlicPayload (buf + blockSize, msg, attachLeaseSet);
size_t len = CreateGarlicPayload (buf + blockSize, msg);
*payloadSize = htobe32 (len);
CryptoPP::SHA256().CalculateDigest(payloadHash, buf + blockSize, len);
blockSize += len;
@ -157,7 +158,7 @@ namespace garlic
return blockSize;
}
size_t GarlicRoutingSession::CreateGarlicPayload (uint8_t * payload, const I2NPMessage * msg, bool attachLeaseSet)
size_t GarlicRoutingSession::CreateGarlicPayload (uint8_t * payload, const I2NPMessage * msg)
{
uint64_t ts = i2p::util::GetMillisecondsSinceEpoch () + 5000; // 5 sec
uint32_t msgID = m_Rnd.GenerateWord32 ();
@ -180,8 +181,9 @@ namespace garlic
else
LogPrint ("DeliveryStatus clove was not created");
}
if (attachLeaseSet)
if (m_LeaseSetUpdated)
{
m_LeaseSetUpdated = false;
// clove if our leaseSet must be attached
auto leaseSet = CreateDatabaseStoreMsg (m_Owner->GetLeaseSet ());
size += CreateGarlicClove (payload + size, leaseSet, false);
@ -428,10 +430,10 @@ namespace garlic
}
I2NPMessage * GarlicDestination::WrapMessage (const i2p::data::RoutingDestination& destination,
I2NPMessage * msg, const i2p::data::LeaseSet * leaseSet)
I2NPMessage * msg, bool attachLeaseSet)
{
auto session = GetRoutingSession (destination, leaseSet ? 32 : 0); // don't use tag if no LeaseSet
return session->WrapSingleMessage (msg, leaseSet);
auto session = GetRoutingSession (destination, attachLeaseSet ? 32 : 0); // don't use tag if no LeaseSet
return session->WrapSingleMessage (msg);
}
GarlicRoutingSession * GarlicDestination::GetRoutingSession (
@ -472,5 +474,12 @@ namespace garlic
}
DeleteI2NPMessage (msg);
}
void GarlicDestination::SetLeaseSetUpdated ()
{
std::unique_lock<std::mutex> l(m_CreatedSessionsMutex);
for (auto it: m_Sessions)
it.second->SetLeaseSetUpdated ();
}
}
}