| /* |
| chronyd/chronyc - Programs for keeping computer clocks accurate. |
| |
| ********************************************************************** |
| * Copyright (C) Richard P. Curnow 1997-2002 |
| * Copyright (C) Miroslav Lichvar 2014 |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of version 2 of the GNU General Public License as |
| * published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, but |
| * WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with this program; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| * |
| ********************************************************************** |
| |
| ======================================================================= |
| |
| This is the header for the module that manages the collection of all |
| sources that we are making measurements from. This include all NTP |
| servers & peers, locally connected reference sources, eye/wristwatch |
| drivers etc */ |
| |
| #ifndef GOT_SOURCES_H |
| #define GOT_SOURCES_H |
| |
| #include "sysincl.h" |
| |
| #include "ntp.h" |
| #include "reports.h" |
| #include "sourcestats.h" |
| |
| /* Size of the source reachability register */ |
| #define SOURCE_REACH_BITS 8 |
| |
| /* This datatype is used to hold information about sources. The |
| instance must be passed when calling many of the interface |
| functions */ |
| |
| typedef struct SRC_Instance_Record *SRC_Instance; |
| |
| /* Initialisation function */ |
| extern void SRC_Initialise(void); |
| |
| /* Finalisation function */ |
| extern void SRC_Finalise(void); |
| |
| typedef enum { |
| SRC_NTP, /* NTP client/peer */ |
| SRC_REFCLOCK /* Rerefence clock */ |
| } SRC_Type; |
| |
| /* Function to create a new instance. This would be called by one of |
| the individual source-type instance creation routines. */ |
| |
| extern SRC_Instance SRC_CreateNewInstance(uint32_t ref_id, SRC_Type type, int sel_options, |
| IPAddr *addr, int min_samples, int max_samples, |
| double min_delay, double asymmetry); |
| |
| /* Function to get rid of a source when it is being unconfigured. |
| This may cause the current reference source to be reselected, if this |
| was the reference source or contributed significantly to a |
| falseticker decision. */ |
| |
| extern void SRC_DestroyInstance(SRC_Instance instance); |
| |
| /* Function to reset a source */ |
| extern void SRC_ResetInstance(SRC_Instance instance); |
| |
| /* Function to change the sources's reference ID and IP address */ |
| extern void SRC_SetRefid(SRC_Instance instance, uint32_t ref_id, IPAddr *addr); |
| |
| /* Function to get access to the sourcestats instance */ |
| extern SST_Stats SRC_GetSourcestats(SRC_Instance instance); |
| |
| /* This function is called by one of the source drivers when it has |
| a new sample that is to be accumulated. |
| |
| This function causes the frequency estimation to be re-run for the |
| designated source, and the clock selection procedure to be re-run |
| afterwards. |
| |
| sample_time is the local time at which the sample is to be |
| considered to have been made, in terms of doing a regression fit of |
| offset against local time. |
| |
| offset is the offset at the time, in seconds. Positive indicates |
| that the local clock is SLOW relative to the source, negative |
| indicates that the local clock is FAST relative to it. |
| |
| root_delay and root_dispersion are in seconds, and are as per |
| RFC 5905. root_dispersion only includes the peer's root dispersion |
| + local sampling precision + skew dispersion accrued during the |
| measurement. It is the job of the source statistics algorithms + |
| track.c to add on the extra dispersion due to the residual standard |
| deviation of the offsets from this source after regression, to form |
| the root_dispersion field in the packets transmitted to clients or |
| peers. |
| |
| stratum is the stratum of the source that supplied the sample. |
| |
| */ |
| |
| extern void SRC_AccumulateSample(SRC_Instance instance, struct timespec *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 updates the reachability register */ |
| extern void SRC_UpdateReachability(SRC_Instance inst, int reachable); |
| |
| /* This routine marks the source unreachable */ |
| extern void SRC_ResetReachability(SRC_Instance inst); |
| |
| /* This routine is used to select the best source from amongst those |
| we currently have valid data on, and use it as the tracking base |
| for the local time. Updates are made to the local reference only |
| when the selected source was updated (set as updated_inst) since |
| the last reference update. This avoids updating the frequency |
| tracking for every sample from other sources - only the ones from |
| the selected reference make a difference. */ |
| extern void SRC_SelectSource(SRC_Instance updated_inst); |
| |
| /* Force reselecting the best source */ |
| extern void SRC_ReselectSource(void); |
| |
| /* Set reselect distance */ |
| extern void SRC_SetReselectDistance(double distance); |
| |
| extern void SRC_DumpSources(void); |
| extern void SRC_ReloadSources(void); |
| extern void SRC_RemoveDumpFiles(void); |
| |
| extern int SRC_IsSyncPeer(SRC_Instance inst); |
| extern int SRC_IsReachable(SRC_Instance inst); |
| extern int SRC_ReadNumberOfSources(void); |
| extern int SRC_ActiveSources(void); |
| extern int SRC_ReportSource(int index, RPT_SourceReport *report, struct timespec *now); |
| |
| extern int SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report, struct timespec *now); |
| |
| extern SRC_Type SRC_GetType(int index); |
| |
| #endif /* GOT_SOURCES_H */ |