37#define MODNAME "TCP/IP_Stack_RPC"
40#define BUFF_SIZE (1024)
42#define MIN(a, b) (((a)<(b))?(a):(b))
43#define RDOWN_64(a) (((a) >> 6) << 6)
47static u8 _rpc_buffer[512 * 4]
__attribute__((__aligned__(4)));
49static char lwip_buffer[BUFF_SIZE + 32];
52static void do_accept(
void * rpcBuffer,
int size )
61 ret = accept(pkt->socket, &addr, &addrlen);
64 memcpy(&pkt->sockaddr, &addr,
sizeof(
struct sockaddr));
68static void do_bind(
void * rpcBuffer,
int size )
76 ret = bind(pkt->socket, &pkt->sockaddr, pkt->len);
81static void do_disconnect(
void * rpcBuffer,
int size )
88 ret = disconnect(ptr[0]);
93static void do_connect(
void * rpcBuffer,
int size )
101 ret = connect(pkt->socket, &pkt->sockaddr, pkt->len);
106static void do_listen(
void * rpcBuffer,
int size )
108 int *ptr = rpcBuffer;
113 ret = listen(ptr[0], ptr[1]);
118static void do_recv(
void * rpcBuffer,
int size )
120 int srest, erest, asize;
121 void *abuffer, *aebuffer;
132 if(recv_pkt->length <= 64)
134 srest = recv_pkt->length;
138 if( ((
int)recv_pkt->ee_addr & 0x3F) == 0 )
141 srest = RDOWN_64((
int)recv_pkt->ee_addr) - (int)recv_pkt->ee_addr + 64;
144 s_offset = 64 - srest;
145 recvlen = MIN(BUFF_SIZE, recv_pkt->length);
148 rlen = recv(recv_pkt->socket, lwip_buffer + s_offset, recvlen, recv_pkt->flags);
150 if(rlen <= 0)
goto recv_end;
151 if(rlen <= 64) srest = rlen;
155 memcpy((
void *)rests.sbuffer, (
void *)(lwip_buffer + s_offset), srest);
159 abuffer = recv_pkt->ee_addr + srest;
160 aebuffer = (
void *)RDOWN_64((
int)recv_pkt->ee_addr + rlen);
162 asize = (int)aebuffer - (
int)abuffer;
164 erest = recv_pkt->ee_addr + rlen - aebuffer;
167 memcpy((
void *)rests.ebuffer, (
void *)(lwip_buffer + 64 + asize), erest);
173 abuffer = aebuffer = NULL;
181 while(sceSifDmaStat(dma_id) >= 0);
183 sifdma.src = lwip_buffer + 64;
184 sifdma.dest = abuffer;
188 dma_id = sceSifSetDma(&sifdma, 1);
195 rests.sbuf = recv_pkt->ee_addr;
196 rests.ebuf = aebuffer;
198 while(sceSifDmaStat(dma_id) >= 0);
201 sifdma.dest = recv_pkt->intr_data;
205 dma_id = sceSifSetDma(&sifdma, 1);
212static void do_recvfrom(
void * rpcBuffer,
int size )
214 int srest, erest, asize;
215 void *abuffer, *aebuffer;
228 if(recv_pkt->length <= 64)
230 srest = recv_pkt->length;
234 if( ((
int)recv_pkt->ee_addr & 0x3F) == 0 )
237 srest = RDOWN_64((
int)recv_pkt->ee_addr) - (int)recv_pkt->ee_addr + 64;
240 s_offset = 64 - srest;
241 recvlen = MIN(BUFF_SIZE, recv_pkt->length);
244 rlen = recvfrom(recv_pkt->socket, lwip_buffer + s_offset, recvlen, recv_pkt->flags, &
sockaddr, &fromlen);
246 if(rlen <= 0)
goto recv_end;
247 if(rlen <= 64) srest = rlen;
254 memcpy((
void *)rests.sbuffer, (
void *)(lwip_buffer + s_offset), srest);
258 abuffer = recv_pkt->ee_addr + srest;
259 aebuffer = (
void *)RDOWN_64((
int)recv_pkt->ee_addr + rlen);
261 asize = (int)aebuffer - (
int)abuffer;
263 erest = recv_pkt->ee_addr + rlen - aebuffer;
266 memcpy((
void *)rests.ebuffer, (
void *)(lwip_buffer + 64 + asize), erest);
272 abuffer = aebuffer = NULL;
280 while(sceSifDmaStat(dma_id) >= 0);
282 sifdma.src = lwip_buffer + 64;
283 sifdma.dest = abuffer;
287 dma_id = sceSifSetDma(&sifdma, 1);
294 rests.sbuf = recv_pkt->ee_addr;
295 rests.ebuf = aebuffer;
297 while(sceSifDmaStat(dma_id) >= 0);
300 sifdma.dest = recv_pkt->intr_data;
304 dma_id = sceSifSetDma(&sifdma, 1);
311static void do_send(
void * rpcBuffer,
int size )
313 int *ptr = rpcBuffer;
326 s_offset = 64 - pkt->malign;
327 memcpy((
void *)(lwip_buffer + s_offset), pkt->
malign_buff, pkt->malign);
329 }
else s_offset = 64;
331 ee_pos = pkt->ee_addr + pkt->malign;
333 sendlen = MIN(BUFF_SIZE, pkt->length);
335 sceSifGetOtherData(&rdata, ee_pos, lwip_buffer + 64, sendlen - pkt->malign, 0);
338 slen = send(pkt->socket, lwip_buffer + s_offset, sendlen, pkt->flags);
344static void do_sendto(
void * rpcBuffer,
int size )
346 int *ptr = rpcBuffer;
359 s_offset = 64 - pkt->malign;
360 memcpy((
void *)(lwip_buffer + s_offset), pkt->
malign_buff, pkt->malign);
362 }
else s_offset = 64;
364 ee_pos = pkt->ee_addr + pkt->malign;
366 sendlen = MIN(BUFF_SIZE, pkt->length);
368 sceSifGetOtherData(&rdata, ee_pos, lwip_buffer + 64, sendlen - pkt->malign, 0);
371 slen = sendto(pkt->socket, lwip_buffer + s_offset, sendlen, pkt->flags, &pkt->sockaddr,
sizeof(
struct sockaddr));
376static void do_socket(
void * rpcBuffer,
int size )
378 int *ptr = rpcBuffer;
383 ret = socket(ptr[0], ptr[1], ptr[2]);
388static void do_getconfig(
void *rpcBuffer,
int size)
392 ps2ip_getconfig((
char *)rpcBuffer, (
t_ip_info *)rpcBuffer);
395static void do_setconfig(
void *rpcBuffer,
int size)
402static void do_select(
void * rpcBuffer,
int size )
409 pkt->result = select( pkt->maxfdp1,
410 pkt->readset_p != NULL ? &pkt->readset : NULL,
411 pkt->writeset_p != NULL ? &pkt->writeset : NULL,
412 pkt->exceptset_p != NULL ? &pkt->exceptset : NULL,
413 pkt->timeout_p != NULL ? &pkt->timeout : NULL );
416static void do_ioctlsocket(
void *rpcBuffer,
int size )
423 pkt->result = ioctlsocket( pkt->s,
425 pkt->argp != NULL ? &pkt->value : NULL );
427static void do_getsockname(
void *rpcBuffer,
int size )
429 int *ptr = rpcBuffer;
436 ret = getsockname(pkt->socket, &addr, &addrlen);
439 memcpy(&pkt->sockaddr, &addr,
sizeof(
struct sockaddr));
443static void do_getpeername(
void *rpcBuffer,
int size )
445 int *ptr = rpcBuffer;
452 ret = getpeername(pkt->socket, &addr, &addrlen);
455 memcpy(&pkt->sockaddr, &addr,
sizeof(
struct sockaddr));
459static void do_getsockopt(
void *rpcBuffer,
int size )
461 int ret, s, level, optname, optlen;
462 unsigned char optval[128];
469 optlen =
sizeof(optval);
471 ret = getsockopt(s, level, optname, optval, &optlen);
478static void do_setsockopt(
void *rpcBuffer,
int size )
480 int *ptr = rpcBuffer, ret;
485 unsigned char optval[128];
495 ret = setsockopt(s, level, optname, optval, optlen);
500static void do_gethostbyname(
void *rpcBuffer,
int size )
507 if((ret = gethostbyname((
char*)_rpc_buffer)) != NULL)
510 resPtr->hostent.h_addrtype = ret->h_addrtype;
511 resPtr->hostent.h_length = ret->h_length;
512 memcpy(&resPtr->hostent.h_addr, &ret->h_addr_list[0],
sizeof(resPtr->hostent.h_addr));
518static void do_dns_setserver(
void *rpcBuffer,
int size )
526static void do_dns_getserver(
void *rpcBuffer,
int size )
532 dns = dns_getserver(*(u8*)_rpc_buffer);
537static void * rpcHandlerFunction(
unsigned int command,
void * rpcBuffer,
int size)
541 case PS2IPS_ID_ACCEPT:
542 do_accept(rpcBuffer, size);
545 do_bind(rpcBuffer, size);
547 case PS2IPS_ID_DISCONNECT:
548 do_disconnect(rpcBuffer, size);
550 case PS2IPS_ID_CONNECT:
551 do_connect(rpcBuffer, size);
553 case PS2IPS_ID_LISTEN:
554 do_listen(rpcBuffer, size);
557 do_recv(rpcBuffer, size);
559 case PS2IPS_ID_RECVFROM:
560 do_recvfrom(rpcBuffer, size);
563 do_send(rpcBuffer, size);
565 case PS2IPS_ID_SENDTO:
566 do_sendto(rpcBuffer, size);
568 case PS2IPS_ID_SOCKET:
569 do_socket(rpcBuffer, size);
571 case PS2IPS_ID_GETCONFIG:
572 do_getconfig(rpcBuffer, size);
574 case PS2IPS_ID_SETCONFIG:
575 do_setconfig(rpcBuffer, size);
577 case PS2IPS_ID_SELECT:
578 do_select(rpcBuffer, size);
580 case PS2IPS_ID_IOCTL:
581 do_ioctlsocket(rpcBuffer, size);
583 case PS2IPS_ID_GETSOCKNAME:
584 do_getsockname(rpcBuffer, size);
586 case PS2IPS_ID_GETPEERNAME:
587 do_getpeername(rpcBuffer, size);
589 case PS2IPS_ID_GETSOCKOPT:
590 do_getsockopt(rpcBuffer, size);
592 case PS2IPS_ID_SETSOCKOPT:
593 do_setsockopt(rpcBuffer, size);
596 case PS2IPS_ID_GETHOSTBYNAME:
597 do_gethostbyname(rpcBuffer, size);
599 case PS2IPS_ID_DNS_SETSERVER:
600 do_dns_setserver(rpcBuffer, size);
602 case PS2IPS_ID_DNS_GETSERVER:
603 do_dns_getserver(rpcBuffer, size);
607 printf(
"PS2IPS: Unknown Function called!\n");
614static void threadRpcFunction(
void *arg)
618 printf(
"PS2IPS: RPC Thread Started\n");
620 sceSifSetRpcQueue( &ps2ips_queue , GetThreadId() );
621 sceSifRegisterRpc( &ps2ips_server, PS2IP_IRX, (
void *)rpcHandlerFunction,(u8 *)&_rpc_buffer,NULL,NULL, &ps2ips_queue );
622 sceSifRpcLoop( &ps2ips_queue );
625int _start(
int argc,
char *argv[])
633 printf(
"PS2IPS: Module Loaded.\n" );
637 t.thread = &threadRpcFunction;
641 threadId = CreateThread( &t );
644 printf(
"PS2IPS: CreateThread failed. %i\n", threadId );
645 return MODULE_NO_RESIDENT_END;
649 StartThread( threadId, NULL );
650 return MODULE_RESIDENT_END;
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)