Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5131 clevermous 1
/*
2
Copyright (C) 1996-1997 Id Software, Inc.
3
 
4
This program is free software; you can redistribute it and/or
5
modify it under the terms of the GNU General Public License
6
as published by the Free Software Foundation; either version 2
7
of the License, or (at your option) any later version.
8
 
9
This program is distributed in the hope that it will be useful,
10
but WITHOUT ANY WARRANTY; without even the implied warranty of
11
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12
 
13
See the GNU General Public License for more details.
14
 
15
You should have received a copy of the GNU General Public License
16
along with this program; if not, write to the Free Software
17
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18
 
19
*/
20
// net.h -- quake's interface to the networking layer
21
 
22
struct qsockaddr
23
{
24
	short sa_family;
25
	unsigned char sa_data[14];
26
};
27
 
28
 
29
#define	NET_NAMELEN			64
30
 
31
#define NET_MAXMESSAGE		8192
32
#define NET_HEADERSIZE		(2 * sizeof(unsigned int))
33
#define NET_DATAGRAMSIZE	(MAX_DATAGRAM + NET_HEADERSIZE)
34
 
35
// NetHeader flags
36
#define NETFLAG_LENGTH_MASK	0x0000ffff
37
#define NETFLAG_DATA		0x00010000
38
#define NETFLAG_ACK			0x00020000
39
#define NETFLAG_NAK			0x00040000
40
#define NETFLAG_EOM			0x00080000
41
#define NETFLAG_UNRELIABLE	0x00100000
42
#define NETFLAG_CTL			0x80000000
43
 
44
 
45
#define NET_PROTOCOL_VERSION	3
46
 
47
// This is the network info/connection protocol.  It is used to find Quake
48
// servers, get info about them, and connect to them.  Once connected, the
49
// Quake game protocol (documented elsewhere) is used.
50
//
51
//
52
// General notes:
53
//	game_name is currently always "QUAKE", but is there so this same protocol
54
//		can be used for future games as well; can you say Quake2?
55
//
56
// CCREQ_CONNECT
57
//		string	game_name				"QUAKE"
58
//		byte	net_protocol_version	NET_PROTOCOL_VERSION
59
//
60
// CCREQ_SERVER_INFO
61
//		string	game_name				"QUAKE"
62
//		byte	net_protocol_version	NET_PROTOCOL_VERSION
63
//
64
// CCREQ_PLAYER_INFO
65
//		byte	player_number
66
//
67
// CCREQ_RULE_INFO
68
//		string	rule
69
//
70
//
71
//
72
// CCREP_ACCEPT
73
//		long	port
74
//
75
// CCREP_REJECT
76
//		string	reason
77
//
78
// CCREP_SERVER_INFO
79
//		string	server_address
80
//		string	host_name
81
//		string	level_name
82
//		byte	current_players
83
//		byte	max_players
84
//		byte	protocol_version	NET_PROTOCOL_VERSION
85
//
86
// CCREP_PLAYER_INFO
87
//		byte	player_number
88
//		string	name
89
//		long	colors
90
//		long	frags
91
//		long	connect_time
92
//		string	address
93
//
94
// CCREP_RULE_INFO
95
//		string	rule
96
//		string	value
97
 
98
//	note:
99
//		There are two address forms used above.  The short form is just a
100
//		port number.  The address that goes along with the port is defined as
101
//		"whatever address you receive this reponse from".  This lets us use
102
//		the host OS to solve the problem of multiple host addresses (possibly
103
//		with no routing between them); the host will use the right address
104
//		when we reply to the inbound connection request.  The long from is
105
//		a full address and port in a string.  It is used for returning the
106
//		address of a server that is not running locally.
107
 
108
#define CCREQ_CONNECT		0x01
109
#define CCREQ_SERVER_INFO	0x02
110
#define CCREQ_PLAYER_INFO	0x03
111
#define CCREQ_RULE_INFO		0x04
112
 
113
#define CCREP_ACCEPT		0x81
114
#define CCREP_REJECT		0x82
115
#define CCREP_SERVER_INFO	0x83
116
#define CCREP_PLAYER_INFO	0x84
117
#define CCREP_RULE_INFO		0x85
118
 
