about summary refs log tree commit diff
diff options
context:
space:
mode:
authorm!nus <m1nus@online.de>2011-04-02 01:56:16 +0200
committeroy <Tom_Adams@web.de>2011-04-02 17:35:50 +0200
commit3ebdc2a4ceb87c0787e9e5f31985879e4bd9a7f1 (patch)
treea17a7a71b4f1d5177ac7c9302f9e6c04f7da5589
parent4adad07ad807d09b5f0fa94ec47d3cb9108e86c0 (diff)
downloadzcatch-3ebdc2a4ceb87c0787e9e5f31985879e4bd9a7f1.tar.gz
zcatch-3ebdc2a4ceb87c0787e9e5f31985879e4bd9a7f1.zip
added downward compatibility to mastersrv for 0.5 (and earlier)
-rw-r--r--src/engine/shared/network.h7
-rw-r--r--src/mastersrv/mastersrv.cpp150
-rw-r--r--src/mastersrv/mastersrv.h17
3 files changed, 129 insertions, 45 deletions
diff --git a/src/engine/shared/network.h b/src/engine/shared/network.h
index 0fc3f0a8..cb1ec33a 100644
--- a/src/engine/shared/network.h
+++ b/src/engine/shared/network.h
@@ -44,9 +44,8 @@ enum
 {
 	NET_VERSION = 2,
 
-	NET_MAX_CHUNKSIZE = 1024,
-	NET_MAX_PAYLOAD = NET_MAX_CHUNKSIZE+16,
-	NET_MAX_PACKETSIZE = NET_MAX_PAYLOAD+16,
+	NET_MAX_PACKETSIZE = 1400,
+	NET_MAX_PAYLOAD = NET_MAX_PACKETSIZE-6,
 	NET_MAX_CHUNKHEADERSIZE = 5,
 	NET_PACKETHEADERSIZE = 3,
 	NET_MAX_CLIENTS = 16,
@@ -75,7 +74,7 @@ enum
 	
 	NET_SERVER_MAXBANS=1024,
 	
-	NET_CONN_BUFFERSIZE=1024*16,
+	NET_CONN_BUFFERSIZE=1024*32,
 	
 	NET_ENUM_TERMINATOR
 };
