about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-03-30 12:08:33 +0200
committeroy <Tom_Adams@web.de>2011-03-30 12:08:33 +0200
commit59d56cd332ecc86008c27326631566a4d2d94ecb (patch)
tree9e207d901bd93c86e9e98260479a57a9fef85faa /src/engine
parent693bd39e77ee91ec335d8e30350b57edca8056fd (diff)
downloadzcatch-59d56cd332ecc86008c27326631566a4d2d94ecb.tar.gz
zcatch-59d56cd332ecc86008c27326631566a4d2d94ecb.zip
finished IPv6 support (master servers aren't compatible with 0.5 and older). Closes #233
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/client.cpp35
-rw-r--r--src/engine/client/serverbrowser.cpp27
-rw-r--r--src/engine/masterserver.h1
-rw-r--r--src/engine/server/register.cpp20
-rw-r--r--src/engine/shared/engine.cpp3
-rw-r--r--src/engine/shared/jobs.h1
-rw-r--r--src/engine/shared/masterserver.cpp42
-rw-r--r--src/engine/shared/network_server.cpp19
8 files changed, 80 insertions, 68 deletions
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp
index a39bfb5b..28c0fad4 100644
--- a/src/engine/client/client.cpp
+++ b/src/engine/client/client.cpp
@@ -698,7 +698,7 @@ void CClient::Connect(const char *pAddress)
 		char aBufMsg[256];
 		str_format(aBufMsg, sizeof(aBufMsg), "could not find the address of %s, connecting to localhost", aBuf);
 		m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "client", aBufMsg);
-		net_host_lookup("localhost", &m_ServerAddress, NETTYPE_IPV4);
+		net_host_lookup("localhost", &m_ServerAddress, NETTYPE_ALL);
 	}
 
 	m_RconAuthed = 0;
@@ -1052,34 +1052,31 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket)
 		bool Valid = false;
 		for(int i = 0; i < IMasterServer::MAX_MASTERSERVERS; ++i)
 		{
-			NETADDR Addr = m_pMasterServer->GetAddr(i);
-			if(net_addr_comp(&pPacket->m_Address, &Addr) == 0)
+			if(m_pMasterServer->IsValid(i))
 			{
-				Valid = true;
-				break;
+				NETADDR Addr = m_pMasterServer->GetAddr(i);
+				if(net_addr_comp(&pPacket->m_Address, &Addr) == 0)
+				{
+					Valid = true;
+					break;
+				}
 			}
 		}
 		if(!Valid)
 			return;
 
 		int Size = pPacket->m_DataSize-sizeof(SERVERBROWSE_LIST);
-		int Num = Size/sizeof(MASTERSRV_ADDR);
-		MASTERSRV_ADDR *pAddrs = (MASTERSRV_ADDR *)((char*)pPacket->m_pData+sizeof(SERVERBROWSE_LIST));
-		int i;
-
-		for(i = 0; i < Num; i++)
+		int Num = Size/sizeof(CMastersrvAddr);
+		CMastersrvAddr *pAddrs = (CMastersrvAddr *)((char*)pPacket->m_pData+sizeof(SERVERBROWSE_LIST));
+		for(int i = 0; i < Num; i++)
 		{
 			NETADDR Addr;
 
-			// convert address
-			mem_zero(&Addr, sizeof(Addr));
-			Addr.type = NETTYPE_IPV4;
-			Addr.ip[0] = pAddrs[i].m_aIp[0];
-			Addr.ip[1] = pAddrs[i].m_aIp[1];
-			Addr.ip[2] = pAddrs[i].m_aIp[2];
-			Addr.ip[3] = pAddrs[i].m_aIp[3];
-			Addr.port = (pAddrs[i].m_aPort[1]<<8) | pAddrs[i].m_aPort[0];
-
+			// copy address
+			Addr.type = (pAddrs->m_aType[0]<<24) | (pAddrs->m_aType[1]<<16) | (pAddrs->m_aType[2]<<8) | pAddrs->m_aType[3];
+			mem_copy(Addr.ip, pAddrs->m_aIp, sizeof(Addr.ip));
+			Addr.port = (pAddrs->m_aPort[0]<<8) | pAddrs->m_aPort[1];
+			
 			m_ServerBrowser.Set(Addr, IServerBrowser::SET_MASTER_ADD, -1, 0x0);
 		}
 	}
