1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// net.h -- quake's interface to the networking layer
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstruct qsockaddr
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	short sa_family;
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned char sa_data[14];
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream};
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define	NET_NAMELEN			64
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NET_MAXMESSAGE		8192
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NET_HEADERSIZE		(2 * sizeof(unsigned int))
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NET_DATAGRAMSIZE	(MAX_DATAGRAM + NET_HEADERSIZE)
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// NetHeader flags
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NETFLAG_LENGTH_MASK	0x0000ffff
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NETFLAG_DATA		0x00010000
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NETFLAG_ACK			0x00020000
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NETFLAG_NAK			0x00040000
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NETFLAG_EOM			0x00080000
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NETFLAG_UNRELIABLE	0x00100000
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NETFLAG_CTL			0x80000000
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define NET_PROTOCOL_VERSION	3
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// This is the network info/connection protocol.  It is used to find Quake
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// servers, get info about them, and connect to them.  Once connected, the
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// Quake game protocol (documented elsewhere) is used.
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// General notes:
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	game_name is currently always "QUAKE", but is there so this same protocol
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		can be used for future games as well; can you say Quake2?
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// CCREQ_CONNECT
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	game_name				"QUAKE"
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		byte	net_protocol_version	NET_PROTOCOL_VERSION
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// CCREQ_SERVER_INFO
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	game_name				"QUAKE"
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		byte	net_protocol_version	NET_PROTOCOL_VERSION
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// CCREQ_PLAYER_INFO
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		byte	player_number
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// CCREQ_RULE_INFO
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	rule
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// CCREP_ACCEPT
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		long	port
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// CCREP_REJECT
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	reason
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// CCREP_SERVER_INFO
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	server_address
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	host_name
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	level_name
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		byte	current_players
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		byte	max_players
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		byte	protocol_version	NET_PROTOCOL_VERSION
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// CCREP_PLAYER_INFO
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		byte	player_number
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	name
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		long	colors
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		long	frags
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		long	connect_time
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	address
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// CCREP_RULE_INFO
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	rule
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		string	value
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//	note:
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		There are two address forms used above.  The short form is just a
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		port number.  The address that goes along with the port is defined as
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		"whatever address you receive this reponse from".  This lets us use
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		the host OS to solve the problem of multiple host addresses (possibly
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		with no routing between them); the host will use the right address
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		when we reply to the inbound connection request.  The long from is
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		a full address and port in a string.  It is used for returning the
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		address of a server that is not running locally.
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define CCREQ_CONNECT		0x01
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define CCREQ_SERVER_INFO	0x02
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define CCREQ_PLAYER_INFO	0x03
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define CCREQ_RULE_INFO		0x04
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define CCREP_ACCEPT		0x81
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define CCREP_REJECT		0x82
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define CCREP_SERVER_INFO	0x83
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define CCREP_PLAYER_INFO	0x84
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define CCREP_RULE_INFO		0x85
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct qsocket_s
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	struct qsocket_s	*next;
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double			connecttime;
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double			lastMessageTime;
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double			lastSendTime;
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean		disconnected;
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean		canSend;
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean		sendNext;
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				driver;
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				landriver;
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				socket;
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	void			*driverdata;
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned int	ackSequence;
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned int	sendSequence;
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned int	unreliableSendSequence;
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				sendMessageLength;
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			sendMessage [NET_MAXMESSAGE];
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned int	receiveSequence;
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	unsigned int	unreliableReceiveSequence;
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int				receiveMessageLength;
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte			receiveMessage [NET_MAXMESSAGE];
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	struct qsockaddr	addr;
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char				address[NET_NAMELEN];
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} qsocket_t;
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern qsocket_t	*net_activeSockets;
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern qsocket_t	*net_freeSockets;
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int			net_numsockets;
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
157cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	const char		*name;
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean	initialized;
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			controlSock;
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			(*Init) (void);
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	void		(*Shutdown) (void);
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	void		(*Listen) (qboolean state);
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int 		(*OpenSocket) (int port);
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int 		(*CloseSocket) (int socket);
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int 		(*Connect) (int socket, struct qsockaddr *addr);
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int 		(*CheckNewConnections) (void);
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int 		(*Read) (int socket, byte *buf, int len, struct qsockaddr *addr);
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int 		(*Write) (int socket, byte *buf, int len, struct qsockaddr *addr);
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int 		(*Broadcast) (int socket, byte *buf, int len);
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char *		(*AddrToString) (struct qsockaddr *addr);
171cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int 		(*StringToAddr) (const char *string, struct qsockaddr *addr);
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int 		(*GetSocketAddr) (int socket, struct qsockaddr *addr);
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int 		(*GetNameFromAddr) (struct qsockaddr *addr, char *name);
174cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	int 		(*GetAddrFromName) (const char *name, struct qsockaddr *addr);
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			(*AddrCompare) (struct qsockaddr *addr1, struct qsockaddr *addr2);
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			(*GetSocketPort) (struct qsockaddr *addr);
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			(*SetSocketPort) (struct qsockaddr *addr, int port);
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} net_landriver_t;
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define	MAX_NET_DRIVERS		8
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int 				net_numlandrivers;
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern net_landriver_t	net_landrivers[MAX_NET_DRIVERS];
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
186cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	const char		*name;
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean	initialized;
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			(*Init) (void);
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	void		(*Listen) (qboolean state);
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	void		(*SearchForHosts) (qboolean xmit);
191cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	qsocket_t	*(*Connect) (const char *host);
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qsocket_t 	*(*CheckNewConnections) (void);
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			(*QGetMessage) (qsocket_t *sock);
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			(*QSendMessage) (qsocket_t *sock, sizebuf_t *data);
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			(*SendUnreliableMessage) (qsocket_t *sock, sizebuf_t *data);
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean	(*CanSendMessage) (qsocket_t *sock);
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean	(*CanSendUnreliableMessage) (qsocket_t *sock);
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	void		(*Close) (qsocket_t *sock);
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	void		(*Shutdown) (void);
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			controlSock;
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} net_driver_t;
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int			net_numdrivers;
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern net_driver_t	net_drivers[MAX_NET_DRIVERS];
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int			DEFAULTnet_hostport;
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int			net_hostport;
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int net_driverlevel;
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern cvar_t		hostname;
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern char			playername[];
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int			playercolor;
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int		messagesSent;
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int		messagesReceived;
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int		unreliableMessagesSent;
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int		unreliableMessagesReceived;
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqsocket_t *NET_NewQSocket (void);
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid NET_FreeQSocket(qsocket_t *);
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamdouble SetNetTime(void);
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define HOSTCACHESIZE	8
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	name[16];
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	map[16];
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	cname[32];
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		users;
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		maxusers;
2339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		driver;
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		ldriver;
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	struct qsockaddr addr;
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} hostcache_t;
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern int hostCacheCount;
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern hostcache_t hostcache[HOSTCACHESIZE];
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#if !defined(_WIN32 ) && !defined (__linux__) && !defined (__sun__)
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifndef htonl
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern unsigned long htonl (unsigned long hostlong);
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifndef htons
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern unsigned short htons (unsigned short hostshort);
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifndef ntohl
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern unsigned long ntohl (unsigned long netlong);
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
2519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifndef ntohs
2529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern unsigned short ntohs (unsigned short netshort);
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef IDGODS
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean IsID(struct qsockaddr *addr);
2589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//============================================================================
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// public network functions
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//============================================================================
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	double		net_time;
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	sizebuf_t	net_message;
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	int			net_activeconnections;
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid		NET_Init (void);
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid		NET_Shutdown (void);
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamstruct qsocket_s	*NET_CheckNewConnections (void);
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns a new connection number if there is one pending, else -1
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
276cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichstruct qsocket_s	*NET_Connect (const char *host);
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// called by client to connect to a host.  Returns -1 if not able to
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamqboolean NET_CanSendMessage (qsocket_t *sock);
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// Returns true or false if the given qsocket can currently accept a
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// message to be transmitted.
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			NET_GetMessage (struct qsocket_s *sock);
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns data in net_message sizebuf
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns 0 if no data is waiting
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns 1 if a message was received
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns 2 if an unreliable message was received
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns -1 if the connection died
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			NET_SendMessage (struct qsocket_s *sock, sizebuf_t *data);
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			NET_SendUnreliableMessage (struct qsocket_s *sock, sizebuf_t *data);
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns 0 if the message connot be delivered reliably, but the connection
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//		is still considered valid
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns 1 if the message was sent properly
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// returns -1 if the connection died
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint			NET_SendToAll(sizebuf_t *data, int blocktime);
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// This is a reliable *blocking* send to all attached clients.
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid		NET_Close (struct qsocket_s *sock);
3029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// if a dead connection is returned by a get or send function, this function
3039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// should be called when it is convenient
3049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// Server calls when a client is kicked off for a game related misbehavior
3069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// like an illegal protocal conversation.  Client calls when disconnecting
3079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// from a server.
3089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// A netcon_t number will not be reused until this function is called for it
3099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid NET_Poll(void);
3119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamtypedef struct _PollProcedure
3149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	struct _PollProcedure	*next;
3169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	double					nextTime;
317cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	void					(*procedure)(void*);
3189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	void					*arg;
3199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream} PollProcedure;
3209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid SchedulePollProcedure(PollProcedure *pp, double timeOffset);
3229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	qboolean	serialAvailable;
3249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	qboolean	ipxAvailable;
3259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	qboolean	tcpipAvailable;
3269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	char		my_ipx_address[NET_NAMELEN];
3279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	char		my_tcpip_address[NET_NAMELEN];
3289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void (*GetComPortConfig) (int portNumber, int *port, int *irq, int *baud, qboolean *useModem);
3299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void (*SetComPortConfig) (int portNumber, int port, int irq, int baud, qboolean useModem);
3309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void (*GetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
3319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern void (*SetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
3329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	qboolean	slistInProgress;
3349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	qboolean	slistSilent;
3359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamextern	qboolean	slistLocal;
3369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid NET_Slist_f (void);
338