mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-08-26 12:51:54 +00:00
datagramversion param for UDP client tunnel
This commit is contained in:
parent
e47cc8495b
commit
c554f47c4d
@ -18,8 +18,10 @@ namespace i2p
|
|||||||
{
|
{
|
||||||
namespace datagram
|
namespace datagram
|
||||||
{
|
{
|
||||||
DatagramDestination::DatagramDestination (std::shared_ptr<i2p::client::ClientDestination> owner, bool gzip):
|
DatagramDestination::DatagramDestination (std::shared_ptr<i2p::client::ClientDestination> owner,
|
||||||
m_Owner (owner), m_DefaultReceiver (nullptr), m_DefaultRawReceiver (nullptr), m_Gzip (gzip)
|
bool gzip, DatagramVersion version):
|
||||||
|
m_Owner (owner), m_DefaultReceiver (nullptr), m_DefaultRawReceiver (nullptr),
|
||||||
|
m_Gzip (gzip), m_Version (version)
|
||||||
{
|
{
|
||||||
if (m_Gzip)
|
if (m_Gzip)
|
||||||
m_Deflator.reset (new i2p::data::GzipDeflator);
|
m_Deflator.reset (new i2p::data::GzipDeflator);
|
||||||
@ -431,14 +433,16 @@ namespace datagram
|
|||||||
std::shared_ptr<DatagramSession> session = nullptr;
|
std::shared_ptr<DatagramSession> session = nullptr;
|
||||||
std::lock_guard<std::mutex> lock(m_SessionsMutex);
|
std::lock_guard<std::mutex> lock(m_SessionsMutex);
|
||||||
auto itr = m_Sessions.find(identity);
|
auto itr = m_Sessions.find(identity);
|
||||||
if (itr == m_Sessions.end()) {
|
if (itr == m_Sessions.end())
|
||||||
|
{
|
||||||
// not found, create new session
|
// not found, create new session
|
||||||
session = std::make_shared<DatagramSession>(m_Owner, identity);
|
session = std::make_shared<DatagramSession>(m_Owner, identity);
|
||||||
|
session->SetVersion (m_Version);
|
||||||
session->Start ();
|
session->Start ();
|
||||||
m_Sessions[identity] = session;
|
m_Sessions.emplace (identity, session);
|
||||||
} else {
|
|
||||||
session = itr->second;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
session = itr->second;
|
||||||
return session;
|
return session;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,7 +129,7 @@ namespace datagram
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
DatagramDestination (std::shared_ptr<i2p::client::ClientDestination> owner, bool gzip);
|
DatagramDestination (std::shared_ptr<i2p::client::ClientDestination> owner, bool gzip, DatagramVersion version);
|
||||||
~DatagramDestination ();
|
~DatagramDestination ();
|
||||||
|
|
||||||
void SendDatagramTo (const uint8_t * payload, size_t len, const i2p::data::IdentHash & ident, uint16_t fromPort = 0, uint16_t toPort = 0);
|
void SendDatagramTo (const uint8_t * payload, size_t len, const i2p::data::IdentHash & ident, uint16_t fromPort = 0, uint16_t toPort = 0);
|
||||||
@ -190,6 +190,7 @@ namespace datagram
|
|||||||
std::unordered_map<uint16_t, RawReceiver> m_RawReceiversByPorts;
|
std::unordered_map<uint16_t, RawReceiver> m_RawReceiversByPorts;
|
||||||
|
|
||||||
bool m_Gzip; // gzip compression of data messages
|
bool m_Gzip; // gzip compression of data messages
|
||||||
|
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;
|
||||||
std::vector<uint8_t> m_From, m_Signature;
|
std::vector<uint8_t> m_From, m_Signature;
|
||||||
|
@ -1397,10 +1397,11 @@ namespace client
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
i2p::datagram::DatagramDestination * ClientDestination::CreateDatagramDestination (bool gzip)
|
i2p::datagram::DatagramDestination * ClientDestination::CreateDatagramDestination (bool gzip,
|
||||||
|
i2p::datagram::DatagramVersion version)
|
||||||
{
|
{
|
||||||
if (m_DatagramDestination == nullptr)
|
if (!m_DatagramDestination)
|
||||||
m_DatagramDestination = new i2p::datagram::DatagramDestination (GetSharedFromThis (), gzip);
|
m_DatagramDestination = new i2p::datagram::DatagramDestination (GetSharedFromThis (), gzip, version);
|
||||||
return m_DatagramDestination;
|
return m_DatagramDestination;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,7 +274,8 @@ namespace client
|
|||||||
|
|
||||||
// datagram
|
// datagram
|
||||||
i2p::datagram::DatagramDestination * GetDatagramDestination () const { return m_DatagramDestination; };
|
i2p::datagram::DatagramDestination * GetDatagramDestination () const { return m_DatagramDestination; };
|
||||||
i2p::datagram::DatagramDestination * CreateDatagramDestination (bool gzip = true);
|
i2p::datagram::DatagramDestination * CreateDatagramDestination (bool gzip = true,
|
||||||
|
i2p::datagram::DatagramVersion version = i2p::datagram::eDatagramV1);
|
||||||
|
|
||||||
// implements LocalDestination
|
// implements LocalDestination
|
||||||
bool Decrypt (const uint8_t * encrypted, uint8_t * data, i2p::data::CryptoKeyType preferredCrypto) const override;
|
bool Decrypt (const uint8_t * encrypted, uint8_t * data, i2p::data::CryptoKeyType preferredCrypto) const override;
|
||||||
|
@ -636,7 +636,8 @@ namespace client
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == I2P_TUNNELS_SECTION_TYPE_UDPCLIENT) {
|
if (type == I2P_TUNNELS_SECTION_TYPE_UDPCLIENT)
|
||||||
|
{
|
||||||
// udp client
|
// udp client
|
||||||
// TODO: hostnames
|
// TODO: hostnames
|
||||||
boost::asio::ip::udp::endpoint end (boost::asio::ip::make_address(address), port);
|
boost::asio::ip::udp::endpoint end (boost::asio::ip::make_address(address), port);
|
||||||
@ -644,7 +645,9 @@ namespace client
|
|||||||
localDestination = m_SharedLocalDestination;
|
localDestination = m_SharedLocalDestination;
|
||||||
|
|
||||||
bool gzip = section.second.get (I2P_CLIENT_TUNNEL_GZIP, true);
|
bool gzip = section.second.get (I2P_CLIENT_TUNNEL_GZIP, true);
|
||||||
auto clientTunnel = std::make_shared<I2PUDPClientTunnel> (name, dest, end, localDestination, destinationPort, gzip);
|
int datagramVersion = (i2p::datagram::DatagramVersion)section.second.get (UDP_CLIENT_TUNNEL_DATAGRAM_VERSION, (int)i2p::datagram::eDatagramV1);
|
||||||
|
auto clientTunnel = std::make_shared<I2PUDPClientTunnel> (name, dest, end,
|
||||||
|
localDestination, destinationPort, gzip, (i2p::datagram::DatagramVersion)datagramVersion);
|
||||||
|
|
||||||
auto ins = m_ClientForwards.insert (std::make_pair (end, clientTunnel));
|
auto ins = m_ClientForwards.insert (std::make_pair (end, clientTunnel));
|
||||||
if (ins.second)
|
if (ins.second)
|
||||||
@ -666,7 +669,9 @@ namespace client
|
|||||||
LogPrint(eLogError, "Clients: I2P Client forward for endpoint ", end, " already exists");
|
LogPrint(eLogError, "Clients: I2P Client forward for endpoint ", end, " already exists");
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
boost::asio::ip::tcp::endpoint clientEndpoint;
|
boost::asio::ip::tcp::endpoint clientEndpoint;
|
||||||
std::shared_ptr<I2PService> clientTunnel;
|
std::shared_ptr<I2PService> clientTunnel;
|
||||||
if (type == I2P_TUNNELS_SECTION_TYPE_SOCKS)
|
if (type == I2P_TUNNELS_SECTION_TYPE_SOCKS)
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string_view>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include "Destination.h"
|
#include "Destination.h"
|
||||||
#include "I2PService.h"
|
#include "I2PService.h"
|
||||||
@ -61,6 +62,7 @@ namespace client
|
|||||||
const char I2P_SERVER_TUNNEL_ADDRESS[] = "address";
|
const char I2P_SERVER_TUNNEL_ADDRESS[] = "address";
|
||||||
const char I2P_SERVER_TUNNEL_ENABLE_UNIQUE_LOCAL[] = "enableuniquelocal";
|
const char I2P_SERVER_TUNNEL_ENABLE_UNIQUE_LOCAL[] = "enableuniquelocal";
|
||||||
const char I2P_SERVER_TUNNEL_SSL[] = "ssl";
|
const char I2P_SERVER_TUNNEL_SSL[] = "ssl";
|
||||||
|
const char UDP_CLIENT_TUNNEL_DATAGRAM_VERSION[] = "datagramversion";
|
||||||
|
|
||||||
class ClientContext
|
class ClientContext
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2024, The PurpleI2P Project
|
* Copyright (c) 2013-2025, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@ -224,10 +224,10 @@ namespace client
|
|||||||
I2PUDPClientTunnel::I2PUDPClientTunnel (const std::string & name, const std::string &remoteDest,
|
I2PUDPClientTunnel::I2PUDPClientTunnel (const std::string & name, const std::string &remoteDest,
|
||||||
const boost::asio::ip::udp::endpoint& localEndpoint,
|
const boost::asio::ip::udp::endpoint& localEndpoint,
|
||||||
std::shared_ptr<i2p::client::ClientDestination> localDestination,
|
std::shared_ptr<i2p::client::ClientDestination> localDestination,
|
||||||
uint16_t remotePort, bool gzip) :
|
uint16_t remotePort, bool gzip, i2p::datagram::DatagramVersion datagramVersion) :
|
||||||
m_Name (name), m_RemoteDest (remoteDest), m_LocalDest (localDestination), m_LocalEndpoint (localEndpoint),
|
m_Name (name), m_RemoteDest (remoteDest), m_LocalDest (localDestination), m_LocalEndpoint (localEndpoint),
|
||||||
m_ResolveThread (nullptr), m_LocalSocket (nullptr), RemotePort (remotePort),
|
m_ResolveThread (nullptr), m_LocalSocket (nullptr), RemotePort (remotePort),
|
||||||
m_LastPort (0), m_cancel_resolve (false), m_Gzip (gzip)
|
m_LastPort (0), m_cancel_resolve (false), m_Gzip (gzip), m_DatagramVersion (datagramVersion)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -245,7 +245,7 @@ namespace client
|
|||||||
m_LocalSocket->set_option (boost::asio::socket_base::receive_buffer_size (I2P_UDP_MAX_MTU));
|
m_LocalSocket->set_option (boost::asio::socket_base::receive_buffer_size (I2P_UDP_MAX_MTU));
|
||||||
m_LocalSocket->set_option (boost::asio::socket_base::reuse_address (true));
|
m_LocalSocket->set_option (boost::asio::socket_base::reuse_address (true));
|
||||||
|
|
||||||
auto dgram = m_LocalDest->CreateDatagramDestination (m_Gzip);
|
auto dgram = m_LocalDest->CreateDatagramDestination (m_Gzip, m_DatagramVersion);
|
||||||
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,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2024, The PurpleI2P Project
|
* Copyright (c) 2013-2025, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
@ -130,7 +130,7 @@ namespace client
|
|||||||
|
|
||||||
I2PUDPClientTunnel (const std::string & name, const std::string &remoteDest,
|
I2PUDPClientTunnel (const std::string & name, const std::string &remoteDest,
|
||||||
const boost::asio::ip::udp::endpoint& localEndpoint, std::shared_ptr<i2p::client::ClientDestination> localDestination,
|
const boost::asio::ip::udp::endpoint& localEndpoint, std::shared_ptr<i2p::client::ClientDestination> localDestination,
|
||||||
uint16_t remotePort, bool gzip);
|
uint16_t remotePort, bool gzip, i2p::datagram::DatagramVersion datagramVersion);
|
||||||
~I2PUDPClientTunnel ();
|
~I2PUDPClientTunnel ();
|
||||||
|
|
||||||
void Start ();
|
void Start ();
|
||||||
@ -175,6 +175,7 @@ namespace client
|
|||||||
uint16_t RemotePort, m_LastPort;
|
uint16_t RemotePort, m_LastPort;
|
||||||
bool m_cancel_resolve;
|
bool m_cancel_resolve;
|
||||||
bool m_Gzip;
|
bool m_Gzip;
|
||||||
|
i2p::datagram::DatagramVersion m_DatagramVersion;
|
||||||
std::shared_ptr<UDPConvo> m_LastSession;
|
std::shared_ptr<UDPConvo> m_LastSession;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user