diff --git a/include/netchan.h b/include/netchan.h
index 8b4b8a05d..97378ea8a 100644
--- a/include/netchan.h
+++ b/include/netchan.h
@@ -34,6 +34,13 @@
#include "QF/qdefs.h"
#include "QF/sizebuf.h"
+/** \defgroup network Network support
+*/
+
+/** \defgroup qw-net QuakeWorld network support.
+ \ingroup network
+*/
+//{
#define MAX_MSGLEN 1450 // max length of a reliable message
#define MAX_DATAGRAM 1450 // max length of unreliable message
@@ -60,6 +67,25 @@ extern struct cvar_s *qport;
extern int net_socket;
+int Net_Log_Init (const char **sound_precache);
+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_Outgoing_Packet (const byte *p, int len, int has_sequence);
+void Net_LogStop (void);
+void Analyze_Client_Packet (const byte * data, int len, int has_sequence);
+void Analyze_Server_Packet (const byte * data, int len, int has_sequence);
+
+extern struct cvar_s *net_packetlog;
+
+extern qboolean is_server;
+qboolean ServerPaused (void);
+//@}
+
+/** \defgroup qw-udp QuakeWorld udp support.
+ \ingroup qw-net
+*/
+//@{
+
/** Initialize the UDP network interface.
Opens a single socket to be used for all communications.
@@ -143,21 +169,61 @@ const char *NET_BaseAdrToString (netadr_t a);
*/
qboolean NET_StringToAdr (const char *s, netadr_t *a);
-int Net_Log_Init (const char **sound_precache);
-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_Outgoing_Packet (const byte *p, int len, int has_sequence);
-void Net_LogStop (void);
-void Analyze_Client_Packet (const byte * data, int len, int has_sequence);
-void Analyze_Server_Packet (const byte * data, int len, int has_sequence);
+//@}
-extern struct cvar_s *net_packetlog;
+/** \defgroup netchan Netchan
+ \ingroup qw-net
-extern qboolean is_server;
-qboolean ServerPaused (void);
+
+ Packet Header |
+ Bits | Meaning |
+ 31 | sequence |
+ 1 | this message contains a reliable payload |
+ 31 | acknowledge sequence |
+ 1 | acknowledge receipt of even/odd message |
+ 16 | qport |
+
-//============================================================================
+ The remote connection never knows if it missed a reliable message, the
+ local side detects that it has been dropped by seeing a sequence
+ acknowledge higher than the last reliable sequence, but without the
+ correct even/odd bit for the reliable set.
+ If the sender notices that a reliable message has been dropped, it will
+ be retransmitted. It will not be retransmitted again until a message
+ after the retransmit has been acknowledged and the reliable still failed
+ to get there.
+
+ If the sequence number is -1, the packet should be handled without a
+ netcon.
+
+ The reliable message can be added to at any time by doing
+ MSG_Write* (&netchan->message, data).
+
+ If the message buffer is overflowed, either by a single message, or by
+ multiple frames worth piling up while the last reliable transmit goes
+ unacknowledged, the netchan signals a fatal error.
+
+ Reliable messages are always placed first in a packet, then the unreliable
+ message is included if there is sufficient room.
+
+ To the receiver, there is no distinction between the reliable and
+ unreliable parts of the message, they are just processed out as a single
+ larger message.
+
+ Illogical packet sequence numbers cause the packet to be dropped, but do
+ not kill the connection. This, combined with the tight window of valid
+ reliable acknowledgement numbers provides protection against malicious
+ address spoofing.
+
+ The qport field is a workaround for bad address translating routers that
+ sometimes remap the client's source port on a packet during gameplay.
+
+ If the base part of the net address matches and the qport matches, then
+ the channel matches even if the IP port differs. The IP port should be
+ updated to the new value before sending out any replies.
+*/
+//@{
#define OLD_AVG 0.99 // total = oldtotal*OLD_AVG + new*(1-OLD_AVG)
#define MAX_LATENT 32
@@ -168,59 +234,82 @@ typedef enum {
} ncqport_e;
typedef struct netchan_s {
- qboolean fatal_error;
+ qboolean fatal_error; ///< True if the message overflowed
- float last_received; // for timeouts
+ float last_received; ///< Time the last packet was received.
-// the statistics are cleared at each client begin, because
-// the server connecting process gives a bogus picture of the data
- float frame_latency; // rolling average
+ /// \name statistics
+ /// the statistics are cleared at each client begin, because
+ /// the server connection process gives a bogus picture of the data
+ ///@{
+ float frame_latency; ///< rolling average
float frame_rate;
- int drop_count; // dropped packets, cleared each level
- int net_drop; //packets dropped before this one
- int good_count; // cleared each level
+ int drop_count; ///< dropped packets, cleared each level
+ int net_drop; ///< packets dropped before this one
+ int good_count; ///< cleared each level
+ ///@}
netadr_t remote_address;
ncqport_e qport;
int flags;
-// bandwidth estimator
- double cleartime; // if realtime > nc->cleartime, free to go
- double rate; // seconds / byte
+ /// \name bandwidth estimator
+ ///@{
+ double cleartime; ///< if realtime > nc->cleartime,
+ ///< free to go
+ double rate; ///< seconds / byte
+ ///@}
-// sequencing variables
+ /// \name sequencing variables
+ ///@{
int incoming_sequence;
int incoming_acknowledged;
- int incoming_reliable_acknowledged; // single bit
+ int incoming_reliable_acknowledged; ///< single bit
- int incoming_reliable_sequence; // single bit, maintained local
+ int incoming_reliable_sequence; ///< single bit, maintained local
int outgoing_sequence;
- int reliable_sequence; // single bit
- int last_reliable_sequence; // sequence number of last send
+ int reliable_sequence; ///< single bit
+ int last_reliable_sequence; ///< sequence number of last send
+ ///@}
-// reliable staging and holding areas
- sizebuf_t message; // writing buffer to send to server
+ /// \name reliable staging and holding areas
+ ///@{
+ sizebuf_t message; ///< writing buffer to send to server
byte message_buf[MAX_MSGLEN];
int reliable_length;
- byte reliable_buf[MAX_MSGLEN]; // unacked reliable message
+ byte reliable_buf[MAX_MSGLEN]; ///< unacked reliable message
+ ///@}
-// time and size data to calculate bandwidth
+ /// \name time and size data to calculate bandwidth
+ ///@{
int outgoing_size[MAX_LATENT];
double outgoing_time[MAX_LATENT];
+ ///@}
} netchan_t;
+/** Disable packet choking.
+*/
extern int net_nochoke; // don't choke packets
+
+/** Disable packet sending.
+
+ Used by clients in demo playback mode.
+*/
extern int net_blocksend; // don't send packets (used by client for demos)
+
+/** Pointer to variable holding the current time in seconds.
+*/
extern double *net_realtime;
void Netchan_Init (void);
void Netchan_Init_Cvars (void);
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)));
+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, ncqport_e qport, int flags);
@@ -229,4 +318,6 @@ qboolean Netchan_CanReliable (netchan_t *chan);
void Netchan_SendPacket (int length, const void *data, netadr_t to);
+//@}
+
#endif // _NET_H
diff --git a/libs/net/net_chan.c b/libs/net/net_chan.c
index d79afb75d..f3a6c93b9 100644
--- a/libs/net/net_chan.c
+++ b/libs/net/net_chan.c
@@ -56,52 +56,6 @@ static __attribute__ ((used)) const char rcsid[] =
#define PACKET_HEADER 8
-/*
- packet header
- -------------
- 31 sequence
- 1 does this message contain a reliable payload
- 31 acknowledge sequence
- 1 acknowledge receipt of even/odd message
- 16 qport
-
- The remote connection never knows if it missed a reliable message, the
- local side detects that it has been dropped by seeing a sequence acknowledge
- higher thatn the last reliable sequence, but without the correct evon/odd
- bit for the reliable set.
-
- If the sender notices that a reliable message has been dropped, it will be
- retransmitted. It will not be retransmitted again until a message after the
- retransmit has been acknowledged and the reliable still failed to get there.
-
- if the sequence number is -1, the packet should be handled without a netcon
-
- The reliable message can be added to at any time by doing
- MSG_Write* (&netchan->message, ).
-
- If the message buffer is overflowed, either by a single message, or by
- multiple frames worth piling up while the last reliable transmit goes
- unacknowledged, the netchan signals a fatal error.
-
- Reliable messages are always placed first in a packet, then the unreliable
- message is included if there is sufficient room.
-
- To the receiver, there is no distinction between the reliable and unreliable
- parts of the message, they are just processed out as a single larger message.
-
- Illogical packet sequence numbers cause the packet to be dropped, but do
- not kill the connection. This, combined with the tight window of valid
- reliable acknowledgement numbers provides protection against malicious
- address spoofing.
-
- The qport field is a workaround for bad address translating routers that
- sometimes remap the client's source port on a packet during gameplay.
-
- If the base part of the net address matches and the qport matches, then the
- channel matches even if the IP port differs. The IP port should be updated
- to the new value before sending out any replies.
-*/
-
int net_nochoke;
int net_blocksend;
double *net_realtime;