From 7b5a5f6f9ec211cceaeacc9aae045252546eba70 Mon Sep 17 00:00:00 2001 From: Spoike Date: Wed, 25 Apr 2012 16:29:58 +0000 Subject: [PATCH] fix for packet fragmentation git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4033 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/common/net_chan.c | 41 +++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/engine/common/net_chan.c b/engine/common/net_chan.c index a09b80fff..c33c70210 100644 --- a/engine/common/net_chan.c +++ b/engine/common/net_chan.c @@ -673,36 +673,37 @@ int Netchan_Transmit (netchan_t *chan, int length, qbyte *data, int rate) NET_SendPacket (chan->sock, send.cursize, send.data, chan->remote_address); else { - int offset = chan->fragmentsize, no; + int offset = chan->fragmentsize - hsz, no; qboolean more; /*switch on the 'more flags' bit, and send the first part*/ send.data[hsz - 2] |= 0x1; - NET_SendPacket (chan->sock, offset, send.data, chan->remote_address); + offset &= ~7; + NET_SendPacket (chan->sock, offset + hsz, send.data, chan->remote_address); /*send the additional parts, adding new headers within the previous packet*/ - while(offset < send.cursize) + while(offset < send.cursize-hsz) { no = offset + chan->fragmentsize - hsz; - no &= ~7; - if (no < send.cursize) + if (no < send.cursize-hsz) { + no &= ~7; more = true; } else { - no = send.cursize; + no = send.cursize-hsz; more = false; } - *(int*)&send.data[(offset - hsz) + 0] = LittleLong(w1); - *(int*)&send.data[(offset - hsz) + 4] = LittleLong(w2); + *(int*)&send.data[(offset) + 0] = LittleLong(w1); + *(int*)&send.data[(offset) + 4] = LittleLong(w2); #ifndef SERVERONLY if (chan->sock == NS_CLIENT) - *(short*)&send.data[offset - 4] = LittleShort(cls.qport); + *(short*)&send.data[offset + hsz-4] = LittleShort(cls.qport); #endif - *(short*)&send.data[offset - 2] = LittleShort(((offset-hsz)>>2) | (more?1:0)); + *(short*)&send.data[offset + hsz-2] = LittleShort((offset>>2) | (more?1:0)); - NET_SendPacket (chan->sock, (no - offset) + hsz, send.data + offset - hsz, chan->remote_address); + NET_SendPacket (chan->sock, (no - offset) + hsz, send.data + offset, chan->remote_address); offset = no; } } @@ -776,12 +777,13 @@ qboolean Netchan_Process (netchan_t *chan) sequence_ack &= ~(1<<31); if (showpackets.value) - Con_Printf ("<-- s=%i(%i) a=%i(%i) %i\n" + Con_Printf ("<-- s=%i(%i) a=%i(%i) %i%s\n" , sequence , reliable_message , sequence_ack , reliable_ack - , net_message.cursize); + , net_message.cursize + , offset?" frag":""); // get a rate estimation #if 0 @@ -834,8 +836,9 @@ qboolean Netchan_Process (netchan_t *chan) { more = true; offset &= ~1; - offset = offset << 2; } + offset = offset << 2; + if (offset + len > sizeof(chan->in_fragment_buf)) /*stop the overflow*/ { if (showdrop.value) @@ -852,7 +855,7 @@ qboolean Netchan_Process (netchan_t *chan) return false; /*dropped one*/ memcpy(chan->in_fragment_buf + offset, net_message.data + msg_readcount, len); - chan->in_fragment_length += net_message.cursize - msg_readcount; + chan->in_fragment_length += len; if (more) { @@ -863,6 +866,14 @@ qboolean Netchan_Process (netchan_t *chan) msg_readcount = 0; net_message.cursize = chan->in_fragment_length; + if (showpackets.value) + Con_Printf ("<-- s=%i(%i) a=%i(%i) %i Recombined\n" + , sequence + , reliable_message + , sequence_ack + , reliable_ack + , net_message.cursize); + chan->incoming_unreliable = 0; chan->in_fragment_length = 0; }