diff --git a/src/mastersrv/mastersrv.cpp b/src/mastersrv/mastersrv.cpp
index c63ff03e..084866cd 100644
--- a/src/mastersrv/mastersrv.cpp
+++ b/src/mastersrv/mastersrv.cpp
@@ -11,7 +11,7 @@
 
 enum {
 	MTU = 1400,
-	MAX_SERVERS_PER_PACKET=40,
+	MAX_SERVERS_PER_PACKET=60,
 	MAX_PACKETS=16,
 	MAX_SERVERS=MAX_SERVERS_PER_PACKET*MAX_PACKETS,
 	MAX_BANS=128,
@@ -20,6 +20,7 @@ enum {
 
 struct CCheckServer
 {
+	bool m_Legacy;
 	NETADDR m_Address;
 	NETADDR m_AltAddress;
 	int m_TryCount;
@@ -31,6 +32,7 @@ static int m_NumCheckServers = 0;
 
 struct CServerEntry
 {
+	bool m_Legacy;
 	NETADDR m_Address;
 	int64 m_Expire;
 };
@@ -50,6 +52,20 @@ struct CPacketData
 CPacketData m_aPackets[MAX_PACKETS];
 static int m_NumPackets = 0;
 
+// legacy code
+struct CPacketDataLegacy
+{
+	int m_Size;
+	struct {
+		unsigned char m_aHeader[sizeof(SERVERBROWSE_LIST_LEGACY)];
+		CMastersrvAddrLegacy m_aServers[MAX_SERVERS_PER_PACKET];
+	} m_Data;
+};
+
+CPacketDataLegacy m_aPacketsLegacy[MAX_PACKETS];
+static int m_NumPacketsLegacy = 0;
+
+
 struct CCountPacketData
 {
 	unsigned char m_Header[sizeof(SERVERBROWSE_COUNT)];
@@ -58,6 +74,7 @@ struct CCountPacketData
 };
 
 static CCountPacketData m_CountData;
+static CCountPacketData m_CountDataLegacy;
 
 
 struct CBanEntry
@@ -79,35 +96,63 @@ void BuildPackets()
 	CServerEntry *pCurrent = &m_aServers[0];
 	int ServersLeft = m_NumServers;
 	m_NumPackets = 0;
-	while(ServersLeft && m_NumPackets < MAX_PACKETS)
+	m_NumPacketsLegacy = 0;
+	int PacketIndex = 0;
+	int PacketIndexLegacy = 0;
+	while(ServersLeft-- && (m_NumPackets + m_NumPacketsLegacy) < MAX_PACKETS)
 	{
-		int Chunk = ServersLeft;
-		if(Chunk > MAX_SERVERS_PER_PACKET)
-			Chunk = MAX_SERVERS_PER_PACKET;
-		ServersLeft -= Chunk;
-		
-		// copy header	
-		mem_copy(m_aPackets[m_NumPackets].m_Data.m_aHeader, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST));
-		
-		// copy server addresses
-		for(int i = 0; i < Chunk; i++)
+		if(!pCurrent->m_Legacy)
 		{
-			m_aPackets[m_NumPackets].m_Data.m_aServers[i].m_aType[0] = (pCurrent->m_Address.type>>24)&0xff;
-			m_aPackets[m_NumPackets].m_Data.m_aServers[i].m_aType[1] = (pCurrent->m_Address.type>>16)&0xff;
-			m_aPackets[m_NumPackets].m_Data.m_aServers[i].m_aType[2] = (pCurrent->m_Address.type>>8)&0xff;
-			m_aPackets[m_NumPackets].m_Data.m_aServers[i].m_aType[3] = pCurrent->m_Address.type&0xff;
-			mem_copy(m_aPackets[m_NumPackets].m_Data.m_aServers[i].m_aIp, pCurrent->m_Address.ip,
-				sizeof(m_aPackets[m_NumPackets].m_Data.m_aServers[i].m_aIp));
-			m_aPackets[m_NumPackets].m_Data.m_aServers[i].m_aPort[0] = (pCurrent->m_Address.port>>8)&0xff;
-			m_aPackets[m_NumPackets].m_Data.m_aServers[i].m_aPort[1] = pCurrent->m_Address.port&0xff;
-
-			pCurrent++;
+			if(PacketIndex == MAX_SERVERS_PER_PACKET)
+			{
+				PacketIndex = 0;
+				m_NumPackets++;
+			}
+
+			// copy header	
+			mem_copy(m_aPackets[m_NumPackets].m_Data.m_aHeader, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST));
+
+			// copy server addresses
+			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aType[0] = (pCurrent->m_Address.type>>24)&0xff;
+			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aType[1] = (pCurrent->m_Address.type>>16)&0xff;
+			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aType[2] = (pCurrent->m_Address.type>>8)&0xff;
+			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aType[3] = pCurrent->m_Address.type&0xff;
+			mem_copy(m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aIp, pCurrent->m_Address.ip,
+				sizeof(m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aIp));
+			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aPort[0] = (pCurrent->m_Address.port>>8)&0xff;
+			m_aPackets[m_NumPackets].m_Data.m_aServers[PacketIndex].m_aPort[1] = pCurrent->m_Address.port&0xff;
+
+			PacketIndex++;
+
+			m_aPackets[m_NumPackets].m_Size = sizeof(SERVERBROWSE_LIST) + sizeof(CMastersrvAddr)*PacketIndex;
 		}
-		
-		m_aPackets[m_NumPackets].m_Size = sizeof(SERVERBROWSE_LIST) + sizeof(NETADDR)*Chunk;
-		
-		m_NumPackets++;
+		else // legacy code
+		{
+			if(PacketIndexLegacy == MAX_SERVERS_PER_PACKET)
+			{
+				PacketIndexLegacy = 0;
+				m_NumPacketsLegacy++;
+			}
+
+			// copy header	
+			mem_copy(m_aPacketsLegacy[m_NumPackets].m_Data.m_aHeader, SERVERBROWSE_LIST_LEGACY, sizeof(SERVERBROWSE_LIST_LEGACY));
+			
+			// copy server addresses
+			mem_copy(m_aPacketsLegacy[m_NumPacketsLegacy].m_Data.m_aServers[PacketIndexLegacy].m_aIp, pCurrent->m_Address.ip,
+				sizeof(m_aPacketsLegacy[m_NumPacketsLegacy].m_Data.m_aServers[PacketIndexLegacy].m_aIp));
+			// 0.5 has the port in little endian on the network
+			m_aPacketsLegacy[m_NumPacketsLegacy].m_Data.m_aServers[PacketIndexLegacy].m_aPort[0] = pCurrent->m_Address.port&0xff;
+			m_aPacketsLegacy[m_NumPacketsLegacy].m_Data.m_aServers[PacketIndexLegacy].m_aPort[1] = (pCurrent->m_Address.port>>8)&0xff;
+
+			PacketIndexLegacy++;
+
+			m_aPacketsLegacy[m_NumPacketsLegacy].m_Size = sizeof(SERVERBROWSE_LIST_LEGACY) + sizeof(CMastersrvAddrLegacy)*PacketIndexLegacy;
+		}
+
+		pCurrent++;
 	}
+	m_NumPackets++;
+	m_NumPacketsLegacy++;
 }
 
 void SendOk(NETADDR *pAddr)