119
typedef struct qsocket_s
120
{
121
	struct qsocket_s	*next;
122
	double			connecttime;
123
	double			lastMessageTime;
124
	double			lastSendTime;
125
 
126
	qboolean		disconnected;
127
	qboolean		canSend;
128
	qboolean		sendNext;
129
 
130
	int				driver;
131
	int				landriver;
132
	int				socket;
133
	void			*driverdata;
134
 
135
	unsigned int	ackSequence;
136
	unsigned int	sendSequence;
137
	unsigned int	unreliableSendSequence;
138
	int				sendMessageLength;
139
	byte			sendMessage [NET_MAXMESSAGE];
140
 
141
	unsigned int	receiveSequence;
142
	unsigned int	unreliableReceiveSequence;
143
	int				receiveMessageLength;
144
	byte			receiveMessage [NET_MAXMESSAGE];
145
 
146
	struct qsockaddr	addr;
147
	char				address[NET_NAMELEN];
148
 
149
} qsocket_t;
150
 
151
extern qsocket_t	*net_activeSockets;
152
extern qsocket_t	*net_freeSockets;
153
extern int			net_numsockets;
154
 
155
typedef struct
156
{
157
	char		*name;
158
	qboolean	initialized;
159
	int			controlSock;
160
	int			(*Init) (void);
161
	void		(*Shutdown) (void);
162
	void		(*Listen) (qboolean state);
163
	int 		(*OpenSocket) (int port);
164
	int 		(*CloseSocket) (int socket);
165
	int 		(*Connect) (int socket, struct qsockaddr *addr);
166
	int 		(*CheckNewConnections) (void);
167
	int 		(*Read) (int socket, byte *buf, int len, struct qsockaddr *addr);
168
	int 		(*Write) (int socket, byte *buf, int len, struct qsockaddr *addr);
169
	int 		(*Broadcast) (int socket, byte *buf, int len);
170
	char *		(*AddrToString) (struct qsockaddr *addr);
171
	int 		(*StringToAddr) (char *string, struct qsockaddr *addr);
172
	int 		(*GetSocketAddr) (int socket, struct qsockaddr *addr);
173
	int 		(*GetNameFromAddr) (struct qsockaddr *addr, char *name);
174
	int 		(*GetAddrFromName) (char *name, struct qsockaddr *addr);
175
	int			(*AddrCompare) (struct qsockaddr *addr1, struct qsockaddr *addr2);
176
	int			(*GetSocketPort) (struct qsockaddr *addr);
177
	int			(*SetSocketPort) (struct qsockaddr *addr, int port);
178
} net_landriver_t;
179
 
180
#define	MAX_NET_DRIVERS		8
181
extern int 				net_numlandrivers;
182
extern net_landriver_t	net_landrivers[MAX_NET_DRIVERS];
183
 
184
typedef struct
185
{
186
	char		*name;
187
	qboolean	initialized;
188
	int			(*Init) (void);
189
	void		(*Listen) (qboolean state);
190
	void		(*SearchForHosts) (qboolean xmit);
191
	qsocket_t	*(*Connect) (char *host);
192
	qsocket_t 	*(*CheckNewConnections) (void);
193
	int			(*QGetMessage) (qsocket_t *sock);
194
	int			(*QSendMessage) (qsocket_t *sock, sizebuf_t *data);
195
	int			(*SendUnreliableMessage) (qsocket_t *sock, sizebuf_t *data);
196
	qboolean	(*CanSendMessage) (qsocket_t *sock);
197
	qboolean	(*CanSendUnreliableMessage) (qsocket_t *sock);
198
	void		(*Close) (qsocket_t *sock);
199
	void		(*Shutdown) (void);
200
	int			controlSock;
201
} net_driver_t;
202
 
203
extern int			net_numdrivers;
204
extern net_driver_t	net_drivers[MAX_NET_DRIVERS];
205
 
206
extern int			DEFAULTnet_hostport;
207
extern int			net_hostport;
208
 
209
extern int net_driverlevel;
210
extern cvar_t		hostname;
211
extern char			playername[];
212
extern int			playercolor;
213
 
214
extern int		messagesSent;
215
extern int		messagesReceived;
216
extern int		unreliableMessagesSent;
217
extern int		unreliableMessagesReceived;
218
 
