except for packet logging, netchan is much cleaner (no more cls in the

server!)
This commit is contained in:
Bill Currie 2004-02-19 08:58:42 +00:00
parent 35e29b8f1d
commit fa58b795f2
8 changed files with 26 additions and 45 deletions

View file

@ -106,6 +106,7 @@ typedef struct
netadr_t remote_address;
int qport;
int flags;
// bandwidth estimator
double cleartime; // if realtime > nc->cleartime, free to go
@ -135,6 +136,8 @@ typedef struct
} netchan_t;
extern int net_drop; // packets dropped before this one
extern int net_nochoke; // don't choke packets
extern int net_blocksend; // don't send packets (used by client for demos)
void Netchan_Init (void);
void Netchan_Init_Cvars (void);
@ -142,7 +145,10 @@ void Netchan_Transmit (netchan_t *chan, int length, byte *data);
void Netchan_OutOfBand (netadr_t adr, int length, byte *data);
void Netchan_OutOfBandPrint (netadr_t adr, const char *format, ...) __attribute__((format(printf,2,3)));
qboolean Netchan_Process (netchan_t *chan);
void Netchan_Setup (netchan_t *chan, netadr_t adr, int qport);
void Netchan_Setup (netchan_t *chan, netadr_t adr, int qport, int flags);
#define NC_SEND_QPORT 0x01
#define NC_READ_QPORT 0x02
qboolean Netchan_CanPacket (netchan_t *chan);
qboolean Netchan_CanReliable (netchan_t *chan);

View file

@ -104,6 +104,8 @@ static __attribute__ ((unused)) const char rcsid[] =
*/
int net_drop;
int net_nochoke;
int net_blocksend;
cvar_t *showpackets;
cvar_t *showdrop;
cvar_t *qport;
@ -155,10 +157,7 @@ Netchan_OutOfBand (netadr_t adr, int length, byte * data)
// send the datagram
// zoid, no input in demo playback mode
if (!is_server) {
if (!cls.demoplayback)
Netchan_SendPacket (send.cursize, send.data, adr);
} else
if (!net_blocksend)
Netchan_SendPacket (send.cursize, send.data, adr);
}
@ -189,7 +188,7 @@ Netchan_OutOfBandPrint (netadr_t adr, const char *format, ...)
called to open a channel to a remote system
*/
void
Netchan_Setup (netchan_t *chan, netadr_t adr, int qport)
Netchan_Setup (netchan_t *chan, netadr_t adr, int qport, int flags)
{
memset (chan, 0, sizeof (*chan));
@ -201,6 +200,7 @@ Netchan_Setup (netchan_t *chan, netadr_t adr, int qport)
chan->message.maxsize = sizeof (chan->message_buf);
chan->qport = qport;
chan->flags = flags;
chan->rate = 1.0 / 2500.0;
}
@ -286,8 +286,8 @@ Netchan_Transmit (netchan_t *chan, int length, byte * data)
MSG_WriteLong (&send, w2);
// send the qport if we are a client
if (!is_server)
MSG_WriteShort (&send, cls.qport);
if (chan->flags & NC_SEND_QPORT)
MSG_WriteShort (&send, chan->qport);
// copy the reliable message to the packet first
if (send_reliable) {
@ -304,17 +304,14 @@ Netchan_Transmit (netchan_t *chan, int length, byte * data)
chan->outgoing_time[i] = realtime;
// zoid, no input in demo playback mode
if (!is_server) {
if (!cls.demoplayback)
Netchan_SendPacket (send.cursize, send.data, chan->remote_address);
} else
if (!net_blocksend)
Netchan_SendPacket (send.cursize, send.data, chan->remote_address);
if (chan->cleartime < realtime)
chan->cleartime = realtime + send.cursize * chan->rate;
else
chan->cleartime += send.cursize * chan->rate;
if (ServerPaused ())
if (net_nochoke)
chan->cleartime = realtime;
if (showpackets->int_val)
@ -335,13 +332,9 @@ Netchan_Process (netchan_t *chan)
int qport;
unsigned int reliable_ack, reliable_message, sequence, sequence_ack;
if (is_server) {
if (!net_blocksend)
if (!NET_CompareAdr (net_from, chan->remote_address))
return false;
} else {
if (!cls.demoplayback &&
!NET_CompareAdr (net_from, chan->remote_address)) return false;
}
// get sequence numbers
MSG_BeginReading (net_message);
@ -349,7 +342,7 @@ Netchan_Process (netchan_t *chan)
sequence_ack = MSG_ReadLong (net_message);
// read the qport if we are a server
if (is_server)
if (chan->flags & NC_READ_QPORT)
qport = MSG_ReadShort (net_message);
reliable_message = sequence >> 31;

View file

@ -50,23 +50,17 @@ static __attribute__ ((unused)) const char rcsid[] =
#include "netchan.h"
#include "../../qw/include/client.h" //FIXME ick, netchan is so incestuous
SERVER_PLUGIN_PROTOS
static plugin_list_t server_plugin_list[] = {
SERVER_PLUGIN_LIST
};
qboolean is_server = true;
double realtime;
cvar_t *net_packetlog;
client_static_t cls;
void Log_Outgoing_Packet (const char *p, int len, int has_sequence);
void Log_Incoming_Packet (const char *p, int len, int has_sequence);
qboolean ServerPaused (void);
void Log_Outgoing_Packet (const char *p, int len, int has_sequence) { }
void Log_Incoming_Packet (const char *p, int len, int has_sequence) { }
qboolean ServerPaused (void) { return 0; }
cbuf_t *qtv_cbuf;

View file

@ -119,6 +119,7 @@ CL_StopPlayback (void)
cls.demoplayback = 0;
cls.demoplayback2 = 0;
demotime_cached = 0;
net_blocksend = 0;
if (cls.timedemo)
CL_FinishTimeDemo ();
@ -896,6 +897,7 @@ CL_StartDemo (void)
}
cls.demoplayback = true;
net_blocksend = 1;
if (strequal (QFS_FileExtension (name), ".mvd")) {
cls.demoplayback2 = true;
Con_Printf ("mvd\n");
@ -903,7 +905,7 @@ CL_StartDemo (void)
Con_Printf ("qwd\n");
}
CL_SetState (ca_demostart);
Netchan_Setup (&cls.netchan, net_from, 0);
Netchan_Setup (&cls.netchan, net_from, 0, NC_SEND_QPORT);
realtime = 0;
cls.findtrack = true;
cls.lasttype = 0;

