CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

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