@@ -146,7 +191,7 @@ void SendCheck(NETADDR *pAddr)
 	m_NetChecker.Send(&p);
 }
 
-void AddCheckserver(NETADDR *pInfo, NETADDR *pAlt)
+void AddCheckserver(NETADDR *pInfo, NETADDR *pAlt, bool Legacy)
 {
 	// add server
 	if(m_NumCheckServers == MAX_SERVERS)
@@ -164,10 +209,11 @@ void AddCheckserver(NETADDR *pInfo, NETADDR *pAlt)
 	m_aCheckServers[m_NumCheckServers].m_AltAddress = *pAlt;
 	m_aCheckServers[m_NumCheckServers].m_TryCount = 0;
 	m_aCheckServers[m_NumCheckServers].m_TryTime = 0;
+	m_aCheckServers[m_NumCheckServers].m_Legacy = Legacy;
 	m_NumCheckServers++;
 }
 
-void AddServer(NETADDR *pInfo)
+void AddServer(NETADDR *pInfo, bool Legacy)
 {
 	// see if server already exists in list
 	for(int i = 0; i < m_NumServers; i++)
@@ -194,6 +240,7 @@ void AddServer(NETADDR *pInfo)
 	dbg_msg("mastersrv", "added: %s", aAddrStr);
 	m_aServers[m_NumServers].m_Address = *pInfo;
 	m_aServers[m_NumServers].m_Expire = time_get()+time_freq()*EXPIRE_TIME;
+	m_aServers[m_NumServers].m_Legacy = Legacy;
 	m_NumServers++;
 }
 
@@ -305,6 +352,7 @@ void ReloadBans()
 int main(int argc, const char **argv) // ignore_convention
 {
 	int64 LastBuild = 0, LastBanReload = 0;
+	bool Legacy = false;
 	NETADDR BindAddr;
 
 	dbg_logger_stdout();
@@ -328,6 +376,7 @@ int main(int argc, const char **argv) // ignore_convention
 	}
 	
 	mem_copy(m_CountData.m_Header, SERVERBROWSE_COUNT, sizeof(SERVERBROWSE_COUNT));