diff --git a/src/engine/client/serverbrowser.cpp b/src/engine/client/serverbrowser.cpp
index 55d25f8a..36447922 100644
--- a/src/engine/client/serverbrowser.cpp
+++ b/src/engine/client/serverbrowser.cpp
@@ -380,15 +380,8 @@ CServerBrowser::CServerEntry *CServerBrowser::Add(const NETADDR &Addr)
 	pEntry->m_Info.m_NetAddr = Addr;
 
 	pEntry->m_Info.m_Latency = 999;
-	str_format(pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aAddress), "%d.%d.%d.%d:%d",
-		Addr.ip[0], Addr.ip[1], Addr.ip[2],
-		Addr.ip[3], Addr.port);
-	str_format(pEntry->m_Info.m_aName, sizeof(pEntry->m_Info.m_aName), "%d.%d.%d.%d:%d",
-		Addr.ip[0], Addr.ip[1], Addr.ip[2],
-		Addr.ip[3], Addr.port);
-
-	/*if(serverlist_type == IServerBrowser::TYPE_LAN)
-		pEntry->m_Info.latency = (time_get()-broadcast_time)*1000/time_freq();*/
+	net_addr_str(&Addr, pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aAddress));
+	str_copy(pEntry->m_Info.m_aName, pEntry->m_Info.m_aAddress, sizeof(pEntry->m_Info.m_aName));
 
 	// check if it's a favorite
 	for(i = 0; i < m_NumFavoriteServers; i++)
@@ -526,10 +519,10 @@ void CServerBrowser::RequestImpl(const NETADDR &Addr, CServerEntry *pEntry) cons
 
 	if(g_Config.m_Debug)
 	{
+		char aAddrStr[NETADDR_MAXSTRSIZE];
+		net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr));
 		char aBuf[256];
-		str_format(aBuf, sizeof(aBuf),"requesting server info from %d.%d.%d.%d:%d",
-			Addr.ip[0], Addr.ip[1], Addr.ip[2],
-			Addr.ip[3], Addr.port);
+		str_format(aBuf, sizeof(aBuf),"requesting server info from %s", aAddrStr);
 		m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client_srvbrowse", aBuf);
 	}
 
@@ -556,7 +549,7 @@ void CServerBrowser::Request(const NETADDR &Addr) const
 
 void CServerBrowser::Update(bool ForceResort)
 {
-	int64 Timeout = time_freq()/2;	// TODO 0.6: increase this again
+	int64 Timeout = time_freq();
 	int64 Now = time_get();
 	int Count;
 	CServerEntry *pEntry, *pNext;
@@ -578,10 +571,10 @@ void CServerBrowser::Update(bool ForceResort)
 
 		for(i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++)
 		{
-			Addr = m_pMasterServer->GetAddr(i);
-			if(!Addr.ip[0] && !Addr.ip[1] && !Addr.ip[2] && !Addr.ip[3])
+			if(!m_pMasterServer->IsValid(i))
 				continue;
 
+			Addr = m_pMasterServer->GetAddr(i);
 			Packet.m_Address = Addr;
 			m_pNetClient->Send(&Packet);
 		}
@@ -667,8 +660,10 @@ void CServerBrowser::AddFavorite(const NETADDR &Addr)
 
     if(g_Config.m_Debug)
 	{
+		char aAddrStr[NETADDR_MAXSTRSIZE];
+		net_addr_str(&Addr, aAddrStr, sizeof(aAddrStr));
 		char aBuf[256];
-        str_format(aBuf, sizeof(aBuf), "added fav, %d.%d.%d.%d:%d", Addr.ip[0], Addr.ip[1], Addr.ip[2], Addr.ip[3], Addr.port);
+		str_format(aBuf, sizeof(aBuf), "added fav, %s", aAddrStr);
 		m_pConsole->Print(IConsole::OUTPUT_LEVEL_DEBUG, "client_srvbrowse", aBuf);
 	}
 }
diff --git a/src/engine/masterserver.h b/src/engine/masterserver.h
index 1788a18d..98a9cf0a 100644
--- a/src/engine/masterserver.h
+++ b/src/engine/masterserver.h
@@ -26,6 +26,7 @@ public:
 	virtual void DumpServers() = 0;
 	virtual NETADDR GetAddr(int Index) = 0;
 	virtual const char *GetName(int Index) = 0;
