|
@@ -113,13 +113,26 @@ enet_peer_send (ENetPeer * peer, enet_uint8 channelID, ENetPacket * packet)
|
|
|
|
|
|
if (packet -> dataLength > fragmentLength)
|
|
|
{
|
|
|
- enet_uint16 startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingReliableSequenceNumber + 1);
|
|
|
enet_uint32 fragmentCount = ENET_HOST_TO_NET_32 ((packet -> dataLength + fragmentLength - 1) / fragmentLength),
|
|
|
fragmentNumber,
|
|
|
fragmentOffset;
|
|
|
+ enet_uint8 commandNumber;
|
|
|
+ enet_uint16 startSequenceNumber;
|
|
|
ENetList fragments;
|
|
|
ENetOutgoingCommand * fragment;
|
|
|
|
|
|
+ if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT)) == ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT &&
|
|
|
+ channel -> outgoingUnreliableSequenceNumber < 0xFFFF)
|
|
|
+ {
|
|
|
+ commandNumber = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT;
|
|
|
+ startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingUnreliableSequenceNumber + 1);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ commandNumber = ENET_PROTOCOL_COMMAND_SEND_FRAGMENT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;
|
|
|
+ startSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingReliableSequenceNumber + 1);
|
|
|
+ }
|
|
|
+
|
|
|
enet_list_clear (& fragments);
|
|
|
|
|
|
for (fragmentNumber = 0,
|
|
@@ -147,7 +160,7 @@ enet_peer_send (ENetPeer * peer, enet_uint8 channelID, ENetPacket * packet)
|
|
|
fragment -> fragmentOffset = fragmentOffset;
|
|
|
fragment -> fragmentLength = fragmentLength;
|
|
|
fragment -> packet = packet;
|
|
|
- fragment -> command.header.command = ENET_PROTOCOL_COMMAND_SEND_FRAGMENT | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;
|
|
|
+ fragment -> command.header.command = commandNumber;
|
|
|
fragment -> command.header.channelID = channelID;
|
|
|
fragment -> command.sendFragment.startSequenceNumber = startSequenceNumber;
|
|
|
fragment -> command.sendFragment.dataLength = ENET_HOST_TO_NET_16 (fragmentLength);
|
|
@@ -173,20 +186,13 @@ enet_peer_send (ENetPeer * peer, enet_uint8 channelID, ENetPacket * packet)
|
|
|
|
|
|
command.header.channelID = channelID;
|
|
|
|
|
|
- if (packet -> flags & ENET_PACKET_FLAG_RELIABLE)
|
|
|
- {
|
|
|
- command.header.command = ENET_PROTOCOL_COMMAND_SEND_RELIABLE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;
|
|
|
- command.sendReliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength);
|
|
|
- }
|
|
|
- else
|
|
|
- if (packet -> flags & ENET_PACKET_FLAG_UNSEQUENCED)
|
|
|
+ if ((packet -> flags & (ENET_PACKET_FLAG_RELIABLE | ENET_PACKET_FLAG_UNSEQUENCED)) == ENET_PACKET_FLAG_UNSEQUENCED)
|
|
|
{
|
|
|
command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED | ENET_PROTOCOL_COMMAND_FLAG_UNSEQUENCED;
|
|
|
- command.sendUnsequenced.unsequencedGroup = ENET_HOST_TO_NET_16 (peer -> outgoingUnsequencedGroup + 1);
|
|
|
command.sendUnsequenced.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength);
|
|
|
}
|
|
|
else
|
|
|
- if (channel -> outgoingUnreliableSequenceNumber >= 0xFFFF)
|
|
|
+ if (packet -> flags & ENET_PACKET_FLAG_RELIABLE || channel -> outgoingUnreliableSequenceNumber >= 0xFFFF)
|
|
|
{
|
|
|
command.header.command = ENET_PROTOCOL_COMMAND_SEND_RELIABLE | ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE;
|
|
|
command.sendReliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength);
|
|
@@ -194,7 +200,6 @@ enet_peer_send (ENetPeer * peer, enet_uint8 channelID, ENetPacket * packet)
|
|
|
else
|
|
|
{
|
|
|
command.header.command = ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE;
|
|
|
- command.sendUnreliable.unreliableSequenceNumber = ENET_HOST_TO_NET_16 (channel -> outgoingUnreliableSequenceNumber + 1);
|
|
|
command.sendUnreliable.dataLength = ENET_HOST_TO_NET_16 (packet -> dataLength);
|
|
|
}
|
|
|
|
|
@@ -550,7 +555,8 @@ enet_peer_setup_outgoing_command (ENetPeer * peer, ENetOutgoingCommand * outgoin
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- ++ channel -> outgoingUnreliableSequenceNumber;
|
|
|
+ if (outgoingCommand -> fragmentOffset == 0)
|
|
|
+ ++ channel -> outgoingUnreliableSequenceNumber;
|
|
|
|
|
|
outgoingCommand -> reliableSequenceNumber = channel -> outgoingReliableSequenceNumber;
|
|
|
outgoingCommand -> unreliableSequenceNumber = channel -> outgoingUnreliableSequenceNumber;
|
|
@@ -562,6 +568,20 @@ enet_peer_setup_outgoing_command (ENetPeer * peer, ENetOutgoingCommand * outgoin
|
|
|
outgoingCommand -> roundTripTimeoutLimit = 0;
|
|
|
outgoingCommand -> command.header.reliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> reliableSequenceNumber);
|
|
|
|
|
|
+ switch (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK)
|
|
|
+ {
|
|
|
+ case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE:
|
|
|
+ outgoingCommand -> command.sendUnreliable.unreliableSequenceNumber = ENET_HOST_TO_NET_16 (outgoingCommand -> unreliableSequenceNumber);
|
|
|
+ break;
|
|
|
+
|
|
|
+ case ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED:
|
|
|
+ outgoingCommand -> command.sendUnsequenced.unsequencedGroup = ENET_HOST_TO_NET_16 (peer -> outgoingUnsequencedGroup);
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
if (outgoingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_FLAG_ACKNOWLEDGE)
|
|
|
enet_list_insert (enet_list_end (& peer -> outgoingReliableCommands), outgoingCommand);
|
|
|
else
|
|
@@ -590,29 +610,71 @@ enet_peer_queue_outgoing_command (ENetPeer * peer, const ENetProtocol * command,
|
|
|
void
|
|
|
enet_peer_dispatch_incoming_unreliable_commands (ENetPeer * peer, ENetChannel * channel)
|
|
|
{
|
|
|
- ENetListIterator currentCommand;
|
|
|
+ ENetListIterator startCommand, currentCommand;
|
|
|
|
|
|
- for (currentCommand = enet_list_begin (& channel -> incomingUnreliableCommands);
|
|
|
+ for (startCommand = currentCommand = enet_list_begin (& channel -> incomingUnreliableCommands);
|
|
|
currentCommand != enet_list_end (& channel -> incomingUnreliableCommands);
|
|
|
currentCommand = enet_list_next (currentCommand))
|
|
|
{
|
|
|
ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) currentCommand;
|
|
|
|
|
|
- if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE &&
|
|
|
- incomingCommand -> reliableSequenceNumber != channel -> incomingReliableSequenceNumber)
|
|
|
+ if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED)
|
|
|
+ continue;
|
|
|
+ else
|
|
|
+ if (incomingCommand -> reliableSequenceNumber != channel -> incomingReliableSequenceNumber)
|
|
|
break;
|
|
|
+ else
|
|
|
+ if (incomingCommand -> fragmentsRemaining <= 0)
|
|
|
+ channel -> incomingUnreliableSequenceNumber = incomingCommand -> unreliableSequenceNumber;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (startCommand != currentCommand)
|
|
|
+ {
|
|
|
+ enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand));
|
|
|
+
|
|
|
+ if (! peer -> needsDispatch)
|
|
|
+ {
|
|
|
+ enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);
|
|
|
+
|
|
|
+ peer -> needsDispatch = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ startCommand = enet_list_next (currentCommand);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- if (currentCommand == enet_list_begin (& channel -> incomingUnreliableCommands))
|
|
|
- return;
|
|
|
+ if (startCommand != currentCommand)
|
|
|
+ {
|
|
|
+ enet_list_move (enet_list_end (& peer -> dispatchedCommands), startCommand, enet_list_previous (currentCommand));
|
|
|
|
|
|
- enet_list_move (enet_list_end (& peer -> dispatchedCommands), enet_list_begin (& channel -> incomingUnreliableCommands), enet_list_previous (currentCommand));
|
|
|
+ if (! peer -> needsDispatch)
|
|
|
+ {
|
|
|
+ enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);
|
|
|
|
|
|
- if (! peer -> needsDispatch)
|
|
|
+ peer -> needsDispatch = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ while (currentCommand != enet_list_begin (& channel -> incomingUnreliableCommands))
|
|
|
{
|
|
|
- enet_list_insert (enet_list_end (& peer -> host -> dispatchQueue), & peer -> dispatchList);
|
|
|
+ ENetIncomingCommand * incomingCommand = (ENetIncomingCommand *) enet_list_previous (currentCommand);
|
|
|
|
|
|
- peer -> needsDispatch = 1;
|
|
|
+ enet_list_remove (& incomingCommand -> incomingCommandList);
|
|
|
+
|
|
|
+ if (incomingCommand -> packet != NULL)
|
|
|
+ {
|
|
|
+ -- incomingCommand -> packet -> referenceCount;
|
|
|
+
|
|
|
+ if (incomingCommand -> packet -> referenceCount == 0)
|
|
|
+ enet_packet_destroy (incomingCommand -> packet);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (incomingCommand -> fragments != NULL)
|
|
|
+ enet_free (incomingCommand -> fragments);
|
|
|
+
|
|
|
+ enet_free (incomingCommand);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -640,6 +702,8 @@ enet_peer_dispatch_incoming_reliable_commands (ENetPeer * peer, ENetChannel * ch
|
|
|
if (currentCommand == enet_list_begin (& channel -> incomingReliableCommands))
|
|
|
return;
|
|
|
|
|
|
+ channel -> incomingUnreliableSequenceNumber = 0;
|
|
|
+
|
|
|
enet_list_move (enet_list_end (& peer -> dispatchedCommands), enet_list_begin (& channel -> incomingReliableCommands), enet_list_previous (currentCommand));
|
|
|
|
|
|
if (! peer -> needsDispatch)
|
|
@@ -684,7 +748,7 @@ enet_peer_queue_incoming_command (ENetPeer * peer, const ENetProtocol * command,
|
|
|
case ENET_PROTOCOL_COMMAND_SEND_FRAGMENT:
|
|
|
case ENET_PROTOCOL_COMMAND_SEND_RELIABLE:
|
|
|
if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber)
|
|
|
- goto freePacket;
|
|
|
+ goto freePacket;
|
|
|
|
|
|
for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingReliableCommands));
|
|
|
currentCommand != enet_list_end (& channel -> incomingReliableCommands);
|
|
@@ -712,15 +776,20 @@ enet_peer_queue_incoming_command (ENetPeer * peer, const ENetProtocol * command,
|
|
|
break;
|
|
|
|
|
|
case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE:
|
|
|
+ case ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE_FRAGMENT:
|
|
|
unreliableSequenceNumber = ENET_NET_TO_HOST_16 (command -> sendUnreliable.unreliableSequenceNumber);
|
|
|
|
|
|
+ if (reliableSequenceNumber == channel -> incomingReliableSequenceNumber &&
|
|
|
+ unreliableSequenceNumber <= channel -> incomingUnreliableSequenceNumber)
|
|
|
+ goto freePacket;
|
|
|
+
|
|
|
for (currentCommand = enet_list_previous (enet_list_end (& channel -> incomingUnreliableCommands));
|
|
|
currentCommand != enet_list_end (& channel -> incomingUnreliableCommands);
|
|
|
currentCommand = enet_list_previous (currentCommand))
|
|
|
{
|
|
|
incomingCommand = (ENetIncomingCommand *) currentCommand;
|
|
|
|
|
|
- if ((incomingCommand -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) != ENET_PROTOCOL_COMMAND_SEND_UNRELIABLE)
|
|
|
+ if ((command -> header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED)
|
|
|
continue;
|
|
|
|
|
|
if (reliableSequenceNumber >= channel -> incomingReliableSequenceNumber)
|