219
qsocket_t *NET_NewQSocket (void);
220
void NET_FreeQSocket(qsocket_t *);
221
double SetNetTime(void);
222
 
223
 
224
#define HOSTCACHESIZE	8
225
 
226
typedef struct
227
{
228
	char	name[16];
229
	char	map[16];
230
	char	cname[32];
231
	int		users;
232
	int		maxusers;
233
	int		driver;
234
	int		ldriver;
235
	struct qsockaddr addr;
236
} hostcache_t;
237
 
238
extern int hostCacheCount;
239
extern hostcache_t hostcache[HOSTCACHESIZE];
240
 
241
#if !defined(_WIN32 ) && !defined (__linux__) && !defined (__sun__)
242
#ifndef htonl
243
extern unsigned long htonl (unsigned long hostlong);
244
#endif
245
#ifndef htons
246
extern unsigned short htons (unsigned short hostshort);
247
#endif
248
#ifndef ntohl
249
extern unsigned long ntohl (unsigned long netlong);
250
#endif
251
#ifndef ntohs
252
extern unsigned short ntohs (unsigned short netshort);
253
#endif
254
#endif
255
 
256
#ifdef IDGODS
257
qboolean IsID(struct qsockaddr *addr);
258
#endif
259
 
260
//============================================================================
261
//
262
// public network functions
263
//
264
//============================================================================
265
 
266
extern	double		net_time;
267
extern	sizebuf_t	net_message;
268
extern	int			net_activeconnections;
269
 
270
void		NET_Init (void);
271
void		NET_Shutdown (void);
272
 
273
struct qsocket_s	*NET_CheckNewConnections (void);
274
// returns a new connection number if there is one pending, else -1
275
 
276
struct qsocket_s	*NET_Connect (char *host);
277
// called by client to connect to a host.  Returns -1 if not able to
278
 
279
qboolean NET_CanSendMessage (qsocket_t *sock);
280
// Returns true or false if the given qsocket can currently accept a
281
// message to be transmitted.
282
 
283
int			NET_GetMessage (struct qsocket_s *sock);
284
// returns data in net_message sizebuf
285
// returns 0 if no data is waiting
286
// returns 1 if a message was received
287
// returns 2 if an unreliable message was received
288
// returns -1 if the connection died
289
 
290
int			NET_SendMessage (struct qsocket_s *sock, sizebuf_t *data);
291
int			NET_SendUnreliableMessage (struct qsocket_s *sock, sizebuf_t *data);
292
// returns 0 if the message connot be delivered reliably, but the connection
293
//		is still considered valid
294
// returns 1 if the message was sent properly
295
// returns -1 if the connection died
296
 
297
int			NET_SendToAll(sizebuf_t *data, int blocktime);
298
// This is a reliable *blocking* send to all attached clients.
299
 
300
 
301
void		NET_Close (struct qsocket_s *sock);
302
// if a dead connection is returned by a get or send function, this function
303
// should be called when it is convenient
304
 
305
// Server calls when a client is kicked off for a game related misbehavior
306
// like an illegal protocal conversation.  Client calls when disconnecting
307
// from a server.
308
// A netcon_t number will not be reused until this function is called for it
309
 
310
void NET_Poll(void);
311
 
312
 
313
typedef struct _PollProcedure
314
{
315
	struct _PollProcedure	*next;
316
	double					nextTime;
317
	void					(*procedure)();
318
	void					*arg;
319
} PollProcedure;
320
 
321
void SchedulePollProcedure(PollProcedure *pp, double timeOffset);
322
 
323
extern	qboolean	serialAvailable;
324
extern	qboolean	ipxAvailable;
325
extern	qboolean	tcpipAvailable;
326
extern	char		my_ipx_address[NET_NAMELEN];
327
extern	char		my_tcpip_address[NET_NAMELEN];
328
extern void (*GetComPortConfig) (int portNumber, int *port, int *irq, int *baud, qboolean *useModem);
329
extern void (*SetComPortConfig) (int portNumber, int port, int irq, int baud, qboolean useModem);
330
extern void (*GetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
331
extern void (*SetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
332
 
333
extern	qboolean	slistInProgress;
334
extern	qboolean	slistSilent;
335
extern	qboolean	slistLocal;
336
 
337
void NET_Slist_f (void);