+	virtual bool IsValid(int Index) = 0;
 };
 
 class IEngineMasterServer : public IMasterServer
diff --git a/src/engine/server/register.cpp b/src/engine/server/register.cpp
index 20c7d173..5f43e292 100644
--- a/src/engine/server/register.cpp
+++ b/src/engine/server/register.cpp
@@ -124,18 +124,18 @@ void CRegister::RegisterUpdate()
 			int i;
 			for(i = 0; i < IMasterServer::MAX_MASTERSERVERS; i++)
 			{
-				NETADDR Addr = m_pMasterServer->GetAddr(i);
-				m_aMasterserverInfo[i].m_Addr = Addr;
-				m_aMasterserverInfo[i].m_Count = 0;
-			
-				if(!Addr.ip[0] && !Addr.ip[1] && !Addr.ip[2] && !Addr.ip[3])
-					m_aMasterserverInfo[i].m_Valid = 0;
-				else
+				if(!m_pMasterServer->IsValid(i))
 				{
-					m_aMasterserverInfo[i].m_Valid = 1;
-					m_aMasterserverInfo[i].m_Count = -1;
-					m_aMasterserverInfo[i].m_LastSend = 0;
+					m_aMasterserverInfo[i].m_Valid = 0;
+					m_aMasterserverInfo[i].m_Count = 0;
+					continue;
 				}
+
+				NETADDR Addr = m_pMasterServer->GetAddr(i);
+				m_aMasterserverInfo[i].m_Addr = Addr;
+				m_aMasterserverInfo[i].m_Valid = 1;
+				m_aMasterserverInfo[i].m_Count = -1;
+				m_aMasterserverInfo[i].m_LastSend = 0;
 			}
 			
 			m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "register", "fetching server counts");
diff --git a/src/engine/shared/engine.cpp b/src/engine/shared/engine.cpp
index 6839cc64..c7a1daad 100644
--- a/src/engine/shared/engine.cpp
+++ b/src/engine/shared/engine.cpp
@@ -13,8 +13,7 @@
 static int HostLookupThread(void *pUser)
 {
 	CHostLookup *pLookup = (CHostLookup *)pUser;
-	net_host_lookup(pLookup->m_aHostname, &pLookup->m_Addr, NETTYPE_IPV4);
-	return 0;
+	return net_host_lookup(pLookup->m_aHostname, &pLookup->m_Addr, NETTYPE_ALL);
 }
 
 class CEngine : public IEngine
diff --git a/src/engine/shared/jobs.h b/src/engine/shared/jobs.h
index 61835186..2b0d7d15 100644
--- a/src/engine/shared/jobs.h
+++ b/src/engine/shared/jobs.h
@@ -34,6 +34,7 @@ public:
 	};
 	
 	int Status() const { return m_Status; }
+	int Result() const {return m_Result; }
 };
 
 class CJobPool
diff --git a/src/engine/shared/masterserver.cpp b/src/engine/shared/masterserver.cpp
index 545cc16c..3037d152 100644
--- a/src/engine/shared/masterserver.cpp
+++ b/src/engine/shared/masterserver.cpp
@@ -18,6 +18,7 @@ public:
 	{
 		char m_aHostname[128];
 		NETADDR m_Addr;
+		bool m_Valid;
 		
 		CHostLookup m_Lookup;
 	} ;
@@ -44,8 +45,11 @@ public:
 		dbg_msg("engine/mastersrv", "refreshing master server addresses");
 
 		// add lookup jobs
-		for(i = 0; i < MAX_MASTERSERVERS; i++)	
+		for(i = 0; i < MAX_MASTERSERVERS; i++)
+		{
 			m_pEngine->HostLookup(&m_aMasterServers[i].m_Lookup, m_aMasterServers[i].m_aHostname);
+			m_aMasterServers[i].m_Valid = false;
+		}
 		
 		m_NeedsUpdate = 1;
 		return 0;
