Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hrydgard
GitHub Repository: hrydgard/ppsspp
Path: blob/master/Core/HLE/proAdhoc.h
5650 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
void *postofficeHandle; // aemu_postoffice mode handle
332
std::thread *connectThread;
333
bool connectThreadDone;
334
int connectThreadResult;
335
} PACK AdhocSocket;
336
337
// Gamemode Optional Peer Buffer Data
338
typedef struct SceNetAdhocGameModeOptData {
339
u32_le size;
340
u32_le flag;
341
u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)
342
} PACK SceNetAdhocGameModeOptData;
343
344
// Gamemode Buffer Status
345
typedef struct SceNetAdhocGameModeBufferStat {
346
struct SceNetAdhocGameModeBufferStat * next; //should be u32_le ?
347
s32_le id;
348
void * ptr; //should be u32_le ?
349
u32_le size;
350
u32_le master;
351
SceNetAdhocGameModeOptData opt;
352
} PACK SceNetAdhocGameModeBufferStat;
353
354
// Adhoc ID (Game Product Key)
355
#define ADHOCCTL_ADHOCID_LEN 9
356
typedef struct SceNetAdhocctlAdhocId {
357
s32_le type; // Air Conflicts - Aces Of World War 2 is using 2 for GameSharing?
358
uint8_t data[ADHOCCTL_ADHOCID_LEN]; // Air Conflicts - Aces Of World War 2 is using "000000001" for GameSharing?
359
uint8_t padding[3];
360
} PACK SceNetAdhocctlAdhocId; // should this be packed?
361
#ifdef _MSC_VER
362
#pragma pack(pop)
363
#endif
364
365
366
// Internal Matching Peer Information
367
typedef struct SceNetAdhocMatchingMemberInternal {
368
// Next Peer
369
struct SceNetAdhocMatchingMemberInternal * next;
370
371
// MAC Address
372
SceNetEtherAddr mac;
373
374
// State Variable
375
s32_le state;
376
377
// Send in Progress
378
s32_le sending;
379
380
// Last Heartbeat
381
u64_le lastping; // May need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)
382
} SceNetAdhocMatchingMemberInternal;
383
384
385
// Matching handler
386
struct SceNetAdhocMatchingHandlerArgs {
387
s32_le id;
388
s32_le opcode; // event;
389
SceNetEtherAddr mac; // peer //u32_le macaddr;
390
s32_le optlen;
391
void * opt; //u32_le optaddr
392
};
393
394
struct SceNetAdhocMatchingHandler {
395
u32_le entryPoint;
396
};
397
398
struct AdhocctlHandler {
399
u32 entryPoint;
400
u32 argument;
401
};
402
403
// Thread Message Stack Item
404
typedef struct ThreadMessage {
405
// Next Thread Message
406
struct ThreadMessage * next;
407
408
// Stack Event Opcode
409
u32_le opcode;
410
411
// Target MAC Address
412
SceNetEtherAddr mac;
413
414
// Optional Data Length
415
s32_le optlen;
416
} ThreadMessage;
417
418
// Established Peer
419
420
// Context Information
421
typedef struct SceNetAdhocMatchingContext {
422
// Next Context
423
struct SceNetAdhocMatchingContext *next;
424
425
// Externally Visible ID
426
s32_le id;
427
428
// Matching Mode (HOST, CLIENT, P2P)
429
s32_le mode;
430
431
// Running Flag (1 = running, 0 = created)
432
s32_le running;
433
434
// Maximum Number of Peers (for HOST, P2P)
435
s32_le maxpeers;
436
437
// Peer List for Connectees
438
SceNetAdhocMatchingMemberInternal *peerlist; // SceNetAdhocMatchingMemberInfo[Emu]
439
440
// Peer Port list
441
std::map<SceNetEtherAddr, u16_le> *peerPort;
442
443
// Local MAC Address
444
SceNetEtherAddr mac;
445
446
// Local PDP Port
447
u16_le port;
448
449
// Local PDP Socket
450
s32_le socket;
451
// Socket Lock
452
std::recursive_mutex *socketlock;
453
454
// Receive Buffer Length
455
s32_le rxbuflen;
456
457
// Receive Buffer
458
uint8_t *rxbuf;
459
460
// Hello Broadcast Interval (Microseconds)
461
u32_le hello_int;
462
463
// Keep-Alive Broadcast Interval (Microseconds)
464
u32_le keepalive_int;
465
466
// Resend Interval (Microseconds)
467
u32_le resend_int;
468
469
// Resend-Counter
470
s32_le resendcounter;
471
472
// Keep-Alive Counter
473
s32_le keepalivecounter;
474
475
// Event Handler
476
SceNetAdhocMatchingHandler handler;
477
478
// Event Handler Args
479
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
480
//SceNetAdhocMatchingHandlerArgs handlerArgs;
481
482
// Hello Data Length
483
s32_le hellolen;
484
485
// Hello Data Address
486
u32_le helloAddr;
487
488
// Hello Data
489
uint8_t *hello;
490
491
// Timeout
492
u64_le timeout;
493
494
// Helper Thread (fake PSP Thread) needed to execute callback
495
//HLEHelperThread *matchingThread;
496
int matching_thid;
497
498
// Event Caller Thread
499
std::thread eventThread;
500
//s32_le event_thid;
501
bool eventRunning = false;
502
bool IsMatchingInCB = false;
503
504
// IO Handler Thread
505
std::thread inputThread;
506
//s32_le input_thid;
507
bool inputRunning = false;
508
509
// Event Caller Thread Message Stack
510
std::recursive_mutex *eventlock; // s32_le event_stack_lock;
511
ThreadMessage *event_stack;
512
513
// IO Handler Thread Message Stack
514
std::recursive_mutex *inputlock; // s32_le input_stack_lock;
515
ThreadMessage *input_stack;
516
517
// Socket Connectivity
518
//bool connected = false;
519
//bool InConnection = false;
520
//u32_le handlerid = -1;
521
//int eventMatchingHandlerUpdate = -1;
522
} SceNetAdhocMatchingContext;
523
524
// End of psp definitions
525
526
const size_t MAX_ADHOCCTL_HANDLERS = 32; //4
527
const size_t MAX_MATCHING_HANDLERS = 32; //4
528
529
enum {
530
/**
531
* Matching events used in pspAdhocMatchingCallback
532
*/
533
/** Hello event. optdata contains data if optlen > 0. */
534
PSP_ADHOC_MATCHING_EVENT_HELLO = 1,
535
/** Join request. optdata contains data if optlen > 0. */
536
PSP_ADHOC_MATCHING_EVENT_JOIN = 2,
537
/** Target left matching. */
538
PSP_ADHOC_MATCHING_EVENT_LEFT = 3,
539
/** Join request rejected. */
540
PSP_ADHOC_MATCHING_EVENT_REJECT = 4,
541
/** Join request cancelled. */
542
PSP_ADHOC_MATCHING_EVENT_CANCEL = 5,
543
/** Join request accepted. optdata contains data if optlen > 0. */
544
PSP_ADHOC_MATCHING_EVENT_ACCEPT = 6,
545
/** Matching is complete. */
546
PSP_ADHOC_MATCHING_EVENT_COMPLETE = 7,
547
/** Ping timeout event. */
548
PSP_ADHOC_MATCHING_EVENT_TIMEOUT = 8,
549
/** Error event. */
550
PSP_ADHOC_MATCHING_EVENT_ERROR = 9,
551
/** Peer disconnect event. */
552
PSP_ADHOC_MATCHING_EVENT_DISCONNECT = 10,
553
/** Data received event. optdata contains data if optlen > 0. */
554
PSP_ADHOC_MATCHING_EVENT_DATA = 11,
555
/** Data acknowledged event. */
556
PSP_ADHOC_MATCHING_EVENT_DATA_CONFIRM = 12,
557
/** Data timeout event. */
558
PSP_ADHOC_MATCHING_EVENT_DATA_TIMEOUT = 13,
559
560
/** Internal ping message. */
561
PSP_ADHOC_MATCHING_EVENT_INTERNAL_PING = 100,
562
563
/**
564
* Matching modes used in sceNetAdhocMatchingCreate
565
*/
566
/** Host */
567
PSP_ADHOC_MATCHING_MODE_HOST = 1,
568
/** Client */
569
PSP_ADHOC_MATCHING_MODE_CLIENT = 2,
570
/** Peer to peer */
571
PSP_ADHOC_MATCHING_MODE_PTP = 3,
572
};
573
574
enum {
575
PSP_ADHOC_POLL_READY_TO_SEND = 1, // POLLIN ?
576
PSP_ADHOC_POLL_DATA_AVAILABLE = 2, // POLLPRI ?
577
PSP_ADHOC_POLL_CAN_CONNECT = 4, // POLLOUT ?
578
PSP_ADHOC_POLL_CAN_ACCEPT = 8, // POLLERR ?
579
};
580
581
// Matching modes
582
#define PSP_ADHOC_MATCHING_MODE_PARENT 1
583
#define PSP_ADHOC_MATCHING_MODE_CHILD 2
584
#define PSP_ADHOC_MATCHING_MODE_P2P 3
585
586
// Matching Events
587
#define PSP_ADHOC_MATCHING_EVENT_HELLO 1 // Should be ignored when Join Request is in progress ?
588
#define PSP_ADHOC_MATCHING_EVENT_REQUEST 2
589
#define PSP_ADHOC_MATCHING_EVENT_LEAVE 3
590
#define PSP_ADHOC_MATCHING_EVENT_DENY 4
591
#define PSP_ADHOC_MATCHING_EVENT_CANCEL 5
592
#define PSP_ADHOC_MATCHING_EVENT_ACCEPT 6
593
#define PSP_ADHOC_MATCHING_EVENT_ESTABLISHED 7 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?
594
#define PSP_ADHOC_MATCHING_EVENT_TIMEOUT 8 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?
595
#define PSP_ADHOC_MATCHING_EVENT_ERROR 9
596
#define PSP_ADHOC_MATCHING_EVENT_BYE 10 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?
597
#define PSP_ADHOC_MATCHING_EVENT_DATA 11
598
#define PSP_ADHOC_MATCHING_EVENT_DATA_ACK 12
599
#define PSP_ADHOC_MATCHING_EVENT_DATA_TIMEOUT 13
600
601
// Peer Status
602
// Offer only seen in P2P and PARENT mode after hello
603
// Parent only seen in CHILD mode after connection accept
604
// Child only seen in PARENT and CHILD mode after connection accept
605
// P2P only seen in P2P mode after connection accept
606
// Requester only seen in P2P and PARENT mode after connection request
607
#define PSP_ADHOC_MATCHING_PEER_OFFER 1
608
#define PSP_ADHOC_MATCHING_PEER_PARENT 2
609
#define PSP_ADHOC_MATCHING_PEER_CHILD 3
610
#define PSP_ADHOC_MATCHING_PEER_P2P 4
611
#define PSP_ADHOC_MATCHING_PEER_INCOMING_REQUEST 5
612
#define PSP_ADHOC_MATCHING_PEER_OUTGOING_REQUEST 6
613
#define PSP_ADHOC_MATCHING_PEER_CANCEL_IN_PROGRESS 7
614
615
// Stack Targets
616
#define PSP_ADHOC_MATCHING_INPUT_STACK 1
617
#define PSP_ADHOC_MATCHING_EVENT_STACK 2
618
619
// Packet Opcodes
620
#define PSP_ADHOC_MATCHING_PACKET_PING 0
621
#define PSP_ADHOC_MATCHING_PACKET_HELLO 1
622
#define PSP_ADHOC_MATCHING_PACKET_JOIN 2
623
#define PSP_ADHOC_MATCHING_PACKET_ACCEPT 3
624
#define PSP_ADHOC_MATCHING_PACKET_CANCEL 4
625
#define PSP_ADHOC_MATCHING_PACKET_BULK 5
626
#define PSP_ADHOC_MATCHING_PACKET_BULK_ABORT 6
627
#define PSP_ADHOC_MATCHING_PACKET_BIRTH 7
628
#define PSP_ADHOC_MATCHING_PACKET_DEATH 8
629
#define PSP_ADHOC_MATCHING_PACKET_BYE 9
630
631
// Pro Adhoc Server Packets Opcodes
632
#define OPCODE_PING 0
633
#define OPCODE_LOGIN 1
634
#define OPCODE_CONNECT 2
635
#define OPCODE_DISCONNECT 3
636
#define OPCODE_SCAN 4
637
#define OPCODE_SCAN_COMPLETE 5
638
#define OPCODE_CONNECT_BSSID 6
639
#define OPCODE_CHAT 7
640
641
// PSP Product Code
642
#define PRODUCT_CODE_LENGTH 9
643
644
#ifdef _MSC_VER
645
#pragma pack(push,1)
646
#endif
647
648
typedef struct {
649
// Game Product Code (ex. ULUS12345)
650
char data[PRODUCT_CODE_LENGTH];
651
} PACK SceNetAdhocctlProductCode;
652
653
// Basic Packet
654
typedef struct {
655
uint8_t opcode;
656
} PACK SceNetAdhocctlPacketBase;
657
658
// C2S Login Packet
659
typedef struct {
660
SceNetAdhocctlPacketBase base;
661
SceNetEtherAddr mac;
662
SceNetAdhocctlNickname name;
663
SceNetAdhocctlProductCode game;
664
} PACK SceNetAdhocctlLoginPacketC2S;
665
666
// C2S Connect Packet
667
typedef struct {
668
SceNetAdhocctlPacketBase base;
669
SceNetAdhocctlGroupName group;
670
} PACK SceNetAdhocctlConnectPacketC2S;
671
672
#define ADHOCCTL_MESSAGE_LEN 64
673
// C2S Chat Packet
674
typedef struct {
675
SceNetAdhocctlPacketBase base;
676
char message[ADHOCCTL_MESSAGE_LEN];
677
} PACK SceNetAdhocctlChatPacketC2S;
678
679
// S2C Connect Packet
680
typedef struct {
681
SceNetAdhocctlPacketBase base;
682
SceNetAdhocctlNickname name;
683
SceNetEtherAddr mac;
684
uint32_t ip;
685
} PACK SceNetAdhocctlConnectPacketS2C;
686
687
// S2C Disconnect Packet
688
typedef struct {
689
SceNetAdhocctlPacketBase base;
690
uint32_t ip;
691
} PACK SceNetAdhocctlDisconnectPacketS2C;
692
693
// S2C Scan Packet
694
typedef struct {
695
SceNetAdhocctlPacketBase base;
696
SceNetAdhocctlGroupName group;
697
SceNetEtherAddr mac;
698
} PACK SceNetAdhocctlScanPacketS2C;
699
700
// S2C Connect BSSID Packet
701
typedef struct {
702
SceNetAdhocctlPacketBase base;
703
SceNetEtherAddr mac;
704
} PACK SceNetAdhocctlConnectBSSIDPacketS2C;
705
706
// S2C Chat Packet
707
typedef struct {
708
SceNetAdhocctlChatPacketC2S base;
709
SceNetAdhocctlNickname name;
710
} PACK SceNetAdhocctlChatPacketS2C;
711
712
// P2P Packet
713
typedef struct {
714
SceNetEtherAddr fromMAC;
715
SceNetEtherAddr toMAC;
716
u32_le dataPtr; //void * data
717
} PACK SceNetAdhocMatchingPacketBase;
718
719
// P2P Accept Packet
720
typedef struct {
721
SceNetAdhocctlPacketBase base; //opcode
722
u32_le dataLen;
723
u32_le numMACs; //number of peers
724
u32_le dataPtr; //void * data
725
/*u32_le*/PSPPointer<SceNetEtherAddr> MACsPtr; //peers //SceNetEtherAddr * MACs
726
} PACK SceNetAdhocMatchingPacketAccept;
727
728
#ifdef _MSC_VER
729
#pragma pack(pop)
730
#endif
731
732
class PointerWrap;
733
734
class AfterAdhocMipsCall : public PSPAction {
735
public:
736
AfterAdhocMipsCall() {}
737
static PSPAction* Create() { return new AfterAdhocMipsCall(); }
738
void DoState(PointerWrap& p) override;
739
void run(MipsCall& call) override;
740
void SetData(int handlerID, int eventId, u32_le argsAddr);
741
742
private:
743
int HandlerID = -1;
744
int EventID = -1;
745
u32_le argsAddr = 0;
746
};
747
748
class AfterMatchingMipsCall : public PSPAction {
749
public:
750
AfterMatchingMipsCall() {}
751
static PSPAction *Create() { return new AfterMatchingMipsCall(); }
752
void DoState(PointerWrap &p) override;
753
void run(MipsCall &call) override;
754
void SetData(int ContextID, int eventId, u32_le BufAddr);
755
756
private:
757
int contextID = -1;
758
int EventID = -1;
759
u32_le bufAddr = 0;
760
SceNetAdhocMatchingContext* context = nullptr;
761
};
762
763
extern int actionAfterAdhocMipsCall;
764
extern int actionAfterMatchingMipsCall;
765
766
#define MAX_SOCKET 255 // FIXME: PSP might not allows more than 255 sockets? Hotshots Tennis doesn't seems to works with socketId > 255
767
#define SOCK_PDP 1
768
#define SOCK_PTP 2
769
// Aux vars
770
extern std::atomic<int> metasocket;
771
extern SceNetAdhocctlParameter parameter;
772
extern SceNetAdhocctlAdhocId product_code;
773
extern std::thread friendFinderThread;
774
extern std::recursive_mutex peerlock;
775
extern AdhocSocket* adhocSockets[MAX_SOCKET];
776
777
union SockAddrIN4 {
778
sockaddr addr;
779
sockaddr_in in;
780
};
781
782
extern uint16_t portOffset;
783
extern uint32_t minSocketTimeoutUS;
784
extern bool isOriPort;
785
extern bool isLocalServer;
786
extern SockAddrIN4 g_adhocServerIP; // Resolved Adhoc Server IP so we don't need to repeatedly resolve the DNS again later
787
extern SockAddrIN4 g_localhostIP; // Used to differentiate localhost IP on multiple-instance
788
extern sockaddr LocalIP; // IP of Network Adapter used to connect to Adhoc Server (LAN/WAN)
789
extern int defaultWlanChannel; // Default WLAN Channel for Auto, JPCSP uses 11
790
791
extern uint32_t fakePoolSize;
792
extern SceNetAdhocMatchingContext * contexts;
793
extern char* dummyPeekBuf64k;
794
extern int dummyPeekBuf64kSize;
795
extern int one;
796
extern std::atomic<bool> friendFinderRunning;
797
extern SceNetAdhocctlPeerInfo * friends;
798
extern SceNetAdhocctlScanInfo * networks;
799
extern u64 adhocctlStartTime;
800
extern bool isAdhocctlNeedLogin;
801
extern bool isAdhocctlBusy;
802
extern int adhocctlState;
803
extern int adhocctlCurrentMode;
804
extern int adhocConnectionType;
805
806
extern int gameModeSocket;
807
extern int gameModeBuffSize;
808
extern u8* gameModeBuffer;
809
extern GameModeArea masterGameModeArea;
810
extern std::vector<GameModeArea> replicaGameModeAreas;
811
extern std::vector<SceNetEtherAddr> requiredGameModeMacs;
812
extern std::vector<SceNetEtherAddr> gameModeMacs;
813
extern std::map<SceNetEtherAddr, u16_le> gameModePeerPorts;
814
// End of Aux vars
815
816
enum AdhocConnectionType : int
817
{
818
ADHOC_CONNECT = 0,
819
ADHOC_CREATE = 1,
820
ADHOC_JOIN = 2,
821
};
822
823
// Check if Matching callback is running
824
bool IsMatchingInCallback(SceNetAdhocMatchingContext * context);
825
bool SetMatchingInCallback(SceNetAdhocMatchingContext* context, bool IsInCB);
826
827
int IsAdhocctlInCallback();
828
int SetAdhocctlInCallback(bool IsInCB);
829
830
/**
831
* Compare MAC Addresses
832
* @param addr1 & addr2 To-be-compared MAC Address
833
* @return True if both matched
834
*/
835
bool isMacMatch(const SceNetEtherAddr* addr1, const SceNetEtherAddr* addr2);
836
837
/**
838
* Local MAC Check
839
* @param saddr To-be-checked MAC Address
840
* @return True if it's local mac
841
*/
842
bool isLocalMAC(const SceNetEtherAddr * addr);
843
844
/**
845
* PDP Port Check
846
* @param port To-be-checked Port
847
* @return 1 if in use or... 0
848
*/
849
bool isPDPPortInUse(uint16_t port);
850
851
/**
852
* Check whether PTP Port is in use or not (only sockets with non-Listening state will be considered as in use)
853
* @param port To-be-checked Port Number
854
* @param forListen to check for listening or non-listening port
855
* @param dstmac destination address (non-listening only)
856
* @param dstport destination port (non-listening only)
857
* @return 1 if in use or... 0
858
*/
859
bool isPTPPortInUse(uint16_t port, bool forListen, SceNetEtherAddr* dstmac = nullptr, uint16_t dstport = 0);
860
861
// Convert IPv4 address to string (Replacement for inet_ntoa since it's getting deprecated)
862
std::string ip2str(in_addr in, bool maskPublicIP = true);
863
864
// Convert MAC address to string
865
std::string mac2str(const SceNetEtherAddr *mac);
866
867
/*
868
* Matching Members
869
*/
870
//SceNetAdhocMatchingMemberInternal* findMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac); // findPeer
871
SceNetAdhocMatchingMemberInternal* addMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac);
872
//void deleteMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac); // deletePeer
873
//void deleteAllMembers(SceNetAdhocMatchingContext * context); // clearPeerList
874
875
876
/**
877
* Add Friend to Local List
878
* @param packet Friend Information
879
*/
880
void addFriend(SceNetAdhocctlConnectPacketS2C * packet);
881
882
/**
883
* Send chat or get that
884
* @param std::string ChatString
885
*/
886
void sendChat(const std::string &chatString);
887
std::vector<std::string> getChatLog();
888
int GetChatChangeID();
889
int GetChatMessageCount();
890
891
/*
892
* Find a Peer/Friend by MAC address
893
*/
894
SceNetAdhocctlPeerInfo * findFriend(SceNetEtherAddr * MAC);
895
896
/*
897
* Find a Peer/Friend by IP address
898
*/
899
SceNetAdhocctlPeerInfo* findFriendByIP(uint32_t ip);
900
901
/**
902
* Get the Readability(ie. recv) and/or Writability(ie. send) of a socket
903
* @param fd File Descriptor of the socket
904
* @param timeout in usec (micro seconds), 0 = non-blocking
905
* @return > 0 = ready, 0 = timeout, -1 = error (errorcode only represent error of select and doesn't represent error of the socket)
906
*/
907
int IsSocketReady(int fd, bool readfd, bool writefd, int* errorcode = nullptr, int timeoutUS = 0);
908
909
/**
910
* Changes the Blocking Mode of the socket
911
* @param fd File Descriptor of the socket
912
* @param nonblocking 1 to set to nonblock and 0 to set blocking
913
*/
914
void changeBlockingMode(int fd, int nonblocking);
915
916
/**
917
* Count Virtual Networks by analyzing the Friend List
918
* @return Number of Virtual Networks
919
*/
920
int countAvailableNetworks(const bool excludeSelf = false);
921
922
/*
923
* Find an existing group in networks
924
*/
925
SceNetAdhocctlScanInfo * findGroup(SceNetEtherAddr * MAC);
926
927
/*
928
* Deletes all groups in networks
929
*/
930
void freeGroupsRecursive(SceNetAdhocctlScanInfo * node);
931
932
/**
933
* Closes & Deletes all PDP & PTP Sockets
934
*/
935
void deleteAllAdhocSockets();
936
937
/*
938
* Deletes all GameMode Buffers
939
*/
940
void deleteAllGMB();
941
942
/**
943
* Delete Friend from Local List
944
* @param ip Friend IP
945
*/
946
void deleteFriendByIP(uint32_t ip);
947
948
/**
949
* Recursive Memory Freeing-Helper for Friend-Structures
950
* @param node Current Node in List
951
*/
952
void freeFriendsRecursive(SceNetAdhocctlPeerInfo * node, int32_t* count = nullptr);
953
954
void timeoutFriendsRecursive(SceNetAdhocctlPeerInfo * node, int32_t* count = nullptr);
955
956
/**
957
* Friend Finder Thread (Receives Peer Information)
958
* @param args Length of argp in Bytes (Unused)
959
* @param argp Argument (Unused)
960
* @return Unused Value - Return 0
961
*/
962
int friendFinder();
963
964
/**
965
* Find Free Matching ID
966
* @return First unoccupied Matching ID
967
*/
968
int findFreeMatchingID();
969
970
/**
971
* Find Internal Matching Context for Matching ID
972
* @param id Matching ID
973
* @return Matching Context Pointer or... NULL
974
*/
975
SceNetAdhocMatchingContext * findMatchingContext(int id);
976
977
// Notifiy Adhocctl Handlers
978
void notifyAdhocctlHandlers(u32 flag, u32 error);
979
980
/*
981
* Packet Handler
982
*/
983
void postAcceptCleanPeerList(SceNetAdhocMatchingContext * context);
984
void postAcceptAddSiblings(SceNetAdhocMatchingContext * context, int siblingcount, SceNetEtherAddr * siblings);
985
986
/*
987
* Timeout Handler
988
*/
989
void handleTimeout(SceNetAdhocMatchingContext * context);
990
991
/**
992
* Clear Thread Stack
993
* @param context Matching Context Pointer
994
* @param stack ADHOC_MATCHING_EVENT_STACK or ADHOC_MATCHING_INPUT_STACK
995
*/
996
void clearStack(SceNetAdhocMatchingContext * context, int stack);
997
998
/**
999
* Clear Peer List
1000
* @param context Matching Context Pointer
1001
*/
1002
void clearPeerList(SceNetAdhocMatchingContext * context);
1003
1004
/**
1005
* Find Outgoing Request Target Peer
1006
* @param context Matching Context Pointer
1007
* @return Internal Peer Reference or... NULL
1008
*/
1009
SceNetAdhocMatchingMemberInternal * findOutgoingRequest(SceNetAdhocMatchingContext * context);
1010
1011
/**
1012
* Send Accept Message from P2P -> P2P or Parent -> Children
1013
* @param context Matching Context Pointer
1014
* @param peer Target Peer
1015
* @param optlen Optional Data Length
1016
* @param opt Optional Data
1017
*/
1018
void sendAcceptMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);
1019
1020
/**
1021
* Send Join Request from P2P -> P2P or Children -> Parent
1022
* @param context Matching Context Pointer
1023
* @param peer Target Peer
1024
* @param optlen Optional Data Length
1025
* @param opt Optional Data
1026
*/
1027
void sendJoinRequest(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);
1028
1029
/**
1030
* Send Cancel Message to Peer (has various effects)
1031
* @param context Matching Context Pointer
1032
* @param peer Target Peer
1033
* @param optlen Optional Data Length
1034
* @param opt Optional Data
1035
*/
1036
void sendCancelMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);
1037
1038
/**
1039
* Send Bulk Data to Peer
1040
* @param context Matching Context Pointer
1041
* @param peer Target Peer
1042
* @param datalen Data Length
1043
* @param data Data
1044
*/
1045
void sendBulkData(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int datalen, const void * data);
1046
1047
/**
1048
* Abort Bulk Data Transfer (if in progress)
1049
* @param context Matching Context Pointer
1050
* @param peer Target Peer
1051
*/
1052
void abortBulkTransfer(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);
1053
1054
/**
1055
* Notify all established Peers about new Kid in the Neighborhood
1056
* @param context Matching Context Pointer
1057
* @param peer New Kid
1058
*/
1059
void sendBirthMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);
1060
1061
/**
1062
* Notify all established Peers about abandoned Child
1063
* @param context Matching Context Pointer
1064
* @param peer Abandoned Child
1065
*/
1066
void sendDeathMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);
1067
1068
/**
1069
* Count Children Peers (for Parent)
1070
* @param context Matching Context Pointer
1071
* @return Number of Children
1072
*/
1073
s32_le countChildren(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);
1074
1075
/**
1076
* Delete Peer from List
1077
* @param context Matching Context Pointer
1078
* @param peer Internal Peer Reference
1079
*/
1080
void deletePeer(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal *& peer);
1081
1082
/**
1083
* Find Peer in Context by MAC
1084
* @param context Matching Context Pointer
1085
* @param mac Peer MAC Address
1086
* @return Internal Peer Reference or... NULL
1087
*/
1088
SceNetAdhocMatchingMemberInternal * findPeer(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac);
1089
1090
/**
1091
* Find Parent Peer
1092
* @param context Matching Context Pointer
1093
* @return Internal Peer Reference or... NULL
1094
*/
1095
SceNetAdhocMatchingMemberInternal * findParent(SceNetAdhocMatchingContext * context);
1096
1097
/**
1098
* Find P2P Buddy Peer
1099
* @param context Matching Context Pointer
1100
* @return Internal Peer Reference or... NULL
1101
*/
1102
SceNetAdhocMatchingMemberInternal * findP2P(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);
1103
1104
/**
1105
* Return Number of Connected Peers
1106
* @param context Matching Context Pointer
1107
* @return Number of Connected Peers
1108
*/
1109
uint32_t countConnectedPeers(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);
1110
1111
/**
1112
* Spawn Local Event for Event Thread
1113
* @param context Matching Context Pointer
1114
* @param event Event ID
1115
* @param mac Event Source MAC
1116
* @param optlen Optional Data Length
1117
* @param opt Optional Data
1118
*/
1119
void spawnLocalEvent(SceNetAdhocMatchingContext * context, int event, SceNetEtherAddr * mac, int optlen, void * opt);
1120
1121
/*
1122
* Matching Event Thread (Send Ping and Hello Data) Part of AdhocMatching
1123
*/
1124
//int matchingEvent(int matchingId);
1125
//int matchingEventThread(int matchingId); //(uint32_t args, void * argp)
1126
1127
/*
1128
* Matching Input Thread (process Members) Part of AdhocMatching
1129
*/
1130
//int matchingInputThread(int matchingId); //(uint32_t args, void * argp)
1131
1132
/**
1133
* Return Number of active Peers in the same Network as the Local Player
1134
* @return Number of active Peers
1135
*/
1136
int getActivePeerCount(const bool excludeTimedout = true);
1137
1138
/**
1139
* Returns the locall Ip of this machine
1140
* @param SocketAddres OUT: local ip
1141
*/
1142
int getLocalIp(sockaddr_in * SocketAddress);
1143
uint32_t getLocalIp(int sock);
1144
1145
/*
1146
* Check if an IP (big-endian/network order) is Private or Public IP
1147
*/
1148
bool isMulticastIP(uint32_t ip);
1149
1150
/*
1151
* Check if an IP (big-endian/network order) is Private or Public IP
1152
*/
1153
bool isPrivateIP(uint32_t ip);
1154
1155
/*
1156
* Check if an IP (big-endian/network order) is APIPA(169.254.x.x) IP
1157
*/
1158
bool isAPIPA(uint32_t ip);
1159
1160
/*
1161
* Check if an IP (big-endian/network order) is Loopback IP
1162
*/
1163
bool isLoopbackIP(uint32_t ip);
1164
1165
/*
1166
* Check if an IP (big-endian/network order) is a Broadcast IP
1167
* Default subnet mask is 255.255.255.0
1168
*/
1169
bool isBroadcastIP(uint32_t ip, const uint32_t subnetmask = 0x00ffffff);
1170
1171
/*
1172
* Get Number of bytes available in buffer to be Received
1173
* @param sock fd
1174
* @param udpBufferSize (UDP only)
1175
*/
1176
u_long getAvailToRecv(int sock, int udpBufferSize = 0);
1177
1178
/*
1179
* Get UDP Socket Max Message Size
1180
*/
1181
int getSockMaxSize(int udpsock);
1182
1183
/*
1184
* Get Socket Buffer Size (opt = SO_RCVBUF/SO_SNDBUF)
1185
*/
1186
int getSockBufferSize(int sock, int opt);
1187
1188
/*
1189
* Set Socket Buffer Size (opt = SO_RCVBUF/SO_SNDBUF)
1190
*/
1191
int setSockBufferSize(int sock, int opt, int size);
1192
1193
/*
1194
* Set TCP Socket Maximum Segment Size (default is 1460 on 1500 MTU)
1195
*/
1196
int setSockMSS(int sock, int size);
1197
1198
/*
1199
* Set Socket TimeOut (opt = SO_SNDTIMEO/SO_RCVTIMEO)
1200
*/
1201
int setSockTimeout(int sock, int opt, unsigned long timeout_usec);
1202
1203
/*
1204
* Get Socket SO_ERROR (Requests and clears pending error information on the socket)
1205
*/
1206
int getSockError(int sock);
1207
1208
/*
1209
* Get TCP Socket TCP_NODELAY (Nagle Algo)
1210
*/
1211
int getSockNoDelay(int tcpsock);
1212
1213
/*
1214
* Set TCP Socket TCP_NODELAY (Nagle Algo)
1215
*/
1216
int setSockNoDelay(int tcpsock, int flag);
1217
1218
/*
1219
* Set Socket SO_NOSIGPIPE when supported
1220
*/
1221
int setSockNoSIGPIPE(int sock, int flag);
1222
1223
/*
1224
* Set Socket SO_REUSEADDR and SO_REUSEPORT when supported
1225
*/
1226
int setSockReuseAddrPort(int sock);
1227
1228
/*
1229
* Set Socket Connection Reset on UDP (which could cause a strange behavior)
1230
*/
1231
int setUDPConnReset(int udpsock, bool enabled);
1232
1233
/*
1234
* Set Socket KeepAlive (opt = SO_KEEPALIVE)
1235
*/
1236
int setSockKeepAlive(int sock, bool keepalive, const int keepinvl = 60, const int keepcnt = 20, const int keepidle = 180);
1237
1238
/**
1239
* Return the Number of Players with the chosen Nickname in the Local Users current Network
1240
* @param nickname To-be-searched Nickname
1241
* @return Number of matching Players
1242
*/
1243
int getNicknameCount(const char * nickname);
1244
1245
1246
/**
1247
* Joins two 32 bits number into a 64 bit one
1248
* @param num1: first number
1249
* @param num2: second number
1250
* @return Single 64 bit number
1251
*/
1252
#define firstMask 0x00000000FFFFFFFF
1253
#define secondMask 0xFFFFFFFF00000000
1254
u64 join32(u32 num1, u32 num2);
1255
1256
/**
1257
* Splits a 64 bit number into two 32 bit ones
1258
* @param num: The number to be split
1259
* @param buf OUT: Array containing the split numbers
1260
*/
1261
void split64(u64 num, int buff[]);
1262
1263
/**
1264
* Returns the local mac
1265
* @param addr OUT: 6-bytes of Local Mac
1266
*/
1267
void getLocalMac(SceNetEtherAddr * addr);
1268
1269
/*
1270
* Returns the local port used by the socket
1271
*/
1272
uint16_t getLocalPort(int sock);
1273
1274
/**
1275
* PDP Socket Counter
1276
* @return Number of internal PDP Sockets
1277
*/
1278
int getPDPSocketCount();
1279
1280
/**
1281
* PTP Socket Counter
1282
* @return Number of internal PTP Sockets
1283
*/
1284
int getPTPSocketCount();
1285
1286
/**
1287
* Initialize Networking Components for Adhocctl Emulator
1288
* @param adhoc_id Game Product Code
1289
* @param server_ip Server IP
1290
* @return 0 on success or... -1
1291
*/
1292
int initNetwork(SceNetAdhocctlAdhocId *adhocid);
1293
1294
/**
1295
* Zero MAC Check
1296
* @param addr To-be-checked MAC Address
1297
* @return true if MAC is all zeroes
1298
*/
1299
bool isZeroMAC(const SceNetEtherAddr* addr);
1300
1301
/**
1302
* Broadcast MAC Check
1303
* @param addr To-be-checked MAC Address
1304
* @return true if Broadcast MAC or... 0
1305
*/
1306
bool isBroadcastMAC(const SceNetEtherAddr * addr);
1307
1308
/**
1309
* Resolve IP to MAC
1310
* @param ip Peer IP Address
1311
* @param mac OUT: Peer MAC
1312
* @return true on success
1313
*/
1314
bool resolveIP(uint32_t ip, SceNetEtherAddr * mac);
1315
1316
/**
1317
* Resolve MAC to IP
1318
* @param mac Peer MAC Address
1319
* @param ip OUT: Peer IP
1320
* @param port_offset OUT: Peer IP-specific Port Offset
1321
* @return true on success
1322
*/
1323
bool resolveMAC(SceNetEtherAddr* mac, uint32_t* ip, u16* port_offset = nullptr);
1324
1325
/**
1326
* Check whether Network Name contains only valid symbols
1327
* @param group_name To-be-checked Network Name
1328
* @return 1 if valid or... 0
1329
*/
1330
bool validNetworkName(const char *data);
1331
1332
// Convert Matching Event Code to String
1333
const char* getMatchingEventStr(int code);
1334
1335
// Convert Matching Opcode ID to String
1336
const char* getMatchingOpcodeStr(int code);
1337
1338
// Convert adhoc ctl state to string
1339
const char *AdhocCtlStateToString(int state);
1340
1341