Home | History | Annotate | Download | only in WinQuake
      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 	const 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) (const char *string, struct qsockaddr *addr);
    172 	int 		(*GetSocketAddr) (int socket, struct qsockaddr *addr);
    173 	int 		(*GetNameFromAddr) (struct qsockaddr *addr, char *name);
    174 	int 		(*GetAddrFromName) (const 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 	const char		*name;
    187 	qboolean	initialized;
    188 	int			(*Init) (void);
    189 	void		(*Listen) (qboolean state);
    190 	void		(*SearchForHosts) (qboolean xmit);
    191 	qsocket_t	*(*Connect) (const 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 (const 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)(void*);
    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);
    338