double peer_dispersion;
double root_delay;
double root_dispersion;
- int stratum;
} NTP_Sample;
#endif /* GOT_NTP_H */
sample.root_delay = pkt_root_delay + sample.peer_delay;
sample.root_dispersion = pkt_root_dispersion + sample.peer_dispersion;
- sample.stratum = MAX(message->stratum, inst->min_stratum);
/* Update the NTP timestamps. If it's a valid packet from a synchronised
source, the timestamps may be used later when processing a packet in the
inst->tx_count = 0;
SRC_UpdateReachability(inst->source, synced_packet);
- SRC_SetLeapStatus(inst->source, pkt_leap);
+ SRC_UpdateStatus(inst->source, MAX(message->stratum, inst->min_stratum), pkt_leap);
if (good_packet) {
/* Adjust the polling interval, accumulate the sample, etc. */
sample.peer_dispersion = dispersion;
sample.root_dispersion = dispersion;
- /* Handle special case when PPS is used with the local reference */
- if (instance->pps_active && instance->lock_ref == -1)
- sample.stratum = pps_stratum(instance, &sample.time);
- else
- sample.stratum = instance->stratum;
-
return SPF_AccumulateSample(instance->filter, &sample);
}
poll_timeout(void *arg)
{
NTP_Sample sample;
- int poll;
+ int poll, stratum;
RCL_Instance inst = (RCL_Instance)arg;
inst->driver_polled = 0;
if (SPF_GetFilteredSample(inst->filter, &sample)) {
+ /* Handle special case when PPS is used with the local reference */
+ if (inst->pps_active && inst->lock_ref == -1)
+ stratum = pps_stratum(inst, &sample.time);
+ else
+ stratum = inst->stratum;
+
SRC_UpdateReachability(inst->source, 1);
- SRC_SetLeapStatus(inst->source, inst->leap_status);
+ SRC_UpdateStatus(inst->source, stratum, inst->leap_status);
SRC_AccumulateSample(inst->source, &sample);
SRC_SelectSource(inst->source);
result->root_dispersion = MAX(disp, mean_root_dispersion);
result->peer_delay = mean_peer_delay;
result->root_delay = mean_root_delay;
- result->stratum = last_sample->stratum;
return 1;
}
/* ================================================== */
void
-SRC_SetLeapStatus(SRC_Instance inst, NTP_Leap leap)
+SRC_UpdateStatus(SRC_Instance inst, int stratum, NTP_Leap leap)
{
+ inst->stratum = stratum;
+
if (REF_IsLeapSecondClose(NULL, 0.0))
return;
assert(initialised);
- DEBUG_LOG("src=%s ts=%s offset=%e delay=%e disp=%e stratum=%d",
+ DEBUG_LOG("src=%s ts=%s offset=%e delay=%e disp=%e",
source_to_string(inst), UTI_TimespecToString(&sample->time), -sample->offset,
- sample->root_delay, sample->root_dispersion, sample->stratum);
+ sample->root_delay, sample->root_dispersion);
if (REF_IsLeapSecondClose(&sample->time, sample->offset)) {
LOG(LOGS_INFO, "Dropping sample around leap second");
return;
}
- inst->stratum = sample->stratum;
-
SST_AccumulateSample(inst->stats, sample);
SST_DoNewRegression(inst->stats);
}
/* Function to get access to the sourcestats instance */
extern SST_Stats SRC_GetSourcestats(SRC_Instance instance);
-/* Function to set the current leap status according to the source */
-extern void SRC_SetLeapStatus(SRC_Instance instance, NTP_Leap leap);
+/* Function to update the stratum and leap status of the source */
+extern void SRC_UpdateStatus(SRC_Instance instance, int stratum, NTP_Leap leap);
/* Function to accumulate a new sample from the source */
extern void SRC_AccumulateSample(SRC_Instance instance, NTP_Sample *sample);
sample_in.root_dispersion = TST_GetRandomDouble(1.0e-3, 2.0e-3);
sample_in.peer_delay = TST_GetRandomDouble(1.0e-2, 2.0e-2);
sample_in.root_delay = TST_GetRandomDouble(1.0e-1, 2.0e-1);
- sample_in.stratum = random() % 16;
TEST_CHECK(SPF_AccumulateSample(filter, &sample_in));
TEST_CHECK(!SPF_AccumulateSample(filter, &sample_in));
sample_out.peer_delay <= 2.0e-2);
TEST_CHECK(sample_out.root_delay >= 1.0e-1 &&
sample_out.root_delay <= 2.0e-1);
- TEST_CHECK(sample_out.stratum >= 0 && sample_out.stratum <= 15);
if (max_samples == 1)
TEST_CHECK(!memcmp(&sample_in, &sample_out, sizeof (sample_in)));
sample.peer_dispersion = TST_GetRandomDouble(1.0e-6, 1.0e-1);
sample.root_delay = sample.peer_delay;
sample.root_dispersion = sample.peer_dispersion;
- sample.stratum = 1;
if (random() % 2)
- SRC_SetLeapStatus(srcs[j], random() % 4);
+ SRC_UpdateStatus(srcs[j], 1, random() % 4);
DEBUG_LOG("source %d sample %d offset %f delay %f disp %f", j, k,
sample.offset, sample.peer_delay, sample.peer_dispersion);