Skip to content

Incorrect SRTT calculation when SRTT >= 8 and actual RTT < 8 ms #161

@cgutman

Description

@cgutman

The SRTT and RTT variance logic (shown below) does not properly handle the case where the peer->roundTripTime >= 8 and roundTripTime < 8.

enet/protocol.c

Lines 863 to 876 in cf735e6

peer -> roundTripTimeVariance -= peer -> roundTripTimeVariance / 4;
if (roundTripTime >= peer -> roundTripTime)
{
enet_uint32 diff = roundTripTime - peer -> roundTripTime;
peer -> roundTripTimeVariance += diff / 4;
peer -> roundTripTime += diff / 8;
}
else
{
enet_uint32 diff = peer -> roundTripTime - roundTripTime;
peer -> roundTripTimeVariance += diff / 4;
peer -> roundTripTime -= diff / 8;
}

In this case, what will happen is diff will be < 7, so diff / 8 will be 0. As a result, peer -> roundTripTime -= diff / 8; will never result in the SRTT decreasing.

The effect of this bug is that the SRTT is effectively latched at 8 ms if it has ever exceeded 8 ms, even if the actual RTT has dropped back below 8 ms.

The RTT variance is also affected by a similar bug when peer -> roundTripTimeVariance is < 4, because peer -> roundTripTimeVariance / 4 will be 0.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions