sources: add flag that source is active
When source is set as active, it's receiving reachability updates (e.g. offline NTP sources are not active). Also add function to count active sources.
This commit is contained in:
parent
bc6b40568d
commit
8671002bd7
4 changed files with 60 additions and 12 deletions
26
ntp_core.c
26
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->burst_good_samples_to_go = n_good_samples;
|
||||
inst->burst_total_samples_to_go = n_total_samples;
|
||||
if (inst->timer_running) {
|
||||
assert(inst->timer_running);
|
||||
SCH_RemoveTimeout(inst->timeout_id);
|
||||
}
|
||||
inst->timer_running = 1;
|
||||
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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
34
sources.c
34
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)
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue