1 /*
2 * ntp_refclock - processing support for reference clocks
3 */
4 #ifdef HAVE_CONFIG_H
5 # include <config.h>
6 #endif
7
8 #include "ntpd.h"
9 #include "ntp_io.h"
10 #include "ntp_unixtime.h"
11 #include "ntp_tty.h"
12 #include "ntp_refclock.h"
13 #include "ntp_clockdev.h"
14 #include "ntp_stdlib.h"
15 #include "ntp_assert.h"
16 #include "timespecops.h"
17
18 #include <stdio.h>
19
20 #ifdef HAVE_SYS_IOCTL_H
21 # include <sys/ioctl.h>
22 #endif /* HAVE_SYS_IOCTL_H */
23
24 #ifdef REFCLOCK
25
26 #ifdef KERNEL_PLL
27 #include "ntp_syscall.h"
28 #endif /* KERNEL_PLL */
29
30 #ifdef HAVE_PPSAPI
31 #include "ppsapi_timepps.h"
32 #include "refclock_atom.h"
33 #endif /* HAVE_PPSAPI */
34
35 /*
36 * Reference clock support is provided here by maintaining the fiction
37 * that the clock is actually a peer. As no packets are exchanged with
38 * a reference clock, however, we replace the transmit, receive and
39 * packet procedures with separate code to simulate them. Routines
40 * refclock_transmit() and refclock_receive() maintain the peer
41 * variables in a state analogous to an actual peer and pass reference
42 * clock data on through the filters. Routines refclock_peer() and
43 * refclock_unpeer() are called to initialize and terminate reference
44 * clock associations. A set of utility routines is included to open
45 * serial devices, process sample data, and to perform various debugging
46 * functions.
47 *
48 * The main interface used by these routines is the refclockproc
49 * structure, which contains for most drivers the decimal equivalants
50 * of the year, day, month, hour, second and millisecond/microsecond
51 * decoded from the ASCII timecode. Additional information includes
52 * the receive timestamp, exception report, statistics tallies, etc.
53 * In addition, there may be a driver-specific unit structure used for
54 * local control of the device.
55 *
56 * The support routines are passed a pointer to the peer structure,
57 * which is used for all peer-specific processing and contains a
58 * pointer to the refclockproc structure, which in turn contains a
59 * pointer to the unit structure, if used. The peer structure is
60 * identified by an interface address in the dotted quad form
61 * 127.127.t.u, where t is the clock type and u the unit.
62 */
63 #define FUDGEFAC .1 /* fudge correction factor */
64 #define LF 0x0a /* ASCII LF */
65
66 int cal_enable; /* enable refclock calibrate */
67
68 /*
69 * Forward declarations
70 */
71 static int refclock_cmpl_fp (const void *, const void *);
72 static int refclock_sample (struct refclockproc *);
73 static int refclock_ioctl(int, u_int);
74 static void refclock_checkburst(struct peer *, struct refclockproc *);
75 static int symBaud2numBaud(int symBaud);
76 static int numBaud2symBaud(int numBaud);
77
78 /* circular buffer functions
79 *
80 * circular buffer management comes in two flovours:
81 * for powers of two, and all others.
82 */
83
84 #if MAXSTAGE & (MAXSTAGE - 1)
85
clk_add_sample(struct refclockproc * const pp,double sv)86 static void clk_add_sample(
87 struct refclockproc * const pp,
88 double sv
89 )
90 {
91 pp->coderecv = (pp->coderecv + 1) % MAXSTAGE;
92 if (pp->coderecv == pp->codeproc)
93 pp->codeproc = (pp->codeproc + 1) % MAXSTAGE;
94 pp->filter[pp->coderecv] = sv;
95 }
96
clk_pop_sample(struct refclockproc * const pp)97 static double clk_pop_sample(
98 struct refclockproc * const pp
99 )
100 {
101 if (pp->coderecv == pp->codeproc)
102 return 0; /* Maybe a NaN would be better? */
103 pp->codeproc = (pp->codeproc + 1) % MAXSTAGE;
104 return pp->filter[pp->codeproc];
105 }
106
clk_cnt_sample(struct refclockproc * const pp)107 static inline u_int clk_cnt_sample(
108 struct refclockproc * const pp
109 )
110 {
111 u_int retv = pp->coderecv - pp->codeproc;
112 if (retv > MAXSTAGE)
113 retv += MAXSTAGE;
114 return retv;
115 }
116
117 #else
118
clk_add_sample(struct refclockproc * const pp,double sv)119 static inline void clk_add_sample(
120 struct refclockproc * const pp,
121 double sv
122 )
123 {
124 pp->coderecv = (pp->coderecv + 1) & (MAXSTAGE - 1);
125 if (pp->coderecv == pp->codeproc)
126 pp->codeproc = (pp->codeproc + 1) & (MAXSTAGE - 1);
127 pp->filter[pp->coderecv] = sv;
128 }
129
clk_pop_sample(struct refclockproc * const pp)130 static inline double clk_pop_sample(
131 struct refclockproc * const pp
132 )
133 {
134 if (pp->coderecv == pp->codeproc)
135 return 0; /* Maybe a NaN would be better? */
136 pp->codeproc = (pp->codeproc + 1) & (MAXSTAGE - 1);
137 return pp->filter[pp->codeproc];
138 }
139
clk_cnt_sample(struct refclockproc * const pp)140 static inline u_int clk_cnt_sample(
141 struct refclockproc * const pp
142 )
143 {
144 return (pp->coderecv - pp->codeproc) & (MAXSTAGE - 1);
145 }
146
147 #endif
148
149 /*
150 * refclock_report - note the occurance of an event
151 *
152 * This routine presently just remembers the report and logs it, but
153 * does nothing heroic for the trap handler. It tries to be a good
154 * citizen and bothers the system log only if things change.
155 */
156 void
refclock_report(struct peer * peer,int code)157 refclock_report(
158 struct peer *peer,
159 int code
160 )
161 {
162 struct refclockproc *pp;
163
164 pp = peer->procptr;
165 if (pp == NULL)
166 return;
167
168 switch (code) {
169
170 case CEVNT_TIMEOUT:
171 pp->noreply++;
172 break;
173
174 case CEVNT_BADREPLY:
175 pp->badformat++;
176 break;
177
178 case CEVNT_FAULT:
179 break;
180
181 case CEVNT_BADDATE:
182 case CEVNT_BADTIME:
183 pp->baddata++;
184 break;
185
186 default:
187 /* ignore others */
188 break;
189 }
190 if ((code != CEVNT_NOMINAL) && (pp->lastevent < 15))
191 pp->lastevent++;
192 if (pp->currentstatus != code) {
193 pp->currentstatus = (u_char)code;
194 report_event(PEVNT_CLOCK, peer, ceventstr(code));
195 }
196 }
197
198
199 /*
200 * init_refclock - initialize the reference clock drivers
201 *
202 * This routine calls each of the drivers in turn to initialize internal
203 * variables, if necessary. Most drivers have nothing to say at this
204 * point.
205 */
206 void
init_refclock(void)207 init_refclock(void)
208 {
209 int i;
210
211 for (i = 0; i < (int)num_refclock_conf; i++)
212 if (refclock_conf[i]->clock_init != noentry)
213 (refclock_conf[i]->clock_init)();
214 }
215
216
217 /*
218 * refclock_newpeer - initialize and start a reference clock
219 *
220 * This routine allocates and initializes the interface structure which
221 * supports a reference clock in the form of an ordinary NTP peer. A
222 * driver-specific support routine completes the initialization, if
223 * used. Default peer variables which identify the clock and establish
224 * its reference ID and stratum are set here. It returns one if success
225 * and zero if the clock address is invalid or already running,
226 * insufficient resources are available or the driver declares a bum
227 * rap.
228 */
229 int
refclock_newpeer(struct peer * peer)230 refclock_newpeer(
231 struct peer *peer /* peer structure pointer */
232 )
233 {
234 struct refclockproc *pp;
235 u_char clktype;
236 int unit;
237
238 /*
239 * Check for valid clock address. If already running, shut it
240 * down first.
241 */
242 if (!ISREFCLOCKADR(&peer->srcadr)) {
243 msyslog(LOG_ERR,
244 "refclock_newpeer: clock address %s invalid",
245 stoa(&peer->srcadr));
246 return (0);
247 }
248 clktype = (u_char)REFCLOCKTYPE(&peer->srcadr);
249 unit = REFCLOCKUNIT(&peer->srcadr);
250 if (clktype >= num_refclock_conf ||
251 refclock_conf[clktype]->clock_start == noentry) {
252 msyslog(LOG_ERR,
253 "refclock_newpeer: clock type %d invalid\n",
254 clktype);
255 return (0);
256 }
257
258 /*
259 * Allocate and initialize interface structure
260 */
261 pp = emalloc_zero(sizeof(*pp));
262 peer->procptr = pp;
263
264 /*
265 * Initialize structures
266 */
267 peer->refclktype = clktype;
268 peer->refclkunit = (u_char)unit;
269 peer->flags |= FLAG_REFCLOCK;
270 peer->leap = LEAP_NOTINSYNC;
271 peer->stratum = STRATUM_REFCLOCK;
272 peer->ppoll = peer->maxpoll;
273 pp->type = clktype;
274 pp->conf = refclock_conf[clktype];
275 pp->timestarted = current_time;
276 pp->io.fd = -1;
277
278 /*
279 * Set peer.pmode based on the hmode. For appearances only.
280 */
281 switch (peer->hmode) {
282 case MODE_ACTIVE:
283 peer->pmode = MODE_PASSIVE;
284 break;
285
286 default:
287 peer->pmode = MODE_SERVER;
288 break;
289 }
290
291 /*
292 * Do driver dependent initialization. The above defaults
293 * can be wiggled, then finish up for consistency.
294 */
295 if (!((refclock_conf[clktype]->clock_start)(unit, peer))) {
296 refclock_unpeer(peer);
297 return (0);
298 }
299 peer->refid = pp->refid;
300 return (1);
301 }
302
303
304 /*
305 * refclock_unpeer - shut down a clock
306 */
307 void
refclock_unpeer(struct peer * peer)308 refclock_unpeer(
309 struct peer *peer /* peer structure pointer */
310 )
311 {
312 u_char clktype;
313 int unit;
314
315 /*
316 * Wiggle the driver to release its resources, then give back
317 * the interface structure.
318 */
319 if (NULL == peer->procptr)
320 return;
321
322 clktype = peer->refclktype;
323 unit = peer->refclkunit;
324 if (refclock_conf[clktype]->clock_shutdown != noentry)
325 (refclock_conf[clktype]->clock_shutdown)(unit, peer);
326 free(peer->procptr);
327 peer->procptr = NULL;
328 }
329
330
331 /*
332 * refclock_timer - called once per second for housekeeping.
333 */
334 void
refclock_timer(struct peer * p)335 refclock_timer(
336 struct peer *p
337 )
338 {
339 struct refclockproc * pp;
340 int unit;
341
342 unit = p->refclkunit;
343 pp = p->procptr;
344 if (pp->conf->clock_timer != noentry)
345 (*pp->conf->clock_timer)(unit, p);
346 if (pp->action != NULL && pp->nextaction <= current_time)
347 (*pp->action)(p);
348 }
349
350
351 /*
352 * refclock_transmit - simulate the transmit procedure
353 *
354 * This routine implements the NTP transmit procedure for a reference
355 * clock. This provides a mechanism to call the driver at the NTP poll
356 * interval, as well as provides a reachability mechanism to detect a
357 * broken radio or other madness.
358 */
359 void
refclock_transmit(struct peer * peer)360 refclock_transmit(
361 struct peer *peer /* peer structure pointer */
362 )
363 {
364 u_char clktype;
365 int unit;
366
367 clktype = peer->refclktype;
368 unit = peer->refclkunit;
369 peer->sent++;
370 get_systime(&peer->xmt);
371
372 /*
373 * This is a ripoff of the peer transmit routine, but
374 * specialized for reference clocks. We do a little less
375 * protocol here and call the driver-specific transmit routine.
376 */
377 if (peer->burst == 0) {
378 u_char oreach;
379 #ifdef DEBUG
380 if (debug)
381 printf("refclock_transmit: at %ld %s\n",
382 current_time, stoa(&(peer->srcadr)));
383 #endif
384
385 /*
386 * Update reachability and poll variables like the
387 * network code.
388 */
389 oreach = peer->reach & 0xfe;
390 peer->reach <<= 1;
391 if (!(peer->reach & 0x0f))
392 clock_filter(peer, 0., 0., MAXDISPERSE);
393 peer->outdate = current_time;
394 if (!peer->reach) {
395 if (oreach) {
396 report_event(PEVNT_UNREACH, peer, NULL);
397 peer->timereachable = current_time;
398 }
399 } else {
400 if (peer->flags & FLAG_BURST)
401 peer->burst = NSTAGE;
402 }
403 } else {
404 peer->burst--;
405 }
406 peer->procptr->inpoll = TRUE;
407 if (refclock_conf[clktype]->clock_poll != noentry)
408 (refclock_conf[clktype]->clock_poll)(unit, peer);
409 poll_update(peer, peer->hpoll, 0);
410 }
411
412
413 /*
414 * Compare two doubles - used with qsort()
415 */
416 static int
refclock_cmpl_fp(const void * p1,const void * p2)417 refclock_cmpl_fp(
418 const void *p1,
419 const void *p2
420 )
421 {
422 const double *dp1 = (const double *)p1;
423 const double *dp2 = (const double *)p2;
424
425 if (*dp1 < *dp2)
426 return -1;
427 if (*dp1 > *dp2)
428 return 1;
429 return 0;
430 }
431
432 /*
433 * Get number of available samples
434 */
435 int
refclock_samples_avail(struct refclockproc const * pp)436 refclock_samples_avail(
437 struct refclockproc const * pp
438 )
439 {
440 u_int na;
441
442 # if MAXSTAGE & (MAXSTAGE - 1)
443
444 na = pp->coderecv - pp->codeproc;
445 if (na > MAXSTAGE)
446 na += MAXSTAGE;
447
448 # else
449
450 na = (pp->coderecv - pp->codeproc) & (MAXSTAGE - 1);
451
452 # endif
453 return na;
454 }
455
456 /*
457 * Expire (remove) samples from the tail (oldest samples removed)
458 *
459 * Returns number of samples deleted
460 */
461 int
refclock_samples_expire(struct refclockproc * pp,int nd)462 refclock_samples_expire(
463 struct refclockproc * pp,
464 int nd
465 )
466 {
467 u_int na;
468
469 if (nd <= 0)
470 return 0;
471
472 # if MAXSTAGE & (MAXSTAGE - 1)
473
474 na = pp->coderecv - pp->codeproc;
475 if (na > MAXSTAGE)
476 na += MAXSTAGE;
477 if ((u_int)nd < na)
478 nd = na;
479 pp->codeproc = (pp->codeproc + nd) % MAXSTAGE;
480
481 # else
482
483 na = (pp->coderecv - pp->codeproc) & (MAXSTAGE - 1);
484 if ((u_int)nd > na)
485 nd = (int)na;
486 pp->codeproc = (pp->codeproc + nd) & (MAXSTAGE - 1);
487
488 # endif
489 return nd;
490 }
491
492 /*
493 * refclock_process_offset - update median filter
494 *
495 * This routine uses the given offset and timestamps to construct a new
496 * entry in the median filter circular buffer. Samples that overflow the
497 * filter are quietly discarded.
498 */
499 void
refclock_process_offset(struct refclockproc * pp,l_fp lasttim,l_fp lastrec,double fudge)500 refclock_process_offset(
501 struct refclockproc *pp, /* refclock structure pointer */
502 l_fp lasttim, /* last timecode timestamp */
503 l_fp lastrec, /* last receive timestamp */
504 double fudge
505 )
506 {
507 l_fp lftemp;
508 double doffset;
509
510 pp->lastrec = lastrec;
511 lftemp = lasttim;
512 L_SUB(&lftemp, &lastrec);
513 LFPTOD(&lftemp, doffset);
514 clk_add_sample(pp, doffset + fudge);
515 refclock_checkburst(pp->io.srcclock, pp);
516 }
517
518
519 /*
520 * refclock_process - process a sample from the clock
521 * refclock_process_f - refclock_process with other than time1 fudge
522 *
523 * This routine converts the timecode in the form days, hours, minutes,
524 * seconds and milliseconds/microseconds to internal timestamp format,
525 * then constructs a new entry in the median filter circular buffer.
526 * Return success (1) if the data are correct and consistent with the
527 * conventional calendar.
528 *
529 * Important for PPS users: Normally, the pp->lastrec is set to the
530 * system time when the on-time character is received and the pp->year,
531 * ..., pp->second decoded and the seconds fraction pp->nsec in
532 * nanoseconds). When a PPS offset is available, pp->nsec is forced to
533 * zero and the fraction for pp->lastrec is set to the PPS offset.
534 */
535 int
refclock_process_f(struct refclockproc * pp,double fudge)536 refclock_process_f(
537 struct refclockproc *pp, /* refclock structure pointer */
538 double fudge
539 )
540 {
541 l_fp offset, ltemp;
542
543 /*
544 * Compute the timecode timestamp from the days, hours, minutes,
545 * seconds and milliseconds/microseconds of the timecode. Use
546 * clocktime() for the aggregate seconds and the msec/usec for
547 * the fraction, when present. Note that this code relies on the
548 * file system time for the years and does not use the years of
549 * the timecode.
550 */
551 if (!clocktime(pp->day, pp->hour, pp->minute, pp->second, GMT,
552 pp->lastrec.l_ui, &pp->yearstart, &offset.l_ui))
553 return (0);
554
555 offset.l_uf = 0;
556 DTOLFP(pp->nsec / 1e9, <emp);
557 L_ADD(&offset, <emp);
558 refclock_process_offset(pp, offset, pp->lastrec, fudge);
559 return (1);
560 }
561
562
563 int
refclock_process(struct refclockproc * pp)564 refclock_process(
565 struct refclockproc *pp /* refclock structure pointer */
566 )
567 {
568 return refclock_process_f(pp, pp->fudgetime1);
569 }
570
571
572 /*
573 * refclock_sample - process a pile of samples from the clock
574 *
575 * This routine implements a recursive median filter to suppress spikes
576 * in the data, as well as determine a performance statistic. It
577 * calculates the mean offset and RMS jitter. A time adjustment
578 * fudgetime1 can be added to the final offset to compensate for various
579 * systematic errors. The routine returns the number of samples
580 * processed, which could be zero.
581 */
582 static int
refclock_sample(struct refclockproc * pp)583 refclock_sample(
584 struct refclockproc *pp /* refclock structure pointer */
585 )
586 {
587 size_t i, j, k, m, n;
588 double off[MAXSTAGE];
589
590 /*
591 * Copy the raw offsets and sort into ascending order. Don't do
592 * anything if the buffer is empty.
593 */
594 n = 0;
595 while (pp->codeproc != pp->coderecv)
596 off[n++] = clk_pop_sample(pp);
597 if (n == 0)
598 return (0);
599
600 if (n > 1)
601 qsort(off, n, sizeof(off[0]), refclock_cmpl_fp);
602
603 /*
604 * Reject the furthest from the median of the samples until
605 * approximately 60 percent of the samples remain.
606 *
607 * [Bug 3672] The elimination is now based on the proper
608 * definition of the median. The true median is not calculated
609 * directly, though.
610 */
611 i = 0; j = n;
612 m = n - (n * 4) / 10;
613 while ((k = j - i) > m) {
614 k = (k - 1) >> 1;
615 if ((off[j - 1] - off[j - k - 1]) < (off[i + k] - off[i]))
616 i++; /* reject low end */
617 else
618 j--; /* reject high end */
619 }
620
621 /*
622 * Determine the offset and jitter.
623 */
624 pp->offset = off[i];
625 pp->jitter = 0;
626 for (k = i + 1; k < j; k++) {
627 pp->offset += off[k];
628 pp->jitter += SQUARE(off[k] - off[k - 1]);
629 }
630 pp->offset /= m;
631 m -= (m > 1); /* only (m-1) terms attribute to jitter! */
632 pp->jitter = max(SQRT(pp->jitter / m), LOGTOD(sys_precision));
633
634 /*
635 * If the source has a jitter that cannot be estimated, because
636 * it is not statistic jitter, the source will be detected as
637 * falseticker sooner or later. Enforcing a minimal jitter value
638 * avoids a too low estimation while still detecting higher jitter.
639 *
640 * Note that this changes the refclock samples and ends up in the
641 * clock dispersion, not the clock jitter, despite being called
642 * jitter. To see the modified values, check the NTP clock variable
643 * "filtdisp", not "jitter".
644 */
645 pp->jitter = max(pp->jitter, pp->fudgeminjitter);
646
647 #ifdef DEBUG
648 if (debug)
649 printf(
650 "refclock_sample: n %d offset %.6f disp %.6f jitter %.6f\n",
651 (int)n, pp->offset, pp->disp, pp->jitter);
652 #endif
653 return (int)n;
654 }
655
656
657 /*
658 * refclock_receive - simulate the receive and packet procedures
659 *
660 * This routine simulates the NTP receive and packet procedures for a
661 * reference clock. This provides a mechanism in which the ordinary NTP
662 * filter, selection and combining algorithms can be used to suppress
663 * misbehaving radios and to mitigate between them when more than one is
664 * available for backup.
665 */
666 void
refclock_receive(struct peer * peer)667 refclock_receive(
668 struct peer *peer /* peer structure pointer */
669 )
670 {
671 struct refclockproc *pp;
672
673 #ifdef DEBUG
674 if (debug)
675 printf("refclock_receive: at %lu %s\n",
676 current_time, stoa(&peer->srcadr));
677 #endif
678
679 /*
680 * Do a little sanity dance and update the peer structure. Groom
681 * the median filter samples and give the data to the clock
682 * filter.
683 */
684 pp = peer->procptr;
685 pp->inpoll = FALSE;
686 peer->leap = pp->leap;
687 if (peer->leap == LEAP_NOTINSYNC)
688 return;
689
690 peer->received++;
691 peer->timereceived = current_time;
692 if (!peer->reach) {
693 report_event(PEVNT_REACH, peer, NULL);
694 peer->timereachable = current_time;
695 }
696 peer->reach = (peer->reach << (peer->reach & 1)) | 1;
697 peer->reftime = pp->lastref;
698 peer->aorg = pp->lastrec;
699 peer->rootdisp = pp->disp;
700 get_systime(&peer->dst);
701 if (!refclock_sample(pp))
702 return;
703
704 clock_filter(peer, pp->offset, 0., pp->jitter);
705 if (cal_enable && fabs(last_offset) < sys_mindisp && sys_peer !=
706 NULL) {
707 if (sys_peer->refclktype == REFCLK_ATOM_PPS &&
708 peer->refclktype != REFCLK_ATOM_PPS)
709 pp->fudgetime1 -= pp->offset * FUDGEFAC;
710 }
711 }
712
713
714 /*
715 * refclock_gtlin - groom next input line and extract timestamp
716 *
717 * This routine processes the timecode received from the clock and
718 * strips the parity bit and control characters. It returns the number
719 * of characters in the line followed by a NULL character ('\0'), which
720 * is not included in the count. In case of an empty line, the previous
721 * line is preserved.
722 */
723 int
refclock_gtlin(struct recvbuf * rbufp,char * lineptr,int bmax,l_fp * tsptr)724 refclock_gtlin(
725 struct recvbuf *rbufp, /* receive buffer pointer */
726 char *lineptr, /* current line pointer */
727 int bmax, /* remaining characters in line */
728 l_fp *tsptr /* pointer to timestamp returned */
729 )
730 {
731 const char *sp, *spend;
732 char *dp, *dpend;
733 int dlen;
734
735 if (bmax <= 0)
736 return (0);
737
738 dp = lineptr;
739 dpend = dp + bmax - 1; /* leave room for NUL pad */
740 sp = (const char *)rbufp->recv_buffer;
741 spend = sp + rbufp->recv_length;
742
743 while (sp != spend && dp != dpend) {
744 char c;
745
746 c = *sp++ & 0x7f;
747 if (c >= 0x20 && c < 0x7f)
748 *dp++ = c;
749 }
750 /* Get length of data written to the destination buffer. If
751 * zero, do *not* place a NUL byte to preserve the previous
752 * buffer content.
753 */
754 dlen = dp - lineptr;
755 if (dlen)
756 *dp = '\0';
757 *tsptr = rbufp->recv_time;
758 DPRINTF(2, ("refclock_gtlin: fd %d time %s timecode %d %s\n",
759 rbufp->fd, ulfptoa(&rbufp->recv_time, 6), dlen,
760 (dlen != 0)
761 ? lineptr
762 : ""));
763 return (dlen);
764 }
765
766
767 /*
768 * refclock_gtraw - get next line/chunk of data
769 *
770 * This routine returns the raw data received from the clock in both
771 * canonical or raw modes. The terminal interface routines map CR to LF.
772 * In canonical mode this results in two lines, one containing data
773 * followed by LF and another containing only LF. In raw mode the
774 * interface routines can deliver arbitraty chunks of data from one
775 * character to a maximum specified by the calling routine. In either
776 * mode the routine returns the number of characters in the line
777 * followed by a NULL character ('\0'), which is not included in the
778 * count.
779 *
780 * *tsptr receives a copy of the buffer timestamp.
781 */
782 int
refclock_gtraw(struct recvbuf * rbufp,char * lineptr,int bmax,l_fp * tsptr)783 refclock_gtraw(
784 struct recvbuf *rbufp, /* receive buffer pointer */
785 char *lineptr, /* current line pointer */
786 int bmax, /* remaining characters in line */
787 l_fp *tsptr /* pointer to timestamp returned */
788 )
789 {
790 if (bmax <= 0)
791 return (0);
792 bmax -= 1; /* leave room for trailing NUL */
793 if (bmax > rbufp->recv_length)
794 bmax = rbufp->recv_length;
795 memcpy(lineptr, rbufp->recv_buffer, bmax);
796 lineptr[bmax] = '\0';
797
798 *tsptr = rbufp->recv_time;
799 DPRINTF(2, ("refclock_gtraw: fd %d time %s timecode %d %s\n",
800 rbufp->fd, ulfptoa(&rbufp->recv_time, 6), bmax,
801 lineptr));
802 return (bmax);
803 }
804
805 /*
806 * refclock_fdwrite()
807 *
808 * Write data to a clock device. Does the necessary result checks and
809 * logging, and encapsulates OS dependencies.
810 */
811 #ifdef SYS_WINNT
812 extern int async_write(int fd, const void * buf, unsigned int len);
813 #endif
814
815 size_t
refclock_fdwrite(const struct peer * peer,int fd,const void * buf,size_t len,const char * what)816 refclock_fdwrite(
817 const struct peer * peer,
818 int fd,
819 const void * buf,
820 size_t len,
821 const char * what
822 )
823 {
824 size_t nret, nout;
825 int nerr;
826
827 nout = (INT_MAX > len) ? len : INT_MAX;
828 # ifdef SYS_WINNT
829 nret = (size_t)async_write(fd, buf, (unsigned int)nout);
830 # else
831 nret = (size_t)write(fd, buf, nout);
832 # endif
833 if (NULL != what) {
834 if (nret == FDWRITE_ERROR) {
835 nerr = errno;
836 msyslog(LOG_INFO,
837 "%s: write %s failed, fd=%d, %m",
838 refnumtoa(&peer->srcadr), what,
839 fd);
840 errno = nerr;
841 } else if (nret != len) {
842 nerr = errno;
843 msyslog(LOG_NOTICE,
844 "%s: %s shortened, fd=%d, wrote %zu of %zu bytes",
845 refnumtoa(&peer->srcadr), what,
846 fd, nret, len);
847 errno = nerr;
848 }
849 }
850 return nret;
851 }
852
853 size_t
refclock_write(const struct peer * peer,const void * buf,size_t len,const char * what)854 refclock_write(
855 const struct peer * peer,
856 const void * buf,
857 size_t len,
858 const char * what
859 )
860 {
861 if ( ! (peer && peer->procptr)) {
862 if (NULL != what)
863 msyslog(LOG_INFO,
864 "%s: write %s failed, invalid clock peer",
865 refnumtoa(&peer->srcadr), what);
866 errno = EINVAL;
867 return FDWRITE_ERROR;
868 }
869 return refclock_fdwrite(peer, peer->procptr->io.fd,
870 buf, len, what);
871 }
872
873 /*
874 * indicate_refclock_packet()
875 *
876 * Passes a fragment of refclock input read from the device to the
877 * driver direct input routine, which may consume it (batch it for
878 * queuing once a logical unit is assembled). If it is not so
879 * consumed, queue it for the driver's receive entrypoint.
880 *
881 * The return value is TRUE if the data has been consumed as a fragment
882 * and should not be counted as a received packet.
883 */
884 int
indicate_refclock_packet(struct refclockio * rio,struct recvbuf * rb)885 indicate_refclock_packet(
886 struct refclockio * rio,
887 struct recvbuf * rb
888 )
889 {
890 /* Does this refclock use direct input routine? */
891 if (rio->io_input != NULL && (*rio->io_input)(rb) == 0) {
892 /*
893 * data was consumed - nothing to pass up
894 * into block input machine
895 */
896 freerecvbuf(rb);
897
898 return TRUE;
899 }
900 add_full_recv_buffer(rb);
901
902 return FALSE;
903 }
904
905
906 /*
907 * process_refclock_packet()
908 *
909 * Used for deferred processing of 'io_input' on systems where threading
910 * is used (notably Windows). This is acting as a trampoline to make the
911 * real calls to the refclock functions.
912 */
913 #ifdef HAVE_IO_COMPLETION_PORT
914 void
process_refclock_packet(struct recvbuf * rb)915 process_refclock_packet(
916 struct recvbuf * rb
917 )
918 {
919 struct refclockio * rio;
920
921 /* get the refclockio structure from the receive buffer */
922 rio = &rb->recv_peer->procptr->io;
923
924 /* call 'clock_recv' if either there is no input function or the
925 * raw input function tells us to feed the packet to the
926 * receiver.
927 */
928 if (rio->io_input == NULL || (*rio->io_input)(rb) != 0) {
929 rio->recvcount++;
930 packets_received++;
931 handler_pkts++;
932 (*rio->clock_recv)(rb);
933 }
934 }
935 #endif /* HAVE_IO_COMPLETION_PORT */
936
937
938 /*
939 * The following code does not apply to WINNT & VMS ...
940 */
941 #if !defined(SYS_VXWORKS) && !defined(SYS_WINNT)
942 #if defined(HAVE_TERMIOS) || defined(HAVE_SYSV_TTYS) || defined(HAVE_BSD_TTYS)
943
944 /*
945 * refclock_open - open serial port for reference clock
946 *
947 * This routine opens a serial port for I/O and sets default options. It
948 * returns the file descriptor if successful, or logs an error and
949 * returns -1.
950 */
951 int
refclock_open(const sockaddr_u * srcadr,const char * dev,u_int speed,u_int lflags)952 refclock_open(
953 const sockaddr_u *srcadr,
954 const char *dev, /* device name pointer */
955 u_int speed, /* serial port speed (code) */
956 u_int lflags /* line discipline flags */
957 )
958 {
959 const char *cdev;
960 int fd;
961 int omode;
962 #ifdef O_NONBLOCK
963 char trash[128]; /* litter bin for old input data */
964 #endif
965
966 /*
967 * Open serial port and set default options
968 */
969 omode = O_RDWR;
970 #ifdef O_NONBLOCK
971 omode |= O_NONBLOCK;
972 #endif
973 #ifdef O_NOCTTY
974 omode |= O_NOCTTY;
975 #endif
976
977 if (NULL != (cdev = clockdev_lookup(srcadr, 0)))
978 dev = cdev;
979
980 fd = open(dev, omode, 0777);
981 /* refclock_open() long returned 0 on failure, avoid it. */
982 if (0 == fd) {
983 fd = dup(0);
984 SAVE_ERRNO(
985 close(0);
986 )
987 }
988 if (fd < 0) {
989 SAVE_ERRNO(
990 msyslog(LOG_ERR, "refclock_open %s: %m", dev);
991 )
992 return -1;
993 }
994 if (!refclock_setup(fd, speed, lflags)) {
995 close(fd);
996 return -1;
997 }
998 if (!refclock_ioctl(fd, lflags)) {
999 close(fd);
1000 return -1;
1001 }
1002 msyslog(LOG_NOTICE, "%s serial %s open at %d bps",
1003 refnumtoa(srcadr), dev, symBaud2numBaud(speed));
1004
1005 #ifdef O_NONBLOCK
1006 /*
1007 * We want to make sure there is no pending trash in the input
1008 * buffer. Since we have non-blocking IO available, this is a
1009 * good moment to read and dump all available outdated stuff
1010 * that might have become toxic for the driver.
1011 */
1012 while (read(fd, trash, sizeof(trash)) > 0 || errno == EINTR)
1013 /*NOP*/;
1014 #endif
1015 return fd;
1016 }
1017
1018
1019 /*
1020 * refclock_setup - initialize terminal interface structure
1021 */
1022 int
refclock_setup(int fd,u_int speed,u_int lflags)1023 refclock_setup(
1024 int fd, /* file descriptor */
1025 u_int speed, /* serial port speed (code) */
1026 u_int lflags /* line discipline flags */
1027 )
1028 {
1029 int i;
1030 TTY ttyb, *ttyp;
1031
1032 /*
1033 * By default, the serial line port is initialized in canonical
1034 * (line-oriented) mode at specified line speed, 8 bits and no
1035 * parity. LF ends the line and CR is mapped to LF. The break,
1036 * erase and kill functions are disabled. There is a different
1037 * section for each terminal interface, as selected at compile
1038 * time. The flag bits can be used to set raw mode and echo.
1039 */
1040 ttyp = &ttyb;
1041 #ifdef HAVE_TERMIOS
1042
1043 /*
1044 * POSIX serial line parameters (termios interface)
1045 */
1046 if (tcgetattr(fd, ttyp) < 0) {
1047 SAVE_ERRNO(
1048 msyslog(LOG_ERR,
1049 "refclock_setup fd %d tcgetattr: %m",
1050 fd);
1051 )
1052 return FALSE;
1053 }
1054
1055 /*
1056 * Set canonical mode and local connection; set specified speed,
1057 * 8 bits and no parity; map CR to NL; ignore break.
1058 */
1059 if (speed) {
1060 u_int ltemp = 0;
1061
1062 ttyp->c_iflag = IGNBRK | IGNPAR | ICRNL;
1063 ttyp->c_oflag = 0;
1064 ttyp->c_cflag = CS8 | CLOCAL | CREAD;
1065 if (lflags & LDISC_7O1) {
1066 /* HP Z3801A needs 7-bit, odd parity */
1067 ttyp->c_cflag = CS7 | PARENB | PARODD | CLOCAL | CREAD;
1068 }
1069 cfsetispeed(&ttyb, speed);
1070 cfsetospeed(&ttyb, speed);
1071 for (i = 0; i < NCCS; ++i)
1072 ttyp->c_cc[i] = '\0';
1073
1074 #if defined(TIOCMGET) && !defined(SCO5_CLOCK)
1075
1076 /*
1077 * If we have modem control, check to see if modem leads
1078 * are active; if so, set remote connection. This is
1079 * necessary for the kernel pps mods to work.
1080 */
1081 if (ioctl(fd, TIOCMGET, (char *)<emp) < 0)
1082 msyslog(LOG_ERR,
1083 "refclock_setup fd %d TIOCMGET: %m", fd);
1084 #ifdef DEBUG
1085 if (debug)
1086 printf("refclock_setup fd %d modem status: 0x%x\n",
1087 fd, ltemp);
1088 #endif
1089 if (ltemp & TIOCM_DSR && lflags & LDISC_REMOTE)
1090 ttyp->c_cflag &= ~CLOCAL;
1091 #endif /* TIOCMGET */
1092 }
1093
1094 /*
1095 * Set raw and echo modes. These can be changed on-fly.
1096 */
1097 ttyp->c_lflag = ICANON;
1098 if (lflags & LDISC_RAW) {
1099 ttyp->c_lflag = 0;
1100 ttyp->c_iflag = 0;
1101 ttyp->c_cc[VMIN] = 1;
1102 }
1103 if (lflags & LDISC_ECHO)
1104 ttyp->c_lflag |= ECHO;
1105 if (tcsetattr(fd, TCSANOW, ttyp) < 0) {
1106 SAVE_ERRNO(
1107 msyslog(LOG_ERR,
1108 "refclock_setup fd %d TCSANOW: %m",
1109 fd);
1110 )
1111 return FALSE;
1112 }
1113
1114 /*
1115 * flush input and output buffers to discard any outdated stuff
1116 * that might have become toxic for the driver. Failing to do so
1117 * is logged, but we keep our fingers crossed otherwise.
1118 */
1119 if (tcflush(fd, TCIOFLUSH) < 0)
1120 msyslog(LOG_ERR, "refclock_setup fd %d tcflush(): %m",
1121 fd);
1122 #endif /* HAVE_TERMIOS */
1123
1124 #ifdef HAVE_SYSV_TTYS
1125
1126 /*
1127 * System V serial line parameters (termio interface)
1128 *
1129 */
1130 if (ioctl(fd, TCGETA, ttyp) < 0) {
1131 SAVE_ERRNO(
1132 msyslog(LOG_ERR,
1133 "refclock_setup fd %d TCGETA: %m",
1134 fd);
1135 )
1136 return FALSE;
1137 }
1138
1139 /*
1140 * Set canonical mode and local connection; set specified speed,
1141 * 8 bits and no parity; map CR to NL; ignore break.
1142 */
1143 if (speed) {
1144 u_int ltemp = 0;
1145
1146 ttyp->c_iflag = IGNBRK | IGNPAR | ICRNL;
1147 ttyp->c_oflag = 0;
1148 ttyp->c_cflag = speed | CS8 | CLOCAL | CREAD;
1149 for (i = 0; i < NCCS; ++i)
1150 ttyp->c_cc[i] = '\0';
1151
1152 #if defined(TIOCMGET) && !defined(SCO5_CLOCK)
1153
1154 /*
1155 * If we have modem control, check to see if modem leads
1156 * are active; if so, set remote connection. This is
1157 * necessary for the kernel pps mods to work.
1158 */
1159 if (ioctl(fd, TIOCMGET, (char *)<emp) < 0)
1160 msyslog(LOG_ERR,
1161 "refclock_setup fd %d TIOCMGET: %m", fd);
1162 #ifdef DEBUG
1163 if (debug)
1164 printf("refclock_setup fd %d modem status: %x\n",
1165 fd, ltemp);
1166 #endif
1167 if (ltemp & TIOCM_DSR)
1168 ttyp->c_cflag &= ~CLOCAL;
1169 #endif /* TIOCMGET */
1170 }
1171
1172 /*
1173 * Set raw and echo modes. These can be changed on-fly.
1174 */
1175 ttyp->c_lflag = ICANON;
1176 if (lflags & LDISC_RAW) {
1177 ttyp->c_lflag = 0;
1178 ttyp->c_iflag = 0;
1179 ttyp->c_cc[VMIN] = 1;
1180 }
1181 if (ioctl(fd, TCSETA, ttyp) < 0) {
1182 SAVE_ERRNO(
1183 msyslog(LOG_ERR,
1184 "refclock_setup fd %d TCSETA: %m", fd);
1185 )
1186 return FALSE;
1187 }
1188 #endif /* HAVE_SYSV_TTYS */
1189
1190 #ifdef HAVE_BSD_TTYS
1191
1192 /*
1193 * 4.3bsd serial line parameters (sgttyb interface)
1194 */
1195 if (ioctl(fd, TIOCGETP, (char *)ttyp) < 0) {
1196 SAVE_ERRNO(
1197 msyslog(LOG_ERR,
1198 "refclock_setup fd %d TIOCGETP: %m",
1199 fd);
1200 )
1201 return FALSE;
1202 }
1203 if (speed)
1204 ttyp->sg_ispeed = ttyp->sg_ospeed = speed;
1205 ttyp->sg_flags = EVENP | ODDP | CRMOD;
1206 if (ioctl(fd, TIOCSETP, (char *)ttyp) < 0) {
1207 SAVE_ERRNO(
1208 msyslog(LOG_ERR, "refclock_setup TIOCSETP: %m");
1209 )
1210 return FALSE;
1211 }
1212 #endif /* HAVE_BSD_TTYS */
1213 return(1);
1214 }
1215 #endif /* HAVE_TERMIOS || HAVE_SYSV_TTYS || HAVE_BSD_TTYS */
1216
1217
1218 /*
1219 * refclock_ioctl - set serial port control functions
1220 *
1221 * This routine attempts to hide the internal, system-specific details
1222 * of serial ports. It can handle POSIX (termios), SYSV (termio) and BSD
1223 * (sgtty) interfaces with varying degrees of success. The routine sets
1224 * up optional features such as tty_clk. The routine returns TRUE if
1225 * successful.
1226 */
1227 int
refclock_ioctl(int fd,u_int lflags)1228 refclock_ioctl(
1229 int fd, /* file descriptor */
1230 u_int lflags /* line discipline flags */
1231 )
1232 {
1233 /*
1234 * simply return TRUE if no UNIX line discipline is supported
1235 */
1236 DPRINTF(1, ("refclock_ioctl: fd %d flags 0x%x\n", fd, lflags));
1237
1238 return TRUE;
1239 }
1240 #endif /* !defined(SYS_VXWORKS) && !defined(SYS_WINNT) */
1241
1242
1243 /*
1244 * refclock_control - set and/or return clock values
1245 *
1246 * This routine is used mainly for debugging. It returns designated
1247 * values from the interface structure that can be displayed using
1248 * ntpdc and the clockstat command. It can also be used to initialize
1249 * configuration variables, such as fudgetimes, fudgevalues, reference
1250 * ID and stratum.
1251 */
1252 void
refclock_control(sockaddr_u * srcadr,const struct refclockstat * in,struct refclockstat * out)1253 refclock_control(
1254 sockaddr_u *srcadr,
1255 const struct refclockstat *in,
1256 struct refclockstat *out
1257 )
1258 {
1259 struct peer *peer;
1260 struct refclockproc *pp;
1261 u_char clktype;
1262 int unit;
1263
1264 /*
1265 * Check for valid address and running peer
1266 */
1267 if (!ISREFCLOCKADR(srcadr))
1268 return;
1269
1270 clktype = (u_char)REFCLOCKTYPE(srcadr);
1271 unit = REFCLOCKUNIT(srcadr);
1272
1273 peer = findexistingpeer(srcadr, NULL, NULL, -1, 0, NULL);
1274
1275 if (NULL == peer)
1276 return;
1277
1278 INSIST(peer->procptr != NULL);
1279 pp = peer->procptr;
1280
1281 /*
1282 * Initialize requested data
1283 */
1284 if (in != NULL) {
1285 if (in->haveflags & CLK_HAVETIME1)
1286 pp->fudgetime1 = in->fudgetime1;
1287 if (in->haveflags & CLK_HAVETIME2)
1288 pp->fudgetime2 = in->fudgetime2;
1289 if (in->haveflags & CLK_HAVEVAL1)
1290 peer->stratum = pp->stratum = (u_char)in->fudgeval1;
1291 if (in->haveflags & CLK_HAVEVAL2)
1292 peer->refid = pp->refid = in->fudgeval2;
1293 if (in->haveflags & CLK_HAVEFLAG1) {
1294 pp->sloppyclockflag &= ~CLK_FLAG1;
1295 pp->sloppyclockflag |= in->flags & CLK_FLAG1;
1296 }
1297 if (in->haveflags & CLK_HAVEFLAG2) {
1298 pp->sloppyclockflag &= ~CLK_FLAG2;
1299 pp->sloppyclockflag |= in->flags & CLK_FLAG2;
1300 }
1301 if (in->haveflags & CLK_HAVEFLAG3) {
1302 pp->sloppyclockflag &= ~CLK_FLAG3;
1303 pp->sloppyclockflag |= in->flags & CLK_FLAG3;
1304 }
1305 if (in->haveflags & CLK_HAVEFLAG4) {
1306 pp->sloppyclockflag &= ~CLK_FLAG4;
1307 pp->sloppyclockflag |= in->flags & CLK_FLAG4;
1308 }
1309 if (in->haveflags & CLK_HAVEMINJIT)
1310 pp->fudgeminjitter = in->fudgeminjitter;
1311 }
1312
1313 /*
1314 * Readback requested data
1315 */
1316 if (out != NULL) {
1317 out->fudgeval1 = pp->stratum;
1318 out->fudgeval2 = pp->refid;
1319 out->haveflags = CLK_HAVEVAL1 | CLK_HAVEVAL2;
1320 out->fudgetime1 = pp->fudgetime1;
1321 if (0.0 != out->fudgetime1)
1322 out->haveflags |= CLK_HAVETIME1;
1323 out->fudgetime2 = pp->fudgetime2;
1324 if (0.0 != out->fudgetime2)
1325 out->haveflags |= CLK_HAVETIME2;
1326 out->flags = (u_char) pp->sloppyclockflag;
1327 if (CLK_FLAG1 & out->flags)
1328 out->haveflags |= CLK_HAVEFLAG1;
1329 if (CLK_FLAG2 & out->flags)
1330 out->haveflags |= CLK_HAVEFLAG2;
1331 if (CLK_FLAG3 & out->flags)
1332 out->haveflags |= CLK_HAVEFLAG3;
1333 if (CLK_FLAG4 & out->flags)
1334 out->haveflags |= CLK_HAVEFLAG4;
1335 out->fudgeminjitter = pp->fudgeminjitter;
1336 if (0.0 != out->fudgeminjitter)
1337 out->haveflags |= CLK_HAVEMINJIT;
1338
1339 out->timereset = current_time - pp->timestarted;
1340 out->polls = pp->polls;
1341 out->noresponse = pp->noreply;
1342 out->badformat = pp->badformat;
1343 out->baddata = pp->baddata;
1344
1345 out->lastevent = pp->lastevent;
1346 out->currentstatus = pp->currentstatus;
1347 out->type = pp->type;
1348 out->clockdesc = pp->clockdesc;
1349 out->lencode = (u_short)pp->lencode;
1350 out->p_lastcode = pp->a_lastcode;
1351 }
1352
1353 /*
1354 * Give the stuff to the clock
1355 */
1356 if (refclock_conf[clktype]->clock_control != noentry)
1357 (refclock_conf[clktype]->clock_control)(unit, in, out, peer);
1358 }
1359
1360
1361 /*
1362 * refclock_buginfo - return debugging info
1363 *
1364 * This routine is used mainly for debugging. It returns designated
1365 * values from the interface structure that can be displayed using
1366 * ntpdc and the clkbug command.
1367 */
1368 void
refclock_buginfo(sockaddr_u * srcadr,struct refclockbug * bug)1369 refclock_buginfo(
1370 sockaddr_u *srcadr, /* clock address */
1371 struct refclockbug *bug /* output structure */
1372 )
1373 {
1374 struct peer *peer;
1375 struct refclockproc *pp;
1376 int clktype;
1377 int unit;
1378 unsigned u;
1379
1380 /*
1381 * Check for valid address and peer structure
1382 */
1383 if (!ISREFCLOCKADR(srcadr))
1384 return;
1385
1386 clktype = (u_char) REFCLOCKTYPE(srcadr);
1387 unit = REFCLOCKUNIT(srcadr);
1388
1389 peer = findexistingpeer(srcadr, NULL, NULL, -1, 0, NULL);
1390
1391 if (NULL == peer || NULL == peer->procptr)
1392 return;
1393
1394 pp = peer->procptr;
1395
1396 /*
1397 * Copy structure values
1398 */
1399 bug->nvalues = 8;
1400 bug->svalues = 0x0000003f;
1401 bug->values[0] = pp->year;
1402 bug->values[1] = pp->day;
1403 bug->values[2] = pp->hour;
1404 bug->values[3] = pp->minute;
1405 bug->values[4] = pp->second;
1406 bug->values[5] = pp->nsec;
1407 bug->values[6] = pp->yearstart;
1408 bug->values[7] = pp->coderecv;
1409 bug->stimes = 0xfffffffc;
1410 bug->times[0] = pp->lastref;
1411 bug->times[1] = pp->lastrec;
1412 for (u = 2; u < bug->ntimes; u++)
1413 DTOLFP(pp->filter[u - 2], &bug->times[u]);
1414
1415 /*
1416 * Give the stuff to the clock
1417 */
1418 if (refclock_conf[clktype]->clock_buginfo != noentry)
1419 (refclock_conf[clktype]->clock_buginfo)(unit, bug, peer);
1420 }
1421
1422
1423 #ifdef HAVE_PPSAPI
1424 /*
1425 * refclock_ppsapi - initialize/update ppsapi
1426 *
1427 * This routine is called after the fudge command to open the PPSAPI
1428 * interface for later parameter setting after the fudge command.
1429 */
1430 int
refclock_ppsapi(int fddev,struct refclock_atom * ap)1431 refclock_ppsapi(
1432 int fddev, /* fd device */
1433 struct refclock_atom *ap /* atom structure pointer */
1434 )
1435 {
1436 if (ap->handle == 0) {
1437 if (time_pps_create(fddev, &ap->handle) < 0) {
1438 msyslog(LOG_ERR,
1439 "refclock_ppsapi: time_pps_create: %m");
1440 return (0);
1441 }
1442 ZERO(ap->ts); /* [Bug 2689] defined INIT state */
1443 }
1444 return (1);
1445 }
1446
1447
1448 /*
1449 * refclock_params - set ppsapi parameters
1450 *
1451 * This routine is called to set the PPSAPI parameters after the fudge
1452 * command.
1453 */
1454 int
refclock_params(int mode,struct refclock_atom * ap)1455 refclock_params(
1456 int mode, /* mode bits */
1457 struct refclock_atom *ap /* atom structure pointer */
1458 )
1459 {
1460 ZERO(ap->pps_params);
1461 ap->pps_params.api_version = PPS_API_VERS_1;
1462
1463 /*
1464 * Solaris serial ports provide PPS pulse capture only on the
1465 * assert edge. FreeBSD serial ports provide capture on the
1466 * clear edge, while FreeBSD parallel ports provide capture
1467 * on the assert edge. Your mileage may vary.
1468 */
1469 if (mode & CLK_FLAG2)
1470 ap->pps_params.mode = PPS_TSFMT_TSPEC | PPS_CAPTURECLEAR;
1471 else
1472 ap->pps_params.mode = PPS_TSFMT_TSPEC | PPS_CAPTUREASSERT;
1473 if (time_pps_setparams(ap->handle, &ap->pps_params) < 0) {
1474 msyslog(LOG_ERR,
1475 "refclock_params: time_pps_setparams: %m");
1476 return (0);
1477 }
1478
1479 /*
1480 * If flag3 is lit, select the kernel PPS if we can.
1481 *
1482 * Note: EOPNOTSUPP is the only 'legal' error code we deal with;
1483 * it is part of the 'if we can' strategy. Any other error
1484 * indicates something more sinister and makes this function fail.
1485 */
1486 if (mode & CLK_FLAG3) {
1487 if (time_pps_kcbind(ap->handle, PPS_KC_HARDPPS,
1488 ap->pps_params.mode & ~PPS_TSFMT_TSPEC,
1489 PPS_TSFMT_TSPEC) < 0)
1490 {
1491 if (errno != EOPNOTSUPP) {
1492 msyslog(LOG_ERR,
1493 "refclock_params: time_pps_kcbind: %m");
1494 return (0);
1495 }
1496 } else {
1497 hardpps_enable = 1;
1498 }
1499 }
1500 return (1);
1501 }
1502
1503
1504 /*
1505 * refclock_pps - called once per second
1506 *
1507 * This routine is called once per second. It snatches the PPS
1508 * timestamp from the kernel and saves the sign-extended fraction in
1509 * a circular buffer for processing at the next poll event.
1510 */
1511 int
refclock_pps(struct peer * peer,struct refclock_atom * ap,int mode)1512 refclock_pps(
1513 struct peer *peer, /* peer structure pointer */
1514 struct refclock_atom *ap, /* atom structure pointer */
1515 int mode /* mode bits */
1516 )
1517 {
1518 struct refclockproc *pp;
1519 pps_info_t pps_info;
1520 struct timespec timeout;
1521 double dtemp, dcorr, trash;
1522
1523 /*
1524 * We require the clock to be synchronized before setting the
1525 * parameters. When the parameters have been set, fetch the
1526 * most recent PPS timestamp.
1527 */
1528 pp = peer->procptr;
1529 if (ap->handle == 0)
1530 return (0);
1531
1532 if (ap->pps_params.mode == 0 && sys_leap != LEAP_NOTINSYNC) {
1533 if (refclock_params(pp->sloppyclockflag, ap) < 1)
1534 return (0);
1535 }
1536 ZERO(timeout);
1537 ZERO(pps_info);
1538 if (time_pps_fetch(ap->handle, PPS_TSFMT_TSPEC, &pps_info,
1539 &timeout) < 0) {
1540 refclock_report(peer, CEVNT_FAULT);
1541 return (0);
1542 }
1543 timeout = ap->ts; /* save old timestamp for check */
1544 if (ap->pps_params.mode & PPS_CAPTUREASSERT)
1545 ap->ts = pps_info.assert_timestamp;
1546 else if (ap->pps_params.mode & PPS_CAPTURECLEAR)
1547 ap->ts = pps_info.clear_timestamp;
1548 else
1549 return (0);
1550
1551 /* [Bug 2689] Discard the first sample we read -- if the PPS
1552 * source is currently down / disconnected, we have read a
1553 * potentially *very* stale value here. So if our old TS value
1554 * is all-zero, we consider this sample unrealiable and drop it.
1555 *
1556 * Note 1: a better check would compare the PPS time stamp to
1557 * the current system time and drop it if it's more than say 3s
1558 * away.
1559 *
1560 * Note 2: If we ever again get an all-zero PPS sample, the next
1561 * one will be discarded. This can happen every 136yrs and is
1562 * unlikely to be ever observed.
1563 */
1564 if (0 == (timeout.tv_sec | timeout.tv_nsec))
1565 return (0);
1566
1567 /* If the PPS source fails to deliver a new sample between
1568 * polls, it regurgitates the last sample. We do not want to
1569 * process the same sample multiple times.
1570 */
1571 if (0 == memcmp(&timeout, &ap->ts, sizeof(timeout)))
1572 return (0);
1573
1574 /*
1575 * Convert to signed fraction offset, apply fudge and properly
1576 * fold the correction into the [-0.5s,0.5s] range. Handle
1577 * excessive fudge times, too.
1578 */
1579 dtemp = ap->ts.tv_nsec / 1e9;
1580 dcorr = modf((pp->fudgetime1 - dtemp), &trash);
1581 if (dcorr > 0.5)
1582 dcorr -= 1.0;
1583 else if (dcorr < -0.5)
1584 dcorr += 1.0;
1585
1586 /* phase gate check: avoid wobbling by +/-1s when too close to
1587 * the switch-over point. We allow +/-400ms max phase deviation.
1588 * The trade-off is clear: The smaller the limit, the less
1589 * sensitive to sampling noise the clock becomes. OTOH the
1590 * system must get into phase gate range by other means for the
1591 * PPS clock to lock in.
1592 */
1593 if (fabs(dcorr) > 0.4)
1594 return (0);
1595
1596 /*
1597 * record this time stamp and stuff in median filter
1598 */
1599 pp->lastrec.l_ui = (u_int32)ap->ts.tv_sec + JAN_1970;
1600 pp->lastrec.l_uf = (u_int32)(dtemp * FRAC);
1601 clk_add_sample(pp, dcorr);
1602 refclock_checkburst(peer, pp);
1603
1604 #ifdef DEBUG
1605 if (debug > 1)
1606 printf("refclock_pps: %lu %f %f\n", current_time,
1607 dcorr, pp->fudgetime1);
1608 #endif
1609 return (1);
1610 }
1611 #endif /* HAVE_PPSAPI */
1612
1613
1614 /*
1615 * -------------------------------------------------------------------
1616 * refclock_ppsaugment(...) -- correlate with PPS edge
1617 *
1618 * This function is used to correlate a receive time stamp with a PPS
1619 * edge time stamp. It applies the necessary fudges and then tries to
1620 * move the receive time stamp to the corresponding edge. This can warp
1621 * into future, if a transmission delay of more than 500ms is not
1622 * compensated with a corresponding fudge time2 value, because then the
1623 * next PPS edge is nearer than the last. (Similiar to what the PPS ATOM
1624 * driver does, but we deal with full time stamps here, not just phase
1625 * shift information.) Likewise, a negative fudge time2 value must be
1626 * used if the reference time stamp correlates with the *following* PPS
1627 * pulse.
1628 *
1629 * Note that the receive time fudge value only needs to move the receive
1630 * stamp near a PPS edge but that close proximity is not required;
1631 * +/-100ms precision should be enough. But since the fudge value will
1632 * probably also be used to compensate the transmission delay when no
1633 * PPS edge can be related to the time stamp, it's best to get it as
1634 * close as possible.
1635 *
1636 * It should also be noted that the typical use case is matching to the
1637 * preceeding edge, as most units relate their sentences to the current
1638 * second.
1639 *
1640 * The function returns FALSE if there is no correlation possible, TRUE
1641 * otherwise. Reason for failures are:
1642 *
1643 * - no PPS/ATOM unit given
1644 * - PPS stamp is stale (that is, the difference between the PPS stamp
1645 * and the corrected time stamp would exceed two seconds)
1646 * - The phase difference is too close to 0.5, and the decision wether
1647 * to move up or down is too sensitive to noise.
1648 *
1649 * On output, the receive time stamp is updated with the 'fixed' receive
1650 * time.
1651 * -------------------------------------------------------------------
1652 */
1653
1654 int/*BOOL*/
refclock_ppsaugment(const struct refclock_atom * ap,l_fp * rcvtime,double rcvfudge,double ppsfudge)1655 refclock_ppsaugment(
1656 const struct refclock_atom * ap , /* for PPS io */
1657 l_fp * rcvtime ,
1658 double rcvfudge, /* i/o read fudge */
1659 double ppsfudge /* pps fudge */
1660 )
1661 {
1662 l_fp delta[1];
1663
1664 #ifdef HAVE_PPSAPI
1665
1666 pps_info_t pps_info;
1667 struct timespec timeout;
1668 l_fp stamp[1];
1669 uint32_t phase;
1670
1671 static const uint32_t s_plim_hi = UINT32_C(1932735284);
1672 static const uint32_t s_plim_lo = UINT32_C(2362232013);
1673
1674 /* fixup receive time in case we have to bail out early */
1675 DTOLFP(rcvfudge, delta);
1676 L_SUB(rcvtime, delta);
1677
1678 if (NULL == ap)
1679 return FALSE;
1680
1681 ZERO(timeout);
1682 ZERO(pps_info);
1683
1684 /* fetch PPS stamp from ATOM block */
1685 if (time_pps_fetch(ap->handle, PPS_TSFMT_TSPEC,
1686 &pps_info, &timeout) < 0)
1687 return FALSE; /* can't get time stamps */
1688
1689 /* get last active PPS edge before receive */
1690 if (ap->pps_params.mode & PPS_CAPTUREASSERT)
1691 timeout = pps_info.assert_timestamp;
1692 else if (ap->pps_params.mode & PPS_CAPTURECLEAR)
1693 timeout = pps_info.clear_timestamp;
1694 else
1695 return FALSE; /* WHICH edge, please?!? */
1696
1697 /* convert PPS stamp to l_fp and apply fudge */
1698 *stamp = tspec_stamp_to_lfp(timeout);
1699 DTOLFP(ppsfudge, delta);
1700 L_SUB(stamp, delta);
1701
1702 /* Get difference between PPS stamp (--> yield) and receive time
1703 * (--> base)
1704 */
1705 *delta = *stamp;
1706 L_SUB(delta, rcvtime);
1707
1708 /* check if either the PPS or the STAMP is stale in relation
1709 * to each other. Bail if it is so...
1710 */
1711 phase = delta->l_ui;
1712 if (phase >= 2 && phase < (uint32_t)-2)
1713 return FALSE; /* PPS is stale, don't use it */
1714
1715 /* If the phase is too close to 0.5, the decision whether to
1716 * move up or down is becoming noise sensitive. That is, we
1717 * might amplify usec noise between samples into seconds with a
1718 * simple threshold. This can be solved by a Schmitt Trigger
1719 * characteristic, but that would also require additional state
1720 * where we could remember previous decisions. Easier to play
1721 * dead duck and wait for the conditions to become clear.
1722 */
1723 phase = delta->l_uf;
1724 if (phase > s_plim_hi && phase < s_plim_lo)
1725 return FALSE; /* we're in the noise lock gap */
1726
1727 /* sign-extend fraction into seconds */
1728 delta->l_ui = UINT32_C(0) - ((phase >> 31) & 1);
1729 /* add it up now */
1730 L_ADD(rcvtime, delta);
1731 return TRUE;
1732
1733 # else /* have no PPS support at all */
1734
1735 /* just fixup receive time and fail */
1736 UNUSED_ARG(ap);
1737 UNUSED_ARG(ppsfudge);
1738
1739 DTOLFP(rcvfudge, delta);
1740 L_SUB(rcvtime, delta);
1741 return FALSE;
1742
1743 # endif
1744 }
1745
1746 /*
1747 * -------------------------------------------------------------------
1748 * check if it makes sense to schedule an 'early' poll to get the clock
1749 * up fast after start or longer signal dropout.
1750 */
1751 static void
refclock_checkburst(struct peer * peer,struct refclockproc * pp)1752 refclock_checkburst(
1753 struct peer * peer,
1754 struct refclockproc * pp
1755 )
1756 {
1757 uint32_t limit; /* when we should poll */
1758 u_int needs; /* needed number of samples */
1759
1760 /* Paranoia: stop here if peer and clockproc don't match up.
1761 * And when a poll is actually pending, we don't have to do
1762 * anything, either. Likewise if the reach mask is full, of
1763 * course, and if the filter has stabilized.
1764 */
1765 if (pp->inpoll || (peer->procptr != pp) ||
1766 ((peer->reach == 0xFF) && (peer->disp <= MAXDISTANCE)))
1767 return;
1768
1769 /* If the next poll is soon enough, bail out, too: */
1770 limit = current_time + 1;
1771 if (peer->nextdate <= limit)
1772 return;
1773
1774 /* Derive the number of samples needed from the popcount of the
1775 * reach mask. With less samples available, we break away.
1776 */
1777 needs = peer->reach;
1778 needs -= (needs >> 1) & 0x55;
1779 needs = (needs & 0x33) + ((needs >> 2) & 0x33);
1780 needs = (needs + (needs >> 4)) & 0x0F;
1781 if (needs > 6)
1782 needs = 6;
1783 else if (needs < 3)
1784 needs = 3;
1785 if (clk_cnt_sample(pp) < needs)
1786 return;
1787
1788 /* Get serious. Reduce the poll to minimum and schedule early.
1789 * (Changing the peer poll is probably in vain, as it will be
1790 * re-adjusted, but maybe some time the hint will work...)
1791 */
1792 peer->hpoll = peer->minpoll;
1793 peer->nextdate = limit;
1794 }
1795
1796 /*
1797 * -------------------------------------------------------------------
1798 * Save the last timecode string, making sure it's properly truncated
1799 * if necessary and NUL terminated in any case.
1800 */
1801 void
refclock_save_lcode(struct refclockproc * pp,char const * tc,size_t len)1802 refclock_save_lcode(
1803 struct refclockproc * pp,
1804 char const * tc,
1805 size_t len
1806 )
1807 {
1808 if (len == (size_t)-1)
1809 len = strnlen(tc, sizeof(pp->a_lastcode) - 1);
1810 else if (len >= sizeof(pp->a_lastcode))
1811 len = sizeof(pp->a_lastcode) - 1;
1812
1813 pp->lencode = (u_short)len;
1814 memcpy(pp->a_lastcode, tc, len);
1815 pp->a_lastcode[len] = '\0';
1816 }
1817
1818 /* format data into a_lastcode */
1819 void
refclock_vformat_lcode(struct refclockproc * pp,char const * fmt,va_list va)1820 refclock_vformat_lcode(
1821 struct refclockproc * pp,
1822 char const * fmt,
1823 va_list va
1824 )
1825 {
1826 long len;
1827
1828 len = vsnprintf(pp->a_lastcode, sizeof(pp->a_lastcode), fmt, va);
1829 if (len <= 0)
1830 len = 0;
1831 else if (len >= sizeof(pp->a_lastcode))
1832 len = sizeof(pp->a_lastcode) - 1;
1833
1834 pp->lencode = (u_short)len;
1835 pp->a_lastcode[len] = '\0';
1836 /* !note! the NUL byte is needed in case vsnprintf() really fails */
1837 }
1838
1839 void
refclock_format_lcode(struct refclockproc * pp,char const * fmt,...)1840 refclock_format_lcode(
1841 struct refclockproc * pp,
1842 char const * fmt,
1843 ...
1844 )
1845 {
1846 va_list va;
1847
1848 va_start(va, fmt);
1849 refclock_vformat_lcode(pp, fmt, va);
1850 va_end(va);
1851 }
1852
1853 static const int baudTable[][2] = {
1854 {B0, 0},
1855 {B50, 50},
1856 {B75, 75},
1857 {B110, 110},
1858 {B134, 134},
1859 {B150, 150},
1860 {B200, 200},
1861 {B300, 300},
1862 {B600, 600},
1863 {B1200, 1200},
1864 {B1800, 1800},
1865 {B2400, 2400},
1866 {B4800, 4800},
1867 {B9600, 9600},
1868 {B19200, 19200},
1869 {B38400, 38400},
1870 # ifdef B57600
1871 {B57600, 57600 },
1872 # endif
1873 # ifdef B115200
1874 {B115200, 115200},
1875 # endif
1876 {-1, -1}
1877 };
1878
1879
symBaud2numBaud(int symBaud)1880 static int symBaud2numBaud(int symBaud)
1881 {
1882 int i;
1883 for (i = 0; baudTable[i][1] >= 0; ++i)
1884 if (baudTable[i][0] == symBaud)
1885 break;
1886 return baudTable[i][1];
1887 }
numBaud2symBaud(int numBaud)1888 static int numBaud2symBaud(int numBaud)
1889 {
1890 int i;
1891 for (i = 0; baudTable[i][1] >= 0; ++i)
1892 if (baudTable[i][1] == numBaud)
1893 break;
1894 return baudTable[i][0];
1895 }
1896 #endif /* REFCLOCK */
1897