mirror of
				https://github.com/PurpleI2P/i2pd.git
				synced 2025-11-04 08:30:46 +00:00 
			
		
		
		
	use shared pointers for tunnel reload
This commit is contained in:
		
							parent
							
								
									0df68872ab
								
							
						
					
					
						commit
						2fbbbf298b
					
				
					 2 changed files with 32 additions and 30 deletions
				
			
		| 
						 | 
				
			
			@ -488,8 +488,8 @@ namespace client
 | 
			
		|||
						{
 | 
			
		||||
							localDestination = m_SharedLocalDestination;
 | 
			
		||||
						}
 | 
			
		||||
						auto clientTunnel = new I2PUDPClientTunnel(name, dest, end, localDestination, destinationPort);
 | 
			
		||||
						if(m_ClientForwards.insert(std::make_pair(end, std::unique_ptr<I2PUDPClientTunnel>(clientTunnel))).second)
 | 
			
		||||
						auto clientTunnel = std::make_shared<I2PUDPClientTunnel>(name, dest, end, localDestination, destinationPort);
 | 
			
		||||
						if(m_ClientForwards.insert(std::make_pair(end, clientTunnel)).second)
 | 
			
		||||
						{
 | 
			
		||||
							clientTunnel->Start();
 | 
			
		||||
						}
 | 
			
		||||
