CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!
Path: blob/master/Core/HLE/proAdhoc.h
Views: 1401
// 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// Net stuff20#if defined(_WIN32)21#include <WS2tcpip.h>22#else23#include <unistd.h>24#include <sys/types.h>25#include <sys/socket.h>26#include <sys/select.h>27#include <netinet/in.h>28#include <netdb.h>29#include <arpa/inet.h>30#include <fcntl.h>31#include <errno.h>32#endif3334#ifdef _MSC_VER35#define PACK // on MSVC we use #pragma pack() instead so let's kill this.36#else37#define PACK __attribute__((packed))38#endif3940#include <atomic>41#include <mutex>42#include <thread>43#include <climits>4445#include "Common/Net/Resolve.h"46#include "Common/Serialize/Serializer.h"47#include "Core/MemMap.h"48#include "Core/HLE/sceKernelThread.h"49#include "Core/HLE/sceKernel.h"50#include "Core/HLE/sceKernelMutex.h"51#include "Core/HLE/sceUtility.h"5253#ifdef _WIN3254#undef errno55#undef ESHUTDOWN56#undef ECONNABORTED57#undef ECONNRESET58#undef ECONNREFUSED59#undef ENETUNREACH60#undef ENOTCONN61#undef EBADF62#undef EAGAIN63#undef EINPROGRESS64#undef EISCONN65#undef EALREADY66#undef ETIMEDOUT67#undef EOPNOTSUPP68#define errno WSAGetLastError()69#define ESHUTDOWN WSAESHUTDOWN70#define ECONNABORTED WSAECONNABORTED71#define ECONNRESET WSAECONNRESET72#define ECONNREFUSED WSAECONNREFUSED73#define ENETUNREACH WSAENETUNREACH74#define ENOTCONN WSAENOTCONN75#define EBADF WSAEBADF76#define EAGAIN WSAEWOULDBLOCK77#define EINPROGRESS WSAEWOULDBLOCK78#define EISCONN WSAEISCONN79#define EALREADY WSAEALREADY80#define ETIMEDOUT WSAETIMEDOUT81#define EOPNOTSUPP WSAEOPNOTSUPP82inline 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.183inline bool isDisconnected(int errcode) { return (errcode == WSAECONNRESET || errcode == WSAECONNABORTED || errcode == WSAESHUTDOWN); }84#else85#define INVALID_SOCKET -186#define SOCKET_ERROR -187#define closesocket close88#ifndef ESHUTDOWN89#define ESHUTDOWN ENETDOWN90#endif91inline bool connectInProgress(int errcode){ return (errcode == EAGAIN || errcode == EWOULDBLOCK || errcode == EINPROGRESS || errcode == EALREADY); }92inline bool isDisconnected(int errcode) { return (errcode == EPIPE || errcode == ECONNRESET || errcode == ECONNABORTED || errcode == ESHUTDOWN); }93#endif9495#ifndef POLL_ERR96#define POLL_ERR 0x008 /* Error condition. */97#endif98#ifndef POLLERR99#define POLLERR POLL_ERR100#endif101102#ifndef POLL_PRI103#define POLL_PRI 0x002 /* There is urgent data to read. */104#endif105#ifndef POLLPRI106#define POLLPRI POLL_PRI107#endif108109#ifndef SD_RECEIVE110#define SD_RECEIVE SHUT_RD //0x00111#endif112113#ifndef SD_BOTH114#define SD_BOTH SHUT_RDWR //0x02115#endif116117#define IsMatch(buf1, buf2) (memcmp(&buf1, &buf2, sizeof(buf1)) == 0)118119// Server Listening Port120#define SERVER_PORT 27312121122// Default GameMode definitions123#define ADHOC_GAMEMODE_PORT 31000124#define GAMEMODE_UPDATE_INTERVAL 500 // 12000 usec on JPCSP, but lower value works better on BattleZone (in order to get full speed 60 FPS)125#define GAMEMODE_INIT_DELAY 10000126#define GAMEMODE_SYNC_TIMEOUT 250000127#define GAMEMODE_WAITID 0x2001 // Just to differentiate WaitID with other ID on WAITTYPE_NET128129// GameMode Type130#define ADHOCCTL_GAMETYPE_1A 1131#define ADHOCCTL_GAMETYPE_1B 2132#define ADHOCCTL_GAMETYPE_2A 3133134// psp strutcs and definitions135#define ADHOCCTL_MODE_NONE -1 // We only use this internally as initial value before attempting to create/connect/join/scan any group136#define ADHOCCTL_MODE_NORMAL 0 // ADHOCCTL_MODE_ADHOC137#define ADHOCCTL_MODE_GAMEMODE 1138139// Event Types for Event Handler140#define ADHOCCTL_EVENT_ERROR 0 // Used to pass error code to Adhocctl Handler?141#define ADHOCCTL_EVENT_CONNECT 1142#define ADHOCCTL_EVENT_DISCONNECT 2143#define ADHOCCTL_EVENT_SCAN 3144#define ADHOCCTL_EVENT_GAME 4145#define ADHOCCTL_EVENT_DISCOVER 5146#define ADHOCCTL_EVENT_WOL 6147#define ADHOCCTL_EVENT_WOL_INTERRUPT 7148149// Internal Thread States150#define ADHOCCTL_STATE_DISCONNECTED 0151#define ADHOCCTL_STATE_CONNECTED 1152#define ADHOCCTL_STATE_SCANNING 2153#define ADHOCCTL_STATE_GAMEMODE 3154#define ADHOCCTL_STATE_DISCOVER 4155#define ADHOCCTL_STATE_WOL 5156157// ProductType ( extracted from SSID along with ProductId & GroupName, Pattern = "PSP_([AXS])(.........)_([LG])_(.*)" )158#define PSP_ADHOCCTL_TYPE_COMMERCIAL 0159#define PSP_ADHOCCTL_TYPE_DEBUG 1160#define PSP_ADHOCCTL_TYPE_SYSTEM 2 // Used for GameSharing?161162// Kernel Utility Netconf Adhoc Types163#define UTILITY_NETCONF_TYPE_CONNECT_ADHOC 2164#define UTILITY_NETCONF_TYPE_CREATE_ADHOC 4165#define UTILITY_NETCONF_TYPE_JOIN_ADHOC 5166167// Kernel Utility States168#define UTILITY_NETCONF_STATUS_NONE 0169#define UTILITY_NETCONF_STATUS_INITIALIZE 1170#define UTILITY_NETCONF_STATUS_RUNNING 2171#define UTILITY_NETCONF_STATUS_FINISHED 3172#define UTILITY_NETCONF_STATUS_SHUTDOWN 4173174// Event Flags175#define ADHOC_EV_SEND 0x0001176#define ADHOC_EV_RECV 0x0002177#define ADHOC_EV_CONNECT 0x0004178#define ADHOC_EV_ACCEPT 0x0008179#define ADHOC_EV_FLUSH 0x0010180#define ADHOC_EV_INVALID 0x0100 // ignored on events but can be raised on revents? similar to POLLNVAL on posix poll?181#define ADHOC_EV_DELETE 0x0200 // ignored on events but can be raised on revents? similar to POLLERR on posix poll?182#define ADHOC_EV_ALERT 0x0400183#define ADHOC_EV_DISCONNECT 0x0800 // ignored on events but can be raised on revents? similar to POLLHUP on posix poll?184185// PTP Connection States186#define ADHOC_PTP_STATE_CLOSED 0187#define ADHOC_PTP_STATE_LISTEN 1188#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 -> Established189#define ADHOC_PTP_STATE_SYN_RCVD 3190#define ADHOC_PTP_STATE_ESTABLISHED 4191192// Nonblocking Flag for Adhoc socket API193#define ADHOC_F_NONBLOCK 0x0001194// Alert Flags195#define ADHOC_F_ALERTSEND 0x0010196#define ADHOC_F_ALERTRECV 0x0020197#define ADHOC_F_ALERTPOLL 0x0040198#define ADHOC_F_ALERTCONNECT 0x0080199#define ADHOC_F_ALERTACCEPT 0x0100200#define ADHOC_F_ALERTFLUSH 0x0200201#define ADHOC_F_ALERTALL (ADHOC_F_ALERTSEND | ADHOC_F_ALERTRECV | ADHOC_F_ALERTPOLL | ADHOC_F_ALERTCONNECT | ADHOC_F_ALERTACCEPT | ADHOC_F_ALERTFLUSH)202203/* PDP Maximum Fragment Size */204#define PSP_ADHOC_PDP_MFS 1444205206/* PDP Maximum Transfer Unit */207#define PSP_ADHOC_PDP_MTU 65523208209/* PTP Maximum Segment Size */210#define PSP_ADHOC_PTP_MSS 1444211212/* GameMode Optional Data */213#define ADHOC_GAMEMODE_F_UPDATE 0x00000001214215// Timeouts216#define PSP_ADHOCCTL_RECV_TIMEOUT 100000217#define PSP_ADHOCCTL_PING_TIMEOUT 2000000218219#ifdef _MSC_VER220#pragma pack(push, 1)221#endif222// Ethernet Address223#define ETHER_ADDR_LEN 6224typedef struct SceNetEtherAddr {225uint8_t data[ETHER_ADDR_LEN];226} PACK SceNetEtherAddr;227228inline bool operator<(const SceNetEtherAddr& lhs, const SceNetEtherAddr& rhs) {229uint64_t l = 0;230uint64_t r = 0;231const uint8_t* lp = lhs.data;232const uint8_t* rp = rhs.data;233for (int8_t i = 5; i >= 0; i--) {234int8_t sb = (CHAR_BIT * i);235l |= (uint64_t)*lp++ << sb;236r |= (uint64_t)*rp++ << sb;237}238return (l < r);239}240241// Broadcast MAC242extern uint8_t broadcastMAC[ETHER_ADDR_LEN];243244// Malloc Pool Information245typedef struct SceNetMallocStat {246s32_le pool; // On Vantage Master Portable this is 0x1ffe0 on sceNetGetMallocStat, while the poolSize arg on sceNetInit was 0x20000247s32_le maximum; // On Vantage Master Portable this is 0x4050, Footprint of Highest amount allocated so far?248s32_le free; // On Vantage Master Portable this is 0x1f300, VMP compares this value with required size before sending data249} PACK SceNetMallocStat;250251// Adhoc Virtual Network Name252#define ADHOCCTL_GROUPNAME_LEN 8253typedef struct SceNetAdhocctlGroupName {254uint8_t data[ADHOCCTL_GROUPNAME_LEN];255} PACK SceNetAdhocctlGroupName;256257// Virtual Network Host Information258typedef struct SceNetAdhocctlBSSId {259SceNetEtherAddr mac_addr;260uint8_t padding[2];261} PACK SceNetAdhocctlBSSId;262263// Virtual Network Information264typedef struct SceNetAdhocctlScanInfo {265struct SceNetAdhocctlScanInfo * next;266s32_le channel;267SceNetAdhocctlGroupName group_name;268SceNetAdhocctlBSSId bssid;269s32_le mode;270} PACK SceNetAdhocctlScanInfo;271272// Virtual Network Information with u32 pointers273typedef struct SceNetAdhocctlScanInfoEmu {274u32_le next;275s32_le channel;276SceNetAdhocctlGroupName group_name;277SceNetAdhocctlBSSId bssid;278s32_le mode;279} PACK SceNetAdhocctlScanInfoEmu;280281// Player Nickname282#define ADHOCCTL_NICKNAME_LEN 128283typedef struct SceNetAdhocctlNickname {284uint8_t data[ADHOCCTL_NICKNAME_LEN];285} PACK SceNetAdhocctlNickname;286287// Active Virtual Network Information (Adhoc Group Host/Creator's device info, similar to AP?)288typedef struct SceNetAdhocctlParameter {289s32_le channel;290SceNetAdhocctlGroupName group_name; // This group name is probably similar to SSID name on AP291SceNetAdhocctlNickname 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)292SceNetAdhocctlBSSId bssid; // FIXME: bssid and nickname position might be swapped on older/newer firmware?293} PACK SceNetAdhocctlParameter;294295// Peer Information (internal use only)296typedef struct SceNetAdhocctlPeerInfo {297SceNetAdhocctlPeerInfo * next;298SceNetAdhocctlNickname nickname;299SceNetEtherAddr mac_addr;300u16_le padding; // a copy of the padding(?) from SceNetAdhocctlPeerInfoEmu301u32_le flags;302u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)303304u32_le ip_addr; // internal use only305u16_le port_offset; // IP-specific port offset (internal use only)306} PACK SceNetAdhocctlPeerInfo;307308// Peer Information with u32 pointers309typedef struct SceNetAdhocctlPeerInfoEmu {310u32_le next; // Changed the pointer to u32311SceNetAdhocctlNickname nickname;312SceNetEtherAddr mac_addr;313u16_le padding; //00 00 // Note: Not sure whether this is really padding or reserved/unknown field314u32_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 ?315u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)316} PACK SceNetAdhocctlPeerInfoEmu;317318// Member Information319typedef struct SceNetAdhocMatchingMemberInfo {320SceNetAdhocMatchingMemberInfo * next;321SceNetEtherAddr mac_addr;322uint8_t padding[2];323} PACK SceNetAdhocctlMemberInfo;324325// Member Information with u32 pointers326typedef struct SceNetAdhocMatchingMemberInfoEmu {327u32_le next; // Changed the pointer to u32328SceNetEtherAddr mac_addr;329uint8_t padding[2];330} PACK SceNetAdhocctlMemberInfoEmu;331332// Game Mode Peer List333#define ADHOCCTL_GAMEMODE_MAX_MEMBERS 16334typedef struct SceNetAdhocctlGameModeInfo {335s32_le num;336SceNetEtherAddr members[ADHOCCTL_GAMEMODE_MAX_MEMBERS];337} PACK SceNetAdhocctlGameModeInfo;338339// GameModeUpdateInfo340typedef struct GameModeUpdateInfo {341u32_le length; //size of GameModeUpdateInfo (16 bytes)342s32_le updated;343u64_le timeStamp;344} PACK GameModeUpdateInfo;345346// GameModeArea (Internal use only)347typedef struct GameModeArea {348int id; // started from 1 for replica? master = 0 or -1?349int size;350u32 addr;351//int socket; // PDP socket?352u64 updateTimestamp;353int dataUpdated;354int dataSent;355SceNetEtherAddr mac;356u8* data; // upto "size" bytes started from "addr" ?357} PACK GameModeArea;358359// Socket Polling Event Listener360typedef struct SceNetAdhocPollSd{361s32_le id;362s32_le events;363s32_le revents;364} PACK SceNetAdhocPollSd;365366// PDP Socket Status367typedef struct SceNetAdhocPdpStat {368u32_le next;369s32_le id; // posix socket id370SceNetEtherAddr laddr;371u16_le lport;372u32_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?373} PACK SceNetAdhocPdpStat;374375// PTP Socket Status376typedef struct SceNetAdhocPtpStat {377u32_le next; // Changed the pointer to u32378s32_le id; // posix socket id379SceNetEtherAddr laddr;380SceNetEtherAddr paddr;381u16_le lport;382u16_le pport;383u32_le snd_sb_cc; // Number of bytes existed in sendBuffer to be sent/flushed384u32_le rcv_sb_cc; // Number of bytes available in recvBuffer to be received385s32_le state;386} PACK SceNetAdhocPtpStat;387388// PDP & PTP Socket Union (Internal use only)389typedef struct AdhocSocket {390s32_le type; // SOCK_PDP/SOCK_PTP391s32_le flags; // Socket Alert Flags392s32_le alerted_flags; // Socket Alerted Flags393s32_le nonblocking; // last non-blocking flag394u32 buffer_size;395u32 send_timeout; // default connect timeout396u32 recv_timeout; // default accept timeout397s32 retry_interval; // related to keepalive398s32 retry_count; // multiply with retry interval to be used as keepalive timeout399s32 attemptCount; // connect/accept attempts400u64 lastAttempt; // timestamp to retry again (attempted by the game)401u64 internalLastAttempt; // timestamp to retry again (internal use only)402bool isClient; // true if the game is using local port 0 when creating the socket403union {404SceNetAdhocPdpStat pdp;405SceNetAdhocPtpStat ptp;406} data;407} PACK AdhocSocket;408409// Gamemode Optional Peer Buffer Data410typedef struct SceNetAdhocGameModeOptData {411u32_le size;412u32_le flag;413u64_le last_recv; // Need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)414} PACK SceNetAdhocGameModeOptData;415416// Gamemode Buffer Status417typedef struct SceNetAdhocGameModeBufferStat {418struct SceNetAdhocGameModeBufferStat * next; //should be u32_le ?419s32_le id;420void * ptr; //should be u32_le ?421u32_le size;422u32_le master;423SceNetAdhocGameModeOptData opt;424} PACK SceNetAdhocGameModeBufferStat;425426// Adhoc ID (Game Product Key)427#define ADHOCCTL_ADHOCID_LEN 9428typedef struct SceNetAdhocctlAdhocId {429s32_le type; // Air Conflicts - Aces Of World War 2 is using 2 for GameSharing?430uint8_t data[ADHOCCTL_ADHOCID_LEN]; // Air Conflicts - Aces Of World War 2 is using "000000001" for GameSharing?431uint8_t padding[3];432} PACK SceNetAdhocctlAdhocId; // should this be packed?433#ifdef _MSC_VER434#pragma pack(pop)435#endif436437438// Internal Matching Peer Information439typedef struct SceNetAdhocMatchingMemberInternal {440// Next Peer441struct SceNetAdhocMatchingMemberInternal * next;442443// MAC Address444SceNetEtherAddr mac;445446// State Variable447s32_le state;448449// Send in Progress450s32_le sending;451452// Last Heartbeat453u64_le lastping; // May need to use the same method with sceKernelGetSystemTimeWide (ie. CoreTiming::GetGlobalTimeUsScaled) to prevent timing issue (ie. in game timeout)454} SceNetAdhocMatchingMemberInternal;455456457// Matching handler458struct SceNetAdhocMatchingHandlerArgs {459s32_le id;460s32_le opcode; // event;461SceNetEtherAddr mac; // peer //u32_le macaddr;462s32_le optlen;463void * opt; //u32_le optaddr464};465466struct SceNetAdhocMatchingHandler {467u32_le entryPoint;468};469470struct AdhocctlHandler {471u32 entryPoint;472u32 argument;473};474475// Thread Message Stack Item476typedef struct ThreadMessage {477// Next Thread Message478struct ThreadMessage * next;479480// Stack Event Opcode481u32_le opcode;482483// Target MAC Address484SceNetEtherAddr mac;485486// Optional Data Length487s32_le optlen;488} ThreadMessage;489490// Established Peer491492// Context Information493typedef struct SceNetAdhocMatchingContext {494// Next Context495struct SceNetAdhocMatchingContext *next;496497// Externally Visible ID498s32_le id;499500// Matching Mode (HOST, CLIENT, P2P)501s32_le mode;502503// Running Flag (1 = running, 0 = created)504s32_le running;505506// Maximum Number of Peers (for HOST, P2P)507s32_le maxpeers;508509// Peer List for Connectees510SceNetAdhocMatchingMemberInternal *peerlist; // SceNetAdhocMatchingMemberInfo[Emu]511512// Peer Port list513std::map<SceNetEtherAddr, u16_le> *peerPort;514515// Local MAC Address516SceNetEtherAddr mac;517518// Local PDP Port519u16_le port;520521// Local PDP Socket522s32_le socket;523// Socket Lock524std::recursive_mutex *socketlock;525526// Receive Buffer Length527s32_le rxbuflen;528529// Receive Buffer530uint8_t *rxbuf;531532// Hello Broadcast Interval (Microseconds)533u32_le hello_int;534535// Keep-Alive Broadcast Interval (Microseconds)536u32_le keepalive_int;537538// Resend Interval (Microseconds)539u32_le resend_int;540541// Resend-Counter542s32_le resendcounter;543544// Keep-Alive Counter545s32_le keepalivecounter;546547// Event Handler548SceNetAdhocMatchingHandler handler;549550// Event Handler Args551u32_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 later552//SceNetAdhocMatchingHandlerArgs handlerArgs;553554// Hello Data Length555s32_le hellolen;556557// Hello Data Address558u32_le helloAddr;559560// Hello Data561uint8_t *hello;562563// Timeout564u64_le timeout;565566// Helper Thread (fake PSP Thread) needed to execute callback567//HLEHelperThread *matchingThread;568int matching_thid;569570// Event Caller Thread571std::thread eventThread;572//s32_le event_thid;573bool eventRunning = false;574bool IsMatchingInCB = false;575576// IO Handler Thread577std::thread inputThread;578//s32_le input_thid;579bool inputRunning = false;580581// Event Caller Thread Message Stack582std::recursive_mutex *eventlock; // s32_le event_stack_lock;583ThreadMessage *event_stack;584585// IO Handler Thread Message Stack586std::recursive_mutex *inputlock; // s32_le input_stack_lock;587ThreadMessage *input_stack;588589// Socket Connectivity590//bool connected = false;591//bool InConnection = false;592//u32_le handlerid = -1;593//int eventMatchingHandlerUpdate = -1;594} SceNetAdhocMatchingContext;595596// End of psp definitions597598enum {599// pspnet_adhoc_auth600ERROR_NET_ADHOC_AUTH_ALREADY_INITIALIZED = 0x80410601,601602// pspnet_adhoc603ERROR_NET_ADHOC_INVALID_SOCKET_ID = 0x80410701,604ERROR_NET_ADHOC_INVALID_ADDR = 0x80410702,605ERROR_NET_ADHOC_INVALID_PORT = 0x80410703,606ERROR_NET_ADHOC_INVALID_BUFLEN = 0x80410704,607ERROR_NET_ADHOC_INVALID_DATALEN = 0x80410705,608ERROR_NET_ADHOC_NOT_ENOUGH_SPACE = 0x80400706, // not a typo609ERROR_NET_ADHOC_SOCKET_DELETED = 0x80410707,610ERROR_NET_ADHOC_SOCKET_ALERTED = 0x80410708,611ERROR_NET_ADHOC_WOULD_BLOCK = 0x80410709, //ERROR_NET_ADHOC_NO_DATA_AVAILABLE612ERROR_NET_ADHOC_PORT_IN_USE = 0x8041070a,613ERROR_NET_ADHOC_NOT_CONNECTED = 0x8041070B,614ERROR_NET_ADHOC_DISCONNECTED = 0x8041070c,615ERROR_NET_ADHOC_NOT_OPENED = 0x8040070D, // not a typo616ERROR_NET_ADHOC_NOT_LISTENED = 0x8040070E, // not a typo617ERROR_NET_ADHOC_SOCKET_ID_NOT_AVAIL = 0x8041070F,618ERROR_NET_ADHOC_PORT_NOT_AVAIL = 0x80410710,619ERROR_NET_ADHOC_INVALID_ARG = 0x80410711,620ERROR_NET_ADHOC_NOT_INITIALIZED = 0x80410712,621ERROR_NET_ADHOC_ALREADY_INITIALIZED = 0x80410713,622ERROR_NET_ADHOC_BUSY = 0x80410714,623ERROR_NET_ADHOC_TIMEOUT = 0x80410715,624ERROR_NET_ADHOC_NO_ENTRY = 0x80410716,625ERROR_NET_ADHOC_EXCEPTION_EVENT = 0x80410717,626ERROR_NET_ADHOC_CONNECTION_REFUSED = 0x80410718,627ERROR_NET_ADHOC_THREAD_ABORTED = 0x80410719,628ERROR_NET_ADHOC_ALREADY_CREATED = 0x8041071A,629ERROR_NET_ADHOC_NOT_IN_GAMEMODE = 0x8041071B,630ERROR_NET_ADHOC_NOT_CREATED = 0x8041071C,631632// pspnet_adhoc_matching633ERROR_NET_ADHOC_MATCHING_INVALID_MODE = 0x80410801,634ERROR_NET_ADHOC_MATCHING_INVALID_PORT = 0x80410802,635ERROR_NET_ADHOC_MATCHING_INVALID_MAXNUM = 0x80410803,636ERROR_NET_ADHOC_MATCHING_RXBUF_TOO_SHORT = 0x80410804,637ERROR_NET_ADHOC_MATCHING_INVALID_OPTLEN = 0x80410805,638ERROR_NET_ADHOC_MATCHING_INVALID_ARG = 0x80410806,639ERROR_NET_ADHOC_MATCHING_INVALID_ID = 0x80410807,640ERROR_NET_ADHOC_MATCHING_ID_NOT_AVAIL = 0x80410808,641ERROR_NET_ADHOC_MATCHING_NO_SPACE = 0x80410809,642ERROR_NET_ADHOC_MATCHING_IS_RUNNING = 0x8041080A,643ERROR_NET_ADHOC_MATCHING_NOT_RUNNING = 0x8041080B,644ERROR_NET_ADHOC_MATCHING_UNKNOWN_TARGET = 0x8041080C,645ERROR_NET_ADHOC_MATCHING_TARGET_NOT_READY = 0x8041080D,646ERROR_NET_ADHOC_MATCHING_EXCEED_MAXNUM = 0x8041080E,647ERROR_NET_ADHOC_MATCHING_REQUEST_IN_PROGRESS = 0x8041080F,648ERROR_NET_ADHOC_MATCHING_ALREADY_ESTABLISHED = 0x80410810,649ERROR_NET_ADHOC_MATCHING_BUSY = 0x80410811,650ERROR_NET_ADHOC_MATCHING_ALREADY_INITIALIZED = 0x80410812,651ERROR_NET_ADHOC_MATCHING_NOT_INITIALIZED = 0x80410813,652ERROR_NET_ADHOC_MATCHING_PORT_IN_USE = 0x80410814,653ERROR_NET_ADHOC_MATCHING_STACKSIZE_TOO_SHORT = 0x80410815,654ERROR_NET_ADHOC_MATCHING_INVALID_DATALEN = 0x80410816,655ERROR_NET_ADHOC_MATCHING_NOT_ESTABLISHED = 0x80410817,656ERROR_NET_ADHOC_MATCHING_DATA_BUSY = 0x80410818,657658// pspnet_adhocctl659ERROR_NET_ADHOCCTL_NOT_LEFT_IBSS = 0x80410b01,660ERROR_NET_ADHOCCTL_ALREADY_CONNECTED = 0x80410b02,661ERROR_NET_ADHOCCTL_WLAN_SWITCH_OFF = 0x80410b03,662ERROR_NET_ADHOCCTL_INVALID_ARG = 0x80410B04,663ERROR_NET_ADHOCCTL_TIMEOUT = 0x80410b05,664ERROR_NET_ADHOCCTL_ID_NOT_FOUND = 0x80410B06,665ERROR_NET_ADHOCCTL_ALREADY_INITIALIZED = 0x80410b07,666ERROR_NET_ADHOCCTL_NOT_INITIALIZED = 0x80410b08,667ERROR_NET_ADHOCCTL_DISCONNECTED = 0x80410b09,668ERROR_NET_ADHOCCTL_NO_SCAN_INFO = 0x80410b0a,669ERROR_NET_ADHOCCTL_INVALID_IBSS = 0x80410b0b,670ERROR_NET_ADHOCCTL_NOT_ENTER_GAMEMODE = 0x80410B0C,671ERROR_NET_ADHOCCTL_CHANNEL_NOT_AVAILABLE = 0x80410B0D,672ERROR_NET_ADHOCCTL_WLAN_BEACON_LOST = 0x80410b0e,673ERROR_NET_ADHOCCTL_WLAN_SUSPENDED = 0x80410b0f,674ERROR_NET_ADHOCCTL_BUSY = 0x80410b10,675ERROR_NET_ADHOCCTL_CHANNEL_NOT_MATCH = 0x80410b11,676ERROR_NET_ADHOCCTL_TOO_MANY_HANDLERS = 0x80410b12,677ERROR_NET_ADHOCCTL_STACKSIZE_TOO_SHORT = 0x80410B13,678};679680const size_t MAX_ADHOCCTL_HANDLERS = 32; //4681const size_t MAX_MATCHING_HANDLERS = 32; //4682683enum {684/**685* Matching events used in pspAdhocMatchingCallback686*/687/** Hello event. optdata contains data if optlen > 0. */688PSP_ADHOC_MATCHING_EVENT_HELLO = 1,689/** Join request. optdata contains data if optlen > 0. */690PSP_ADHOC_MATCHING_EVENT_JOIN = 2,691/** Target left matching. */692PSP_ADHOC_MATCHING_EVENT_LEFT = 3,693/** Join request rejected. */694PSP_ADHOC_MATCHING_EVENT_REJECT = 4,695/** Join request cancelled. */696PSP_ADHOC_MATCHING_EVENT_CANCEL = 5,697/** Join request accepted. optdata contains data if optlen > 0. */698PSP_ADHOC_MATCHING_EVENT_ACCEPT = 6,699/** Matching is complete. */700PSP_ADHOC_MATCHING_EVENT_COMPLETE = 7,701/** Ping timeout event. */702PSP_ADHOC_MATCHING_EVENT_TIMEOUT = 8,703/** Error event. */704PSP_ADHOC_MATCHING_EVENT_ERROR = 9,705/** Peer disconnect event. */706PSP_ADHOC_MATCHING_EVENT_DISCONNECT = 10,707/** Data received event. optdata contains data if optlen > 0. */708PSP_ADHOC_MATCHING_EVENT_DATA = 11,709/** Data acknowledged event. */710PSP_ADHOC_MATCHING_EVENT_DATA_CONFIRM = 12,711/** Data timeout event. */712PSP_ADHOC_MATCHING_EVENT_DATA_TIMEOUT = 13,713714/** Internal ping message. */715PSP_ADHOC_MATCHING_EVENT_INTERNAL_PING = 100,716717/**718* Matching modes used in sceNetAdhocMatchingCreate719*/720/** Host */721PSP_ADHOC_MATCHING_MODE_HOST = 1,722/** Client */723PSP_ADHOC_MATCHING_MODE_CLIENT = 2,724/** Peer to peer */725PSP_ADHOC_MATCHING_MODE_PTP = 3,726};727728enum {729PSP_ADHOC_POLL_READY_TO_SEND = 1, // POLLIN ?730PSP_ADHOC_POLL_DATA_AVAILABLE = 2, // POLLPRI ?731PSP_ADHOC_POLL_CAN_CONNECT = 4, // POLLOUT ?732PSP_ADHOC_POLL_CAN_ACCEPT = 8, // POLLERR ?733};734735// Matching modes736#define PSP_ADHOC_MATCHING_MODE_PARENT 1737#define PSP_ADHOC_MATCHING_MODE_CHILD 2738#define PSP_ADHOC_MATCHING_MODE_P2P 3739740// Matching Events741#define PSP_ADHOC_MATCHING_EVENT_HELLO 1 // Should be ignored when Join Request is in progress ?742#define PSP_ADHOC_MATCHING_EVENT_REQUEST 2743#define PSP_ADHOC_MATCHING_EVENT_LEAVE 3744#define PSP_ADHOC_MATCHING_EVENT_DENY 4745#define PSP_ADHOC_MATCHING_EVENT_CANCEL 5746#define PSP_ADHOC_MATCHING_EVENT_ACCEPT 6747#define PSP_ADHOC_MATCHING_EVENT_ESTABLISHED 7 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?748#define PSP_ADHOC_MATCHING_EVENT_TIMEOUT 8 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?749#define PSP_ADHOC_MATCHING_EVENT_ERROR 9750#define PSP_ADHOC_MATCHING_EVENT_BYE 10 // Should only be triggered on Parent/P2P mode and for Parent/P2P peer ?751#define PSP_ADHOC_MATCHING_EVENT_DATA 11752#define PSP_ADHOC_MATCHING_EVENT_DATA_ACK 12753#define PSP_ADHOC_MATCHING_EVENT_DATA_TIMEOUT 13754755// Peer Status756// Offer only seen in P2P and PARENT mode after hello757// Parent only seen in CHILD mode after connection accept758// Child only seen in PARENT and CHILD mode after connection accept759// P2P only seen in P2P mode after connection accept760// Requester only seen in P2P and PARENT mode after connection request761#define PSP_ADHOC_MATCHING_PEER_OFFER 1762#define PSP_ADHOC_MATCHING_PEER_PARENT 2763#define PSP_ADHOC_MATCHING_PEER_CHILD 3764#define PSP_ADHOC_MATCHING_PEER_P2P 4765#define PSP_ADHOC_MATCHING_PEER_INCOMING_REQUEST 5766#define PSP_ADHOC_MATCHING_PEER_OUTGOING_REQUEST 6767#define PSP_ADHOC_MATCHING_PEER_CANCEL_IN_PROGRESS 7768769// Stack Targets770#define PSP_ADHOC_MATCHING_INPUT_STACK 1771#define PSP_ADHOC_MATCHING_EVENT_STACK 2772773// Packet Opcodes774#define PSP_ADHOC_MATCHING_PACKET_PING 0775#define PSP_ADHOC_MATCHING_PACKET_HELLO 1776#define PSP_ADHOC_MATCHING_PACKET_JOIN 2777#define PSP_ADHOC_MATCHING_PACKET_ACCEPT 3778#define PSP_ADHOC_MATCHING_PACKET_CANCEL 4779#define PSP_ADHOC_MATCHING_PACKET_BULK 5780#define PSP_ADHOC_MATCHING_PACKET_BULK_ABORT 6781#define PSP_ADHOC_MATCHING_PACKET_BIRTH 7782#define PSP_ADHOC_MATCHING_PACKET_DEATH 8783#define PSP_ADHOC_MATCHING_PACKET_BYE 9784785// Pro Adhoc Server Packets Opcodes786#define OPCODE_PING 0787#define OPCODE_LOGIN 1788#define OPCODE_CONNECT 2789#define OPCODE_DISCONNECT 3790#define OPCODE_SCAN 4791#define OPCODE_SCAN_COMPLETE 5792#define OPCODE_CONNECT_BSSID 6793#define OPCODE_CHAT 7794795// PSP Product Code796#define PRODUCT_CODE_LENGTH 9797798#ifdef _MSC_VER799#pragma pack(push,1)800#endif801802typedef struct {803// Game Product Code (ex. ULUS12345)804char data[PRODUCT_CODE_LENGTH];805} PACK SceNetAdhocctlProductCode;806807// Basic Packet808typedef struct {809uint8_t opcode;810} PACK SceNetAdhocctlPacketBase;811812// C2S Login Packet813typedef struct {814SceNetAdhocctlPacketBase base;815SceNetEtherAddr mac;816SceNetAdhocctlNickname name;817SceNetAdhocctlProductCode game;818} PACK SceNetAdhocctlLoginPacketC2S;819820// C2S Connect Packet821typedef struct {822SceNetAdhocctlPacketBase base;823SceNetAdhocctlGroupName group;824} PACK SceNetAdhocctlConnectPacketC2S;825826#define ADHOCCTL_MESSAGE_LEN 64827// C2S Chat Packet828typedef struct {829SceNetAdhocctlPacketBase base;830char message[ADHOCCTL_MESSAGE_LEN];831} PACK SceNetAdhocctlChatPacketC2S;832833// S2C Connect Packet834typedef struct {835SceNetAdhocctlPacketBase base;836SceNetAdhocctlNickname name;837SceNetEtherAddr mac;838uint32_t ip;839} PACK SceNetAdhocctlConnectPacketS2C;840841// S2C Disconnect Packet842typedef struct {843SceNetAdhocctlPacketBase base;844uint32_t ip;845} PACK SceNetAdhocctlDisconnectPacketS2C;846847// S2C Scan Packet848typedef struct {849SceNetAdhocctlPacketBase base;850SceNetAdhocctlGroupName group;851SceNetEtherAddr mac;852} PACK SceNetAdhocctlScanPacketS2C;853854// S2C Connect BSSID Packet855typedef struct {856SceNetAdhocctlPacketBase base;857SceNetEtherAddr mac;858} PACK SceNetAdhocctlConnectBSSIDPacketS2C;859860// S2C Chat Packet861typedef struct {862SceNetAdhocctlChatPacketC2S base;863SceNetAdhocctlNickname name;864} PACK SceNetAdhocctlChatPacketS2C;865866// P2P Packet867typedef struct {868SceNetEtherAddr fromMAC;869SceNetEtherAddr toMAC;870u32_le dataPtr; //void * data871} PACK SceNetAdhocMatchingPacketBase;872873// P2P Accept Packet874typedef struct {875SceNetAdhocctlPacketBase base; //opcode876u32_le dataLen;877u32_le numMACs; //number of peers878u32_le dataPtr; //void * data879/*u32_le*/PSPPointer<SceNetEtherAddr> MACsPtr; //peers //SceNetEtherAddr * MACs880} PACK SceNetAdhocMatchingPacketAccept;881882#ifdef _MSC_VER883#pragma pack(pop)884#endif885886class PointerWrap;887888class AfterAdhocMipsCall : public PSPAction {889public:890AfterAdhocMipsCall() {}891static PSPAction* Create() { return new AfterAdhocMipsCall(); }892void DoState(PointerWrap& p) override;893void run(MipsCall& call) override;894void SetData(int handlerID, int eventId, u32_le argsAddr);895896private:897int HandlerID = -1;898int EventID = -1;899u32_le argsAddr = 0;900};901902class AfterMatchingMipsCall : public PSPAction {903public:904AfterMatchingMipsCall() {}905static PSPAction *Create() { return new AfterMatchingMipsCall(); }906void DoState(PointerWrap &p) override;907void run(MipsCall &call) override;908void SetData(int ContextID, int eventId, u32_le BufAddr);909910private:911int contextID = -1;912int EventID = -1;913u32_le bufAddr = 0;914SceNetAdhocMatchingContext* context = nullptr;915};916917extern int actionAfterAdhocMipsCall;918extern int actionAfterMatchingMipsCall;919920#define MAX_SOCKET 255 // FIXME: PSP might not allows more than 255 sockets? Hotshots Tennis doesn't seems to works with socketId > 255921#define SOCK_PDP 1922#define SOCK_PTP 2923// Aux vars924extern std::atomic<int> metasocket;925extern SceNetAdhocctlParameter parameter;926extern SceNetAdhocctlAdhocId product_code;927extern std::thread friendFinderThread;928extern std::recursive_mutex peerlock;929extern AdhocSocket* adhocSockets[MAX_SOCKET];930931union SockAddrIN4 {932sockaddr addr;933sockaddr_in in;934};935936extern uint16_t portOffset;937extern uint32_t minSocketTimeoutUS;938extern bool isOriPort;939extern bool isLocalServer;940extern SockAddrIN4 g_adhocServerIP; // Resolved Adhoc Server IP so we don't need to repeatedly resolve the DNS again later941extern SockAddrIN4 g_localhostIP; // Used to differentiate localhost IP on multiple-instance942extern sockaddr LocalIP; // IP of Network Adapter used to connect to Adhoc Server (LAN/WAN)943extern int defaultWlanChannel; // Default WLAN Channel for Auto, JPCSP uses 11944945extern uint32_t fakePoolSize;946extern SceNetAdhocMatchingContext * contexts;947extern char* dummyPeekBuf64k;948extern int dummyPeekBuf64kSize;949extern int one;950extern std::atomic<bool> friendFinderRunning;951extern SceNetAdhocctlPeerInfo * friends;952extern SceNetAdhocctlScanInfo * networks;953extern u64 adhocctlStartTime;954extern bool isAdhocctlNeedLogin;955extern bool isAdhocctlBusy;956extern int adhocctlState;957extern int adhocctlCurrentMode;958extern int adhocConnectionType;959960extern int gameModeSocket;961extern int gameModeBuffSize;962extern u8* gameModeBuffer;963extern GameModeArea masterGameModeArea;964extern std::vector<GameModeArea> replicaGameModeAreas;965extern std::vector<SceNetEtherAddr> requiredGameModeMacs;966extern std::vector<SceNetEtherAddr> gameModeMacs;967extern std::map<SceNetEtherAddr, u16_le> gameModePeerPorts;968// End of Aux vars969970enum AdhocConnectionType : int971{972ADHOC_CONNECT = 0,973ADHOC_CREATE = 1,974ADHOC_JOIN = 2,975};976977// Check if Matching callback is running978bool IsMatchingInCallback(SceNetAdhocMatchingContext * context);979bool SetMatchingInCallback(SceNetAdhocMatchingContext* context, bool IsInCB);980981int IsAdhocctlInCallback();982int SetAdhocctlInCallback(bool IsInCB);983984/**985* Compare MAC Addresses986* @param addr1 & addr2 To-be-compared MAC Address987* @return True if both matched988*/989bool isMacMatch(const SceNetEtherAddr* addr1, const SceNetEtherAddr* addr2);990991/**992* Local MAC Check993* @param saddr To-be-checked MAC Address994* @return True if it's local mac995*/996bool isLocalMAC(const SceNetEtherAddr * addr);997998/**999* PDP Port Check1000* @param port To-be-checked Port1001* @return 1 if in use or... 01002*/1003bool isPDPPortInUse(uint16_t port);10041005/**1006* Check whether PTP Port is in use or not (only sockets with non-Listening state will be considered as in use)1007* @param port To-be-checked Port Number1008* @param forListen to check for listening or non-listening port1009* @param dstmac destination address (non-listening only)1010* @param dstport destination port (non-listening only)1011* @return 1 if in use or... 01012*/1013bool isPTPPortInUse(uint16_t port, bool forListen, SceNetEtherAddr* dstmac = nullptr, uint16_t dstport = 0);10141015// Convert IPv4 address to string (Replacement for inet_ntoa since it's getting deprecated)1016std::string ip2str(in_addr in, bool maskPublicIP = true);10171018// Convert MAC address to string1019std::string mac2str(const SceNetEtherAddr *mac);10201021/*1022* Matching Members1023*/1024//SceNetAdhocMatchingMemberInternal* findMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac); // findPeer1025SceNetAdhocMatchingMemberInternal* addMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac);1026//void deleteMember(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac); // deletePeer1027//void deleteAllMembers(SceNetAdhocMatchingContext * context); // clearPeerList102810291030/**1031* Add Friend to Local List1032* @param packet Friend Information1033*/1034void addFriend(SceNetAdhocctlConnectPacketS2C * packet);10351036/**1037* Send chat or get that1038* @param std::string ChatString1039*/1040void sendChat(const std::string &chatString);1041std::vector<std::string> getChatLog();1042int GetChatChangeID();1043int GetChatMessageCount();10441045/*1046* Find a Peer/Friend by MAC address1047*/1048SceNetAdhocctlPeerInfo * findFriend(SceNetEtherAddr * MAC);10491050/*1051* Find a Peer/Friend by IP address1052*/1053SceNetAdhocctlPeerInfo* findFriendByIP(uint32_t ip);10541055/**1056* Get the Readability(ie. recv) and/or Writability(ie. send) of a socket1057* @param fd File Descriptor of the socket1058* @param timeout in usec (micro seconds), 0 = non-blocking1059* @return > 0 = ready, 0 = timeout, -1 = error (errorcode only represent error of select and doesn't represent error of the socket)1060*/1061int IsSocketReady(int fd, bool readfd, bool writefd, int* errorcode = nullptr, int timeoutUS = 0);10621063/**1064* Changes the Blocking Mode of the socket1065* @param fd File Descriptor of the socket1066* @param nonblocking 1 to set to nonblock and 0 to set blocking1067*/1068void changeBlockingMode(int fd, int nonblocking);10691070/**1071* Count Virtual Networks by analyzing the Friend List1072* @return Number of Virtual Networks1073*/1074int countAvailableNetworks(const bool excludeSelf = false);10751076/*1077* Find an existing group in networks1078*/1079SceNetAdhocctlScanInfo * findGroup(SceNetEtherAddr * MAC);10801081/*1082* Deletes all groups in networks1083*/1084void freeGroupsRecursive(SceNetAdhocctlScanInfo * node);10851086/**1087* Closes & Deletes all PDP & PTP Sockets1088*/1089void deleteAllAdhocSockets();10901091/*1092* Deletes all GameMode Buffers1093*/1094void deleteAllGMB();10951096/**1097* Delete Friend from Local List1098* @param ip Friend IP1099*/1100void deleteFriendByIP(uint32_t ip);11011102/**1103* Recursive Memory Freeing-Helper for Friend-Structures1104* @param node Current Node in List1105*/1106void freeFriendsRecursive(SceNetAdhocctlPeerInfo * node, int32_t* count = nullptr);11071108void timeoutFriendsRecursive(SceNetAdhocctlPeerInfo * node, int32_t* count = nullptr);11091110/**1111* Friend Finder Thread (Receives Peer Information)1112* @param args Length of argp in Bytes (Unused)1113* @param argp Argument (Unused)1114* @return Unused Value - Return 01115*/1116int friendFinder();11171118/**1119* Find Free Matching ID1120* @return First unoccupied Matching ID1121*/1122int findFreeMatchingID();11231124/**1125* Find Internal Matching Context for Matching ID1126* @param id Matching ID1127* @return Matching Context Pointer or... NULL1128*/1129SceNetAdhocMatchingContext * findMatchingContext(int id);11301131/*1132* Notify Matching Event Handler1133*/1134void notifyMatchingHandler(SceNetAdhocMatchingContext * context, ThreadMessage * msg, void * opt, u32_le &bufAddr, u32_le &bufLen, u32_le * args);1135// Notifiy Adhocctl Handlers1136void notifyAdhocctlHandlers(u32 flag, u32 error);11371138/*1139* Packet Handler1140*/1141void postAcceptCleanPeerList(SceNetAdhocMatchingContext * context);1142void postAcceptAddSiblings(SceNetAdhocMatchingContext * context, int siblingcount, SceNetEtherAddr * siblings);11431144/*1145* Timeout Handler1146*/1147void handleTimeout(SceNetAdhocMatchingContext * context);11481149/**1150* Clear Thread Stack1151* @param context Matching Context Pointer1152* @param stack ADHOC_MATCHING_EVENT_STACK or ADHOC_MATCHING_INPUT_STACK1153*/1154void clearStack(SceNetAdhocMatchingContext * context, int stack);11551156/**1157* Clear Peer List1158* @param context Matching Context Pointer1159*/1160void clearPeerList(SceNetAdhocMatchingContext * context);11611162/**1163* Find Outgoing Request Target Peer1164* @param context Matching Context Pointer1165* @return Internal Peer Reference or... NULL1166*/1167SceNetAdhocMatchingMemberInternal * findOutgoingRequest(SceNetAdhocMatchingContext * context);11681169/**1170* Send Accept Message from P2P -> P2P or Parent -> Children1171* @param context Matching Context Pointer1172* @param peer Target Peer1173* @param optlen Optional Data Length1174* @param opt Optional Data1175*/1176void sendAcceptMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);11771178/**1179* Send Join Request from P2P -> P2P or Children -> Parent1180* @param context Matching Context Pointer1181* @param peer Target Peer1182* @param optlen Optional Data Length1183* @param opt Optional Data1184*/1185void sendJoinRequest(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);11861187/**1188* Send Cancel Message to Peer (has various effects)1189* @param context Matching Context Pointer1190* @param peer Target Peer1191* @param optlen Optional Data Length1192* @param opt Optional Data1193*/1194void sendCancelMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int optlen, const void * opt);11951196/**1197* Send Bulk Data to Peer1198* @param context Matching Context Pointer1199* @param peer Target Peer1200* @param datalen Data Length1201* @param data Data1202*/1203void sendBulkData(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer, int datalen, const void * data);12041205/**1206* Abort Bulk Data Transfer (if in progress)1207* @param context Matching Context Pointer1208* @param peer Target Peer1209*/1210void abortBulkTransfer(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);12111212/**1213* Notify all established Peers about new Kid in the Neighborhood1214* @param context Matching Context Pointer1215* @param peer New Kid1216*/1217void sendBirthMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);12181219/**1220* Notify all established Peers about abandoned Child1221* @param context Matching Context Pointer1222* @param peer Abandoned Child1223*/1224void sendDeathMessage(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal * peer);12251226/**1227* Count Children Peers (for Parent)1228* @param context Matching Context Pointer1229* @return Number of Children1230*/1231s32_le countChildren(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);12321233/**1234* Delete Peer from List1235* @param context Matching Context Pointer1236* @param peer Internal Peer Reference1237*/1238void deletePeer(SceNetAdhocMatchingContext * context, SceNetAdhocMatchingMemberInternal *& peer);12391240/**1241* Find Peer in Context by MAC1242* @param context Matching Context Pointer1243* @param mac Peer MAC Address1244* @return Internal Peer Reference or... NULL1245*/1246SceNetAdhocMatchingMemberInternal * findPeer(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac);12471248/**1249* Find Parent Peer1250* @param context Matching Context Pointer1251* @return Internal Peer Reference or... NULL1252*/1253SceNetAdhocMatchingMemberInternal * findParent(SceNetAdhocMatchingContext * context);12541255/**1256* Find P2P Buddy Peer1257* @param context Matching Context Pointer1258* @return Internal Peer Reference or... NULL1259*/1260SceNetAdhocMatchingMemberInternal * findP2P(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);12611262/**1263* Return Number of Connected Peers1264* @param context Matching Context Pointer1265* @return Number of Connected Peers1266*/1267uint32_t countConnectedPeers(SceNetAdhocMatchingContext * context, const bool excludeTimedout = false);12681269/**1270* Spawn Local Event for Event Thread1271* @param context Matching Context Pointer1272* @param event Event ID1273* @param mac Event Source MAC1274* @param optlen Optional Data Length1275* @param opt Optional Data1276*/1277void spawnLocalEvent(SceNetAdhocMatchingContext * context, int event, SceNetEtherAddr * mac, int optlen, void * opt);12781279/*1280* Matching Event Thread (Send Ping and Hello Data) Part of AdhocMatching1281*/1282//int matchingEvent(int matchingId);1283//int matchingEventThread(int matchingId); //(uint32_t args, void * argp)12841285/*1286* Matching Input Thread (process Members) Part of AdhocMatching1287*/1288//int matchingInputThread(int matchingId); //(uint32_t args, void * argp)12891290/**1291* Return Number of active Peers in the same Network as the Local Player1292* @return Number of active Peers1293*/1294int getActivePeerCount(const bool excludeTimedout = true);12951296/**1297* Returns the locall Ip of this machine1298* @param SocketAddres OUT: local ip1299*/1300int getLocalIp(sockaddr_in * SocketAddress);1301uint32_t getLocalIp(int sock);13021303/*1304* Check if an IP (big-endian/network order) is Private or Public IP1305*/1306bool isPrivateIP(uint32_t ip);13071308/*1309* Check if an IP (big-endian/network order) is Loopback IP1310*/1311bool isLoopbackIP(uint32_t ip);13121313/*1314* Get Number of bytes available in buffer to be Received1315* @param sock fd1316* @param udpBufferSize (UDP only)1317*/1318u_long getAvailToRecv(int sock, int udpBufferSize = 0);13191320/*1321* Get UDP Socket Max Message Size1322*/1323int getSockMaxSize(int udpsock);13241325/*1326* Get Socket Buffer Size (opt = SO_RCVBUF/SO_SNDBUF)1327*/1328int getSockBufferSize(int sock, int opt);13291330/*1331* Set Socket Buffer Size (opt = SO_RCVBUF/SO_SNDBUF)1332*/1333int setSockBufferSize(int sock, int opt, int size);13341335/*1336* Set TCP Socket Maximum Segment Size (default is 1460 on 1500 MTU)1337*/1338int setSockMSS(int sock, int size);13391340/*1341* Set Socket TimeOut (opt = SO_SNDTIMEO/SO_RCVTIMEO)1342*/1343int setSockTimeout(int sock, int opt, unsigned long timeout_usec);13441345/*1346* Get Socket SO_ERROR (Requests and clears pending error information on the socket)1347*/1348int getSockError(int sock);13491350/*1351* Get TCP Socket TCP_NODELAY (Nagle Algo)1352*/1353int getSockNoDelay(int tcpsock);13541355/*1356* Set TCP Socket TCP_NODELAY (Nagle Algo)1357*/1358int setSockNoDelay(int tcpsock, int flag);13591360/*1361* Set Socket SO_NOSIGPIPE when supported1362*/1363int setSockNoSIGPIPE(int sock, int flag);13641365/*1366* Set Socket SO_REUSEADDR and SO_REUSEPORT when supported1367*/1368int setSockReuseAddrPort(int sock);13691370/*1371* Set Socket Connection Reset on UDP (which could cause a strange behavior)1372*/1373int setUDPConnReset(int udpsock, bool enabled);13741375/*1376* Set Socket KeepAlive (opt = SO_KEEPALIVE)1377*/1378int setSockKeepAlive(int sock, bool keepalive, const int keepinvl = 60, const int keepcnt = 20, const int keepidle = 180);13791380/**1381* Return the Number of Players with the chosen Nickname in the Local Users current Network1382* @param nickname To-be-searched Nickname1383* @return Number of matching Players1384*/1385int getNicknameCount(const char * nickname);138613871388/**1389* Joins two 32 bits number into a 64 bit one1390* @param num1: first number1391* @param num2: second number1392* @return Single 64 bit number1393*/1394#define firstMask 0x00000000FFFFFFFF1395#define secondMask 0xFFFFFFFF000000001396u64 join32(u32 num1, u32 num2);13971398/**1399* Splits a 64 bit number into two 32 bit ones1400* @param num: The number to be split1401* @param buf OUT: Array containing the split numbers1402*/1403void split64(u64 num, int buff[]);14041405/**1406* Returns the local mac1407* @param addr OUT: 6-bytes of Local Mac1408*/1409void getLocalMac(SceNetEtherAddr * addr);14101411/*1412* Returns the local port used by the socket1413*/1414uint16_t getLocalPort(int sock);14151416/**1417* PDP Socket Counter1418* @return Number of internal PDP Sockets1419*/1420int getPDPSocketCount();14211422/**1423* PTP Socket Counter1424* @return Number of internal PTP Sockets1425*/1426int getPTPSocketCount();14271428/**1429* Initialize Networking Components for Adhocctl Emulator1430* @param adhoc_id Game Product Code1431* @param server_ip Server IP1432* @return 0 on success or... -11433*/1434int initNetwork(SceNetAdhocctlAdhocId *adhocid);14351436/**1437* Zero MAC Check1438* @param addr To-be-checked MAC Address1439* @return true if MAC is all zeroes1440*/1441bool isZeroMAC(const SceNetEtherAddr* addr);14421443/**1444* Broadcast MAC Check1445* @param addr To-be-checked MAC Address1446* @return true if Broadcast MAC or... 01447*/1448bool isBroadcastMAC(const SceNetEtherAddr * addr);14491450/**1451* Resolve IP to MAC1452* @param ip Peer IP Address1453* @param mac OUT: Peer MAC1454* @return true on success1455*/1456bool resolveIP(uint32_t ip, SceNetEtherAddr * mac);14571458/**1459* Resolve MAC to IP1460* @param mac Peer MAC Address1461* @param ip OUT: Peer IP1462* @param port_offset OUT: Peer IP-specific Port Offset1463* @return true on success1464*/1465bool resolveMAC(SceNetEtherAddr* mac, uint32_t* ip, u16* port_offset = nullptr);14661467/**1468* Check whether Network Name contains only valid symbols1469* @param group_name To-be-checked Network Name1470* @return 1 if valid or... 01471*/1472bool validNetworkName(const SceNetAdhocctlGroupName * groupname);14731474// Convert Matching Event Code to String1475const char* getMatchingEventStr(int code);14761477// Convert Matching Opcode ID to String1478const char* getMatchingOpcodeStr(int code);147914801481