Finish the docs for netchan.

Also clean out some unnecessary declarations.
This commit is contained in:
Bill Currie 2011-07-26 11:29:41 +09:00
parent c7c646a53f
commit 64881d2eca
2 changed files with 88 additions and 38 deletions

View file

@ -41,8 +41,8 @@
\ingroup network \ingroup network
*/ */
//{ //{
#define MAX_MSGLEN 1450 // max length of a reliable message #define MAX_MSGLEN 1450 ///< max length of a reliable message
#define MAX_DATAGRAM 1450 // max length of unreliable message #define MAX_DATAGRAM 1450 ///< max length of unreliable message
#define PORT_ANY -1 #define PORT_ANY -1
@ -54,19 +54,17 @@ typedef struct
byte ip[4]; byte ip[4];
#endif #endif
unsigned short port; unsigned short port;
unsigned short family; // used to be pad, before IPV6 unsigned short family;
} netadr_t; } netadr_t;
extern int net_socket;
extern netadr_t net_local_adr; extern netadr_t net_local_adr;
extern netadr_t net_loopback_adr; extern netadr_t net_loopback_adr;
extern netadr_t net_from; // address of who sent the packet extern netadr_t net_from; // address of who sent the packet
extern struct msg_s *net_message; extern struct msg_s *net_message;
extern struct cvar_s *hostname;
extern struct cvar_s *qport; extern struct cvar_s *qport;
extern int net_socket;
int Net_Log_Init (const char **sound_precache); int Net_Log_Init (const char **sound_precache);
void Net_LogPrintf (const char *fmt, ...) __attribute__ ((format (printf, 1, 2))); void Net_LogPrintf (const char *fmt, ...) __attribute__ ((format (printf, 1, 2)));
void Log_Incoming_Packet (const byte *p, int len, int has_sequence); void Log_Incoming_Packet (const byte *p, int len, int has_sequence);
@ -78,7 +76,6 @@ void Analyze_Server_Packet (const byte * data, int len, int has_sequence);
extern struct cvar_s *net_packetlog; extern struct cvar_s *net_packetlog;
extern qboolean is_server; extern qboolean is_server;
qboolean ServerPaused (void);
//@} //@}
/** \defgroup qw-udp QuakeWorld udp support. /** \defgroup qw-udp QuakeWorld udp support.
@ -194,7 +191,8 @@ qboolean NET_StringToAdr (const char *s, netadr_t *a);
after the retransmit has been acknowledged and the reliable still failed after the retransmit has been acknowledged and the reliable still failed
to get there. to get there.
If the sequence number is -1, the packet should be handled without a If the sequence number and reliable payload bits are all 1 (32bit -1),
the packet is an out-of-band packet and should be handled without a
netcon. netcon.
The reliable message can be added to at any time by doing The reliable message can be added to at any time by doing
@ -292,30 +290,96 @@ typedef struct netchan_s {
/** Disable packet choking. /** Disable packet choking.
*/ */
extern int net_nochoke; // don't choke packets extern int net_nochoke;
/** Disable packet sending. /** Disable packet sending.
Used by clients in demo playback mode. Used by clients in demo playback mode.
*/ */
extern int net_blocksend; // don't send packets (used by client for demos) extern int net_blocksend;
/** Pointer to variable holding the current time in seconds. /** Pointer to variable holding the current time in seconds.
*/ */
extern double *net_realtime; extern double *net_realtime;
/** Initialize the netchan system.
Currently only sets the qport cvar default to a random value.
*/
void Netchan_Init (void); void Netchan_Init (void);
/** Initialize the netchan cvars.
*/
void Netchan_Init_Cvars (void); void Netchan_Init_Cvars (void);
/** Try to send an unreliable packet to a connection.
Handles transmission or retransmission of the reliable packet.
0 length will still generate a packet and deal with the reliable messages.
\param chan The netchan representing the connection.
\param length The size of the unreliable packet.
\param data The data of the unreliable packet.
*/
void Netchan_Transmit (netchan_t *chan, int length, byte *data); void Netchan_Transmit (netchan_t *chan, int length, byte *data);
/** Send an out-of-band packet.
\param adr The address to which the data will be sent.
\param length The length of the data to be sent.
\param data The data to be sent.
*/
void Netchan_OutOfBand (netadr_t adr, int length, byte *data); void Netchan_OutOfBand (netadr_t adr, int length, byte *data);
/** Send a formatted string as an out-of-band packet.
\param adr The address to which the data will be sent.
\param format The printf style format string.
*/
void Netchan_OutOfBandPrint (netadr_t adr, const char *format, ...) void Netchan_OutOfBandPrint (netadr_t adr, const char *format, ...)
__attribute__ ((format (printf,2,3))); __attribute__ ((format (printf,2,3)));
/** Process a packet for the specifiied connection.
Called when the current net_message is from remote_address.
Modifies net_message so that it points to the packet payload.
\param chan The netchan representing the connection.
*/
qboolean Netchan_Process (netchan_t *chan); qboolean Netchan_Process (netchan_t *chan);
/** Initialize a new connection.
\param chan The netchan representing the connection.
\param adr The address of the remote end of the connection.
\param qport The qport associated with the connection.
\param flags Control of the sending/reading of the qport on this
connection.
*/
void Netchan_Setup (netchan_t *chan, netadr_t adr, int qport, ncqport_e flags); void Netchan_Setup (netchan_t *chan, netadr_t adr, int qport, ncqport_e flags);
/** Check if a packet can be sent to the connection.
\param chan The netchan representing the connection.
\return True if the connection isn't chocked.
*/
qboolean Netchan_CanPacket (netchan_t *chan); qboolean Netchan_CanPacket (netchan_t *chan);
/** Check if a reliable packet can be sent to the connection.
\param chan The netchan representing the connection.
\return True if there is no outstanding reliable packet and the
connection isn't chocked.
*/
qboolean Netchan_CanReliable (netchan_t *chan); qboolean Netchan_CanReliable (netchan_t *chan);
/** Send a packet.
Very raw. Just calls NET_SendPacket().
\param length The length of the data to be sent.
\param data The data to be sent.
\param to The address to which the data will be sent.
*/
void Netchan_SendPacket (int length, const void *data, netadr_t to); void Netchan_SendPacket (int length, const void *data, netadr_t to);
//@} //@}

