|
|
@ -832,14 +832,10 @@ SV_TestBandWidth |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
void SV_TestBandWidth( netadr_t from ) |
|
|
|
void SV_TestBandWidth( netadr_t from ) |
|
|
|
{ |
|
|
|
{ |
|
|
|
int version = Q_atoi( Cmd_Argv( 1 )); |
|
|
|
const int version = Q_atoi( Cmd_Argv( 1 )); |
|
|
|
int packetsize = Q_atoi( Cmd_Argv( 2 )); |
|
|
|
const int packetsize = Q_atoi( Cmd_Argv( 2 )); |
|
|
|
byte send_buf[FRAGMENT_MAX_SIZE]; |
|
|
|
uint32_t crc; |
|
|
|
dword crcValue = 0; |
|
|
|
int ofs; |
|
|
|
byte *filepos; |
|
|
|
|
|
|
|
int crcpos; |
|
|
|
|
|
|
|
file_t *test; |
|
|
|
|
|
|
|
sizebuf_t send; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// don't waste time of protocol mismatched
|
|
|
|
// don't waste time of protocol mismatched
|
|
|
|
if( version != PROTOCOL_VERSION ) |
|
|
|
if( version != PROTOCOL_VERSION ) |
|
|
@ -848,32 +844,29 @@ void SV_TestBandWidth( netadr_t from ) |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
test = FS_Open( "gfx.wad", "rb", false ); |
|
|
|
// quickly reject invalid packets
|
|
|
|
|
|
|
|
if( !svs.testpacket_buf || |
|
|
|
if( FS_FileLength( test ) < sizeof( send_buf )) |
|
|
|
( packetsize <= FRAGMENT_MIN_SIZE ) || |
|
|
|
|
|
|
|
( packetsize > FRAGMENT_MAX_SIZE )) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// skip the test and just get challenge
|
|
|
|
// skip the test and just get challenge
|
|
|
|
SV_GetChallenge( from ); |
|
|
|
SV_GetChallenge( from ); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// write the packet header
|
|
|
|
// don't go out of bounds
|
|
|
|
MSG_Init( &send, "BandWidthPacket", send_buf, sizeof( send_buf )); |
|
|
|
ofs = packetsize - svs.testpacket_filepos - 1; |
|
|
|
MSG_WriteLong( &send, -1 ); // -1 sequence means out of band
|
|
|
|
if(( ofs < 0 ) || ( ofs > svs.testpacket_filelen )) |
|
|
|
MSG_WriteString( &send, "testpacket" ); |
|
|
|
{ |
|
|
|
crcpos = MSG_GetNumBytesWritten( &send ); |
|
|
|
SV_GetChallenge( from ); |
|
|
|
MSG_WriteLong( &send, 0 ); // reserve space for crc
|
|
|
|
return; |
|
|
|
filepos = send.pData + MSG_GetNumBytesWritten( &send ); |
|
|
|
} |
|
|
|
packetsize = packetsize - MSG_GetNumBytesWritten( &send ); // adjust the packet size
|
|
|
|
|
|
|
|
FS_Read( test, filepos, packetsize ); |
|
|
|
|
|
|
|
FS_Close( test ); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CRC32_ProcessBuffer( &crcValue, filepos, packetsize ); // calc CRC
|
|
|
|
crc = svs.testpacket_crcs[ofs]; |
|
|
|
MSG_SeekToBit( &send, packetsize << 3, SEEK_CUR ); |
|
|
|
memcpy( svs.testpacket_crcpos, &crc, sizeof( crc )); |
|
|
|
*(uint *)&send.pData[crcpos] = crcValue; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// send the datagram
|
|
|
|
// send the datagram
|
|
|
|
NET_SendPacket( NS_SERVER, MSG_GetNumBytesWritten( &send ), MSG_GetData( &send ), from ); |
|
|
|
NET_SendPacket( NS_SERVER, packetsize, MSG_GetData( &svs.testpacket ), from ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|