From 47fb6f6e04b6b0b8a30b3b9c44b407ae134967a3 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 23 Oct 2014 21:14:17 -0400 Subject: [PATCH] send datagram from SAM --- Datagram.cpp | 3 ++- SAM.cpp | 39 +++++++++++++++++++++++++++++++++++++++ SAM.h | 2 +- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/Datagram.cpp b/Datagram.cpp index e05b5463..dc4a01f9 100644 --- a/Datagram.cpp +++ b/Datagram.cpp @@ -39,13 +39,14 @@ namespace datagram 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)); + auto msg = m_Owner.WrapMessage (remote, CreateDataMessage (m_OutgoingBuffer, len + m_HeaderLen), true); msgs.push_back (i2p::tunnel::TunnelMessageBlock { i2p::tunnel::eDeliveryTypeTunnel, leases[i].tunnelGateway, leases[i].tunnelID, msg }); + m_Owner.SendTunnelDataMsgs (msgs); } else LogPrint ("Failed to send datagram. All leases expired"); diff --git a/SAM.cpp b/SAM.cpp index 00bb40f6..7f9f4b9f 100644 --- a/SAM.cpp +++ b/SAM.cpp @@ -677,6 +677,45 @@ namespace client { if (!ecode) { + m_DatagramReceiveBuffer[bytes_transferred] = 0; + char * eol = strchr ((char *)m_DatagramReceiveBuffer, '\n'); + *eol = 0; eol++; + size_t payloadLen = bytes_transferred - ((uint8_t *)eol - m_DatagramReceiveBuffer); + LogPrint ("SAM datagram received ", m_DatagramReceiveBuffer," size=", payloadLen); + char * sessionID = strchr ((char *)m_DatagramReceiveBuffer, ' '); + if (sessionID) + { + sessionID++; + char * destination = strchr (sessionID, ' '); + if (destination) + { + *destination = 0; destination++; + auto session = FindSession (sessionID); + if (session) + { + uint8_t ident[1024]; + size_t l = i2p::data::Base64ToByteStream (destination, strlen(destination), ident, 1024); + i2p::data::IdentityEx dest; + dest.FromBuffer (ident, l); + auto leaseSet = i2p::data::netdb.FindLeaseSet (dest.GetIdentHash ()); + if (leaseSet) + session->localDestination->GetDatagramDestination ()-> + SendDatagramTo ((uint8_t *)eol, payloadLen, *leaseSet); + else + { + LogPrint ("SAM datagram destination not found"); + i2p::data::netdb.RequestDestination (dest.GetIdentHash (), true, + session->localDestination->GetTunnelPool ()); + } + } + else + LogPrint ("Session ", sessionID, " not found"); + } + else + LogPrint ("Missing destination key"); + } + else + LogPrint ("Missing sessionID"); ReceiveDatagram (); } else diff --git a/SAM.h b/SAM.h index abf2b609..e1e369b6 100644 --- a/SAM.h +++ b/SAM.h @@ -159,7 +159,7 @@ namespace client SAMSocket * m_NewSocket; std::mutex m_SessionsMutex; std::map m_Sessions; - uint8_t m_DatagramReceiveBuffer[i2p::datagram::MAX_DATAGRAM_SIZE]; + uint8_t m_DatagramReceiveBuffer[i2p::datagram::MAX_DATAGRAM_SIZE+1]; }; } }