Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
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;
}