OpenMoHAA 0.82.0
Loading...
Searching...
No Matches
sb_internal.h
1#ifndef _SB_INTERNAL_H_
2#define _SB_INTERNAL_H_
3
4
5#include "../common/gsCommon.h"
6#include "../common/gsAvailable.h"
7
8#include "../darray.h"
9#include "../hashtable.h"
10
11#include "sb_serverbrowsing.h"
12#include "../qr2/qr2regkeys.h"
13
14#include "sb_crypt.h"
15
16#ifdef __cplusplus
17extern "C" {
18#endif
19
20typedef enum { pi_cryptheader,
21 pi_fixedheader,
22 pi_keylist,
23 pi_uniquevaluelist,
24 pi_servers,
25 pi_finished } SBListParseState;
26
27
28typedef enum {sl_lanbrowse, sl_disconnected, sl_connected, sl_mainlist} SBServerListState;
29
30
31//master server query port
32#define MSPORT2 28910
33
34//number of master servers
35#define NUM_MASTER_SERVERS 20
36
37//max length of field list to master server
38#define MAX_FIELD_LIST_LEN 256
39
40//max number of values in a popular value list
41#define MAX_POPULAR_VALUES 255
42
43//max number of maps to track in a map loop
44#define MAX_MAPLOOP_LENGTH 16
45
46// max number of bytes that can be received from a single recvfrom call
47// This must not be higher than 2048 for PS2 insock compatability
48#define MAX_RECVFROM_SIZE 2048
49
50//states for SBServer->state
51#define STATE_BASICKEYS (1 << 0)
52#define STATE_FULLKEYS (1 << 1)
53#define STATE_PENDINGBASICQUERY (1 << 2)
54#define STATE_PENDINGFULLQUERY (1 << 3)
55#define STATE_QUERYFAILED (1 << 4)
56#define STATE_PENDINGICMPQUERY (1 << 5)
57#define STATE_VALIDPING (1 << 6)
58#define STATE_PENDINGQUERYCHALLENGE (1 << 7)
59
60//how long before a server query times out
61#define MAX_QUERY_MSEC 2500
62
63//game server flags
64#define UNSOLICITED_UDP_FLAG 1
65#define PRIVATE_IP_FLAG 2
66#define CONNECT_NEGOTIATE_FLAG 4
67#define ICMP_IP_FLAG 8
68#define NONSTANDARD_PORT_FLAG 16
69#define NONSTANDARD_PRIVATE_PORT_FLAG 32
70#define HAS_KEYS_FLAG 64
71#define HAS_FULL_RULES_FLAG 128
72
73//backend query flags (set in hbmaster, don't change)
74#define QR2_USE_QUERY_CHALLENGE 128
75
76//key types for the key type list
77#define KEYTYPE_STRING 0
78#define KEYTYPE_BYTE 1
79#define KEYTYPE_SHORT 2
80
81//how long to make the outgoing challenge
82#define LIST_CHALLENGE_LEN 8
83
84//protocol versions
85#define LIST_PROTOCOL_VERSION 1
86#define LIST_ENCODING_VERSION 3
87
88//message types for outgoing requests
89#define SERVER_LIST_REQUEST 0
90#define SERVER_INFO_REQUEST 1
91#define SEND_MESSAGE_REQUEST 2
92#define KEEPALIVE_REPLY 3
93#define MAPLOOP_REQUEST 4
94#define PLAYERSEARCH_REQUEST 5
95
96//message types for incoming requests
97#define PUSH_KEYS_MESSAGE 1
98#define PUSH_SERVER_MESSAGE 2
99#define KEEPALIVE_MESSAGE 3
100#define DELETE_SERVER_MESSAGE 4
101#define MAPLOOP_MESSAGE 5
102#define PLAYERSEARCH_MESSAGE 6
103
104//server list update options
105#define SEND_FIELDS_FOR_ALL 1
106#define NO_SERVER_LIST 2
107#define PUSH_UPDATES 4
108#define SEND_GROUPS 32
109#define NO_LIST_CACHE 64
110#define LIMIT_RESULT_COUNT 128
111
112//player search options
113#define SEARCH_ALL_GAMES 1
114#define SEARCH_LEFT_SUBSTRING 2
115#define SEARCH_RIGHT_SUBSTRING 4
116#define SEARCH_ANY_SUBSTRING 8
117
118//max number of keys for the basic key list
119#define MAX_QUERY_KEYS 20
120
121//how long to search on the LAN
122#define SL_LAN_SEARCH_TIME 2000
123
124//MAGIC bytes for the QR2 queries
125#define QR2_MAGIC_1 0xFE
126#define QR2_MAGIC_2 0xFD
127
128//magic bytes for nat negotiation message
129#define NATNEG_MAGIC_LEN 6
130#define NN_MAGIC_0 0xFD
131#define NN_MAGIC_1 0xFC
132#define NN_MAGIC_2 0x1E
133#define NN_MAGIC_3 0x66
134#define NN_MAGIC_4 0x6A
135#define NN_MAGIC_5 0xB2
136
137
138//query types
139#define QTYPE_BASIC 0
140#define QTYPE_FULL 1
141#define QTYPE_ICMP 2
142
143//query strings for old-style servers
144#define BASIC_GOA_QUERY "\\basic\\\\info\\"
145#define BASIC_GOA_QUERY_LEN 13
146#define FULL_GOA_QUERY "\\status\\"
147#define FULL_GOA_QUERY_LEN 8
148
149//maximum length of a sortkey string
150#define SORTKEY_LENGTH 255
151
152//include ICMP support by default
153#ifndef SB_NO_ICMP_SUPPORT
154 #undef SB_ICMP_SUPPORT
155 #define SB_ICMP_SUPPORT
156#endif
157
158//a key/value pair
159typedef struct _SBKeyValuePair
160{
161 const char *key;
162 const char *value;
163} SBKeyValuePair;
164
165
166//a ref-counted string
167typedef struct _SBRefString
168{
169 const char *str;
170#ifdef GSI_UNICODE
171 const unsigned short *str_W;
172#endif
173 int refcount;
174} SBRefString;
175
176
177typedef struct _SBServerList *SBServerListPtr;
178typedef struct _SBQueryEngine *SBQueryEnginePtr;
179
180//callback types for server lists
181typedef enum {slc_serveradded, slc_serverupdated, slc_serverdeleted, slc_initiallistcomplete, slc_disconnected, slc_queryerror, slc_publicipdetermined, slc_serverchallengereceived} SBListCallbackReason;
182//callback types for query engine
183typedef enum {qe_updatesuccess, qe_updatefailed, qe_engineidle, qe_challengereceived} SBQueryEngineCallbackReason;
184
185//callback function prototypes
186typedef void (*SBListCallBackFn)(SBServerListPtr serverlist, SBListCallbackReason reason, SBServer server, void *instance);
187typedef void (*SBEngineCallbackFn)(SBQueryEnginePtr engine, SBQueryEngineCallbackReason reason, SBServer server, void *instance);
188typedef void (*SBMaploopCallbackFn)(SBServerListPtr serverlist, SBServer server, time_t mapChangeTime, int numMaps, char *mapList[], void *instance);
189typedef void (*SBPlayerSearchCallbackFn)(SBServerListPtr serverlist, char *nick, goa_uint32 serverIP, unsigned short serverPort, time_t lastSeenTime, char *gamename, void *instance);
190
191//key information structure
192typedef struct _KeyInfo
193{
194 const char *keyName;
195 int keyType;
196} KeyInfo;
197
198
199typedef struct _SBServerList SBServerList;
200
201#ifdef VENGINE_SUPPORT
202 #define FTABLE_TYPES
203 #include "../../VEngine/ve_gm3ftable.h"
204#endif
205
206
207//keeps track of previous and current sorting information
208typedef struct _SortInfo
209{
210 gsi_char sortkey[SORTKEY_LENGTH];
211 SBCompareMode comparemode;
212} SortInfo;
213
215{
216 SBServerListState state;
217 DArray servers;
218 DArray keylist;
219 char queryforgamename[36];
220 char queryfromgamename[36];
221 char queryfromkey[32];
222 char mychallenge[LIST_CHALLENGE_LEN];
223 char *inbuffer;
224 int inbufferlen;
225 const char *popularvalues[MAX_POPULAR_VALUES];
226 int numpopularvalues;
227 int expectedelements;
228
229 SBListCallBackFn ListCallback;
230 SBMaploopCallbackFn MaploopCallback;
231 SBPlayerSearchCallbackFn PlayerSearchCallback;
232 void *instance;
233
234 SortInfo currsortinfo;
235 SortInfo prevsortinfo;
236
237 SBBool sortascending;
238 goa_uint32 mypublicip;
239 goa_uint32 srcip;
240 unsigned short defaultport;
241
242 char *lasterror;
243#ifdef GSI_UNICODE
244 unsigned short *lasterror_W;
245#endif
246
247 SOCKET slsocket;
248 gsi_time lanstarttime;
249 int fromgamever;
250 GOACryptState cryptkey;
251 int queryoptions;
252 SBListParseState pstate;
253 gsi_u16 backendgameflags;
254
255 const char* mLanAdapterOverride;
256
257 SBServer deadlist;
258
259#ifdef VENGINE_SUPPORT
260 #define FTABLE_IMPLEMENT
261 #include "../../VEngine/ve_gm3ftable.h"
262#endif
263
264};
265
266
267//server object
268
269#ifndef SB_SERVER_DECLARED
270#define SB_SERVER_DECLARED
271
273{
274 goa_uint32 publicip;
275 unsigned short publicport;
276 goa_uint32 privateip;
277 unsigned short privateport;
278 goa_uint32 icmpip;
279 unsigned char state;
280 unsigned char flags;
281 HashTable keyvals;
282 gsi_time updatetime;
283 gsi_u32 querychallenge;
284 struct _SBServer *next;
285 gsi_u8 splitResponseBitmap;
286};
287
288#endif
289
290typedef struct _SBServerFIFO
291{
292 SBServer first;
293 SBServer last;
294 int count;
295} SBServerFIFO;
296
297typedef struct _SBQueryEngine
298{
299 int queryversion;
300 int maxupdates;
301 SBServerFIFO querylist;
302 SBServerFIFO pendinglist;
303 SOCKET querysock;
304 #if !defined(SN_SYSTEMS)
305 SOCKET icmpsock;
306 #endif
307 goa_uint32 mypublicip;
308 unsigned char serverkeys[MAX_QUERY_KEYS];
309 int numserverkeys;
310 SBEngineCallbackFn ListCallback;
311 void *instance;
312} SBQueryEngine;
313
314
316{
317 SBQueryEngine engine;
318 SBServerList list;
319 SBBool disconnectFlag;
320 SBBool dontUpdate;
321 goa_uint32 triggerIP;
322 unsigned short triggerPort;
323 ServerBrowserCallback BrowserCallback;
324 SBConnectToServerCallback ConnectCallback;
325 void *instance;
326};
327
328#define SB_ICMP_ECHO 8
329#define SB_ICMP_ECHO_REPLY 0
330
331typedef struct _IPHeader {
332 gsi_u8 ip_hl_ver;
333 gsi_u8 ip_tos;
334 gsi_i16 ip_len;
335 gsi_u16 ip_id;
336 gsi_i16 ip_off;
337 gsi_u8 ip_ttl;
338 gsi_u8 ip_p;
339 gsi_u16 ip_sum;
340 struct in_addr ip_src,ip_dst;
341} SBIPHeader;
342
343
344
345typedef struct _ICMPHeader
346{
347 gsi_u8 type;
348 gsi_u8 code;
349 gsi_u16 cksum;
350 union {
351 struct {
352 gsi_u16 id;
353 gsi_u16 sequence;
354 } echo;
355 gsi_u32 idseq;
356 gsi_u16 gateway;
357 struct {
358 gsi_u16 __notused;
359 gsi_u16 mtu;
360 } frag;
361 } un;
362} SBICMPHeader;
363
364
365//server list functions
366void SBServerListInit(SBServerList *slist, const char *queryForGamename, const char *queryFromGamename, const char *queryFromKey, int queryFromVersion, SBBool lanBrowse, SBListCallBackFn callback, void *instance);
367SBError SBServerListConnectAndQuery(SBServerList *slist, const char *fieldList, const char *serverFilter, int options, int maxServers);
368SBError SBServerListGetLANList(SBServerList *slist, unsigned short startport, unsigned short endport, int queryversion);
369void SBServerListDisconnect(SBServerList *slist);
370void SBServerListCleanup(SBServerList *slist);
371void SBServerListClear(SBServerList *slist);
372SBError SBGetServerRulesFromMaster(SBServerList *slist, goa_uint32 ip, unsigned short port);
373SBError SBSendMessageToServer(SBServerList *slist, goa_uint32 ip, unsigned short port, const char *data, int len);
374SBError SBSendNatNegotiateCookieToServer(SBServerList *slist, goa_uint32 ip, unsigned short port, int cookie);
375SBError SBSendMaploopRequest(SBServerList *slist, SBServer server, SBMaploopCallbackFn callback);
376SBError SBSendPlayerSearchRequest(SBServerList *slist, char *searchName, int searchOptions, int maxResults, SBPlayerSearchCallbackFn callback);
377int SBServerListFindServerByIP(SBServerList *slist, goa_uint32 ip, unsigned short port);
378int SBServerListFindServer(SBServerList *slist, SBServer findserver);
379void SBServerListRemoveAt(SBServerList *slist, int index);
380void SBServerListAppendServer(SBServerList *slist, SBServer server);
381void SBServerListSort(SBServerList *slist, SBBool ascending, SortInfo sortinfo);
382int SBServerListCount(SBServerList *slist);
383SBServer SBServerListNth(SBServerList *slist, int i);
384SBError SBListThink(SBServerList *slist);
385const char *SBLastListErrorA(SBServerList *slist);
386const unsigned short *SBLastListErrorW(SBServerList *slist);
387void SBSetLastListErrorPtr(SBServerList *slist, char* theError);
388void SBFreeDeadList(SBServerList *slist);
389void SBAllocateServerList(SBServerList *slist);
390
391//sbserver functions
392SBServer SBAllocServer(SBServerList *slist, goa_uint32 publicip, unsigned short publicport);
393void SBServerFree(void *elem);
394void SBServerAddKeyValue(SBServer server, const char *keyname, const char *value);
395void SBServerAddIntKeyValue(SBServer server, const char *keyname, int value);
396void SBServerParseKeyVals(SBServer server, char *keyvals);
397void SBServerParseQR2FullKeysSingle(SBServer server, char *data, int len);
398void SBServerParseQR2FullKeysSplit(SBServer server, char *data, int len);
399void SBServerSetFlags(SBServer server, unsigned char flags);
400void SBServerSetPublicAddr(SBServer server, goa_uint32 ip, unsigned short port);
401void SBServerSetPrivateAddr(SBServer server, goa_uint32 ip, unsigned short port);
402void SBServerSetICMPIP(SBServer server, goa_uint32 icmpip);
403void SBServerSetState(SBServer server, unsigned char state);
404void SBServerSetNext(SBServer server, SBServer next);
405SBServer SBServerGetNext(SBServer server);
406unsigned char SBServerGetState(SBServer server);
407unsigned char SBServerGetFlags(SBServer server);
408unsigned short SBServerGetPublicQueryPortNBO(SBServer server);
409int SBIsNullServer(SBServer server);
410extern SBServer SBNullServer;
411
412
413//ref-str functions
414const char *SBRefStr(SBServerList *slist,const char *str);
415void SBReleaseStr(SBServerList *slist,const char *str);
416HashTable SBRefStrHash(SBServerList *slist);
417void SBRefStrHashCleanup(SBServerList *slist);
418
419extern char *SBOverrideMasterServer;
420
421
422//query engine functions
423void SBQueryEngineInit(SBQueryEngine *engine, int maxupdates, int queryversion, SBBool lanBrowse, SBEngineCallbackFn callback, void *instance);
424void SBQueryEngineUpdateServer(SBQueryEngine *engine, SBServer server, int addfront, int querytype, SBBool usequerychallenge);
425void SBQueryEngineSetPublicIP(SBQueryEngine *engine, goa_uint32 mypublicip);
426SBServer SBQueryEngineUpdateServerByIP(SBQueryEngine *engine, const char *ip, unsigned short queryport, int addfront, int querytype, SBBool usequerychallenge);
427void SBQueryEngineThink(SBQueryEngine *engine);
428void SBQueryEngineAddQueryKey(SBQueryEngine *engine, unsigned char keyid);
429void SBEngineCleanup(SBQueryEngine *engine);
430void SBQueryEngineRemoveServerFromFIFOs(SBQueryEngine *engine, SBServer server);
431int NTSLengthSB(char *buf, int len);
432void SBEngineHaltUpdates(SBQueryEngine *engine);
433
434
435//server browser internal function
436SBError ServerBrowserBeginUpdate2(ServerBrowser sb, SBBool async, SBBool disconnectOnComplete, const unsigned char *basicFields, int numBasicFields, const char *serverFilter, int updateOptions, int maxServers);
437
438
439// Ascii versions of functions that should still be available in GSI_UNICODE mode
440#ifdef GSI_UNICODE
441const char *SBServerGetStringValueA(SBServer server, const char *keyname, const char *def); // for peer SDK
442int SBServerGetIntValueA(SBServer server, const char *key, int idefault);
443#endif
444
445
446#ifdef __cplusplus
447}
448#endif
449
450#endif
Definition str.h:77
Definition sb_internal.h:346
Definition sb_internal.h:331
Definition sb_internal.h:193
Definition sb_internal.h:160
Definition sb_internal.h:298
Definition sb_internal.h:168
Definition sb_internal.h:291
Definition sb_internal.h:215
Definition sb_internal.h:273
Definition sb_internal.h:316
Definition sb_internal.h:209
Definition puff.c:88