View file

@ -187,14 +187,6 @@ Netchan_CanReliable (netchan_t *chan)
return Netchan_CanPacket (chan); return Netchan_CanPacket (chan);
} }
/*
Netchan_Transmit
tries to send an unreliable message to a connection, and handles the
transmition / retransmition of the reliable messages.
0 length will still generate a packet and deal with the reliable messages.
*/
void void
Netchan_Transmit (netchan_t *chan, int length, byte *data) Netchan_Transmit (netchan_t *chan, int length, byte *data)
{ {
@ -239,20 +231,20 @@ Netchan_Transmit (netchan_t *chan, int length, byte *data)
MSG_WriteLong (&send, w1); MSG_WriteLong (&send, w1);
MSG_WriteLong (&send, w2); MSG_WriteLong (&send, w2);
// send the qport if we are a client /// Send the qport if appropriate (we are a client).
if (chan->flags & NC_QPORT_SEND) if (chan->flags & NC_QPORT_SEND)
MSG_WriteShort (&send, chan->qport); MSG_WriteShort (&send, chan->qport);
// copy the reliable message to the packet first /// First copy the reliable message to the packet.
if (send_reliable) { if (send_reliable) {
SZ_Write (&send, chan->reliable_buf, chan->reliable_length); SZ_Write (&send, chan->reliable_buf, chan->reliable_length);
chan->last_reliable_sequence = chan->outgoing_sequence; chan->last_reliable_sequence = chan->outgoing_sequence;
} }
// add the unreliable part if space is available /// Then add the unreliable part if space is available.
if (send.maxsize - send.cursize >= length) if (send.maxsize - send.cursize >= length)
SZ_Write (&send, data, length); SZ_Write (&send, data, length);
// send the datagram /// Send the datagram if not blocked (in demo playback mode)
i = chan->outgoing_sequence & (MAX_LATENT - 1); i = chan->outgoing_sequence & (MAX_LATENT - 1);
chan->outgoing_size[i] = send.cursize; chan->outgoing_size[i] = send.cursize;
chan->outgoing_time[i] = *net_realtime; chan->outgoing_time[i] = *net_realtime;
@ -276,12 +268,6 @@ Netchan_Transmit (netchan_t *chan, int length, byte *data)
chan->outgoing_sequence - chan->incoming_sequence); chan->outgoing_sequence - chan->incoming_sequence);
} }
/*
Netchan_Process
called when the current net_message is from remote_address
modifies net_message so that it points to the packet payload
*/
qboolean qboolean
Netchan_Process (netchan_t *chan) Netchan_Process (netchan_t *chan)
{ {
@ -291,12 +277,12 @@ Netchan_Process (netchan_t *chan)
if (!NET_CompareAdr (net_from, chan->remote_address)) if (!NET_CompareAdr (net_from, chan->remote_address))
return false; return false;
// get sequence numbers /// Get the sequence numbers.
MSG_BeginReading (net_message); MSG_BeginReading (net_message);
sequence = MSG_ReadLong (net_message); sequence = MSG_ReadLong (net_message);
sequence_ack = MSG_ReadLong (net_message); sequence_ack = MSG_ReadLong (net_message);
// read the qport if we are a server, but drop it /// Read the qport if appropriate (we are a server), but ignore it.
if (chan->flags & NC_QPORT_READ) if (chan->flags & NC_QPORT_READ)
MSG_ReadShort (net_message); MSG_ReadShort (net_message);
@ -337,7 +323,7 @@ Netchan_Process (netchan_t *chan)
} }
#endif #endif
// discard stale or duplicated packets /// Discard stale or duplicated packets.
if (sequence < (unsigned int) chan->incoming_sequence + 1) { if (sequence < (unsigned int) chan->incoming_sequence + 1) {
if (showdrop->int_val) if (showdrop->int_val)
Sys_Printf ("%s:Out of order packet %i at %i\n", Sys_Printf ("%s:Out of order packet %i at %i\n",
@ -346,7 +332,7 @@ Netchan_Process (netchan_t *chan)
return false; return false;
} }
// dropped packets don't keep the message from being used /// Dropped packets don't keep the message from being used.
chan->net_drop = sequence - (chan->incoming_sequence + 1); chan->net_drop = sequence - (chan->incoming_sequence + 1);
if (chan->net_drop > 0) { if (chan->net_drop > 0) {
chan->drop_count += 1; chan->drop_count += 1;
@ -357,21 +343,21 @@ Netchan_Process (netchan_t *chan)
sequence - (chan->incoming_sequence + 1), sequence); sequence - (chan->incoming_sequence + 1), sequence);
} }
// if the current outgoing reliable message has been acknowledged /// If the current outgoing reliable message has been acknowledged,
// clear the buffer to make way for the next /// clear the buffer to make way for the next.
if (reliable_ack == (unsigned int) chan->reliable_sequence) if (reliable_ack == (unsigned int) chan->reliable_sequence)
chan->reliable_length = 0; // it has been received chan->reliable_length = 0; // it has been received
// if this message contains a reliable message, bump /// If this message contains a reliable message, bump
// incoming_reliable_sequence /// incoming_reliable_sequence
chan->incoming_sequence = sequence; chan->incoming_sequence = sequence;
chan->incoming_acknowledged = sequence_ack; chan->incoming_acknowledged = sequence_ack;
chan->incoming_reliable_acknowledged = reliable_ack; chan->incoming_reliable_acknowledged = reliable_ack;
if (reliable_message) if (reliable_message)
chan->incoming_reliable_sequence ^= 1; chan->incoming_reliable_sequence ^= 1;
// the message can now be read from the current message pointer // The message can now be read from the current message pointer.
// update statistics counters /// Update statistics counters.
chan->frame_latency = chan->frame_latency * OLD_AVG chan->frame_latency = chan->frame_latency * OLD_AVG
+ (chan->outgoing_sequence - sequence_ack) * (1.0 - OLD_AVG); + (chan->outgoing_sequence - sequence_ack) * (1.0 - OLD_AVG);
chan->frame_rate = chan->frame_rate * OLD_AVG chan->frame_rate = chan->frame_rate * OLD_AVG