+	mem_copy(m_CountDataLegacy.m_Header, SERVERBROWSE_COUNT_LEGACY, sizeof(SERVERBROWSE_COUNT_LEGACY));
 
 	IKernel *pKernel = IKernel::Create();
 	IStorage *pStorage = CreateStorage("Teeworlds", argc, argv);
@@ -355,9 +404,12 @@ int main(int argc, const char **argv) // ignore_convention
 			// check if the server is banned
 			if(CheckBan(Packet.m_Address)) continue;
 
-			if(Packet.m_DataSize == sizeof(SERVERBROWSE_HEARTBEAT)+2 &&
-				mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT)) == 0)
+			if((Packet.m_DataSize == sizeof(SERVERBROWSE_HEARTBEAT)+2 &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT, sizeof(SERVERBROWSE_HEARTBEAT)) == 0) ||
+				(Packet.m_DataSize == sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)+2 &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT_LEGACY, sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)) == 0))
 			{
+				Legacy = (mem_comp(Packet.m_pData, SERVERBROWSE_HEARTBEAT_LEGACY, sizeof(SERVERBROWSE_HEARTBEAT_LEGACY)) == 0);
 				NETADDR Alt;
 				unsigned char *d = (unsigned char *)Packet.m_pData;
 				Alt = Packet.m_Address;
@@ -366,28 +418,43 @@ int main(int argc, const char **argv) // ignore_convention
 					d[sizeof(SERVERBROWSE_HEARTBEAT)+1];
 				
 				// add it
-				AddCheckserver(&Packet.m_Address, &Alt);
+				AddCheckserver(&Packet.m_Address, &Alt, Legacy);
 			}
-			else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETCOUNT) &&
-				mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT, sizeof(SERVERBROWSE_GETCOUNT)) == 0)
+			else if((Packet.m_DataSize == sizeof(SERVERBROWSE_GETCOUNT) &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT, sizeof(SERVERBROWSE_GETCOUNT)) == 0) ||
+				(Packet.m_DataSize == sizeof(SERVERBROWSE_GETCOUNT_LEGACY) &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT_LEGACY, sizeof(SERVERBROWSE_GETCOUNT_LEGACY)) == 0))
 			{
 				dbg_msg("mastersrv", "count requested, responding with %d", m_NumServers);
 				
+				Legacy = (mem_comp(Packet.m_pData, SERVERBROWSE_GETCOUNT_LEGACY, sizeof(SERVERBROWSE_GETCOUNT_LEGACY)) == 0);
 				CNetChunk p;
 				p.m_ClientID = -1;
 				p.m_Address = Packet.m_Address;
 				p.m_Flags = NETSENDFLAG_CONNLESS;
 				p.m_DataSize = sizeof(m_CountData);
-				p.m_pData = &m_CountData;
-				m_CountData.m_High = (m_NumServers>>8)&0xff;
-				m_CountData.m_Low = m_NumServers&0xff;
+				p.m_pData = Legacy?&m_CountDataLegacy:&m_CountData;
+				if(Legacy)
+				{
+					m_CountDataLegacy.m_High = (m_NumServers>>8)&0xff;
+					m_CountDataLegacy.m_Low = m_NumServers&0xff;
+				}
+				else
+				{
+					m_CountData.m_High = (m_NumServers>>8)&0xff;
+					m_CountData.m_Low = m_NumServers&0xff;
+				}
 				m_NetOp.Send(&p);
 			}
