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.
SCH_NtpSamplingClass,
transmit_timeout, (void *)inst);
inst->timer_running = 1;
+
+ /* Mark source active */
+ SRC_SetActive(inst->source);
}
/* ================================================== */
/* Mark source unreachable */
SRC_ResetReachability(inst->source);
+
+ /* And inactive */
+ SRC_UnsetActive(inst->source);
}
/* ================================================== */
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;
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;
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;
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) {
/* 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;
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;
/* ================================================== */
+void
+SRC_SetActive(SRC_Instance inst)
+{
+ inst->active = 1;
+}
+
+/* ================================================== */
+
+void
+SRC_UnsetActive(SRC_Instance inst)
+{
+ inst->active = 0;
+}
+
+/* ================================================== */
+
void
SRC_SetSelectable(SRC_Instance inst)
{
/* ================================================== */
+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)
{
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);
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);