<html lang='en'>
<head>
<meta content='text/html; charset=utf-8' http-equiv='Content-Type'>
<title>
GitLab
</title>
</meta>
</head>
<style>
img {
max-width: 100%;
height: auto;
}
p.details {
font-style:italic;
color:#777
}
.footer p {
font-size:small;
color:#777
}
pre.commit-message {
white-space: pre-wrap;
}
.file-stats a {
text-decoration: none;
}
.file-stats .new-file {
color: #090;
}
.file-stats .deleted-file {
color: #B00;
}
</style>
<body>
<div class='content'>
<h3>Eric S. Raymond pushed to branch master at <a href="https://gitlab.com/NTPsec/ntpsec">NTPsec / ntpsec</a></h3>
<h4>
Commits:
</h4>
<ul>
<li>
<strong><a href="https://gitlab.com/NTPsec/ntpsec/commit/49ed6d8ac87b31bbb8ae3c12901d11fc55c05998">49ed6d8a</a></strong>
<div>
<span>by Eric S. Raymond</span>
<i>at 2015-12-09T08:28:34Z</i>
</div>
<pre class='commit-message'>Correct the date for the WWVB modulation change.</pre>
</li>
<li>
<strong><a href="https://gitlab.com/NTPsec/ntpsec/commit/e86a62639c236e1e9c75a98bdde4e310f48fa72a">e86a6263</a></strong>
<div>
<span>by Eric S. Raymond</span>
<i>at 2015-12-09T08:28:34Z</i>
</div>
<pre class='commit-message'>For TESTFRAME, properly intercept calls to set time of day.
Also, make a start on mocking the clock state for replay mode.</pre>
</li>
<li>
<strong><a href="https://gitlab.com/NTPsec/ntpsec/commit/fbc77ea310b716a0a1d42e1b7099ef7fba6a295b">fbc77ea3</a></strong>
<div>
<span>by Eric S. Raymond</span>
<i>at 2015-12-09T08:28:35Z</i>
</div>
<pre class='commit-message'>Reduce default verbosity of capture mode.</pre>
</li>
<li>
<strong><a href="https://gitlab.com/NTPsec/ntpsec/commit/538210e32128eedc2bc78c90b0a6706d263feffe">538210e3</a></strong>
<div>
<span>by Eric S. Raymond</span>
<i>at 2015-12-09T08:28:35Z</i>
</div>
<pre class='commit-message'>When mocking time for testframe, store it in NTP format.</pre>
</li>
</ul>
<h4>12 changed files:</h4>
<ul>
<li class='file-stats'>
<a href='#diff-0'>
docs/audio.txt
</a>
</li>
<li class='file-stats'>
<a href='#diff-1'>
docs/driver27.txt
</a>
</li>
<li class='file-stats'>
<a href='#diff-2'>
docs/driver4.txt
</a>
</li>
<li class='file-stats'>
<a href='#diff-3'>
docs/ntpspeak.txt
</a>
</li>
<li class='file-stats'>
<a href='#diff-4'>
docs/refclock.txt
</a>
</li>
<li class='file-stats'>
<a href='#diff-5'>
include/ntp_fp.h
</a>
</li>
<li class='file-stats'>
<a href='#diff-6'>
libntp/systime.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-7'>
ntpd/ntp_intercept.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-8'>
ntpd/ntp_loopfilter.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-9'>
ntpd/ntp_timer.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-10'>
ntpd/refclock_spectracom.c
</a>
</li>
<li class='file-stats'>
<a href='#diff-11'>
ntpdig/main.c
</a>
</li>
</ul>
<h4>Changes:</h4>
<li id='diff-0'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-0'>
<strong>
docs/audio.txt
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/docs/audio.txt
</span><span style="color: #000000;background-color: #ddffdd">+++ b/docs/audio.txt
</span><span style="color: #aaaaaa">@@ -30,14 +30,14 @@ substantially less accurate and less reliably available, for reasons
</span> ranging from longer atmospheric path to intrinsic jitter in the
receiving devices. Reflecting this, no precision time radios have been
manufactured in the U.S. since NIST's incompatible WWV modulation
<span style="color: #000000;background-color: #ffdddd">-change in 2013.
</span><span style="color: #000000;background-color: #ddffdd">+change at 2012-10-29T15:00:00Z.
</span>
Audio drivers for the NIST time stations WWV and WWVH have already
<span style="color: #000000;background-color: #ffdddd">-been removed from the distribution because they pre-dated the 2013
-modulation change. The remaining CHU and IRIG drivers are a
-significant maintainence problem, are deprecated, and are likely to be
-removed in a future release unless a significant user constituency for
-them makes itself known.
</span><span style="color: #000000;background-color: #ddffdd">+been removed from the distribution because they pre-dated the
+2012-10-29T15:00:00Z modulation change. The remaining CHU and IRIG
+drivers are a significant maintainence problem, are deprecated, and
+are likely to be removed in a future release unless a significant user
+constituency for them makes itself known.
</span>
[[sound]]
== Sound Card Drivers ==
<span style="color: #aaaaaa">@@ -56,7 +56,8 @@ Inter Range Instrumentation Group (IRIG) signals produced by many
</span> radio clocks and timing devices, and another for the Canadian
time/frequency radio station CHU. There was formerly a third audio
driver for the NIST time & frequency radio stations WWV and WWVH, but
<span style="color: #000000;background-color: #ffdddd">-it was obsolesced by the 2013 modulation change and has been removed.
</span><span style="color: #000000;background-color: #ddffdd">+it was obsolesced by the 2012-10-29T15:00:00Z modulation change and
+has been removed.
</span>
These drivers make ample use of sophisticated digital signal
processing algorithms designed to efficiently extract timing signals
</code></pre>
<br>
</li>
<li id='diff-1'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-1'>
<strong>
docs/driver27.txt
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/docs/driver27.txt
</span><span style="color: #000000;background-color: #ddffdd">+++ b/docs/driver27.txt
</span><span style="color: #aaaaaa">@@ -15,7 +15,7 @@ maintainers plan to remove it in a future release. If you have a
</span> requirement for it, please make this known to us.
The "WWVB" functionality of this driver has been inoperable since the
<span style="color: #000000;background-color: #ffdddd">-NIST modulation change in 2013.
</span><span style="color: #000000;background-color: #ddffdd">+NIST modulation change at 2012-10-29T15:00:00Z.
</span>
== Description ==
</code></pre>
<br>
</li>
<li id='diff-2'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-2'>
<strong>
docs/driver4.txt
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/docs/driver4.txt
</span><span style="color: #000000;background-color: #ddffdd">+++ b/docs/driver4.txt
</span><span style="color: #aaaaaa">@@ -16,7 +16,7 @@ servers including the 9483, 9489, and SecureSync.
</span>
In former times this driver supported the Spectracom 9300 (now
end-of-lifed) and several models of Spectracom radio clocks that were
<span style="color: #000000;background-color: #ffdddd">-obsolesced by the WWVB modulation change in 2013.
</span><span style="color: #000000;background-color: #ddffdd">+obsolesced by the WWVB modulation change at 2012-10-29T15:00:00Z.
</span>
There are two timecode formats used by these clocks. Format 0, which is
available with all clocks, and format 2, which is available with all
</code></pre>
<br>
</li>
<li id='diff-3'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-3'>
<strong>
docs/ntpspeak.txt
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/docs/ntpspeak.txt
</span><span style="color: #000000;background-color: #ddffdd">+++ b/docs/ntpspeak.txt
</span><span style="color: #aaaaaa">@@ -248,10 +248,11 @@ USNO::
</span>
[[WWVB]]
WWVB::
<span style="color: #000000;background-color: #ffdddd">- The U.S. national time radio station, run by <<NIST>> and
- broadcasting a highly accurate U.S. civil-time reference. Formerly
- an important primary time source, until NIST changed its modulation
- in 2013 and obsolesced all then-existing U.S. precision time radios. No
</span><span style="color: #000000;background-color: #ddffdd">+ http://www.nist.gov/pml/div688/grp40/wwvb.cfm[The U.S. national time
+ radio station], run by <<NIST>> and broadcasting a highly accurate
+ U.S. civil-time reference. Formerly an important primary time
+ source, until NIST changed its modulation at 2012-10-29T15:00:00Z
+ and obsolesced all then-existing U.S. precision time radios. No
</span> WWVB-compatible precision time radios have been manufactured since,
though consumer-grade "atomic clocks" unaffected by the modulation
change are still made.
</code></pre>
<br>
</li>
<li id='diff-4'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-4'>
<strong>
docs/refclock.txt
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/docs/refclock.txt
</span><span style="color: #000000;background-color: #ddffdd">+++ b/docs/refclock.txt
</span><span style="color: #aaaaaa">@@ -38,12 +38,13 @@ reference clock use only Coordinated Universal Time (UTC). Timezone and
</span> standard/daylight adjustments are performed by the operating system
kernel.
<span style="color: #000000;background-color: #ffdddd">-Nowadays a reference clock will generally (though not always) be a GPS or GPSDO
-(GPS-conditioned oscillator). In former times it was often a radio timecode
-receiver synchronized to standard time as provided by NIST and USNO in
-the US, NRC in Canada and their counterparts elsewhere in the world.
-Precision time radios have been extinct in the U.S. since NIST changed their
-signal modulation in 2013; elsewhere they still exist but usage is
</span><span style="color: #000000;background-color: #ddffdd">+Nowadays a reference clock will generally (though not always) be a GPS
+or GPSDO (GPS-conditioned oscillator). In former times it was often a
+radio timecode receiver synchronized to standard time as provided by
+NIST and USNO in the US, NRC in Canada and their counterparts
+elsewhere in the world. Precision time radios have been extinct in
+the U.S. since NIST changed their signal modulation at
+2012-10-29T15:00:00Z; elsewhere they still exist but usage is
</span> declining under pressure from GPS technology.
A device driver specific to each reference clock must be compiled in
<span style="color: #aaaaaa">@@ -160,8 +161,9 @@ link:copyright.html[Copyright Notice] page.
</span>
If you have seen older versions of NTP, this list may have fewer
entries than you expected. Support for some very ancient drivers
<span style="color: #000000;background-color: #ffdddd">-(notably, those rendered obsolete by the WWVB modulation change in
-2013) has been dropped in order to reduce our maintainence load.
</span><span style="color: #000000;background-color: #ddffdd">+(notably, those rendered obsolete by the WWVB modulation change at
+2012-10-29T15:00:00Z) has been dropped in order to reduce our
+maintainence load.
</span>
For security reasons, we will no longer support any refclock that requires
a closed-source driver to run. This filtered out the
</code></pre>
<br>
</li>
<li id='diff-5'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-5'>
<strong>
include/ntp_fp.h
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/include/ntp_fp.h
</span><span style="color: #000000;background-color: #ddffdd">+++ b/include/ntp_fp.h
</span><span style="color: #aaaaaa">@@ -355,7 +355,7 @@ extern void init_systime (void);
</span> extern void get_ostime (struct timespec *tsp);
extern void normalize_time (struct timespec, long, l_fp *);
extern void get_systime (l_fp *);
<span style="color: #000000;background-color: #ffdddd">-extern bool step_systime (double);
</span><span style="color: #000000;background-color: #ddffdd">+extern bool step_systime (double, int (*settime)(struct timespec *));
</span> extern bool adj_systime (double, int (*adjtime)(const struct timeval *, struct timeval *));
extern struct tm * ntp2unix_tm (uint32_t ntp, int local);
</code></pre>
<br>
</li>
<li id='diff-6'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-6'>
<strong>
libntp/systime.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/libntp/systime.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/libntp/systime.c
</span><span style="color: #aaaaaa">@@ -393,7 +393,8 @@ adj_systime(
</span>
bool
step_systime(
<span style="color: #000000;background-color: #ffdddd">- double step
</span><span style="color: #000000;background-color: #ddffdd">+ double step,
+ int (*settime)(struct timespec *)
</span> )
{
time_t pivot; /* for ntp era unfolding */
<span style="color: #aaaaaa">@@ -461,7 +462,7 @@ step_systime(
</span> timets = lfp_stamp_to_tspec(fp_sys, &pivot);
/* now set new system time */
<span style="color: #000000;background-color: #ffdddd">- if (ntp_set_tod(&timets) != 0) {
</span><span style="color: #000000;background-color: #ddffdd">+ if (settime(&timets) != 0) {
</span> msyslog(LOG_ERR, "step-systime: %m");
return false;
}
</code></pre>
<br>
</li>
<li id='diff-7'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-7'>
<strong>
ntpd/ntp_intercept.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/ntpd/ntp_intercept.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/ntpd/ntp_intercept.c
</span><span style="color: #aaaaaa">@@ -22,7 +22,7 @@ following kinds:
</span>
8. Calls to adjtime/ntp_adjtime/adjtime to adjust the system clock.
<span style="color: #000000;background-color: #ffdddd">-9 Calls to ntp_set_tod to ser the system clock.
</span><span style="color: #000000;background-color: #ddffdd">+9 Calls to ntp_set_tod to set the system clock.
</span>
10. Read of the system leapsecond file.
<span style="color: #aaaaaa">@@ -72,6 +72,13 @@ terminate - the replay failed. Otherwise continue.
</span> Replay succeeds if the event stream reaches the shutdown event with
no mismatches.
<span style="color: #000000;background-color: #ddffdd">+== Limitations ==
+
+Replay mode has to not require root privileges and not actually change
+the timekeeping state of the machine. Therefore it mocks the state of the
+system clock with static storage. Bug: the state of the PLL is not yet
+mocked.
+
</span> *****************************************************************************/
#include <time.h>
<span style="color: #aaaaaa">@@ -104,6 +111,9 @@ no mismatches.
</span>
static intercept_mode mode = none;
<span style="color: #000000;background-color: #ddffdd">+/* mock the clock state */
+static l_fp replay_time;
+
</span> intercept_mode intercept_get_mode(void)
{
return mode;
<span style="color: #aaaaaa">@@ -118,7 +128,8 @@ void intercept_set_mode(intercept_mode newmode)
</span> else if (mode == capture)
fputs("# Setting capture mode\n", stdout);
syslogit = false;
<span style="color: #000000;background-color: #ffdddd">- hashprefix = termlogit = true;
</span><span style="color: #000000;background-color: #ddffdd">+ //hashprefix = termlogit = true;
+ termlogit = false;
</span> }
}
<span style="color: #aaaaaa">@@ -164,7 +175,6 @@ static bool pump(const char *fn, const char *lead, const char *trail, FILE *ofp)
</span>
void intercept_getconfig(const char *configfile)
{
<span style="color: #000000;background-color: #ffdddd">- printf("CONFIG %s\n", configfile);
</span> if (mode != replay)
getconfig(configfile);
<span style="color: #aaaaaa">@@ -189,13 +199,17 @@ void intercept_log(const char *fmt, ...)
</span> void intercept_get_systime(const char *legend, l_fp *now)
{
struct timespec ts; /* seconds and nanoseconds */
<span style="color: #000000;background-color: #ffdddd">- get_ostime(&ts);
</span>
<span style="color: #000000;background-color: #ffdddd">- if (mode == capture)
- printf("event systime %s %ld %ld\n",
- legend, (long)ts.tv_sec, ts.tv_nsec);
</span><span style="color: #000000;background-color: #ddffdd">+ if (mode == replay) {
+ *now = replay_time;
+ } else {
+ get_ostime(&ts);
+ normalize_time(ts, sys_fuzz > 0.0 ? ntp_random() : 0, now);
+ }
+
+ if (mode != none)
+ printf("event systime %s %s\n", legend, lfptoa(now, 10));
</span>
<span style="color: #000000;background-color: #ffdddd">- normalize_time(ts, sys_fuzz > 0.0 ? ntp_random() : 0, now);
</span> }
long intercept_ntp_random(const char *legend)
<span style="color: #aaaaaa">@@ -330,10 +344,10 @@ int intercept_set_tod(struct timespec *tvs)
</span> if (mode != none)
printf("event set_tod %ld %ld\n", tvs->tv_sec, tvs->tv_nsec);
<span style="color: #000000;background-color: #ffdddd">- if (mode != replay)
</span><span style="color: #000000;background-color: #ddffdd">+ if (mode == replay)
</span> return ntp_set_tod(tvs);
<span style="color: #000000;background-color: #ffdddd">- /* dodgy - returning success despite not setting time */
</span><span style="color: #000000;background-color: #ddffdd">+ normalize_time(*tvs, 9, &replay_time);
</span> return 0;
}
</code></pre>
<br>
</li>
<li id='diff-8'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-8'>
<strong>
ntpd/ntp_loopfilter.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/ntpd/ntp_loopfilter.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/ntpd/ntp_loopfilter.c
</span><span style="color: #aaaaaa">@@ -496,7 +496,7 @@ local_clock(
</span> if (mode_ntpdate) {
if ( ( fp_offset > clock_max_fwd && clock_max_fwd > 0)
|| (-fp_offset > clock_max_back && clock_max_back > 0)) {
<span style="color: #000000;background-color: #ffdddd">- step_systime(fp_offset);
</span><span style="color: #000000;background-color: #ddffdd">+ step_systime(fp_offset, intercept_set_tod);
</span> msyslog(LOG_NOTICE, "ntpd: time set %+.6f s",
fp_offset);
printf("ntpd: time set %+.6fs\n", fp_offset);
<span style="color: #aaaaaa">@@ -629,7 +629,7 @@ local_clock(
</span> snprintf(tbuf, sizeof(tbuf), "%+.6f s",
fp_offset);
report_event(EVNT_CLOCKRESET, NULL, tbuf);
<span style="color: #000000;background-color: #ffdddd">- step_systime(fp_offset);
</span><span style="color: #000000;background-color: #ddffdd">+ step_systime(fp_offset, intercept_set_tod);
</span> if (intercept_get_mode() != replay)
reinit_timer();
tc_counter = 0;
</code></pre>
<br>
</li>
<li id='diff-9'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-9'>
<strong>
ntpd/ntp_timer.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/ntpd/ntp_timer.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/ntpd/ntp_timer.c
</span><span style="color: #aaaaaa">@@ -585,7 +585,7 @@ check_leapsec(
</span> if (lsdata.warped < 0) {
if (clock_max_back > 0.0 &&
clock_max_back < abs(lsdata.warped)) {
<span style="color: #000000;background-color: #ffdddd">- step_systime(lsdata.warped);
</span><span style="color: #000000;background-color: #ddffdd">+ step_systime(lsdata.warped, intercept_set_tod);
</span> leapmsg = leapmsg_p_step;
} else {
leapmsg = leapmsg_p_slew;
<span style="color: #aaaaaa">@@ -593,7 +593,7 @@ check_leapsec(
</span> } else if (lsdata.warped > 0) {
if (clock_max_fwd > 0.0 &&
clock_max_fwd < abs(lsdata.warped)) {
<span style="color: #000000;background-color: #ffdddd">- step_systime(lsdata.warped);
</span><span style="color: #000000;background-color: #ddffdd">+ step_systime(lsdata.warped, intercept_set_tod);
</span> leapmsg = leapmsg_n_step;
} else {
leapmsg = leapmsg_n_slew;
</code></pre>
<br>
</li>
<li id='diff-10'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-10'>
<strong>
ntpd/refclock_spectracom.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/ntpd/refclock_spectracom.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/ntpd/refclock_spectracom.c
</span><span style="color: #aaaaaa">@@ -25,7 +25,7 @@
</span> *
* In former times this driver supported the Spectracom 9300 (now
* end-of-lifed) and several models of Spectracom radio clocks that were
<span style="color: #000000;background-color: #ffdddd">- * obsolesced by the WWVB modulation change in 2013.
</span><span style="color: #000000;background-color: #ddffdd">+ * obsolesced by the WWVB modulation change at 2012-10-29T15:00:00Z.
</span> *
* There are two timecode formats used by these clocks:
*
</code></pre>
<br>
</li>
<li id='diff-11'>
<a href='https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe#diff-11'>
<strong>
ntpdig/main.c
</strong>
</a>
<hr>
<pre class="highlight"><code><span style="color: #000000;background-color: #ffdddd">--- a/ntpdig/main.c
</span><span style="color: #000000;background-color: #ddffdd">+++ b/ntpdig/main.c
</span><span style="color: #aaaaaa">@@ -1555,7 +1555,7 @@ set_time(
</span> ( !opt_slew
|| (opt_slew && (fabs(offset) > steplimit))
)) {
<span style="color: #000000;background-color: #ffdddd">- rc = step_systime(offset);
</span><span style="color: #000000;background-color: #ddffdd">+ rc = step_systime(offset, ntp_set_tod);
</span>
/* If there was a problem, can we rely on errno? */
if (1 == rc)
</code></pre>
<br>
</li>
</div>
<div class='footer' style='margin-top: 10px;'>
<p>
—
<br>
<a href="https://gitlab.com/NTPsec/ntpsec/compare/9970a8b739c380be8826988a44e0ab5089840124...538210e32128eedc2bc78c90b0a6706d263feffe">View it on GitLab</a>.
<br>
You're receiving this email because of your account on gitlab.com.
If you'd like to receive fewer emails, you can adjust your notification settings.
</p>
</div>
</body>
</html>