mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-10-17 09:10:21 +01:00
pass options from Datagram2 and Datagram3 to handlers
Some checks failed
Build Debian packages / bookworm (push) Has been cancelled
Build Debian packages / bullseye (push) Has been cancelled
Build Debian packages / trixie (push) Has been cancelled
Build on FreeBSD / with UPnP (push) Has been cancelled
Build on OSX / With USE_UPNP=no (push) Has been cancelled
Build on OSX / With USE_UPNP=yes (push) Has been cancelled
Build on Windows / clang-x86_64 (push) Has been cancelled
Build on Windows / i686 (push) Has been cancelled
Build on Windows / ucrt-x86_64 (push) Has been cancelled
Build on Windows / x86_64 (push) Has been cancelled
Build on Windows / CMake clang-x86_64 (push) Has been cancelled
Build on Windows / CMake i686 (push) Has been cancelled
Build on Windows / CMake ucrt-x86_64 (push) Has been cancelled
Build on Windows / CMake x86_64 (push) Has been cancelled
Build on Windows / XP (push) Has been cancelled
Build on Ubuntu / Make with USE_UPNP=no (push) Has been cancelled
Build on Ubuntu / Make with USE_UPNP=yes (push) Has been cancelled
Build on Ubuntu / CMake with -DWITH_UPNP=OFF (push) Has been cancelled
Build on Ubuntu / CMake with -DWITH_UPNP=ON (push) Has been cancelled
Build containers / Building container for linux/amd64 (push) Has been cancelled
Build containers / Building container for linux/arm64 (push) Has been cancelled
Build containers / Building container for linux/arm/v7 (push) Has been cancelled
Build containers / Building container for linux/386 (push) Has been cancelled
Build containers / Pushing merged manifest (push) Has been cancelled
Some checks failed
Build Debian packages / bookworm (push) Has been cancelled
Build Debian packages / bullseye (push) Has been cancelled
Build Debian packages / trixie (push) Has been cancelled
Build on FreeBSD / with UPnP (push) Has been cancelled
Build on OSX / With USE_UPNP=no (push) Has been cancelled
Build on OSX / With USE_UPNP=yes (push) Has been cancelled
Build on Windows / clang-x86_64 (push) Has been cancelled
Build on Windows / i686 (push) Has been cancelled
Build on Windows / ucrt-x86_64 (push) Has been cancelled
Build on Windows / x86_64 (push) Has been cancelled
Build on Windows / CMake clang-x86_64 (push) Has been cancelled
Build on Windows / CMake i686 (push) Has been cancelled
Build on Windows / CMake ucrt-x86_64 (push) Has been cancelled
Build on Windows / CMake x86_64 (push) Has been cancelled
Build on Windows / XP (push) Has been cancelled
Build on Ubuntu / Make with USE_UPNP=no (push) Has been cancelled
Build on Ubuntu / Make with USE_UPNP=yes (push) Has been cancelled
Build on Ubuntu / CMake with -DWITH_UPNP=OFF (push) Has been cancelled
Build on Ubuntu / CMake with -DWITH_UPNP=ON (push) Has been cancelled
Build containers / Building container for linux/amd64 (push) Has been cancelled
Build containers / Building container for linux/arm64 (push) Has been cancelled
Build containers / Building container for linux/arm/v7 (push) Has been cancelled
Build containers / Building container for linux/386 (push) Has been cancelled
Build containers / Pushing merged manifest (push) Has been cancelled
This commit is contained in:
parent
acb09c3119
commit
dc9cdf941d
8 changed files with 53 additions and 16 deletions
|
@ -165,7 +165,7 @@ namespace datagram
|
||||||
session->Ack();
|
session->Ack();
|
||||||
auto r = FindReceiver(toPort);
|
auto r = FindReceiver(toPort);
|
||||||
if(r)
|
if(r)
|
||||||
r(identity, fromPort, toPort, buf + headerLen, len -headerLen);
|
r(identity, fromPort, toPort, buf + headerLen, len - headerLen, nullptr);
|
||||||
else
|
else
|
||||||
LogPrint (eLogWarning, "DatagramDestination: no receiver for port ", toPort);
|
LogPrint (eLogWarning, "DatagramDestination: no receiver for port ", toPort);
|
||||||
}
|
}
|
||||||
|
@ -218,8 +218,20 @@ namespace datagram
|
||||||
}
|
}
|
||||||
uint16_t flags = bufbe16toh (buf + identityLen);
|
uint16_t flags = bufbe16toh (buf + identityLen);
|
||||||
size_t offset = identityLen + 2;
|
size_t offset = identityLen + 2;
|
||||||
|
bool isOptions = false;
|
||||||
if (flags & DATAGRAM2_FLAG_OPTIONS)
|
if (flags & DATAGRAM2_FLAG_OPTIONS)
|
||||||
offset += bufbe16toh (buf + offset) + 2;
|
{
|
||||||
|
isOptions = true;
|
||||||
|
m_Options.CleanUp ();
|
||||||
|
auto optionsLen = m_Options.FromBuffer (buf + offset, len - offset);
|
||||||
|
if (optionsLen)
|
||||||
|
offset += optionsLen;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrint (eLogWarning, "Datagram: datagram2 can't read options");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (offset > len)
|
if (offset > len)
|
||||||
{
|
{
|
||||||
LogPrint (eLogWarning, "Datagram: datagram2 is too short ", len, " expected ", offset);
|
LogPrint (eLogWarning, "Datagram: datagram2 is too short ", len, " expected ", offset);
|
||||||
|
@ -256,7 +268,7 @@ namespace datagram
|
||||||
session->Ack();
|
session->Ack();
|
||||||
auto r = FindReceiver(toPort);
|
auto r = FindReceiver(toPort);
|
||||||
if(r)
|
if(r)
|
||||||
r(identity, fromPort, toPort, buf + offset, len - offset - signatureLen);
|
r(identity, fromPort, toPort, buf + offset, len - offset - signatureLen, isOptions ? &m_Options : nullptr);
|
||||||
else
|
else
|
||||||
LogPrint (eLogWarning, "DatagramDestination: no receiver for port ", toPort);
|
LogPrint (eLogWarning, "DatagramDestination: no receiver for port ", toPort);
|
||||||
}
|
}
|
||||||
|
@ -288,14 +300,26 @@ namespace datagram
|
||||||
{
|
{
|
||||||
uint16_t flags = bufbe16toh (buf + 32);
|
uint16_t flags = bufbe16toh (buf + 32);
|
||||||
size_t offset = 34;
|
size_t offset = 34;
|
||||||
|
bool isOptions = false;
|
||||||
if (flags & DATAGRAM3_FLAG_OPTIONS)
|
if (flags & DATAGRAM3_FLAG_OPTIONS)
|
||||||
offset += bufbe16toh (buf + offset) + 2;
|
{
|
||||||
|
isOptions = true;
|
||||||
|
m_Options.CleanUp ();
|
||||||
|
auto optionsLen = m_Options.FromBuffer (buf + offset, len - offset);
|
||||||
|
if (optionsLen)
|
||||||
|
offset += optionsLen;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrint (eLogWarning, "Datagram: datagram3 can't read options");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (offset > len)
|
if (offset > len)
|
||||||
{
|
{
|
||||||
LogPrint (eLogWarning, "Datagram: datagram3 is too short ", len, " expected ", offset);
|
LogPrint (eLogWarning, "Datagram: datagram3 is too short ", len, " expected ", offset);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
r(*ls->GetIdentity (), fromPort, toPort, buf + offset, len - offset);
|
r(*ls->GetIdentity (), fromPort, toPort, buf + offset, len - offset, isOptions ? &m_Options : nullptr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LogPrint (eLogWarning, "Datagram: no receiver for port ", toPort);
|
LogPrint (eLogWarning, "Datagram: no receiver for port ", toPort);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "LeaseSet.h"
|
#include "LeaseSet.h"
|
||||||
#include "I2NPProtocol.h"
|
#include "I2NPProtocol.h"
|
||||||
#include "Garlic.h"
|
#include "Garlic.h"
|
||||||
|
#include "util.h"
|
||||||
#include "ECIESX25519AEADRatchetSession.h"
|
#include "ECIESX25519AEADRatchetSession.h"
|
||||||
|
|
||||||
namespace i2p
|
namespace i2p
|
||||||
|
@ -124,7 +125,8 @@ namespace datagram
|
||||||
const size_t MAX_DATAGRAM_SIZE = 32768;
|
const size_t MAX_DATAGRAM_SIZE = 32768;
|
||||||
class DatagramDestination
|
class DatagramDestination
|
||||||
{
|
{
|
||||||
typedef std::function<void (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len)> Receiver;
|
typedef std::function<void (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort,
|
||||||
|
const uint8_t * buf, size_t len, const i2p::util::Mapping * options)> Receiver;
|
||||||
typedef std::function<void (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len)> RawReceiver;
|
typedef std::function<void (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len)> RawReceiver;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -193,6 +195,7 @@ namespace datagram
|
||||||
DatagramVersion m_Version; // default for destination
|
DatagramVersion m_Version; // default for destination
|
||||||
i2p::data::GzipInflator m_Inflator;
|
i2p::data::GzipInflator m_Inflator;
|
||||||
std::unique_ptr<i2p::data::GzipDeflator> m_Deflator;
|
std::unique_ptr<i2p::data::GzipDeflator> m_Deflator;
|
||||||
|
i2p::util::Mapping m_Options;
|
||||||
std::vector<uint8_t> m_From, m_Signature;
|
std::vector<uint8_t> m_From, m_Signature;
|
||||||
i2p::util::MemoryPool<I2NPMessageBuffer<I2NP_MAX_MESSAGE_SIZE> > m_I2NPMsgsPool;
|
i2p::util::MemoryPool<I2NPMessageBuffer<I2NP_MAX_MESSAGE_SIZE> > m_I2NPMsgsPool;
|
||||||
};
|
};
|
||||||
|
|
|
@ -223,7 +223,7 @@ namespace util
|
||||||
|
|
||||||
size_t Mapping::FromBuffer (size_t size, const uint8_t * buf, size_t len)
|
size_t Mapping::FromBuffer (size_t size, const uint8_t * buf, size_t len)
|
||||||
{
|
{
|
||||||
if (len < size) return 0;
|
if (!size || len < size) return 0;
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
while (offset < size)
|
while (offset < size)
|
||||||
{
|
{
|
||||||
|
|
|
@ -239,6 +239,7 @@ namespace util
|
||||||
std::string_view operator[](std::string_view param) const;
|
std::string_view operator[](std::string_view param) const;
|
||||||
bool Insert (std::string_view param, std::string_view value);
|
bool Insert (std::string_view param, std::string_view value);
|
||||||
void CleanUp ();
|
void CleanUp ();
|
||||||
|
bool IsEmpty () const { return m_Options.empty (); }
|
||||||
|
|
||||||
static std::string_view ExtractString (const uint8_t * buf, size_t len);
|
static std::string_view ExtractString (const uint8_t * buf, size_t len);
|
||||||
static size_t WriteString (std::string_view str, uint8_t * buf, size_t len);
|
static size_t WriteString (std::string_view str, uint8_t * buf, size_t len);
|
||||||
|
|
|
@ -459,7 +459,8 @@ namespace client
|
||||||
}
|
}
|
||||||
if (type == SAMSessionType::eSAMSessionTypeDatagram)
|
if (type == SAMSessionType::eSAMSessionTypeDatagram)
|
||||||
dest->SetReceiver (std::bind (&SAMSocket::HandleI2PDatagramReceive, shared_from_this (),
|
dest->SetReceiver (std::bind (&SAMSocket::HandleI2PDatagramReceive, shared_from_this (),
|
||||||
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5),
|
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3,
|
||||||
|
std::placeholders::_4, std::placeholders::_5, std::placeholders::_6),
|
||||||
port
|
port
|
||||||
);
|
);
|
||||||
else // raw
|
else // raw
|
||||||
|
@ -1290,7 +1291,8 @@ namespace client
|
||||||
LogPrint (eLogWarning, "SAM: I2P forward acceptor has been reset");
|
LogPrint (eLogWarning, "SAM: I2P forward acceptor has been reset");
|
||||||
}
|
}
|
||||||
|
|
||||||
void SAMSocket::HandleI2PDatagramReceive (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len)
|
void SAMSocket::HandleI2PDatagramReceive (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort,
|
||||||
|
const uint8_t * buf, size_t len, const i2p::util::Mapping * options)
|
||||||
{
|
{
|
||||||
LogPrint (eLogDebug, "SAM: Datagram received ", len);
|
LogPrint (eLogDebug, "SAM: Datagram received ", len);
|
||||||
auto base64 = from.ToBase64 ();
|
auto base64 = from.ToBase64 ();
|
||||||
|
|
|
@ -145,7 +145,8 @@ namespace client
|
||||||
void HandleI2PAccept (std::shared_ptr<i2p::stream::Stream> stream);
|
void HandleI2PAccept (std::shared_ptr<i2p::stream::Stream> stream);
|
||||||
void HandleI2PForward (std::shared_ptr<i2p::stream::Stream> stream, boost::asio::ip::tcp::endpoint ep);
|
void HandleI2PForward (std::shared_ptr<i2p::stream::Stream> stream, boost::asio::ip::tcp::endpoint ep);
|
||||||
void HandleWriteI2PData (const boost::system::error_code& ecode, size_t sz);
|
void HandleWriteI2PData (const boost::system::error_code& ecode, size_t sz);
|
||||||
void HandleI2PDatagramReceive (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
void HandleI2PDatagramReceive (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort,
|
||||||
|
const uint8_t * buf, size_t len, const i2p::util::Mapping * options);
|
||||||
void HandleI2PRawDatagramReceive (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
void HandleI2PRawDatagramReceive (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
||||||
|
|
||||||
void ProcessSessionCreate (std::string_view buf);
|
void ProcessSessionCreate (std::string_view buf);
|
||||||
|
|
|
@ -16,7 +16,8 @@ namespace i2p
|
||||||
{
|
{
|
||||||
namespace client
|
namespace client
|
||||||
{
|
{
|
||||||
void I2PUDPServerTunnel::HandleRecvFromI2P(const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len)
|
void I2PUDPServerTunnel::HandleRecvFromI2P(const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort,
|
||||||
|
const uint8_t * buf, size_t len, const i2p::util::Mapping * options)
|
||||||
{
|
{
|
||||||
if (!m_LastSession || m_LastSession->Identity.GetLL()[0] != from.GetIdentHash ().GetLL()[0] || fromPort != m_LastSession->RemotePort)
|
if (!m_LastSession || m_LastSession->Identity.GetLL()[0] != from.GetIdentHash ().GetLL()[0] || fromPort != m_LastSession->RemotePort)
|
||||||
m_LastSession = ObtainUDPSession(from, toPort, fromPort);
|
m_LastSession = ObtainUDPSession(from, toPort, fromPort);
|
||||||
|
@ -189,7 +190,8 @@ namespace client
|
||||||
|
|
||||||
auto dgram = m_LocalDest->CreateDatagramDestination (m_Gzip);
|
auto dgram = m_LocalDest->CreateDatagramDestination (m_Gzip);
|
||||||
dgram->SetReceiver (
|
dgram->SetReceiver (
|
||||||
std::bind (&I2PUDPServerTunnel::HandleRecvFromI2P, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5),
|
std::bind (&I2PUDPServerTunnel::HandleRecvFromI2P, this, std::placeholders::_1, std::placeholders::_2,
|
||||||
|
std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, std::placeholders::_6),
|
||||||
m_inPort
|
m_inPort
|
||||||
);
|
);
|
||||||
dgram->SetRawReceiver (
|
dgram->SetRawReceiver (
|
||||||
|
@ -259,7 +261,7 @@ namespace client
|
||||||
dgram->SetReceiver (std::bind (&I2PUDPClientTunnel::HandleRecvFromI2P, this,
|
dgram->SetReceiver (std::bind (&I2PUDPClientTunnel::HandleRecvFromI2P, this,
|
||||||
std::placeholders::_1, std::placeholders::_2,
|
std::placeholders::_1, std::placeholders::_2,
|
||||||
std::placeholders::_3, std::placeholders::_4,
|
std::placeholders::_3, std::placeholders::_4,
|
||||||
std::placeholders::_5),
|
std::placeholders::_5, std::placeholders::_6),
|
||||||
RemotePort
|
RemotePort
|
||||||
);
|
);
|
||||||
dgram->SetRawReceiver (std::bind (&I2PUDPClientTunnel::HandleRecvFromI2PRaw, this,
|
dgram->SetRawReceiver (std::bind (&I2PUDPClientTunnel::HandleRecvFromI2PRaw, this,
|
||||||
|
@ -392,7 +394,8 @@ namespace client
|
||||||
LogPrint(eLogInfo, "UDP Tunnel: Resolved ", m_RemoteDest, " to ", m_RemoteAddr->identHash.ToBase32 ());
|
LogPrint(eLogInfo, "UDP Tunnel: Resolved ", m_RemoteDest, " to ", m_RemoteAddr->identHash.ToBase32 ());
|
||||||
}
|
}
|
||||||
|
|
||||||
void I2PUDPClientTunnel::HandleRecvFromI2P (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len)
|
void I2PUDPClientTunnel::HandleRecvFromI2P (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort,
|
||||||
|
const uint8_t * buf, size_t len, const i2p::util::Mapping * options)
|
||||||
{
|
{
|
||||||
if (m_RemoteAddr && from.GetIdentHash() == m_RemoteAddr->identHash)
|
if (m_RemoteAddr && from.GetIdentHash() == m_RemoteAddr->identHash)
|
||||||
HandleRecvFromI2PRaw (fromPort, toPort, buf, len);
|
HandleRecvFromI2PRaw (fromPort, toPort, buf, len);
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
|
#include "util.h"
|
||||||
#include "Identity.h"
|
#include "Identity.h"
|
||||||
#include "Destination.h"
|
#include "Destination.h"
|
||||||
#include "Datagram.h"
|
#include "Datagram.h"
|
||||||
|
@ -101,7 +102,8 @@ namespace client
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void HandleRecvFromI2P (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
void HandleRecvFromI2P (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort,
|
||||||
|
const uint8_t * buf, size_t len, const i2p::util::Mapping * options);
|
||||||
void HandleRecvFromI2PRaw (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
void HandleRecvFromI2PRaw (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
||||||
UDPSessionPtr ObtainUDPSession (const i2p::data::IdentityEx& from, uint16_t localPort, uint16_t remotePort);
|
UDPSessionPtr ObtainUDPSession (const i2p::data::IdentityEx& from, uint16_t localPort, uint16_t remotePort);
|
||||||
uint32_t GetSessionIndex (uint16_t fromPort, uint16_t toPort) const { return ((uint32_t)fromPort << 16) + toPort; }
|
uint32_t GetSessionIndex (uint16_t fromPort, uint16_t toPort) const { return ((uint32_t)fromPort << 16) + toPort; }
|
||||||
|
@ -155,7 +157,8 @@ namespace client
|
||||||
typedef std::pair<boost::asio::ip::udp::endpoint, uint64_t> UDPConvo;
|
typedef std::pair<boost::asio::ip::udp::endpoint, uint64_t> UDPConvo;
|
||||||
void RecvFromLocal ();
|
void RecvFromLocal ();
|
||||||
void HandleRecvFromLocal (const boost::system::error_code & e, std::size_t transferred);
|
void HandleRecvFromLocal (const boost::system::error_code & e, std::size_t transferred);
|
||||||
void HandleRecvFromI2P (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
void HandleRecvFromI2P (const i2p::data::IdentityEx& from, uint16_t fromPort, uint16_t toPort,
|
||||||
|
const uint8_t * buf, size_t len, const i2p::util::Mapping * options);
|
||||||
void HandleRecvFromI2PRaw (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
void HandleRecvFromI2PRaw (uint16_t fromPort, uint16_t toPort, const uint8_t * buf, size_t len);
|
||||||
void TryResolving ();
|
void TryResolving ();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue