11 #include "rpc_client.h"
19 char netifName[NETMAN_NETIF_NAME_MAX_LEN];
22 }TransmitBuffer ALIGNED(64);
30 }ReceiveBuffer ALIGNED(64);
32 static int NetManIOSemaID, NETMAN_Tx_threadID;
33 static unsigned char NETMAN_Tx_ThreadStack[0x1000] ALIGNED(16);
35 static unsigned short int IOPFrameBufferWrPtr;
36 static u8 *IOPFrameBuffer = NULL;
37 static struct NetManBD *IOPFrameBufferStatus = NULL;
38 static struct NetManBD *FrameBufferStatus = NULL;
40 static unsigned char IsProcessingTx;
42 static void deinitCleanup(
void)
44 if(NetManIOSemaID > 0)
46 DeleteSema(NetManIOSemaID);
49 if(NETMAN_Tx_threadID > 0)
51 TerminateThread(NETMAN_Tx_threadID);
52 DeleteThread(NETMAN_Tx_threadID);
53 NETMAN_Tx_threadID = 0;
55 memset(&NETMAN_rpc_cd, 0,
sizeof(NETMAN_rpc_cd));
58 static void NETMAN_TxThread(
void *arg);
60 int NetManInitRPCClient(
void){
61 static const char NetManID[]=
"NetMan";
68 if(NETMAN_rpc_cd.server)
71 SemaData.init_count=1;
72 SemaData.option=(u32)NetManID;
74 if((NetManIOSemaID=CreateSema(&SemaData)) <= 0)
81 thread.func=&NETMAN_TxThread;
82 thread.stack=NETMAN_Tx_ThreadStack;
83 thread.stack_size=
sizeof(NETMAN_Tx_ThreadStack);
85 thread.initial_priority=0x56;
88 if((NETMAN_Tx_threadID=CreateThread(&
thread)) <= 0)
90 NETMAN_Tx_threadID = 0;
92 return NETMAN_Tx_threadID;
95 StartThread(NETMAN_Tx_threadID, NULL);
97 while((sceSifBindRpc(&NETMAN_rpc_cd, NETMAN_RPC_NUMBER, 0)<0)||(NETMAN_rpc_cd.server==NULL))
100 if((result=sceSifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_INIT, 0, NULL, 0, &ReceiveBuffer,
sizeof(s32), NULL, NULL))<0 || (result=ReceiveBuffer.result) != 0)
106 int NetManRPCRegisterNetworkStack(
void)
110 WaitSema(NetManIOSemaID);
112 if(FrameBufferStatus == NULL) FrameBufferStatus = memalign(64, NETMAN_RPC_BLOCK_SIZE *
sizeof(
struct NetManBD));
114 if(FrameBufferStatus != NULL)
116 memset(UNCACHED_SEG(FrameBufferStatus), 0, NETMAN_RPC_BLOCK_SIZE *
sizeof(
struct NetManBD));
117 TransmitBuffer.NetStack.FrameBufferStatus = FrameBufferStatus;
118 IOPFrameBufferWrPtr = 0;
122 if((result=ReceiveBuffer.NetStackResult.result) == 0)
124 IOPFrameBuffer = ReceiveBuffer.NetStackResult.FrameBuffer;
125 IOPFrameBufferStatus = ReceiveBuffer.NetStackResult.FrameBufferStatus;
134 SignalSema(NetManIOSemaID);
139 int NetManRPCUnregisterNetworkStack(
void)
143 WaitSema(NetManIOSemaID);
145 result=sceSifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_UNREG_NETWORK_STACK, 0, NULL, 0, NULL, 0, NULL, NULL);
146 IOPFrameBuffer = NULL;
147 IOPFrameBufferWrPtr = 0;
149 free(FrameBufferStatus);
150 FrameBufferStatus = NULL;
152 SignalSema(NetManIOSemaID);
157 void NetManDeinitRPCClient(
void)
159 if(NETMAN_rpc_cd.server)
161 WaitSema(NetManIOSemaID);
163 sceSifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_DEINIT, 0, NULL, 0, NULL, 0, NULL, NULL);
168 int NetManRpcIoctl(
unsigned int command,
void *args,
unsigned int args_len,
void *output,
unsigned int length)
171 struct NetManIoctl *IoctlArgs=&TransmitBuffer.IoctlArgs;
173 WaitSema(NetManIOSemaID);
175 IoctlArgs->command=command;
176 memcpy(IoctlArgs->args, args, args_len);
177 IoctlArgs->args_len=args_len;
178 IoctlArgs->output=output;
179 IoctlArgs->length=length;
181 if((result=sceSifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_IOCTL, 0, &TransmitBuffer,
sizeof(
struct NetManIoctl), &ReceiveBuffer,
sizeof(
struct NetManIoctlResult), NULL, NULL))>=0)
183 result=ReceiveBuffer.IoctlResult.result;
184 memcpy(output, ReceiveBuffer.IoctlResult.output, length);
187 SignalSema(NetManIOSemaID);
192 static void NETMAN_TxThread(
void *arg)
197 int dmat_id, unaligned, unalignedCache;
198 void *payload, *payloadAligned, *payloadCacheAligned;
199 volatile struct NetManBD *bd, *bdNext;
209 while((length = NetManTxPacketNext(&payload)) > 0)
214 unaligned = (int)((u32)payload & 15);
215 unalignedCache = (int)((u32)payload & 63);
216 payloadAligned = (
void*)((u32)payload & ~15);
217 payloadCacheAligned = (
void*)((u32)payload & ~63);
218 sceSifWriteBackDCache(payloadCacheAligned, (length + unalignedCache + 63) & ~63);
222 bd = UNCACHED_SEG(&FrameBufferStatus[IOPFrameBufferWrPtr]);
223 while(bd->length != 0){}
227 bdNext = UNCACHED_SEG(&FrameBufferStatus[(IOPFrameBufferWrPtr + 1) % NETMAN_RPC_BLOCK_SIZE]);
228 if((NumTx + 1) >= NETMAN_FRAME_GROUP_SIZE || bdNext->length == 0)
233 npcmd->length = length;
234 npcmd->offset = unaligned;
235 npcmd->id = IOPFrameBufferWrPtr;
237 while((dmat_id = sceSifSendCmd(NETMAN_SIFCMD_ID, &cmd,
sizeof(
SifCmdHeader_t),
238 (
void*)payloadAligned,
239 (
void*)&IOPFrameBuffer[IOPFrameBufferWrPtr * NETMAN_MAX_FRAME_SIZE],
240 (length + unaligned + 15) & ~15)) == 0){ };
244 bd->offset = unaligned;
247 dmat[0].src = (
void*)payloadAligned;
248 dmat[0].dest = (
void*)&IOPFrameBuffer[IOPFrameBufferWrPtr * NETMAN_MAX_FRAME_SIZE];
249 dmat[0].size = (length + unaligned + 15) & ~15;
251 dmat[1].src = (
void*)&FrameBufferStatus[IOPFrameBufferWrPtr];
252 dmat[1].dest = (
void*)&IOPFrameBufferStatus[IOPFrameBufferWrPtr];
253 dmat[1].size =
sizeof(
struct NetManBD);
256 while((dmat_id = sceSifSetDma(dmat, 2)) == 0){ };
260 IOPFrameBufferWrPtr = (IOPFrameBufferWrPtr + 1) % NETMAN_RPC_BLOCK_SIZE;
262 if((length = NetManTxPacketAfter(&payload)) > 0)
264 unaligned = (int)((u32)payload & 15);
265 unalignedCache = (int)((u32)payload & 63);
266 payloadAligned = (
void*)((u32)payload & ~15);
267 payloadCacheAligned = (
void*)((u32)payload & ~63);
268 sceSifWriteBackDCache(payloadCacheAligned, (length + unalignedCache + 63) & ~63);
273 while(sceSifDmaStat(dmat_id) >= 0){ };
282 void NetManRpcNetIFXmit(
void)
285 WakeupThread(NETMAN_Tx_threadID);
288 int NetManSetMainIF(
const char *name)
292 if (!NETMAN_rpc_cd.server)
295 WaitSema(NetManIOSemaID);
297 strlcpy(TransmitBuffer.netifName, name,
sizeof(TransmitBuffer.netifName));
298 TransmitBuffer.netifName[NETMAN_NETIF_NAME_MAX_LEN-1] =
'\0';
299 if((result=sceSifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_SET_MAIN_NETIF, 0, &TransmitBuffer, NETMAN_NETIF_NAME_MAX_LEN, &ReceiveBuffer,
sizeof(s32), NULL, NULL))>=0)
300 result=ReceiveBuffer.result;
302 SignalSema(NetManIOSemaID);
307 int NetManQueryMainIF(
char *name)
311 if (!NETMAN_rpc_cd.server)
314 WaitSema(NetManIOSemaID);
316 if((result=sceSifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_QUERY_MAIN_NETIF, 0, NULL, 0, &ReceiveBuffer,
sizeof(
struct NetManQueryMainNetIFResult), NULL, NULL))>=0)
318 if((result=ReceiveBuffer.QueryMainNetIFResult.result) == 0)
320 sprintf(name,
"%.*s", (
int)
sizeof(ReceiveBuffer.QueryMainNetIFResult.name), ReceiveBuffer.QueryMainNetIFResult.name);
321 name[NETMAN_NETIF_NAME_MAX_LEN-1] =
'\0';
325 SignalSema(NetManIOSemaID);
330 int NetManSetLinkMode(
int mode)
334 if (!NETMAN_rpc_cd.server)
337 WaitSema(NetManIOSemaID);
339 TransmitBuffer.mode = mode;
340 if((result=sceSifCallRpc(&NETMAN_rpc_cd, NETMAN_IOP_RPC_FUNC_SET_LINK_MODE, 0, &TransmitBuffer,
sizeof(s32), &ReceiveBuffer,
sizeof(s32), NULL, NULL))>=0)
341 result=ReceiveBuffer.result;
343 SignalSema(NetManIOSemaID);