[ntp:questions] Garmin LVC 18x jitter problem

Michael Haardt michael at moria.de
Sat Aug 10 06:58:48 UTC 2019


By now I hacked ntpd for allowing to override the lower jitter bound,
which fixes the problem properly.  The attached patch shows the current
state.

Good: It works! ntpd no longer drops the GPS as false ticker, which in
turn does not drop PPS that depends on the preferred peer, so everything
works as beautiful as with "tos mindist 0.1", but without the negative
effect on the root dispersion that is caused by increasing the minimum
distance.

Bad: I don't see the modified jitter with "ntpq -c peers" and I have
no idea why.  I verified it is modified.  Perhaps there is duplicated
code somewhere I missed to modify as well? I should add a flag, but that
would run out of bits, and I am not certain if I may need to change other
struct members or variables storing flags as well, because much data is
being copied instead of referenced.  I would appeciate some help here.

IMHO the minimum distance should only be set in case of multiple
reference clocks that unfortunately have no overlap of offset and jitter,
so increasing the distance allows to use them at the logical price of a
higher root dispersion.  Using it to fix the wrong jitter estimation of
a single clock with not statistically distributed jitter is not what it
is intended for.  Overriding the jitter of that clock is what is really
required, and checking past mailing lists, this topic came up quite a
few times.  Obviously that allows to set mindist to 0, which reduces
the root dispersion to the actual value, which is below 1 ms for me.

Michael

diff -u -r ntp-dev-4.3.99-orig/ntpd/ntp_refclock.c ntp-dev-4.3.99/ntpd/ntp_refclock.c
--- ntp-dev-4.3.99-orig/ntpd/ntp_refclock.c	2019-06-07 09:42:47.000000000 +0200
+++ ntp-dev-4.3.99/ntpd/ntp_refclock.c	2019-08-07 19:17:08.947049304 +0200
@@ -494,6 +494,7 @@
 	}
 	pp->offset /= m;
 	pp->jitter = max(SQRT(pp->jitter / m), LOGTOD(sys_precision));
+	pp->jitter = max(pp->jitter, pp->fudgeminjitter);
 #ifdef DEBUG
 	if (debug)
 		printf(
@@ -1080,6 +1081,7 @@
 			pp->sloppyclockflag &= ~CLK_FLAG4;
 			pp->sloppyclockflag |= in->flags & CLK_FLAG4;
 		}
+		pp->fudgeminjitter = in->fudgeminjitter;
 	}
 
 	/*
diff -u -r ntp-dev-4.3.99-orig/include/ntp_refclock.h ntp-dev-4.3.99/include/ntp_refclock.h
--- ntp-dev-4.3.99-orig/include/ntp_refclock.h	2016-03-27 23:59:49.000000000 +0200
+++ ntp-dev-4.3.99/include/ntp_refclock.h	2019-08-07 19:07:13.902963553 +0200
@@ -81,6 +81,7 @@
 	double	fudgetime2;	/* configure fudge time2 */
 	int32	fudgeval1;	/* configure fudge value1 */
 	u_int32	fudgeval2;	/* configure fudge value2 */
+	double	fudgeminjitter;	/* configure fudge minjitter */
 	u_char	currentstatus;	/* clock status */
 	u_char	lastevent;	/* last exception event */
 	u_char	leap;		/* leap bits */
@@ -176,6 +177,7 @@
 	 */
 	double	fudgetime1;	/* fudge time1 */
 	double	fudgetime2;	/* fudge time2 */
+	double	fudgeminjitter;	/* manually set lower bound for jitter */
 	u_char	stratum;	/* server stratum */
 	u_int32	refid;		/* reference identifier */
 	u_char	sloppyclockflag; /* fudge flags */
diff -u -r ntp-dev-4.3.99-orig/ntpd/keyword-gen.c ntp-dev-4.3.99/ntpd/keyword-gen.c
--- ntp-dev-4.3.99-orig/ntpd/keyword-gen.c	2019-06-07 05:54:31.000000000 +0200
+++ ntp-dev-4.3.99/ntpd/keyword-gen.c	2019-08-06 19:54:05.362952788 +0200
@@ -199,6 +199,7 @@
 { "stratum",		T_Stratum,		FOLLBY_TOKEN },
 { "time1",		T_Time1,		FOLLBY_TOKEN },
 { "time2",		T_Time2,		FOLLBY_TOKEN },
+{ "minjitter",		T_Minjitter,		FOLLBY_TOKEN },
 /* system_option */
 { "auth",		T_Auth,			FOLLBY_TOKEN },
 { "bclient",		T_Bclient,		FOLLBY_TOKEN },
diff -u -r ntp-dev-4.3.99-orig/ntpd/ntp_config.c ntp-dev-4.3.99/ntpd/ntp_config.c
--- ntp-dev-4.3.99-orig/ntpd/ntp_config.c	2019-06-07 10:59:13.000000000 +0200
+++ ntp-dev-4.3.99/ntpd/ntp_config.c	2019-08-07 19:04:12.254768986 +0200
@@ -3703,6 +3703,13 @@
 					clock_stat.flags &= ~CLK_FLAG4;
 				break;
 
+			case T_Minjitter:
+#if 0
+				clock_stat.haveflags |= CLK_HAVEMINJITTER;
+#endif
+				clock_stat.fudgeminjitter = curr_opt->value.d;
+				break;
+
 			default:
 				msyslog(LOG_ERR,
 					"Unexpected fudge flag %s (%d) for %s",
diff -u -r ntp-dev-4.3.99-orig/ntpd/ntp_parser.y ntp-dev-4.3.99/ntpd/ntp_parser.y
--- ntp-dev-4.3.99-orig/ntpd/ntp_parser.y	2019-06-07 09:42:47.000000000 +0200
+++ ntp-dev-4.3.99/ntpd/ntp_parser.y	2019-08-06 19:55:06.822342155 +0200
@@ -170,6 +170,7 @@
 %token	<Integer>	T_Mindepth
 %token	<Integer>	T_Mindist
 %token	<Integer>	T_Minimum
+%token	<Integer>	T_Minjitter
 %token	<Integer>	T_Minpoll
 %token	<Integer>	T_Minsane
 %token	<Integer>	T_Mode
@@ -1024,6 +1025,7 @@
 fudge_factor_dbl_keyword
 	:	T_Time1
 	|	T_Time2
+	|	T_Minjitter
 	;
 
 fudge_factor_bool_keyword
diff -u -r ntp-dev-4.3.99-orig/ntpd/refclock_parse.c ntp-dev-4.3.99/ntpd/refclock_parse.c
--- ntp-dev-4.3.99-orig/ntpd/refclock_parse.c	2019-06-07 10:59:13.000000000 +0200
+++ ntp-dev-4.3.99/ntpd/refclock_parse.c	2019-08-07 19:09:52.371388507 +0200
@@ -3424,6 +3424,8 @@
 #endif
 		    }
 		}
+
+		parse->generic->fudgeminjitter = in->fudgeminjitter;
 	}
 }
 



More information about the questions mailing list