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