Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hrydgard
GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/HLE/proAdhoc.h
3186 views
1
// Copyright (c) 2013- PPSSPP Project.
2
3
// This program is free software: you can redistribute it and/or modify
4
// it under the terms of the GNU General Public License as published by
5
// the Free Software Foundation, version 2.0 or later versions.
6
7
// This program is distributed in the hope that it will be useful,
8
// but WITHOUT ANY WARRANTY; without even the implied warranty of
9
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
// GNU General Public License 2.0 for more details.
11
12
// A copy of the GPL 2.0 should have been included with the program.
13
// If not, see http://www.gnu.org/licenses/
14
15
// Official git repository and contact information can be found at
16
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
17
18
#pragma once
19
20
#include "Common/Net/SocketCompat.h"
21
22
#ifdef _MSC_VER
23
#define PACK // on MSVC we use #pragma pack() instead so let's kill this.
24
#else
25
#define PACK __attribute__((packed))
26
#endif
27
28
#include <atomic>
29
#include <mutex>
30
#include <thread>
31
#include <climits>
32
33
#include "Common/Net/Resolve.h"
34
#include "Common/Serialize/Serializer.h"
35
#include "Core/MemMap.h"
36
#include "Core/HLE/sceKernelThread.h"
37
#include "Core/HLE/sceKernel.h"
38
#include "Core/HLE/sceKernelMutex.h"
39
#include "Core/HLE/sceUtility.h"
40
41
#define IsMatch(buf1, buf2) (memcmp(&buf1, &buf2, sizeof(buf1)) == 0)
42
43
// Server Listening Port
44
#define SERVER_PORT 27312
45
46
// Default GameMode definitions
47
#define ADHOC_GAMEMODE_PORT 31000
48
#define GAMEMODE_UPDATE_INTERVAL 500 // 12000 usec on JPCSP, but lower value works better on BattleZone (in order to get full speed 60 FPS)
49
#define GAMEMODE_INIT_DELAY 10000
50
#define GAMEMODE_SYNC_TIMEOUT 250000
51
#define GAMEMODE_WAITID 0x2001 // Just to differentiate WaitID with other ID on WAITTYPE_NET
52
53
// GameMode Type
54
#define ADHOCCTL_GAMETYPE_1A 1
55
#define ADHOCCTL_GAMETYPE_1B 2
56
#define ADHOCCTL_GAMETYPE_2A 3
57
58
// psp strutcs and definitions
59
#define ADHOCCTL_MODE_NONE -1 // We only use this internally as initial value before attempting to create/connect/join/scan any group
60
#define ADHOCCTL_MODE_NORMAL 0 // ADHOCCTL_MODE_ADHOC
61
#define ADHOCCTL_MODE_GAMEMODE 1
62
63
// Event Types for Event Handler
64
#define ADHOCCTL_EVENT_ERROR 0 // Used to pass error code to Adhocctl Handler?
65
#define ADHOCCTL_EVENT_CONNECT 1
66
#define ADHOCCTL_EVENT_DISCONNECT 2
67
#define ADHOCCTL_EVENT_SCAN 3
68
#define ADHOCCTL_EVENT_GAME 4
69
#define ADHOCCTL_EVENT_DISCOVER 5
70
#define ADHOCCTL_EVENT_WOL 6
71
#define ADHOCCTL_EVENT_WOL_INTERRUPT 7
72
73
// Internal Thread States
74
#define ADHOCCTL_STATE_DISCONNECTED 0
75
#define ADHOCCTL_STATE_CONNECTED 1
76
#define ADHOCCTL_STATE_SCANNING 2
77
#define ADHOCCTL_STATE_GAMEMODE 3
78
#define ADHOCCTL_STATE_DISCOVER 4
79
#define ADHOCCTL_STATE_WOL 5
80
81
// ProductType ( extracted from SSID along with ProductId & GroupName, Pattern = "PSP_([AXS])(.........)_([LG])_(.*)" )
82
#define PSP_ADHOCCTL_TYPE_COMMERCIAL 0
83
#define PSP_ADHOCCTL_TYPE_DEBUG 1
84
#define PSP_ADHOCCTL_TYPE_SYSTEM 2 // Used for GameSharing?
85
86
// Kernel Utility Netconf Adhoc Types
87
#define UTILITY_NETCONF_TYPE_CONNECT_ADHOC 2
88
#define UTILITY_NETCONF_TYPE_CREATE_ADHOC 4
89
#define UTILITY_NETCONF_TYPE_JOIN_ADHOC 5
90
91
// Kernel Utility States
92
#define UTILITY_NETCONF_STATUS_NONE 0
93
#define UTILITY_NETCONF_STATUS_INITIALIZE 1
94
#define UTILITY_NETCONF_STATUS_RUNNING 2
95
#define UTILITY_NETCONF_STATUS_FINISHED 3
96
#define UTILITY_NETCONF_STATUS_SHUTDOWN 4
97
98
// Event Flags
99
#define ADHOC_EV_SEND 0x0001
100
#define ADHOC_EV_RECV 0x0002
101
#define ADHOC_EV_CONNECT 0x0004
102
#define ADHOC_EV_ACCEPT 0x0008
103
#define ADHOC_EV_FLUSH 0x0010
104
#define ADHOC_EV_INVALID 0x0100 // ignored on events but can be raised on revents? similar to POLLNVAL on posix poll?
105
#define ADHOC_EV_DELETE 0x0200 // ignored on events but can be raised on revents? similar to POLLERR on posix poll?
106
#define ADHOC_EV_ALERT 0x0400
107
#define ADHOC_EV_DISCONNECT 0x0800 // ignored on events but can be raised on revents? similar to POLLHUP on posix poll?
108
109
// PTP Connection States
110
#define ADHOC_PTP_STATE_CLOSED 0
111
#define ADHOC_PTP_STATE_LISTEN 1
112
#define ADHOC_PTP_STATE_SYN_SENT 2 // 3-way handshake normally: [client]send SYN -> [server]recv SYN and reply with ACK+SYN -> [client]recv SYN and reply with ACK -> Established
113
#define ADHOC_PTP_STATE_SYN_RCVD 3
114
#define ADHOC_PTP_STATE_ESTABLISHED 4
115
116
// Nonblocking Flag for Adhoc socket API
117
#define ADHOC_F_NONBLOCK 0x0001
118
// Alert Flags
119
#define ADHOC_F_ALERTSEND 0x0010
120
#define ADHOC_F_ALERTRECV 0x0020
121
#define ADHOC_F_ALERTPOLL 0x0040
122
#define ADHOC_F_ALERTCONNECT 0x0080
123
#define ADHOC_F_ALERTACCEPT 0x0100
124
#define ADHOC_F_ALERTFLUSH 0x0200
125
#define ADHOC_F_ALERTALL (ADHOC_F_ALERTSEND | ADHOC_F_ALERTRECV | ADHOC_F_ALERTPOLL | ADHOC_F_ALERTCONNECT | ADHOC_F_ALERTACCEPT | ADHOC_F_ALERTFLUSH)
126
127
/* PDP Maximum Fragment Size */
128
#define PSP_ADHOC_PDP_MFS 1444
129
130
/* PDP Maximum Transfer Unit */
131
#define PSP_ADHOC_PDP_MTU 65523
132
133
/* PTP Maximum Segment Size */
134
#define PSP_ADHOC_PTP_MSS 1444
135
136
/* GameMode Optional Data */
137
#define ADHOC_GAMEMODE_F_UPDATE 0x00000001
138
139
// Timeouts
140
#define PSP_ADHOCCTL_RECV_TIMEOUT 100000
141
#define PSP_ADHOCCTL_PING_TIMEOUT 2000000
142
143
#ifdef _MSC_VER
144
#pragma pack(push, 1)
145
#endif
146
// Ethernet Address
147
#define ETHER_ADDR_LEN 6
148
typedef struct SceNetEtherAddr {
149
uint8_t data[ETHER_ADDR_LEN];
150
} PACK SceNetEtherAddr;
151
152
inline bool operator<(const SceNetEtherAddr& lhs, const SceNetEtherAddr& rhs) {
153
uint64_t l = 0;
154
uint64_t r = 0;
155
const uint8_t* lp = lhs.data;
156
const uint8_t* rp = rhs.data;
157
for (int8_t i = 5; i >= 0; i--) {
158
int8_t sb = (CHAR_BIT * i);
159
l |= (uint64_t)*lp++ << sb;
160
r |= (uint64_t)*rp++ << sb;
161
}
162
return (l < r);
163
}
164
165
// Broadcast MAC
166
extern uint8_t broadcastMAC[ETHER_ADDR_LEN];
167
168
// Malloc Pool Information
169
typedef struct SceNetMallocStat {
170
s32_le pool; // On Vantage Master Portable this is 0x1ffe0 on sceNetGetMallocStat, while the poolSize arg on sceNetInit was 0x20000
171
s32_le maximum; // On Vantage Master Portable this is 0x4050, Footprint of Highest amount allocated so far?
172
s32_le free; // On Vantage Master Portable this is 0x1f300, VMP compares this value with required size before sending data
173
} PACK SceNetMallocStat;
174
175
// Adhoc Virtual Network Name
176
#define ADHOCCTL_GROUPNAME_LEN 8
177
typedef struct SceNetAdhocctlGroupName {
178
uint8_t data[ADHOCCTL_GROUPNAME_LEN];
179
} PACK SceNetAdhocctlGroupName;
180
181
// Virtual Network Host Information
182
typedef struct SceNetAdhocctlBSSId {
183
SceNetEtherAddr mac_addr;
184
uint8_t padding[2];
185
} PACK SceNetAdhocctlBSSId;
186
187
// Virtual Network Information
188
typedef struct SceNetAdhocctlScanInfo {
189
struct SceNetAdhocctlScanInfo * next;
190
s32_le channel;
191
SceNetAdhocctlGroupName group_name;
192
SceNetAdhocctlBSSId bssid;
193
s32_le mode;
194
} PACK SceNetAdhocctlScanInfo;
195
196
// Virtual Network Information with u32 pointers
197
typedef struct SceNetAdhocctlScanInfoEmu {
198
u32_le next;
199
s32_le channel;
200
SceNetAdhocctlGroupName group_name;
201
SceNetAdhocctlBSSId bssid;
202
s32_le mode;
203
} PACK SceNetAdhocctlScanInfoEmu;
204
205
// Player Nickname
206
#define ADHOCCTL_NICKNAME_LEN 128
207
typedef struct SceNetAdhocctlNickname {
208
uint8_t data[ADHOCCTL_NICKNAME_LEN];
209
} PACK SceNetAdhocctlNickname;
210
211
// Active Virtual Network Information (Adhoc Group Host/Creator's device info, similar to AP?)
212
typedef struct SceNetAdhocctlParameter {
213
s32_le channel;
214
SceNetAdhocctlGroupName group_name; // This group name is probably similar to SSID name on AP
215
SceNetAdhocctlNickname nickname; // According to the old PSPSDK this is the bssid, but according to the dumped content when using newer firmware this is the nickname (this is also the nickname on VitaSDK)
216
SceNetAdhocctlBSSId bssid; // FIXME: bssid and nickname position might be swapped on older/newer firmware?
217
} PACK SceNetAdhocctlParameter;
218
219
// Peer Information (internal use only)
220
typedef struct SceNetAdhocctlPeerInfo {
221
SceNetAdhocctlPeerInfo * next;
222
SceNetAdhocctlNickname nickname;
223
SceNetEtherAddr mac_addr;
224
u16_le padding; // a copy of the padding(?) from SceNetAdhocctlPeerInfoEmu
225
u32_le flags;
226
u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)
227
228
u32_le ip_addr; // internal use only
229
u16_le port_offset; // IP-specific port offset (internal use only)
230
} PACK SceNetAdhocctlPeerInfo;
231
232
// Peer Information with u32 pointers
233
typedef struct SceNetAdhocctlPeerInfoEmu {
234
u32_le next; // Changed the pointer to u32
235
SceNetAdhocctlNickname nickname;
236
SceNetEtherAddr mac_addr;
237
u16_le padding; //00 00 // Note: Not sure whether this is really padding or reserved/unknown field
238
u32_le flags; //00 04 00 00 on KHBBS and FF FF FF FF on Ys vs. Sora no Kiseki // State of the peer? Or related to sceNetAdhocAuth_CF4D9BED ?
239
u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)
240
} PACK SceNetAdhocctlPeerInfoEmu;
241
242
// Member Information
243
typedef struct SceNetAdhocMatchingMemberInfo {
244
SceNetAdhocMatchingMemberInfo * next;
245
SceNetEtherAddr mac_addr;
246
uint8_t padding[2];
247
} PACK SceNetAdhocctlMemberInfo;
248
249
// Member Information with u32 pointers
250
typedef struct SceNetAdhocMatchingMemberInfoEmu {
251
u32_le next; // Changed the pointer to u32
252
SceNetEtherAddr mac_addr;
253
uint8_t padding[2];
254
} PACK SceNetAdhocctlMemberInfoEmu;
255
256
// Game Mode Peer List
257
#define ADHOCCTL_GAMEMODE_MAX_MEMBERS 16
258
typedef struct SceNetAdhocctlGameModeInfo {
259
s32_le num;
260
SceNetEtherAddr members[ADHOCCTL_GAMEMODE_MAX_MEMBERS];
261
} PACK SceNetAdhocctlGameModeInfo;
262
263
// GameModeUpdateInfo
264
typedef struct GameModeUpdateInfo {
265
u32_le length; //size of GameModeUpdateInfo (16 bytes)
266
s32_le updated;
267
u64_le timeStamp;
268
} PACK GameModeUpdateInfo;
269
270
// GameModeArea (Internal use only)
271
typedef struct GameModeArea {
272
int id; // started from 1 for replica? master = 0 or -1?
273
int size;
274
u32 addr;
275
//int socket; // PDP socket?
276
u64 updateTimestamp;
277
int dataUpdated;
278
int dataSent;
279
SceNetEtherAddr mac;
280
u8* data; // upto "size" bytes started from "addr" ?
281
} PACK GameModeArea;
282
283
// Socket Polling Event Listener
284
typedef struct SceNetAdhocPollSd{
285
s32_le id;
286
s32_le events;
287
s32_le revents;
288
} PACK SceNetAdhocPollSd;
289
290
// PDP Socket Status
291
typedef struct SceNetAdhocPdpStat {
292
u32_le next;
293
s32_le id; // posix socket id
294
SceNetEtherAddr laddr;
295
u16_le lport;
296
u32_le rcv_sb_cc; // Obscure The Aftermath will check if this is 0 or not before calling PdpRecv, Might to be number of bytes available to be Received?
297
} PACK SceNetAdhocPdpStat;
298
299
// PTP Socket Status
300
typedef struct SceNetAdhocPtpStat {
301
u32_le next; // Changed the pointer to u32
302
s32_le id; // posix socket id
303
SceNetEtherAddr laddr;
304
SceNetEtherAddr paddr;
305
u16_le lport;
306
u16_le pport;
307
u32_le snd_sb_cc; // Number of bytes existed in sendBuffer to be sent/flushed
308
u32_le rcv_sb_cc; // Number of bytes available in recvBuffer to be received
309
s32_le state;
310
} PACK SceNetAdhocPtpStat;
311
312
// PDP & PTP Socket Union (Internal use only)
313
typedef struct AdhocSocket {
314
s32_le type; // SOCK_PDP/SOCK_PTP
315
s32_le flags; // Socket Alert Flags
316
s32_le alerted_flags; // Socket Alerted Flags
317
s32_le nonblocking; // last non-blocking flag
318
u32 buffer_size;
319
u32 send_timeout; // default connect timeout
320
u32 recv_timeout; // default accept timeout
321
s32 retry_interval; // related to keepalive
322
s32 retry_count; // multiply with retry interval to be used as keepalive timeout
323
s32 attemptCount; // connect/accept attempts
324
u64 lastAttempt; // timestamp to retry again (attempted by the game)
325
u64 internalLastAttempt; // timestamp to retry again (internal use only)
326
bool isClient; // true if the game is using local port 0 when creating the socket
327
union {
328
SceNetAdhocPdpStat pdp;
329
SceNetAdhocPtpStat ptp;
330
} data;
331
} PACK AdhocSocket;
332
333
// Gamemode Optional Peer Buffer Data
334
typedef struct SceNetAdhocGameModeOptData {
335
u32_le size;
336
u32_le flag;
337
u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)
338
} PACK SceNetAdhocGameModeOptData;
339
340
// Gamemode Buffer Status
341
typedef struct SceNetAdhocGameModeBufferStat {
342
struct SceNetAdhocGameModeBufferStat * next; //should be u32_le ?
343
s32_le id;
344
void * ptr; //should be u32_le ?
345
u32_le size;
346
u32_le master;
347
SceNetAdhocGameModeOptData opt;
348
} PACK SceNetAdhocGameModeBufferStat;
349
350
// Adhoc ID (Game Product Key)
351
#define ADHOCCTL_ADHOCID_LEN 9
352
typedef struct SceNetAdhocctlAdhocId {
353
s32_le type; // Air Conflicts - Aces Of World War 2 is using 2 for GameSharing?
354
uint8_t data[ADHOCCTL_ADHOCID_LEN]; // Air Conflicts - Aces Of World War 2 is using "000000001" for GameSharing?
355
uint8_t padding[3];
356
} PACK SceNetAdhocctlAdhocId; // should this be packed?
357
#ifdef _MSC_VER
358
#pragma pack(pop)
359
#endif
360
361
362
// Internal Matching Peer Information
363
typedef struct SceNetAdhocMatchingMemberInternal {
364
// Next Peer
365
struct SceNetAdhocMatchingMemberInternal * next;
366
367
// MAC Address
368
SceNetEtherAddr mac;
369
370
// State Variable
371
s32_le state;
372
373
// Send in Progress
374
s32_le sending;
375
376
// Last Heartbeat
377
u64_le lastping; // May need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)
378
} SceNetAdhocMatchingMemberInternal;
379
380
381
// Matching handler
382
struct SceNetAdhocMatchingHandlerArgs {
383
s32_le id;
384
s32_le opcode; // event;
385
SceNetEtherAddr mac; // peer //u32_le macaddr;
386
s32_le optlen;
387
void * opt; //u32_le optaddr
388
};
389
390
struct SceNetAdhocMatchingHandler {
391
u32_le entryPoint;
392
};
393
394
struct AdhocctlHandler {
395
u32 entryPoint;
396
u32 argument;
397
};
398
399
// Thread Message Stack Item
400
typedef struct ThreadMessage {
401
// Next Thread Message
402
struct ThreadMessage * next;
403
404
// Stack Event Opcode
405
u32_le opcode;
406
407
// Target MAC Address
408
SceNetEtherAddr mac;
409
410
// Optional Data Length
411
s32_le optlen;
412
} ThreadMessage;
413
414
// Established Peer
415
416
// Context Information
417
typedef struct SceNetAdhocMatchingContext {
418
// Next Context
419
struct SceNetAdhocMatchingContext *next;
420
421
// Externally Visible ID
422
s32_le id;
423
424
// Matching Mode (HOST, CLIENT, P2P)
425
s32_le mode;
426
427
// Running Flag (1 = running, 0 = created)
428
s32_le running;
429
430
// Maximum Number of Peers (for HOST, P2P)
431
s32_le maxpeers;
432
433
// Peer List for Connectees
434
SceNetAdhocMatchingMemberInternal *peerlist; // SceNetAdhocMatchingMemberInfo[Emu]
435
436
// Peer Port list
437
std::map<SceNetEtherAddr, u16_le> *peerPort;
438
439
// Local MAC Address
440
SceNetEtherAddr mac;
441
442
// Local PDP Port
443
u16_le port;
444
445
// Local PDP Socket
446
s32_le socket;
447
// Socket Lock
448
std::recursive_mutex *socketlock;
449
450
// Receive Buffer Length
451
s32_le rxbuflen;
452
453
// Receive Buffer
454
uint8_t *rxbuf;
455
456
// Hello Broadcast Interval (Microseconds)
457
u32_le hello_int;
458
459
// Keep-Alive Broadcast Interval (Microseconds)
460
u32_le keepalive_int;
461
462
// Resend Interval (Microseconds)
463
u32_le resend_int;
464
465
// Resend-Counter
466
s32_le resendcounter;
467
468
// Keep-Alive Counter
469
s32_le keepalivecounter;
470
471
// Event Handler
472
SceNetAdhocMatchingHandler handler;
473
474
// Event Handler Args
475
u32_le handlerArgs[6]; //MatchingArgs handlerArgs; // actual arguments only 5, the 6th one is just for borrowing a space to store the callback address to use later
476
//SceNetAdhocMatchingHandlerArgs handlerArgs;
477
478
// Hello Data Length
479
s32_le hellolen;
480
481
// Hello Data Address
482
u32_le helloAddr;
483
484
// Hello Data
485
uint8_t *hello;
486
487
// Timeout
488
u64_le timeout;
489
490
// Helper Thread (fake PSP Thread) needed to execute callback
491
//HLEHelperThread *matchingThread;
492
int matching_thid;
493
494
// Event Caller Thread
495
std::thread eventThread;
496
//s32_le event_thid;
497
bool eventRunning = false;
498
bool IsMatchingInCB = false;
499
500
// IO Handler Thread
501
std::thread inputThread;
502
//s32_le input_thid;
503
bool inputRunning = false;
504
505
// Event Caller Thread Message Stack
506
std::recursive_mutex *eventlock; // s32_le event_stack_lock;
507
ThreadMessage *event_stack;
508
509
// IO Handler Thread Message Stack
510
std::recursive_mutex *inputlock; // s32_le input_stack_lock;
511
ThreadMessage *input_stack;
512
513
// Socket Connectivity
514
//bool connected = false;
515
//bool InConnection = false;
516
//u32_le handlerid = -1;
517
//int eventMatchingHandlerUpdate = -1;
518
} SceNetAdhocMatchingContext;
519
520
// End of psp definitions
521
522
enum {
523
// pspnet_adhoc_auth
524
ERROR_NET_ADHOC_AUTH_ALREADY_INITIALIZED = 0x80410601,
525
526
// pspnet_adhoc
527
ERROR_NET_ADHOC_INVALID_SOCKET_ID = 0x80410701,
528
ERROR_NET_ADHOC_INVALID_ADDR = 0x80410702,
529
ERROR_NET_ADHOC_INVALID_PORT = 0x80410703,
530
ERROR_NET_ADHOC_INVALID_BUFLEN = 0x80410704,
531
ERROR_NET_ADHOC_INVALID_DATALEN = 0x80410705,
532
ERROR_NET_ADHOC_NOT_ENOUGH_SPACE = 0x80400706, // not a typo
533
ERROR_NET_ADHOC_SOCKET_DELETED = 0x80410707,
534
ERROR_NET_ADHOC_SOCKET_ALERTED = 0x80410708,
535
ERROR_NET_ADHOC_WOULD_BLOCK = 0x80410709, //ERROR_NET_ADHOC_NO_DATA_AVAILABLE
536
ERROR_NET_ADHOC_PORT_IN_USE = 0x8041070a,
537
ERROR_NET_ADHOC_NOT_CONNECTED = 0x8041070B,
538
ERROR_NET_ADHOC_DISCONNECTED = 0x8041070c,
539
ERROR_NET_ADHOC_NOT_OPENED = 0x8040070D, // not a typo
540
ERROR_NET_ADHOC_NOT_LISTENED = 0x8040070E, // not a typo
541
ERROR_NET_ADHOC_SOCKET_ID_NOT_AVAIL = 0x8041070F,
542
ERROR_NET_ADHOC_PORT_NOT_AVAIL = 0x80410710,
543
ERROR_NET_ADHOC_INVALID_ARG = 0x80410711,
544
ERROR_NET_ADHOC_NOT_INITIALIZED = 0x80410712,
545
ERROR_NET_ADHOC_ALREADY_INITIALIZED = 0x80410713,
546
ERROR_NET_ADHOC_BUSY = 0x80410714,
547
ERROR_NET_ADHOC_TIMEOUT = 0x80410715,
548
ERROR_NET_ADHOC_NO_ENTRY = 0x80410716,
549
ERROR_NET_ADHOC_EXCEPTION_EVENT = 0x80410717,
550
ERROR_NET_ADHOC_CONNECTION_REFUSED = 0x80410718,
551
ERROR_NET_ADHOC_THREAD_ABORTED = 0x80410719,
552
ERROR_NET_ADHOC_ALREADY_CREATED = 0x8041071A,
553
ERROR_NET_ADHOC_NOT_IN_GAMEMODE = 0x8041071B,
554
ERROR_NET_ADHOC_NOT_CREATED = 0x8041071C,
555
556
// pspnet_adhoc_matching
557
ERROR_NET_ADHOC_MATCHING_INVALID_MODE = 0x80410801,
558
ERROR_NET_ADHOC_MATCHING_INVALID_PORT = 0x80410802,
559
ERROR_NET_ADHOC_MATCHING_INVALID_MAXNUM = 0x80410803,
560
ERROR_NET_ADHOC_MATCHING_RXBUF_TOO_SHORT = 0x80410804,
561
ERROR_NET_ADHOC_MATCHING_INVALID_OPTLEN = 0x80410805,
562
ERROR_NET_ADHOC_MATCHING_INVALID_ARG = 0x80410806,
563
ERROR_NET_ADHOC_MATCHING_INVALID_ID = 0x80410807,
564
ERROR_NET_ADHOC_MATCHING_ID_NOT_AVAIL = 0x80410808,
565
ERROR_NET_ADHOC_MATCHING_NO_SPACE = 0x80410809,
566
ERROR_NET_ADHOC_MATCHING_IS_RUNNING = 0x8041080A,
567
ERROR_NET_ADHOC_MATCHING_NOT_RUNNING = 0x8041080B,
568
ERROR_NET_ADHOC_MATCHING_UNKNOWN_TARGET = 0x8041080C,
569
ERROR_NET_ADHOC_MATCHING_TARGET_NOT_READY = 0x8041080D,
570
ERROR_NET_ADHOC_MATCHING_EXCEED_MAXNUM = 0x8041080E,
571
ERROR_NET_ADHOC_MATCHING_REQUEST_IN_PROGRESS = 0x8041080F,
572
ERROR_NET_ADHOC_MATCHING_ALREADY_ESTABLISHED = 0x80410810,
573
ERROR_NET_ADHOC_MATCHING_BUSY = 0x80410811,
574
ERROR_NET_ADHOC_MATCHING_ALREADY_INITIALIZED = 0x80410812,
575
ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED = 0x80410813,
576
ERROR_NET_ADHOC_MATCHING_PORT_IN_USE = 0x80410814,
577
ERROR_NET_ADHOC_MATCHING_STACKSIZE_TOO_SHORT = 0x80410815,
578
ERROR_NET_ADHOC_MATCHING_INVALID_DATALEN = 0x80410816,
579
ERROR_NET_ADHOC_MATCHING_NOT_ESTABLISHED = 0x80410817,
580
ERROR_NET_ADHOC_MATCHING_DATA_BUSY = 0x80410818,
581
582
// pspnet_adhocctl
583
ERROR_NET_ADHOCCTL_NOT_LEFT_IBSS = 0x80410b01,
584
ERROR_NET_ADHOCCTL_ALREADY_CONNECTED = 0x80410b02,
585
ERROR_NET_ADHOCCTL_WLAN_SWITCH_OFF = 0x80410b03,
586
ERROR_NET_ADHOCCTL_INVALID_ARG = 0x80410B04,
587
ERROR_NET_ADHOCCTL_TIMEOUT = 0x80410b05,
588
ERROR_NET_ADHOCCTL_ID_NOT_FOUND = 0x80410B06,
589
ERROR_NET_ADHOCCTL_ALREADY_INITIALIZED = 0x80410b07,
590
ERROR_NET_ADHOCCTL_NOT_INITIALIZED = 0x80410b08,
591
ERROR_NET_ADHOCCTL_DISCONNECTED = 0x80410b09,
592
ERROR_NET_ADHOCCTL_NO_SCAN_INFO = 0x80410b0a,
593
ERROR_NET_ADHOCCTL_INVALID_IBSS = 0x80410b0b,
594
ERROR_NET_ADHOCCTL_NOT_ENTER_GAMEMODE = 0x80410B0C,
595
ERROR_NET_ADHOCCTL_CHANNEL_NOT_AVAILABLE = 0x80410B0D,
596
ERROR_NET_ADHOCCTL_WLAN_BEACON_LOST = 0x80410b0e,
597
ERROR_NET_ADHOCCTL_WLAN_SUSPENDED = 0x80410b0f,
598
ERROR_NET_ADHOCCTL_BUSY = 0x80410b10,
599
ERROR_NET_ADHOCCTL_CHANNEL_NOT_MATCH = 0x80410b11,
600
ERROR_NET_ADHOCCTL_TOO_MANY_HANDLERS = 0x80410b12,
601
ERROR_NET_ADHOCCTL_STACKSIZE_TOO_SHORT = 0x80410B13,
602
};
603
604
const size_t MAX_ADHOCCTL_HANDLERS = 32; //4
605
const size_t MAX_MATCHING_HANDLERS = 32; //4
606
607
enum {
608
/**
609
* Matching events used in pspAdhocMatchingCallback
610
*/
611
/** Hello event. optdata contains data if optlen > 0. */
612
PSP_ADHOC_MATCHING_EVENT_HELLO = 1,
613
/** Join request. optdata contains data if optlen > 0. */
614
PSP_ADHOC_MATCHING_EVENT_JOIN = 2,
615
/** Target left matching. */
616
PSP_ADHOC_MATCHING_EVENT_LEFT = 3,
617
/** Join request rejected. */
618
PSP_ADHOC_MATCHING_EVENT_REJECT = 4,
619
/** Join request cancelled. */
620
PSP_ADHOC_MATCHING_EVENT_CANCEL = 5,
621
/** Join request accepted. optdata contains data if optlen > 0. */
622
PSP_ADHOC_MATCHING_EVENT_ACCEPT = 6,
623
/** Matching is complete. */
624
PSP_ADHOC_MATCHING_EVENT_COMPLETE = 7,
625
/** Ping timeout event. */
626
PSP_ADHOC_MATCHING_EVENT_TIMEOUT = 8,
627
/** Error event. */
628
PSP_ADHOC_MATCHING_EVENT_ERROR = 9,
629
/** Peer disconnect event. */
630
PSP_ADHOC_MATCHING_EVENT_DISCONNECT = 10,
631
/** Data received event. optdata contains data if optlen > 0. */
632
PSP_ADHOC_MATCHING_EVENT_DATA = 11,
633
/** Data acknowledged event. */
634
PSP_ADHOC_MATCHING_EVENT_DATA_CONFIRM = 12,
635
/** Data timeout event. */
636
PSP_ADHOC_MATCHING_EVENT_DATA_TIMEOUT = 13,
637
638
/** Internal ping message. */
639
PSP_ADHOC_MATCHING_EVENT_INTERNAL_PING = 100,
640
641
/**
642
* Matching modes used in sceNetAdhocMatchingCreate
643
*/
644
/** Host */
645
PSP_ADHOC_MATCHING_MODE_HOST = 1,
646
/** Client */
647
PSP_ADHOC_MATCHING_MODE_CLIENT = 2,
648
/** Peer to peer */
649
PSP_ADHOC_MATCHING_MODE_PTP = 3,
650
};
651
652
enum {
653
PSP_ADHOC_POLL_READY_TO_SEND = 1, // POLLIN ?
654
PSP_ADHOC_POLL_DATA_AVAILABLE = 2, // POLLPRI ?
655
PSP_ADHOC_POLL_CAN_CONNECT = 4, // POLLOUT ?
656
PSP_ADHOC_POLL_CAN_ACCEPT = 8, // POLLERR ?
657
};
658
659
// Matching modes
660
#define PSP_ADHOC_MATCHING_MODE_PARENT 1
661
#define PSP_ADHOC_MATCHING_MODE_CHILD 2
662
#define PSP_ADHOC_MATCHING_MODE_P2P 3
663
664
// Matching Events
665
#define PSP_ADHOC_MATCHING_EVENT_HELLO 1 // Should be ignored when Join Request is in progress ?
666
#define PSP_ADHOC_MATCHING_EVENT_REQUEST 2
667
#define PSP_ADHOC_MATCHING_EVENT_LEAVE 3
668
#define PSP_ADHOC_MATCHING_EVENT_DENY 4
669
#define PSP_ADHOC_MATCHING_EVENT_CANCEL 5
670
#define PSP_ADHOC_MATCHING_EVENT_ACCEPT 6
671
#define PSP_ADHOC_MATCHING_EVENT_ESTABLISHED 7 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?
672
#define PSP_ADHOC_MATCHING_EVENT_TIMEOUT 8 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?
673
#define PSP_ADHOC_MATCHING_EVENT_ERROR 9
674
#define PSP_ADHOC_MATCHING_EVENT_BYE 10 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?
675
#define PSP_ADHOC_MATCHING_EVENT_DATA 11
676
#define PSP_ADHOC_MATCHING_EVENT_DATA_ACK 12
677
#define PSP_ADHOC_MATCHING_EVENT_DATA_TIMEOUT 13
678
679
// Peer Status
680
// Offer only seen in P2P and PARENT mode after hello
681
// Parent only seen in CHILD mode after connection accept
682
// Child only seen in PARENT and CHILD mode after connection accept
683
// P2P only seen in P2P mode after connection accept
684
// Requester only seen in P2P and PARENT mode after connection request
685
#define PSP_ADHOC_MATCHING_PEER_OFFER 1
686
#define PSP_ADHOC_MATCHING_PEER_PARENT 2
687
#define PSP_ADHOC_MATCHING_PEER_CHILD 3
688
#define PSP_ADHOC_MATCHING_PEER_P2P 4
689
#define PSP_ADHOC_MATCHING_PEER_INCOMING_REQUEST 5
690
#define PSP_ADHOC_MATCHING_PEER_OUTGOING_REQUEST 6
691
#define PSP_ADHOC_MATCHING_PEER_CANCEL_IN_PROGRESS 7
692
693
// Stack Targets
694
#define PSP_ADHOC_MATCHING_INPUT_STACK 1
695
#define PSP_ADHOC_MATCHING_EVENT_STACK 2
696
697
// Packet Opcodes
698
#define PSP_ADHOC_MATCHING_PACKET_PING 0
699
#define PSP_ADHOC_MATCHING_PACKET_HELLO 1
700
#define PSP_ADHOC_MATCHING_PACKET_JOIN 2
701
#define PSP_ADHOC_MATCHING_PACKET_ACCEPT 3
702
#define PSP_ADHOC_MATCHING_PACKET_CANCEL 4
703
#define PSP_ADHOC_MATCHING_PACKET_BULK 5
704
#define PSP_ADHOC_MATCHING_PACKET_BULK_ABORT 6
705
#define PSP_ADHOC_MATCHING_PACKET_BIRTH 7
706
#define PSP_ADHOC_MATCHING_PACKET_DEATH 8
707
#define PSP_ADHOC_MATCHING_PACKET_BYE 9
708
709
// Pro Adhoc Server Packets Opcodes
710
#define OPCODE_PING 0
711
#define OPCODE_LOGIN 1
712
#define OPCODE_CONNECT 2
713
#define OPCODE_DISCONNECT 3
714
#define OPCODE_SCAN 4
715
#define OPCODE_SCAN_COMPLETE 5
716
#define OPCODE_CONNECT_BSSID 6
717
#define OPCODE_CHAT 7
718
719
// PSP Product Code
720
#define PRODUCT_CODE_LENGTH 9
721
722
#ifdef _MSC_VER
723
#pragma pack(push,1)
724
#endif
725
726
typedef struct {
727
// Game Product Code (ex. ULUS12345)
728
char data[PRODUCT_CODE_LENGTH];
729
} PACK SceNetAdhocctlProductCode;
730
731
// Basic Packet
732
typedef struct {
733
uint8_t opcode;
734
} PACK SceNetAdhocctlPacketBase;
735
736
// C2S Login Packet
737
typedef struct {
738
SceNetAdhocctlPacketBase base;
739
SceNetEtherAddr mac;
740
SceNetAdhocctlNickname name;
741
SceNetAdhocctlProductCode game;
742
} PACK SceNetAdhocctlLoginPacketC2S;
743
744
// C2S Connect Packet
745
typedef struct {
746
SceNetAdhocctlPacketBase base;
747
SceNetAdhocctlGroupName group;
748
} PACK SceNetAdhocctlConnectPacketC2S;
749
750
#define ADHOCCTL_MESSAGE_LEN 64
751
// C2S Chat Packet
752
typedef struct {
753
SceNetAdhocctlPacketBase base;
754
char message[ADHOCCTL_MESSAGE_LEN];
755
} PACK SceNetAdhocctlChatPacketC2S;
756
757
// S2C Connect Packet
758
typedef struct {
759
SceNetAdhocctlPacketBase base;
760
SceNetAdhocctlNickname name;
761
SceNetEtherAddr mac;
762
uint32_t ip;
763
} PACK SceNetAdhocctlConnectPacketS2C;
764
765
// S2C Disconnect Packet
766
typedef struct {
767
SceNetAdhocctlPacketBase base;
768
uint32_t ip;
769
} PACK SceNetAdhocctlDisconnectPacketS2C;
770
771
// S2C Scan Packet
772
typedef struct {
773
SceNetAdhocctlPacketBase base;
774
SceNetAdhocctlGroupName group;
775
SceNetEtherAddr mac;
776
} PACK SceNetAdhocctlScanPacketS2C;
777
778
// S2C Connect BSSID Packet
779
typedef struct {
780
SceNetAdhocctlPacketBase base;
781
SceNetEtherAddr mac;
782
} PACK SceNetAdhocctlConnectBSSIDPacketS2C;
783
784
// S2C Chat Packet
785
typedef struct {
786
SceNetAdhocctlChatPacketC2S base;
787
SceNetAdhocctlNickname name;
788
} PACK SceNetAdhocctlChatPacketS2C;
789
790
// P2P Packet
791
typedef struct {
792
SceNetEtherAddr fromMAC;
793
SceNetEtherAddr toMAC;
794
u32_le dataPtr; //void * data
795
} PACK SceNetAdhocMatchingPacketBase;
796
797
// P2P Accept Packet
798
typedef struct {
799
SceNetAdhocctlPacketBase base; //opcode
800
u32_le dataLen;
801
u32_le numMACs; //number of peers
802
u32_le dataPtr; //void * data
803
/*u32_le*/PSPPointer<SceNetEtherAddr> MACsPtr; //peers //SceNetEtherAddr * MACs
804
} PACK SceNetAdhocMatchingPacketAccept;
805
806
#ifdef _MSC_VER
807
#pragma pack(pop)
808
#endif
809
810
class PointerWrap;
811
812
class AfterAdhocMipsCall : public PSPAction {
813
public:
814
AfterAdhocMipsCall() {}
815
static PSPAction* Create() { return new AfterAdhocMipsCall(); }
816
void DoState(PointerWrap& p) override;
817
void run(MipsCall& call) override;
818
void SetData(int handlerID, int eventId, u32_le argsAddr);
819
820
private:
821
int HandlerID = -1;
822
int EventID = -1;
823
u32_le argsAddr = 0;
824
};
825
826
class AfterMatchingMipsCall : public PSPAction {
827
public:
828
AfterMatchingMipsCall() {}
829
static PSPAction *Create() { return new AfterMatchingMipsCall(); }
830
void DoState(PointerWrap &p) override;
831
void run(MipsCall &call) override;
832
void SetData(int ContextID, int eventId, u32_le BufAddr);
833
834
private:
835
int contextID = -1;
836
int EventID = -1;
837
u32_le bufAddr = 0;
838
SceNetAdhocMatchingContext* context = nullptr;
839
};
840
841
extern int actionAfterAdhocMipsCall;
842
extern int actionAfterMatchingMipsCall;
843
844
#define MAX_SOCKET 255 // FIXME: PSP might not allows more than 255 sockets? Hotshots Tennis doesn't seems to works with socketId > 255
845
#define SOCK_PDP 1
846
#define SOCK_PTP 2
847
// Aux vars
848
extern std::atomic<int> metasocket;
849
extern SceNetAdhocctlParameter parameter;
850
extern SceNetAdhocctlAdhocId product_code;
851
extern std::thread friendFinderThread;
852
extern std::recursive_mutex peerlock;
853
extern AdhocSocket* adhocSockets[MAX_SOCKET];
854
855
union SockAddrIN4 {
856
sockaddr addr;
857
sockaddr_in in;
858
};
859
860
extern uint16_t portOffset;
861
extern uint32_t minSocketTimeoutUS;
862
extern bool isOriPort;
863
extern bool isLocalServer;
864
extern SockAddrIN4 g_adhocServerIP; // Resolved Adhoc Server IP so we don't need to repeatedly resolve the DNS again later
865
extern SockAddrIN4 g_localhostIP; // Used to differentiate localhost IP on multiple-instance
866
extern sockaddr LocalIP; // IP of Network Adapter used to connect to Adhoc Server (LAN/WAN)
867
extern int defaultWlanChannel; // Default WLAN Channel for Auto, JPCSP uses 11
868
869
extern uint32_t fakePoolSize;
870
extern SceNetAdhocMatchingContext * contexts;
871
extern char* dummyPeekBuf64k;
872
extern int dummyPeekBuf64kSize;
873
extern int one;
874
extern std::atomic<bool> friendFinderRunning;
875
extern SceNetAdhocctlPeerInfo * friends;
876
extern SceNetAdhocctlScanInfo * networks;
877
extern u64 adhocctlStartTime;
878
extern bool isAdhocctlNeedLogin;
879
extern bool isAdhocctlBusy;
880
extern int adhocctlState;
881
extern int adhocctlCurrentMode;
882
extern int adhocConnectionType;
883
884
extern int gameModeSocket;
885
extern int gameModeBuffSize;
886
extern u8* gameModeBuffer;
887
extern GameModeArea masterGameModeArea;
888
extern std::vector<GameModeArea> replicaGameModeAreas;
889
extern std::vector<SceNetEtherAddr> requiredGameModeMacs;
890
extern std::vector<SceNetEtherAddr> gameModeMacs;
891
extern std::map<SceNetEtherAddr, u16_le> gameModePeerPorts;
892
// End of Aux vars
893
894
enum AdhocConnectionType : int
895
{
896
ADHOC_CONNECT = 0,
897
ADHOC_CREATE = 1,
898
ADHOC_JOIN = 2,
899
};
900
901
// Check if Matching callback is running
902
bool IsMatchingInCallback(SceNetAdhocMatchingContext * context);
903
bool SetMatchingInCallback(SceNetAdhocMatchingContext* context, bool IsInCB);
904
905
int IsAdhocctlInCallback();
906
int SetAdhocctlInCallback(bool IsInCB);
907
908
/**
909
* Compare MAC Addresses
910
* @param addr1 & addr2 To-be-compared MAC Address
911
* @return True if both matched
912
*/
913
bool isMacMatch(const SceNetEtherAddr* addr1, const SceNetEtherAddr* addr2);
914
915
/**
916
* Local MAC Check
917
* @param saddr To-be-checked MAC Address
918
* @return True if it's local mac
919
*/
920
bool isLocalMAC(const SceNetEtherAddr * addr);
921
922
/**
923
* PDP Port Check
924
* @param port To-be-checked Port
925
* @return 1 if in use or... 0
926
*/
927
bool isPDPPortInUse(uint16_t port);
928
929
/**
930
* Check whether PTP Port is in use or not (only sockets with non-Listening state will be considered as in use)
931
* @param port To-be-checked Port Number
932
* @param forListen to check for listening or non-listening port
933
* @param dstmac destination address (non-listening only)
934
* @param dstport destination port (non-listening only)
935
* @return 1 if in use or... 0
936
*/
937
bool isPTPPortInUse(uint16_t port, bool forListen, SceNetEtherAddr* dstmac = nullptr, uint16_t dstport = 0);
938
939
// Convert IPv4 address to string (Replacement for inet_ntoa since it's getting deprecated)
940
std::string ip2str(in_addr in, bool maskPublicIP = true);
941
942
// Convert MAC address to string
943
std::string mac2str(const SceNetEtherAddr *mac);
944
945
/*
946
* Matching Members
947
*/
948
//SceNetAdhocMatchingMemberInternal* findMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac); // findPeer
949
SceNetAdhocMatchingMemberInternal* addMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac);
950
//void deleteMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac); // deletePeer
951
//void deleteAllMembers(SceNetAdhocMatchingContext * context); // clearPeerList
952
953
954
/**
955
* Add Friend to Local List
956
* @param packet Friend Information
957
*/
958
void addFriend(SceNetAdhocctlConnectPacketS2C * packet);
959
960
/**
961
* Send chat or get that
962
* @param std::string ChatString
963
*/
964
void sendChat(const std::string &chatString);
965
std::vector<std::string> getChatLog();
966
int GetChatChangeID();
967
int GetChatMessageCount();
968
969
/*
970
* Find a Peer/Friend by MAC address
971
*/
972
SceNetAdhocctlPeerInfo * findFriend(SceNetEtherAddr * MAC);
973
974
/*
975
* Find a Peer/Friend by IP address
976
*/
977
SceNetAdhocctlPeerInfo* findFriendByIP(uint32_t ip);
978
979
/**
980
* Get the Readability(ie. recv) and/or Writability(ie. send) of a socket
981
* @param fd File Descriptor of the socket
982
* @param timeout in usec (micro seconds), 0 = non-blocking
983
* @return > 0 = ready, 0 = timeout, -1 = error (errorcode only represent error of select and doesn't represent error of the socket)
984
*/
985
int IsSocketReady(int fd, bool readfd, bool writefd, int* errorcode = nullptr, int timeoutUS = 0);
986
987
/**
988
* Changes the Blocking Mode of the socket
989
* @param fd File Descriptor of the socket
990
* @param nonblocking 1 to set to nonblock and 0 to set blocking
991
*/
992
void changeBlockingMode(int fd, int nonblocking);
993
994
/**
995
* Count Virtual Networks by analyzing the Friend List
996
* @return Number of Virtual Networks
997
*/
998
int countAvailableNetworks(const bool excludeSelf = false);
999
1000
/*
1001
* Find an existing group in networks
1002
*/
1003
SceNetAdhocctlScanInfo * findGroup(SceNetEtherAddr * MAC);
1004
1005
/*
1006
* Deletes all groups in networks
1007
*/
1008
void freeGroupsRecursive(SceNetAdhocctlScanInfo * node);
1009
1010
/**
1011
* Closes & Deletes all PDP & PTP Sockets
1012
*/
1013
void deleteAllAdhocSockets();
1014
1015
/*
1016
* Deletes all GameMode Buffers
1017
*/
1018
void deleteAllGMB();
1019
1020
/**
1021
* Delete Friend from Local List
1022
* @param ip Friend IP
1023
*/
1024
void deleteFriendByIP(uint32_t ip);
1025
1026
/**
1027
* Recursive Memory Freeing-Helper for Friend-Structures
1028
* @param node Current Node in List
1029
*/
1030
void freeFriendsRecursive(SceNetAdhocctlPeerInfo * node, int32_t* count = nullptr);
1031
1032
void timeoutFriendsRecursive(SceNetAdhocctlPeerInfo * node, int32_t* count = nullptr);
1033
1034
/**
1035
* Friend Finder Thread (Receives Peer Information)
1036
* @param args Length of argp in Bytes (Unused)
1037
* @param argp Argument (Unused)
1038
* @return Unused Value - Return 0
1039
*/
1040
int friendFinder();
1041
1042
/**
1043
* Find Free Matching ID
1044
* @return First unoccupied Matching ID
1045
*/
1046
int findFreeMatchingID();
1047
1048
/**
1049
* Find Internal Matching Context for Matching ID
1050
* @param id Matching ID
1051
* @return Matching Context Pointer or... NULL
1052
*/
1053
SceNetAdhocMatchingContext * findMatchingContext(int id);
1054
1055
// Notifiy Adhocctl Handlers
1056
void notifyAdhocctlHandlers(u32 flag, u32 error);
1057
1058
/*
1059
* Packet Handler
1060
*/
1061
void postAcceptCleanPeerList(SceNetAdhocMatchingContext * context);
1062
void postAcceptAddSiblings(SceNetAdhocMatchingContext * context, int siblingcount, SceNetEtherAddr * siblings);
1063
1064
/*
1065
* Timeout Handler
1066
*/
1067
void handleTimeout(SceNetAdhocMatchingContext * context);
1068
1069
/**
1070
* Clear Thread Stack
1071
* @param context Matching Context Pointer
1072
* @param stack ADHOC_MATCHING_EVENT_STACK or ADHOC_MATCHING_INPUT_STACK
1073
*/
1074
void clearStack(SceNetAdhocMatchingContext * context, int stack);
1075
1076
/**
1077
* Clear Peer List
1078
* @param context Matching Context Pointer
1079
*/
1080
void clearPeerList(SceNetAdhocMatchingContext * context);
1081
1082
/**
1083
* Find Outgoing Request Target Peer
1084
* @param context Matching Context Pointer
1085
* @return Internal Peer Reference or... NULL
1086
*/
1087
SceNetAdhocMatchingMemberInternal * findOutgoingRequest(SceNetAdhocMatchingContext * context);
1088
1089
/**
1090
* Send Accept Message from P2P -> P2P or Parent -> Children
1091
* @param context Matching Context Pointer
1092
* @param peer Target Peer
1093
* @param optlen Optional Data Length
1094
* @param opt Optional Data
1095
*/
1096
void sendAcceptMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);
1097
1098
/**
1099
* Send Join Request from P2P -> P2P or Children -> Parent
1100
* @param context Matching Context Pointer
1101
* @param peer Target Peer
1102
* @param optlen Optional Data Length
1103
* @param opt Optional Data
1104
*/
1105
void sendJoinRequest(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);
1106
1107
/**
1108
* Send Cancel Message to Peer (has various effects)
1109
* @param context Matching Context Pointer
1110
* @param peer Target Peer
1111
* @param optlen Optional Data Length
1112
* @param opt Optional Data
1113
*/
1114
void sendCancelMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);
1115
1116
/**
1117
* Send Bulk Data to Peer
1118
* @param context Matching Context Pointer
1119
* @param peer Target Peer
1120
* @param datalen Data Length
1121
* @param data Data
1122
*/
1123
void sendBulkData(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int datalen, const void * data);
1124
1125
/**
1126
* Abort Bulk Data Transfer (if in progress)
1127
* @param context Matching Context Pointer
1128
* @param peer Target Peer
1129
*/
1130
void abortBulkTransfer(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);
1131
1132
/**
1133
* Notify all established Peers about new Kid in the Neighborhood
1134
* @param context Matching Context Pointer
1135
* @param peer New Kid
1136
*/
1137
void sendBirthMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);
1138
1139
/**
1140
* Notify all established Peers about abandoned Child
1141
* @param context Matching Context Pointer
1142
* @param peer Abandoned Child
1143
*/
1144
void sendDeathMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);
1145
1146
/**
1147
* Count Children Peers (for Parent)
1148
* @param context Matching Context Pointer
1149
* @return Number of Children
1150
*/
1151
s32_le countChildren(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);
1152
1153
/**
1154
* Delete Peer from List
1155
* @param context Matching Context Pointer
1156
* @param peer Internal Peer Reference
1157
*/
1158
void deletePeer(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal *& peer);
1159
1160
/**
1161
* Find Peer in Context by MAC
1162
* @param context Matching Context Pointer
1163
* @param mac Peer MAC Address
1164
* @return Internal Peer Reference or... NULL
1165
*/
1166
SceNetAdhocMatchingMemberInternal * findPeer(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac);
1167
1168
/**
1169
* Find Parent Peer
1170
* @param context Matching Context Pointer
1171
* @return Internal Peer Reference or... NULL
1172
*/
1173
SceNetAdhocMatchingMemberInternal * findParent(SceNetAdhocMatchingContext * context);
1174
1175
/**
1176
* Find P2P Buddy Peer
1177
* @param context Matching Context Pointer
1178
* @return Internal Peer Reference or... NULL
1179
*/
1180
SceNetAdhocMatchingMemberInternal * findP2P(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);
1181
1182
/**
1183
* Return Number of Connected Peers
1184
* @param context Matching Context Pointer
1185
* @return Number of Connected Peers
1186
*/
1187
uint32_t countConnectedPeers(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);
1188
1189
/**
1190
* Spawn Local Event for Event Thread
1191
* @param context Matching Context Pointer
1192
* @param event Event ID
1193
* @param mac Event Source MAC
1194
* @param optlen Optional Data Length
1195
* @param opt Optional Data
1196
*/
1197
void spawnLocalEvent(SceNetAdhocMatchingContext * context, int event, SceNetEtherAddr * mac, int optlen, void * opt);
1198
1199
/*
1200
* Matching Event Thread (Send Ping and Hello Data) Part of AdhocMatching
1201
*/
1202
//int matchingEvent(int matchingId);
1203
//int matchingEventThread(int matchingId); //(uint32_t args, void * argp)
1204
1205
/*
1206
* Matching Input Thread (process Members) Part of AdhocMatching
1207
*/
1208
//int matchingInputThread(int matchingId); //(uint32_t args, void * argp)
1209
1210
/**
1211
* Return Number of active Peers in the same Network as the Local Player
1212
* @return Number of active Peers
1213
*/
1214
int getActivePeerCount(const bool excludeTimedout = true);
1215
1216
/**
1217
* Returns the locall Ip of this machine
1218
* @param SocketAddres OUT: local ip
1219
*/
1220
int getLocalIp(sockaddr_in * SocketAddress);
1221
uint32_t getLocalIp(int sock);
1222
1223
/*
1224
* Check if an IP (big-endian/network order) is Private or Public IP
1225
*/
1226
bool isMulticastIP(uint32_t ip);
1227
1228
/*
1229
* Check if an IP (big-endian/network order) is Private or Public IP
1230
*/
1231
bool isPrivateIP(uint32_t ip);
1232
1233
/*
1234
* Check if an IP (big-endian/network order) is APIPA(169.254.x.x) IP
1235
*/
1236
bool isAPIPA(uint32_t ip);
1237
1238
/*
1239
* Check if an IP (big-endian/network order) is Loopback IP
1240
*/
1241
bool isLoopbackIP(uint32_t ip);
1242
1243
/*
1244
* Check if an IP (big-endian/network order) is a Broadcast IP
1245
* Default subnet mask is 255.255.255.0
1246
*/
1247
bool isBroadcastIP(uint32_t ip, const uint32_t subnetmask = 0x00ffffff);
1248
1249
/*
1250
* Get Number of bytes available in buffer to be Received
1251
* @param sock fd
1252
* @param udpBufferSize (UDP only)
1253
*/
1254
u_long getAvailToRecv(int sock, int udpBufferSize = 0);
1255
1256
/*
1257
* Get UDP Socket Max Message Size
1258
*/
1259
int getSockMaxSize(int udpsock);
1260
1261
/*
1262
* Get Socket Buffer Size (opt = SO_RCVBUF/SO_SNDBUF)
1263
*/
1264
int getSockBufferSize(int sock, int opt);
1265
1266
/*
1267
* Set Socket Buffer Size (opt = SO_RCVBUF/SO_SNDBUF)
1268
*/
1269
int setSockBufferSize(int sock, int opt, int size);
1270
1271
/*
1272
* Set TCP Socket Maximum Segment Size (default is 1460 on 1500 MTU)
1273
*/
1274
int setSockMSS(int sock, int size);
1275
1276
/*
1277
* Set Socket TimeOut (opt = SO_SNDTIMEO/SO_RCVTIMEO)
1278
*/
1279
int setSockTimeout(int sock, int opt, unsigned long timeout_usec);
1280
1281
/*
1282
* Get Socket SO_ERROR (Requests and clears pending error information on the socket)
1283
*/
1284
int getSockError(int sock);
1285
1286
/*
1287
* Get TCP Socket TCP_NODELAY (Nagle Algo)
1288
*/
1289
int getSockNoDelay(int tcpsock);
1290
1291
/*
1292
* Set TCP Socket TCP_NODELAY (Nagle Algo)
1293
*/
1294
int setSockNoDelay(int tcpsock, int flag);
1295
1296
/*
1297
* Set Socket SO_NOSIGPIPE when supported
1298
*/
1299
int setSockNoSIGPIPE(int sock, int flag);
1300
1301
/*
1302
* Set Socket SO_REUSEADDR and SO_REUSEPORT when supported
1303
*/
1304
int setSockReuseAddrPort(int sock);
1305
1306
/*
1307
* Set Socket Connection Reset on UDP (which could cause a strange behavior)
1308
*/
1309
int setUDPConnReset(int udpsock, bool enabled);
1310
1311
/*
1312
* Set Socket KeepAlive (opt = SO_KEEPALIVE)
1313
*/
1314
int setSockKeepAlive(int sock, bool keepalive, const int keepinvl = 60, const int keepcnt = 20, const int keepidle = 180);
1315
1316
/**
1317
* Return the Number of Players with the chosen Nickname in the Local Users current Network
1318
* @param nickname To-be-searched Nickname
1319
* @return Number of matching Players
1320
*/
1321
int getNicknameCount(const char * nickname);
1322
1323
1324
/**
1325
* Joins two 32 bits number into a 64 bit one
1326
* @param num1: first number
1327
* @param num2: second number
1328
* @return Single 64 bit number
1329
*/
1330
#define firstMask 0x00000000FFFFFFFF
1331
#define secondMask 0xFFFFFFFF00000000
1332
u64 join32(u32 num1, u32 num2);
1333
1334
/**
1335
* Splits a 64 bit number into two 32 bit ones
1336
* @param num: The number to be split
1337
* @param buf OUT: Array containing the split numbers
1338
*/
1339
void split64(u64 num, int buff[]);
1340
1341
/**
1342
* Returns the local mac
1343
* @param addr OUT: 6-bytes of Local Mac
1344
*/
1345
void getLocalMac(SceNetEtherAddr * addr);
1346
1347
/*
1348
* Returns the local port used by the socket
1349
*/
1350
uint16_t getLocalPort(int sock);
1351
1352
/**
1353
* PDP Socket Counter
1354
* @return Number of internal PDP Sockets
1355
*/
1356
int getPDPSocketCount();
1357
1358
/**
1359
* PTP Socket Counter
1360
* @return Number of internal PTP Sockets
1361
*/
1362
int getPTPSocketCount();
1363
1364
/**
1365
* Initialize Networking Components for Adhocctl Emulator
1366
* @param adhoc_id Game Product Code
1367
* @param server_ip Server IP
1368
* @return 0 on success or... -1
1369
*/
1370
int initNetwork(SceNetAdhocctlAdhocId *adhocid);
1371
1372
/**
1373
* Zero MAC Check
1374
* @param addr To-be-checked MAC Address
1375
* @return true if MAC is all zeroes
1376
*/
1377
bool isZeroMAC(const SceNetEtherAddr* addr);
1378
1379
/**
1380
* Broadcast MAC Check
1381
* @param addr To-be-checked MAC Address
1382
* @return true if Broadcast MAC or... 0
1383
*/
1384
bool isBroadcastMAC(const SceNetEtherAddr * addr);
1385
1386
/**
1387
* Resolve IP to MAC
1388
* @param ip Peer IP Address
1389
* @param mac OUT: Peer MAC
1390
* @return true on success
1391
*/
1392
bool resolveIP(uint32_t ip, SceNetEtherAddr * mac);
1393
1394
/**
1395
* Resolve MAC to IP
1396
* @param mac Peer MAC Address
1397
* @param ip OUT: Peer IP
1398
* @param port_offset OUT: Peer IP-specific Port Offset
1399
* @return true on success
1400
*/
1401
bool resolveMAC(SceNetEtherAddr* mac, uint32_t* ip, u16* port_offset = nullptr);
1402
1403
/**
1404
* Check whether Network Name contains only valid symbols
1405
* @param group_name To-be-checked Network Name
1406
* @return 1 if valid or... 0
1407
*/
1408
bool validNetworkName(const char *data);
1409
1410
// Convert Matching Event Code to String
1411
const char* getMatchingEventStr(int code);
1412
1413
// Convert Matching Opcode ID to String
1414
const char* getMatchingOpcodeStr(int code);
1415
1416
// Convert adhoc ctl state to string
1417
const char *AdhocCtlStateToString(int state);
1418
1419