From 35d4692f5fe24f835985355396014996f698eef2 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 27 Oct 2014 16:01:22 -0400 Subject: [PATCH] send datagram through destination's thread --- Datagram.cpp | 51 +++++++++++++++++++++++++++++++++------------------ Datagram.h | 4 +--- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/Datagram.cpp b/Datagram.cpp index dc4a01f9..1f272693 100644 --- a/Datagram.cpp +++ b/Datagram.cpp @@ -15,41 +15,56 @@ namespace datagram DatagramDestination::DatagramDestination (i2p::client::ClientDestination& owner): m_Owner (owner) { - auto identityLen = m_Owner.GetIdentity ().ToBuffer (m_OutgoingBuffer, MAX_DATAGRAM_SIZE); - m_Signature = m_OutgoingBuffer + identityLen; - auto signatureLen = m_Owner.GetIdentity ().GetSignatureLen (); - m_Payload = m_Signature + signatureLen; - m_HeaderLen = identityLen + signatureLen; } void DatagramDestination::SendDatagramTo (const uint8_t * payload, size_t len, const i2p::data::LeaseSet& remote) + { + uint8_t buf[MAX_DATAGRAM_SIZE]; + auto identityLen = m_Owner.GetIdentity ().ToBuffer (buf, MAX_DATAGRAM_SIZE); + uint8_t * signature = buf + identityLen; + auto signatureLen = m_Owner.GetIdentity ().GetSignatureLen (); + uint8_t * buf1 = signature + signatureLen; + size_t headerLen = identityLen + signatureLen; + + memcpy (buf1, payload, len); + if (m_Owner.GetIdentity ().GetSigningKeyType () == i2p::data::SIGNING_KEY_TYPE_DSA_SHA1) + { + uint8_t hash[32]; + CryptoPP::SHA256().CalculateDigest (hash, buf1, len); + m_Owner.Sign (hash, 32, signature); + } + else + m_Owner.Sign (buf1, len, signature); + + auto service = m_Owner.GetService (); + if (service) + service->post (boost::bind (&DatagramDestination::SendMsg, this, + CreateDataMessage (buf, len + headerLen), remote)); + else + LogPrint ("Failed to send datagram. Destination is not running"); + } + + void DatagramDestination::SendMsg (I2NPMessage * msg, const i2p::data::LeaseSet& remote) { auto leases = remote.GetNonExpiredLeases (); if (!leases.empty ()) { - memcpy (m_Payload, payload, len); - if (m_Owner.GetIdentity ().GetSigningKeyType () == i2p::data::SIGNING_KEY_TYPE_DSA_SHA1) - { - uint8_t hash[32]; - CryptoPP::SHA256().CalculateDigest (hash, m_Payload, len); - m_Owner.Sign (hash, 32, m_Signature); - } - else - m_Owner.Sign (m_Payload, len, m_Signature); - std::vector msgs; uint32_t i = i2p::context.GetRandomNumberGenerator ().GenerateWord32 (0, leases.size () - 1); - auto msg = m_Owner.WrapMessage (remote, CreateDataMessage (m_OutgoingBuffer, len + m_HeaderLen), true); + auto garlic = m_Owner.WrapMessage (remote, msg, true); msgs.push_back (i2p::tunnel::TunnelMessageBlock { i2p::tunnel::eDeliveryTypeTunnel, leases[i].tunnelGateway, leases[i].tunnelID, - msg + garlic }); m_Owner.SendTunnelDataMsgs (msgs); } else - LogPrint ("Failed to send datagram. All leases expired"); + { + LogPrint ("Failed to send datagram. All leases expired"); + DeleteI2NPMessage (msg); + } } void DatagramDestination::HandleDataMessagePayload (const uint8_t * buf, size_t len) diff --git a/Datagram.h b/Datagram.h index 5d8f6f5b..efce2b17 100644 --- a/Datagram.h +++ b/Datagram.h @@ -27,13 +27,11 @@ namespace datagram private: I2NPMessage * CreateDataMessage (const uint8_t * payload, size_t len); + void SendMsg (I2NPMessage * msg, const i2p::data::LeaseSet& remote); private: i2p::client::ClientDestination& m_Owner; - uint8_t m_OutgoingBuffer[MAX_DATAGRAM_SIZE]; - uint8_t * m_Signature, * m_Payload; - size_t m_HeaderLen; }; } }