X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=net_dgrm.c;h=b3f7fae2c4d67a41bc63a311506051ef0e4ab17a;hb=038ff8d79bb5044145cc2f87a8df1ce732209e4d;hp=fe34fba0d94bc64e1fcce33877da354387a80575;hpb=fb5638603d5fb14033bb41a99dbaba135b5e7985;p=xonotic%2Fdarkplaces.git diff --git a/net_dgrm.c b/net_dgrm.c index fe34fba0..b3f7fae2 100644 --- a/net_dgrm.c +++ b/net_dgrm.c @@ -136,7 +136,7 @@ void NET_Ban_f (void) break; case 2: - if (Q_strcasecmp(Cmd_Argv(1), "off") == 0) + if (strcasecmp(Cmd_Argv(1), "off") == 0) banAddr = 0x00000000; else banAddr = inet_addr(Cmd_Argv(1)); @@ -330,7 +330,7 @@ int Datagram_GetMessage (qsocket_t *sock) if (length == 0) break; - if (length == -1) + if ((int)length == -1) { Con_Printf("Read error\n"); return -1; @@ -338,11 +338,9 @@ int Datagram_GetMessage (qsocket_t *sock) if (sfunc.AddrCompare(&readaddr, &sock->addr) != 0) { -#ifdef DEBUG Con_DPrintf("Forged packet received\n"); Con_DPrintf("Expected: %s\n", StrAddr (&sock->addr)); Con_DPrintf("Received: %s\n", StrAddr (&readaddr)); -#endif continue; } @@ -491,7 +489,7 @@ void NET_Stats_f (void) else { for (s = net_activeSockets; s; s = s->next) - if (Q_strcasecmp(Cmd_Argv(1), s->address) == 0) + if (strcasecmp(Cmd_Argv(1), s->address) == 0) break; if (s == NULL) return; @@ -526,7 +524,7 @@ static void Test_Poll(void) while (1) { len = dfunc.Read (testSocket, net_message.data, net_message.maxsize, &clientaddr); - if (len < sizeof(int)) + if (len < (int)sizeof(int)) break; net_message.cursize = len; @@ -536,7 +534,7 @@ static void Test_Poll(void) MSG_ReadLong(); if (control == -1) break; - if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL) + if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL) break; if ((control & NETFLAG_LENGTH_MASK) != len) break; @@ -581,7 +579,7 @@ static void Test_f (void) if (host && hostCacheCount) { for (n = 0; n < hostCacheCount; n++) - if (Q_strcasecmp (host, hostcache[n].name) == 0) + if (strcasecmp (host, hostcache[n].name) == 0) { if (hostcache[n].driver != myDriverLevel) continue; @@ -650,7 +648,7 @@ static void Test2_Poll(void) name[0] = 0; len = dfunc.Read (test2Socket, net_message.data, net_message.maxsize, &clientaddr); - if (len < sizeof(int)) + if (len < (int)sizeof(int)) goto Reschedule; net_message.cursize = len; @@ -660,7 +658,7 @@ static void Test2_Poll(void) MSG_ReadLong(); if (control == -1) goto Error; - if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL) + if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL) goto Error; if ((control & NETFLAG_LENGTH_MASK) != len) goto Error; @@ -711,7 +709,7 @@ static void Test2_f (void) if (host && hostCacheCount) { for (n = 0; n < hostCacheCount; n++) - if (Q_strcasecmp (host, hostcache[n].name) == 0) + if (strcasecmp (host, hostcache[n].name) == 0) { if (hostcache[n].driver != myDriverLevel) continue; @@ -841,16 +839,16 @@ static qsocket_t *_Datagram_CheckNewConnections (void) SZ_Clear(&net_message); len = dfunc.Read (acceptsock, net_message.data, net_message.maxsize, &clientaddr); - if (len < sizeof(int)) + if (len < (int)sizeof(int)) return NULL; net_message.cursize = len; MSG_BeginReading (); control = BigLong(*((int *)net_message.data)); MSG_ReadLong(); - + // Messages starting by 0xFFFFFFFF are master server messages - if (control == 0xFFFFFFFF) + if ((unsigned int)control == 0xFFFFFFFF) { int responsesize = Master_HandleMessage(); if (responsesize > 0) @@ -860,7 +858,7 @@ static qsocket_t *_Datagram_CheckNewConnections (void) } return NULL; } - if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL) + if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL) return NULL; if ((control & NETFLAG_LENGTH_MASK) != len) return NULL; @@ -1004,7 +1002,7 @@ static qsocket_t *_Datagram_CheckNewConnections (void) ret = dfunc.AddrCompare(&clientaddr, &s->addr); if (ret >= 0) { - // is this a duplicate connection reqeust? + // is this a duplicate connection request? if (ret == 0 && net_time - s->connecttime < 2.0) { // yes, so send a duplicate reply @@ -1015,6 +1013,13 @@ static qsocket_t *_Datagram_CheckNewConnections (void) dfunc.GetSocketAddr(s->socket, &newaddr); MSG_WriteLong(&net_message, dfunc.GetSocketPort(&newaddr)); *((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); + // LordHavoc: send from s->socket instead of acceptsock, this + // way routers usually identify the connection correctly + // (thanks to faded for provoking me to recite a lengthy + // explanation of NAT nightmares, and realize this easy + // workaround for quake) + dfunc.Write (s->socket, net_message.data, net_message.cursize, &clientaddr); + // LordHavoc: also send from acceptsock, for good measure dfunc.Write (acceptsock, net_message.data, net_message.cursize, &clientaddr); SZ_Clear(&net_message); return NULL; @@ -1072,6 +1077,12 @@ static qsocket_t *_Datagram_CheckNewConnections (void) dfunc.GetSocketAddr(newsock, &newaddr); MSG_WriteLong(&net_message, dfunc.GetSocketPort(&newaddr)); *((int *)net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); + // LordHavoc: send from sock->socket instead of acceptsock, this way routers + // usually identify the connection correctly (thanks to faded for provoking + // me to recite a lengthy explanation of NAT nightmares, and realize this + // easy workaround for quake) + dfunc.Write (sock->socket, net_message.data, net_message.cursize, &clientaddr); + // LordHavoc: also send from acceptsock, for good measure dfunc.Write (acceptsock, net_message.data, net_message.cursize, &clientaddr); SZ_Clear(&net_message); @@ -1092,15 +1103,15 @@ qsocket_t *Datagram_CheckNewConnections (void) static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr) { - struct qsockaddr myaddr; + //struct qsockaddr myaddr; int control; int c, n, i; - if (net_message.cursize < sizeof(int)) + if (net_message.cursize < (int)sizeof(int)) return false; // don't answer our own query - dfunc.GetSocketAddr (dfunc.controlSock, &myaddr); + //dfunc.GetSocketAddr (dfunc.controlSock, &myaddr); //if (dfunc.AddrCompare(readaddr, &myaddr) >= 0) // return false; @@ -1113,7 +1124,7 @@ static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr) MSG_ReadLong(); if (control == -1) return false; - if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL) + if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL) return false; if ((control & NETFLAG_LENGTH_MASK) != net_message.cursize) return false; @@ -1156,7 +1167,7 @@ static qboolean Datagram_HandleServerInfo (struct qsockaddr *readaddr) { if (i == n) continue; - if (Q_strcasecmp (hostcache[n].name, hostcache[i].name) == 0) + if (strcasecmp (hostcache[n].name, hostcache[i].name) == 0) { i = strlen(hostcache[n].name); if (i < 15 && hostcache[n].name[i-1] > '8') @@ -1228,25 +1239,20 @@ static qboolean _Datagram_SearchForInetHosts (const char *master) portnum = atoi (port + 1); if (!portnum) portnum = MASTER_PORT; - Con_DPrintf("Datagram_SearchForInetHosts: sending %d byte message to master %s\n", net_message.cursize, master); + Con_DPrintf("Datagram_SearchForInetHosts: sending %d byte message to master %s port %i\n", net_message.cursize, master, portnum); dfunc.SetSocketPort (&masteraddr, portnum); - dfunc.Send (net_message.data, net_message.cursize, &masteraddr); + dfunc.Write (dfunc.controlSock, net_message.data, net_message.cursize, &masteraddr); } } - while ((ret = dfunc.Recv (net_message.data, net_message.maxsize, &readaddr)) > 0) - { - net_message.cursize = ret; - Con_DPrintf("Datagram_SearchForInetHosts: Recv received %d byte message\n", net_message.cursize); - Master_ParseServerList (&dfunc); - } - while ((ret = dfunc.Read (dfunc.controlSock, net_message.data, net_message.maxsize, &readaddr)) > 0) { net_message.cursize = ret; Con_DPrintf("Datagram_SearchForInetHosts: Read received %d byte message\n", net_message.cursize); if (Datagram_HandleServerInfo (&readaddr)) result = true; + else + Master_ParseServerList (&dfunc); } return result; @@ -1264,7 +1270,7 @@ qboolean Datagram_SearchForInetHosts (const char *master) if (_Datagram_SearchForInetHosts (master)) result = true; } - + return result; } @@ -1273,6 +1279,7 @@ static qsocket_t *_Datagram_Connect (const char *host) { struct qsockaddr sendaddr; struct qsockaddr readaddr; + struct qsockaddr testaddr; qsocket_t *sock; int newsock; int ret; @@ -1321,17 +1328,22 @@ static qsocket_t *_Datagram_Connect (const char *host) if (ret > 0) { // is it from the right place? - if (sfunc.AddrCompare(&readaddr, &sendaddr) != 0) + // we don't care if the port matches (this adds support for + // the NAT fix in the server inspired by faded) + memcpy(&testaddr, &sendaddr, sizeof(struct qsockaddr)); + dfunc.SetSocketPort (&testaddr, dfunc.GetSocketPort(&readaddr)); + if (sfunc.AddrCompare(&readaddr, &testaddr) != 0) { - Con_DPrintf("wrong reply address\n"); - Con_DPrintf("Expected: %s\n", StrAddr (&sendaddr)); - Con_DPrintf("Received: %s\n", StrAddr (&readaddr)); + Con_Printf("wrong reply address\n"); + Con_Printf("Expected: %s\n", StrAddr (&sendaddr)); + Con_Printf("Received: %s\n", StrAddr (&readaddr)); + CL_UpdateScreen (); CL_UpdateScreen (); ret = 0; continue; } - if (ret < sizeof(int)) + if (ret < (int)sizeof(int)) { ret = 0; continue; @@ -1347,7 +1359,7 @@ static qsocket_t *_Datagram_Connect (const char *host) ret = 0; continue; } - if ((control & (~NETFLAG_LENGTH_MASK)) != NETFLAG_CTL) + if ((control & (~NETFLAG_LENGTH_MASK)) != (int)NETFLAG_CTL) { ret = 0; continue; @@ -1462,6 +1474,7 @@ static void _Datagram_Heartbeat (const char *master) portnum = MASTER_PORT; dfunc.SetSocketPort (&masteraddr, portnum); + // FIXME: this is the only use of UDP_Send in the entire engine, add a dfunc.acceptSock to get rid of this function! dfunc.Send (net_message.data, net_message.cursize, &masteraddr); }