View file

@ -845,7 +845,7 @@ CL_ConnectionlessPacket (void)
Con_Printf ("Dup connect received. Ignored.\n");
return;
}
Netchan_Setup (&cls.netchan, net_from, cls.qport);
Netchan_Setup (&cls.netchan, net_from, cls.qport, NC_SEND_QPORT);
MSG_WriteByte (&cls.netchan.message, clc_stringcmd);
MSG_WriteString (&cls.netchan.message, "new");
CL_SetState (ca_connected);
@ -1820,9 +1820,3 @@ Host_Shutdown (void)
if (host_basepal)
VID_Shutdown ();
}
qboolean
ServerPaused (void)
{
return false;
}

View file

@ -83,7 +83,6 @@ static __attribute__ ((unused)) const char rcsid[] =
#include "bothdefs.h"
#include "buildnum.h"
#include "compat.h"
#include "client.h" //FIXME needed by cls below (for netchan)
#include "crudefile.h"
#include "game.h"
#include "netchan.h"
@ -102,7 +101,6 @@ cbuf_t *sv_cbuf;
cbuf_args_t *sv_args;
client_t *host_client; // current client
client_static_t cls; //FIXME needed by netchan :/
entity_state_t cl_entities[MAX_CLIENTS][UPDATE_BACKUP+1][MAX_PACKET_ENTITIES]; // client entities
double sv_frametime;
@ -214,13 +212,6 @@ const char *client_info_filters[] = { // Info keys needed by client
NULL
};
qboolean
ServerPaused (void)
{
return sv.paused;
}
/*
Master_Shutdown
@ -905,7 +896,7 @@ SVC_DirectConnect (void)
Netchan_OutOfBandPrint (adr, "%c", S2C_CONNECTION);
Netchan_Setup (&newcl->netchan, adr, qport);
Netchan_Setup (&newcl->netchan, adr, qport, NC_READ_QPORT);
newcl->state = cs_connected;
newcl->prespawned = false;

View file

@ -1823,7 +1823,7 @@ PF_SV_AllocClient (progs_t *pr)
return;
}
//XXX netchan? Netchan_Setup (&newcl->netchan, adr, qport);
//XXX netchan? Netchan_Setup (&newcl->netchan, adr, qport, NC_READ_QPORT);
cl->state = cs_server;
cl->spectator = 0;
cl->connection_started = realtime;

View file

@ -944,6 +944,7 @@ SV_TogglePause (const char *msg)
int i;
sv.paused ^= 1;
net_nochoke = sv.paused;
if (msg)
SV_BroadcastPrintf (PRINT_HIGH, "%s", msg);