diff --git a/ntp_core.c b/ntp_core.c index 449fcd0..bea86a6 100644 --- a/ntp_core.c +++ b/ntp_core.c @@ -260,6 +260,9 @@ start_initial_timeout(NCR_Instance inst) SCH_NtpSamplingClass, transmit_timeout, (void *)inst); inst->timer_running = 1; + + /* Mark source active */ + SRC_SetActive(inst->source); } /* ================================================== */ @@ -275,6 +278,9 @@ take_offline(NCR_Instance inst) /* Mark source unreachable */ SRC_ResetReachability(inst->source); + + /* And inactive */ + SRC_UnsetActive(inst->source); } /* ================================================== */ @@ -339,6 +345,9 @@ NCR_GetInstance(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourcePar result->poll_target = params->poll_target; result->poll_score = 0.0; + /* Create a source instance for this NTP source */ + result->source = SRC_CreateNewInstance(UTI_IPToRefid(&remote_addr->ip_addr), SRC_NTP, params->sel_option, &result->remote_addr.ip_addr); + if (params->online) { start_initial_timeout(result); result->opmode = MD_ONLINE; @@ -358,9 +367,6 @@ NCR_GetInstance(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourcePar result->remote_poll = 0; result->remote_stratum = 0; - /* Create a source instance for this NTP source */ - result->source = SRC_CreateNewInstance(UTI_IPToRefid(&remote_addr->ip_addr), SRC_NTP, params->sel_option, &result->remote_addr.ip_addr); - result->local_rx.tv_sec = 0; result->local_rx.tv_usec = 0; result->local_tx.tv_sec = 0; @@ -1702,22 +1708,22 @@ NCR_InitiateSampleBurst(NCR_Instance inst, int n_good_samples, int n_total_sampl break; case MD_ONLINE: - case MD_OFFLINE: - if (inst->opmode == MD_ONLINE) - inst->opmode = MD_BURST_WAS_ONLINE; - else - inst->opmode = MD_BURST_WAS_OFFLINE; + inst->opmode = MD_BURST_WAS_ONLINE; inst->burst_good_samples_to_go = n_good_samples; inst->burst_total_samples_to_go = n_total_samples; - if (inst->timer_running) { - SCH_RemoveTimeout(inst->timeout_id); - } - inst->timer_running = 1; + assert(inst->timer_running); + SCH_RemoveTimeout(inst->timeout_id); inst->timeout_id = SCH_AddTimeoutInClass(INITIAL_DELAY, SAMPLING_SEPARATION, SAMPLING_RANDOMNESS, SCH_NtpSamplingClass, transmit_timeout, (void *) inst); break; + case MD_OFFLINE: + inst->opmode = MD_BURST_WAS_OFFLINE; + inst->burst_good_samples_to_go = n_good_samples; + inst->burst_total_samples_to_go = n_total_samples; + start_initial_timeout(inst); + break; default: assert(0); break; diff --git a/refclock.c b/refclock.c index ddece9f..c9618aa 100644 --- a/refclock.c +++ b/refclock.c @@ -267,6 +267,7 @@ RCL_StartRefclocks(void) RCL_Instance inst = &refclocks[i]; SRC_SetSelectable(inst->source); + SRC_SetActive(inst->source); inst->timeout_id = SCH_AddTimeoutByDelay(0.0, poll_timeout, (void *)inst); if (inst->lock_ref) { diff --git a/sources.c b/sources.c index d7f7b06..8ba1190 100644 --- a/sources.c +++ b/sources.c @@ -91,6 +91,9 @@ struct SRC_Instance_Record { /* Flag indicating that we can use this source as a reference */ int selectable; + /* Flag indicating that the source is updating reachability */ + int active; + /* Reachability register */ int reachability; @@ -215,6 +218,7 @@ SRC_Instance SRC_CreateNewInstance(uint32_t ref_id, SRC_Type type, SRC_SelectOpt result->leap_status = LEAP_Normal; result->ref_id = ref_id; result->ip_addr = addr; + result->active = 0; result->selectable = 0; result->reachability = 0; result->reachability_size = 0; @@ -316,6 +320,22 @@ void SRC_AccumulateSample /* ================================================== */ +void +SRC_SetActive(SRC_Instance inst) +{ + inst->active = 1; +} + +/* ================================================== */ + +void +SRC_UnsetActive(SRC_Instance inst) +{ + inst->active = 0; +} + +/* ================================================== */ + void SRC_SetSelectable(SRC_Instance inst) { @@ -1188,6 +1208,20 @@ SRC_ReadNumberOfSources(void) /* ================================================== */ +int +SRC_ActiveSources(void) +{ + int i, r; + + for (i = r = 0; i < n_sources; i++) + if (sources[i]->active) + r++; + + return r; +} + +/* ================================================== */ + int SRC_ReportSource(int index, RPT_SourceReport *report, struct timeval *now) { diff --git a/sources.h b/sources.h index 3037ee9..1b540d6 100644 --- a/sources.h +++ b/sources.h @@ -117,6 +117,12 @@ extern void SRC_GetFrequencyRange(SRC_Instance instance, double *lo, double *hi) extern void SRC_AccumulateSample(SRC_Instance instance, struct timeval *sample_time, double offset, double peer_delay, double peer_dispersion, double root_delay, double root_dispersion, int stratum, NTP_Leap leap_status); +/* This routine sets the source as receiving reachability updates */ +extern void SRC_SetActive(SRC_Instance inst); + +/* This routine sets the source as not receiving reachability updates */ +extern void SRC_UnsetActive(SRC_Instance inst); + /* This routine indicates that packets with valid headers are being received from the designated source */ extern void SRC_SetSelectable(SRC_Instance instance); @@ -165,6 +171,7 @@ extern void SRC_ReloadSources(void); extern int SRC_IsSyncPeer(SRC_Instance inst); extern int SRC_ReadNumberOfSources(void); +extern int SRC_ActiveSources(void); extern int SRC_ReportSource(int index, RPT_SourceReport *report, struct timeval *now); extern int SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report, struct timeval *now);