-			else if(Packet.m_DataSize == sizeof(SERVERBROWSE_GETLIST) &&
-				mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST, sizeof(SERVERBROWSE_GETLIST)) == 0)
+			else if((Packet.m_DataSize == sizeof(SERVERBROWSE_GETLIST) &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST, sizeof(SERVERBROWSE_GETLIST)) == 0) ||
+				(Packet.m_DataSize == sizeof(SERVERBROWSE_GETLIST_LEGACY) &&
+				mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST_LEGACY, sizeof(SERVERBROWSE_GETLIST_LEGACY)) == 0))
 			{
 				// someone requested the list
 				dbg_msg("mastersrv", "requested, responding with %d m_aServers", m_NumServers);
+				
+				Legacy = (mem_comp(Packet.m_pData, SERVERBROWSE_GETLIST_LEGACY, sizeof(SERVERBROWSE_GETLIST_LEGACY)) == 0);
 				CNetChunk p;
 				p.m_ClientID = -1;
 				p.m_Address = Packet.m_Address;
@@ -395,8 +462,8 @@ int main(int argc, const char **argv) // ignore_convention
 				
 				for(int i = 0; i < m_NumPackets; i++)
 				{
-					p.m_DataSize = m_aPackets[i].m_Size;
-					p.m_pData = &m_aPackets[i].m_Data;
+					p.m_DataSize = Legacy?m_aPacketsLegacy[i].m_Size:m_aPackets[i].m_Size;
+					p.m_pData = Legacy?((void*)&m_aPacketsLegacy[i].m_Data):((void*)&m_aPackets[i].m_Data);
 					m_NetOp.Send(&p);
 				}
 			}
@@ -417,13 +484,14 @@ int main(int argc, const char **argv) // ignore_convention
 					if(net_addr_comp(&m_aCheckServers[i].m_Address, &Packet.m_Address) == 0 ||
 						net_addr_comp(&m_aCheckServers[i].m_AltAddress, &Packet.m_Address) == 0)
 					{
+						Legacy = m_aCheckServers[i].m_Legacy;
 						m_NumCheckServers--;
 						m_aCheckServers[i] = m_aCheckServers[m_NumCheckServers];
 						break;
 					}
 				}
 				
-				AddServer(&Packet.m_Address);
+				AddServer(&Packet.m_Address, Legacy);
 				SendOk(&Packet.m_Address);
 			}
 		}
diff --git a/src/mastersrv/mastersrv.h b/src/mastersrv/mastersrv.h
index bbe2e8fb..48870819 100644
--- a/src/mastersrv/mastersrv.h
+++ b/src/mastersrv/mastersrv.h
@@ -26,4 +26,21 @@ static const unsigned char SERVERBROWSE_FWCHECK[] = {255, 255, 255, 255, 'f', 'w
 static const unsigned char SERVERBROWSE_FWRESPONSE[] = {255, 255, 255, 255, 'f', 'w', '!', '!'};
 static const unsigned char SERVERBROWSE_FWOK[] = {255, 255, 255, 255, 'f', 'w', 'o', 'k'};
 static const unsigned char SERVERBROWSE_FWERROR[] = {255, 255, 255, 255, 'f', 'w', 'e', 'r'};
+
+
+// packet headers for the 0.5 branch
+
+struct CMastersrvAddrLegacy
+{
+	unsigned char m_aIp[4];
+	unsigned char m_aPort[2];
+};
+
+static const unsigned char SERVERBROWSE_HEARTBEAT_LEGACY[] = {255, 255, 255, 255, 'b', 'e', 'a', 't'};
+
+static const unsigned char SERVERBROWSE_GETLIST_LEGACY[] = {255, 255, 255, 255, 'r', 'e', 'q', 't'};
+static const unsigned char SERVERBROWSE_LIST_LEGACY[] = {255, 255, 255, 255, 'l', 'i', 's', 't'};
+
+static const unsigned char SERVERBROWSE_GETCOUNT_LEGACY[] = {255, 255, 255, 255, 'c', 'o', 'u', 'n'};
+static const unsigned char SERVERBROWSE_COUNT_LEGACY[] = {255, 255, 255, 255, 's', 'i', 'z', 'e'};
 #endif