diff --git a/ntp_core.c b/ntp_core.c index f21065d..60d433c 100644 --- a/ntp_core.c +++ b/ntp_core.c @@ -196,6 +196,9 @@ struct NCR_Instance_Record { /* Maximum allowed stratum */ #define NTP_MAX_STRATUM 15 +/* INVALID or Unkown stratum from external server as per the NTP 4 docs */ +#define NTP_INVALID_STRATUM 0 + /* ================================================== */ static ADF_AuthTable access_auth_table; @@ -539,7 +542,13 @@ transmit_packet(NTP_Mode my_mode, /* The mode this machine wants to be */ /* Generate transmit packet */ message.lvm = ((leap << 6) &0xc0) | ((version << 3) & 0x38) | (my_mode & 0x07); - message.stratum = our_stratum; + if (our_stratum <= NTP_MAX_STRATUM) { + message.stratum = our_stratum; + } else { + /* (WGU) to handle NTP "Invalid" stratum as per the NTP V4 documents. */ + message.stratum = NTP_INVALID_STRATUM; + } + message.poll = my_poll; message.precision = LCL_GetSysPrecisionAsLog(); @@ -983,6 +992,12 @@ receive_packet(NTP_Packet *message, struct timeval *now, NCR_Instance inst, int test6 = 1; /* Succeeded */ } + /* (WGU) Set stratum to greater than any valid if incoming is 0 */ + /* as per the NPT v4 documentation*/ + if (message->stratum <= NTP_INVALID_STRATUM) { + message->stratum = NTP_MAX_STRATUM + 1; + } + /* Test 7 checks that the stratum in the packet is appropriate */ if ((message->stratum > REF_GetOurStratum()) || (message->stratum > NTP_MAX_STRATUM)) { diff --git a/rtc_linux.c b/rtc_linux.c index 8765a12..dc5a15d 100644 --- a/rtc_linux.c +++ b/rtc_linux.c @@ -174,7 +174,7 @@ static double file_ref_offset, file_rate_ppm; /* ================================================== */ /* Flag to remember whether to assume the RTC is running on UTC */ -static int rtc_on_utc = 0; +static int rtc_on_utc = 1; /* ================================================== */ @@ -226,15 +226,18 @@ accumulate_sample(time_t rtc, struct timeval *sys) discard_samples(NEW_FIRST_WHEN_FULL); } - rtc_sec[n_samples] = rtc; /* Always use most recent sample as reference */ + /* use sample only if n_sample is not negative*/ + if(n_samples >=0) + { rtc_ref = rtc; - + rtc_sec[n_samples] = rtc; rtc_trim[n_samples] = 0.0; system_times[n_samples] = *sys; - ++n_samples; ++n_samples_since_regression; + } + ++n_samples; return; } @@ -742,7 +745,11 @@ handle_initial_trim(void) run_regression(1, &coefs_valid, &coef_ref_time, &coef_seconds_fast, &coef_gain_rate); n_samples_since_regression = 0; - n_samples = 0; + + /* Set sample number to -1 so the next sample is not used, as it will not yet be corrected for System Trim*/ + + n_samples = -1; + read_coefs_from_file(); @@ -866,6 +873,8 @@ read_from_device(void *any) int error = 0; status = read(fd, &data, sizeof(data)); + if (operating_mode == OM_NORMAL) + status = read(fd, &data, sizeof(data)); if (status < 0) { /* This looks like a bad error : the file descriptor was indicating it was * ready to read but we couldn't read anything. Give up. */ diff --git a/sourcestats.c b/sourcestats.c index fecba31..163a2eb 100644 --- a/sourcestats.c +++ b/sourcestats.c @@ -373,9 +373,9 @@ find_best_sample_index(SST_Stats inst, double *times_back) /* This defines the assumed ratio between the standard deviation of the samples and the peer distance as measured from the round trip time. E.g. a value of 4 means that we think the standard deviation - is a quarter of the peer distance */ + is four times the fluctuation of the peer distance */ -#define SD_TO_DIST_RATIO 8.0 +#define SD_TO_DIST_RATIO 1.0 /* ================================================== */ /* This function runs the linear regression operation on the data. It