[ENet-discuss] Why not drop it when reliableSequenceNumber < channel -> incomingReliableSequenceNumber?
Len Holgate
len.holgate at jetbyte.com
Fri Jun 15 01:15:01 PDT 2012
So THAT's how the reliable windows work. I spent ages trying to work out
what the intention was.
Thanks
Len
http://www.serverframework.com
> -----Original Message-----
> From: enet-discuss-bounces at cubik.org [mailto:enet-discuss-
> bounces at cubik.org] On Behalf Of Lee Salzman
> Sent: 14 June 2012 11:34 PM
> To: Discussion of the ENet library
> Subject: Re: [ENet-discuss] Why not drop it when reliableSequenceNumber
> < channel -> incomingReliableSequenceNumber?
>
> By the time it gets there, reliableSequenceNumber < channel ->
> incomingReliableSequenceNumber indicates a roll-over in the sequence
> number space, not an old packet. So, essentially, the sequence number
> rolled over and became small again, but that represents still a 'higher'
> sequence number in the overall scheme.
>
> The actual dropping happens earlier in the code here:
>
> if ((command -> header.command &
> ENET_PROTOCOL_COMMAND_MASK) !=
> ENET_PROTOCOL_COMMAND_SEND_UNSEQUENCED)
> {
> reliableSequenceNumber = command ->
> header.reliableSequenceNumber;
> reliableWindow = reliableSequenceNumber /
> ENET_PEER_RELIABLE_WINDOW_SIZE;
> currentWindow = channel -> incomingReliableSequenceNumber /
> ENET_PEER_RELIABLE_WINDOW_SIZE;
>
> if (reliableSequenceNumber < channel ->
> incomingReliableSequenceNumber)
> reliableWindow += ENET_PEER_RELIABLE_WINDOWS;
>
> if (reliableWindow < currentWindow || reliableWindow >=
> currentWindow + ENET_PEER_FREE_RELIABLE_WINDOWS - 1)
> goto freePacket;
> }
>
> The reason the above code works, if the packet was old or if it is
actually a
> roll-over, its reliable window gets bumped into the space of rolled-over
> windows. If a roll-over happened, the current window of the channel would
> be near the top of the sequence number space, and the reliable window of
> the packet would be near the bottom, so bumping it should not put it
outside
> of the current window + a margin of reliable windows that are "guaranteed"
> to be empty (or rather free of old packets, by virtue of it taking a
rather long
> time for the sequence number to wrap, and verifying all packets within
that
> bubble have been acknowledged) at the end of the sequence number space
> for the purpose of disambiguating this case, as new packets will never
> advance beyond this bubble of free sequence number space. If it was,
> however, just an old packet, reliable window and current window would be
> close enough to each other that bumping it puts it outside of that range
of
> free windows instead,
> thus hitting the free packet goto there.
>
> This is totally code you should not try to understand while sober, it is
harder
> to understand that way, I think. Or at least make sure you are in a
sufficiently
> abnormal state of consciousness to understand wrapping sequence number
> spaces...
>
> On 06/15/2012 05:54 AM, kaka chen wrote:
> > Hi All:
> >
> > I am reading the source code of enet-1.3.4, but have some questions
> now. Can someone explain when enet_peer_queue_incoming_
> > commands() process reliable command, if the reliableSequenceNumber <
> channel -> incomingReliableSequenceNumber, it will be added at the end of
> the channel -> incomingReliableCommands? Then how it worked? Why not
> drop it? Thanks!
> >
> > 790 case ENET_PROTOCOL_COMMAND_SEND_RELIABLE:
> > 791 if (reliableSequenceNumber == channel ->
> incomingReliableSequenceNumber)
> > 792 goto freePacket;
> > 793
> > 794 for (currentCommand = enet_list_previous (enet_list_end (&
> channel -> incomingReliableCommands));
> > 795 currentCommand != enet_list_end (& channel ->
> incomingReliableCommands);
> > 796 currentCommand = enet_list_previous (currentCommand))
> > 797 {
> > 798 incomingCommand = (ENetIncomingCommand *)
> currentCommand;
> > 799
> > 800 if (reliableSequenceNumber >= channel ->
> incomingReliableSequenceNumber)
> > 801 {
> > 802 if (incomingCommand -> reliableSequenceNumber < channel
->
> incomingReliableSequenceNumber)
> > 803 continue;
> > 804 }
> > 805 else
> > 806 if (incomingCommand -> reliableSequenceNumber >= channel
->
> incomingReliableSequenceNumber)
> > 807 break;
> > 808
> > 809 if (incomingCommand -> reliableSequenceNumber <=
> reliableSequenceNumber)
> > 810 {
> > 811 if (incomingCommand -> reliableSequenceNumber <
> reliableSequenceNumber)
> > 812 break;
> > 813
> > 814 goto freePacket;
> > 815 }
> > 816 }
> > 817 break;
> >
> > Kaka Chen
> >
> >
> > _______________________________________________
> > ENet-discuss mailing list
> > ENet-discuss at cubik.org
> > http://lists.cubik.org/mailman/listinfo/enet-discuss
>
>
> _______________________________________________
> ENet-discuss mailing list
> ENet-discuss at cubik.org
> http://lists.cubik.org/mailman/listinfo/enet-discuss
More information about the ENet-discuss
mailing list