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)
45static SifRpcDataQueue_t ps2ips_queue;
46static SifRpcServerData_t ps2ips_server;
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;
318 SifRpcReceiveData_t rdata;
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;
351 SifRpcReceiveData_t rdata;
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 )
412 if (pkt->timeout_p != NULL)
414 tv.tv_sec = pkt->timeout_sec;
415 tv.tv_usec = pkt->timeout_usec;
421 result = select( pkt->maxfdp1,
422 pkt->readset_p != NULL ? (
struct fd_set *)&pkt->readset : NULL,
423 pkt->writeset_p != NULL ? (
struct fd_set *)&pkt->writeset : NULL,
424 pkt->exceptset_p != NULL ? (
struct fd_set *)&pkt->exceptset : NULL,
425 pkt->timeout_p != NULL ? &tv : NULL );
427 if (pkt->timeout_p != NULL)
429 pkt->timeout_sec = (s32)tv.tv_sec;
430 pkt->timeout_usec = (s32)tv.tv_usec;
432 pkt->result = result;
435static void do_ioctlsocket(
void *rpcBuffer,
int size )
442 pkt->result = ioctlsocket( pkt->s,
444 pkt->argp != NULL ? &pkt->value : NULL );
446static void do_getsockname(
void *rpcBuffer,
int size )
448 int *ptr = rpcBuffer;
455 ret = getsockname(pkt->socket, &addr, &addrlen);
458 memcpy(&pkt->sockaddr, &addr,
sizeof(
struct sockaddr));
462static void do_getpeername(
void *rpcBuffer,
int size )
464 int *ptr = rpcBuffer;
471 ret = getpeername(pkt->socket, &addr, &addrlen);
474 memcpy(&pkt->sockaddr, &addr,
sizeof(
struct sockaddr));
478static void do_getsockopt(
void *rpcBuffer,
int size )
480 int ret, s, level, optname, optlen;
481 unsigned char optval[128];
488 optlen =
sizeof(optval);
490 ret = getsockopt(s, level, optname, optval, &optlen);
497static void do_setsockopt(
void *rpcBuffer,
int size )
499 int *ptr = rpcBuffer, ret;
504 unsigned char optval[128];
514 ret = setsockopt(s, level, optname, optval, optlen);
519static void do_gethostbyname(
void *rpcBuffer,
int size )
522 gethostbyname_res_pkt *resPtr = rpcBuffer;
526 if((ret = gethostbyname((
char*)_rpc_buffer)) != NULL)
529 resPtr->hostent.h_addrtype = ret->h_addrtype;
530 resPtr->hostent.h_length = ret->h_length;
531 memcpy(&resPtr->hostent.h_addr, &ret->h_addr_list[0],
sizeof(resPtr->hostent.h_addr));
537static void do_dns_setserver(
void *rpcBuffer,
int size )
542 dns_setserver(((dns_setserver_pkt*)_rpc_buffer)->numdns, &((dns_setserver_pkt*)_rpc_buffer)->dnsserver);
545static void do_dns_getserver(
void *rpcBuffer,
int size )
547 const ip_addr_t *dns;
551 dns = dns_getserver(*(u8*)_rpc_buffer);
552 ip_addr_copy(((dns_getserver_res_pkt*)rpcBuffer)->dnsserver, *dns);
556static void * rpcHandlerFunction(
unsigned int command,
void * rpcBuffer,
int size)
560 case PS2IPS_ID_ACCEPT:
561 do_accept(rpcBuffer, size);
564 do_bind(rpcBuffer, size);
566 case PS2IPS_ID_DISCONNECT:
567 do_disconnect(rpcBuffer, size);
569 case PS2IPS_ID_CONNECT:
570 do_connect(rpcBuffer, size);
572 case PS2IPS_ID_LISTEN:
573 do_listen(rpcBuffer, size);
576 do_recv(rpcBuffer, size);
578 case PS2IPS_ID_RECVFROM:
579 do_recvfrom(rpcBuffer, size);
582 do_send(rpcBuffer, size);
584 case PS2IPS_ID_SENDTO:
585 do_sendto(rpcBuffer, size);
587 case PS2IPS_ID_SOCKET:
588 do_socket(rpcBuffer, size);
590 case PS2IPS_ID_GETCONFIG:
591 do_getconfig(rpcBuffer, size);
593 case PS2IPS_ID_SETCONFIG:
594 do_setconfig(rpcBuffer, size);
596 case PS2IPS_ID_SELECT:
597 do_select(rpcBuffer, size);
599 case PS2IPS_ID_IOCTL:
600 do_ioctlsocket(rpcBuffer, size);
602 case PS2IPS_ID_GETSOCKNAME:
603 do_getsockname(rpcBuffer, size);
605 case PS2IPS_ID_GETPEERNAME:
606 do_getpeername(rpcBuffer, size);
608 case PS2IPS_ID_GETSOCKOPT:
609 do_getsockopt(rpcBuffer, size);
611 case PS2IPS_ID_SETSOCKOPT:
612 do_setsockopt(rpcBuffer, size);
615 case PS2IPS_ID_GETHOSTBYNAME:
616 do_gethostbyname(rpcBuffer, size);
618 case PS2IPS_ID_DNS_SETSERVER:
619 do_dns_setserver(rpcBuffer, size);
621 case PS2IPS_ID_DNS_GETSERVER:
622 do_dns_getserver(rpcBuffer, size);
626 printf(
"PS2IPS: Unknown Function called!\n");
633static void threadRpcFunction(
void *arg)
637 printf(
"PS2IPS: RPC Thread Started\n");
639 sceSifSetRpcQueue( &ps2ips_queue , GetThreadId() );
640 sceSifRegisterRpc( &ps2ips_server, PS2IP_IRX, (
void *)rpcHandlerFunction,(u8 *)&_rpc_buffer,NULL,NULL, &ps2ips_queue );
641 sceSifRpcLoop( &ps2ips_queue );
644int _start(
int argc,
char *argv[])
652 printf(
"PS2IPS: Module Loaded.\n" );
656 t.thread = &threadRpcFunction;
660 threadId = CreateThread( &t );
663 printf(
"PS2IPS: CreateThread failed. %i\n", threadId );
664 return MODULE_NO_RESIDENT_END;
668 StartThread( threadId, NULL );
669 return MODULE_RESIDENT_END;
int CpuResumeIntr(int state)
int CpuSuspendIntr(int *state)