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