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:
parent
219085b8f6
commit
e7c2f71cea
2 changed files with 9 additions and 1 deletions
|
@ -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
8
util.c
|
@ -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);
|
||||
}
|
||||
|
||||
/* ================================================== */
|
||||
|
|
Loading…
Reference in a new issue