util: add function to subtract NTP timestamps
This will be needed to work with monotonic timestamps, which don't have a stable epoch and cannot be converted to timespec.
This commit is contained in:
parent
a97ca73704
commit
a652ce7d0e
3 changed files with 21 additions and 1 deletions
|
@ -34,7 +34,7 @@ test_unit(void)
|
||||||
{
|
{
|
||||||
struct timespec ts, ts2, ts3, ts4;
|
struct timespec ts, ts2, ts3, ts4;
|
||||||
char buf[16], *s, *s2, *words[3];
|
char buf[16], *s, *s2, *words[3];
|
||||||
NTP_int64 ntp_ts, ntp_fuzz;
|
NTP_int64 ntp_ts, ntp_ts2, ntp_fuzz;
|
||||||
NTP_int32 ntp32_ts;
|
NTP_int32 ntp32_ts;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
double x, y, nan, inf;
|
double x, y, nan, inf;
|
||||||
|
@ -114,6 +114,13 @@ test_unit(void)
|
||||||
#endif
|
#endif
|
||||||
TEST_CHECK(ts.tv_nsec == 999999999);
|
TEST_CHECK(ts.tv_nsec == 999999999);
|
||||||
|
|
||||||
|
ntp_ts.hi = htonl(JAN_1970 - 1);
|
||||||
|
ntp_ts.lo = htonl(0xffffffff);
|
||||||
|
ntp_ts2.hi = htonl(JAN_1970 + 1);
|
||||||
|
ntp_ts2.lo = htonl(0x80000000);
|
||||||
|
TEST_CHECK(fabs(UTI_DiffNtp64ToDouble(&ntp_ts, &ntp_ts2) + 1.5) < 1e-9);
|
||||||
|
TEST_CHECK(fabs(UTI_DiffNtp64ToDouble(&ntp_ts2, &ntp_ts) - 1.5) < 1e-9);
|
||||||
|
|
||||||
UTI_AddDoubleToTimespec(&ts, 1e-9, &ts);
|
UTI_AddDoubleToTimespec(&ts, 1e-9, &ts);
|
||||||
#if defined(HAVE_LONG_TIME_T) && NTP_ERA_SPLIT > 0
|
#if defined(HAVE_LONG_TIME_T) && NTP_ERA_SPLIT > 0
|
||||||
TEST_CHECK(ts.tv_sec == 1 + 0x100000000LL * (1 + (NTP_ERA_SPLIT - 1) / 0x100000000LL));
|
TEST_CHECK(ts.tv_sec == 1 + 0x100000000LL * (1 + (NTP_ERA_SPLIT - 1) / 0x100000000LL));
|
||||||
|
|
10
util.c
10
util.c
|
@ -751,6 +751,16 @@ UTI_Ntp64ToTimespec(const NTP_int64 *src, struct timespec *dest)
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
|
double
|
||||||
|
UTI_DiffNtp64ToDouble(const NTP_int64 *a, const NTP_int64 *b)
|
||||||
|
{
|
||||||
|
/* Don't convert to timespec to allow any epoch */
|
||||||
|
return (int32_t)(ntohl(a->hi) - ntohl(b->hi)) +
|
||||||
|
((double)ntohl(a->lo) - (double)ntohl(b->lo)) / (1.0e9 * NSEC_PER_NTP64);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
/* Maximum offset between two sane times */
|
/* Maximum offset between two sane times */
|
||||||
#define MAX_OFFSET 4294967296.0
|
#define MAX_OFFSET 4294967296.0
|
||||||
|
|
||||||
|
|
3
util.h
3
util.h
|
@ -155,6 +155,9 @@ extern void UTI_TimespecToNtp64(const struct timespec *src, NTP_int64 *dest,
|
||||||
/* Convert an NTP timestamp into a timespec */
|
/* Convert an NTP timestamp into a timespec */
|
||||||
extern void UTI_Ntp64ToTimespec(const NTP_int64 *src, struct timespec *dest);
|
extern void UTI_Ntp64ToTimespec(const NTP_int64 *src, struct timespec *dest);
|
||||||
|
|
||||||
|
/* Calculate a - b in any epoch */
|
||||||
|
extern double UTI_DiffNtp64ToDouble(const NTP_int64 *a, const NTP_int64 *b);
|
||||||
|
|
||||||
/* Check if time + offset is sane */
|
/* Check if time + offset is sane */
|
||||||
extern int UTI_IsTimeOffsetSane(const struct timespec *ts, double offset);
|
extern int UTI_IsTimeOffsetSane(const struct timespec *ts, double offset);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue