diff --git a/sources.c b/sources.c index 73b8ad0..4a3adb3 100644 --- a/sources.c +++ b/sources.c @@ -54,6 +54,7 @@ static int initialised = 0; /* ================================================== */ /* Structure used to hold info for selecting between sources */ struct SelectInfo { + NTP_Leap leap; int stratum; int select_ok; double std_dev; @@ -91,7 +92,6 @@ typedef enum { source */ struct SRC_Instance_Record { SST_Stats stats; - NTP_Leap leap_status; /* Leap status */ int index; /* Index back into the array of source */ uint32_t ref_id; /* The reference ID of this source (i.e. from its IP address, NOT the @@ -291,7 +291,6 @@ void SRC_DestroyInstance(SRC_Instance instance) void SRC_ResetInstance(SRC_Instance instance) { - instance->leap_status = LEAP_Normal; instance->active = 0; instance->updates = 0; instance->reachability = 0; @@ -349,8 +348,6 @@ void SRC_AccumulateSample assert(initialised); - inst->leap_status = leap_status; - DEBUG_LOG("ip=[%s] t=%s ofs=%f del=%f disp=%f str=%d", source_to_string(inst), UTI_TimespecToString(sample_time), -offset, root_delay, root_dispersion, stratum); @@ -362,7 +359,8 @@ void SRC_AccumulateSample /* WE HAVE TO NEGATE OFFSET IN THIS CALL, IT IS HERE THAT THE SENSE OF OFFSET IS FLIPPED */ - SST_AccumulateSample(inst->stats, sample_time, -offset, peer_delay, peer_dispersion, root_delay, root_dispersion, stratum); + SST_AccumulateSample(inst->stats, sample_time, -offset, peer_delay, peer_dispersion, + root_delay, root_dispersion, stratum, leap_status); SST_DoNewRegression(inst->stats); } @@ -652,7 +650,7 @@ SRC_SelectSource(SRC_Instance updated_inst) } si = &sources[i]->sel_info; - SST_GetSelectionData(sources[i]->stats, &now, &si->stratum, + SST_GetSelectionData(sources[i]->stats, &now, &si->stratum, &si->leap, &si->lo_limit, &si->hi_limit, &si->root_distance, &si->std_dev, &first_sample_ago, &si->last_sample_ago, &si->select_ok); @@ -929,9 +927,9 @@ SRC_SelectSource(SRC_Instance updated_inst) if (best_trust_depth && !(sources[index]->sel_options & SRC_SELECT_TRUST)) continue; leap_votes++; - if (sources[index]->leap_status == LEAP_InsertSecond) + if (sources[index]->sel_info.leap == LEAP_InsertSecond) leap_ins++; - else if (sources[index]->leap_status == LEAP_DeleteSecond) + else if (sources[index]->sel_info.leap == LEAP_DeleteSecond) leap_del++; } diff --git a/sourcestats.c b/sourcestats.c index ff4c652..745026d 100644 --- a/sourcestats.c +++ b/sourcestats.c @@ -178,6 +178,8 @@ struct SST_Stats_Record { at the times the samples were generated */ int strata[MAX_SAMPLES]; + /* The leap status from the last accumulated sample */ + NTP_Leap leap; }; /* ================================================== */ @@ -252,6 +254,7 @@ SST_ResetInstance(SST_Stats inst) inst->nruns = 0; inst->asymmetry_run = 0; inst->asymmetry = 0.0; + inst->leap = LEAP_Unsynchronised; } /* ================================================== */ @@ -291,7 +294,7 @@ SST_AccumulateSample(SST_Stats inst, struct timespec *sample_time, double offset, double peer_delay, double peer_dispersion, double root_delay, double root_dispersion, - int stratum) + int stratum, NTP_Leap leap) { int n, m; @@ -321,6 +324,7 @@ SST_AccumulateSample(SST_Stats inst, struct timespec *sample_time, inst->root_delays[m] = root_delay; inst->root_dispersions[m] = root_dispersion; inst->strata[m] = stratum; + inst->leap = leap; if (inst->peer_delays[n] < inst->fixed_min_delay) inst->peer_delays[n] = 2.0 * inst->fixed_min_delay - inst->peer_delays[n]; @@ -636,7 +640,7 @@ SST_GetFrequencyRange(SST_Stats inst, void SST_GetSelectionData(SST_Stats inst, struct timespec *now, - int *stratum, + int *stratum, NTP_Leap *leap, double *offset_lo_limit, double *offset_hi_limit, double *root_distance, @@ -657,6 +661,7 @@ SST_GetSelectionData(SST_Stats inst, struct timespec *now, j = get_buf_index(inst, inst->best_single_sample); *stratum = inst->strata[get_buf_index(inst, inst->n_samples - 1)]; + *leap = inst->leap; *std_dev = inst->std_dev; sample_elapsed = fabs(UTI_DiffTimespecsToDouble(now, &inst->sample_times[i])); diff --git a/sourcestats.h b/sourcestats.h index f0a5ca9..53f1ff0 100644 --- a/sourcestats.h +++ b/sourcestats.h @@ -63,7 +63,7 @@ extern void SST_SetRefid(SST_Stats inst, uint32_t refid, IPAddr *addr); stratum is the stratum of the source from which the sample came. */ -extern void SST_AccumulateSample(SST_Stats inst, struct timespec *sample_time, double offset, double peer_delay, double peer_dispersion, double root_delay, double root_dispersion, int stratum); +extern void SST_AccumulateSample(SST_Stats inst, struct timespec *sample_time, double offset, double peer_delay, double peer_dispersion, double root_delay, double root_dispersion, int stratum, NTP_Leap leap); /* This function runs the linear regression operation on the data. It finds the set of most recent samples that give the tightest @@ -80,7 +80,7 @@ extern void SST_GetFrequencyRange(SST_Stats inst, double *lo, double *hi); /* Get data needed for selection */ extern void SST_GetSelectionData(SST_Stats inst, struct timespec *now, - int *stratum, + int *stratum, NTP_Leap *leap, double *offset_lo_limit, double *offset_hi_limit, double *root_distance,