1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
/*
Copyright (C) 1997-2001 Id Software, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#ifndef NET_CHAN_H
#define NET_CHAN_H
#include "common/msg.h"
#include "common/net/net.h"
#include "common/sizebuf.h"
typedef enum netchan_type_e {
NETCHAN_OLD,
NETCHAN_NEW
} netchan_type_t;
typedef struct netchan_s {
netchan_type_t type;
int protocol;
size_t maxpacketlen;
qboolean fatal_error;
netsrc_t sock;
int dropped; // between last packet and previous
unsigned total_dropped; // for statistics
unsigned total_received;
unsigned last_received; // for timeouts
unsigned last_sent; // for retransmits
netadr_t remote_address;
int qport; // qport value to write when transmitting
sizebuf_t message; // writing buffer for reliable data
size_t reliable_length;
qboolean reliable_ack_pending; // set to qtrue each time reliable is received
qboolean fragment_pending;
// sequencing variables
int incoming_sequence;
int incoming_acknowledged;
int outgoing_sequence;
size_t (*Transmit)(struct netchan_s *, size_t, const void *, int);
size_t (*TransmitNextFragment)(struct netchan_s *);
qboolean (*Process)(struct netchan_s *);
qboolean (*ShouldUpdate)(struct netchan_s *);
} netchan_t;
extern cvar_t *net_qport;
extern cvar_t *net_maxmsglen;
extern cvar_t *net_chantype;
void Netchan_Init(void);
void Netchan_OutOfBand(netsrc_t sock, const netadr_t *adr,
const char *format, ...) q_printf(3, 4);
netchan_t *Netchan_Setup(netsrc_t sock, netchan_type_t type,
const netadr_t *adr, int qport, size_t maxpacketlen, int protocol);
void Netchan_Close(netchan_t *netchan);
#define OOB_PRINT(sock, addr, data) \
NET_SendPacket(sock, CONST_STR_LEN("\xff\xff\xff\xff" data), addr)
//============================================================================
typedef struct netchan_old_s {
netchan_t pub;
// sequencing variables
int incoming_reliable_acknowledged; // single bit
int incoming_reliable_sequence; // single bit, maintained local
int reliable_sequence; // single bit
int last_reliable_sequence; // sequence number of last send
byte *message_buf; // leave space for header
// message is copied to this buffer when it is first transfered
byte *reliable_buf; // unacked reliable message
} netchan_old_t;
typedef struct netchan_new_s {
netchan_t pub;
// sequencing variables
int incoming_reliable_acknowledged; // single bit
int incoming_reliable_sequence; // single bit, maintained local
int reliable_sequence; // single bit
int last_reliable_sequence; // sequence number of last send
int fragment_sequence;
// reliable staging and holding areas
byte message_buf[MAX_MSGLEN]; // leave space for header
// message is copied to this buffer when it is first transfered
byte reliable_buf[MAX_MSGLEN]; // unacked reliable message
sizebuf_t fragment_in;
byte fragment_in_buf[MAX_MSGLEN];
sizebuf_t fragment_out;
byte fragment_out_buf[MAX_MSGLEN];
} netchan_new_t;
#endif // NET_CHAN_H
|