| 
						 | 
				
			
			@ -498,31 +498,35 @@ namespace client
 | 
			
		|||
 | 
			
		||||
					} else {
 | 
			
		||||
						boost::asio::ip::tcp::endpoint clientEndpoint;
 | 
			
		||||
						I2PService * clientTunnel = nullptr;
 | 
			
		||||
						std::shared_ptr<I2PService> clientTunnel;
 | 
			
		||||
						if (type == I2P_TUNNELS_SECTION_TYPE_SOCKS)
 | 
			
		||||
						{
 | 
			
		||||
							// socks proxy
 | 
			
		||||
							clientTunnel = new i2p::proxy::SOCKSProxy(name, address, port, false, "", destinationPort, localDestination);
 | 
			
		||||
							clientEndpoint = ((i2p::proxy::SOCKSProxy*)clientTunnel)->GetLocalEndpoint ();
 | 
			
		||||
							auto tun = std::make_shared<i2p::proxy::SOCKSProxy>(name, address, port, false, "", destinationPort, localDestination);
 | 
			
		||||
							clientTunnel = tun;
 | 
			
		||||
							clientEndpoint = tun->GetLocalEndpoint ();
 | 
			
		||||
						}
 | 
			
		||||
						else if (type == I2P_TUNNELS_SECTION_TYPE_HTTPPROXY)
 | 
			
		||||
						{
 | 
			
		||||
							// http proxy
 | 
			
		||||
							std::string outproxy = section.second.get("outproxy", "");
 | 
			
		||||
							clientTunnel = new i2p::proxy::HTTPProxy(name, address, port, outproxy, localDestination);
 | 
			
		||||
							clientEndpoint = ((i2p::proxy::HTTPProxy*)clientTunnel)->GetLocalEndpoint ();
 | 
			
		||||
							auto tun = std::make_shared<i2p::proxy::HTTPProxy>(name, address, port, outproxy, localDestination);
 | 
			
		||||
							clientTunnel = tun;
 | 
			
		||||
							clientEndpoint = tun->GetLocalEndpoint ();
 | 
			
		||||
						}
 | 
			
		||||
						else if (type == I2P_TUNNELS_SECTION_TYPE_WEBSOCKS)
 | 
			
		||||
						{
 | 
			
		||||
							// websocks proxy
 | 
			
		||||
							clientTunnel = new WebSocks(address, port, localDestination);;
 | 
			
		||||
							clientEndpoint = ((WebSocks*)clientTunnel)->GetLocalEndpoint();
 | 
			
		||||
							auto tun = std::make_shared<WebSocks>(address, port, localDestination);
 | 
			
		||||
							clientTunnel = tun;
 | 
			
		||||
							clientEndpoint = tun->GetLocalEndpoint();
 | 
			
		||||
						}
 | 
			
		||||
						else
 | 
			
		||||
						{
 | 
			
		||||
							// tcp client
 | 
			
		||||
							clientTunnel = new I2PClientTunnel (name, dest, address, port, localDestination, destinationPort);
 | 
			
		||||
							clientEndpoint = ((I2PClientTunnel*)clientTunnel)->GetLocalEndpoint ();
 | 
			
		||||
							auto tun = std::make_shared<I2PClientTunnel> (name, dest, address, port, localDestination, destinationPort);
 | 
			
		||||
							clientTunnel = tun;	
 | 
			
		||||
							clientEndpoint = tun->GetLocalEndpoint ();
 | 
			
		||||
						}
 | 
			
		||||
						uint32_t timeout = section.second.get<uint32_t>(I2P_CLIENT_TUNNEL_CONNECT_TIMEOUT, 0);
 | 
			
		||||
						if(timeout)
 | 
			
		||||
| 
						 | 
				
			
			@ -531,8 +535,7 @@ namespace client
 | 
			
		|||
							LogPrint(eLogInfo, "Clients: I2P Client tunnel connect timeout set to ", timeout);
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						auto clientTunnelDest = clientTunnel->GetLocalDestination (); // make copy of destination for possible update
 | 
			
		||||
						auto ins = m_ClientTunnels.insert (std::make_pair (clientEndpoint,	std::unique_ptr<I2PService>(clientTunnel)));
 | 
			
		||||
						auto ins = m_ClientTunnels.insert (std::make_pair (clientEndpoint, clientTunnel));
 | 
			
		||||
						if (ins.second)
 | 
			
		||||
						{
 | 
			
		||||
							clientTunnel->Start ();
 | 
			
		||||
| 
						 | 
				
			
			@ -541,10 +544,10 @@ namespace client
 | 
			
		|||
						else
 | 
			
		||||
						{
 | 
			
		||||
							// TODO: update
 | 
			
		||||
							if (ins.first->second->GetLocalDestination () != clientTunnelDest)
 | 
			
		||||
							if (ins.first->second->GetLocalDestination () != clientTunnel->GetLocalDestination ())
 | 
			
		||||
							{
 | 
			
		||||
								LogPrint (eLogInfo, "Clients: I2P client tunnel destination updated");
 | 
			
		||||
								ins.first->second->SetLocalDestination (clientTunnelDest);
 | 
			
		||||
								ins.first->second->SetLocalDestination (clientTunnel->GetLocalDestination ());
 | 
			
		||||
							}
 | 
			
		||||
							ins.first->second->isUpdated = true;
 | 
			
		||||
							LogPrint (eLogInfo, "Clients: I2P client tunnel for endpoint ", clientEndpoint, " already exists");
 | 
			
		||||
| 
						 | 
				
			
			@ -589,7 +592,7 @@ namespace client
 | 
			
		|||
						// TODO: hostnames
 | 
			
		||||
						auto localAddress = boost::asio::ip::address::from_string(address);
 | 
			
		||||
						boost::asio::ip::udp::endpoint endpoint(boost::asio::ip::address::from_string(host), port);
 | 
			
		||||
						I2PUDPServerTunnel * serverTunnel = new I2PUDPServerTunnel(name, localDestination, localAddress, endpoint, port);
 | 
			
		||||
						auto serverTunnel = std::make_shared<I2PUDPServerTunnel>(name, localDestination, localAddress, endpoint, port);
 | 
			
		||||
						if(!isUniqueLocal)
 | 
			
		||||
						{
 | 
			
		||||
							LogPrint(eLogInfo, "Clients: disabling loopback address mapping");
 | 
			
		||||
| 
						 | 
				
			
			@ -600,7 +603,7 @@ namespace client
 | 
			
		|||
							std::make_pair(
 | 
			
		||||
								std::make_pair(
 | 
			
		||||
									localDestination->GetIdentHash(), port),
 | 
			
		||||
								std::unique_ptr<I2PUDPServerTunnel>(serverTunnel))).second)
 | 
			
		||||
								serverTunnel)).second)
 | 
			
		||||
						{
 | 
			
		||||
							serverTunnel->Start();
 | 
			
		||||
							LogPrint(eLogInfo, "Clients: I2P Server Forward created for UDP Endpoint ", host, ":", port, " bound on ", address, " for ",localDestination->GetIdentHash().ToBase32());
 | 
			
		||||
| 
						 | 
				
			
			@ -611,13 +614,13 @@ namespace client
 | 
			
		|||
						continue;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					I2PServerTunnel * serverTunnel;
 | 
			
		||||
					std::shared_ptr<I2PServerTunnel>  serverTunnel;
 | 
			
		||||
					if (type == I2P_TUNNELS_SECTION_TYPE_HTTP)
 | 
			
		||||
						serverTunnel = new I2PServerTunnelHTTP (name, host, port, localDestination, hostOverride, inPort, gzip);
 | 
			
		||||
						serverTunnel = std::make_shared<I2PServerTunnelHTTP> (name, host, port, localDestination, hostOverride, inPort, gzip);
 | 
			
		||||
					else if (type == I2P_TUNNELS_SECTION_TYPE_IRC)
 | 
			
		||||
						serverTunnel = new I2PServerTunnelIRC (name, host, port, localDestination, webircpass, inPort, gzip);
 | 
			
		||||
						serverTunnel = std::make_shared<I2PServerTunnelIRC> (name, host, port, localDestination, webircpass, inPort, gzip);
 | 
			
		||||
					else // regular server tunnel by default
 | 
			
		||||
						serverTunnel = new I2PServerTunnel (name, host, port, localDestination, inPort, gzip);
 | 
			
		||||
						serverTunnel = std::make_shared<I2PServerTunnel> (name, host, port, localDestination, inPort, gzip);
 | 
			
		||||
 | 
			
		||||
					if(!isUniqueLocal)
 | 
			
		||||
					{
 | 
			
		||||
| 
						 | 
				
			
			@ -640,10 +643,9 @@ namespace client
 | 
			
		|||
						while (comma != std::string::npos);
 | 
			
		||||
						serverTunnel->SetAccessList (idents);
 | 
			
		||||
					}
 | 
			
		||||
					auto serverTunnelDest = serverTunnel->GetLocalDestination ();
 | 
			
		||||
					auto ins = m_ServerTunnels.insert (std::make_pair (
 | 
			
		||||
							std::make_pair (localDestination->GetIdentHash (), inPort),
 | 
			
		||||
					        std::unique_ptr<I2PServerTunnel>(serverTunnel)));
 | 
			
		||||
							std::make_pair (localDestination->GetIdentHash (), inPort), 
 | 
			
		||||
							serverTunnel));
 | 
			
		||||
					if (ins.second)
 | 
			
		||||
					{
 | 
			
		||||
						serverTunnel->Start ();
 | 
			
		||||
| 
						 | 
				
			
			@ -652,10 +654,10 @@ namespace client
 | 
			
		|||
					else
 | 
			
		||||
					{
 | 
			
		||||
						// TODO: update
 | 
			
		||||
						if (ins.first->second->GetLocalDestination () != serverTunnelDest)
 | 
			
		||||
						if (ins.first->second->GetLocalDestination () != serverTunnel->GetLocalDestination ())
 | 
			
		||||
						{
 | 
			
		||||
							LogPrint (eLogInfo, "Clients: I2P server tunnel destination updated");
 | 
			
		||||
							ins.first->second->SetLocalDestination (serverTunnelDest);
 | 
			
		||||
							ins.first->second->SetLocalDestination (serverTunnel->GetLocalDestination ());
 | 
			
		||||
						}
 | 
			
		||||
						ins.first->second->isUpdated = true;
 | 
			
		||||
						LogPrint (eLogInfo, "Clients: I2P server tunnel for destination/port ",   m_AddressBook.ToAddress(localDestination->GetIdentHash ()), "/", inPort, " already exists");
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -113,12 +113,12 @@ namespace client
 | 
			
		|||
 | 
			
		||||
			i2p::proxy::HTTPProxy * m_HttpProxy;
 | 
			
		||||
			i2p::proxy::SOCKSProxy * m_SocksProxy;
 | 
			
		||||
			std::map<boost::asio::ip::tcp::endpoint, std::unique_ptr<I2PService> > m_ClientTunnels; // local endpoint->tunnel
 | 
			
		||||
			std::map<std::pair<i2p::data::IdentHash, int>, std::unique_ptr<I2PServerTunnel> > m_ServerTunnels; // <destination,port>->tunnel
 | 
			
		||||
			std::map<boost::asio::ip::tcp::endpoint, std::shared_ptr<I2PService> > m_ClientTunnels; // local endpoint->tunnel
 | 
			
		||||
			std::map<std::pair<i2p::data::IdentHash, int>, std::shared_ptr<I2PServerTunnel> > m_ServerTunnels; // <destination,port>->tunnel
 | 
			
		||||
 | 
			
		||||
			std::mutex m_ForwardsMutex;
 | 
			
		||||
			std::map<boost::asio::ip::udp::endpoint, std::unique_ptr<I2PUDPClientTunnel> > m_ClientForwards; // local endpoint -> udp tunnel
 | 
			
		||||
			std::map<std::pair<i2p::data::IdentHash, int>, std::unique_ptr<I2PUDPServerTunnel> > m_ServerForwards; // <destination,port> -> udp tunnel
 | 
			
		||||
			std::map<boost::asio::ip::udp::endpoint, std::shared_ptr<I2PUDPClientTunnel> > m_ClientForwards; // local endpoint -> udp tunnel
 | 
			
		||||
			std::map<std::pair<i2p::data::IdentHash, int>, std::shared_ptr<I2PUDPServerTunnel> > m_ServerForwards; // <destination,port> -> udp tunnel
 | 
			
		||||
 | 
			
		||||
			SAMBridge * m_SamBridge;
 | 
			
		||||
			BOBCommandChannel * m_BOBCommandChannel;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue