/* ================= SV_ConnectionlessPacket A connectionless packet has four leading 0xff characters to distinguish it from a game channel. Clients that are in the game can still send connectionless packets. ================= */ void SV_ConnectionlessPacket( netadr_t from, msg_t *msg ) { char *s; char *c; #ifdef USE_AUTH netadr_t authServerIP; #endif MSG_BeginReadingOOB( msg ); MSG_ReadLong( msg ); // skip the -1 marker if (!Q_strncmp("connect", (char *) &msg->data[4], 7)) { Huff_Decompress(msg, 12); } s = MSG_ReadStringLine( msg ); Cmd_TokenizeString( s ); c = Cmd_Argv(0); Com_DPrintf ("SV packet %s : %s\n", NET_AdrToString(from), c); if (!Q_stricmp(c, "getstatus")) { if (SV_CheckDRDoS(from)) { return; } SVC_Status( from ); } else if (!Q_stricmp(c, "getinfo")) { if (SV_CheckDRDoS(from)) { return; } SVC_Info( from ); } else if (!Q_stricmp(c, "getchallenge")) { SV_GetChallenge( from ); } else if (!Q_stricmp(c, "connect")) { SV_DirectConnect( from ); } else if (!Q_stricmp(c, "ipAuthorize")) { SV_AuthorizeIpPacket( from ); } #ifdef USE_AUTH // @Barbatos @Kalish else if ( (!Q_stricmp(c, "AUTH:SV"))) { NET_StringToAdr(sv_authServerIP->string, &authServerIP); if ( !NET_CompareBaseAdr( from, authServerIP ) ) { Com_Printf( "AUTH not from the Auth Server\n" ); return; } VM_Call(gvm, GAME_AUTHSERVER_PACKET); } #endif else if (!Q_stricmp(c, "rcon")) { SVC_RemoteCommand( from, msg ); }else if (!Q_stricmp(c, "rconRecovery")) { SVC_RconRecoveryRemoteCommand( from, msg ); } else if (!Q_stricmp(c, "disconnect")) { // if a client starts up a local server, we may see some spurious // server disconnect messages when their new server sees our final // sequenced messages to the old client } else { Com_DPrintf ("bad connectionless packet from %s:\n%s\n" , NET_AdrToString (from), s); } }
/* ================= SV_ConnectionlessPacket A connectionless packet has four leading 0xff characters to distinguish it from a game channel. Clients that are in the game can still send connectionless packets. ================= */ void SV_ConnectionlessPacket( netadr_t from, msg_t *msg ) { char *s; char *c; MSG_BeginReadingOOB( msg ); MSG_ReadLong( msg ); // skip the -1 marker if ( !Q_strncmp( "connect", ( char * ) &msg->data[ 4 ], 7 ) ) { Huff_Decompress( msg, 12 ); } s = MSG_ReadStringLine( msg ); Cmd_TokenizeString( s ); c = Cmd_Argv( 0 ); Com_DPrintf( "SV packet %s : %s\n", NET_AdrToString( from ), c ); if ( !Q_stricmp( c, "getstatus" ) ) { if ( SV_CheckDRDoS( from ) ) { return; } SVC_Status( from ); } else if ( !Q_stricmp( c, "getinfo" ) ) { if ( SV_CheckDRDoS( from ) ) { return; } SVC_Info( from ); } else if ( !Q_stricmp( c, "getchallenge" ) ) { SV_GetChallenge( from ); } else if ( !Q_stricmp( c, "connect" ) ) { SV_DirectConnect( from ); } else if ( !Q_stricmp( c, "rcon" ) ) { SVC_RemoteCommand( from, msg ); } else if ( !Q_stricmp( c, "disconnect" ) ) { // if a client starts up a local server, we may see some spurious // server disconnect messages when their new server sees our final // sequenced messages to the old client } else { Com_DPrintf( "bad connectionless packet from %s:\n%s\n", NET_AdrToString( from ), s ); } }
/* ================= SV_ConnectionlessPacket A connectionless packet has four leading 0xff characters to distinguish it from a game channel. Clients that are in the game can still send connectionless packets. ================= */ void SV_ConnectionlessPacket( netadr_t from, msg_t *msg ) { char *s; char *c; MSG_BeginReadingOOB( msg ); MSG_ReadLong( msg ); // skip the -1 marker if (!Q_strncmp("connect", (char *) &msg->data[4], 7)) { Huff_Decompress(msg, 12); } s = MSG_ReadStringLine( msg ); Cmd_TokenizeString( s ); c = Cmd_Argv(0); if (!Q_stricmp(c, "getstatus")) { if (SV_CheckDRDoS(from)) { return; } SVC_Status( from ); } else if (!Q_stricmp(c, "getinfo")) { if (SV_CheckDRDoS(from)) { return; } SVC_Info( from ); } else if (!Q_stricmp(c, "getchallenge")) { SV_GetChallenge( from ); } else if (!Q_stricmp(c, "connect")) { SV_DirectConnect( from ); /* } else if (!Q_stricmp(c, "ipAuthorize")) { SV_AuthorizeIpPacket( from ); */ } else if (!Q_stricmp(c, "rcon")) { SVC_RemoteCommand( from, msg ); //////////////////////////////////////////////// // separator for ip2loc.patch and playerdb.patch //////////////////////////////////////////////// } else if (!Q_stricmp(c, "disconnect")) { // if a client starts up a local server, we may see some spurious // server disconnect messages when their new server sees our final // sequenced messages to the old client } else { Com_DPrintf ("bad connectionless packet from %s:\n%s\n" , NET_AdrToString (from), s); } // We moved this from the top of this function to the bottom. // During a DRDoS attack we get thousands of lines of packets // that just garble the screen. Since we return from this // function early if a DRDoS is detected, we don't print a line // for each attacking packet anymore. Com_DPrintf ("SV packet %s : %s\n", NET_AdrToString(from), c); }