Hello,

At 18:05 24/05/2012, you wrote:
The length is needed because ENet does all sorts of aggregation. The packet boundaries are not 1:1. If you have 10 ENet packets in one UDP protocol packet, well, there's no way to find the packet boundaries without length. This would only be possible for the last ENet packet in a protocol packet, but you are still subject to one final caveat with this that makes it not really worth it... Packet lengths themselves as reported by UDP are not reliable: routers are free to fragment, chop up, etc. packets as will, as is the OS itself before it even sends it to the router, and the OS on the receiving end even as it hands the packet off to the user. By the time the packet gets to you, you have no indication that this packet mangling happened without one of two mechanisms: either a checksum or a length. So length has multiple useful functions here.

I looked everything in enet_protocol_receive_incoming_commands() then enet_socket_receive(), and I cannot see anything else than 1 UDP packet = 1 ENet message for unsequenced messages : there's no concatenation at all, only packet dropping if dataLength isn't big enough. I guess there's some for ENetProtocolSendFragment , but it should happen only if you detect the message size is bigger than MTU, no ?

As far as I can tell, DirectPlay doesn't handle packet length, and I never had trouble with packets arriving cut in half...


Moreover, I'm planning to remove ENetProtocolSendUnsequenced::unsequencedGroup which is not mandatory at ENet level (this is an arguable opinion ;) ), mainly because I already have the attached functionality in the high level part of my network code, but using less bits, so it's redundant and less effective at ENet level.
2 more bytes saved.

Lastly, if I understood the code correctly ENetProtocolSendUnsequenced::header::reliableSequenceNumber isn't needed (it's always set to 0), so that's 2 bytes wasted (only for unsequenced message case).

Unsequenced is not simply a normal UDP packet, it is unsequenced, but still not redundant, not quite what you're thinking. It was done this way mainly for uniformity with the other packet types to keep things simple; conceivably you could squish the unsequenced group number into the reliable sequence number space or if you don't care about redundant just remove both somehow. On the other hand, I'm not really interested in breaking protocol compatibility for all users at this point over a feature that isn't really of central utility to most users. In the future I could maybe implement a truly unsequenced/redundant (= truly unreliable) packet type if there was ever sufficient demand, but I think the current unreliable type is the main backbone packet for most people and is generally the most efficient type to use anyway - there is no real efficiency gain from using unsequenced in the current protocol, it's just a semantic thing for when you really need to violate the packet sequencing restrictions for some reason.

It's not the packet which is redundant, but the code, coz I thought I already did that in my high level network code... :) (I call this high level because I did this above DirectPlay) But I may have understood wrongly what you did. I thought unsequencedGroup was used to drop packets that arrive way too late. I guess I'd have to dig a bit more in the code to get it all right, but if you tell me I can chop it out, it's all I need to know for now..!


So the main changes you're left with is you could save that one byte of space for the peer id, and conceivably up to 4 bytes in the unsequenced packet's header by removing the unsequenced group functionality (2) and not including the reliable sequence number (2). So between those two if it's a substantial use case for you you could save 4-5 bytes per unsequenced user packet if it is really an important use case for you. Though I don't think I can do this for the general ENet because it would break compatibility with older versions and all the hassle that causes. You are of course free to make these changes in your own project as that's why I kept the source code small, understandable, and open in the first place: I did want it to be a library that people could dig in and make whatever personal customizations they needed for their project.

Thanks for your help.
I was not asking to do that for me, just the feasibility... ;)

I'm going to do a feature request in a new thread on something different, though, just in case..!
_______________________________________________
ENet-discuss mailing list
[email protected]
http://lists.cubik.org/mailman/listinfo/enet-discuss

Reply via email to