From ba855446110352e196f7295b8e4d09098219ab17 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Wed, 1 Apr 2015 17:33:39 +0200 Subject: [PATCH] ntp: smear leap second with slewing mode and smoothing Suppress leap second in packets sent to clients when smoothing and leap second slew mode are enabled. --- ntp_core.c | 5 +++++ reference.c | 8 ++++++++ reference.h | 3 +++ 3 files changed, 16 insertions(+) diff --git a/ntp_core.c b/ntp_core.c index a24b516..2e8e5c6 100644 --- a/ntp_core.c +++ b/ntp_core.c @@ -786,6 +786,11 @@ transmit_packet(NTP_Mode my_mode, /* The mode this machine wants to be */ if (SMT_IsEnabled() && (my_mode == MODE_SERVER || my_mode == MODE_BROADCAST)) { smooth_time = 1; smooth_offset = SMT_GetOffset(&local_transmit); + + /* Suppress leap second when smoothing and slew mode are enabled */ + if (REF_GetLeapMode() == REF_LeapModeSlew && + (leap_status == LEAP_InsertSecond || leap_status == LEAP_DeleteSecond)) + leap_status = LEAP_Normal; } else { smooth_time = 0; smooth_offset = 0.0; diff --git a/reference.c b/reference.c index 2b1bfea..a8492bc 100644 --- a/reference.c +++ b/reference.c @@ -328,6 +328,14 @@ REF_SetModeEndHandler(REF_ModeEndHandler handler) /* ================================================== */ +REF_LeapMode +REF_GetLeapMode(void) +{ + return leap_mode; +} + +/* ================================================== */ + static double Sqr(double x) { diff --git a/reference.h b/reference.h index 2634c77..6ffc97d 100644 --- a/reference.h +++ b/reference.h @@ -69,6 +69,9 @@ typedef void (*REF_ModeEndHandler)(int result); /* Set the handler for being notified of mode ending */ extern void REF_SetModeEndHandler(REF_ModeEndHandler handler); +/* Get leap second handling mode */ +extern REF_LeapMode REF_GetLeapMode(void); + /* Function which takes a local cooked time and returns the estimated time of the reference. It also returns the other parameters required for forming the outgoing NTP packet.