Fix possible address family mismatch (found in android)
This commit is contained in:
parent
ecb31ad217
commit
906dca1a94
@ -232,7 +232,7 @@ void NetworkConfig::detectIPType()
|
|||||||
SocketAddress stun_v4(ipv4_it->first, 0/*port specified in addr*/,
|
SocketAddress stun_v4(ipv4_it->first, 0/*port specified in addr*/,
|
||||||
AF_INET);
|
AF_INET);
|
||||||
bool sent_ipv4 = false;
|
bool sent_ipv4 = false;
|
||||||
if (!stun_v4.isUnset())
|
if (!stun_v4.isUnset() && stun_v4.getFamily() == AF_INET)
|
||||||
{
|
{
|
||||||
sendto(ipv4->getENetHost()->socket, s.getData(), s.size(), 0,
|
sendto(ipv4->getENetHost()->socket, s.getData(), s.size(), 0,
|
||||||
stun_v4.getSockaddr(), stun_v4.getSocklen());
|
stun_v4.getSockaddr(), stun_v4.getSocklen());
|
||||||
@ -242,7 +242,7 @@ void NetworkConfig::detectIPType()
|
|||||||
SocketAddress stun_v6(ipv6_it->first, 0/*port specified in addr*/,
|
SocketAddress stun_v6(ipv6_it->first, 0/*port specified in addr*/,
|
||||||
AF_INET6);
|
AF_INET6);
|
||||||
bool sent_ipv6 = false;
|
bool sent_ipv6 = false;
|
||||||
if (!stun_v6.isUnset())
|
if (!stun_v6.isUnset() && stun_v6.getFamily() == AF_INET6)
|
||||||
{
|
{
|
||||||
sendto(ipv6->getENetHost()->socket, s.getData(), s.size(), 0,
|
sendto(ipv6->getENetHost()->socket, s.getData(), s.size(), 0,
|
||||||
stun_v6.getSockaddr(), stun_v6.getSocklen());
|
stun_v6.getSockaddr(), stun_v6.getSocklen());
|
||||||
|
@ -256,7 +256,7 @@ void ConnectToServer::asynchronousUpdate()
|
|||||||
if (m_server->supportsEncryption())
|
if (m_server->supportsEncryption())
|
||||||
{
|
{
|
||||||
STKHost::get()->setPublicAddress(
|
STKHost::get()->setPublicAddress(
|
||||||
!m_server->useIPV6Connection());
|
m_server->useIPV6Connection() ? AF_INET6 : AF_INET);
|
||||||
if (!STKHost::get()->getValidPublicAddress().empty())
|
if (!STKHost::get()->getValidPublicAddress().empty())
|
||||||
registerWithSTKServer();
|
registerWithSTKServer();
|
||||||
}
|
}
|
||||||
|
@ -1371,12 +1371,12 @@ void ServerLobby::asynchronousUpdate()
|
|||||||
// Set the IPv6 address first for possible IPv6 only server
|
// Set the IPv6 address first for possible IPv6 only server
|
||||||
if (isIPv6Socket() && ip_type >= NetworkConfig::IP_V6)
|
if (isIPv6Socket() && ip_type >= NetworkConfig::IP_V6)
|
||||||
{
|
{
|
||||||
STKHost::get()->setPublicAddress(false/*ipv4*/);
|
STKHost::get()->setPublicAddress(AF_INET6);
|
||||||
}
|
}
|
||||||
if (ip_type == NetworkConfig::IP_V4 ||
|
if (ip_type == NetworkConfig::IP_V4 ||
|
||||||
ip_type == NetworkConfig::IP_DUAL_STACK)
|
ip_type == NetworkConfig::IP_DUAL_STACK)
|
||||||
{
|
{
|
||||||
STKHost::get()->setPublicAddress(true/*ipv4*/);
|
STKHost::get()->setPublicAddress(AF_INET);
|
||||||
}
|
}
|
||||||
if (STKHost::get()->getPublicAddress().isUnset() &&
|
if (STKHost::get()->getPublicAddress().isUnset() &&
|
||||||
STKHost::get()->getPublicIPv6Address().empty())
|
STKHost::get()->getPublicIPv6Address().empty())
|
||||||
|
@ -410,12 +410,11 @@ BareNetworkString STKHost::getStunRequest(uint8_t* stun_tansaction_id)
|
|||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
void STKHost::getIPFromStun(int socket, const std::string& stun_address,
|
void STKHost::getIPFromStun(int socket, const std::string& stun_address,
|
||||||
bool ipv4, SocketAddress* result)
|
short family, SocketAddress* result)
|
||||||
{
|
{
|
||||||
short family = ipv4 ? AF_INET : AF_INET6;
|
|
||||||
// The IPv4 stun address has no AAAA record, so give it an AF_INET6 will
|
// The IPv4 stun address has no AAAA record, so give it an AF_INET6 will
|
||||||
// return one using NAT64 and DNS64
|
// return one using NAT64 and DNS64
|
||||||
if (isIPv6Socket() && ipv4 &&
|
if (isIPv6Socket() && family == AF_INET &&
|
||||||
NetworkConfig::get()->getIPType() == NetworkConfig::IP_V6_NAT64)
|
NetworkConfig::get()->getIPType() == NetworkConfig::IP_V6_NAT64)
|
||||||
family = AF_INET6;
|
family = AF_INET6;
|
||||||
|
|
||||||
@ -620,9 +619,9 @@ void STKHost::getIPFromStun(int socket, const std::string& stun_address,
|
|||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
/** Set the public address using stun protocol.
|
/** Set the public address using stun protocol.
|
||||||
*/
|
*/
|
||||||
void STKHost::setPublicAddress(bool ipv4)
|
void STKHost::setPublicAddress(short family)
|
||||||
{
|
{
|
||||||
auto& stun_map = ipv4 ? UserConfigParams::m_stun_servers_v4 :
|
auto& stun_map = family == AF_INET ? UserConfigParams::m_stun_servers_v4 :
|
||||||
UserConfigParams::m_stun_servers;
|
UserConfigParams::m_stun_servers;
|
||||||
std::vector<std::pair<std::string, uint32_t> > untried_server;
|
std::vector<std::pair<std::string, uint32_t> > untried_server;
|
||||||
for (auto& p : stun_map)
|
for (auto& p : stun_map)
|
||||||
@ -649,13 +648,22 @@ void STKHost::setPublicAddress(bool ipv4)
|
|||||||
Log::debug("STKHost", "Using STUN server %s", server_name.c_str());
|
Log::debug("STKHost", "Using STUN server %s", server_name.c_str());
|
||||||
uint64_t ping = StkTime::getMonoTimeMs();
|
uint64_t ping = StkTime::getMonoTimeMs();
|
||||||
SocketAddress result;
|
SocketAddress result;
|
||||||
getIPFromStun((int)m_network->getENetHost()->socket, server_name, ipv4,
|
getIPFromStun((int)m_network->getENetHost()->socket, server_name, family,
|
||||||
&result);
|
&result);
|
||||||
if (!result.isUnset())
|
if (!result.isUnset())
|
||||||
{
|
{
|
||||||
|
if (result.getFamily() != family)
|
||||||
|
{
|
||||||
|
Log::error("STKHost",
|
||||||
|
"Public address family differ from request");
|
||||||
|
// This happens when you force to use IPv6 connection to detect
|
||||||
|
// public address if there is only IPv4 connection, which it
|
||||||
|
// will give you an IPv4 address, so we can exit earlier
|
||||||
|
return;
|
||||||
|
}
|
||||||
// For dual stack server we get the IPv6 address and then IPv4, if
|
// For dual stack server we get the IPv6 address and then IPv4, if
|
||||||
// their ports differ we discard the public IPv6 address of server
|
// their ports differ we discard the public IPv6 address of server
|
||||||
if (NetworkConfig::get()->isServer() && ipv4 &&
|
if (NetworkConfig::get()->isServer() && family == AF_INET &&
|
||||||
result.getPort() != m_public_address->getPort())
|
result.getPort() != m_public_address->getPort())
|
||||||
{
|
{
|
||||||
if (isIPv6Socket())
|
if (isIPv6Socket())
|
||||||
@ -665,7 +673,7 @@ void STKHost::setPublicAddress(bool ipv4)
|
|||||||
}
|
}
|
||||||
m_public_ipv6_address.clear();
|
m_public_ipv6_address.clear();
|
||||||
}
|
}
|
||||||
if (ipv4)
|
if (family == AF_INET)
|
||||||
*m_public_address = result;
|
*m_public_address = result;
|
||||||
else
|
else
|
||||||
m_public_ipv6_address = result.toString(false/*show_port*/);
|
m_public_ipv6_address = result.toString(false/*show_port*/);
|
||||||
|
@ -177,8 +177,8 @@ private:
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void mainLoop();
|
void mainLoop();
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void getIPFromStun(int socket, const std::string& stun_address, bool ipv4,
|
void getIPFromStun(int socket, const std::string& stun_address,
|
||||||
SocketAddress* result);
|
short family, SocketAddress* result);
|
||||||
public:
|
public:
|
||||||
/** If a network console should be started. */
|
/** If a network console should be started. */
|
||||||
static bool m_enable_console;
|
static bool m_enable_console;
|
||||||
@ -221,7 +221,7 @@ public:
|
|||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
uint16_t getPrivatePort() const;
|
uint16_t getPrivatePort() const;
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void setPublicAddress(bool ipv4);
|
void setPublicAddress(short family);
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void disconnectAllPeers(bool timeout_waiting = false);
|
void disconnectAllPeers(bool timeout_waiting = false);
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user