mirror of
https://github.com/openmoh/openmohaa.git
synced 2025-04-28 21:57:57 +03:00
876 lines
22 KiB
C
876 lines
22 KiB
C
#include "../gsCommon.h"
|
|
|
|
// One of the following network devices must be defined
|
|
#if 0
|
|
#define T10K_ETHERNET
|
|
#endif
|
|
#if 0
|
|
#define USB_ETHERNET
|
|
#endif
|
|
#if 0
|
|
#define USB_ETHERNET_WITH_PPPOE
|
|
#endif
|
|
#if 1
|
|
#define HDD_ETHERNET
|
|
#endif
|
|
#if 0
|
|
#define HDD_ETHERNET_WITH_PPPOE
|
|
#endif
|
|
#if 0
|
|
#define MODEM
|
|
#endif
|
|
|
|
// attempts to load a module
|
|
static int load_module(const char * filename, int args, const char * argp)
|
|
{
|
|
int result;
|
|
|
|
result = sceSifLoadModule(filename, args, argp);
|
|
if(result < 0)
|
|
{
|
|
const char * errorString;
|
|
if(result == -100)
|
|
errorString = "Called from exception handler / interrupt handler";
|
|
else if(result == -200)
|
|
errorString = "Resident library required by loaded module does not exist";
|
|
else if(result == -201)
|
|
errorString = "Object file format is invalid";
|
|
else if(result == -203)
|
|
errorString = "Specified file was not found";
|
|
else if(result == -204)
|
|
errorString = "Error occurred when reading file";
|
|
else if(result == -400)
|
|
errorString = "Insufficient memory";
|
|
else if(result == -0x10000)
|
|
errorString = "Binding to the IOP module failed.";
|
|
else if(result == -0x10001)
|
|
errorString = "RPC to the IOP failed.";
|
|
else if(result == -0x10004)
|
|
errorString = "The IOP module version does not match.";
|
|
else
|
|
errorString = "Unknown error";
|
|
scePrintf("FAILED TO LOAD MODULE: %s\n", filename);
|
|
scePrintf("\t(%d:%s)\n", result, errorString);
|
|
while(1)
|
|
msleep(1);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
#define SCEROOT "host0:/usr/local/sce/"
|
|
#define MODROOT SCEROOT "iop/modules/"
|
|
#define APPROOT SCEROOT "conf/neticon/english/"
|
|
|
|
// SN Systems stack
|
|
#ifdef SN_SYSTEMS
|
|
|
|
// these only need to be set if using DHCP
|
|
// up to four DNS servers can be specified, and the list must be terminated with an empty string
|
|
#define SNPS2_IP_ADDR "0.0.0.0"
|
|
#define SNPS2_SUB_MSK "0.0.0.0"
|
|
#define SNPS2_GATEWAY "0.0.0.0"
|
|
static const sn_char* dns_servers[] = { "" };
|
|
|
|
static void load_network_modules()
|
|
{
|
|
// load the TCP/IP stack module
|
|
#ifndef _DEBUG
|
|
load_module(MODROOT "snstkrel.irx", 0, NULL);
|
|
#else
|
|
const char iop_params[]
|
|
= SNPS2_IP_ADDR "\x00" SNPS2_SUB_MSK "\x00" SNPS2_GATEWAY;
|
|
|
|
load_module(MODROOT "snstkdbg.irx", sizeof(iop_params), (char*) iop_params);
|
|
#endif
|
|
|
|
// load device specific module(s)
|
|
#if defined(T10K_ETHERNET)
|
|
load_module(MODROOT "sndrv000.irx", 0, NULL);
|
|
|
|
#elif defined(USB_ETHERNET)
|
|
load_module(MODROOT "usbd.irx", 0, NULL);
|
|
#if defined(USB_LUCENT)
|
|
load_module(MODROOT "sndrv002.irx", 0, NULL);
|
|
#elif defined(USB_CONEXANT)
|
|
load_module(MODROOT "sndrv003.irx", 0, NULL);
|
|
#else
|
|
load_module(MODROOT "sndrv001.irx", 0, NULL);
|
|
#endif
|
|
|
|
#elif defined(USB_ETHERNET_WITH_PPPOE)
|
|
load_module(MODROOT "usbd.irx", 0, NULL);
|
|
load_module(MODROOT "sndrv200.irx", 0, NULL);
|
|
load_module(MODROOT "sndrv201.irx", 0, NULL);
|
|
|
|
#elif defined(HDD_ETHERNET)
|
|
load_module(MODROOT "dev9.irx", 0, NULL);
|
|
load_module(MODROOT "sndrv100.irx", 0, NULL);
|
|
load_module(MODROOT "smap.irx", 0, NULL);
|
|
|
|
#elif defined(HDD_ETHERNET_WITH_PPPOE)
|
|
load_module(MODROOT "dev9.irx", 0, NULL);
|
|
load_module(MODROOT "sndrv200.irx", 0, NULL);
|
|
load_module(MODROOT "sndrv202.irx", 0, NULL);
|
|
load_module(MODROOT "smap.irx", 0, NULL);
|
|
|
|
#elif defined(MODEM)
|
|
load_module(MODROOT "dev9.irx", 0, NULL);
|
|
load_module(MODROOT "sndrv101.irx", 0, NULL);
|
|
load_module(MODROOT "spduart.irx", 0, NULL);
|
|
#endif
|
|
}
|
|
|
|
static sn_int32 do_initialisation(void)
|
|
{
|
|
sn_int32 result;
|
|
sn_int32 device_attached;
|
|
sn_int16 idVendor;
|
|
sn_int16 idProduct;
|
|
sn_int32 stack_state;
|
|
sndev_set_ether_ip_type params;
|
|
struct hostent * host;
|
|
sn_bool got_ip;
|
|
struct in_addr addr;
|
|
|
|
// load network modules
|
|
load_network_modules();
|
|
|
|
// init the socket API
|
|
scePrintf("Initializing the sockets API\n");
|
|
result = sockAPIinit(1);
|
|
if(result != 0)
|
|
{
|
|
scePrintf("sockAPIinit() failed %d\n", result);
|
|
return result;
|
|
}
|
|
|
|
// register this thread with the socket API
|
|
result = sockAPIregthr();
|
|
if(result != 0)
|
|
{
|
|
scePrintf("sockAPIregthr() failed %d\n", result);
|
|
return result;
|
|
}
|
|
|
|
// wait for the device adaptor to be attached
|
|
scePrintf("Waiting for network device to be initialized\n");
|
|
device_attached = SN_DEV_TYPE_NONE;
|
|
while(device_attached == SN_DEV_TYPE_NONE)
|
|
{
|
|
// check if attached
|
|
result = sndev_get_attached(0, &device_attached, &idVendor, &idProduct);
|
|
if(result != 0)
|
|
{
|
|
scePrintf("sndev_get_attached() failed %d\n", result);
|
|
return result;
|
|
}
|
|
|
|
// if nothing attached, give it a rest before trying again
|
|
if(device_attached == SN_DEV_TYPE_NONE)
|
|
sn_delay(10);
|
|
}
|
|
|
|
scePrintf("Device ready (idVendor=0x%04X idProduct=0x%04X)\n", ((int)idVendor) & 0xFFFF, ((int)idProduct) & 0xFFFF);
|
|
|
|
// set the DNS servers
|
|
result = sntc_set_dns_server_list((const sn_char**)dns_servers);
|
|
if(result != 0)
|
|
{
|
|
scePrintf("sntc_set_dns_server_list() failed %d\n", result);
|
|
return result;
|
|
}
|
|
|
|
// set the IP, subnet mask, and gateway (all 0's for DHCP)
|
|
inet_aton(SNPS2_IP_ADDR, (struct in_addr*)¶ms.ip_addr);
|
|
inet_aton(SNPS2_SUB_MSK, (struct in_addr*)¶ms.sub_mask);
|
|
inet_aton(SNPS2_GATEWAY, (struct in_addr*)¶ms.gateway);
|
|
result = sndev_set_options(0, SN_DEV_SET_ETHER_IP, ¶ms, sizeof(params));
|
|
if(result != 0)
|
|
{
|
|
scePrintf("sndev_set_options() failed %d\n", result);
|
|
return result;
|
|
}
|
|
|
|
// start the stack
|
|
scePrintf("Starting the TCP/IP stack\n");
|
|
result = sn_stack_state(SN_STACK_STATE_START, &stack_state);
|
|
if(result != 0)
|
|
{
|
|
scePrintf("sn_stack_sate() failed %d\n", result);
|
|
return result;
|
|
}
|
|
|
|
// wait for the stack to come up
|
|
while(sn_socket_api_ready() == SN_FALSE)
|
|
sn_delay(100);
|
|
|
|
// wait for a non-zero IP (for DHCP)
|
|
scePrintf("Waiting for DHCP-supplied IP\n");
|
|
got_ip = SN_FALSE;
|
|
do
|
|
{
|
|
// get the local host info
|
|
host = gethostbyname(LOCAL_NAME);
|
|
if(host && host->h_addr_list[0])
|
|
{
|
|
// copy the IP
|
|
memcpy(&addr, host->h_addr_list[0], sizeof(addr));
|
|
if(addr.s_addr)
|
|
{
|
|
got_ip = SN_TRUE;
|
|
scePrintf("DHCP allocated IP addr %s\n", inet_ntoa(addr));
|
|
}
|
|
}
|
|
|
|
// don't hog the CPU
|
|
if(got_ip == SN_FALSE)
|
|
sn_delay(100);
|
|
}
|
|
while(got_ip == SN_FALSE);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void do_shutdown(void)
|
|
{
|
|
int result;
|
|
int stack_state;
|
|
|
|
// stopping the stack
|
|
result = sn_stack_state(SN_STACK_STATE_STOP, &stack_state);
|
|
if(result != 0)
|
|
{
|
|
scePrintf("sn_stack_sate() failed %d\n", result);
|
|
return;
|
|
}
|
|
|
|
// deregister this thread with the socket API
|
|
sockAPIderegthr();
|
|
}
|
|
#endif // SN_SYSTEMS
|
|
|
|
#ifdef EENET
|
|
|
|
#ifdef __MWERKS__
|
|
#include "/ee/sample/libeenet/ent_cnf/ent_cnf.h"
|
|
#else
|
|
#include "/usr/local/sce/ee/sample/libeenet/ent_cnf/ent_cnf.h"
|
|
#endif
|
|
|
|
#if defined(USB_ETHERNET)
|
|
#define USR_CONF_NAME "Combination4"
|
|
#elif defined(USB_ETHERNET_WITH_PPPOE)
|
|
#define USR_CONF_NAME "Combination5"
|
|
#elif defined(HDD_ETHERNET)
|
|
#define USR_CONF_NAME "Combination6"
|
|
#elif defined(HDD_ETHERNET_WITH_PPPOE)
|
|
#define USR_CONF_NAME "Combination7"
|
|
#elif defined(MODEM)
|
|
#define USR_CONF_NAME ""
|
|
#endif
|
|
|
|
#define MOD_NETCNF MODROOT "netcnf.irx"
|
|
#define MOD_EENETCTL MODROOT "eenetctl.irx"
|
|
#define MOD_DEV9 MODROOT "dev9.irx"
|
|
#define MOD_USBD MODROOT "usbd.irx"
|
|
#define MOD_ENT_DEVM MODROOT "ent_devm.irx"
|
|
#define MOD_ENT_SMAP MODROOT "ent_smap.irx"
|
|
#define MOD_ENT_ETH MODROOT "ent_eth.irx"
|
|
#define MOD_ENT_PPP MODROOT "ent_ppp.irx"
|
|
#define MOD_ENT_CNF SCEROOT "iop/sample/libeenet/ent_cnf/ent_cnf.irx"
|
|
#define MOD_MODEMDRV ""
|
|
|
|
#define INETCTL_ARG "-no_auto" "\0" "-no_decode"
|
|
#define NETCNF_ICON APPROOT "SYS_NET.ICO"
|
|
#define NETCNF_ICONSYS APPROOT "icon.sys"
|
|
#define NETCNF_ARG "icon=" NETCNF_ICON "\0" "iconsys=" NETCNF_ICONSYS
|
|
#define MODEMDRV_ARG ""
|
|
|
|
#define NET_DB SCEROOT "conf/net/net.db"
|
|
|
|
#define EENET_MEMSIZE (512 * 1024)
|
|
#define EENET_TPL 32
|
|
#define EENET_APP_PRIO 48
|
|
|
|
static int eenetctl_mid;
|
|
static int ent_cnf_mid;
|
|
static int ent_devm_mid;
|
|
#if defined(HDD_ETHERNET) || defined(HDD_ETHERNET_WITH_PPPOE)
|
|
#define EENET_IFNAME "smap0"
|
|
static int ent_smap_mid;
|
|
#endif
|
|
#if defined(USB_ETHERNET) || defined(USB_ETHERNET_WITH_PPPOE)
|
|
#define EENET_IFNAME "eth0"
|
|
static int ent_eth_mid;
|
|
#endif
|
|
#if defined(MODEM)
|
|
#define EENET_IFNAME "ppp0"
|
|
static int ent_ppp_mid;
|
|
static int modem_mid;
|
|
#endif
|
|
|
|
static void * eenet_pool;
|
|
|
|
static int sema_id;
|
|
static int event_flag = 0;
|
|
#define Ev_Attach 0x01
|
|
#define Ev_UpCompleted 0x02
|
|
#define Ev_DownCompleted 0x04
|
|
#define Ev_DetachCompleted 0x08
|
|
|
|
#define WaitEvent(event) \
|
|
while(1){ \
|
|
WaitSema(sema_id); \
|
|
if(event_flag & (event)) \
|
|
break; \
|
|
}
|
|
|
|
static void event_handler(const char *ifname, int af, int type)
|
|
{
|
|
scePrintf("event_handler: event happened. af = %d, type = %d\n", af, type);
|
|
|
|
switch(type)
|
|
{
|
|
case sceEENETCTL_IEV_Attach:
|
|
if(strcmp(ifname, EENET_IFNAME))
|
|
break;
|
|
event_flag |= Ev_Attach;
|
|
SignalSema(sema_id);
|
|
break;
|
|
case sceEENETCTL_IEV_UpCompleted:
|
|
event_flag |= Ev_UpCompleted;
|
|
SignalSema(sema_id);
|
|
break;
|
|
case sceEENETCTL_IEV_DownCompleted:
|
|
event_flag |= Ev_DownCompleted;
|
|
SignalSema(sema_id);
|
|
break;
|
|
case sceEENETCTL_IEV_DetachCompleted:
|
|
if(strcmp(ifname, EENET_IFNAME))
|
|
break;
|
|
event_flag |= Ev_DetachCompleted;
|
|
SignalSema(sema_id);
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
static int create_sema(int init_count, int max_count){
|
|
struct SemaParam sema_param;
|
|
int sema_id;
|
|
|
|
memset(&sema_param, 0, sizeof(struct SemaParam));
|
|
sema_param.initCount = init_count;
|
|
sema_param.maxCount = max_count;
|
|
sema_id = CreateSema(&sema_param);
|
|
|
|
return sema_id;
|
|
}
|
|
|
|
// ent_cnf sifrpc num
|
|
#define ENT_CNF_SIFRPC_NUM 0x0a31108e
|
|
|
|
// code
|
|
#define ENT_CNF_SIFRPC_LOAD_CONFIG 1
|
|
#define ENT_CNF_SIFRPC_SET_CONFIG 2
|
|
#define ENT_CNF_SIFRPC_SET_SIFCMD 3
|
|
|
|
// utility macro
|
|
#define ee_rpc_size(size) ((size + 15) & ~15)
|
|
#define iop_rpc_size(size) ((size + 3) & ~3)
|
|
|
|
#define NETBUFSIZE 512
|
|
#define RPCSIZE NETBUFSIZE * 4
|
|
|
|
static sceSifClientData cd;
|
|
static u_int rpc_buffer[NETBUFSIZE] __attribute__((aligned(64)));
|
|
|
|
int ent_cnf_init(void)
|
|
{
|
|
int i;
|
|
|
|
/* bind rpc */
|
|
while(1){
|
|
if (sceSifBindRpc(&cd, ENT_CNF_SIFRPC_NUM, 0) < 0) {
|
|
scePrintf("ent_cnf: sceSifBindRpc failed.\n");
|
|
while(1) {};
|
|
}
|
|
if (cd.serve != 0) break;
|
|
i = 0x10000;
|
|
while(i --) {};
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ent_cnf_load_config(const char *fname, const char *usr_name)
|
|
{
|
|
int ret, len;
|
|
|
|
strcpy((char *)rpc_buffer, fname);
|
|
len = (int)strlen(fname) + 1;
|
|
strcpy((char *)rpc_buffer + len, usr_name);
|
|
len += (int)strlen(usr_name) + 1;
|
|
|
|
ret = sceSifCallRpc(&cd, ENT_CNF_SIFRPC_LOAD_CONFIG, 0,
|
|
(void *)rpc_buffer, ee_rpc_size(len),
|
|
(void *)rpc_buffer, ee_rpc_size(sizeof(u_int)), 0, 0);
|
|
if(ret < 0){
|
|
scePrintf("ent_cnf: RPC call in ent_cnf_load_config() failed.\n");
|
|
return -1;
|
|
}
|
|
|
|
return (int)rpc_buffer[0];
|
|
}
|
|
|
|
int ent_cnf_set_config(void)
|
|
{
|
|
int ret;
|
|
|
|
ret = sceSifCallRpc(&cd, ENT_CNF_SIFRPC_SET_CONFIG, 0,
|
|
NULL, 0, (void *)rpc_buffer, ee_rpc_size(sizeof(u_int)), 0, 0);
|
|
if(ret < 0){
|
|
scePrintf("ent_cnf: RPC call in ent_cnf_set_config() failed.\n");
|
|
return -1;
|
|
}
|
|
|
|
return (int)rpc_buffer[0];
|
|
}
|
|
|
|
static void load_network_modules()
|
|
{
|
|
ent_devm_mid = load_module(MOD_ENT_DEVM, 0, NULL);
|
|
load_module(MOD_NETCNF, sizeof(NETCNF_ARG), NETCNF_ARG);
|
|
eenetctl_mid = load_module(MOD_EENETCTL, 0, NULL);
|
|
ent_cnf_mid = load_module(MOD_ENT_CNF, 0, NULL);
|
|
#if defined( HDD_ETHERNET ) || defined( HDD_ETHERNET_WITH_PPPOE )
|
|
load_module(MOD_DEV9, 0, NULL);
|
|
ent_smap_mid = load_module(MOD_ENT_SMAP, 0, NULL);
|
|
//PreparePowerOff();
|
|
#endif
|
|
#if defined( USB_ETHERNET ) || defined( USB_ETHERNET_WITH_PPPOE )
|
|
load_module(MOD_USBD, 0, NULL);
|
|
ent_eth_mid = load_module(MOD_ENT_ETH, 0, NULL);
|
|
#endif
|
|
#if defined( MODEM )
|
|
ent_ppp_mid = load_module(MOD_ENT_PPP, 0, NULL);
|
|
modem_mid = load_module(MOD_MODEMDRV, sizeof(MODEMDRV_ARG), MODEMDRV_ARG);
|
|
#endif
|
|
}
|
|
|
|
static int do_initialisation(void)
|
|
{
|
|
int rcode;
|
|
|
|
// create a semaphore
|
|
sema_id = create_sema(0, 1);
|
|
if(sema_id < 0)
|
|
{
|
|
scePrintf("create_sema() failed.\n");
|
|
return -1;
|
|
}
|
|
|
|
// load network modules
|
|
load_network_modules();
|
|
|
|
// allocate memory for EENet
|
|
//eenet_pool = gsimemalign(64, EENET_MEMSIZE);
|
|
eenet_pool = memalign(64, EENET_MEMSIZE);
|
|
if(eenet_pool == NULL)
|
|
return -1;
|
|
|
|
// initialize eenet
|
|
rcode = sceEENetInit(eenet_pool, EENET_MEMSIZE, EENET_TPL, 8192, EENET_APP_PRIO);
|
|
|
|
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetInit failed (%d)\n", rcode);
|
|
return -1;
|
|
}
|
|
|
|
#ifdef _DEBUG
|
|
sceEENetSetLogLevel(EENET_LOG_DEBUG);
|
|
#endif
|
|
|
|
// init eenetctl.a
|
|
rcode = sceEENetCtlInit(8192, 32, 8192, 32, 8192, 32, 1, 0);
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetCtlInit failed (%d)\n", rcode);
|
|
return -1;
|
|
}
|
|
|
|
// add event handler
|
|
rcode = sceEENetCtlRegisterEventHandler(event_handler);
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetCtlRegisterEventHandler failed (%d)\n", rcode);
|
|
return -1;
|
|
}
|
|
|
|
// init ent_cnf
|
|
rcode = ent_cnf_init();
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("ent_cnf_init failed (%d)\n", rcode);
|
|
return -1;
|
|
}
|
|
|
|
// register network interface driver
|
|
#if defined( HDD_ETHERNET ) || defined( HDD_ETHERNET_WITH_PPPOE )
|
|
rcode = sceEENetDeviceSMAPReg(8192, 8192);
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetDeviceSMAPReg failed (%d)\n", rcode);
|
|
return -1;
|
|
}
|
|
#endif
|
|
#if defined( USB_ETHERNET ) || defined( USB_ETHERNET_WITH_PPPOE )
|
|
rcode = sceEENetDeviceETHReg(8192, 8192);
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetDeviceETHReg failed (%d)\n", rcode);
|
|
return -1;
|
|
}
|
|
#endif
|
|
#if defined( MODEM )
|
|
rcode = sceEENetDevicePPPReg(8192, 8192);
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetDevicePPPReg failed (%d)\n", rcode);
|
|
return -1;
|
|
}
|
|
#endif
|
|
|
|
// wait until target interface is attached
|
|
WaitEvent(Ev_Attach);
|
|
|
|
// load network configuration
|
|
rcode = ent_cnf_load_config(NET_DB, USR_CONF_NAME);
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("ent_cnf_load_config failed (%d)\n", rcode);
|
|
return -1;
|
|
}
|
|
|
|
// set network configuration
|
|
rcode = ent_cnf_set_config();
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("ent_cnf_set_config failed (%d)\n", rcode);
|
|
return -1;
|
|
}
|
|
|
|
// wait for interface initialization to complete
|
|
WaitEvent(Ev_UpCompleted);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void do_shutdown(void)
|
|
{
|
|
int rcode;
|
|
|
|
// bring down the interface
|
|
rcode = sceEENetCtlDownInterface(EENET_IFNAME);
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetCtlDownInterface failed (%d)\n", rcode);
|
|
return;
|
|
}
|
|
|
|
// wait for the termination to complete
|
|
WaitEvent(Ev_DownCompleted);
|
|
|
|
// unload the driver module
|
|
#if defined( HDD_ETHERNET ) || defined( HDD_ETHERNET_WITH_PPPOE )
|
|
rcode = sceEENetDeviceSMAPUnreg();
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetDeviceSMAPUnreg failed (%d)\n", rcode);
|
|
return;
|
|
}
|
|
#endif
|
|
#if defined( USB_ETHERNET ) || defined( USB_ETHERNET_WITH_PPPOE )
|
|
rcode = sceEENetDeviceETHUnreg();
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetDeviceETHUnreg failed (%d)\n", rcode);
|
|
return;
|
|
}
|
|
#endif
|
|
#if defined( MODEM )
|
|
rcode = sceEENetDevicePPPUnreg();
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetDevicePPPUnreg failed (%d)\n", rcode);
|
|
return;
|
|
}
|
|
#endif
|
|
|
|
// wait for the detach to complete
|
|
WaitEvent(Ev_DetachCompleted);
|
|
|
|
// cancel the event handler
|
|
rcode = sceEENetCtlUnregisterEventHandler(event_handler);
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetCtlUnRegisterEventHandler failed (%d)\n", rcode);
|
|
return;
|
|
}
|
|
|
|
// eenetctl.a termination processing
|
|
rcode = sceEENetCtlTerm();
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetCtlTerm failed (%d)\n", rcode);
|
|
return;
|
|
}
|
|
|
|
// terminate eenet
|
|
rcode = sceEENetTerm();
|
|
if(rcode < 0)
|
|
{
|
|
scePrintf("sceEENetTerm failed (%d)\n", rcode);
|
|
return;
|
|
}
|
|
|
|
// stop and unload modules
|
|
#if defined( HDD_ETHERNET ) || defined( HDD_ETHERNET_WITH_PPPOE )
|
|
sceSifStopModule(ent_smap_mid, 0, NULL, &rcode);
|
|
sceSifUnloadModule(ent_smap_mid);
|
|
#endif
|
|
#if defined( USB_ETHERNET ) || defined( USB_ETHERNET_WITH_PPPOE )
|
|
sceSifStopModule(ent_eth_mid, 0, NULL, &rcode);
|
|
sceSifUnloadModule(ent_eth_mid);
|
|
#endif
|
|
#if defined( MODEM )
|
|
sceSifStopModule(modem_mid, 0, NULL, &rcode);
|
|
sceSifUnloadModule(modem_mid);
|
|
|
|
sceSifStopModule(ent_ppp_mid, 0, NULL, &rcode);
|
|
sceSifUnloadModule(ent_ppp_mid);
|
|
#endif
|
|
|
|
sceSifStopModule(ent_cnf_mid, 0, NULL, &rcode);
|
|
sceSifUnloadModule(ent_cnf_mid);
|
|
|
|
sceSifStopModule(eenetctl_mid, 0, NULL, &rcode);
|
|
sceSifUnloadModule(eenetctl_mid);
|
|
|
|
sceSifStopModule(ent_devm_mid, 0, NULL, &rcode);
|
|
sceSifUnloadModule(ent_devm_mid);
|
|
|
|
// free the EENet pool
|
|
if(eenet_pool != NULL)
|
|
free(eenet_pool);
|
|
}
|
|
|
|
#endif
|
|
|
|
#ifdef INSOCK
|
|
|
|
// These are also used in nonport.c to obtain the MAC address
|
|
sceSifMClientData gGSIInsockClientData;
|
|
u_int gGSIInsockSocketBuffer[NETBUFSIZE] __attribute__((aligned(64)));
|
|
|
|
|
|
// IRX paths
|
|
#define IOP_MOD_INET MODROOT "inet.irx"
|
|
#define IOP_MOD_AN986 MODROOT "an986.irx"
|
|
#define IOP_MOD_USBD MODROOT "usbd.irx"
|
|
#define IOP_MOD_NETCNF MODROOT "netcnf.irx"
|
|
#define IOP_MOD_INETCTL MODROOT "inetctl.irx"
|
|
#define IOP_MOD_MSIFRPC MODROOT "msifrpc.irx"
|
|
#define IOP_MOD_DEV9 MODROOT "dev9.irx"
|
|
#define IOP_MOD_SMAP MODROOT "smap.irx"
|
|
#define IOP_MOD_PPP MODROOT "ppp.irx"
|
|
#define IOP_MOD_PPPOE MODROOT "pppoe.irx"
|
|
#define IOP_MOD_LIBNET MODROOT "libnet.irx"
|
|
#define IOP_MOD_NETCNFIF MODROOT "netcnfif.irx"
|
|
#define IOP_MOD_INETLOG SCEROOT "iop/util/inet/inetlog.irx"
|
|
#define IOP_MOD_MODEMDRV ""
|
|
#define NET_DB SCEROOT "conf/net/net.db"
|
|
#define INET_ARG "debug=18"
|
|
#define INETCTL_ARG "-no_auto" "\0" "-no_decode"
|
|
#define LIBNET_ARG "-verbose"
|
|
#define NETCNF_ICON APPROOT "SYS_NET.ICO"
|
|
#define NETCNF_ICONSYS APPROOT "icon.sys"
|
|
#define NETCNF_ARG "icon=" NETCNF_ICON "\0" "iconsys=" NETCNF_ICONSYS
|
|
#define MODEMDRV_ARG ""
|
|
|
|
#if defined( USB_ETHERNET )
|
|
#define USR_CONF_NAME "Combination4"
|
|
#elif defined( USB_ETHERNET_WITH_PPPOE )
|
|
#define USR_CONF_NAME "Combination5"
|
|
#elif defined( HDD_ETHERNET )
|
|
#define USR_CONF_NAME "Combination6"
|
|
#elif defined( HDD_ETHERNET_WITH_PPPOE )
|
|
#define USR_CONF_NAME "Combination7"
|
|
#elif defined( MODEM )
|
|
#define USR_CONF_NAME ""
|
|
#endif
|
|
|
|
static int do_initialisation(void)
|
|
{
|
|
int result;
|
|
int i;
|
|
int if_id[sceLIBNET_MAX_INTERFACE];
|
|
sceInetAddress_t myaddr;
|
|
|
|
sceSifInitRpc( 0 );
|
|
|
|
load_module( IOP_MOD_INET, 0, NULL );
|
|
load_module( IOP_MOD_NETCNF, sizeof( NETCNF_ARG ), NETCNF_ARG );
|
|
load_module( IOP_MOD_INETCTL, sizeof( INETCTL_ARG ), INETCTL_ARG );
|
|
|
|
#if defined( USB_ETHERNET ) || defined( USB_ETHERNET_WITH_PPPOE )
|
|
load_module( IOP_MOD_USBD, 0, NULL );
|
|
load_module( IOP_MOD_AN986, 0, NULL );
|
|
#endif
|
|
|
|
#if defined( HDD_ETHERNET ) || defined( HDD_ETHERNET_WITH_PPPOE )
|
|
load_module( IOP_MOD_DEV9, 0, NULL );
|
|
load_module( IOP_MOD_SMAP, 0, NULL );
|
|
#endif
|
|
|
|
#if defined( USB_ETHERNET_WITH_PPPOE ) || defined( HDD_ETHERNET_WITH_PPPOE )
|
|
load_module( IOP_MOD_PPP, 0, NULL );
|
|
load_module( IOP_MOD_PPPOE, 0, NULL );
|
|
#endif
|
|
|
|
#if defined( MODEM )
|
|
load_module( IOP_MOD_PPP, 0, NULL );
|
|
load_module( IOP_MOD_USBD, 0, NULL );
|
|
load_module( IOP_MOD_MODEMDRV, sizeof( MODEMDRV_ARG ), MODEMDRV_ARG );
|
|
#endif
|
|
|
|
load_module( IOP_MOD_MSIFRPC, 0, NULL );
|
|
load_module( IOP_MOD_LIBNET, sizeof( LIBNET_ARG ), LIBNET_ARG );
|
|
load_module( IOP_MOD_NETCNFIF, 0, NULL );
|
|
|
|
#if defined( HDD_ETHERNET ) || defined( HDD_ETHERNET_WITH_PPPOE )
|
|
// PreparePowerOff();
|
|
#endif
|
|
|
|
// Initialize Libnet
|
|
sceSifMInitRpc(0);
|
|
|
|
result = sceInsockSetSifMBindRpcValue(NETBUFSIZE, sceLIBNET_STACKSIZE, sceLIBNET_PRIORITY);
|
|
if (result < 0)
|
|
return result;
|
|
|
|
result = sceLibnetInitialize(&gGSIInsockClientData, NETBUFSIZE, sceLIBNET_STACKSIZE, sceLIBNET_PRIORITY);
|
|
if (result < 0)
|
|
return result;
|
|
|
|
result = sceLibnetRegisterHandler(&gGSIInsockClientData, gGSIInsockSocketBuffer);
|
|
if (result < 0)
|
|
return result;
|
|
|
|
result = load_set_conf_extra(&gGSIInsockClientData, gGSIInsockSocketBuffer, NET_DB, USR_CONF_NAME, sceLIBNETF_AUTO_UPIF);
|
|
if (result < 0)
|
|
return result;
|
|
|
|
result = sceLibnetWaitGetAddress( &gGSIInsockClientData, gGSIInsockSocketBuffer, if_id, sceLIBNET_MAX_INTERFACE, &myaddr, sceLIBNETF_AUTO_UPIF );
|
|
if (result < 0)
|
|
return result;
|
|
|
|
for ( i = 0; i < sceLIBNET_MAX_INTERFACE; i++ ) {
|
|
if ( if_id[ i ] == 0 ) {
|
|
break;
|
|
}
|
|
scePrintf( "interface: %d\n", if_id[ i ] );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void do_shutdown(void)
|
|
{
|
|
// Release the network interface
|
|
down_interface(&gGSIInsockClientData, gGSIInsockSocketBuffer, 0);
|
|
|
|
// Shutdown libnet
|
|
libnet_term(&gGSIInsockClientData);
|
|
|
|
sceSifMExitRpc();
|
|
}
|
|
|
|
#endif // INSOCK
|
|
|
|
#ifdef GSI_VOICE
|
|
void load_voice_modules(void); // prototype so codewarrior will be happy
|
|
void load_voice_modules(void)
|
|
{
|
|
// this is the maximum size of a raw frame, in bytes
|
|
char lgaudArgs[] = "maxstream=512\n";
|
|
|
|
// load the usb module
|
|
load_module("host0:/usr/local/sce/iop/modules/usbd.irx", 0, NULL);
|
|
|
|
// load the lgAud module
|
|
// see the lgAud documentation for info on optional loading parameters
|
|
load_module("host0:/usr/local/sce/iop/modules/lgaud.irx", sizeof(lgaudArgs), lgaudArgs);
|
|
|
|
// load the lgVid module
|
|
// see the lgVid documentation for info on optional loading parameters
|
|
load_module("host0:/usr/local/sce/iop/modules/lgvid.irx", 0, NULL);
|
|
|
|
// load the SPU2 modules
|
|
load_module("host0:/usr/local/sce/iop/modules/libsd.irx", 0, NULL);
|
|
load_module("host0:/usr/local/sce/iop/modules/sdrdrv.irx", 0, NULL);
|
|
}
|
|
#endif
|
|
|
|
// New hooks required by crt0.s
|
|
#if !defined(__MWERKS__)
|
|
int _init(){ return 0; }
|
|
int _fini(){ return 0; }
|
|
|
|
#if (__GNUC__ >= 3)
|
|
int __main(int argc, char ** argp){ GSI_UNUSED(argp); GSI_UNUSED(argc); return 0; }
|
|
#endif
|
|
#endif
|
|
|
|
extern int test_main(int argc, char ** argp);
|
|
int main(int argc, char ** argp)
|
|
{
|
|
int result = 0;
|
|
|
|
GSI_UNUSED(argc);
|
|
GSI_UNUSED(argp);
|
|
|
|
printf("\nGameSpy Test App Initializing\n"
|
|
"----------------------------------\n");
|
|
|
|
// init RPC
|
|
sceSifInitRpc(0);
|
|
|
|
// initialize the stack
|
|
result = (int)do_initialisation();
|
|
if(result)
|
|
{
|
|
printf("Initialization failed\n");
|
|
return result;
|
|
}
|
|
|
|
#ifdef GSI_VOICE
|
|
load_voice_modules();
|
|
#endif
|
|
|
|
// start the actual program
|
|
printf("\nGameSpy Test App Starting\n"
|
|
"----------------------------------\n");
|
|
test_main(argc, argp);
|
|
|
|
// do any needed cleanup
|
|
do_shutdown();
|
|
printf("\nGameSpy Test App Exiting\n"
|
|
"----------------------------------\n");
|
|
|
|
return 0;
|
|
}
|