// Copyright (c) 2013- PPSSPP Project.12// This program is free software: you can redistribute it and/or modify3// it under the terms of the GNU General Public License as published by4// the Free Software Foundation, version 2.0 or later versions.56// This program is distributed in the hope that it will be useful,7// but WITHOUT ANY WARRANTY; without even the implied warranty of8// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the9// GNU General Public License 2.0 for more details.1011// A copy of the GPL 2.0 should have been included with the program.12// If not, see http://www.gnu.org/licenses/1314// Official git repository and contact information can be found at15// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.1617#pragma once1819#include "Common/Net/SocketCompat.h"2021#ifdef _MSC_VER22#define PACK // on MSVC we use #pragma pack() instead so let's kill this.23#else24#define PACK __attribute__((packed))25#endif2627#include <atomic>28#include <mutex>29#include <thread>30#include <climits>3132#include "Common/Net/Resolve.h"33#include "Common/Serialize/Serializer.h"34#include "Core/MemMap.h"35#include "Core/HLE/sceKernelThread.h"36#include "Core/HLE/sceKernel.h"37#include "Core/HLE/sceKernelMutex.h"38#include "Core/HLE/sceUtility.h"3940#define IsMatch(buf1, buf2) (memcmp(&buf1, &buf2, sizeof(buf1)) == 0)4142// Server Listening Port43#define SERVER_PORT 273124445// Default GameMode definitions46#define ADHOC_GAMEMODE_PORT 3100047#define GAMEMODE_UPDATE_INTERVAL 500 // 12000 usec on JPCSP, but lower value works better on BattleZone (in order to get full speed 60 FPS)48#define GAMEMODE_INIT_DELAY 1000049#define GAMEMODE_SYNC_TIMEOUT 25000050#define GAMEMODE_WAITID 0x2001 // Just to differentiate WaitID with other ID on WAITTYPE_NET5152// GameMode Type53#define ADHOCCTL_GAMETYPE_1A 154#define ADHOCCTL_GAMETYPE_1B 255#define ADHOCCTL_GAMETYPE_2A 35657// psp strutcs and definitions58#define ADHOCCTL_MODE_NONE -1 // We only use this internally as initial value before attempting to create/connect/join/scan any group59#define ADHOCCTL_MODE_NORMAL 0 // ADHOCCTL_MODE_ADHOC60#define ADHOCCTL_MODE_GAMEMODE 16162// Event Types for Event Handler63#define ADHOCCTL_EVENT_ERROR 0 // Used to pass error code to Adhocctl Handler?64#define ADHOCCTL_EVENT_CONNECT 165#define ADHOCCTL_EVENT_DISCONNECT 266#define ADHOCCTL_EVENT_SCAN 367#define ADHOCCTL_EVENT_GAME 468#define ADHOCCTL_EVENT_DISCOVER 569#define ADHOCCTL_EVENT_WOL 670#define ADHOCCTL_EVENT_WOL_INTERRUPT 77172// Internal Thread States73#define ADHOCCTL_STATE_DISCONNECTED 074#define ADHOCCTL_STATE_CONNECTED 175#define ADHOCCTL_STATE_SCANNING 276#define ADHOCCTL_STATE_GAMEMODE 377#define ADHOCCTL_STATE_DISCOVER 478#define ADHOCCTL_STATE_WOL 57980// ProductType ( extracted from SSID along with ProductId & GroupName, Pattern = "PSP_([AXS])(.........)_([LG])_(.*)" )81#define PSP_ADHOCCTL_TYPE_COMMERCIAL 082#define PSP_ADHOCCTL_TYPE_DEBUG 183#define PSP_ADHOCCTL_TYPE_SYSTEM 2 // Used for GameSharing?8485// Kernel Utility Netconf Adhoc Types86#define UTILITY_NETCONF_TYPE_CONNECT_ADHOC 287#define UTILITY_NETCONF_TYPE_CREATE_ADHOC 488#define UTILITY_NETCONF_TYPE_JOIN_ADHOC 58990// Kernel Utility States91#define UTILITY_NETCONF_STATUS_NONE 092#define UTILITY_NETCONF_STATUS_INITIALIZE 193#define UTILITY_NETCONF_STATUS_RUNNING 294#define UTILITY_NETCONF_STATUS_FINISHED 395#define UTILITY_NETCONF_STATUS_SHUTDOWN 49697// Event Flags98#define ADHOC_EV_SEND 0x000199#define ADHOC_EV_RECV 0x0002100#define ADHOC_EV_CONNECT 0x0004101#define ADHOC_EV_ACCEPT 0x0008102#define ADHOC_EV_FLUSH 0x0010103#define ADHOC_EV_INVALID 0x0100 // ignored on events but can be raised on revents? similar to POLLNVAL on posix poll?104#define ADHOC_EV_DELETE 0x0200 // ignored on events but can be raised on revents? similar to POLLERR on posix poll?105#define ADHOC_EV_ALERT 0x0400106#define ADHOC_EV_DISCONNECT 0x0800 // ignored on events but can be raised on revents? similar to POLLHUP on posix poll?107108// PTP Connection States109#define ADHOC_PTP_STATE_CLOSED 0110#define ADHOC_PTP_STATE_LISTEN 1111#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 -> Established112#define ADHOC_PTP_STATE_SYN_RCVD 3113#define ADHOC_PTP_STATE_ESTABLISHED 4114115// Nonblocking Flag for Adhoc socket API116#define ADHOC_F_NONBLOCK 0x0001117// Alert Flags118#define ADHOC_F_ALERTSEND 0x0010119#define ADHOC_F_ALERTRECV 0x0020120#define ADHOC_F_ALERTPOLL 0x0040121#define ADHOC_F_ALERTCONNECT 0x0080122#define ADHOC_F_ALERTACCEPT 0x0100123#define ADHOC_F_ALERTFLUSH 0x0200124#define ADHOC_F_ALERTALL (ADHOC_F_ALERTSEND | ADHOC_F_ALERTRECV | ADHOC_F_ALERTPOLL | ADHOC_F_ALERTCONNECT | ADHOC_F_ALERTACCEPT | ADHOC_F_ALERTFLUSH)125126/* PDP Maximum Fragment Size */127#define PSP_ADHOC_PDP_MFS 1444128129/* PDP Maximum Transfer Unit */130#define PSP_ADHOC_PDP_MTU 65523131132/* PTP Maximum Segment Size */133#define PSP_ADHOC_PTP_MSS 1444134135/* GameMode Optional Data */136#define ADHOC_GAMEMODE_F_UPDATE 0x00000001137138// Timeouts139#define PSP_ADHOCCTL_RECV_TIMEOUT 100000140#define PSP_ADHOCCTL_PING_TIMEOUT 2000000141142#ifdef _MSC_VER143#pragma pack(push, 1)144#endif145// Ethernet Address146#define ETHER_ADDR_LEN 6147typedef struct SceNetEtherAddr {148uint8_t data[ETHER_ADDR_LEN];149} PACK SceNetEtherAddr;150151inline bool operator<(const SceNetEtherAddr& lhs, const SceNetEtherAddr& rhs) {152uint64_t l = 0;153uint64_t r = 0;154const uint8_t* lp = lhs.data;155const uint8_t* rp = rhs.data;156for (int8_t i = 5; i >= 0; i--) {157int8_t sb = (CHAR_BIT * i);158l |= (uint64_t)*lp++ << sb;159r |= (uint64_t)*rp++ << sb;160}161return (l < r);162}163164// Broadcast MAC165extern uint8_t broadcastMAC[ETHER_ADDR_LEN];166167// Malloc Pool Information168typedef struct SceNetMallocStat {169s32_le pool; // On Vantage Master Portable this is 0x1ffe0 on sceNetGetMallocStat, while the poolSize arg on sceNetInit was 0x20000170s32_le maximum; // On Vantage Master Portable this is 0x4050, Footprint of Highest amount allocated so far?171s32_le free; // On Vantage Master Portable this is 0x1f300, VMP compares this value with required size before sending data172} PACK SceNetMallocStat;173174// Adhoc Virtual Network Name175#define ADHOCCTL_GROUPNAME_LEN 8176typedef struct SceNetAdhocctlGroupName {177uint8_t data[ADHOCCTL_GROUPNAME_LEN];178} PACK SceNetAdhocctlGroupName;179180// Virtual Network Host Information181typedef struct SceNetAdhocctlBSSId {182SceNetEtherAddr mac_addr;183uint8_t padding[2];184} PACK SceNetAdhocctlBSSId;185186// Virtual Network Information187typedef struct SceNetAdhocctlScanInfo {188struct SceNetAdhocctlScanInfo * next;189s32_le channel;190SceNetAdhocctlGroupName group_name;191SceNetAdhocctlBSSId bssid;192s32_le mode;193} PACK SceNetAdhocctlScanInfo;194195// Virtual Network Information with u32 pointers196typedef struct SceNetAdhocctlScanInfoEmu {197u32_le next;198s32_le channel;199SceNetAdhocctlGroupName group_name;200SceNetAdhocctlBSSId bssid;201s32_le mode;202} PACK SceNetAdhocctlScanInfoEmu;203204// Player Nickname205#define ADHOCCTL_NICKNAME_LEN 128206typedef struct SceNetAdhocctlNickname {207uint8_t data[ADHOCCTL_NICKNAME_LEN];208} PACK SceNetAdhocctlNickname;209210// Active Virtual Network Information (Adhoc Group Host/Creator's device info, similar to AP?)211typedef struct SceNetAdhocctlParameter {212s32_le channel;213SceNetAdhocctlGroupName group_name; // This group name is probably similar to SSID name on AP214SceNetAdhocctlNickname 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)215SceNetAdhocctlBSSId bssid; // FIXME: bssid and nickname position might be swapped on older/newer firmware?216} PACK SceNetAdhocctlParameter;217218// Peer Information (internal use only)219typedef struct SceNetAdhocctlPeerInfo {220SceNetAdhocctlPeerInfo * next;221SceNetAdhocctlNickname nickname;222SceNetEtherAddr mac_addr;223u16_le padding; // a copy of the padding(?) from SceNetAdhocctlPeerInfoEmu224u32_le flags;225u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)226227u32_le ip_addr; // internal use only228u16_le port_offset; // IP-specific port offset (internal use only)229} PACK SceNetAdhocctlPeerInfo;230231// Peer Information with u32 pointers232typedef struct SceNetAdhocctlPeerInfoEmu {233u32_le next; // Changed the pointer to u32234SceNetAdhocctlNickname nickname;235SceNetEtherAddr mac_addr;236u16_le padding; //00 00 // Note: Not sure whether this is really padding or reserved/unknown field237u32_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 ?238u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)239} PACK SceNetAdhocctlPeerInfoEmu;240241// Member Information242typedef struct SceNetAdhocMatchingMemberInfo {243SceNetAdhocMatchingMemberInfo * next;244SceNetEtherAddr mac_addr;245uint8_t padding[2];246} PACK SceNetAdhocctlMemberInfo;247248// Member Information with u32 pointers249typedef struct SceNetAdhocMatchingMemberInfoEmu {250u32_le next; // Changed the pointer to u32251SceNetEtherAddr mac_addr;252uint8_t padding[2];253} PACK SceNetAdhocctlMemberInfoEmu;254255// Game Mode Peer List256#define ADHOCCTL_GAMEMODE_MAX_MEMBERS 16257typedef struct SceNetAdhocctlGameModeInfo {258s32_le num;259SceNetEtherAddr members[ADHOCCTL_GAMEMODE_MAX_MEMBERS];260} PACK SceNetAdhocctlGameModeInfo;261262// GameModeUpdateInfo263typedef struct GameModeUpdateInfo {264u32_le length; //size of GameModeUpdateInfo (16 bytes)265s32_le updated;266u64_le timeStamp;267} PACK GameModeUpdateInfo;268269// GameModeArea (Internal use only)270typedef struct GameModeArea {271int id; // started from 1 for replica? master = 0 or -1?272int size;273u32 addr;274//int socket; // PDP socket?275u64 updateTimestamp;276int dataUpdated;277int dataSent;278SceNetEtherAddr mac;279u8* data; // upto "size" bytes started from "addr" ?280} PACK GameModeArea;281282// Socket Polling Event Listener283typedef struct SceNetAdhocPollSd{284s32_le id;285s32_le events;286s32_le revents;287} PACK SceNetAdhocPollSd;288289// PDP Socket Status290typedef struct SceNetAdhocPdpStat {291u32_le next;292s32_le id; // posix socket id293SceNetEtherAddr laddr;294u16_le lport;295u32_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?296} PACK SceNetAdhocPdpStat;297298// PTP Socket Status299typedef struct SceNetAdhocPtpStat {300u32_le next; // Changed the pointer to u32301s32_le id; // posix socket id302SceNetEtherAddr laddr;303SceNetEtherAddr paddr;304u16_le lport;305u16_le pport;306u32_le snd_sb_cc; // Number of bytes existed in sendBuffer to be sent/flushed307u32_le rcv_sb_cc; // Number of bytes available in recvBuffer to be received308s32_le state;309} PACK SceNetAdhocPtpStat;310311// PDP & PTP Socket Union (Internal use only)312typedef struct AdhocSocket {313s32_le type; // SOCK_PDP/SOCK_PTP314s32_le flags; // Socket Alert Flags315s32_le alerted_flags; // Socket Alerted Flags316s32_le nonblocking; // last non-blocking flag317u32 buffer_size;318u32 send_timeout; // default connect timeout319u32 recv_timeout; // default accept timeout320s32 retry_interval; // related to keepalive321s32 retry_count; // multiply with retry interval to be used as keepalive timeout322s32 attemptCount; // connect/accept attempts323u64 lastAttempt; // timestamp to retry again (attempted by the game)324u64 internalLastAttempt; // timestamp to retry again (internal use only)325bool isClient; // true if the game is using local port 0 when creating the socket326union {327SceNetAdhocPdpStat pdp;328SceNetAdhocPtpStat ptp;329} data;330} PACK AdhocSocket;331332// Gamemode Optional Peer Buffer Data333typedef struct SceNetAdhocGameModeOptData {334u32_le size;335u32_le flag;336u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)337} PACK SceNetAdhocGameModeOptData;338339// Gamemode Buffer Status340typedef struct SceNetAdhocGameModeBufferStat {341struct SceNetAdhocGameModeBufferStat * next; //should be u32_le ?342s32_le id;343void * ptr; //should be u32_le ?344u32_le size;345u32_le master;346SceNetAdhocGameModeOptData opt;347} PACK SceNetAdhocGameModeBufferStat;348349// Adhoc ID (Game Product Key)350#define ADHOCCTL_ADHOCID_LEN 9351typedef struct SceNetAdhocctlAdhocId {352s32_le type; // Air Conflicts - Aces Of World War 2 is using 2 for GameSharing?353uint8_t data[ADHOCCTL_ADHOCID_LEN]; // Air Conflicts - Aces Of World War 2 is using "000000001" for GameSharing?354uint8_t padding[3];355} PACK SceNetAdhocctlAdhocId; // should this be packed?356#ifdef _MSC_VER357#pragma pack(pop)358#endif359360361// Internal Matching Peer Information362typedef struct SceNetAdhocMatchingMemberInternal {363// Next Peer364struct SceNetAdhocMatchingMemberInternal * next;365366// MAC Address367SceNetEtherAddr mac;368369// State Variable370s32_le state;371372// Send in Progress373s32_le sending;374375// Last Heartbeat376u64_le lastping; // May need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)377} SceNetAdhocMatchingMemberInternal;378379380// Matching handler381struct SceNetAdhocMatchingHandlerArgs {382s32_le id;383s32_le opcode; // event;384SceNetEtherAddr mac; // peer //u32_le macaddr;385s32_le optlen;386void * opt; //u32_le optaddr387};388389struct SceNetAdhocMatchingHandler {390u32_le entryPoint;391};392393struct AdhocctlHandler {394u32 entryPoint;395u32 argument;396};397398// Thread Message Stack Item399typedef struct ThreadMessage {400// Next Thread Message401struct ThreadMessage * next;402403// Stack Event Opcode404u32_le opcode;405406// Target MAC Address407SceNetEtherAddr mac;408409// Optional Data Length410s32_le optlen;411} ThreadMessage;412413// Established Peer414415// Context Information416typedef struct SceNetAdhocMatchingContext {417// Next Context418struct SceNetAdhocMatchingContext *next;419420// Externally Visible ID421s32_le id;422423// Matching Mode (HOST, CLIENT, P2P)424s32_le mode;425426// Running Flag (1 = running, 0 = created)427s32_le running;428429// Maximum Number of Peers (for HOST, P2P)430s32_le maxpeers;431432// Peer List for Connectees433SceNetAdhocMatchingMemberInternal *peerlist; // SceNetAdhocMatchingMemberInfo[Emu]434435// Peer Port list436std::map<SceNetEtherAddr, u16_le> *peerPort;437438// Local MAC Address439SceNetEtherAddr mac;440441// Local PDP Port442u16_le port;443444// Local PDP Socket445s32_le socket;446// Socket Lock447std::recursive_mutex *socketlock;448449// Receive Buffer Length450s32_le rxbuflen;451452// Receive Buffer453uint8_t *rxbuf;454455// Hello Broadcast Interval (Microseconds)456u32_le hello_int;457458// Keep-Alive Broadcast Interval (Microseconds)459u32_le keepalive_int;460461// Resend Interval (Microseconds)462u32_le resend_int;463464// Resend-Counter465s32_le resendcounter;466467// Keep-Alive Counter468s32_le keepalivecounter;469470// Event Handler471SceNetAdhocMatchingHandler handler;472473// Event Handler Args474u32_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 later475//SceNetAdhocMatchingHandlerArgs handlerArgs;476477// Hello Data Length478s32_le hellolen;479480// Hello Data Address481u32_le helloAddr;482483// Hello Data484uint8_t *hello;485486// Timeout487u64_le timeout;488489// Helper Thread (fake PSP Thread) needed to execute callback490//HLEHelperThread *matchingThread;491int matching_thid;492493// Event Caller Thread494std::thread eventThread;495//s32_le event_thid;496bool eventRunning = false;497bool IsMatchingInCB = false;498499// IO Handler Thread500std::thread inputThread;501//s32_le input_thid;502bool inputRunning = false;503504// Event Caller Thread Message Stack505std::recursive_mutex *eventlock; // s32_le event_stack_lock;506ThreadMessage *event_stack;507508// IO Handler Thread Message Stack509std::recursive_mutex *inputlock; // s32_le input_stack_lock;510ThreadMessage *input_stack;511512// Socket Connectivity513//bool connected = false;514//bool InConnection = false;515//u32_le handlerid = -1;516//int eventMatchingHandlerUpdate = -1;517} SceNetAdhocMatchingContext;518519// End of psp definitions520521enum {522// pspnet_adhoc_auth523ERROR_NET_ADHOC_AUTH_ALREADY_INITIALIZED = 0x80410601,524525// pspnet_adhoc526ERROR_NET_ADHOC_INVALID_SOCKET_ID = 0x80410701,527ERROR_NET_ADHOC_INVALID_ADDR = 0x80410702,528ERROR_NET_ADHOC_INVALID_PORT = 0x80410703,529ERROR_NET_ADHOC_INVALID_BUFLEN = 0x80410704,530ERROR_NET_ADHOC_INVALID_DATALEN = 0x80410705,531ERROR_NET_ADHOC_NOT_ENOUGH_SPACE = 0x80400706, // not a typo532ERROR_NET_ADHOC_SOCKET_DELETED = 0x80410707,533ERROR_NET_ADHOC_SOCKET_ALERTED = 0x80410708,534ERROR_NET_ADHOC_WOULD_BLOCK = 0x80410709, //ERROR_NET_ADHOC_NO_DATA_AVAILABLE535ERROR_NET_ADHOC_PORT_IN_USE = 0x8041070a,536ERROR_NET_ADHOC_NOT_CONNECTED = 0x8041070B,537ERROR_NET_ADHOC_DISCONNECTED = 0x8041070c,538ERROR_NET_ADHOC_NOT_OPENED = 0x8040070D, // not a typo539ERROR_NET_ADHOC_NOT_LISTENED = 0x8040070E, // not a typo540ERROR_NET_ADHOC_SOCKET_ID_NOT_AVAIL = 0x8041070F,541ERROR_NET_ADHOC_PORT_NOT_AVAIL = 0x80410710,542ERROR_NET_ADHOC_INVALID_ARG = 0x80410711,543ERROR_NET_ADHOC_NOT_INITIALIZED = 0x80410712,544ERROR_NET_ADHOC_ALREADY_INITIALIZED = 0x80410713,545ERROR_NET_ADHOC_BUSY = 0x80410714,546ERROR_NET_ADHOC_TIMEOUT = 0x80410715,547ERROR_NET_ADHOC_NO_ENTRY = 0x80410716,548ERROR_NET_ADHOC_EXCEPTION_EVENT = 0x80410717,549ERROR_NET_ADHOC_CONNECTION_REFUSED = 0x80410718,550ERROR_NET_ADHOC_THREAD_ABORTED = 0x80410719,551ERROR_NET_ADHOC_ALREADY_CREATED = 0x8041071A,552ERROR_NET_ADHOC_NOT_IN_GAMEMODE = 0x8041071B,553ERROR_NET_ADHOC_NOT_CREATED = 0x8041071C,554555// pspnet_adhoc_matching556ERROR_NET_ADHOC_MATCHING_INVALID_MODE = 0x80410801,557ERROR_NET_ADHOC_MATCHING_INVALID_PORT = 0x80410802,558ERROR_NET_ADHOC_MATCHING_INVALID_MAXNUM = 0x80410803,559ERROR_NET_ADHOC_MATCHING_RXBUF_TOO_SHORT = 0x80410804,560ERROR_NET_ADHOC_MATCHING_INVALID_OPTLEN = 0x80410805,561ERROR_NET_ADHOC_MATCHING_INVALID_ARG = 0x80410806,562ERROR_NET_ADHOC_MATCHING_INVALID_ID = 0x80410807,563ERROR_NET_ADHOC_MATCHING_ID_NOT_AVAIL = 0x80410808,564ERROR_NET_ADHOC_MATCHING_NO_SPACE = 0x80410809,565ERROR_NET_ADHOC_MATCHING_IS_RUNNING = 0x8041080A,566ERROR_NET_ADHOC_MATCHING_NOT_RUNNING = 0x8041080B,567ERROR_NET_ADHOC_MATCHING_UNKNOWN_TARGET = 0x8041080C,568ERROR_NET_ADHOC_MATCHING_TARGET_NOT_READY = 0x8041080D,569ERROR_NET_ADHOC_MATCHING_EXCEED_MAXNUM = 0x8041080E,570ERROR_NET_ADHOC_MATCHING_REQUEST_IN_PROGRESS = 0x8041080F,571ERROR_NET_ADHOC_MATCHING_ALREADY_ESTABLISHED = 0x80410810,572ERROR_NET_ADHOC_MATCHING_BUSY = 0x80410811,573ERROR_NET_ADHOC_MATCHING_ALREADY_INITIALIZED = 0x80410812,574ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED = 0x80410813,575ERROR_NET_ADHOC_MATCHING_PORT_IN_USE = 0x80410814,576ERROR_NET_ADHOC_MATCHING_STACKSIZE_TOO_SHORT = 0x80410815,577ERROR_NET_ADHOC_MATCHING_INVALID_DATALEN = 0x80410816,578ERROR_NET_ADHOC_MATCHING_NOT_ESTABLISHED = 0x80410817,579ERROR_NET_ADHOC_MATCHING_DATA_BUSY = 0x80410818,580581// pspnet_adhocctl582ERROR_NET_ADHOCCTL_NOT_LEFT_IBSS = 0x80410b01,583ERROR_NET_ADHOCCTL_ALREADY_CONNECTED = 0x80410b02,584ERROR_NET_ADHOCCTL_WLAN_SWITCH_OFF = 0x80410b03,585ERROR_NET_ADHOCCTL_INVALID_ARG = 0x80410B04,586ERROR_NET_ADHOCCTL_TIMEOUT = 0x80410b05,587ERROR_NET_ADHOCCTL_ID_NOT_FOUND = 0x80410B06,588ERROR_NET_ADHOCCTL_ALREADY_INITIALIZED = 0x80410b07,589ERROR_NET_ADHOCCTL_NOT_INITIALIZED = 0x80410b08,590ERROR_NET_ADHOCCTL_DISCONNECTED = 0x80410b09,591ERROR_NET_ADHOCCTL_NO_SCAN_INFO = 0x80410b0a,592ERROR_NET_ADHOCCTL_INVALID_IBSS = 0x80410b0b,593ERROR_NET_ADHOCCTL_NOT_ENTER_GAMEMODE = 0x80410B0C,594ERROR_NET_ADHOCCTL_CHANNEL_NOT_AVAILABLE = 0x80410B0D,595ERROR_NET_ADHOCCTL_WLAN_BEACON_LOST = 0x80410b0e,596ERROR_NET_ADHOCCTL_WLAN_SUSPENDED = 0x80410b0f,597ERROR_NET_ADHOCCTL_BUSY = 0x80410b10,598ERROR_NET_ADHOCCTL_CHANNEL_NOT_MATCH = 0x80410b11,599ERROR_NET_ADHOCCTL_TOO_MANY_HANDLERS = 0x80410b12,600ERROR_NET_ADHOCCTL_STACKSIZE_TOO_SHORT = 0x80410B13,601};602603const size_t MAX_ADHOCCTL_HANDLERS = 32; //4604const size_t MAX_MATCHING_HANDLERS = 32; //4605606enum {607/**608* Matching events used in pspAdhocMatchingCallback609*/610/** Hello event. optdata contains data if optlen > 0. */611PSP_ADHOC_MATCHING_EVENT_HELLO = 1,612/** Join request. optdata contains data if optlen > 0. */613PSP_ADHOC_MATCHING_EVENT_JOIN = 2,614/** Target left matching. */615PSP_ADHOC_MATCHING_EVENT_LEFT = 3,616/** Join request rejected. */617PSP_ADHOC_MATCHING_EVENT_REJECT = 4,618/** Join request cancelled. */619PSP_ADHOC_MATCHING_EVENT_CANCEL = 5,620/** Join request accepted. optdata contains data if optlen > 0. */621PSP_ADHOC_MATCHING_EVENT_ACCEPT = 6,622/** Matching is complete. */623PSP_ADHOC_MATCHING_EVENT_COMPLETE = 7,624/** Ping timeout event. */625PSP_ADHOC_MATCHING_EVENT_TIMEOUT = 8,626/** Error event. */627PSP_ADHOC_MATCHING_EVENT_ERROR = 9,628/** Peer disconnect event. */629PSP_ADHOC_MATCHING_EVENT_DISCONNECT = 10,630/** Data received event. optdata contains data if optlen > 0. */631PSP_ADHOC_MATCHING_EVENT_DATA = 11,632/** Data acknowledged event. */633PSP_ADHOC_MATCHING_EVENT_DATA_CONFIRM = 12,634/** Data timeout event. */635PSP_ADHOC_MATCHING_EVENT_DATA_TIMEOUT = 13,636637/** Internal ping message. */638PSP_ADHOC_MATCHING_EVENT_INTERNAL_PING = 100,639640/**641* Matching modes used in sceNetAdhocMatchingCreate642*/643/** Host */644PSP_ADHOC_MATCHING_MODE_HOST = 1,645/** Client */646PSP_ADHOC_MATCHING_MODE_CLIENT = 2,647/** Peer to peer */648PSP_ADHOC_MATCHING_MODE_PTP = 3,649};650651enum {652PSP_ADHOC_POLL_READY_TO_SEND = 1, // POLLIN ?653PSP_ADHOC_POLL_DATA_AVAILABLE = 2, // POLLPRI ?654PSP_ADHOC_POLL_CAN_CONNECT = 4, // POLLOUT ?655PSP_ADHOC_POLL_CAN_ACCEPT = 8, // POLLERR ?656};657658// Matching modes659#define PSP_ADHOC_MATCHING_MODE_PARENT 1660#define PSP_ADHOC_MATCHING_MODE_CHILD 2661#define PSP_ADHOC_MATCHING_MODE_P2P 3662663// Matching Events664#define PSP_ADHOC_MATCHING_EVENT_HELLO 1 // Should be ignored when Join Request is in progress ?665#define PSP_ADHOC_MATCHING_EVENT_REQUEST 2666#define PSP_ADHOC_MATCHING_EVENT_LEAVE 3667#define PSP_ADHOC_MATCHING_EVENT_DENY 4668#define PSP_ADHOC_MATCHING_EVENT_CANCEL 5669#define PSP_ADHOC_MATCHING_EVENT_ACCEPT 6670#define PSP_ADHOC_MATCHING_EVENT_ESTABLISHED 7 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?671#define PSP_ADHOC_MATCHING_EVENT_TIMEOUT 8 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?672#define PSP_ADHOC_MATCHING_EVENT_ERROR 9673#define PSP_ADHOC_MATCHING_EVENT_BYE 10 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?674#define PSP_ADHOC_MATCHING_EVENT_DATA 11675#define PSP_ADHOC_MATCHING_EVENT_DATA_ACK 12676#define PSP_ADHOC_MATCHING_EVENT_DATA_TIMEOUT 13677678// Peer Status679// Offer only seen in P2P and PARENT mode after hello680// Parent only seen in CHILD mode after connection accept681// Child only seen in PARENT and CHILD mode after connection accept682// P2P only seen in P2P mode after connection accept683// Requester only seen in P2P and PARENT mode after connection request684#define PSP_ADHOC_MATCHING_PEER_OFFER 1685#define PSP_ADHOC_MATCHING_PEER_PARENT 2686#define PSP_ADHOC_MATCHING_PEER_CHILD 3687#define PSP_ADHOC_MATCHING_PEER_P2P 4688#define PSP_ADHOC_MATCHING_PEER_INCOMING_REQUEST 5689#define PSP_ADHOC_MATCHING_PEER_OUTGOING_REQUEST 6690#define PSP_ADHOC_MATCHING_PEER_CANCEL_IN_PROGRESS 7691692// Stack Targets693#define PSP_ADHOC_MATCHING_INPUT_STACK 1694#define PSP_ADHOC_MATCHING_EVENT_STACK 2695696// Packet Opcodes697#define PSP_ADHOC_MATCHING_PACKET_PING 0698#define PSP_ADHOC_MATCHING_PACKET_HELLO 1699#define PSP_ADHOC_MATCHING_PACKET_JOIN 2700#define PSP_ADHOC_MATCHING_PACKET_ACCEPT 3701#define PSP_ADHOC_MATCHING_PACKET_CANCEL 4702#define PSP_ADHOC_MATCHING_PACKET_BULK 5703#define PSP_ADHOC_MATCHING_PACKET_BULK_ABORT 6704#define PSP_ADHOC_MATCHING_PACKET_BIRTH 7705#define PSP_ADHOC_MATCHING_PACKET_DEATH 8706#define PSP_ADHOC_MATCHING_PACKET_BYE 9707708// Pro Adhoc Server Packets Opcodes709#define OPCODE_PING 0710#define OPCODE_LOGIN 1711#define OPCODE_CONNECT 2712#define OPCODE_DISCONNECT 3713#define OPCODE_SCAN 4714#define OPCODE_SCAN_COMPLETE 5715#define OPCODE_CONNECT_BSSID 6716#define OPCODE_CHAT 7717718// PSP Product Code719#define PRODUCT_CODE_LENGTH 9720721#ifdef _MSC_VER722#pragma pack(push,1)723#endif724725typedef struct {726// Game Product Code (ex. ULUS12345)727char data[PRODUCT_CODE_LENGTH];728} PACK SceNetAdhocctlProductCode;729730// Basic Packet731typedef struct {732uint8_t opcode;733} PACK SceNetAdhocctlPacketBase;734735// C2S Login Packet736typedef struct {737SceNetAdhocctlPacketBase base;738SceNetEtherAddr mac;739SceNetAdhocctlNickname name;740SceNetAdhocctlProductCode game;741} PACK SceNetAdhocctlLoginPacketC2S;742743// C2S Connect Packet744typedef struct {745SceNetAdhocctlPacketBase base;746SceNetAdhocctlGroupName group;747} PACK SceNetAdhocctlConnectPacketC2S;748749#define ADHOCCTL_MESSAGE_LEN 64750// C2S Chat Packet751typedef struct {752SceNetAdhocctlPacketBase base;753char message[ADHOCCTL_MESSAGE_LEN];754} PACK SceNetAdhocctlChatPacketC2S;755756// S2C Connect Packet757typedef struct {758SceNetAdhocctlPacketBase base;759SceNetAdhocctlNickname name;760SceNetEtherAddr mac;761uint32_t ip;762} PACK SceNetAdhocctlConnectPacketS2C;763764// S2C Disconnect Packet765typedef struct {766SceNetAdhocctlPacketBase base;767uint32_t ip;768} PACK SceNetAdhocctlDisconnectPacketS2C;769770// S2C Scan Packet771typedef struct {772SceNetAdhocctlPacketBase base;773SceNetAdhocctlGroupName group;774SceNetEtherAddr mac;775} PACK SceNetAdhocctlScanPacketS2C;776777// S2C Connect BSSID Packet778typedef struct {779SceNetAdhocctlPacketBase base;780SceNetEtherAddr mac;781} PACK SceNetAdhocctlConnectBSSIDPacketS2C;782783// S2C Chat Packet784typedef struct {785SceNetAdhocctlChatPacketC2S base;786SceNetAdhocctlNickname name;787} PACK SceNetAdhocctlChatPacketS2C;788789// P2P Packet790typedef struct {791SceNetEtherAddr fromMAC;792SceNetEtherAddr toMAC;793u32_le dataPtr; //void * data794} PACK SceNetAdhocMatchingPacketBase;795796// P2P Accept Packet797typedef struct {798SceNetAdhocctlPacketBase base; //opcode799u32_le dataLen;800u32_le numMACs; //number of peers801u32_le dataPtr; //void * data802/*u32_le*/PSPPointer<SceNetEtherAddr> MACsPtr; //peers //SceNetEtherAddr * MACs803} PACK SceNetAdhocMatchingPacketAccept;804805#ifdef _MSC_VER806#pragma pack(pop)807#endif808809class PointerWrap;810811class AfterAdhocMipsCall : public PSPAction {812public:813AfterAdhocMipsCall() {}814static PSPAction* Create() { return new AfterAdhocMipsCall(); }815void DoState(PointerWrap& p) override;816void run(MipsCall& call) override;817void SetData(int handlerID, int eventId, u32_le argsAddr);818819private:820int HandlerID = -1;821int EventID = -1;822u32_le argsAddr = 0;823};824825class AfterMatchingMipsCall : public PSPAction {826public:827AfterMatchingMipsCall() {}828static PSPAction *Create() { return new AfterMatchingMipsCall(); }829void DoState(PointerWrap &p) override;830void run(MipsCall &call) override;831void SetData(int ContextID, int eventId, u32_le BufAddr);832833private:834int contextID = -1;835int EventID = -1;836u32_le bufAddr = 0;837SceNetAdhocMatchingContext* context = nullptr;838};839840extern int actionAfterAdhocMipsCall;841extern int actionAfterMatchingMipsCall;842843#define MAX_SOCKET 255 // FIXME: PSP might not allows more than 255 sockets? Hotshots Tennis doesn't seems to works with socketId > 255844#define SOCK_PDP 1845#define SOCK_PTP 2846// Aux vars847extern std::atomic<int> metasocket;848extern SceNetAdhocctlParameter parameter;849extern SceNetAdhocctlAdhocId product_code;850extern std::thread friendFinderThread;851extern std::recursive_mutex peerlock;852extern AdhocSocket* adhocSockets[MAX_SOCKET];853854union SockAddrIN4 {855sockaddr addr;856sockaddr_in in;857};858859extern uint16_t portOffset;860extern uint32_t minSocketTimeoutUS;861extern bool isOriPort;862extern bool isLocalServer;863extern SockAddrIN4 g_adhocServerIP; // Resolved Adhoc Server IP so we don't need to repeatedly resolve the DNS again later864extern SockAddrIN4 g_localhostIP; // Used to differentiate localhost IP on multiple-instance865extern sockaddr LocalIP; // IP of Network Adapter used to connect to Adhoc Server (LAN/WAN)866extern int defaultWlanChannel; // Default WLAN Channel for Auto, JPCSP uses 11867868extern uint32_t fakePoolSize;869extern SceNetAdhocMatchingContext * contexts;870extern char* dummyPeekBuf64k;871extern int dummyPeekBuf64kSize;872extern int one;873extern std::atomic<bool> friendFinderRunning;874extern SceNetAdhocctlPeerInfo * friends;875extern SceNetAdhocctlScanInfo * networks;876extern u64 adhocctlStartTime;877extern bool isAdhocctlNeedLogin;878extern bool isAdhocctlBusy;879extern int adhocctlState;880extern int adhocctlCurrentMode;881extern int adhocConnectionType;882883extern int gameModeSocket;884extern int gameModeBuffSize;885extern u8* gameModeBuffer;886extern GameModeArea masterGameModeArea;887extern std::vector<GameModeArea> replicaGameModeAreas;888extern std::vector<SceNetEtherAddr> requiredGameModeMacs;889extern std::vector<SceNetEtherAddr> gameModeMacs;890extern std::map<SceNetEtherAddr, u16_le> gameModePeerPorts;891// End of Aux vars892893enum AdhocConnectionType : int894{895ADHOC_CONNECT = 0,896ADHOC_CREATE = 1,897ADHOC_JOIN = 2,898};899900// Check if Matching callback is running901bool IsMatchingInCallback(SceNetAdhocMatchingContext * context);902bool SetMatchingInCallback(SceNetAdhocMatchingContext* context, bool IsInCB);903904int IsAdhocctlInCallback();905int SetAdhocctlInCallback(bool IsInCB);906907/**908* Compare MAC Addresses909* @param addr1 & addr2 To-be-compared MAC Address910* @return True if both matched911*/912bool isMacMatch(const SceNetEtherAddr* addr1, const SceNetEtherAddr* addr2);913914/**915* Local MAC Check916* @param saddr To-be-checked MAC Address917* @return True if it's local mac918*/919bool isLocalMAC(const SceNetEtherAddr * addr);920921/**922* PDP Port Check923* @param port To-be-checked Port924* @return 1 if in use or... 0925*/926bool isPDPPortInUse(uint16_t port);927928/**929* Check whether PTP Port is in use or not (only sockets with non-Listening state will be considered as in use)930* @param port To-be-checked Port Number931* @param forListen to check for listening or non-listening port932* @param dstmac destination address (non-listening only)933* @param dstport destination port (non-listening only)934* @return 1 if in use or... 0935*/936bool isPTPPortInUse(uint16_t port, bool forListen, SceNetEtherAddr* dstmac = nullptr, uint16_t dstport = 0);937938// Convert IPv4 address to string (Replacement for inet_ntoa since it's getting deprecated)939std::string ip2str(in_addr in, bool maskPublicIP = true);940941// Convert MAC address to string942std::string mac2str(const SceNetEtherAddr *mac);943944/*945* Matching Members946*/947//SceNetAdhocMatchingMemberInternal* findMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac); // findPeer948SceNetAdhocMatchingMemberInternal* addMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac);949//void deleteMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac); // deletePeer950//void deleteAllMembers(SceNetAdhocMatchingContext * context); // clearPeerList951952953/**954* Add Friend to Local List955* @param packet Friend Information956*/957void addFriend(SceNetAdhocctlConnectPacketS2C * packet);958959/**960* Send chat or get that961* @param std::string ChatString962*/963void sendChat(const std::string &chatString);964std::vector<std::string> getChatLog();965int GetChatChangeID();966int GetChatMessageCount();967968/*969* Find a Peer/Friend by MAC address970*/971SceNetAdhocctlPeerInfo * findFriend(SceNetEtherAddr * MAC);972973/*974* Find a Peer/Friend by IP address975*/976SceNetAdhocctlPeerInfo* findFriendByIP(uint32_t ip);977978/**979* Get the Readability(ie. recv) and/or Writability(ie. send) of a socket980* @param fd File Descriptor of the socket981* @param timeout in usec (micro seconds), 0 = non-blocking982* @return > 0 = ready, 0 = timeout, -1 = error (errorcode only represent error of select and doesn't represent error of the socket)983*/984int IsSocketReady(int fd, bool readfd, bool writefd, int* errorcode = nullptr, int timeoutUS = 0);985986/**987* Changes the Blocking Mode of the socket988* @param fd File Descriptor of the socket989* @param nonblocking 1 to set to nonblock and 0 to set blocking990*/991void changeBlockingMode(int fd, int nonblocking);992993/**994* Count Virtual Networks by analyzing the Friend List995* @return Number of Virtual Networks996*/997int countAvailableNetworks(const bool excludeSelf = false);998999/*1000* Find an existing group in networks1001*/1002SceNetAdhocctlScanInfo * findGroup(SceNetEtherAddr * MAC);10031004/*1005* Deletes all groups in networks1006*/1007void freeGroupsRecursive(SceNetAdhocctlScanInfo * node);10081009/**1010* Closes & Deletes all PDP & PTP Sockets1011*/1012void deleteAllAdhocSockets();10131014/*1015* Deletes all GameMode Buffers1016*/1017void deleteAllGMB();10181019/**1020* Delete Friend from Local List1021* @param ip Friend IP1022*/1023void deleteFriendByIP(uint32_t ip);10241025/**1026* Recursive Memory Freeing-Helper for Friend-Structures1027* @param node Current Node in List1028*/1029void freeFriendsRecursive(SceNetAdhocctlPeerInfo * node, int32_t* count = nullptr);10301031void timeoutFriendsRecursive(SceNetAdhocctlPeerInfo * node, int32_t* count = nullptr);10321033/**1034* Friend Finder Thread (Receives Peer Information)1035* @param args Length of argp in Bytes (Unused)1036* @param argp Argument (Unused)1037* @return Unused Value - Return 01038*/1039int friendFinder();10401041/**1042* Find Free Matching ID1043* @return First unoccupied Matching ID1044*/1045int findFreeMatchingID();10461047/**1048* Find Internal Matching Context for Matching ID1049* @param id Matching ID1050* @return Matching Context Pointer or... NULL1051*/1052SceNetAdhocMatchingContext * findMatchingContext(int id);10531054// Notifiy Adhocctl Handlers1055void notifyAdhocctlHandlers(u32 flag, u32 error);10561057/*1058* Packet Handler1059*/1060void postAcceptCleanPeerList(SceNetAdhocMatchingContext * context);1061void postAcceptAddSiblings(SceNetAdhocMatchingContext * context, int siblingcount, SceNetEtherAddr * siblings);10621063/*1064* Timeout Handler1065*/1066void handleTimeout(SceNetAdhocMatchingContext * context);10671068/**1069* Clear Thread Stack1070* @param context Matching Context Pointer1071* @param stack ADHOC_MATCHING_EVENT_STACK or ADHOC_MATCHING_INPUT_STACK1072*/1073void clearStack(SceNetAdhocMatchingContext * context, int stack);10741075/**1076* Clear Peer List1077* @param context Matching Context Pointer1078*/1079void clearPeerList(SceNetAdhocMatchingContext * context);10801081/**1082* Find Outgoing Request Target Peer1083* @param context Matching Context Pointer1084* @return Internal Peer Reference or... NULL1085*/1086SceNetAdhocMatchingMemberInternal * findOutgoingRequest(SceNetAdhocMatchingContext * context);10871088/**1089* Send Accept Message from P2P -> P2P or Parent -> Children1090* @param context Matching Context Pointer1091* @param peer Target Peer1092* @param optlen Optional Data Length1093* @param opt Optional Data1094*/1095void sendAcceptMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);10961097/**1098* Send Join Request from P2P -> P2P or Children -> Parent1099* @param context Matching Context Pointer1100* @param peer Target Peer1101* @param optlen Optional Data Length1102* @param opt Optional Data1103*/1104void sendJoinRequest(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);11051106/**1107* Send Cancel Message to Peer (has various effects)1108* @param context Matching Context Pointer1109* @param peer Target Peer1110* @param optlen Optional Data Length1111* @param opt Optional Data1112*/1113void sendCancelMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);11141115/**1116* Send Bulk Data to Peer1117* @param context Matching Context Pointer1118* @param peer Target Peer1119* @param datalen Data Length1120* @param data Data1121*/1122void sendBulkData(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int datalen, const void * data);11231124/**1125* Abort Bulk Data Transfer (if in progress)1126* @param context Matching Context Pointer1127* @param peer Target Peer1128*/1129void abortBulkTransfer(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);11301131/**1132* Notify all established Peers about new Kid in the Neighborhood1133* @param context Matching Context Pointer1134* @param peer New Kid1135*/1136void sendBirthMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);11371138/**1139* Notify all established Peers about abandoned Child1140* @param context Matching Context Pointer1141* @param peer Abandoned Child1142*/1143void sendDeathMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);11441145/**1146* Count Children Peers (for Parent)1147* @param context Matching Context Pointer1148* @return Number of Children1149*/1150s32_le countChildren(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);11511152/**1153* Delete Peer from List1154* @param context Matching Context Pointer1155* @param peer Internal Peer Reference1156*/1157void deletePeer(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal *& peer);11581159/**1160* Find Peer in Context by MAC1161* @param context Matching Context Pointer1162* @param mac Peer MAC Address1163* @return Internal Peer Reference or... NULL1164*/1165SceNetAdhocMatchingMemberInternal * findPeer(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac);11661167/**1168* Find Parent Peer1169* @param context Matching Context Pointer1170* @return Internal Peer Reference or... NULL1171*/1172SceNetAdhocMatchingMemberInternal * findParent(SceNetAdhocMatchingContext * context);11731174/**1175* Find P2P Buddy Peer1176* @param context Matching Context Pointer1177* @return Internal Peer Reference or... NULL1178*/1179SceNetAdhocMatchingMemberInternal * findP2P(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);11801181/**1182* Return Number of Connected Peers1183* @param context Matching Context Pointer1184* @return Number of Connected Peers1185*/1186uint32_t countConnectedPeers(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);11871188/**1189* Spawn Local Event for Event Thread1190* @param context Matching Context Pointer1191* @param event Event ID1192* @param mac Event Source MAC1193* @param optlen Optional Data Length1194* @param opt Optional Data1195*/1196void spawnLocalEvent(SceNetAdhocMatchingContext * context, int event, SceNetEtherAddr * mac, int optlen, void * opt);11971198/*1199* Matching Event Thread (Send Ping and Hello Data) Part of AdhocMatching1200*/1201//int matchingEvent(int matchingId);1202//int matchingEventThread(int matchingId); //(uint32_t args, void * argp)12031204/*1205* Matching Input Thread (process Members) Part of AdhocMatching1206*/1207//int matchingInputThread(int matchingId); //(uint32_t args, void * argp)12081209/**1210* Return Number of active Peers in the same Network as the Local Player1211* @return Number of active Peers1212*/1213int getActivePeerCount(const bool excludeTimedout = true);12141215/**1216* Returns the locall Ip of this machine1217* @param SocketAddres OUT: local ip1218*/1219int getLocalIp(sockaddr_in * SocketAddress);1220uint32_t getLocalIp(int sock);12211222/*1223* Check if an IP (big-endian/network order) is Private or Public IP1224*/1225bool isMulticastIP(uint32_t ip);12261227/*1228* Check if an IP (big-endian/network order) is Private or Public IP1229*/1230bool isPrivateIP(uint32_t ip);12311232/*1233* Check if an IP (big-endian/network order) is APIPA(169.254.x.x) IP1234*/1235bool isAPIPA(uint32_t ip);12361237/*1238* Check if an IP (big-endian/network order) is Loopback IP1239*/1240bool isLoopbackIP(uint32_t ip);12411242/*1243* Check if an IP (big-endian/network order) is a Broadcast IP1244* Default subnet mask is 255.255.255.01245*/1246bool isBroadcastIP(uint32_t ip, const uint32_t subnetmask = 0x00ffffff);12471248/*1249* Get Number of bytes available in buffer to be Received1250* @param sock fd1251* @param udpBufferSize (UDP only)1252*/1253u_long getAvailToRecv(int sock, int udpBufferSize = 0);12541255/*1256* Get UDP Socket Max Message Size1257*/1258int getSockMaxSize(int udpsock);12591260/*1261* Get Socket Buffer Size (opt = SO_RCVBUF/SO_SNDBUF)1262*/1263int getSockBufferSize(int sock, int opt);12641265/*1266* Set Socket Buffer Size (opt = SO_RCVBUF/SO_SNDBUF)1267*/1268int setSockBufferSize(int sock, int opt, int size);12691270/*1271* Set TCP Socket Maximum Segment Size (default is 1460 on 1500 MTU)1272*/1273int setSockMSS(int sock, int size);12741275/*1276* Set Socket TimeOut (opt = SO_SNDTIMEO/SO_RCVTIMEO)1277*/1278int setSockTimeout(int sock, int opt, unsigned long timeout_usec);12791280/*1281* Get Socket SO_ERROR (Requests and clears pending error information on the socket)1282*/1283int getSockError(int sock);12841285/*1286* Get TCP Socket TCP_NODELAY (Nagle Algo)1287*/1288int getSockNoDelay(int tcpsock);12891290/*1291* Set TCP Socket TCP_NODELAY (Nagle Algo)1292*/1293int setSockNoDelay(int tcpsock, int flag);12941295/*1296* Set Socket SO_NOSIGPIPE when supported1297*/1298int setSockNoSIGPIPE(int sock, int flag);12991300/*1301* Set Socket SO_REUSEADDR and SO_REUSEPORT when supported1302*/1303int setSockReuseAddrPort(int sock);13041305/*1306* Set Socket Connection Reset on UDP (which could cause a strange behavior)1307*/1308int setUDPConnReset(int udpsock, bool enabled);13091310/*1311* Set Socket KeepAlive (opt = SO_KEEPALIVE)1312*/1313int setSockKeepAlive(int sock, bool keepalive, const int keepinvl = 60, const int keepcnt = 20, const int keepidle = 180);13141315/**1316* Return the Number of Players with the chosen Nickname in the Local Users current Network1317* @param nickname To-be-searched Nickname1318* @return Number of matching Players1319*/1320int getNicknameCount(const char * nickname);132113221323/**1324* Joins two 32 bits number into a 64 bit one1325* @param num1: first number1326* @param num2: second number1327* @return Single 64 bit number1328*/1329#define firstMask 0x00000000FFFFFFFF1330#define secondMask 0xFFFFFFFF000000001331u64 join32(u32 num1, u32 num2);13321333/**1334* Splits a 64 bit number into two 32 bit ones1335* @param num: The number to be split1336* @param buf OUT: Array containing the split numbers1337*/1338void split64(u64 num, int buff[]);13391340/**1341* Returns the local mac1342* @param addr OUT: 6-bytes of Local Mac1343*/1344void getLocalMac(SceNetEtherAddr * addr);13451346/*1347* Returns the local port used by the socket1348*/1349uint16_t getLocalPort(int sock);13501351/**1352* PDP Socket Counter1353* @return Number of internal PDP Sockets1354*/1355int getPDPSocketCount();13561357/**1358* PTP Socket Counter1359* @return Number of internal PTP Sockets1360*/1361int getPTPSocketCount();13621363/**1364* Initialize Networking Components for Adhocctl Emulator1365* @param adhoc_id Game Product Code1366* @param server_ip Server IP1367* @return 0 on success or... -11368*/1369int initNetwork(SceNetAdhocctlAdhocId *adhocid);13701371/**1372* Zero MAC Check1373* @param addr To-be-checked MAC Address1374* @return true if MAC is all zeroes1375*/1376bool isZeroMAC(const SceNetEtherAddr* addr);13771378/**1379* Broadcast MAC Check1380* @param addr To-be-checked MAC Address1381* @return true if Broadcast MAC or... 01382*/1383bool isBroadcastMAC(const SceNetEtherAddr * addr);13841385/**1386* Resolve IP to MAC1387* @param ip Peer IP Address1388* @param mac OUT: Peer MAC1389* @return true on success1390*/1391bool resolveIP(uint32_t ip, SceNetEtherAddr * mac);13921393/**1394* Resolve MAC to IP1395* @param mac Peer MAC Address1396* @param ip OUT: Peer IP1397* @param port_offset OUT: Peer IP-specific Port Offset1398* @return true on success1399*/1400bool resolveMAC(SceNetEtherAddr* mac, uint32_t* ip, u16* port_offset = nullptr);14011402/**1403* Check whether Network Name contains only valid symbols1404* @param group_name To-be-checked Network Name1405* @return 1 if valid or... 01406*/1407bool validNetworkName(const char *data);14081409// Convert Matching Event Code to String1410const char* getMatchingEventStr(int code);14111412// Convert Matching Opcode ID to String1413const char* getMatchingOpcodeStr(int code);14141415// Convert adhoc ctl state to string1416const char *AdhocCtlStateToString(int state);141714181419