diff options
| author | oy <Tom_Adams@web.de> | 2011-03-30 12:08:33 +0200 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2011-03-30 12:08:33 +0200 |
| commit | 59d56cd332ecc86008c27326631566a4d2d94ecb (patch) | |
| tree | 9e207d901bd93c86e9e98260479a57a9fef85faa /src/engine | |
| parent | 693bd39e77ee91ec335d8e30350b57edca8056fd (diff) | |
| download | zcatch-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.cpp | 35 | ||||
| -rw-r--r-- | src/engine/client/serverbrowser.cpp | 27 | ||||
| -rw-r--r-- | src/engine/masterserver.h | 1 | ||||
| -rw-r--r-- | src/engine/server/register.cpp | 20 | ||||
| -rw-r--r-- | src/engine/shared/engine.cpp | 3 | ||||
| -rw-r--r-- | src/engine/shared/jobs.h | 1 | ||||
| -rw-r--r-- | src/engine/shared/masterserver.cpp | 42 | ||||
| -rw-r--r-- | src/engine/shared/network_server.cpp | 19 |
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; |