int pspAdhocRecvBlockingMAC(void *buffer, int length, PspMAC mac) { unsigned short port = 0; if (sceNetAdhocPdpRecv(_pdp_id, mac, &port, buffer, &length, ADHOC_TIMEOUT, 0) < 0) return 0; return length; }
int pspAdhocRecv(void *buffer, int length) { unsigned short port = 0; unsigned char mac[6]; if (sceNetAdhocPdpRecv(_pdp_id, mac, &port, buffer, &length, 0, 1) < 0) return 0; return length; }
int adhocRecv(void *buffer, int timeout, int type) { int error; int length = ADHOC_BUFFER_SIZE; unsigned short port = 0; unsigned char mac[6]; memset(adhoc_buffer, 0, ADHOC_BUFFER_SIZE); if ((error = sceNetAdhocPdpRecv(pdpId, mac, &port, adhoc_buffer, &length, timeout, 0)) < 0) return error; if (adhoc_buffer[0] & type) { memcpy(buffer, &adhoc_buffer[1], length - 1); return length - 1; } return -1; }
int adhocRecv(void *buffer, unsigned int *length) { int err=0; int pdpStatLength=20; unsigned int pdpRecvLength=0; int port=0; char mac[20]; pdpStatStruct pspStat; err = sceNetAdhocGetPdpStat(&pdpStatLength, &pspStat); if(err<0) { pspDebugScreenInit(); printf("error calling GetPdpStat, err=%x\n", err); return err; } if (pspStat.rcvdData > 0) { pdpRecvLength = pspStat.rcvdData; err = sceNetAdhocPdpRecv(pdpId, mac, &port, buffer, &length, 0, // 0 in lumines 1); // 1 in lumines if(err<0) { pspDebugScreenInit(); printf("err=%x\n", err); return err; } else { return 1; } } return 0; }
/** * Matching IO Handler Thread * @param args sizeof(SceNetAdhocMatchingContext *) * @param argp SceNetAdhocMatchingContext * * @return Exit Point is never reached... */ int _matchingInputThread(uint32_t args, void * argp) { // Cast Context SceNetAdhocMatchingContext * context = *(SceNetAdhocMatchingContext **)argp; // Last Ping uint64_t lastping = 0; // Last Hello uint64_t lasthello = 0; // Run while needed... while(context->input_thid > 0) { // Hello Message Sending Context with unoccupied Slots if((context->mode == ADHOC_MATCHING_MODE_PARENT && _countChildren(context) < (context->maxpeers - 1)) || (context->mode == ADHOC_MATCHING_MODE_P2P && _findP2P(context) == NULL)) { // Hello Message Broadcast necessary because of Hello Interval if((sceKernelGetSystemTimeWide() - lasthello) >= context->hello_int) { // Broadcast Hello Message _broadcastHelloMessage(context); // Update Hello Timer lasthello = sceKernelGetSystemTimeWide(); } } // Ping Required if((sceKernelGetSystemTimeWide() - lastping) >= context->keepalive_int) { // Broadcast Ping Message _broadcastPingMessage(context); // Update Ping Timer lastping = sceKernelGetSystemTimeWide(); } // Messages on Stack ready for processing if(context->input_stack != NULL && context->input_stack_lock == 0) { // Claim Stack context->input_stack_lock = 1; // Iterate Message List ThreadMessage * msg = context->input_stack; for(; msg != NULL; msg = msg->next) { // Default Optional Data void * opt = NULL; // Grab Optional Data if(msg->optlen > 0) opt = ((void *)msg) + sizeof(ThreadMessage); // Send Accept Packet if(msg->opcode == ADHOC_MATCHING_PACKET_ACCEPT) _sendAcceptPacket(context, &msg->mac, msg->optlen, opt); // Send Join Packet else if(msg->opcode == ADHOC_MATCHING_PACKET_JOIN) _sendJoinPacket(context, &msg->mac, msg->optlen, opt); // Send Cancel Packet else if(msg->opcode == ADHOC_MATCHING_PACKET_CANCEL) _sendCancelPacket(context, &msg->mac, msg->optlen, opt); // Send Bulk Data Packet else if(msg->opcode == ADHOC_MATCHING_PACKET_BULK) _sendBulkDataPacket(context, &msg->mac, msg->optlen, opt); // Send Birth Packet else if(msg->opcode == ADHOC_MATCHING_PACKET_BIRTH) _sendBirthPacket(context, &msg->mac); // Cancel Bulk Data Transfer (does nothing as of now as we fire and forget anyway) // else if(msg->opcode == ADHOC_MATCHING_PACKET_BULK_ABORT) blabla; } // Clear IO Message Stack _clearStack(context, ADHOC_MATCHING_INPUT_STACK); // Free Stack context->input_stack_lock = 0; } // Receive PDP Datagram SceNetEtherAddr sendermac; uint16_t senderport; int rxbuflen = context->rxbuflen; int recvresult = sceNetAdhocPdpRecv(context->socket, &sendermac, &senderport, context->rxbuf, &rxbuflen, 0, ADHOC_F_NONBLOCK); // Received Data from a Sender that interests us if(recvresult == 0 && rxbuflen > 0 && context->port == senderport) { // Log Receive Success printk("Received %d Bytes (Opcode: %d)\n", rxbuflen, context->rxbuf[0]); // Ping Packet if(context->rxbuf[0] == ADHOC_MATCHING_PACKET_PING) _actOnPingPacket(context, &sendermac); // Hello Packet else if(context->rxbuf[0] == ADHOC_MATCHING_PACKET_HELLO) _actOnHelloPacket(context, &sendermac, rxbuflen); // Join Packet else if(context->rxbuf[0] == ADHOC_MATCHING_PACKET_JOIN) _actOnJoinPacket(context, &sendermac, rxbuflen); // Accept Packet else if(context->rxbuf[0] == ADHOC_MATCHING_PACKET_ACCEPT) _actOnAcceptPacket(context, &sendermac, rxbuflen); // Cancel Packet else if(context->rxbuf[0] == ADHOC_MATCHING_PACKET_CANCEL) _actOnCancelPacket(context, &sendermac, rxbuflen); // Bulk Data Packet else if(context->rxbuf[0] == ADHOC_MATCHING_PACKET_BULK) _actOnBulkDataPacket(context, &sendermac, rxbuflen); // Birth Packet else if(context->rxbuf[0] == ADHOC_MATCHING_PACKET_BIRTH) _actOnBirthPacket(context, &sendermac, rxbuflen); // Death Packet else if(context->rxbuf[0] == ADHOC_MATCHING_PACKET_DEATH) _actOnDeathPacket(context, &sendermac, rxbuflen); // Bye Packet else if(context->rxbuf[0] == ADHOC_MATCHING_PACKET_BYE) _actOnByePacket(context, &sendermac); // Ignore Incoming Trash Data } // Handle Peer Timeouts _handleTimeout(context); // Share CPU Time sceKernelDelayThread(10000); } // Send Bye Messages _sendByePacket(context); // Free Peer List Buffer _clearPeerList(context); // Delete Pointer Reference (and notify caller about finished cleanup) context->input_thid = 0; // Terminate Thread sceKernelExitDeleteThread(0); // Return Zero to shut up Compiler (never reached anyway) return 0; }