/* ================================================== */
int
-CPS_ParseLocal(char *line, int *stratum, double *distance)
+CPS_ParseLocal(char *line, int *stratum, int *orphan, double *distance)
{
int n;
char *cmd;
*stratum = 10;
*distance = 1.0;
+ *orphan = 0;
while (*line) {
cmd = line;
if (!strcasecmp(cmd, "stratum")) {
if (sscanf(line, "%d%n", stratum, &n) != 1)
return 0;
+ } else if (!strcasecmp(cmd, "orphan")) {
+ *orphan = 1;
+ n = 0;
} else if (!strcasecmp(cmd, "distance")) {
if (sscanf(line, "%lf%n", distance, &n) != 1)
return 0;
extern CPS_Status CPS_ParseNTPSourceAdd(char *line, CPS_NTP_Source *src);
/* Parse a command to enable local reference */
-extern int CPS_ParseLocal(char *line, int *stratum, double *distance);
+extern int CPS_ParseLocal(char *line, int *stratum, int *orphan, double *distance);
/* Get a string describing error status */
extern void CPS_StatusToString(CPS_Status status, char *dest, int len);
static int enable_local=0;
static int local_stratum;
+static int local_orphan;
static double local_distance;
/* Threshold (in seconds) - if absolute value of initial error is less
static void
parse_local(char *line)
{
- if (!CPS_ParseLocal(line, &local_stratum, &local_distance))
+ if (!CPS_ParseLocal(line, &local_stratum, &local_orphan, &local_distance))
command_parse_error();
enable_local = 1;
}
/* ================================================== */
int
-CNF_AllowLocalReference(int *stratum, double *distance)
+CNF_AllowLocalReference(int *stratum, int *orphan, double *distance)
{
if (enable_local) {
*stratum = local_stratum;
+ *orphan = local_orphan;
*distance = local_distance;
return 1;
} else {
extern double CNF_GetStratumWeight(void);
extern double CNF_GetCombineLimit(void);
-extern int CNF_AllowLocalReference(int *stratum, double *distance);
+extern int CNF_AllowLocalReference(int *stratum, int *orphan, double *distance);
extern void CNF_SetupAccessRestrictions(void);
static int are_we_synchronised;
static int enable_local_stratum;
static int local_stratum;
+static int local_orphan;
static double local_distance;
static NTP_Leap our_leap_status;
static int our_leap_sec;
correction_time_ratio = CNF_GetCorrectionTimeRatio();
- enable_local_stratum = CNF_AllowLocalReference(&local_stratum, &local_distance);
+ enable_local_stratum = CNF_AllowLocalReference(&local_stratum, &local_orphan, &local_distance);
local_timeout_id = 0;
leap_timeout_id = 0;
/* ================================================== */
+int
+REF_GetOrphanStratum(void)
+{
+ if (!enable_local_stratum || !local_orphan)
+ return NTP_MAX_STRATUM;
+ return local_stratum;
+}
+
+/* ================================================== */
+
double
REF_GetSkew(void)
{
synchronised */
extern int REF_GetOurStratum(void);
+/* Return stratum of the local reference if orphan mode is enabled */
+extern int REF_GetOrphanStratum(void);
+
/* Return the current skew */
extern double REF_GetSkew(void);