From 868c81db4ff748df3cd2396a5cc675ebec2396c5 Mon Sep 17 00:00:00 2001 From: Molgrum Date: Thu, 15 Nov 2007 21:19:52 +0000 Subject: [PATCH] Fix from Spike. Increase some buffer sizes to solve the "invalid mvd length" messages. FTEQTV still loses connection at mapchange on certain versions of MVDSV. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@2784 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- fteqtv/forward.c | 2 +- fteqtv/protocol.h | 11 ++++++----- fteqtv/qtv.h | 7 +++++-- fteqtv/qw.c | 24 +++++++++++++----------- fteqtv/source.c | 6 +++--- 5 files changed, 28 insertions(+), 22 deletions(-) diff --git a/fteqtv/forward.c b/fteqtv/forward.c index 7454de1ce..32686ccda 100644 --- a/fteqtv/forward.c +++ b/fteqtv/forward.c @@ -794,7 +794,7 @@ qboolean SV_ReadPendingProxy(cluster_t *cluster, oproxy_t *pend) //start up a new stream //FIXME: does this work? -#if 1 //left disabled until properly tested +#if 0 //left disabled until properly tested qtv = QTV_NewServerConnection(cluster, "reverse"/*server*/, "", true, 2, false, 0); Net_ProxySendString(cluster, pend, QTVSVHEADER); diff --git a/fteqtv/protocol.h b/fteqtv/protocol.h index a6ce9a7cd..c44e12790 100644 --- a/fteqtv/protocol.h +++ b/fteqtv/protocol.h @@ -13,7 +13,7 @@ #define MAX_LIGHTSTYLES 64 #define MAX_PROXY_INBUFFER 4096 -#define MAX_PROXY_BUFFER (1<<14) //must be power-of-two +#define MAX_PROXY_BUFFER (1<<17) //must be power-of-two #define PREFERED_PROXY_BUFFER 4096 //the ammount of data we try to leave in our input buffer (must be large enough to contain any single mvd frame) #define ENTS_PER_FRAME 64 //max number of entities per frame (OUCH!). @@ -56,10 +56,11 @@ //limits #define NQ_PACKETS_PER_SECOND 20 -#define MAX_NQMSGLEN 8000 -#define MAX_MSGLEN 1450 -#define MAX_NQDATAGRAM 1024 -#define MAX_BACKBUF_SIZE 1000 //this is smaller so we don't loose entities when lagging +#define MAX_MSGLEN 8000 //the biggest we can possibly allow +#define MAX_NQMSGLEN 8000 //nq has large reliable packets for the connection data +#define MAX_QWMSGLEN 1450 //qw is fully split into individual packets +#define MAX_NQDATAGRAM 1024 //nq datagrams are only 1k +#define MAX_BACKBUF_SIZE 1000 //this is smaller so we don't loose too many entities when lagging //NQ transport layer defines diff --git a/fteqtv/qtv.h b/fteqtv/qtv.h index ae8424562..8cc9f119b 100644 --- a/fteqtv/qtv.h +++ b/fteqtv/qtv.h @@ -216,14 +216,17 @@ typedef struct { unsigned int last_received; unsigned int cleartime; + int maxdatagramlen; + int maxreliablelen; + int reliable_length; qboolean drop; qboolean isclient; qboolean isnqprotocol; netmsg_t message; - char message_buf[MAX_NQMSGLEN]; //reliable message being built - char reliable_buf[MAX_NQMSGLEN]; //reliable message that we're making sure arrives. + char message_buf[MAX_MSGLEN]; //reliable message being built + char reliable_buf[MAX_MSGLEN]; //reliable message that we're making sure arrives. float rate; diff --git a/fteqtv/qw.c b/fteqtv/qw.c index ff99e1a96..19cc1de4e 100644 --- a/fteqtv/qw.c +++ b/fteqtv/qw.c @@ -367,12 +367,9 @@ void QW_ClearViewerState(viewer_t *viewer) void SendServerData(sv_t *tv, viewer_t *viewer) { netmsg_t msg; - char buffer[MAX_NQMSGLEN]; + char buffer[MAX_MSGLEN]; - if (viewer->netchan.isnqprotocol) - InitNetMsg(&msg, buffer, sizeof(buffer)); - else - InitNetMsg(&msg, buffer,1024); + InitNetMsg(&msg, buffer, viewer->netchan.maxreliablelen); if (tv && (tv->controller == viewer || !tv->controller)) viewer->thisplayer = tv->thisplayer; @@ -887,6 +884,8 @@ void NewNQClient(cluster_t *cluster, netadr_t *addr) Netchan_Setup (cluster->qwdsocket, &viewer->netchan, *addr, 0, false); viewer->netchan.isnqprotocol = true; + viewer->netchan.maxdatagramlen = MAX_NQDATAGRAM; + viewer->netchan.maxreliablelen = MAX_NQMSGLEN; viewer->next = cluster->viewers; cluster->viewers = viewer; @@ -950,7 +949,9 @@ void NewQWClient(cluster_t *cluster, netadr_t *addr, char *connectmessage) memset(viewer, 0, sizeof(viewer_t)); Netchan_Setup (cluster->qwdsocket, &viewer->netchan, *addr, atoi(qport), false); - viewer->netchan.message.maxsize = MAX_MSGLEN; + viewer->netchan.message.maxsize = MAX_QWMSGLEN; + viewer->netchan.maxdatagramlen = MAX_QWMSGLEN; + viewer->netchan.maxreliablelen = MAX_QWMSGLEN; viewer->next = cluster->viewers; cluster->viewers = viewer; @@ -1171,7 +1172,7 @@ void QTV_Status(cluster_t *cluster, netadr_t *from) void ConnectionlessPacket(cluster_t *cluster, netadr_t *from, netmsg_t *m) { - char buffer[MAX_MSGLEN]; + char buffer[MAX_QWMSGLEN]; int i; ReadLong(m); @@ -4502,7 +4503,7 @@ void QW_FreeViewer(cluster_t *cluster, viewer_t *viewer) void SendViewerPackets(cluster_t *cluster, viewer_t *v) { - char buffer[MAX_MSGLEN*2]; + char buffer[MAX_MSGLEN]; netmsg_t m; int read; sv_t *useserver; @@ -4542,7 +4543,7 @@ void SendViewerPackets(cluster_t *cluster, viewer_t *v) } v->maysend = false; - InitNetMsg(&m, buffer, MAX_MSGLEN); + InitNetMsg(&m, buffer, v->netchan.maxdatagramlen); m.cursize = 0; if (v->thinksitsconnected) { @@ -4595,7 +4596,7 @@ void SendViewerPackets(cluster_t *cluster, viewer_t *v) } void QW_UpdateUDPStuff(cluster_t *cluster) { - char buffer[MAX_MSGLEN*2]; + char buffer[MAX_MSGLEN]; //contains read info char tempbuffer[256]; netadr_t from; int fromsize = sizeof(from); @@ -4620,7 +4621,8 @@ void QW_UpdateUDPStuff(cluster_t *cluster) cluster->mastersendtime = cluster->curtime + 3*1000*60; //3 minuites. } - InitNetMsg(&m, buffer, MAX_MSGLEN); + /* initialised for reading */ + InitNetMsg(&m, buffer, sizeof(buffer)); for (;;) { diff --git a/fteqtv/source.c b/fteqtv/source.c index 08786523e..713d15965 100644 --- a/fteqtv/source.c +++ b/fteqtv/source.c @@ -267,8 +267,8 @@ void Net_SendQTVConnectionRequest(sv_t *qtv, char *authmethod, char *challenge) //due to mvdsv sucking and stuff, we try using raw connections where possibleso that we don't end up expecting a header. //at some point, this will be forced to 1 qtv->parsingqtvheader = true;//!!*qtv->connectpassword; - - + qtv->buffersize = 0; + qtv->forwardpoint = 0; str = "QTV\n"; Net_QueueUpstream(qtv, strlen(str), str); str = "VERSION: 1\n"; Net_QueueUpstream(qtv, strlen(str), str); @@ -731,7 +731,7 @@ int SV_EarlyParse(sv_t *qtv, unsigned char *buffer, int remaining) length = (buffer[lengthofs]<<0) + (buffer[lengthofs+1]<<8) + (buffer[lengthofs+2]<<16) + (buffer[lengthofs+3]<<24); length += lengthofs+4; - if (length > 1500) + if (length > MAX_MSGLEN) printf("Probably corrupt mvd (length %i)\n", length); } else