@@ -64,8 +68,14 @@ public:
 				m_NeedsUpdate = 1;
 			else
 			{
-				m_aMasterServers[i].m_Addr = m_aMasterServers[i].m_Lookup.m_Addr;
-				m_aMasterServers[i].m_Addr.port = 8300;
+				if(m_aMasterServers[i].m_Lookup.m_Job.Result() == 0)
+				{
+					m_aMasterServers[i].m_Addr = m_aMasterServers[i].m_Lookup.m_Addr;
+					m_aMasterServers[i].m_Addr.port = 8300;
+					m_aMasterServers[i].m_Valid = true;
+				}
+				else
+					m_aMasterServers[i].m_Valid = false;
 			}
 		}
 		
@@ -91,13 +101,18 @@ public:
 		return m_aMasterServers[Index].m_aHostname;
 	}
 
+	virtual bool IsValid(int Index)
+	{
+		return m_aMasterServers[Index].m_Valid;
+	}
+
 	virtual void DumpServers()
 	{
 		for(int i = 0; i < MAX_MASTERSERVERS; i++)
 		{
-			dbg_msg("mastersrv", "#%d = %d.%d.%d.%d", i,
-				m_aMasterServers[i].m_Addr.ip[0], m_aMasterServers[i].m_Addr.ip[1],
-				m_aMasterServers[i].m_Addr.ip[2], m_aMasterServers[i].m_Addr.ip[3]);
+			char aAddrStr[NETADDR_MAXSTRSIZE];
+			net_addr_str(&m_aMasterServers[i].m_Addr, aAddrStr, sizeof(aAddrStr));
+			dbg_msg("mastersrv", "#%d = %s", i, aAddrStr);
 		}
 	}
 
@@ -136,13 +151,10 @@ public:
 			if(!pLine)
 				break;
 
