about summary refs log tree commit diff
diff options
context:
space:
mode:
authoroy <Tom_Adams@web.de>2011-04-08 23:56:15 +0200
committeroy <Tom_Adams@web.de>2011-04-08 23:56:15 +0200
commitb6118ae9fed672c3f06524f7a15f1025790baaf8 (patch)
tree6f185ea2b0ab1177acdae5ffd0b314c2461287ec
parent9643fc36ae69c15ee8c9a9634e8aa663f112f9e6 (diff)
downloadzcatch-b6118ae9fed672c3f06524f7a15f1025790baaf8.tar.gz
zcatch-b6118ae9fed672c3f06524f7a15f1025790baaf8.zip
mapped IPv4 addresses within master servers server list to IPv6 to decrease the size of an entry and increased the servers per packet
-rw-r--r--src/engine/client/client.cpp18
-rw-r--r--src/mastersrv/mastersrv.cpp24
-rw-r--r--src/mastersrv/mastersrv.h1
3 files changed, 33 insertions, 10 deletions
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp
index 536d8231..5cce547e 100644
--- a/src/engine/client/client.cpp
+++ b/src/engine/client/client.cpp
@@ -1096,9 +1096,23 @@ void CClient::ProcessConnlessPacket(CNetChunk *pPacket)
 		{
 			NETADDR Addr;
 
+			static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF };
+
 			// copy address
-			Addr.type = (pAddrs[i].m_aType[0]<<24) | (pAddrs[i].m_aType[1]<<16) | (pAddrs[i].m_aType[2]<<8) | pAddrs[i].m_aType[3];
-			mem_copy(Addr.ip, pAddrs[i].m_aIp, sizeof(Addr.ip));
+			if(!mem_comp(IPV4Mapping, pAddrs[i].m_aIp, sizeof(IPV4Mapping)))
+			{
+				mem_zero(&Addr, sizeof(Addr));
+				Addr.type = NETTYPE_IPV4;
+				Addr.ip[0] = pAddrs[i].m_aIp[12];
+				Addr.ip[1] = pAddrs[i].m_aIp[13];
+				Addr.ip[2] = pAddrs[i].m_aIp[14];
+				Addr.ip[3] = pAddrs[i].m_aIp[15];
+			}
+			else
+			{
+				Addr.type = NETTYPE_IPV6;
+				mem_copy(Addr.ip, pAddrs[i].m_aIp, sizeof(Addr.ip));
+			}
 			Addr.port = (pAddrs[i].m_aPort[0]<<8) | pAddrs[i].m_aPort[1];
 			
 			m_ServerBrowser.Set(Addr, IServerBrowser::SET_MASTER_ADD, -1, 0x0);
diff --git a/src/mastersrv/mastersrv.cpp b/src/mastersrv/mastersrv.cpp
index 2100e4db..a3da8cd0 100644
--- a/src/mastersrv/mastersrv.cpp
+++ b/src/mastersrv/mastersrv.cpp
@@ -11,7 +11,7 @@
 
 enum {
 	MTU = 1400,
-	MAX_SERVERS_PER_PACKET=60,
+	MAX_SERVERS_PER_PACKET=77,
 	MAX_PACKETS=16,
 	MAX_SERVERS=MAX_SERVERS_PER_PACKET*MAX_PACKETS,
 	MAX_BANS=128,
@@ -113,12 +113,22 @@ void BuildPackets()
 			mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aHeader, SERVERBROWSE_LIST, sizeof(SERVERBROWSE_LIST));
 
 			// copy server addresses
-			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aType[0] = (pCurrent->m_Address.type>>24)&0xff;
-			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aType[1] = (pCurrent->m_Address.type>>16)&0xff;
-			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aType[2] = (pCurrent->m_Address.type>>8)&0xff;
-			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aType[3] = pCurrent->m_Address.type&0xff;
-			mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp, pCurrent->m_Address.ip,
-				sizeof(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp));
+			if(pCurrent->m_Address.type == NETTYPE_IPV6)
+			{
+				mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp, pCurrent->m_Address.ip,
+					sizeof(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp));
+			}
+			else
+			{
+				static char IPV4Mapping[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF };
+
+				mem_copy(m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp, IPV4Mapping, sizeof(IPV4Mapping));
+				m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[12] = pCurrent->m_Address.ip[0];
+				m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[13] = pCurrent->m_Address.ip[1];
+				m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[14] = pCurrent->m_Address.ip[2];
+				m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aIp[15] = pCurrent->m_Address.ip[3];
+			}
+
 			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aPort[0] = (pCurrent->m_Address.port>>8)&0xff;
 			m_aPackets[m_NumPackets-1].m_Data.m_aServers[PacketIndex].m_aPort[1] = pCurrent->m_Address.port&0xff;
 
diff --git a/src/mastersrv/mastersrv.h b/src/mastersrv/mastersrv.h
index 63a998e3..38e5ab27 100644
--- a/src/mastersrv/mastersrv.h
+++ b/src/mastersrv/mastersrv.h
@@ -13,7 +13,6 @@ enum ServerType
 
 struct CMastersrvAddr
 {
-	unsigned char m_aType[4];
 	unsigned char m_aIp[16];
 	unsigned char m_aPort[2];
 };