Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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);
  338.