|
@@ -3,9 +3,9 @@
|
|
|
//
|
|
|
// SoftEther VPN Server, Client and Bridge are free software under GPLv2.
|
|
|
//
|
|
|
-// Copyright (c) 2012-2015 Daiyuu Nobori.
|
|
|
-// Copyright (c) 2012-2015 SoftEther VPN Project, University of Tsukuba, Japan.
|
|
|
-// Copyright (c) 2012-2015 SoftEther Corporation.
|
|
|
+// Copyright (c) 2012-2016 Daiyuu Nobori.
|
|
|
+// Copyright (c) 2012-2016 SoftEther VPN Project, University of Tsukuba, Japan.
|
|
|
+// Copyright (c) 2012-2016 SoftEther Corporation.
|
|
|
//
|
|
|
// All Rights Reserved.
|
|
|
//
|
|
@@ -6481,12 +6481,15 @@ SOCK *ClientConnectGetSocket(CONNECTION *c, bool additional_connect, bool no_tls
|
|
|
UINT nat_t_err = 0;
|
|
|
bool is_additonal_rudp_session = false;
|
|
|
UCHAR uc = 0;
|
|
|
+ IP ret_ip;
|
|
|
// Validate arguments
|
|
|
if (c == NULL)
|
|
|
{
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+ Zero(&ret_ip, sizeof(IP));
|
|
|
+
|
|
|
sess = c->Session;
|
|
|
|
|
|
if (sess != NULL)
|
|
@@ -6499,12 +6502,25 @@ SOCK *ClientConnectGetSocket(CONNECTION *c, bool additional_connect, bool no_tls
|
|
|
|
|
|
o = c->Session->ClientOption;
|
|
|
|
|
|
+ if (additional_connect)
|
|
|
+ {
|
|
|
+ if (sess != NULL)
|
|
|
+ {
|
|
|
+ Copy(&ret_ip, &sess->ServerIP_CacheForNextConnect, sizeof(IP));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
if (c->RestoreServerNameAndPort && additional_connect)
|
|
|
{
|
|
|
// Restore to the original server name and port number
|
|
|
c->RestoreServerNameAndPort = false;
|
|
|
|
|
|
- StrCpy(c->ServerName, sizeof(c->ServerName), o->Hostname);
|
|
|
+ if (StrCmpi(c->ServerName, o->Hostname) != 0)
|
|
|
+ {
|
|
|
+ StrCpy(c->ServerName, sizeof(c->ServerName), o->Hostname);
|
|
|
+ Zero(&ret_ip, sizeof(IP));
|
|
|
+ }
|
|
|
+
|
|
|
c->ServerPort = o->Port;
|
|
|
}
|
|
|
|
|
@@ -6524,7 +6540,7 @@ SOCK *ClientConnectGetSocket(CONNECTION *c, bool additional_connect, bool no_tls
|
|
|
// If additional_connect == true, follow the IsRUDPSession setting in this session
|
|
|
s = TcpIpConnectEx(host_for_direct_connection, port_for_direct_connection,
|
|
|
(bool *)cancel_flag, hWnd, &nat_t_err, (additional_connect ? (!is_additonal_rudp_session) : false),
|
|
|
- true, no_tls);
|
|
|
+ true, no_tls, &ret_ip);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
@@ -6589,9 +6605,9 @@ SOCK *ClientConnectGetSocket(CONNECTION *c, bool additional_connect, bool no_tls
|
|
|
|
|
|
|
|
|
// SOCKS connection
|
|
|
- s = SocksConnectEx(c, host_for_direct_connection, port_for_direct_connection,
|
|
|
+ s = SocksConnectEx2(c, host_for_direct_connection, port_for_direct_connection,
|
|
|
c->ServerName, c->ServerPort, o->ProxyUsername,
|
|
|
- additional_connect, (bool *)cancel_flag, hWnd);
|
|
|
+ additional_connect, (bool *)cancel_flag, hWnd, 0, &ret_ip);
|
|
|
if (s == NULL)
|
|
|
{
|
|
|
// Connection failure
|
|
@@ -6616,6 +6632,19 @@ SOCK *ClientConnectGetSocket(CONNECTION *c, bool additional_connect, bool no_tls
|
|
|
Copy(&c->Session->ServerIP, &s->RemoteIP, sizeof(IP));
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ if (IsZeroIP(&ret_ip) == false)
|
|
|
+ {
|
|
|
+ if (c->Session != NULL)
|
|
|
+ {
|
|
|
+ if (additional_connect == false)
|
|
|
+ {
|
|
|
+ Copy(&c->Session->ServerIP_CacheForNextConnect, &ret_ip, sizeof(IP));
|
|
|
+
|
|
|
+ Debug("Saved ServerIP_CacheForNextConnect: %s = %r\n", c->ServerName, &ret_ip);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return s;
|
|
@@ -6636,12 +6665,12 @@ SOCK *SocksConnectEx(CONNECTION *c, char *proxy_host_name, UINT proxy_port,
|
|
|
{
|
|
|
return SocksConnectEx2(c, proxy_host_name, proxy_port,
|
|
|
server_host_name, server_port, username, additional_connect, cancel_flag,
|
|
|
- hWnd, 0);
|
|
|
+ hWnd, 0, NULL);
|
|
|
}
|
|
|
SOCK *SocksConnectEx2(CONNECTION *c, char *proxy_host_name, UINT proxy_port,
|
|
|
char *server_host_name, UINT server_port,
|
|
|
char *username, bool additional_connect,
|
|
|
- bool *cancel_flag, void *hWnd, UINT timeout)
|
|
|
+ bool *cancel_flag, void *hWnd, UINT timeout, IP *ret_ip)
|
|
|
{
|
|
|
SOCK *s = NULL;
|
|
|
IP ip;
|
|
@@ -6669,7 +6698,7 @@ SOCK *SocksConnectEx2(CONNECTION *c, char *proxy_host_name, UINT proxy_port,
|
|
|
}
|
|
|
|
|
|
// Connection
|
|
|
- s = TcpConnectEx3(proxy_host_name, proxy_port, timeout, cancel_flag, hWnd, true, NULL, false, false);
|
|
|
+ s = TcpConnectEx3(proxy_host_name, proxy_port, timeout, cancel_flag, hWnd, true, NULL, false, false, ret_ip);
|
|
|
if (s == NULL)
|
|
|
{
|
|
|
// Failure
|
|
@@ -6873,7 +6902,7 @@ SOCK *ProxyConnectEx2(CONNECTION *c, char *proxy_host_name, UINT proxy_port,
|
|
|
}
|
|
|
|
|
|
// Connection
|
|
|
- s = TcpConnectEx3(proxy_host_name, proxy_port, timeout, cancel_flag, hWnd, true, NULL, false, false);
|
|
|
+ s = TcpConnectEx3(proxy_host_name, proxy_port, timeout, cancel_flag, hWnd, true, NULL, false, false, NULL);
|
|
|
if (s == NULL)
|
|
|
{
|
|
|
// Failure
|
|
@@ -7025,15 +7054,15 @@ SOCK *ProxyConnectEx2(CONNECTION *c, char *proxy_host_name, UINT proxy_port,
|
|
|
// TCP connection function
|
|
|
SOCK *TcpConnectEx2(char *hostname, UINT port, UINT timeout, bool *cancel_flag, void *hWnd, bool try_start_ssl, bool ssl_no_tls)
|
|
|
{
|
|
|
- return TcpConnectEx3(hostname, port, timeout, cancel_flag, hWnd, false, NULL, try_start_ssl, ssl_no_tls);
|
|
|
+ return TcpConnectEx3(hostname, port, timeout, cancel_flag, hWnd, false, NULL, try_start_ssl, ssl_no_tls, NULL);
|
|
|
}
|
|
|
-SOCK *TcpConnectEx3(char *hostname, UINT port, UINT timeout, bool *cancel_flag, void *hWnd, bool no_nat_t, UINT *nat_t_error_code, bool try_start_ssl, bool ssl_no_tls)
|
|
|
+SOCK *TcpConnectEx3(char *hostname, UINT port, UINT timeout, bool *cancel_flag, void *hWnd, bool no_nat_t, UINT *nat_t_error_code, bool try_start_ssl, bool ssl_no_tls, IP *ret_ip)
|
|
|
{
|
|
|
#ifdef OS_WIN32
|
|
|
if (hWnd == NULL)
|
|
|
{
|
|
|
#endif // OS_WIN32
|
|
|
- return ConnectEx3(hostname, port, timeout, cancel_flag, (no_nat_t ? NULL : VPN_RUDP_SVC_NAME), nat_t_error_code, try_start_ssl, ssl_no_tls, true);
|
|
|
+ return ConnectEx4(hostname, port, timeout, cancel_flag, (no_nat_t ? NULL : VPN_RUDP_SVC_NAME), nat_t_error_code, try_start_ssl, ssl_no_tls, true, ret_ip);
|
|
|
#ifdef OS_WIN32
|
|
|
}
|
|
|
else
|
|
@@ -7046,9 +7075,9 @@ SOCK *TcpConnectEx3(char *hostname, UINT port, UINT timeout, bool *cancel_flag,
|
|
|
// Connect with TCP/IP
|
|
|
SOCK *TcpIpConnect(char *hostname, UINT port, bool try_start_ssl, bool ssl_no_tls)
|
|
|
{
|
|
|
- return TcpIpConnectEx(hostname, port, NULL, NULL, NULL, false, try_start_ssl, ssl_no_tls);
|
|
|
+ return TcpIpConnectEx(hostname, port, NULL, NULL, NULL, false, try_start_ssl, ssl_no_tls, NULL);
|
|
|
}
|
|
|
-SOCK *TcpIpConnectEx(char *hostname, UINT port, bool *cancel_flag, void *hWnd, UINT *nat_t_error_code, bool no_nat_t, bool try_start_ssl, bool ssl_no_tls)
|
|
|
+SOCK *TcpIpConnectEx(char *hostname, UINT port, bool *cancel_flag, void *hWnd, UINT *nat_t_error_code, bool no_nat_t, bool try_start_ssl, bool ssl_no_tls, IP *ret_ip)
|
|
|
{
|
|
|
SOCK *s = NULL;
|
|
|
UINT dummy_int = 0;
|
|
@@ -7063,7 +7092,7 @@ SOCK *TcpIpConnectEx(char *hostname, UINT port, bool *cancel_flag, void *hWnd, U
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
- s = TcpConnectEx3(hostname, port, 0, cancel_flag, hWnd, no_nat_t, nat_t_error_code, try_start_ssl, ssl_no_tls);
|
|
|
+ s = TcpConnectEx3(hostname, port, 0, cancel_flag, hWnd, no_nat_t, nat_t_error_code, try_start_ssl, ssl_no_tls, ret_ip);
|
|
|
if (s == NULL)
|
|
|
{
|
|
|
return NULL;
|