1 /* 2 * refclock_acts - clock driver for the NIST/PTB Automated Computer Time 3 * Service aka Amalgamated Containerized Trash Service (ACTS) 4 */ 5 6 #ifdef HAVE_CONFIG_H 7 #include <config.h> 8 #endif 9 10 #if defined(REFCLOCK) && (defined(CLOCK_ACTS) || defined(CLOCK_PTBACTS)) 11 12 #include "ntpd.h" 13 #include "ntp_io.h" 14 #include "ntp_unixtime.h" 15 #include "ntp_refclock.h" 16 #include "ntp_stdlib.h" 17 #include "ntp_control.h" 18 19 #include <stdio.h> 20 #include <ctype.h> 21 #ifdef HAVE_SYS_IOCTL_H 22 # include <sys/ioctl.h> 23 #endif /* HAVE_SYS_IOCTL_H */ 24 25 /* MUST BE AFTER LAST #include <config.h> !!! */ 26 27 #if defined(CLOCK_ACTS) && defined(CLOCK_PTBACTS) 28 # if defined(KEEPPTBACTS) 29 # undef CLOCK_ACTS 30 # else /* not KEEPPTBACTS */ 31 # undef CLOCK_PTBACTS 32 # endif /* not KEEPPTBACTS */ 33 #endif /* CLOCK_ACTS && CLOCK_PTBACTS */ 34 35 /* 36 * This driver supports the NIST Automated Computer Time Service (ACTS). 37 * It periodically dials a prespecified telephone number, receives the 38 * NIST timecode data and calculates the local clock correction. It is 39 * designed primarily for use as a backup when neither a radio clock nor 40 * connectivity to Internet time servers is available. For the best 41 * accuracy, the individual telephone line/modem delay needs to be 42 * calibrated using outside sources. 43 * 44 * The ACTS is located at NIST Boulder, CO, telephone 303 494 4774. A 45 * toll call from a residence telephone in Newark, DE, costs between 14 46 * and 27 cents, depending on time of day, and from a campus telephone 47 * between 3 and 4 cents, although it is not clear what carrier and time 48 * of day discounts apply in this case. The modem dial string will 49 * differ depending on local telephone configuration, etc., and is 50 * specified by the phone command in the configuration file. The 51 * argument to this command is an AT command for a Hayes compatible 52 * modem. 53 * 54 * The accuracy produced by this driver should be in the range of a 55 * millisecond or two, but may need correction due to the delay 56 * characteristics of the individual modem involved. For undetermined 57 * reasons, some modems work with the ACTS echo-delay measurement scheme 58 * and some don't. This driver tries to do the best it can with what it 59 * gets. Initial experiments with a Practical Peripherals 9600SA modem 60 * here in Delaware suggest an accuracy of a millisecond or two can be 61 * achieved without the scheme by using a fudge time1 value of 65.0 ms. 62 * In either case, the dispersion for a single call involving ten 63 * samples is about 1.3 ms. 64 * 65 * The driver can operate in either of three modes, as determined by 66 * the mode parameter in the server configuration command. In mode 0 67 * (automatic) the driver operates continuously at intervals depending 68 * on the prediction error, as measured by the driver, usually in the 69 * order of several hours. In mode 1 (backup) the driver is enabled in 70 * automatic mode only when no other source of synchronization is 71 * available and when more than MAXOUTAGE (3600 s) have elapsed since 72 * last synchronized by other sources. In mode 2 (manual) the driver 73 * operates only when enabled using a fudge flags switch, as described 74 * below. 75 * 76 * For reliable call management, this driver requires a 1200-bps modem 77 * with a Hayes-compatible command set and control over the modem data 78 * terminal ready (DTR) control line. Present restrictions require the 79 * use of a POSIX-compatible programming interface, although other 80 * interfaces may work as well. The modem setup string is hard-coded in 81 * the driver and may require changes for nonstandard modems or special 82 * circumstances. 83 * 84 * Further information can be found in the README.refclock file in the 85 * ntp - Version 3 distribution. 86 * 87 * Fudge Factors 88 * 89 * Ordinarily, the propagation time correction is computed automatically 90 * by ACTS and the driver. When this is not possible or erratic due to 91 * individual modem characteristics, the fudge flag2 switch should be 92 * set to disable the ACTS echo-delay scheme. In any case, the fudge 93 * time1 parameter can be used to adjust the propagation delay as 94 * required. 95 * 96 * The ACTS call interval is determined in one of three ways. In manual 97 * mode a call is initiated by setting fudge flag1 using ntpdc, either 98 * manually or via a cron job. In AUTO mode this flag is set by the peer 99 * timer, which is controlled by the sys_poll variable in response to 100 * measured errors. In backup mode the driver is ordinarily asleep, but 101 * awakes (in auto mode) if all other synchronization sources are lost. 102 * In either auto or backup modes, the call interval increases as long 103 * as the measured errors do not exceed the value of the fudge time2 104 * parameter. 105 * 106 * When the fudge flag1 is set, the ACTS calling program is activated. 107 * This program dials each number listed in the phones command of the 108 * configuration file in turn. If a call attempt fails, the next number 109 * in the list is dialed. The fudge flag1 and counter are reset and the 110 * calling program terminated if (a) a valid clock update has been 111 * determined, (b) no more numbers remain in the list, (c) a device 112 * fault or timeout occurs or (d) fudge flag1 is reset manually using 113 * ntpdc. 114 * 115 * In automatic and backup modes, the driver determines the call 116 * interval using a procedure depending on the measured prediction 117 * error and the fudge time2 parameter. If the error exceeds time2 for a 118 * number of times depending on the current interval, the interval is 119 * decreased, but not less than about 1000 s. If the error is less than 120 * time2 for some number of times, the interval is increased, but not 121 * more than about 18 h. With the default value of zero for fudge time2, 122 * the interval will increase from 1000 s to the 4000-8000-s range, in 123 * which the expected accuracy should be in the 1-2-ms range. Setting 124 * fudge time2 to a large value, like 0.1 s, may result in errors of 125 * that order, but increase the call interval to the maximum. The exact 126 * value for each configuration will depend on the modem and operating 127 * system involved, so some experimentation may be necessary. 128 */ 129 130 /* 131 * DESCRIPTION OF THE AUTOMATED COMPUTER TELEPHONE SERVICE (ACTS) 132 * (reformatted from ACTS on-line computer help information) 133 * 134 * The following is transmitted (at 1200 baud) following completion of 135 * the telephone connection. 136 * 137 * National Institute of Standards and Technology 138 * Telephone Time Service, Generator 3B 139 * Enter question mark "?" for HELP 140 * D L D 141 * MJD YR MO DA H M S ST S UT1 msADV <OTM> 142 * 47999 90-04-18 21:39:15 50 0 +.1 045.0 UTC(NIST) * 143 * 47999 90-04-18 21:39:16 50 0 +.1 045.0 UTC(NIST) * 144 * 47999 90-04-18 21:39:17 50 0 +.1 045.0 UTC(NIST) * 145 * 47999 90-04-18 21:39:18 50 0 +.1 045.0 UTC(NIST) * 146 * 47999 90-04-18 21:39:19 50 0 +.1 037.6 UTC(NIST) # 147 * 47999 90-04-18 21:39:20 50 0 +.1 037.6 UTC(NIST) # 148 * etc..etc...etc....... 149 * 150 * UTC = Universal Time Coordinated, the official world time referred to 151 * the zero meridian. 152 * 153 * DST Daylight savings time characters, valid for the continental 154 * U.S., are set as follows: 155 * 156 * 00 We are on standard time (ST). 157 * 01-49 Now on DST, go to ST when your local time is 2:00 am and 158 * the count is 01. The count is decremented daily at 00 159 * (UTC). 160 * 50 We are on DST. 161 * 51-99 Now on ST, go to DST when your local time is 2:00 am and 162 * the count is 51. The count is decremented daily at 00 163 * (UTC). 164 * 165 * The two DST characters provide up to 48 days advance notice of a 166 * change in time. The count remains at 00 or 50 at other times. 167 * 168 * LS Leap second flag is set to "1" to indicate that a leap second is 169 * to be added as 23:59:60 (UTC) on the last day of the current UTC 170 * month. The LS flag will be reset to "0" starting with 23:59:60 171 * (UTC). The flag will remain on for the entire month before the 172 * second is added. Leap seconds are added as needed at the end of 173 * any month. Usually June and/or December are chosen. 174 * 175 * The leap second flag will be set to a "2" to indicate that a 176 * leap second is to be deleted at 23:59:58--00:00:00 on the last 177 * day of the current month. (This latter provision is included per 178 * international recommendation, however it is not likely to be 179 * required in the near future.) 180 * 181 * DUT1 Approximate difference between earth rotation time (UT1) and 182 * UTC, in steps of 0.1 second: DUT1 = UT1 - UTC. 183 * 184 * MJD Modified Julian Date, often used to tag certain scientific data. 185 * 186 * The full time format is sent at 1200 baud, 8 bit, 1 stop, no parity. 187 * The format at 300 Baud is also 8 bit, 1 stop, no parity. At 300 Baud 188 * the MJD and DUT1 values are deleted and the time is transmitted only 189 * on even seconds. 190 * 191 * Maximum on line time will be 56 seconds. If all lines are busy at any 192 * time, the oldest call will be terminated if it has been on line more 193 * than 28 seconds, otherwise, the call that first reaches 28 seconds 194 * will be terminated. 195 * 196 * Current time is valid at the "on-time" marker (OTM), either "*" or 197 * "#". The nominal on-time marker (*) will be transmitted 45 ms early 198 * to account for the 8 ms required to send 1 character at 1200 Baud, 199 * plus an additional 7 ms for delay from NIST to the user, and 200 * approximately 30 ms "scrambler" delay inherent in 1200 Baud modems. 201 * If the caller echoes all characters, NIST will measure the round trip 202 * delay and advance the on-time marker so that the midpoint of the stop 203 * bit arrives at the user on time. The amount of msADV will reflect the 204 * actual required advance in milliseconds and the OTM will be a "#". 205 * 206 * (The NIST system requires 4 or 5 consecutive delay measurements which 207 * are consistent before switching from "*" to "#". If the user has a 208 * 1200 Baud modem with the same internal delay as that used by NIST, 209 * then the "#" OTM should arrive at the user within +-2 ms of the 210 * correct time. 211 * 212 * However, NIST has studied different brands of 1200 Baud modems and 213 * found internal delays from 24 ms to 40 ms and offsets of the "#" OTM 214 * of +-10 ms. For many computer users, +-10 ms accuracy should be more 215 * than adequate since many computer internal clocks can only be set 216 * with granularity of 20 to 50 ms. In any case, the repeatability of 217 * the offset for the "#" OTM should be within +-2 ms, if the dial-up 218 * path is reciprocal and the user doesn't change the brand or model of 219 * modem used. 220 * 221 * This should be true even if the dial-up path on one day is a land- 222 * line of less than 40 ms (one way) and on the next day is a satellite 223 * link of 260 to 300 ms. In the rare event that the path is one way by 224 * satellite and the other way by land line with a round trip 225 * measurement in the range of 90 to 260 ms, the OTM will remain a "*" 226 * indicating 45 ms advance. 227 * 228 * For user comments write: 229 * NIST-ACTS 230 * Time and Frequency Division 231 * Mail Stop 847 232 * 325 Broadway 233 * Boulder, CO 80303 234 * 235 * Software for setting (PC)DOS compatable machines is available on a 236 * 360-kbyte diskette for $35.00 from: NIST Office of Standard Reference 237 * Materials B311-Chemistry Bldg, NIST, Gaithersburg, MD, 20899, (301) 238 * 975-6776 239 * 240 * PTB timecode service (+49 531 512038) 241 * The Physikalisch-Technische Bundesanstalt (Germany) 242 * also supports a modem time service 243 * as the data formats are very similar this driver can also be compiled for 244 * utilizing the PTB time code service. 245 * 246 * Data format 247 * 0000000000111111111122222222223333333333444444444455555555556666666666777777777 7 248 * 0123456789012345678901234567890123456789012345678901234567890123456789012345678 9 249 * 1995-01-23 20:58:51 MEZ 10402303260219950123195849740+40000500 * 250 * A B C D EF G H IJ K L M N O P Q R S T U V W XY Z<CR><LF> 251 * 252 * A year 253 * B month 254 * C day 255 * D hour 256 * E : normally 257 * A for DST to ST switch first hour 258 * B for DST to ST switch second hour if not marked in H 259 * F minute 260 * G second 261 * H timezone 262 * I day of week 263 * J week of year 264 * K day of year 265 * L month for next ST/DST changes 266 * M day 267 * N hour 268 * O UTC year 269 * P UTC month 270 * Q UTC day 271 * R UTC hour 272 * S UTC minute 273 * T modified julian day (MJD) 274 * U DUT1 275 * V direction and month if leap second 276 * W signal delay (assumed/measured) 277 * X sequence number for additional text line in Y 278 * Y additional text 279 * Z on time marker (* - assumed delay / # measured delay) 280 * <CR>!<LF> ! is second change ! 281 * 282 * This format is also used by the National Physical Laboratory (NPL)'s 283 * TRUETIME service in the UK. In this case the timezone field is 284 * UTC+0 or UTC+1 for standard and daylight saving time. The phone 285 * number for this service (a premium rate number) is 0891 516 333. 286 * It is not clear whether the echo check is implemented. 287 * 288 * For more detail, see http://www.npl.co.uk/npl/cetm/taf/truetime.html. 289 */ 290 291 /* 292 * Interface definitions 293 */ 294 #define SPEED232 B1200 /* uart speed (1200 cowardly baud) */ 295 #define PRECISION (-10) /* precision assumed (about 1 ms) */ 296 #ifdef CLOCK_ACTS 297 # define REFID "ACTS" /* reference ID */ 298 # define DESCRIPTION "NIST Automated Computer Time Service" /* WRU */ 299 # define LENCODE 50 /* length of valid timecode string */ 300 # define DEVICE "/dev/acts%d" /* device name and unit */ 301 # define REF_ENTRY refclock_acts 302 #else /* not CLOCK_ACTS */ 303 # define REFID "TPTB" /* reference ID */ 304 # define DESCRIPTION "PTB Automated Computer Time Service" 305 # define LENCODE 78 /* length of valid timecode string */ 306 # define DEVICE "/dev/ptb%d" /* device name and unit */ 307 # define REF_ENTRY refclock_ptb 308 #endif /* not CLOCK_ACTS */ 309 #define MODE_AUTO 0 /* automatic mode */ 310 #define MODE_BACKUP 1 /* backup mode */ 311 #define MODE_MANUAL 2 /* manual mode */ 312 313 #define MSGCNT 10 /* we need this many ACTS messages */ 314 #define SMAX 80 /* max token string length */ 315 #define ACTS_MINPOLL 10 /* log2 min poll interval (1024 s) */ 316 #define ACTS_MAXPOLL 18 /* log2 max poll interval (16384 s) */ 317 #define MAXOUTAGE 3600 /* max before ACTS kicks in (s) */ 318 319 /* 320 * Modem control strings. These may have to be changed for some modems. 321 * 322 * AT command prefix 323 * B1 initiate call negotiation using Bell 212A 324 * &C1 enable carrier detect 325 * &D2 hang up and return to command mode on DTR transition 326 * E0 modem command echo disabled 327 * l1 set modem speaker volume to low level 328 * M1 speaker enabled untill carrier detect 329 * Q0 return result codes 330 * V1 return result codes as English words 331 */ 332 #define MODEM_SETUP "ATB1&C1&D2E0L1M1Q0V1" /* modem setup */ 333 #define MODEM_HANGUP "ATH" /* modem disconnect */ 334 335 /* 336 * Timeouts 337 */ 338 #define IDLE 60 /* idle timeout (s) */ 339 #define WAIT 2 /* wait timeout (s) */ 340 #define ANSWER 30 /* answer timeout (s) */ 341 #define CONNECT 10 /* connect timeout (s) */ 342 #define TIMECODE 15 /* timecode timeout (s) */ 343 344 /* 345 * Tables to compute the ddd of year form icky dd/mm timecode. Viva la 346 * leap. 347 */ 348 static int day1tab[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 349 static int day2tab[] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 350 351 /* 352 * Unit control structure 353 */ 354 struct actsunit { 355 int pollcnt; /* poll message counter */ 356 int state; /* the first one was Delaware */ 357 int run; /* call program run switch */ 358 int msgcnt; /* count of ACTS messages received */ 359 long redial; /* interval to next automatic call */ 360 double msADV; /* millisecond advance of last message */ 361 }; 362 363 /* 364 * Function prototypes 365 */ 366 static int acts_start P((int, struct peer *)); 367 static void acts_shutdown P((int, struct peer *)); 368 static void acts_receive P((struct recvbuf *)); 369 static void acts_poll P((int, struct peer *)); 370 static void acts_timeout P((struct peer *)); 371 static void acts_disc P((struct peer *)); 372 static int acts_write P((struct peer *, const char *)); 373 374 /* 375 * Transfer vector (conditional structure name) 376 */ 377 struct refclock REF_ENTRY = { 378 acts_start, /* start up driver */ 379 acts_shutdown, /* shut down driver */ 380 acts_poll, /* transmit poll message */ 381 noentry, /* not used (old acts_control) */ 382 noentry, /* not used (old acts_init) */ 383 noentry, /* not used (old acts_buginfo) */ 384 NOFLAGS /* not used */ 385 }; 386 387 388 /* 389 * acts_start - open the devices and initialize data for processing 390 */ 391 392 static int 393 acts_start ( 394 int unit, 395 struct peer *peer 396 ) 397 { 398 register struct actsunit *up; 399 struct refclockproc *pp; 400 int fd; 401 char device[20]; 402 int dtr = TIOCM_DTR; 403 404 /* 405 * Open serial port. Use ACTS line discipline, if available. It 406 * pumps a timestamp into the data stream at every on-time 407 * character '*' found. Note: the port must have modem control 408 * or deep pockets for the phone bill. HP-UX 9.03 users should 409 * have very deep pockets. 410 */ 411 (void)sprintf(device, DEVICE, unit); 412 if (!(fd = refclock_open(device, SPEED232, LDISC_ACTS))) 413 return (0); 414 if (ioctl(fd, TIOCMBIS, (char *)&dtr) < 0) { 415 msyslog(LOG_ERR, "clock %s ACTS no modem control", 416 ntoa(&peer->srcadr)); 417 return (0); 418 } 419 420 /* 421 * Allocate and initialize unit structure 422 */ 423 if (!(up = (struct actsunit *) 424 emalloc(sizeof(struct actsunit)))) { 425 (void) close(fd); 426 return (0); 427 } 428 memset((char *)up, 0, sizeof(struct actsunit)); 429 pp = peer->procptr; 430 pp->io.clock_recv = acts_receive; 431 pp->io.srcclock = (caddr_t)peer; 432 pp->io.datalen = 0; 433 pp->io.fd = fd; 434 if (!io_addclock(&pp->io)) { 435 (void) close(fd); 436 free(up); 437 return (0); 438 } 439 pp->unitptr = (caddr_t)up; 440 441 /* 442 * Initialize miscellaneous variables 443 */ 444 peer->precision = PRECISION; 445 pp->clockdesc = DESCRIPTION; 446 memcpy((char *)&pp->refid, REFID, 4); 447 peer->minpoll = ACTS_MINPOLL; 448 peer->maxpoll = ACTS_MAXPOLL; 449 peer->sstclktype = CTL_SST_TS_TELEPHONE; 450 451 /* 452 * Initialize modem and kill DTR. We skedaddle if this comes 453 * bum. 454 */ 455 if (!acts_write(peer, MODEM_SETUP)) { 456 (void) close(fd); 457 free(up); 458 return (0); 459 } 460 461 /* 462 * Set up the driver timeout 463 */ 464 peer->nextdate = current_time + WAIT; 465 return (1); 466 } 467 468 469 /* 470 * acts_shutdown - shut down the clock 471 */ 472 static void 473 acts_shutdown ( 474 int unit, 475 struct peer *peer 476 ) 477 { 478 register struct actsunit *up; 479 struct refclockproc *pp; 480 481 pp = peer->procptr; 482 up = (struct actsunit *)pp->unitptr; 483 io_closeclock(&pp->io); 484 free(up); 485 } 486 487 488 /* 489 * acts_receive - receive data from the serial interface 490 */ 491 static void 492 acts_receive ( 493 struct recvbuf *rbufp 494 ) 495 { 496 register struct actsunit *up; 497 struct refclockproc *pp; 498 struct peer *peer; 499 char str[SMAX]; 500 int i; 501 char hangup = '%'; /* ACTS hangup */ 502 int day; /* day of the month */ 503 int month; /* month of the year */ 504 u_long mjd; /* Modified Julian Day */ 505 double dut1; /* DUT adjustment */ 506 double msADV; /* ACTS transmit advance (ms) */ 507 char flag; /* calibration flag */ 508 #ifndef CLOCK_PTBACTS 509 char utc[10]; /* this is NIST and you're not */ 510 u_int dst; /* daylight/standard time indicator */ 511 u_int leap; /* leap-second indicator */ 512 #else 513 char leapdir; /* leap direction */ 514 u_int leapmonth; /* month of leap */ 515 #endif 516 /* 517 * Initialize pointers and read the timecode and timestamp. If 518 * the OK modem status code, leave it where folks can find it. 519 */ 520 peer = (struct peer *)rbufp->recv_srcclock; 521 pp = peer->procptr; 522 up = (struct actsunit *)pp->unitptr; 523 pp->lencode = refclock_gtlin(rbufp, pp->a_lastcode, BMAX, 524 &pp->lastrec); 525 if (pp->lencode == 0) { 526 if (strcmp(pp->a_lastcode, "OK") == 0) 527 pp->lencode = 2; 528 return; 529 } 530 #ifdef DEBUG 531 if (debug) 532 printf("acts: state %d timecode %d %*s\n", up->state, 533 pp->lencode, pp->lencode, pp->a_lastcode); 534 #endif 535 536 switch (up->state) { 537 538 case 0: 539 540 /* 541 * State 0. We are not expecting anything. Probably 542 * modem disconnect noise. Go back to sleep. 543 */ 544 return; 545 546 case 1: 547 548 /* 549 * State 1. We are waiting for the call to be answered. 550 * All we care about here is CONNECT as the first token 551 * in the string. If the modem signals BUSY, ERROR, NO 552 * ANSWER, NO CARRIER or NO DIALTONE, we immediately 553 * hang up the phone. If CONNECT doesn't happen after 554 * ANSWER seconds, hang up the phone. If everything is 555 * okay, start the connect timeout and slide into state 556 * 2. 557 */ 558 if( strcmp(pp->a_lastcode, " ") == 0) { 559 acts_disc(peer); 560 return; 561 } 562 if( strcmp(sys_phone[0],"DIRECT") != 0 ) { 563 (void)strncpy(str, strtok(pp->a_lastcode, " "), SMAX); 564 if (strcmp(str, "BUSY") == 0 || strcmp(str, "ERROR") == 565 0 || strcmp(str, "NO") == 0) { 566 NLOG(NLOG_CLOCKINFO) /* conditional if clause for conditional syslog */ 567 msyslog(LOG_NOTICE, 568 "clock %s ACTS modem status %s", 569 ntoa(&peer->srcadr), pp->a_lastcode); 570 acts_disc(peer); 571 } else if (strcmp(str, "CONNECT") == 0) { 572 peer->nextdate = current_time + CONNECT; 573 up->msgcnt = 0; 574 up->state++; 575 } 576 } else { 577 (void) strncpy(str,"CONNECT",7); 578 peer->nextdate = current_time + CONNECT; 579 up->msgcnt = 0; 580 up->state++; 581 } 582 return; 583 584 case 2: 585 586 /* 587 * State 2. The call has been answered and we are 588 * waiting for the first ACTS message. If this doesn't 589 * happen within the timecode timeout, hang up the 590 * phone. We probably got a wrong number or ACTS is 591 * down. 592 */ 593 peer->nextdate = current_time + TIMECODE; 594 up->state++; 595 } 596 597 /* 598 * Real yucky things here. Ignore everything except timecode 599 * messages, as determined by the message length. We told the 600 * terminal routines to end the line with '*' and the line 601 * discipline to strike a timestamp on that character. However, 602 * when the ACTS echo-delay scheme works, the '*' eventually 603 * becomes a '#'. In this case the message is ended by the <CR> 604 * that comes about 200 ms after the '#' and the '#' cannot be 605 * echoed at the proper time. But, this may not be a lose, since 606 * we already have good data from prior messages and only need 607 * the millisecond advance calculated by ACTS. So, if the 608 * message is long enough and has an on-time character at the 609 * right place, we consider the message (but not neccesarily the 610 * timestmap) to be valid. 611 */ 612 if (pp->lencode != LENCODE) 613 return; 614 615 #ifndef CLOCK_PTBACTS 616 /* 617 * We apparently have a valid timecode message, so dismember it 618 * with sscan(). This routine does a good job in spotting syntax 619 * errors without becoming overly pedantic. 620 * 621 * D L D 622 * MJD YR MO DA H M S ST S UT1 msADV OTM 623 * 47222 88-03-02 21:39:15 83 0 +.3 045.0 UTC(NBS) * 624 */ 625 if (sscanf(pp->a_lastcode, 626 "%5ld %2d-%2d-%2d %2d:%2d:%2d %2d %1d %3lf %5lf %s %c", 627 &mjd, &pp->year, &month, &day, &pp->hour, &pp->minute, 628 &pp->second, &dst, &leap, &dut1, &msADV, utc, &flag) != 13) { 629 refclock_report(peer, CEVNT_BADREPLY); 630 return; 631 } 632 #else 633 /* 634 * Data format 635 * 0000000000111111111122222222223333333333444444444455555555556666666666777777777 7 636 * 0123456789012345678901234567890123456789012345678901234567890123456789012345678 9 637 * 1995-01-23 20:58:51 MEZ 10402303260219950123195849740+40000500 * 638 */ 639 if (sscanf(pp->a_lastcode, 640 "%*4d-%*2d-%*2d %*2d:%*2d:%2d %*5c%*12c%4d%2d%2d%2d%2d%5ld%2lf%c%2d%3lf%*15c%c", 641 &pp->second, &pp->year, &month, &day, &pp->hour, &pp->minute, &mjd, &dut1, &leapdir, &leapmonth, &msADV, &flag) != 12) { 642 refclock_report(peer, CEVNT_BADREPLY); 643 return; 644 } 645 #endif 646 /* 647 * Some modems can't be trusted (the Practical Peripherals 648 * 9600SA comes to mind) and, even if they manage to unstick 649 * ACTS, the millisecond advance is wrong, so we use CLK_FLAG2 650 * to disable echoes, if neccessary. 651 */ 652 if ((flag == '*' || flag == '#') && !(pp->sloppyclockflag & 653 CLK_FLAG2)) 654 (void)write(pp->io.fd, &flag, 1); 655 656 /* 657 * The ACTS timecode format croaks in 2000. Life is short. 658 * Would only the timecode mavens resist the urge to express months 659 * of the year and days of the month in favor of days of the year. 660 */ 661 if (month < 1 || month > 12 || day < 1) { 662 refclock_report(peer, CEVNT_BADTIME); 663 return; 664 } 665 666 /* 667 * Depending on the driver, at this point we have a two-digit year 668 * or a four-digit year. Make sure we have a four-digit year. 669 */ 670 if ( pp->year < YEAR_PIVOT ) pp->year += 100; /* Y2KFixes */ 671 if ( pp->year < YEAR_BREAK ) pp->year += 1900; /* Y2KFixes */ 672 if ( !isleap_4(pp->year) ) { /* Y2KFixes */ 673 if (day > day1tab[month - 1]) { 674 refclock_report(peer, CEVNT_BADTIME); 675 return; 676 } 677 for (i = 0; i < month - 1; i++) 678 day += day1tab[i]; 679 } else { 680 if (day > day2tab[month - 1]) { 681 refclock_report(peer, CEVNT_BADTIME); 682 return; 683 } 684 for (i = 0; i < month - 1; i++) 685 day += day2tab[i]; 686 } 687 pp->day = day; 688 689 #ifndef CLOCK_PTBACTS 690 if (leap == 1) 691 pp->leap = LEAP_ADDSECOND; 692 else if (pp->leap == 2) 693 pp->leap = LEAP_DELSECOND; 694 #else 695 if (leapmonth == month) { 696 if (leapdir == '+') 697 pp->leap = LEAP_ADDSECOND; 698 else if (leapdir == '-') 699 pp->leap = LEAP_DELSECOND; 700 } 701 #endif 702 703 /* 704 * Colossal hack here. We process each sample in a trimmed-mean 705 * filter and determine the reference clock offset and 706 * dispersion. The fudge time1 value is added to each sample as 707 * received. If we collect MSGCNT samples before the '#' on-time 708 * character, we use the results of the filter as is. If the '#' 709 * is found before that, the adjusted msADV is used to correct 710 * the propagation delay. 711 */ 712 up->msgcnt++; 713 if (flag == '#') { 714 pp->offset += (msADV - up->msADV) * 1000 * 1e-6; 715 } else { 716 up->msADV = msADV; 717 if (!refclock_process(pp)) { 718 refclock_report(peer, CEVNT_BADTIME); 719 return; 720 } else if (up->msgcnt < MSGCNT) 721 return; 722 } 723 724 /* 725 * We have a filtered sample offset ready for peer processing. 726 * We use lastrec as both the reference time and receive time in 727 * order to avoid being cute, like setting the reference time 728 * later than the receive time, which may cause a paranoid 729 * protocol module to chuck out the data. Finaly, we unhook the 730 * timeout, arm for the next call, fold the tent and go home. 731 * The little dance with the '%' character is an undocumented 732 * ACTS feature that hangs up the phone real quick without 733 * waiting for carrier loss or long-space disconnect, but we do 734 * these clumsy things anyway. 735 */ 736 record_clock_stats(&peer->srcadr, pp->a_lastcode); 737 refclock_receive(peer); 738 pp->sloppyclockflag &= ~CLK_FLAG1; 739 up->pollcnt = 0; 740 (void)write(pp->io.fd, &hangup, 1); 741 up->state = 0; 742 acts_disc(peer); 743 } 744 745 746 /* 747 * acts_poll - called by the transmit routine 748 */ 749 static void 750 acts_poll ( 751 int unit, 752 struct peer *peer 753 ) 754 { 755 register struct actsunit *up; 756 struct refclockproc *pp; 757 758 /* 759 * If the driver is running, we set the enable flag (fudge 760 * flag1), which causes the driver timeout routine to initiate a 761 * call to ACTS. If not, the enable flag can be set using 762 * ntpdc. If this is the sustem peer, then follow the system 763 * poll interval. 764 */ 765 pp = peer->procptr; 766 up = (struct actsunit *)pp->unitptr; 767 768 if (up->run) { 769 pp->sloppyclockflag |= CLK_FLAG1; 770 if (peer == sys_peer) 771 peer->hpoll = sys_poll; 772 else 773 peer->hpoll = peer->minpoll; 774 } 775 acts_timeout (peer); 776 return; 777 } 778 779 780 /* 781 * acts_timeout - called by the timer interrupt 782 */ 783 static void 784 acts_timeout ( 785 struct peer *peer 786 ) 787 { 788 register struct actsunit *up; 789 struct refclockproc *pp; 790 int dtr = TIOCM_DTR; 791 792 /* 793 * If a timeout occurs in other than state 0, the call has 794 * failed. If in state 0, we just see if there is other work to 795 * do. 796 */ 797 pp = peer->procptr; 798 up = (struct actsunit *)pp->unitptr; 799 if (up->state) { 800 acts_disc(peer); 801 return; 802 } 803 switch (peer->ttlmax) { 804 805 /* 806 * In manual mode the ACTS calling program is activated 807 * by the ntpdc program using the enable flag (fudge 808 * flag1), either manually or by a cron job. 809 */ 810 case MODE_MANUAL: 811 up->run = 0; 812 break; 813 814 /* 815 * In automatic mode the ACTS calling program runs 816 * continuously at intervals determined by the sys_poll 817 * variable. 818 */ 819 case MODE_AUTO: 820 if (!up->run) 821 pp->sloppyclockflag |= CLK_FLAG1; 822 up->run = 1; 823 break; 824 825 /* 826 * In backup mode the ACTS calling program is disabled, 827 * unless no system peer has been selected for MAXOUTAGE 828 * (3600 s). Once enabled, it runs until some other NTP 829 * peer shows up. 830 */ 831 case MODE_BACKUP: 832 if (!up->run && sys_peer == 0) { 833 if (current_time - last_time > MAXOUTAGE) { 834 up->run = 1; 835 peer->hpoll = peer->minpoll; 836 NLOG(NLOG_CLOCKINFO) /* conditional if clause for conditional syslog */ 837 msyslog(LOG_NOTICE, 838 "clock %s ACTS backup started ", 839 ntoa(&peer->srcadr)); 840 } 841 } else if (up->run && sys_peer->sstclktype != CTL_SST_TS_TELEPHONE) { 842 peer->hpoll = peer->minpoll; 843 up->run = 0; 844 NLOG(NLOG_CLOCKINFO) /* conditional if clause for conditional syslog */ 845 msyslog(LOG_NOTICE, 846 "clock %s ACTS backup stopped", 847 ntoa(&peer->srcadr)); 848 } 849 break; 850 851 default: 852 msyslog(LOG_ERR, 853 "clock %s ACTS invalid mode", ntoa(&peer->srcadr)); 854 } 855 856 /* 857 * The fudge flag1 is used as an enable/disable; if set either 858 * by the code or via ntpdc, the ACTS calling program is 859 * started; if reset, the phones stop ringing. 860 */ 861 if (!(pp->sloppyclockflag & CLK_FLAG1)) { 862 up->pollcnt = 0; 863 peer->nextdate = current_time + IDLE; 864 return; 865 } 866 867 /* 868 * Initiate a call to the ACTS service. If we wind up here in 869 * other than state 0, a successful call could not be completed 870 * within minpoll seconds. We advance to the next modem dial 871 * string. If none are left, we log a notice and clear the 872 * enable flag. For future enhancement: call the site RP and 873 * leave an obscene message in his voicemail. 874 */ 875 if (sys_phone[up->pollcnt][0] == '\0') { 876 refclock_report(peer, CEVNT_TIMEOUT); 877 NLOG(NLOG_CLOCKINFO) /* conditional if clause for conditional syslog */ 878 msyslog(LOG_NOTICE, 879 "clock %s ACTS calling program terminated", 880 ntoa(&peer->srcadr)); 881 pp->sloppyclockflag &= ~CLK_FLAG1; 882 #ifdef DEBUG 883 if (debug) 884 printf("acts: calling program terminated\n"); 885 #endif 886 up->pollcnt = 0; 887 peer->nextdate = current_time + IDLE; 888 return; 889 } 890 891 /* 892 * Raise DTR, call ACTS and start the answer timeout. We think 893 * it strange if the OK status has not been received from the 894 * modem, but plow ahead anyway. 895 */ 896 if (strcmp(pp->a_lastcode, "OK") != 0) 897 NLOG(NLOG_CLOCKINFO) /* conditional if clause for conditional syslog */ 898 msyslog(LOG_NOTICE, "clock %s ACTS no modem status", 899 ntoa(&peer->srcadr)); 900 (void)ioctl(pp->io.fd, TIOCMBIS, (char *)&dtr); 901 (void)acts_write(peer, sys_phone[up->pollcnt]); 902 NLOG(NLOG_CLOCKINFO) /* conditional if clause for conditional syslog */ 903 msyslog(LOG_NOTICE, "clock %s ACTS calling %s\n", 904 ntoa(&peer->srcadr), sys_phone[up->pollcnt]); 905 up->state = 1; 906 up->pollcnt++; 907 pp->polls++; 908 peer->nextdate = current_time + ANSWER; 909 return; 910 } 911 912 913 /* 914 * acts_disc - disconnect the call and wait for the ruckus to cool 915 */ 916 static void 917 acts_disc ( 918 struct peer *peer 919 ) 920 { 921 register struct actsunit *up; 922 struct refclockproc *pp; 923 int dtr = TIOCM_DTR; 924 925 /* 926 * We should never get here other than in state 0, unless a call 927 * has timed out. We drop DTR, which will reliably get the modem 928 * off the air, even while ACTS is hammering away full tilt. 929 */ 930 pp = peer->procptr; 931 up = (struct actsunit *)pp->unitptr; 932 (void)ioctl(pp->io.fd, TIOCMBIC, (char *)&dtr); 933 if (up->state > 0) { 934 NLOG(NLOG_CLOCKINFO) /* conditional if clause for conditional syslog */ 935 msyslog(LOG_NOTICE, "clock %s ACTS call failed %d", 936 ntoa(&peer->srcadr), up->state); 937 #ifdef DEBUG 938 if (debug) 939 printf("acts: call failed %d\n", up->state); 940 #endif 941 up->state = 0; 942 } 943 peer->nextdate = current_time + WAIT; 944 } 945 946 947 /* 948 * acts_write - write a message to the serial port 949 */ 950 static int 951 acts_write ( 952 struct peer *peer, 953 const char *str 954 ) 955 { 956 register struct actsunit *up; 957 struct refclockproc *pp; 958 int len; 959 int code; 960 char cr = '\r'; 961 962 /* 963 * Not much to do here, other than send the message, handle 964 * debug and report faults. 965 */ 966 pp = peer->procptr; 967 up = (struct actsunit *)pp->unitptr; 968 len = strlen(str); 969 #ifdef DEBUG 970 if (debug) 971 printf("acts: state %d send %d %s\n", up->state, len, 972 str); 973 #endif 974 code = write(pp->io.fd, str, (unsigned)len) == len; 975 code &= write(pp->io.fd, &cr, 1) == 1; 976 if (!code) 977 refclock_report(peer, CEVNT_FAULT); 978 return (code); 979 } 980 981 #else 982 int refclock_acts_bs; 983 #endif /* REFCLOCK */ 984