mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Added early returns for send{X}Packet funcs
This commit is contained in:
parent
9f4f0a4e6a
commit
9f94e035a7
1 changed files with 191 additions and 170 deletions
|
@ -223,68 +223,72 @@ void sendAcceptPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * ma
|
|||
// Find Peer
|
||||
SceNetAdhocMatchingMemberInternal * peer = findPeer(context, mac);
|
||||
|
||||
// Found Peer
|
||||
if (peer != NULL && (peer->state == PSP_ADHOC_MATCHING_PEER_CHILD || peer->state == PSP_ADHOC_MATCHING_PEER_P2P)) {
|
||||
// Required Sibling Buffer
|
||||
uint32_t siblingbuflen = 0;
|
||||
if (peer == NULL || (peer->state != PSP_ADHOC_MATCHING_PEER_CHILD && peer->state != PSP_ADHOC_MATCHING_PEER_P2P)) {
|
||||
// Not found
|
||||
return;
|
||||
}
|
||||
|
||||
// Parent Mode
|
||||
if (context->mode == PSP_ADHOC_MATCHING_MODE_PARENT) siblingbuflen = (u32)sizeof(SceNetEtherAddr) * (countConnectedPeers(context) - 2);
|
||||
// Required Sibling Buffer
|
||||
uint32_t siblingbuflen = 0;
|
||||
|
||||
// Sibling Count
|
||||
int siblingcount = siblingbuflen / sizeof(SceNetEtherAddr);
|
||||
// Parent Mode
|
||||
if (context->mode == PSP_ADHOC_MATCHING_MODE_PARENT) siblingbuflen = (u32)sizeof(SceNetEtherAddr) * (countConnectedPeers(context) - 2);
|
||||
|
||||
// Allocate Accept Message Buffer
|
||||
uint8_t * accept = (uint8_t *)malloc(9LL + optlen + siblingbuflen);
|
||||
// Sibling Count
|
||||
int siblingcount = siblingbuflen / sizeof(SceNetEtherAddr);
|
||||
|
||||
// Allocated Accept Message Buffer
|
||||
if (accept != NULL) {
|
||||
// Accept Opcode
|
||||
accept[0] = PSP_ADHOC_MATCHING_PACKET_ACCEPT;
|
||||
// Allocate Accept Message Buffer
|
||||
uint8_t * accept = (uint8_t *)malloc(9LL + optlen + siblingbuflen);
|
||||
|
||||
// Optional Data Length
|
||||
memcpy(accept + 1, &optlen, sizeof(optlen));
|
||||
if (accept == NULL) {
|
||||
// Failed to allocate the Accept Message Buffer
|
||||
return;
|
||||
}
|
||||
|
||||
// Sibling Count
|
||||
memcpy(accept + 5, &siblingcount, sizeof(siblingcount));
|
||||
// Accept Opcode
|
||||
accept[0] = PSP_ADHOC_MATCHING_PACKET_ACCEPT;
|
||||
|
||||
// Copy Optional Data
|
||||
if (optlen > 0) memcpy(accept + 9, opt, optlen);
|
||||
// Optional Data Length
|
||||
memcpy(accept + 1, &optlen, sizeof(optlen));
|
||||
|
||||
// Parent Mode Extra Data required
|
||||
if (context->mode == PSP_ADHOC_MATCHING_MODE_PARENT && siblingcount > 0) {
|
||||
// Create MAC Array Pointer
|
||||
uint8_t * siblingmacs = (uint8_t *)(accept + 9 + optlen);
|
||||
// Sibling Count
|
||||
memcpy(accept + 5, &siblingcount, sizeof(siblingcount));
|
||||
|
||||
// MAC Writing Pointer
|
||||
int i = 0;
|
||||
// Copy Optional Data
|
||||
if (optlen > 0) memcpy(accept + 9, opt, optlen);
|
||||
|
||||
// Iterate Peer List
|
||||
SceNetAdhocMatchingMemberInternal * item = context->peerlist;
|
||||
for (; item != NULL; item = item->next) {
|
||||
// Ignore Target
|
||||
if (item == peer) continue;
|
||||
// Parent Mode Extra Data required
|
||||
if (context->mode == PSP_ADHOC_MATCHING_MODE_PARENT && siblingcount > 0) {
|
||||
// Create MAC Array Pointer
|
||||
uint8_t * siblingmacs = (uint8_t *)(accept + 9 + optlen);
|
||||
|
||||
// Copy Child MAC
|
||||
if (item->state == PSP_ADHOC_MATCHING_PEER_CHILD) {
|
||||
// Clone MAC the stupid memcpy way to shut up PSP CPU
|
||||
memcpy(siblingmacs + sizeof(SceNetEtherAddr) * i++, &item->mac, sizeof(SceNetEtherAddr));
|
||||
}
|
||||
}
|
||||
// MAC Writing Pointer
|
||||
int i = 0;
|
||||
|
||||
// Iterate Peer List
|
||||
SceNetAdhocMatchingMemberInternal * item = context->peerlist;
|
||||
for (; item != NULL; item = item->next) {
|
||||
// Ignore Target
|
||||
if (item == peer) continue;
|
||||
|
||||
// Copy Child MAC
|
||||
if (item->state == PSP_ADHOC_MATCHING_PEER_CHILD) {
|
||||
// Clone MAC the stupid memcpy way to shut up PSP CPU
|
||||
memcpy(siblingmacs + sizeof(SceNetEtherAddr) * i++, &item->mac, sizeof(SceNetEtherAddr));
|
||||
}
|
||||
|
||||
// Send Data
|
||||
context->socketlock->lock();
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], accept, 9 + optlen + siblingbuflen, 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
|
||||
// Free Memory
|
||||
free(accept);
|
||||
|
||||
// Spawn Local Established Event
|
||||
spawnLocalEvent(context, PSP_ADHOC_MATCHING_EVENT_ESTABLISHED, mac, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
// Send Data
|
||||
context->socketlock->lock();
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], accept, 9 + optlen + siblingbuflen, 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
|
||||
// Free Memory
|
||||
free(accept);
|
||||
|
||||
// Spawn Local Established Event
|
||||
spawnLocalEvent(context, PSP_ADHOC_MATCHING_EVENT_ESTABLISHED, mac, 0, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -301,31 +305,35 @@ void sendJoinPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac,
|
|||
// Find Peer
|
||||
SceNetAdhocMatchingMemberInternal * peer = findPeer(context, mac);
|
||||
|
||||
// Valid Peer
|
||||
if (peer != NULL && peer->state == PSP_ADHOC_MATCHING_PEER_OUTGOING_REQUEST) {
|
||||
// Allocate Join Message Buffer
|
||||
uint8_t * join = (uint8_t *)malloc(5LL + optlen);
|
||||
|
||||
// Allocated Join Message Buffer
|
||||
if (join != NULL) {
|
||||
// Join Opcode
|
||||
join[0] = PSP_ADHOC_MATCHING_PACKET_JOIN;
|
||||
|
||||
// Optional Data Length
|
||||
memcpy(join + 1, &optlen, sizeof(optlen));
|
||||
|
||||
// Copy Optional Data
|
||||
if (optlen > 0) memcpy(join + 5, opt, optlen);
|
||||
|
||||
// Send Data
|
||||
context->socketlock->lock();
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], join, 5 + optlen, 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
|
||||
// Free Memory
|
||||
free(join);
|
||||
}
|
||||
if (peer == NULL || peer->state != PSP_ADHOC_MATCHING_PEER_OUTGOING_REQUEST) {
|
||||
// Valid peer not found
|
||||
return;
|
||||
}
|
||||
|
||||
// Allocate Join Message Buffer
|
||||
uint8_t * join = (uint8_t *)malloc(5LL + optlen);
|
||||
|
||||
if (join == NULL) {
|
||||
// Failed to allocate the Join Message Buffer
|
||||
return;
|
||||
}
|
||||
|
||||
// Join Opcode
|
||||
join[0] = PSP_ADHOC_MATCHING_PACKET_JOIN;
|
||||
|
||||
// Optional Data Length
|
||||
memcpy(join + 1, &optlen, sizeof(optlen));
|
||||
|
||||
// Copy Optional Data
|
||||
if (optlen > 0) memcpy(join + 5, opt, optlen);
|
||||
|
||||
// Send Data
|
||||
context->socketlock->lock();
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], join, 5 + optlen, 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
|
||||
// Free Memory
|
||||
free(join);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -365,19 +373,21 @@ void sendCancelPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * ma
|
|||
// Find Peer
|
||||
SceNetAdhocMatchingMemberInternal * peer = findPeer(context, mac);
|
||||
|
||||
// Found Peer
|
||||
if (peer != NULL) {
|
||||
// Child Mode Fallback - Delete All
|
||||
if (context->mode == PSP_ADHOC_MATCHING_MODE_CHILD) {
|
||||
// Delete Peer List
|
||||
clearPeerList(context);
|
||||
}
|
||||
if (peer == NULL) {
|
||||
// Peer not found
|
||||
return;
|
||||
}
|
||||
|
||||
// Delete Peer
|
||||
else {
|
||||
// Instead of removing peer immediately, We should give a little time before removing the peer and let it timed out? so it can send the BYE packet when stopping AdhocMatching after Canceling it
|
||||
peer->lastping = CoreTiming::GetGlobalTimeUsScaled();
|
||||
}
|
||||
// Child Mode Fallback - Delete All
|
||||
if (context->mode == PSP_ADHOC_MATCHING_MODE_CHILD) {
|
||||
// Delete Peer List
|
||||
clearPeerList(context);
|
||||
}
|
||||
|
||||
// Delete Peer
|
||||
else {
|
||||
// Instead of removing peer immediately, We should give a little time before removing the peer and let it timed out? so it can send the BYE packet when stopping AdhocMatching after Canceling it
|
||||
peer->lastping = CoreTiming::GetGlobalTimeUsScaled();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -395,40 +405,44 @@ void sendBulkDataPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr *
|
|||
// Find Peer
|
||||
SceNetAdhocMatchingMemberInternal * peer = findPeer(context, mac);
|
||||
|
||||
// Valid Peer (rest is already checked in send.c)
|
||||
if (peer != NULL) {
|
||||
// Don't send if it's aborted
|
||||
//if (peer->sending == 0) return;
|
||||
|
||||
// Allocate Send Message Buffer
|
||||
uint8_t * send = (uint8_t *)malloc(5LL + datalen);
|
||||
|
||||
// Allocated Send Message Buffer
|
||||
if (send != NULL) {
|
||||
// Send Opcode
|
||||
send[0] = PSP_ADHOC_MATCHING_PACKET_BULK;
|
||||
|
||||
// Data Length
|
||||
memcpy(send + 1, &datalen, sizeof(datalen));
|
||||
|
||||
// Copy Data
|
||||
memcpy(send + 5, data, datalen);
|
||||
|
||||
// Send Data
|
||||
context->socketlock->lock();
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], send, 5 + datalen, 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
|
||||
// Free Memory
|
||||
free(send);
|
||||
|
||||
// Remove Busy Bit from Peer
|
||||
peer->sending = 0;
|
||||
|
||||
// Spawn Data Event
|
||||
spawnLocalEvent(context, PSP_ADHOC_MATCHING_EVENT_DATA_ACK, mac, 0, NULL);
|
||||
}
|
||||
if (peer == NULL) {
|
||||
// Invalid Peer
|
||||
return;
|
||||
}
|
||||
|
||||
// Don't send if it's aborted
|
||||
//if (peer->sending == 0) return;
|
||||
|
||||
// Allocate Send Message Buffer
|
||||
uint8_t * send = (uint8_t *)malloc(5LL + datalen);
|
||||
|
||||
if (send == NULL) {
|
||||
// Failed to allocate the Send Message Buffer
|
||||
return;
|
||||
}
|
||||
|
||||
// Send Opcode
|
||||
send[0] = PSP_ADHOC_MATCHING_PACKET_BULK;
|
||||
|
||||
// Data Length
|
||||
memcpy(send + 1, &datalen, sizeof(datalen));
|
||||
|
||||
// Copy Data
|
||||
memcpy(send + 5, data, datalen);
|
||||
|
||||
// Send Data
|
||||
context->socketlock->lock();
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)mac, (*context->peerPort)[*mac], send, 5 + datalen, 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
|
||||
// Free Memory
|
||||
free(send);
|
||||
|
||||
// Remove Busy Bit from Peer
|
||||
peer->sending = 0;
|
||||
|
||||
// Spawn Data Event
|
||||
spawnLocalEvent(context, PSP_ADHOC_MATCHING_EVENT_DATA_ACK, mac, 0, NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -443,37 +457,41 @@ void sendBirthPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac
|
|||
// Find Newborn Child
|
||||
SceNetAdhocMatchingMemberInternal * newborn = findPeer(context, mac);
|
||||
|
||||
// Found Newborn Child
|
||||
if (newborn != NULL) {
|
||||
// Packet Buffer
|
||||
uint8_t packet[7];
|
||||
if (newborn == NULL) {
|
||||
// Did not find Newborn Child
|
||||
return;
|
||||
}
|
||||
|
||||
// Set Opcode
|
||||
packet[0] = PSP_ADHOC_MATCHING_PACKET_BIRTH;
|
||||
// Packet Buffer
|
||||
uint8_t packet[7];
|
||||
|
||||
// Set Newborn MAC
|
||||
memcpy(packet + 1, mac, sizeof(SceNetEtherAddr));
|
||||
// Set Opcode
|
||||
packet[0] = PSP_ADHOC_MATCHING_PACKET_BIRTH;
|
||||
|
||||
// Iterate Peers
|
||||
SceNetAdhocMatchingMemberInternal * peer = context->peerlist;
|
||||
for (; peer != NULL; peer = peer->next) {
|
||||
// Skip Newborn Child
|
||||
if (peer == newborn) continue;
|
||||
// Set Newborn MAC
|
||||
memcpy(packet + 1, mac, sizeof(SceNetEtherAddr));
|
||||
|
||||
// Send only to children
|
||||
if (peer->state == PSP_ADHOC_MATCHING_PEER_CHILD) {
|
||||
// Send Packet
|
||||
context->socketlock->lock();
|
||||
int sent = sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], packet, sizeof(packet), 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
// Iterate Peers
|
||||
SceNetAdhocMatchingMemberInternal * peer = context->peerlist;
|
||||
for (; peer != NULL; peer = peer->next) {
|
||||
// Skip Newborn Child
|
||||
if (peer == newborn) continue;
|
||||
|
||||
// Log Send Success
|
||||
if (sent >= 0)
|
||||
INFO_LOG(Log::sceNet, "InputLoop: Sending BIRTH [%s] to %s", mac2str(mac).c_str(), mac2str(&peer->mac).c_str());
|
||||
else
|
||||
WARN_LOG(Log::sceNet, "InputLoop: Failed to Send BIRTH [%s] to %s", mac2str(mac).c_str(), mac2str(&peer->mac).c_str());
|
||||
}
|
||||
// Send only to children
|
||||
if (peer->state != PSP_ADHOC_MATCHING_PEER_CHILD) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Send Packet
|
||||
context->socketlock->lock();
|
||||
int sent = sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], packet, sizeof(packet), 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
|
||||
// Log Send Success
|
||||
if (sent >= 0)
|
||||
INFO_LOG(Log::sceNet, "InputLoop: Sending BIRTH [%s] to %s", mac2str(mac).c_str(), mac2str(&peer->mac).c_str());
|
||||
else
|
||||
WARN_LOG(Log::sceNet, "InputLoop: Failed to Send BIRTH [%s] to %s", mac2str(mac).c_str(), mac2str(&peer->mac).c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -489,43 +507,46 @@ void sendDeathPacket(SceNetAdhocMatchingContext * context, SceNetEtherAddr * mac
|
|||
// Find abandoned Child
|
||||
SceNetAdhocMatchingMemberInternal * deadkid = findPeer(context, mac);
|
||||
|
||||
// Found abandoned Child
|
||||
if (deadkid != NULL) {
|
||||
// Packet Buffer
|
||||
uint8_t packet[7];
|
||||
if (deadkid == NULL) {
|
||||
// Did not find abandoned Child
|
||||
return;
|
||||
}
|
||||
|
||||
// Set abandoned Child MAC
|
||||
memcpy(packet + 1, mac, sizeof(SceNetEtherAddr));
|
||||
// Packet Buffer
|
||||
uint8_t packet[7];
|
||||
|
||||
// Iterate Peers
|
||||
SceNetAdhocMatchingMemberInternal * peer = context->peerlist;
|
||||
for (; peer != NULL; peer = peer->next) {
|
||||
// Skip dead Child? Or May be we should also tells the disconnected Child, that they have been disconnected from the Host (in the case they were disconnected because they went to PPSSPP settings for too long)
|
||||
if (peer == deadkid) {
|
||||
// Set abandoned Child MAC
|
||||
memcpy(packet + 1, mac, sizeof(SceNetEtherAddr));
|
||||
|
||||
// Iterate Peers
|
||||
SceNetAdhocMatchingMemberInternal * peer = context->peerlist;
|
||||
for (; peer != NULL; peer = peer->next) {
|
||||
// Skip dead Child? Or May be we should also tells the disconnected Child, that they have been disconnected from the Host (in the case they were disconnected because they went to PPSSPP settings for too long)
|
||||
if (peer == deadkid) {
|
||||
// Set Opcode
|
||||
packet[0] = PSP_ADHOC_MATCHING_PACKET_BYE;
|
||||
|
||||
// Send Bye Packet
|
||||
context->socketlock->lock();
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], packet, sizeof(packet[0]), 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
}
|
||||
else {
|
||||
// Send to other children
|
||||
if (peer->state == PSP_ADHOC_MATCHING_PEER_CHILD) {
|
||||
// Set Opcode
|
||||
packet[0] = PSP_ADHOC_MATCHING_PACKET_BYE;
|
||||
packet[0] = PSP_ADHOC_MATCHING_PACKET_DEATH;
|
||||
|
||||
// Send Bye Packet
|
||||
// Send Death Packet
|
||||
context->socketlock->lock();
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], packet, sizeof(packet[0]), 0, ADHOC_F_NONBLOCK);
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], packet, sizeof(packet), 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
}
|
||||
else
|
||||
// Send to other children
|
||||
if (peer->state == PSP_ADHOC_MATCHING_PEER_CHILD) {
|
||||
// Set Opcode
|
||||
packet[0] = PSP_ADHOC_MATCHING_PACKET_DEATH;
|
||||
|
||||
// Send Death Packet
|
||||
context->socketlock->lock();
|
||||
sceNetAdhocPdpSend(context->socket, (const char*)&peer->mac, (*context->peerPort)[peer->mac], packet, sizeof(packet), 0, ADHOC_F_NONBLOCK);
|
||||
context->socketlock->unlock();
|
||||
}
|
||||
}
|
||||
|
||||
// Delete Peer
|
||||
deletePeer(context, deadkid);
|
||||
}
|
||||
|
||||
// Delete Peer
|
||||
deletePeer(context, deadkid);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Reference in a new issue