TURN server configuration implemented.

This commit is contained in:
Levent
2021-08-30 12:43:12 +03:00
committed by Fletcher Dunn
parent ac4dbdf86b
commit 30ec24294f
6 changed files with 90 additions and 1 deletions
+3
View File
@@ -1444,6 +1444,9 @@ enum ESteamNetworkingConfigValue
/// route ping time and is then adjusted.)
k_ESteamNetworkingConfig_P2P_Transport_ICE_Penalty = 105,
k_ESteamNetworkingConfig_P2P_Transport_SDR_Penalty = 106,
k_ESteamNetworkingConfig_P2P_TURN_ServerList = 107,
k_ESteamNetworkingConfig_P2P_TURN_UserList = 108,
k_ESteamNetworkingConfig_P2P_TURN_PassList = 109,
//k_ESteamNetworkingConfig_P2P_Transport_LANBeacon_Penalty = 107,
//
+1
View File
@@ -313,6 +313,7 @@ bool CICESession::BInitializeOnSocketThread( const ICESessionConfig &cfg )
case k_EProtocolTypeTCP:
case k_EProtocolTypeSSLTCP:
case k_EProtocolTypeTLS:
break;
default:
m_pDelegate->Log( IICESessionDelegate::k_ELogPriorityError, "Invalid Turn server protocol type '%d'\n", (int) pTurn->m_protocolType );
return false;
@@ -97,6 +97,9 @@ DEFINE_CONNECTON_DEFAULT_CONFIGVAL( int32, EnableDiagnosticsUI, 1, 0, 1 );
#ifdef STEAMNETWORKINGSOCKETS_ENABLE_ICE
DEFINE_CONNECTON_DEFAULT_CONFIGVAL( std::string, P2P_STUN_ServerList, "" );
DEFINE_CONNECTON_DEFAULT_CONFIGVAL( std::string, P2P_TURN_ServerList, "" );
DEFINE_CONNECTON_DEFAULT_CONFIGVAL( std::string, P2P_TURN_UserList, "" );
DEFINE_CONNECTON_DEFAULT_CONFIGVAL( std::string, P2P_TURN_PassList, "" );
COMPILE_TIME_ASSERT( k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Default == -1 );
COMPILE_TIME_ASSERT( k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Disable == 0 );
@@ -141,7 +141,7 @@ void CConnectionTransportP2PICE::Init()
if ( P2P_Transport_ICE_Enable & k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Private )
m_nAllowedCandidateTypes |= k_EICECandidate_Any_HostPrivate;
// Get the STUN server list
// Get the STUN server list
std_vector<std::string> vecStunServers;
std_vector<const char *> vecStunServersPsz;
if ( P2P_Transport_ICE_Enable & k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Public )
@@ -177,10 +177,79 @@ void CConnectionTransportP2PICE::Init()
cfg.m_pStunServers = vecStunServersPsz.data();
// Get the TURN server list
std_vector<std::string> vecTurnServers;
std_vector<std::string> vecTurnUsers;
std_vector<std::string> vecTurnPasses;
std_vector<ICESessionConfig::TurnServer*> vecTurnServersPsz;
if ( P2P_Transport_ICE_Enable & k_nSteamNetworkingConfig_P2P_Transport_ICE_Enable_Relay )
{
// FIXME
//cfg.m_nCandidateTypes = m_nAllowedCandidateTypes;
m_nAllowedCandidateTypes |= k_EICECandidate_Any_HostPublic | k_EICECandidate_Any_Reflexive;
{
CUtlVectorAutoPurge<char*> tempTurnServers;
V_AllocAndSplitString(m_connection.m_connectionConfig.m_P2P_TURN_ServerList.Get().c_str(), ",", tempTurnServers);
for (const char* pszAddress : tempTurnServers)
{
std::string server;
// Add prefix, unless they already supplied it
if (V_strnicmp(pszAddress, "turn:", 5) != 0)
server = "turn:";
server.append(pszAddress);
vecTurnServers.push_back(std::move(server));
}
// populate usernames
CUtlVectorAutoPurge<char*> tempTurnUsers;
V_AllocAndSplitString(m_connection.m_connectionConfig.m_P2P_TURN_UserList.Get().c_str(), ",", tempTurnUsers);
for (const char* user : tempTurnServers)
{
std::string server;
server.append(user);
vecTurnUsers.push_back(std::move(server));
}
// populate passwords
CUtlVectorAutoPurge<char*> tempTurnPasses;
V_AllocAndSplitString(m_connection.m_connectionConfig.m_P2P_TURN_PassList.Get().c_str(), ",", tempTurnPasses);
for (const char* pass : tempTurnPasses)
{
std::string server;
server.append(pass);
vecTurnPasses.push_back(std::move(server));
}
}
if (vecTurnServers.empty())
SpewWarningGroup(LogLevel_P2PRendezvous(), "[%s] Reflexive candidates enabled by P2P_Transport_ICE_Enable, but P2P_STUN_ServerList is empty\n", ConnectionDescription());
else
SpewVerboseGroup(LogLevel_P2PRendezvous(), "[%s] Using STUN server list: %s\n", ConnectionDescription(), m_connection.m_connectionConfig.m_P2P_TURN_ServerList.Get().c_str());
Assert(vecTurnServers.size() == vecTurnUsers.size() == vecTurnPasses.size());
}
else
{
SpewVerboseGroup(LogLevel_P2PRendezvous(), "[%s] Not using STUN servers as per P2P_Transport_ICE_Enable\n", ConnectionDescription());
}
// Populate TurnServers configs
for (int i = 0; i < vecTurnServers.size(); i++)
{
ICESessionConfig::TurnServer* turn = new ICESessionConfig::TurnServer();
turn->m_pszHost = vecTurnServers[i].c_str();
turn->m_pszPwd = vecTurnUsers[i].c_str();
turn->m_pszUsername = vecTurnPasses[i].c_str();
vecTurnServersPsz.push_back(turn);
}
// If any Turn server config exists, set it
if (vecTurnServers.size() > 0)
{
cfg.m_nTurnServers = len(vecTurnServers);
cfg.m_pTurnServers = *vecTurnServersPsz.data();
}
cfg.m_nCandidateTypes = m_nAllowedCandidateTypes;
@@ -822,6 +822,9 @@ struct ConnectionConfig
ConfigValue<std::string> m_P2P_STUN_ServerList;
ConfigValue<int32> m_P2P_Transport_ICE_Enable;
ConfigValue<int32> m_P2P_Transport_ICE_Penalty;
ConfigValue<std::string> m_P2P_TURN_ServerList;
ConfigValue<std::string> m_P2P_TURN_UserList;
ConfigValue<std::string> m_P2P_TURN_PassList;
#endif
#ifdef STEAMNETWORKINGSOCKETS_ENABLE_SDR
+10
View File
@@ -198,6 +198,16 @@ int main( int argc, const char **argv )
// Hardcode STUN servers
SteamNetworkingUtils()->SetGlobalConfigValueString( k_ESteamNetworkingConfig_P2P_STUN_ServerList, "stun.l.google.com:19302" );
// Hardcode TURN servers
// comma seperated setting lists
//const char* turnList = "turn:123.45.45:3478";
//const char* userList = "username";
//const char* passList = "pass";
//SteamNetworkingUtils()->SetGlobalConfigValueString(k_ESteamNetworkingConfig_P2P_TURN_ServerList, turnList);
//SteamNetworkingUtils()->SetGlobalConfigValueString(k_ESteamNetworkingConfig_P2P_TURN_UserList, userList);
//SteamNetworkingUtils()->SetGlobalConfigValueString(k_ESteamNetworkingConfig_P2P_TURN_PassList, passList);
// Allow sharing of any kind of ICE address.
// We don't have any method of relaying (TURN) in this example, so we are essentially
// forced to disclose our public address if we want to pierce NAT. But if we