]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
sources: add flag that source is active
authorMiroslav Lichvar <mlichvar@redhat.com>
Thu, 10 Apr 2014 14:53:28 +0000 (16:53 +0200)
committerMiroslav Lichvar <mlichvar@redhat.com>
Thu, 10 Apr 2014 15:48:58 +0000 (17:48 +0200)
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.

ntp_core.c
refclock.c
sources.c
sources.h

index 449fcd0640ad4db7a2848974baadb810b35ed7a7..bea86a6e90b1b93e263d04a34a4df8624f565f39 100644 (file)
@@ -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;
index ddece9f7a7580e8d9da74928ae91e861b5b75896..c9618aa2c006994353d288c05a574bac4a5c30b9 100644 (file)
@@ -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) {
index d7f7b067a31045ea430157fa8067ca2abd130e16..8ba1190a4c9b0066a5eb6f180a18dea23fa8cc90 100644 (file)
--- 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)
 {
index 3037ee9b9fcd89088db785453d3a7ea1b8ea19af..1b540d6b7af649bfa12c47c811b27c4bda65f92a 100644 (file)
--- 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);