-			// parse line	
-			if(sscanf(pLine, "%s %d.%d.%d.%d", Info.m_aHostname, &aIp[0], &aIp[1], &aIp[2], &aIp[3]) == 5)
+			// parse line
+			char aAddrStr[NETADDR_MAXSTRSIZE];
+			if(sscanf(pLine, "%s %s", Info.m_aHostname, aAddrStr) == 2 && net_addr_from_str(&Info.m_Addr, aAddrStr) == 0)
 			{
-				Info.m_Addr.ip[0] = (unsigned char)aIp[0];
-				Info.m_Addr.ip[1] = (unsigned char)aIp[1];
-				Info.m_Addr.ip[2] = (unsigned char)aIp[2];
-				Info.m_Addr.ip[3] = (unsigned char)aIp[3];
 				Info.m_Addr.port = 8300;
 				if(Count != MAX_MASTERSERVERS)
 				{
@@ -174,10 +186,10 @@ public:
 
 		for(int i = 0; i < MAX_MASTERSERVERS; i++)
 		{
+			char aAddrStr[NETADDR_MAXSTRSIZE];
+			net_addr_str(&m_aMasterServers[i].m_Addr, aAddrStr, sizeof(aAddrStr));
 			char aBuf[1024];
-			str_format(aBuf, sizeof(aBuf), "%s %d.%d.%d.%d\n", m_aMasterServers[i].m_aHostname,
-				m_aMasterServers[i].m_Addr.ip[0], m_aMasterServers[i].m_Addr.ip[1],
-				m_aMasterServers[i].m_Addr.ip[2], m_aMasterServers[i].m_Addr.ip[3]);
+			str_format(aBuf, sizeof(aBuf), "%s %s\n", m_aMasterServers[i].m_aHostname, aAddrStr);
 				
 			io_write(File, aBuf, str_length(aBuf));
 		}
diff --git a/src/engine/shared/network_server.cpp b/src/engine/shared/network_server.cpp
index 88aac789..76d5f695 100644
--- a/src/engine/shared/network_server.cpp
+++ b/src/engine/shared/network_server.cpp
@@ -117,9 +117,13 @@ int CNetServer::BanNum()
 
 void CNetServer::BanRemoveByObject(CBan *pBan)
 {
-	int IpHash = (pBan->m_Info.m_Addr.ip[0]+pBan->m_Info.m_Addr.ip[1]+pBan->m_Info.m_Addr.ip[2]+pBan->m_Info.m_Addr.ip[3])&0xff;
-	dbg_msg("netserver", "removing ban on %d.%d.%d.%d",
-		pBan->m_Info.m_Addr.ip[0], pBan->m_Info.m_Addr.ip[1], pBan->m_Info.m_Addr.ip[2], pBan->m_Info.m_Addr.ip[3]);
+	int IpHash = (pBan->m_Info.m_Addr.ip[0]+pBan->m_Info.m_Addr.ip[1]+pBan->m_Info.m_Addr.ip[2]+pBan->m_Info.m_Addr.ip[3]+
+					pBan->m_Info.m_Addr.ip[4]+pBan->m_Info.m_Addr.ip[5]+pBan->m_Info.m_Addr.ip[6]+pBan->m_Info.m_Addr.ip[7]+
+					pBan->m_Info.m_Addr.ip[8]+pBan->m_Info.m_Addr.ip[9]+pBan->m_Info.m_Addr.ip[10]+pBan->m_Info.m_Addr.ip[11]+
+					pBan->m_Info.m_Addr.ip[12]+pBan->m_Info.m_Addr.ip[13]+pBan->m_Info.m_Addr.ip[14]+pBan->m_Info.m_Addr.ip[15])&0xff;
+	char aAddrStr[NETADDR_MAXSTRSIZE];
+	net_addr_str(&pBan->m_Info.m_Addr, aAddrStr, sizeof(aAddrStr));
+	dbg_msg("netserver", "removing ban on %s", aAddrStr);
 	MACRO_LIST_UNLINK(pBan, m_BanPool_FirstUsed, m_pPrev, m_pNext);
 	MACRO_LIST_UNLINK(pBan, m_aBans[IpHash], m_pHashPrev, m_pHashNext);
 	MACRO_LIST_LINK_FIRST(pBan, m_BanPool_FirstFree, m_pPrev, m_pNext);
@@ -127,7 +131,8 @@ void CNetServer::BanRemoveByObject(CBan *pBan)
 
 int CNetServer::BanRemove(NETADDR Addr)
 {
-	int IpHash = (Addr.ip[0]+Addr.ip[1]+Addr.ip[2]+Addr.ip[3])&0xff;
+	int IpHash = (Addr.ip[0]+Addr.ip[1]+Addr.ip[2]+Addr.ip[3]+Addr.ip[4]+Addr.ip[5]+Addr.ip[6]+Addr.ip[7]+
+					Addr.ip[8]+Addr.ip[9]+Addr.ip[10]+Addr.ip[11]+Addr.ip[12]+Addr.ip[13]+Addr.ip[14]+Addr.ip[15])&0xff;
 	CBan *pBan = m_aBans[IpHash];
 	
 	MACRO_LIST_FIND(pBan, m_pHashNext, net_addr_comp(&pBan->m_Info.m_Addr, &Addr) == 0);
@@ -143,7 +148,8 @@ int CNetServer::BanRemove(NETADDR Addr)
 
 int CNetServer::BanAdd(NETADDR Addr, int Seconds, const char *pReason)
 {
-	int IpHash = (Addr.ip[0]+Addr.ip[1]+Addr.ip[2]+Addr.ip[3])&0xff;
+	int IpHash = (Addr.ip[0]+Addr.ip[1]+Addr.ip[2]+Addr.ip[3]+Addr.ip[4]+Addr.ip[5]+Addr.ip[6]+Addr.ip[7]+
+					Addr.ip[8]+Addr.ip[9]+Addr.ip[10]+Addr.ip[11]+Addr.ip[12]+Addr.ip[13]+Addr.ip[14]+Addr.ip[15])&0xff;
 	int Stamp = -1;
 	CBan *pBan;
 	
@@ -284,7 +290,8 @@ int CNetServer::Recv(CNetChunk *pChunk)
 		{
 			CBan *pBan = 0;
 			NETADDR BanAddr = Addr;
-			int IpHash = (BanAddr.ip[0]+BanAddr.ip[1]+BanAddr.ip[2]+BanAddr.ip[3])&0xff;
+			int IpHash = (BanAddr.ip[0]+BanAddr.ip[1]+BanAddr.ip[2]+BanAddr.ip[3]+BanAddr.ip[4]+BanAddr.ip[5]+BanAddr.ip[6]+BanAddr.ip[7]+
+							BanAddr.ip[8]+BanAddr.ip[9]+BanAddr.ip[10]+BanAddr.ip[11]+BanAddr.ip[12]+BanAddr.ip[13]+BanAddr.ip[14]+BanAddr.ip[15])&0xff;
 			int Found = 0;
 			BanAddr.port = 0;