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; } } _______________________________________________ questions mailing list questions@lists.ntp.org http://lists.ntp.org/listinfo/questions