ntp: add special value to experimental root delay/disp

The maximum value of the new 32-bit fields is slightly less than 16,
which can cause the NTP test #7 to pass for a server which has a zero
root delay but maximum root dispersion.

Interpret the maximum value as the maximum value of the original 32-bit
fields (~65536.0 seconds) for better compatibility with NTPv4.
This commit is contained in:
Miroslav Lichvar 2021-11-22 11:39:29 +01:00
parent 219085b8f6
commit e7c2f71cea
2 changed files with 9 additions and 1 deletions

View file

@ -515,7 +515,9 @@ test_unit(void)
TEST_CHECK(UTI_DoubleToNtp32f28(8.0) == htonl(0x80000000));
TEST_CHECK(UTI_DoubleToNtp32f28(16.0) == htonl(0xffffffff));
TEST_CHECK(UTI_DoubleToNtp32f28(16.1) == htonl(0xffffffff));
TEST_CHECK(UTI_DoubleToNtp32f28(16.1) == htonl(0xffffffff));
TEST_CHECK(UTI_Ntp32f28ToDouble(htonl(0xffffffff)) >= 65535.999);
for (i = 0; i < 100000; i++) {
UTI_GetRandomBytes(&ntp32_ts, sizeof (ntp32_ts));
TEST_CHECK(UTI_DoubleToNtp32(UTI_Ntp32ToDouble(ntp32_ts)) == ntp32_ts);

8
util.c
View file

@ -640,7 +640,13 @@ UTI_DoubleToNtp32(double x)
double
UTI_Ntp32f28ToDouble(NTP_int32 x)
{
return ntohl(x) / (double)(1U << 28);
uint32_t r = ntohl(x);
/* Maximum value is special */
if (r == 0xffffffff)
return MAX_NTP_INT32;
return r / (double)(1U << 28);
}
/* ================================================== */