2012-11-01 15:19:01 +00:00
// Copyright (c) 2012- PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
2012-11-04 22:01:49 +00:00
// the Free Software Foundation, version 2.0 or later versions.
2012-11-01 15:19:01 +00:00
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
2013-11-28 11:38:45 +00:00
# include "net/resolve.h"
# include "util/text/parsers.h"
2013-03-24 21:41:42 +00:00
# include "Common/ChunkFile.h"
2013-11-28 11:38:45 +00:00
# include "Core/HLE/HLE.h"
2014-03-15 18:22:19 +00:00
# include "Core/HLE/FunctionWrappers.h"
2013-11-28 11:38:45 +00:00
# include "Core/MIPS/MIPS.h"
# include "Core/Config.h"
2014-03-15 18:22:19 +00:00
# include "Core/MemMap.h"
2012-11-01 15:19:01 +00:00
# include "sceKernel.h"
2013-06-17 12:04:31 +00:00
# include "sceKernelThread.h"
2013-07-15 21:55:00 +00:00
# include "sceKernelMutex.h"
2014-12-08 09:40:08 +00:00
# include "sceNet.h"
2012-11-01 15:19:01 +00:00
# include "sceUtility.h"
2014-06-24 16:43:03 +00:00
# include "Core/HLE/sceNetAdhoc.h"
2013-03-24 21:41:42 +00:00
static bool netInited ;
2013-06-20 07:15:07 +00:00
static bool netInetInited ;
static bool netApctlInited ;
2013-03-24 21:41:42 +00:00
2013-06-18 03:37:36 +00:00
// TODO: Determine how many handlers we can actually have
2013-07-08 01:16:15 +00:00
const size_t MAX_APCTL_HANDLERS = 32 ;
2013-06-18 03:37:36 +00:00
2013-06-17 12:43:29 +00:00
enum {
2014-03-03 16:16:53 +00:00
ERROR_NET_BUFFER_TOO_SMALL = 0x80400706 ,
2013-03-24 21:41:42 +00:00
2014-03-03 16:16:53 +00:00
ERROR_NET_INET_ALREADY_INITIALIZED = 0x80410201 ,
2013-07-15 21:55:00 +00:00
2014-03-03 16:16:53 +00:00
ERROR_NET_RESOLVER_BAD_ID = 0x80410408 ,
ERROR_NET_RESOLVER_ALREADY_STOPPED = 0x8041040a ,
ERROR_NET_RESOLVER_INVALID_HOST = 0x80410414 ,
2013-03-24 21:41:42 +00:00
2014-03-03 16:16:53 +00:00
ERROR_NET_APCTL_ALREADY_INITIALIZED = 0x80410a01 ,
ERROR_NET_ADHOCCTL_TOO_MANY_HANDLERS = 0x80410b12 ,
2013-03-24 21:41:42 +00:00
} ;
2012-11-01 15:19:01 +00:00
2014-02-01 00:08:52 +00:00
enum {
PSP_NET_APCTL_EVENT_DISCONNECT_REQUEST = 5 ,
} ;
2013-06-17 12:43:29 +00:00
struct ProductStruct {
2013-07-27 22:42:23 +00:00
s32_le unknown ; // Unknown, set to 0
2013-06-17 12:15:43 +00:00
char product [ 9 ] ; // Game ID (Example: ULUS10000)
2013-06-04 04:39:03 +00:00
} ;
2013-06-17 12:43:29 +00:00
struct SceNetMallocStat {
2013-07-27 22:42:23 +00:00
s32_le pool ; // Pointer to the pool?
s32_le maximum ; // Maximum size of the pool?
s32_le free ; // How much memory is free
2013-06-17 23:27:59 +00:00
} ;
static struct SceNetMallocStat netMallocStat ;
2013-06-17 22:50:38 +00:00
2013-06-17 12:04:31 +00:00
2013-06-20 07:15:07 +00:00
struct ApctlHandler {
u32 entryPoint ;
u32 argument ;
} ;
static std : : map < int , ApctlHandler > apctlHandlers ;
2014-12-08 09:40:08 +00:00
static void __ResetInitNetLib ( ) {
2013-03-24 21:41:42 +00:00
netInited = false ;
2013-06-20 07:15:07 +00:00
netApctlInited = false ;
netInetInited = false ;
2013-03-24 21:41:42 +00:00
2013-07-17 21:34:17 +00:00
memset ( & netMallocStat , 0 , sizeof ( netMallocStat ) ) ;
2013-03-24 21:41:42 +00:00
}
2013-07-17 21:36:51 +00:00
void __NetInit ( ) {
__ResetInitNetLib ( ) ;
}
void __NetShutdown ( ) {
__ResetInitNetLib ( ) ;
}
2013-06-20 07:15:07 +00:00
2014-12-08 09:40:08 +00:00
static void __UpdateApctlHandlers ( int oldState , int newState , int flag , int error ) {
2013-06-20 07:15:07 +00:00
u32 args [ 5 ] = { 0 , 0 , 0 , 0 , 0 } ;
args [ 0 ] = oldState ;
args [ 1 ] = newState ;
args [ 2 ] = flag ;
args [ 3 ] = error ;
for ( std : : map < int , ApctlHandler > : : iterator it = apctlHandlers . begin ( ) ; it ! = apctlHandlers . end ( ) ; + + it ) {
args [ 4 ] = it - > second . argument ;
__KernelDirectMipsCall ( it - > second . entryPoint , NULL , args , 5 , true ) ;
2013-06-17 22:50:38 +00:00
}
}
2013-03-24 21:41:42 +00:00
// This feels like a dubious proposition, mostly...
2013-06-17 12:43:29 +00:00
void __NetDoState ( PointerWrap & p ) {
2013-09-15 03:23:03 +00:00
auto s = p . Section ( " sceNet " , 1 ) ;
if ( ! s )
return ;
2013-03-24 21:41:42 +00:00
p . Do ( netInited ) ;
2013-06-20 07:15:07 +00:00
p . Do ( netInetInited ) ;
p . Do ( netApctlInited ) ;
p . Do ( apctlHandlers ) ;
2013-06-17 22:50:38 +00:00
p . Do ( netMallocStat ) ;
2013-03-24 21:41:42 +00:00
}
2014-12-08 09:40:08 +00:00
static u32 sceNetTerm ( ) {
2014-06-24 16:43:03 +00:00
//May also need to Terminate netAdhocctl and netAdhoc since the game (ie. GTA:VCS, Wipeout Pulse, etc) might not called them before calling sceNetTerm and causing them to behave strangely on the next sceNetInit+sceNetAdhocInit
if ( netAdhocctlInited ) sceNetAdhocctlTerm ( ) ;
if ( netAdhocInited ) sceNetAdhocTerm ( ) ;
WARN_LOG ( SCENET , " UNTESTED sceNetTerm() " ) ;
netInited = false ;
return 0 ;
}
2013-06-17 12:04:31 +00:00
// TODO: should that struct actually be initialized here?
2014-12-08 09:40:08 +00:00
static u32 sceNetInit ( u32 poolSize , u32 calloutPri , u32 calloutStack , u32 netinitPri , u32 netinitStack ) {
2014-06-24 16:43:03 +00:00
// May need to Terminate old one first since the game (ie. GTA:VCS) might not called sceNetTerm before the next sceNetInit and behave strangely
if ( netInited ) sceNetTerm ( ) ;
ERROR_LOG ( SCENET , " UNIMPL sceNetInit(poolsize=%d, calloutpri=%i, calloutstack=%d, netintrpri=%i, netintrstack=%d) at %08x " , poolSize , calloutPri , calloutStack , netinitPri , netinitStack , currentMIPS - > pc ) ;
2013-03-24 21:41:42 +00:00
netInited = true ;
2013-10-05 16:58:02 +00:00
netMallocStat . maximum = poolSize ;
netMallocStat . free = poolSize ;
2013-06-17 12:04:31 +00:00
netMallocStat . pool = 0 ;
2013-06-17 22:50:38 +00:00
2013-10-05 16:58:02 +00:00
return 0 ;
2012-11-01 15:19:01 +00:00
}
2014-12-08 09:40:08 +00:00
static u32 sceWlanGetEtherAddr ( u32 addrAddr ) {
// Read MAC Address from config
2013-11-28 11:38:45 +00:00
uint8_t mac [ 6 ] = { 0 } ;
2014-07-07 20:29:48 +00:00
if ( ! ParseMacAddress ( g_Config . sMACAddress . c_str ( ) , mac ) ) {
ERROR_LOG ( SCENET , " Error parsing mac address %s " , g_Config . sMACAddress . c_str ( ) ) ;
2013-11-28 11:38:45 +00:00
}
2013-09-07 19:19:21 +00:00
DEBUG_LOG ( SCENET , " sceWlanGetEtherAddr(%08x) " , addrAddr ) ;
2012-11-01 15:19:01 +00:00
for ( int i = 0 ; i < 6 ; i + + )
2013-11-28 11:38:45 +00:00
Memory : : Write_U8 ( mac [ i ] , addrAddr + i ) ;
2012-11-01 15:19:01 +00:00
return 0 ;
}
2014-12-08 09:40:08 +00:00
static u32 sceNetGetLocalEtherAddr ( u32 addrAddr ) {
2013-10-26 14:47:52 +00:00
return sceWlanGetEtherAddr ( addrAddr ) ;
}
2014-12-08 09:40:08 +00:00
static u32 sceWlanDevIsPowerOn ( ) {
2013-12-04 22:28:20 +00:00
DEBUG_LOG ( SCENET , " UNTESTED sceWlanDevIsPowerOn() " ) ;
return g_Config . bEnableWlan ? 1 : 0 ;
2012-11-23 09:33:19 +00:00
}
2014-12-08 09:40:08 +00:00
static u32 sceWlanGetSwitchState ( ) {
2013-09-07 19:19:21 +00:00
DEBUG_LOG ( SCENET , " UNTESTED sceWlanGetSwitchState() " ) ;
2013-12-04 22:28:20 +00:00
return g_Config . bEnableWlan ? 1 : 0 ;
2012-11-01 15:19:01 +00:00
}
2013-08-30 06:47:03 +00:00
// Probably a void function, but often returns a useful value.
2014-12-08 09:40:08 +00:00
static int sceNetEtherNtostr ( u32 macPtr , u32 bufferPtr ) {
2013-09-07 19:19:21 +00:00
DEBUG_LOG ( SCENET , " sceNetEtherNtostr(%08x, %08x) " , macPtr , bufferPtr ) ;
2013-08-30 06:47:03 +00:00
if ( Memory : : IsValidAddress ( bufferPtr ) & & Memory : : IsValidAddress ( macPtr ) ) {
char * buffer = ( char * ) Memory : : GetPointer ( bufferPtr ) ;
const u8 * mac = Memory : : GetPointer ( macPtr ) ;
// MAC address is always 6 bytes / 48 bits.
return sprintf ( buffer , " %02x:%02x:%02x:%02x:%02x:%02x " ,
mac [ 0 ] , mac [ 1 ] , mac [ 2 ] , mac [ 3 ] , mac [ 4 ] , mac [ 5 ] ) ;
} else {
// Possibly a void function, seems to return this on bad args.
return 0x09d40000 ;
2013-06-17 12:15:43 +00:00
}
2013-08-30 06:47:03 +00:00
}
2013-06-17 22:50:38 +00:00
2013-08-30 06:47:03 +00:00
static int hex_to_digit ( int c ) {
if ( c > = ' 0 ' & & c < = ' 9 ' )
return c - ' 0 ' ;
if ( c > = ' a ' & & c < = ' f ' )
return c - ' a ' + 10 ;
if ( c > = ' A ' & & c < = ' F ' )
return c - ' A ' + 10 ;
return - 1 ;
}
// Probably a void function, but sometimes returns a useful-ish value.
2014-12-08 09:40:08 +00:00
static int sceNetEtherStrton ( u32 bufferPtr , u32 macPtr ) {
2013-09-07 19:19:21 +00:00
DEBUG_LOG ( SCENET , " sceNetEtherStrton(%08x, %08x) " , bufferPtr , macPtr ) ;
2013-09-01 08:05:35 +00:00
2013-08-30 06:47:03 +00:00
if ( Memory : : IsValidAddress ( bufferPtr ) & & Memory : : IsValidAddress ( macPtr ) ) {
const char * buffer = ( char * ) Memory : : GetPointer ( bufferPtr ) ;
u8 * mac = Memory : : GetPointer ( macPtr ) ;
// MAC address is always 6 pairs of hex digits.
// TODO: Funny stuff happens if it's too short.
u8 value = 0 ;
for ( int i = 0 ; i < 6 & & * buffer ! = 0 ; + + i ) {
value = 0 ;
int c = hex_to_digit ( * buffer + + ) ;
if ( c ! = - 1 ) {
value | = c < < 4 ;
}
c = hex_to_digit ( * buffer + + ) ;
if ( c ! = - 1 ) {
value | = c ;
}
* mac + + = value ;
// Skip a single character in between.
// TODO: Strange behavior on the PSP, let's just null check.
if ( * buffer + + = = 0 ) {
break ;
}
}
// Seems to maybe kinda return the last value. Probably returns void.
return value ;
} else {
// Possibly a void function, seems to return this on bad args (or crash.)
return 0 ;
}
2013-06-04 04:39:03 +00:00
}
2013-06-17 12:04:31 +00:00
// Write static data since we don't actually manage any memory for sceNet* yet.
2014-12-08 09:40:08 +00:00
static int sceNetGetMallocStat ( u32 statPtr ) {
2013-09-07 19:19:21 +00:00
WARN_LOG ( SCENET , " UNTESTED sceNetGetMallocStat(%x) " , statPtr ) ;
2013-06-17 12:04:31 +00:00
if ( Memory : : IsValidAddress ( statPtr ) )
Memory : : WriteStruct ( statPtr , & netMallocStat ) ;
else
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNTESTED sceNetGetMallocStat(%x): tried to request invalid address! " , statPtr ) ;
2013-06-17 12:04:31 +00:00
return 0 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetInetInit ( ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetInetInit() " ) ;
2013-06-20 07:15:07 +00:00
if ( netInetInited )
2013-07-15 21:55:00 +00:00
return ERROR_NET_INET_ALREADY_INITIALIZED ;
2013-06-20 07:15:07 +00:00
netInetInited = true ;
return 0 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetInetTerm ( ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetInetTerm() " ) ;
2013-06-20 07:15:07 +00:00
netInetInited = false ;
return 0 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetApctlInit ( ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetApctlInit() " ) ;
2013-09-06 22:55:42 +00:00
if ( netApctlInited )
2013-07-15 21:55:00 +00:00
return ERROR_NET_APCTL_ALREADY_INITIALIZED ;
2013-06-20 07:15:07 +00:00
netApctlInited = true ;
return 0 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetApctlTerm ( ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNeApctlTerm() " ) ;
2013-07-15 21:55:00 +00:00
netApctlInited = false ;
2013-06-20 07:15:07 +00:00
return 0 ;
}
// TODO: How many handlers can the PSP actually have for Apctl?
// TODO: Should we allow the same handler to be added more than once?
2014-12-08 09:40:08 +00:00
static u32 sceNetApctlAddHandler ( u32 handlerPtr , u32 handlerArg ) {
2013-06-20 07:15:07 +00:00
bool foundHandler = false ;
2013-07-08 01:16:15 +00:00
u32 retval = 0 ;
2013-06-20 07:15:07 +00:00
struct ApctlHandler handler ;
memset ( & handler , 0 , sizeof ( handler ) ) ;
2013-07-08 01:16:15 +00:00
while ( apctlHandlers . find ( retval ) ! = apctlHandlers . end ( ) )
+ + retval ;
2013-06-20 07:15:07 +00:00
handler . entryPoint = handlerPtr ;
handler . argument = handlerArg ;
for ( std : : map < int , ApctlHandler > : : iterator it = apctlHandlers . begin ( ) ; it ! = apctlHandlers . end ( ) ; it + + ) {
if ( it - > second . entryPoint = = handlerPtr ) {
foundHandler = true ;
break ;
}
}
if ( ! foundHandler & & Memory : : IsValidAddress ( handlerPtr ) ) {
2013-07-08 01:16:15 +00:00
if ( apctlHandlers . size ( ) > = MAX_APCTL_HANDLERS ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNTESTED sceNetApctlAddHandler(%x, %x): Too many handlers " , handlerPtr , handlerArg ) ;
2013-06-20 07:15:07 +00:00
retval = ERROR_NET_ADHOCCTL_TOO_MANY_HANDLERS ; // TODO: What's the proper error code for Apctl's TOO_MANY_HANDLERS?
return retval ;
}
2013-07-08 01:16:15 +00:00
apctlHandlers [ retval ] = handler ;
2013-09-07 19:19:21 +00:00
WARN_LOG ( SCENET , " UNTESTED sceNetApctlAddHandler(%x, %x): added handler %d " , handlerPtr , handlerArg , retval ) ;
2013-06-20 07:15:07 +00:00
}
else
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNTESTED sceNetApctlAddHandler(%x, %x): Same handler already exists " , handlerPtr , handlerArg ) ;
2013-06-20 07:15:07 +00:00
// The id to return is the number of handlers currently registered
return retval ;
}
2014-12-08 09:40:08 +00:00
static int sceNetApctlDelHandler ( u32 handlerID ) {
2013-06-20 07:15:07 +00:00
if ( apctlHandlers . find ( handlerID ) ! = apctlHandlers . end ( ) ) {
apctlHandlers . erase ( handlerID ) ;
2013-09-07 19:19:21 +00:00
WARN_LOG ( SCENET , " UNTESTED sceNetapctlDelHandler(%d): deleted handler %d " , handlerID , handlerID ) ;
2013-06-20 07:15:07 +00:00
}
else
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNTESTED sceNetapctlDelHandler(%d): asked to delete invalid handler %d " , handlerID , handlerID ) ;
2013-06-20 07:15:07 +00:00
return 0 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetInetInetAton ( const char * hostname , u32 addrPtr ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetInetInetAton(%s, %08x) " , hostname , addrPtr ) ;
2013-07-08 20:40:16 +00:00
return - 1 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetInetRecv ( int socket , u32 bufPtr , u32 bufLen , u32 flags ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetInetRecv(%i, %08x, %i, %08x) " , socket , bufPtr , bufLen , flags ) ;
2013-07-08 20:40:16 +00:00
return - 1 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetInetSend ( int socket , u32 bufPtr , u32 bufLen , u32 flags ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetInetSend(%i, %08x, %i, %08x) " , socket , bufPtr , bufLen , flags ) ;
2013-07-08 20:40:16 +00:00
return - 1 ;
}
2013-06-20 07:15:07 +00:00
2014-12-08 09:40:08 +00:00
static int sceNetInetGetErrno ( ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetInetGetErrno() " ) ;
2013-07-08 20:40:16 +00:00
return - 1 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetInetSocket ( int domain , int type , int protocol ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetInetSocket(%i, %i, %i) " , domain , type , protocol ) ;
2013-07-08 20:40:16 +00:00
return - 1 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetInetSetsockopt ( int socket , int level , int optname , u32 optvalPtr , int optlen ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetInetSetsockopt(%i, %i, %i, %08x, %i) " , socket , level , optname , optvalPtr , optlen ) ;
2013-07-08 20:40:16 +00:00
return - 1 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetInetConnect ( int socket , u32 sockAddrInternetPtr , int addressLength ) {
2013-09-07 19:19:21 +00:00
ERROR_LOG ( SCENET , " UNIMPL sceNetInetConnect(%i, %08x, %i) " , socket , sockAddrInternetPtr , addressLength ) ;
2013-07-08 20:40:16 +00:00
return - 1 ;
}
2013-06-20 07:15:07 +00:00
2014-12-08 09:40:08 +00:00
static int sceNetApctlDisconnect ( ) {
2014-02-01 00:08:52 +00:00
ERROR_LOG ( SCENET , " UNIMPL %s() " , __FUNCTION__ ) ;
// Like its 'sister' function sceNetAdhocctlDisconnect, we need to alert Apctl handlers that a disconnect took place
2014-02-01 04:16:39 +00:00
// or else games like Phantasy Star Portable 2 will hang at certain points (e.g. returning to the main menu after trying to connect to PSN).
2014-02-01 00:08:52 +00:00
__UpdateApctlHandlers ( 0 , 0 , PSP_NET_APCTL_EVENT_DISCONNECT_REQUEST , 0 ) ;
return 0 ;
}
2014-12-08 09:40:08 +00:00
static int sceNetResolverInit ( )
2014-09-02 19:40:42 +00:00
{
ERROR_LOG ( SCENET , " UNIMPL %s() " , __FUNCTION__ ) ;
return 0 ;
}
2013-06-17 12:43:29 +00:00
const HLEFunction sceNet [ ] = {
2013-10-05 16:58:02 +00:00
{ 0x39AF39A6 , WrapU_UUUUU < sceNetInit > , " sceNetInit " } ,
2013-03-24 21:41:42 +00:00
{ 0x281928A9 , WrapU_V < sceNetTerm > , " sceNetTerm " } ,
2013-08-30 06:47:03 +00:00
{ 0x89360950 , WrapI_UU < sceNetEtherNtostr > , " sceNetEtherNtostr " } ,
{ 0xd27961c9 , WrapI_UU < sceNetEtherStrton > , " sceNetEtherStrton " } ,
2013-10-26 14:47:52 +00:00
{ 0x0bf0a3ae , WrapU_U < sceNetGetLocalEtherAddr > , " sceNetGetLocalEtherAddr " } ,
2013-08-30 06:47:03 +00:00
{ 0x50647530 , 0 , " sceNetFreeThreadinfo " } ,
2013-06-17 12:04:31 +00:00
{ 0xcc393e48 , WrapI_U < sceNetGetMallocStat > , " sceNetGetMallocStat " } ,
2013-05-20 01:47:54 +00:00
{ 0xad6844c6 , 0 , " sceNetThreadAbort " } ,
2012-11-01 15:19:01 +00:00
} ;
2013-06-17 12:43:29 +00:00
const HLEFunction sceNetResolver [ ] = {
2012-11-01 15:19:01 +00:00
{ 0x224c5f44 , 0 , " sceNetResolverStartNtoA " } ,
{ 0x244172af , 0 , " sceNetResolverCreate " } ,
{ 0x94523e09 , 0 , " sceNetResolverDelete " } ,
2014-09-02 19:40:42 +00:00
{ 0xf3370e61 , WrapI_V < sceNetResolverInit > , " sceNetResolverInit " } ,
2012-11-01 15:19:01 +00:00
{ 0x808F6063 , 0 , " sceNetResolverStop " } ,
2013-05-20 02:21:59 +00:00
{ 0x6138194A , 0 , " sceNetResolverTerm " } ,
2013-05-20 01:47:54 +00:00
{ 0x629e2fb7 , 0 , " sceNetResolverStartAtoN " } ,
{ 0x14c17ef9 , 0 , " sceNetResolverStartNtoAAsync " } ,
{ 0xaac09184 , 0 , " sceNetResolverStartAtoNAsync " } ,
{ 0x12748eb9 , 0 , " sceNetResolverWaitAsync " } ,
{ 0x4ee99358 , 0 , " sceNetResolverPollAsync " } ,
2012-11-01 15:19:01 +00:00
} ;
2013-06-17 12:43:29 +00:00
const HLEFunction sceNetInet [ ] = {
2013-06-20 07:15:07 +00:00
{ 0x17943399 , WrapI_V < sceNetInetInit > , " sceNetInetInit " } ,
2013-07-08 20:40:16 +00:00
{ 0x4cfe4e56 , 0 , " sceNetInetShutdown " } ,
{ 0xa9ed66b9 , WrapI_V < sceNetInetTerm > , " sceNetInetTerm " } ,
{ 0x8b7b220f , WrapI_III < sceNetInetSocket > , " sceNetInetSocket " } ,
{ 0x2fe71fe7 , WrapI_IIIUI < sceNetInetSetsockopt > , " sceNetInetSetsockopt " } ,
{ 0x4a114c7c , 0 , " sceNetInetGetsockopt " } ,
{ 0x410b34aa , WrapI_IUI < sceNetInetConnect > , " sceNetInetConnect " } ,
{ 0x805502DD , 0 , " sceNetInetCloseWithRST " } ,
{ 0xd10a1a7a , 0 , " sceNetInetListen " } ,
{ 0xdb094e1b , 0 , " sceNetInetAccept " } ,
{ 0xfaabb1dd , 0 , " sceNetInetPoll " } ,
2012-11-01 15:19:01 +00:00
{ 0x5be8d595 , 0 , " sceNetInetSelect " } ,
{ 0x8d7284ea , 0 , " sceNetInetClose " } ,
2013-07-08 20:40:16 +00:00
{ 0xcda85c99 , WrapI_IUUU < sceNetInetRecv > , " sceNetInetRecv " } ,
{ 0xc91142e4 , 0 , " sceNetInetRecvfrom " } ,
{ 0xeece61d2 , 0 , " sceNetInetRecvmsg " } ,
2013-12-14 09:27:40 +00:00
{ 0x7aa671bc , WrapI_IUUU < sceNetInetSend > , " sceNetInetSend " } ,
2012-11-01 15:19:01 +00:00
{ 0x05038fc7 , 0 , " sceNetInetSendto " } ,
2013-07-08 20:40:16 +00:00
{ 0x774e36f4 , 0 , " sceNetInetSendmsg " } ,
{ 0xfbabe411 , WrapI_V < sceNetInetGetErrno > , " sceNetInetGetErrno " } ,
2012-11-01 15:19:01 +00:00
{ 0x1a33f9ae , 0 , " sceNetInetBind " } ,
2013-07-08 20:40:16 +00:00
{ 0xb75d5b0a , 0 , " sceNetInetInetAddr " } ,
{ 0x1BDF5D13 , WrapI_CU < sceNetInetInetAton > , " sceNetInetInetAton " } ,
2012-11-01 15:19:01 +00:00
{ 0xd0792666 , 0 , " sceNetInetInetNtop " } ,
{ 0xE30B8C19 , 0 , " sceNetInetInetPton " } ,
2013-07-08 20:40:16 +00:00
{ 0x8ca3a97e , 0 , " sceNetInetGetPspError " } ,
2012-11-14 18:33:18 +00:00
{ 0xE247B6D6 , 0 , " sceNetInetGetpeername " } ,
2012-11-27 10:40:30 +00:00
{ 0x162e6fd5 , 0 , " sceNetInetGetsockname " } ,
2012-12-06 16:03:39 +00:00
{ 0x80A21ABD , 0 , " sceNetInetSocketAbort " } ,
2013-05-20 01:47:54 +00:00
{ 0x39b0c7d3 , 0 , " sceNetInetGetUdpcbstat " } ,
2013-07-08 20:40:16 +00:00
{ 0xb3888ad4 , 0 , " sceNetInetGetTcpcbstat " } ,
2012-11-01 15:19:01 +00:00
} ;
2013-03-24 23:07:30 +00:00
2013-06-17 12:43:29 +00:00
const HLEFunction sceNetApctl [ ] = {
2012-11-01 15:19:01 +00:00
{ 0xCFB957C6 , 0 , " sceNetApctlConnect " } ,
2014-02-01 00:08:52 +00:00
{ 0x24fe91a1 , & WrapI_V < sceNetApctlDisconnect > , " sceNetApctlDisconnect " } ,
2012-11-01 15:19:01 +00:00
{ 0x5deac81b , 0 , " sceNetApctlGetState " } ,
2013-06-20 07:15:07 +00:00
{ 0x8abadd51 , WrapU_UU < sceNetApctlAddHandler > , " sceNetApctlAddHandler " } ,
{ 0xe2f91f9b , WrapI_V < sceNetApctlInit > , " sceNetApctlInit " } ,
{ 0x5963991b , WrapI_U < sceNetApctlDelHandler > , " sceNetApctlDelHandler " } ,
{ 0xb3edd0ec , WrapI_V < sceNetApctlTerm > , " sceNetApctlTerm " } ,
2012-11-01 15:19:01 +00:00
{ 0x2BEFDF23 , 0 , " sceNetApctlGetInfo " } ,
2013-05-20 01:47:54 +00:00
{ 0xa3e77e13 , 0 , " sceNetApctlScanSSID2 " } ,
2013-08-23 06:04:55 +00:00
{ 0xe9b2e5e6 , 0 , " sceNetApctlScanUser " } ,
2013-05-20 01:47:54 +00:00
{ 0xf25a5006 , 0 , " sceNetApctlGetBSSDescIDList2 " } ,
{ 0x2935c45b , 0 , " sceNetApctlGetBSSDescEntry2 " } ,
2013-08-23 06:04:55 +00:00
{ 0x04776994 , 0 , " sceNetApctlGetBSSDescEntryUser " } ,
{ 0x6bddcb8c , 0 , " sceNetApctlGetBSSDescIDListUser " } ,
2012-11-01 15:19:01 +00:00
} ;
2013-06-17 12:43:29 +00:00
const HLEFunction sceWlanDrv [ ] = {
2012-11-23 09:33:19 +00:00
{ 0xd7763699 , WrapU_V < sceWlanGetSwitchState > , " sceWlanGetSwitchState " } ,
2012-11-05 09:05:09 +00:00
{ 0x0c622081 , WrapU_U < sceWlanGetEtherAddr > , " sceWlanGetEtherAddr " } ,
{ 0x93440B11 , WrapU_V < sceWlanDevIsPowerOn > , " sceWlanDevIsPowerOn " } ,
2012-11-01 15:19:01 +00:00
} ;
2013-06-17 12:43:29 +00:00
void Register_sceNet ( ) {
2012-11-01 15:19:01 +00:00
RegisterModule ( " sceNet " , ARRAY_SIZE ( sceNet ) , sceNet ) ;
RegisterModule ( " sceNetResolver " , ARRAY_SIZE ( sceNetResolver ) , sceNetResolver ) ;
RegisterModule ( " sceNetInet " , ARRAY_SIZE ( sceNetInet ) , sceNetInet ) ;
RegisterModule ( " sceNetApctl " , ARRAY_SIZE ( sceNetApctl ) , sceNetApctl ) ;
}
2013-06-17 12:43:29 +00:00
void Register_sceWlanDrv ( ) {
2012-11-01 15:19:01 +00:00
RegisterModule ( " sceWlanDrv " , ARRAY_SIZE ( sceWlanDrv ) , sceWlanDrv ) ;
}