diff --git a/NETWORKING.md b/NETWORKING.md
index a6c448461..a809e4b88 100644
--- a/NETWORKING.md
+++ b/NETWORKING.md
@@ -78,6 +78,9 @@ The current server configuration xml looks like this:
+
+
+
diff --git a/src/network/server_config.cpp b/src/network/server_config.cpp
index ea88e9d9d..1bf18faec 100644
--- a/src/network/server_config.cpp
+++ b/src/network/server_config.cpp
@@ -340,6 +340,15 @@ void loadServerLobbyFromConfig()
m_server_max_players > 10)
m_server_max_players = 10;
+ if (m_ipv6_server)
+ {
+#ifdef ENABLE_IPV6
+ m_firewalled_server = false;
+#else
+ Log::warn("ServerConfig", "IPV6 support not compiled.");
+#endif
+ }
+
if (m_ranked)
{
m_validating_player = true;
diff --git a/src/network/server_config.hpp b/src/network/server_config.hpp
index 363119d81..363d1ab28 100644
--- a/src/network/server_config.hpp
+++ b/src/network/server_config.hpp
@@ -176,6 +176,14 @@ namespace ServerConfig
"it allows saving server resource if your server is not "
"behind a firewall."));
+ SERVER_CFG_PREFIX BoolServerConfigParam m_ipv6_server
+ SERVER_CFG_DEFAULT(BoolServerConfigParam(false, "ipv6-server",
+ "Enable to allow ipv6 connection if you have a public ipv6 address. "
+ "STK currently use dual-stack mode which requires server to have both "
+ "ipv4 and ipv6 and listen to same port, firewalled-server will be "
+ "disabled so you need to make sure this server has port forward "
+ "configured properly if needed."));
+
SERVER_CFG_PREFIX BoolServerConfigParam m_owner_less
SERVER_CFG_DEFAULT(BoolServerConfigParam(false, "owner-less",
"No server owner in lobby which can control the starting of game or "
diff --git a/src/network/stk_host.cpp b/src/network/stk_host.cpp
index 8a549daea..667cdb8e3 100644
--- a/src/network/stk_host.cpp
+++ b/src/network/stk_host.cpp
@@ -261,6 +261,7 @@ STKHost::STKHost(bool server)
if (server)
{
+ setIPV6(ServerConfig::m_ipv6_server ? 1 : 0);
addr.port = ServerConfig::m_server_port;
if (addr.port == 0 && !UserConfigParams::m_random_server_port)
addr.port = stk_config->m_server_port;
@@ -856,12 +857,18 @@ void STKHost::mainLoop()
// A separate network connection (socket) to handle LAN requests.
Network* direct_socket = NULL;
- if (!isIPV6() && ((NetworkConfig::get()->isLAN() && is_server) ||
- NetworkConfig::get()->isPublicServer()))
+ if ((NetworkConfig::get()->isLAN() && is_server) ||
+ NetworkConfig::get()->isPublicServer())
{
TransportAddress address(0, stk_config->m_server_discovery_port);
ENetAddress eaddr = address.toEnetAddress();
+ bool socket_ipv6 = isIPV6() == 1 ? true : false;
+ if (socket_ipv6)
+ setIPV6(0);
+ // direct_socket use IPV4 only atm
direct_socket = new Network(1, 1, 0, 0, &eaddr);
+ if (socket_ipv6)
+ setIPV6(1);
if (direct_socket->getENetHost() == NULL)
{
Log::warn("STKHost", "No direct socket available, this "
diff --git a/src/network/unix_ipv6.cpp b/src/network/unix_ipv6.cpp
index f557ce865..2f2ac910a 100644
--- a/src/network/unix_ipv6.cpp
+++ b/src/network/unix_ipv6.cpp
@@ -141,6 +141,11 @@ int isIPV6()
return 0;
} // isIPV6
+// ----------------------------------------------------------------------------
+void setIPV6(int val)
+{
+} // setIPV6
+
// ----------------------------------------------------------------------------
std::string getIPV6ReadableFromMappedAddress(const ENetAddress* ea)
{
@@ -180,7 +185,7 @@ void unixInitialize()
{
// Clear previous setting, in case user changed wifi or mobile data
g_mapped_ipv6_used = 0;
- g_ipv6 = 1;
+ g_ipv6 = 0;
g_mapped_ips.clear();
} // unixInitialize