Annotation of embedaddon/ntp/ntpd/ntp_proto.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * ntp_proto.c - NTP version 4 protocol machinery
        !             3:  *
        !             4:  * ATTENTION: Get approval from Dave Mills on all changes to this file!
        !             5:  *
        !             6:  */
        !             7: #ifdef HAVE_CONFIG_H
        !             8: #include <config.h>
        !             9: #endif
        !            10: 
        !            11: #include "ntpd.h"
        !            12: #include "ntp_stdlib.h"
        !            13: #include "ntp_unixtime.h"
        !            14: #include "ntp_control.h"
        !            15: #include "ntp_string.h"
        !            16: 
        !            17: #include <stdio.h>
        !            18: #ifdef HAVE_LIBSCF_H
        !            19: #include <libscf.h>
        !            20: #include <unistd.h>
        !            21: #endif /* HAVE_LIBSCF_H */
        !            22: 
        !            23: 
        !            24: #if defined(VMS) && defined(VMS_LOCALUNIT)     /*wjm*/
        !            25: #include "ntp_refclock.h"
        !            26: #endif
        !            27: 
        !            28: /*
        !            29:  * This macro defines the authentication state. If x is 1 authentication
        !            30:  * is required; othewise it is optional.
        !            31:  */
        !            32: #define        AUTH(x, y)      ((x) ? (y) == AUTH_OK : (y) == AUTH_OK || \
        !            33:                            (y) == AUTH_NONE)
        !            34: 
        !            35: #define        AUTH_NONE       0       /* authentication not required */
        !            36: #define        AUTH_OK         1       /* authentication OK */
        !            37: #define        AUTH_ERROR      2       /* authentication error */
        !            38: #define        AUTH_CRYPTO     3       /* crypto_NAK */
        !            39: 
        !            40: /*
        !            41:  * traffic shaping parameters
        !            42:  */
        !            43: #define        NTP_IBURST      6       /* packets in iburst */
        !            44: #define        RESP_DELAY      1       /* refclock burst delay (s) */
        !            45: 
        !            46: /*
        !            47:  * System variables are declared here. Unless specified otherwise, all
        !            48:  * times are in seconds.
        !            49:  */
        !            50: u_char sys_leap;               /* system leap indicator */
        !            51: u_char sys_stratum;            /* system stratum */
        !            52: s_char sys_precision;          /* local clock precision (log2 s) */
        !            53: double sys_rootdelay;          /* roundtrip delay to primary source */
        !            54: double sys_rootdisp;           /* dispersion to primary source */
        !            55: u_int32 sys_refid;             /* reference id (network byte order) */
        !            56: l_fp   sys_reftime;            /* last update time */
        !            57: struct peer *sys_peer;         /* current peer */
        !            58: 
        !            59: /*
        !            60:  * Rate controls. Leaky buckets are used to throttle the packet
        !            61:  * transmission rates in order to protect busy servers such as at NIST
        !            62:  * and USNO. There is a counter for each association and another for KoD
        !            63:  * packets. The association counter decrements each second, but not
        !            64:  * below zero. Each time a packet is sent the counter is incremented by
        !            65:  * a configurable value representing the average interval between
        !            66:  * packets. A packet is delayed as long as the counter is greater than
        !            67:  * zero. Note this does not affect the time value computations.
        !            68:  */
        !            69: /*
        !            70:  * Nonspecified system state variables
        !            71:  */
        !            72: int    sys_bclient;            /* broadcast client enable */
        !            73: double sys_bdelay;             /* broadcast client default delay */
        !            74: int    sys_authenticate;       /* requre authentication for config */
        !            75: l_fp   sys_authdelay;          /* authentication delay */
        !            76: double sys_offset;     /* current local clock offset */
        !            77: double sys_mindisp = MINDISPERSE; /* minimum distance (s) */
        !            78: double sys_maxdist = MAXDISTANCE; /* selection threshold */
        !            79: double sys_jitter;             /* system jitter */
        !            80: u_long sys_epoch;              /* last clock update time */
        !            81: static double sys_clockhop;    /* clockhop threshold */
        !            82: int    leap_tai;               /* TAI at next next leap */
        !            83: u_long leap_sec;               /* next scheduled leap from file */
        !            84: u_long leap_peers;             /* next scheduled leap from peers */
        !            85: u_long leap_expire;            /* leap information expiration */
        !            86: static int leap_vote;          /* leap consensus */
        !            87: keyid_t        sys_private;            /* private value for session seed */
        !            88: int    sys_manycastserver;     /* respond to manycast client pkts */
        !            89: int    peer_ntpdate;           /* active peers in ntpdate mode */
        !            90: int    sys_survivors;          /* truest of the truechimers */
        !            91: 
        !            92: /*
        !            93:  * TOS and multicast mapping stuff
        !            94:  */
        !            95: int    sys_floor = 0;          /* cluster stratum floor */
        !            96: int    sys_ceiling = STRATUM_UNSPEC; /* cluster stratum ceiling */
        !            97: int    sys_minsane = 1;        /* minimum candidates */
        !            98: int    sys_minclock = NTP_MINCLOCK; /* minimum candidates */
        !            99: int    sys_maxclock = NTP_MAXCLOCK; /* maximum candidates */
        !           100: int    sys_cohort = 0;         /* cohort switch */
        !           101: int    sys_orphan = STRATUM_UNSPEC + 1; /* orphan stratum */
        !           102: int    sys_beacon = BEACON;    /* manycast beacon interval */
        !           103: int    sys_ttlmax;             /* max ttl mapping vector index */
        !           104: u_char sys_ttl[MAX_TTL];       /* ttl mapping vector */
        !           105: 
        !           106: /*
        !           107:  * Statistics counters - first the good, then the bad
        !           108:  */
        !           109: u_long sys_stattime;           /* elapsed time */
        !           110: u_long sys_received;           /* packets received */
        !           111: u_long sys_processed;          /* packets for this host */
        !           112: u_long sys_newversion;         /* current version */
        !           113: u_long sys_oldversion;         /* old version */
        !           114: u_long sys_restricted;         /* access denied */
        !           115: u_long sys_badlength;          /* bad length or format */
        !           116: u_long sys_badauth;            /* bad authentication */
        !           117: u_long sys_declined;           /* declined */
        !           118: u_long sys_limitrejected;      /* rate exceeded */
        !           119: u_long sys_kodsent;            /* KoD sent */
        !           120: 
        !           121: static double  root_distance   (struct peer *);
        !           122: static void    clock_combine   (struct peer **, int);
        !           123: static void    peer_xmit       (struct peer *);
        !           124: static void    fast_xmit       (struct recvbuf *, int, keyid_t,
        !           125:                                    int);
        !           126: static void    clock_update    (struct peer *);
        !           127: static int     default_get_precision (void);
        !           128: static int     local_refid     (struct peer *);
        !           129: static int     peer_unfit      (struct peer *);
        !           130: 
        !           131: 
        !           132: /*
        !           133:  * transmit - transmit procedure called by poll timeout
        !           134:  */
        !           135: void
        !           136: transmit(
        !           137:        struct peer *peer       /* peer structure pointer */
        !           138:        )
        !           139: {
        !           140:        int     hpoll;
        !           141: 
        !           142:        /*
        !           143:         * The polling state machine. There are two kinds of machines,
        !           144:         * those that never expect a reply (broadcast and manycast
        !           145:         * server modes) and those that do (all other modes). The dance
        !           146:         * is intricate...
        !           147:         */
        !           148:        hpoll = peer->hpoll;
        !           149: 
        !           150:        /*
        !           151:         * In broadcast mode the poll interval is never changed from
        !           152:         * minpoll.
        !           153:         */
        !           154:        if (peer->cast_flags & (MDF_BCAST | MDF_MCAST)) {
        !           155:                peer->outdate = current_time;
        !           156:                if (sys_leap != LEAP_NOTINSYNC)
        !           157:                        peer_xmit(peer);
        !           158:                poll_update(peer, hpoll);
        !           159:                return;
        !           160:        }
        !           161: 
        !           162:        /*
        !           163:         * In manycast mode we start with unity ttl. The ttl is
        !           164:         * increased by one for each poll until either sys_maxclock
        !           165:         * servers have been found or the maximum ttl is reached. When
        !           166:         * sys_maxclock servers are found we stop polling until one or
        !           167:         * more servers have timed out or until less than minpoll
        !           168:         * associations turn up. In this case additional better servers
        !           169:         * are dragged in and preempt the existing ones.
        !           170:         */
        !           171:        if (peer->cast_flags & MDF_ACAST) {
        !           172:                peer->outdate = current_time;
        !           173:                if (peer->unreach > sys_beacon) {
        !           174:                        peer->unreach = 0;
        !           175:                        peer->ttl = 0;
        !           176:                        peer_xmit(peer);
        !           177:                } else if (sys_survivors < sys_minclock ||
        !           178:                    peer_associations < sys_maxclock) {
        !           179:                        if (peer->ttl < sys_ttlmax)
        !           180:                                peer->ttl++;
        !           181:                        peer_xmit(peer);
        !           182:                }
        !           183:                peer->unreach++;
        !           184:                poll_update(peer, hpoll);
        !           185:                return;
        !           186:        }
        !           187: 
        !           188:        /*
        !           189:         * In unicast modes the dance is much more intricate. It is
        !           190:         * desigmed to back off whenever possible to minimize network
        !           191:         * traffic.
        !           192:         */
        !           193:        if (peer->burst == 0) {
        !           194:                u_char oreach;
        !           195: 
        !           196:                /*
        !           197:                 * Update the reachability status. If not heard for
        !           198:                 * three consecutive polls, stuff infinity in the clock
        !           199:                 * filter. 
        !           200:                 */
        !           201:                oreach = peer->reach;
        !           202:                peer->outdate = current_time;
        !           203:                peer->unreach++;
        !           204:                peer->reach <<= 1;
        !           205:                if (!(peer->reach & 0x0f))
        !           206:                        clock_filter(peer, 0., 0., MAXDISPERSE);
        !           207:                if (!peer->reach) {
        !           208: 
        !           209:                        /*
        !           210:                         * Here the peer is unreachable. If it was
        !           211:                         * previously reachable raise a trap. Send a
        !           212:                         * burst if enabled.
        !           213:                         */
        !           214:                        if (oreach)
        !           215:                                report_event(PEVNT_UNREACH, peer, NULL);
        !           216:                        if ((peer->flags & FLAG_IBURST) &&
        !           217:                            peer->retry == 0)
        !           218:                                peer->retry = NTP_RETRY;
        !           219:                } else {
        !           220: 
        !           221:                        /*
        !           222:                         * Here the peer is reachable. Send a burst if
        !           223:                         * enabled and the peer is fit.
        !           224:                         */
        !           225:                        hpoll = sys_poll;
        !           226:                        if (!(peer->flags & FLAG_PREEMPT &&
        !           227:                            peer->hmode == MODE_CLIENT))
        !           228:                                peer->unreach = 0;
        !           229:                        if ((peer->flags & FLAG_BURST) && peer->retry ==
        !           230:                            0 && !peer_unfit(peer))
        !           231:                                peer->retry = NTP_RETRY;
        !           232:                }
        !           233: 
        !           234:                /*
        !           235:                 * Watch for timeout. If preemptable, toss the rascal;
        !           236:                 * otherwise, bump the poll interval. Note the
        !           237:                 * poll_update() routine will clamp it to maxpoll.
        !           238:                 */ 
        !           239:                if (peer->unreach >= NTP_UNREACH) {
        !           240:                        hpoll++;
        !           241:                        if (peer->flags & FLAG_PREEMPT) {
        !           242:                                report_event(PEVNT_RESTART, peer,
        !           243:                                    "timeout");
        !           244:                                if (peer->hmode != MODE_CLIENT) {
        !           245:                                        peer_clear(peer, "TIME");
        !           246:                                        unpeer(peer);
        !           247:                                        return;
        !           248:                                }
        !           249:                                if (peer_associations > sys_maxclock &&
        !           250:                                    score_all(peer)) {
        !           251:                                        peer_clear(peer, "TIME");
        !           252:                                        unpeer(peer);
        !           253:                                        return;
        !           254:                                }
        !           255:                        }
        !           256:                }
        !           257:        } else {
        !           258:                peer->burst--;
        !           259:                if (peer->burst == 0) {
        !           260: 
        !           261:                        /*
        !           262:                         * If ntpdate mode and the clock has not been
        !           263:                         * set and all peers have completed the burst,
        !           264:                         * we declare a successful failure.
        !           265:                         */
        !           266:                        if (mode_ntpdate) {
        !           267:                                peer_ntpdate--;
        !           268:                                if (peer_ntpdate == 0) {
        !           269:                                        msyslog(LOG_NOTICE,
        !           270:                                            "ntpd: no servers found");
        !           271:                                        printf(
        !           272:                                            "ntpd: no servers found\n");
        !           273:                                        exit (0);
        !           274:                                }
        !           275:                        }
        !           276:                }
        !           277:        }
        !           278:        if (peer->retry > 0)
        !           279:                peer->retry--;
        !           280: 
        !           281:        /*
        !           282:         * Do not transmit if in broadcast client mode. 
        !           283:         */
        !           284:        if (peer->hmode != MODE_BCLIENT)
        !           285:                peer_xmit(peer);
        !           286:        poll_update(peer, hpoll);
        !           287: }
        !           288: 
        !           289: 
        !           290: /*
        !           291:  * receive - receive procedure called for each packet received
        !           292:  */
        !           293: void
        !           294: receive(
        !           295:        struct recvbuf *rbufp
        !           296:        )
        !           297: {
        !           298:        register struct peer *peer;     /* peer structure pointer */
        !           299:        register struct pkt *pkt;       /* receive packet pointer */
        !           300:        int     hisversion;             /* packet version */
        !           301:        int     hisleap;                /* packet leap indicator */
        !           302:        int     hismode;                /* packet mode */
        !           303:        int     hisstratum;             /* packet stratum */
        !           304:        int     restrict_mask;          /* restrict bits */
        !           305:        int     has_mac;                /* length of MAC field */
        !           306:        int     authlen;                /* offset of MAC field */
        !           307:        int     is_authentic = 0;       /* cryptosum ok */
        !           308:        int     retcode = AM_NOMATCH;   /* match code */
        !           309:        keyid_t skeyid = 0;             /* key IDs */
        !           310:        u_int32 opcode = 0;             /* extension field opcode */
        !           311:        sockaddr_u *dstadr_sin;         /* active runway */
        !           312:        struct peer *peer2;             /* aux peer structure pointer */
        !           313:        endpt * match_ep;               /* newpeer() local address */
        !           314:        l_fp    p_org;                  /* origin timestamp */
        !           315:        l_fp    p_rec;                  /* receive timestamp */
        !           316:        l_fp    p_xmt;                  /* transmit timestamp */
        !           317: #ifdef OPENSSL
        !           318:        struct autokey *ap;             /* autokey structure pointer */
        !           319:        int     rval;                   /* cookie snatcher */
        !           320:        keyid_t pkeyid = 0, tkeyid = 0; /* key IDs */
        !           321: #endif /* OPENSSL */
        !           322: #ifdef HAVE_NTP_SIGND
        !           323:        static unsigned char zero_key[16];
        !           324: #endif /* HAVE_NTP_SIGND */
        !           325: 
        !           326:        /*
        !           327:         * Monitor the packet and get restrictions. Note that the packet
        !           328:         * length for control and private mode packets must be checked
        !           329:         * by the service routines. Some restrictions have to be handled
        !           330:         * later in order to generate a kiss-o'-death packet.
        !           331:         */
        !           332:        /*
        !           333:         * Bogus port check is before anything, since it probably
        !           334:         * reveals a clogging attack.
        !           335:         */
        !           336:        sys_received++;
        !           337:        if (SRCPORT(&rbufp->recv_srcadr) < NTP_PORT) {
        !           338:                sys_badlength++;
        !           339:                return;                         /* bogus port */
        !           340:        }
        !           341:        restrict_mask = restrictions(&rbufp->recv_srcadr);
        !           342: #ifdef DEBUG
        !           343:        if (debug > 1)
        !           344:                printf("receive: at %ld %s<-%s flags %x restrict %03x\n",
        !           345:                    current_time, stoa(&rbufp->dstadr->sin),
        !           346:                    stoa(&rbufp->recv_srcadr),
        !           347:                    rbufp->dstadr->flags, restrict_mask);
        !           348: #endif
        !           349:        pkt = &rbufp->recv_pkt;
        !           350:        hisversion = PKT_VERSION(pkt->li_vn_mode);
        !           351:        hisleap = PKT_LEAP(pkt->li_vn_mode);
        !           352:        hismode = (int)PKT_MODE(pkt->li_vn_mode);
        !           353:        hisstratum = PKT_TO_STRATUM(pkt->stratum);
        !           354:        if (restrict_mask & RES_IGNORE) {
        !           355:                sys_restricted++;
        !           356:                return;                         /* ignore everything */
        !           357:        }
        !           358:        if (hismode == MODE_PRIVATE) {
        !           359:                if (restrict_mask & RES_NOQUERY) {
        !           360:                        sys_restricted++;
        !           361:                        return;                 /* no query private */
        !           362:                }
        !           363:                process_private(rbufp, ((restrict_mask &
        !           364:                    RES_NOMODIFY) == 0));
        !           365:                return;
        !           366:        }
        !           367:        if (hismode == MODE_CONTROL) {
        !           368:                if (restrict_mask & RES_NOQUERY) {
        !           369:                        sys_restricted++;
        !           370:                        return;                 /* no query control */
        !           371:                }
        !           372:                process_control(rbufp, restrict_mask);
        !           373:                return;
        !           374:        }
        !           375:        if (restrict_mask & RES_DONTSERVE) {
        !           376:                sys_restricted++;
        !           377:                return;                         /* no time serve */
        !           378:        }
        !           379: 
        !           380:        /*
        !           381:         * This is for testing. If restricted drop ten percent of
        !           382:         * surviving packets.
        !           383:         */
        !           384:        if (restrict_mask & RES_TIMEOUT) {
        !           385:                if ((double)ntp_random() / 0x7fffffff < .1) {
        !           386:                        sys_restricted++;
        !           387:                        return;                 /* no flakeway */
        !           388:                }
        !           389:        }
        !           390:        
        !           391:        /*
        !           392:         * Version check must be after the query packets, since they
        !           393:         * intentionally use an early version.
        !           394:         */
        !           395:        if (hisversion == NTP_VERSION) {
        !           396:                sys_newversion++;               /* new version */
        !           397:        } else if (!(restrict_mask & RES_VERSION) && hisversion >=
        !           398:            NTP_OLDVERSION) {
        !           399:                sys_oldversion++;               /* previous version */
        !           400:        } else {
        !           401:                sys_badlength++;
        !           402:                return;                         /* old version */
        !           403:        }
        !           404: 
        !           405:        /*
        !           406:         * Figure out his mode and validate the packet. This has some
        !           407:         * legacy raunch that probably should be removed. In very early
        !           408:         * NTP versions mode 0 was equivalent to what later versions
        !           409:         * would interpret as client mode.
        !           410:         */
        !           411:        if (hismode == MODE_UNSPEC) {
        !           412:                if (hisversion == NTP_OLDVERSION) {
        !           413:                        hismode = MODE_CLIENT;
        !           414:                } else {
        !           415:                        sys_badlength++;
        !           416:                        return;                 /* invalid mode */
        !           417:                }
        !           418:        }
        !           419: 
        !           420:        /*
        !           421:         * Parse the extension field if present. We figure out whether
        !           422:         * an extension field is present by measuring the MAC size. If
        !           423:         * the number of words following the packet header is 0, no MAC
        !           424:         * is present and the packet is not authenticated. If 1, the
        !           425:         * packet is a crypto-NAK; if 3, the packet is authenticated
        !           426:         * with DES; if 5, the packet is authenticated with MD5; if 6,
        !           427:         * the packet is authenticated with SHA. If 2 or * 4, the packet
        !           428:         * is a runt and discarded forthwith. If greater than 6, an
        !           429:         * extension field is present, so we subtract the length of the
        !           430:         * field and go around again.
        !           431:         */
        !           432:        authlen = LEN_PKT_NOMAC;
        !           433:        has_mac = rbufp->recv_length - authlen;
        !           434:        while (has_mac != 0) {
        !           435:                u_int32 len;
        !           436: 
        !           437:                if (has_mac % 4 != 0 || has_mac < MIN_MAC_LEN) {
        !           438:                        sys_badlength++;
        !           439:                        return;                 /* bad length */
        !           440:                }
        !           441:                if (has_mac <= MAX_MAC_LEN) {
        !           442:                        skeyid = ntohl(((u_int32 *)pkt)[authlen / 4]);
        !           443:                        break;
        !           444: 
        !           445:                } else {
        !           446:                        opcode = ntohl(((u_int32 *)pkt)[authlen / 4]);
        !           447:                        len = opcode & 0xffff;
        !           448:                        if (len % 4 != 0 || len < 4 || len + authlen >
        !           449:                            rbufp->recv_length) {
        !           450:                                sys_badlength++;
        !           451:                                return;         /* bad length */
        !           452:                        }
        !           453:                        authlen += len;
        !           454:                        has_mac -= len;
        !           455:                }
        !           456:        }
        !           457: 
        !           458:        /*
        !           459:         * If authentication required, a MAC must be present.
        !           460:         */
        !           461:        if (restrict_mask & RES_DONTTRUST && has_mac == 0) {
        !           462:                sys_restricted++;
        !           463:                return;                         /* access denied */
        !           464:        }
        !           465: 
        !           466:        /*
        !           467:         * Update the MRU list and finger the cloggers. It can be a
        !           468:         * little expensive, so turn it off for production use.
        !           469:         */
        !           470:        restrict_mask = ntp_monitor(rbufp, restrict_mask);
        !           471:        if (restrict_mask & RES_LIMITED) {
        !           472:                sys_limitrejected++;
        !           473:                if (!(restrict_mask & RES_KOD) || MODE_BROADCAST ==
        !           474:                    hismode || MODE_SERVER == hismode)
        !           475:                        return;                 /* rate exceeded */
        !           476: 
        !           477:                if (hismode == MODE_CLIENT)
        !           478:                        fast_xmit(rbufp, MODE_SERVER, skeyid,
        !           479:                            restrict_mask);
        !           480:                else
        !           481:                        fast_xmit(rbufp, MODE_ACTIVE, skeyid,
        !           482:                            restrict_mask);
        !           483:                return;                         /* rate exceeded */
        !           484:        }
        !           485:        restrict_mask &= ~RES_KOD;
        !           486: 
        !           487:        /*
        !           488:         * We have tossed out as many buggy packets as possible early in
        !           489:         * the game to reduce the exposure to a clogging attack. now we
        !           490:         * have to burn some cycles to find the association and
        !           491:         * authenticate the packet if required. Note that we burn only
        !           492:         * MD5 cycles, again to reduce exposure. There may be no
        !           493:         * matching association and that's okay.
        !           494:         *
        !           495:         * More on the autokey mambo. Normally the local interface is
        !           496:         * found when the association was mobilized with respect to a
        !           497:         * designated remote address. We assume packets arriving from
        !           498:         * the remote address arrive via this interface and the local
        !           499:         * address used to construct the autokey is the unicast address
        !           500:         * of the interface. However, if the sender is a broadcaster,
        !           501:         * the interface broadcast address is used instead.
        !           502:         * Notwithstanding this technobabble, if the sender is a
        !           503:         * multicaster, the broadcast address is null, so we use the
        !           504:         * unicast address anyway. Don't ask.
        !           505:         */
        !           506:        peer = findpeer(rbufp,  hismode, &retcode);
        !           507:        dstadr_sin = &rbufp->dstadr->sin;
        !           508:        NTOHL_FP(&pkt->org, &p_org);
        !           509:        NTOHL_FP(&pkt->rec, &p_rec);
        !           510:        NTOHL_FP(&pkt->xmt, &p_xmt);
        !           511: 
        !           512:        /*
        !           513:         * Authentication is conditioned by three switches:
        !           514:         *
        !           515:         * NOPEER  (RES_NOPEER) do not mobilize an association unless
        !           516:         *         authenticated
        !           517:         * NOTRUST (RES_DONTTRUST) do not allow access unless
        !           518:         *         authenticated (implies NOPEER)
        !           519:         * enable  (sys_authenticate) master NOPEER switch, by default
        !           520:         *         on
        !           521:         *
        !           522:         * The NOPEER and NOTRUST can be specified on a per-client basis
        !           523:         * using the restrict command. The enable switch if on implies
        !           524:         * NOPEER for all clients. There are four outcomes:
        !           525:         *
        !           526:         * NONE    The packet has no MAC.
        !           527:         * OK      the packet has a MAC and authentication succeeds
        !           528:         * ERROR   the packet has a MAC and authentication fails
        !           529:         * CRYPTO  crypto-NAK. The MAC has four octets only.
        !           530:         *
        !           531:         * Note: The AUTH(x, y) macro is used to filter outcomes. If x
        !           532:         * is zero, acceptable outcomes of y are NONE and OK. If x is
        !           533:         * one, the only acceptable outcome of y is OK.
        !           534:         */
        !           535: 
        !           536:        if (has_mac == 0) {
        !           537:                restrict_mask &= ~RES_MSSNTP;
        !           538:                is_authentic = AUTH_NONE; /* not required */
        !           539: #ifdef DEBUG
        !           540:                if (debug)
        !           541:                        printf(
        !           542:                            "receive: at %ld %s<-%s mode %d len %d\n",
        !           543:                            current_time, stoa(dstadr_sin),
        !           544:                            stoa(&rbufp->recv_srcadr), hismode,
        !           545:                            authlen);
        !           546: #endif
        !           547:        } else if (has_mac == 4) {
        !           548:                restrict_mask &= ~RES_MSSNTP;
        !           549:                is_authentic = AUTH_CRYPTO; /* crypto-NAK */
        !           550: #ifdef DEBUG
        !           551:                if (debug)
        !           552:                        printf(
        !           553:                            "receive: at %ld %s<-%s mode %d keyid %08x len %d auth %d\n",
        !           554:                            current_time, stoa(dstadr_sin),
        !           555:                            stoa(&rbufp->recv_srcadr), hismode, skeyid,
        !           556:                            authlen + has_mac, is_authentic);
        !           557: #endif
        !           558: 
        !           559: #ifdef HAVE_NTP_SIGND
        !           560:                /*
        !           561:                 * If the signature is 20 bytes long, the last 16 of
        !           562:                 * which are zero, then this is a Microsoft client
        !           563:                 * wanting AD-style authentication of the server's
        !           564:                 * reply.  
        !           565:                 *
        !           566:                 * This is described in Microsoft's WSPP docs, in MS-SNTP:
        !           567:                 * http://msdn.microsoft.com/en-us/library/cc212930.aspx
        !           568:                 */
        !           569:        } else if (has_mac == MAX_MD5_LEN && (restrict_mask & RES_MSSNTP) &&
        !           570:           (retcode == AM_FXMIT || retcode == AM_NEWPASS) &&
        !           571:           (memcmp(zero_key, (char *)pkt + authlen + 4, MAX_MD5_LEN - 4) ==
        !           572:           0)) {
        !           573:                is_authentic = AUTH_NONE;
        !           574: #endif /* HAVE_NTP_SIGND */
        !           575: 
        !           576:        } else {
        !           577:                restrict_mask &= ~RES_MSSNTP;
        !           578: #ifdef OPENSSL
        !           579:                /*
        !           580:                 * For autokey modes, generate the session key
        !           581:                 * and install in the key cache. Use the socket
        !           582:                 * broadcast or unicast address as appropriate.
        !           583:                 */
        !           584:                if (crypto_flags && skeyid > NTP_MAXKEY) {
        !           585:                
        !           586:                        /*
        !           587:                         * More on the autokey dance (AKD). A cookie is
        !           588:                         * constructed from public and private values.
        !           589:                         * For broadcast packets, the cookie is public
        !           590:                         * (zero). For packets that match no
        !           591:                         * association, the cookie is hashed from the
        !           592:                         * addresses and private value. For server
        !           593:                         * packets, the cookie was previously obtained
        !           594:                         * from the server. For symmetric modes, the
        !           595:                         * cookie was previously constructed using an
        !           596:                         * agreement protocol; however, should PKI be
        !           597:                         * unavailable, we construct a fake agreement as
        !           598:                         * the EXOR of the peer and host cookies.
        !           599:                         *
        !           600:                         * hismode      ephemeral       persistent
        !           601:                         * =======================================
        !           602:                         * active       0               cookie#
        !           603:                         * passive      0%              cookie#
        !           604:                         * client       sys cookie      0%
        !           605:                         * server       0%              sys cookie
        !           606:                         * broadcast    0               0
        !           607:                         *
        !           608:                         * # if unsync, 0
        !           609:                         * % can't happen
        !           610:                         */
        !           611:                        if (has_mac < MAX_MD5_LEN) {
        !           612:                                sys_badauth++;
        !           613:                                return;
        !           614:                        }
        !           615:                        if (hismode == MODE_BROADCAST) {
        !           616: 
        !           617:                                /*
        !           618:                                 * For broadcaster, use the interface
        !           619:                                 * broadcast address when available;
        !           620:                                 * otherwise, use the unicast address
        !           621:                                 * found when the association was
        !           622:                                 * mobilized. However, if this is from
        !           623:                                 * the wildcard interface, game over.
        !           624:                                 */
        !           625:                                if (crypto_flags && rbufp->dstadr ==
        !           626:                                    any_interface) {
        !           627:                                        sys_restricted++;
        !           628:                                        return;      /* no wildcard */
        !           629:                                }
        !           630:                                pkeyid = 0;
        !           631:                                if (!SOCK_UNSPEC(&rbufp->dstadr->bcast))
        !           632:                                        dstadr_sin =
        !           633:                                            &rbufp->dstadr->bcast;
        !           634:                        } else if (peer == NULL) {
        !           635:                                pkeyid = session_key(
        !           636:                                    &rbufp->recv_srcadr, dstadr_sin, 0,
        !           637:                                    sys_private, 0);
        !           638:                        } else {
        !           639:                                pkeyid = peer->pcookie;
        !           640:                        }
        !           641: 
        !           642:                        /*
        !           643:                         * The session key includes both the public
        !           644:                         * values and cookie. In case of an extension
        !           645:                         * field, the cookie used for authentication
        !           646:                         * purposes is zero. Note the hash is saved for
        !           647:                         * use later in the autokey mambo.
        !           648:                         */
        !           649:                        if (authlen > LEN_PKT_NOMAC && pkeyid != 0) {
        !           650:                                session_key(&rbufp->recv_srcadr,
        !           651:                                    dstadr_sin, skeyid, 0, 2);
        !           652:                                tkeyid = session_key(
        !           653:                                    &rbufp->recv_srcadr, dstadr_sin,
        !           654:                                    skeyid, pkeyid, 0);
        !           655:                        } else {
        !           656:                                tkeyid = session_key(
        !           657:                                    &rbufp->recv_srcadr, dstadr_sin,
        !           658:                                    skeyid, pkeyid, 2);
        !           659:                        }
        !           660: 
        !           661:                }
        !           662: #endif /* OPENSSL */
        !           663: 
        !           664:                /*
        !           665:                 * Compute the cryptosum. Note a clogging attack may
        !           666:                 * succeed in bloating the key cache. If an autokey,
        !           667:                 * purge it immediately, since we won't be needing it
        !           668:                 * again. If the packet is authentic, it can mobilize an
        !           669:                 * association. Note that there is no key zero.
        !           670:                 */
        !           671:                if (!authdecrypt(skeyid, (u_int32 *)pkt, authlen,
        !           672:                    has_mac))
        !           673:                        is_authentic = AUTH_ERROR;
        !           674:                else
        !           675:                        is_authentic = AUTH_OK;
        !           676: #ifdef OPENSSL
        !           677:                if (crypto_flags && skeyid > NTP_MAXKEY)
        !           678:                        authtrust(skeyid, 0);
        !           679: #endif /* OPENSSL */
        !           680: #ifdef DEBUG
        !           681:                if (debug)
        !           682:                        printf(
        !           683:                            "receive: at %ld %s<-%s mode %d keyid %08x len %d auth %d\n",
        !           684:                            current_time, stoa(dstadr_sin),
        !           685:                            stoa(&rbufp->recv_srcadr), hismode, skeyid,
        !           686:                            authlen + has_mac, is_authentic);
        !           687: #endif
        !           688:        }
        !           689: 
        !           690:        /*
        !           691:         * The association matching rules are implemented by a set of
        !           692:         * routines and an association table. A packet matching an
        !           693:         * association is processed by the peer process for that
        !           694:         * association. If there are no errors, an ephemeral association
        !           695:         * is mobilized: a broadcast packet mobilizes a broadcast client
        !           696:         * aassociation; a manycast server packet mobilizes a manycast
        !           697:         * client association; a symmetric active packet mobilizes a
        !           698:         * symmetric passive association.
        !           699:         */
        !           700:        switch (retcode) {
        !           701: 
        !           702:        /*
        !           703:         * This is a client mode packet not matching any association. If
        !           704:         * an ordinary client, simply toss a server mode packet back
        !           705:         * over the fence. If a manycast client, we have to work a
        !           706:         * little harder.
        !           707:         */
        !           708:        case AM_FXMIT:
        !           709: 
        !           710:                /*
        !           711:                 * If authentication OK, send a server reply; otherwise,
        !           712:                 * send a crypto-NAK.
        !           713:                 */
        !           714:                if (!(rbufp->dstadr->flags & INT_MCASTOPEN)) {
        !           715:                        if (AUTH(restrict_mask & RES_DONTTRUST,
        !           716:                           is_authentic)) {
        !           717:                                fast_xmit(rbufp, MODE_SERVER, skeyid,
        !           718:                                    restrict_mask);
        !           719:                        } else if (is_authentic == AUTH_ERROR) {
        !           720:                                fast_xmit(rbufp, MODE_SERVER, 0,
        !           721:                                    restrict_mask);
        !           722:                                sys_badauth++;
        !           723:                        } else {
        !           724:                                sys_restricted++;
        !           725:                        }
        !           726:                        return;                 /* hooray */
        !           727:                }
        !           728: 
        !           729:                /*
        !           730:                 * This must be manycast. Do not respond if not
        !           731:                 * configured as a manycast server.
        !           732:                 */
        !           733:                if (!sys_manycastserver) {
        !           734:                        sys_restricted++;
        !           735:                        return;                 /* not enabled */
        !           736:                }
        !           737: 
        !           738:                /*
        !           739:                 * Do not respond if we are not synchronized or our
        !           740:                 * stratum is greater than the manycaster or the
        !           741:                 * manycaster has already synchronized to us.
        !           742:                 */
        !           743:                if (sys_leap == LEAP_NOTINSYNC || sys_stratum >=
        !           744:                    hisstratum || (!sys_cohort && sys_stratum ==
        !           745:                    hisstratum + 1) || rbufp->dstadr->addr_refid ==
        !           746:                    pkt->refid) {
        !           747:                        sys_declined++;
        !           748:                        return;                 /* no help */
        !           749:                }
        !           750: 
        !           751:                /*
        !           752:                 * Respond only if authentication succeeds. Don't do a
        !           753:                 * crypto-NAK, as that would not be useful.
        !           754:                 */
        !           755:                if (AUTH(restrict_mask & RES_DONTTRUST, is_authentic))
        !           756:                        fast_xmit(rbufp, MODE_SERVER, skeyid,
        !           757:                            restrict_mask);
        !           758:                return;                         /* hooray */
        !           759: 
        !           760:        /*
        !           761:         * This is a server mode packet returned in response to a client
        !           762:         * mode packet sent to a multicast group address. The origin
        !           763:         * timestamp is a good nonce to reliably associate the reply
        !           764:         * with what was sent. If there is no match, that's curious and
        !           765:         * could be an intruder attempting to clog, so we just ignore
        !           766:         * it.
        !           767:         *
        !           768:         * If the packet is authentic and the manycast association is
        !           769:         * found, we mobilize a client association and copy pertinent
        !           770:         * variables from the manycast association to the new client
        !           771:         * association. If not, just ignore the packet.
        !           772:         *
        !           773:         * There is an implosion hazard at the manycast client, since
        !           774:         * the manycast servers send the server packet immediately. If
        !           775:         * the guy is already here, don't fire up a duplicate.
        !           776:         */
        !           777:        case AM_MANYCAST:
        !           778:                if (!AUTH(sys_authenticate | (restrict_mask &
        !           779:                    (RES_NOPEER | RES_DONTTRUST)), is_authentic)) {
        !           780:                        sys_restricted++;
        !           781:                        return;                 /* access denied */
        !           782:                }
        !           783: 
        !           784:                /*
        !           785:                 * Do not respond if unsynchronized or stratum is below
        !           786:                 * the floor or at or above the ceiling.
        !           787:                 */
        !           788:                if (hisleap == LEAP_NOTINSYNC || hisstratum <
        !           789:                    sys_floor || hisstratum >= sys_ceiling) {
        !           790:                        sys_declined++;
        !           791:                        return;                 /* no help */
        !           792:                }
        !           793:                if ((peer2 = findmanycastpeer(rbufp)) == NULL) {
        !           794:                        sys_restricted++;
        !           795:                        return;                 /* not enabled */
        !           796:                }
        !           797:                if ((peer = newpeer(&rbufp->recv_srcadr, rbufp->dstadr,
        !           798:                    MODE_CLIENT, hisversion, NTP_MINDPOLL, NTP_MAXDPOLL,
        !           799:                    FLAG_PREEMPT, MDF_UCAST | MDF_ACLNT, 0, skeyid)) ==
        !           800:                    NULL) {
        !           801:                        sys_declined++;
        !           802:                        return;                 /* ignore duplicate  */
        !           803:                }
        !           804: 
        !           805:                /*
        !           806:                 * We don't need these, but it warms the billboards.
        !           807:                 */
        !           808:                if (peer2->flags & FLAG_IBURST)
        !           809:                        peer->flags |= FLAG_IBURST;
        !           810:                peer->minpoll = peer2->minpoll;
        !           811:                peer->maxpoll = peer2->maxpoll;
        !           812:                break;
        !           813: 
        !           814:        /*
        !           815:         * This is the first packet received from a broadcast server. If
        !           816:         * the packet is authentic and we are enabled as broadcast
        !           817:         * client, mobilize a broadcast client association. We don't
        !           818:         * kiss any frogs here.
        !           819:         */
        !           820:        case AM_NEWBCL:
        !           821:                if (sys_bclient == 0) {
        !           822:                        sys_restricted++;
        !           823:                        return;                 /* not enabled */
        !           824:                }
        !           825:                if (!AUTH(sys_authenticate | (restrict_mask &
        !           826:                    (RES_NOPEER | RES_DONTTRUST)), is_authentic)) {
        !           827:                        sys_restricted++;
        !           828:                        return;                 /* access denied */
        !           829:                }
        !           830: 
        !           831:                /*
        !           832:                 * Do not respond if unsynchronized or stratum is below
        !           833:                 * the floor or at or above the ceiling.
        !           834:                 */
        !           835:                if (hisleap == LEAP_NOTINSYNC || hisstratum <
        !           836:                    sys_floor || hisstratum >= sys_ceiling) {
        !           837:                        sys_declined++;
        !           838:                        return;                 /* no help */
        !           839:                }
        !           840: 
        !           841: #ifdef OPENSSL
        !           842:                /*
        !           843:                 * Do not respond if Autokey and the opcode is not a
        !           844:                 * CRYPTO_ASSOC response with associationn ID.
        !           845:                 */
        !           846:                if (crypto_flags && skeyid > NTP_MAXKEY && (opcode &
        !           847:                    0xffff0000) != (CRYPTO_ASSOC | CRYPTO_RESP)) {
        !           848:                        sys_declined++;
        !           849:                        return;                 /* protocol error */
        !           850:                }
        !           851: #endif /* OPENSSL */
        !           852: 
        !           853:                /*
        !           854:                 * Broadcasts received via a multicast address may
        !           855:                 * arrive after a unicast volley has begun
        !           856:                 * with the same remote address.  newpeer() will not
        !           857:                 * find duplicate associations on other local endpoints
        !           858:                 * if a non-NULL endpoint is supplied.  multicastclient
        !           859:                 * ephemeral associations are unique across all local
        !           860:                 * endpoints.
        !           861:                 */
        !           862:                if (!(INT_MCASTOPEN & rbufp->dstadr->flags))
        !           863:                        match_ep = rbufp->dstadr;
        !           864:                else
        !           865:                        match_ep = NULL;
        !           866: 
        !           867:                /*
        !           868:                 * Determine whether to execute the initial volley.
        !           869:                 */
        !           870:                if (sys_bdelay != 0) {
        !           871: #ifdef OPENSSL
        !           872:                        /*
        !           873:                         * If a two-way exchange is not possible,
        !           874:                         * neither is Autokey.
        !           875:                         */
        !           876:                        if (crypto_flags && skeyid > NTP_MAXKEY) {
        !           877:                                sys_restricted++;
        !           878:                                return;         /* no autokey */
        !           879:                        }
        !           880: #endif /* OPENSSL */
        !           881: 
        !           882:                        /*
        !           883:                         * Do not execute the volley. Start out in
        !           884:                         * broadcast client mode.
        !           885:                         */
        !           886:                        peer = newpeer(&rbufp->recv_srcadr, match_ep,
        !           887:                            MODE_BCLIENT, hisversion, pkt->ppoll,
        !           888:                            pkt->ppoll, FLAG_PREEMPT, MDF_BCLNT, 0,
        !           889:                            skeyid);
        !           890:                        if (NULL == peer) {
        !           891:                                sys_restricted++;
        !           892:                                return;         /* ignore duplicate */
        !           893: 
        !           894:                        } else {
        !           895:                                peer->delay = sys_bdelay;
        !           896:                                peer->bias = -sys_bdelay / 2.;
        !           897:                        }
        !           898:                        break;
        !           899:                }
        !           900: 
        !           901:                /*
        !           902:                 * Execute the initial volley in order to calibrate the
        !           903:                 * propagation delay and run the Autokey protocol.
        !           904:                 *
        !           905:                 * Note that the minpoll is taken from the broadcast
        !           906:                 * packet, normally 6 (64 s) and that the poll interval
        !           907:                 * is fixed at this value.
        !           908:                 */
        !           909:                peer = newpeer(&rbufp->recv_srcadr, match_ep,
        !           910:                    MODE_CLIENT, hisversion, pkt->ppoll, pkt->ppoll,
        !           911:                    FLAG_BC_VOL | FLAG_IBURST | FLAG_PREEMPT, MDF_BCLNT,
        !           912:                    0, skeyid);
        !           913:                if (NULL == peer) {
        !           914:                        sys_restricted++;
        !           915:                        return;                 /* ignore duplicate */
        !           916:                }
        !           917: #ifdef OPENSSL
        !           918:                if (skeyid > NTP_MAXKEY)
        !           919:                        crypto_recv(peer, rbufp);
        !           920: #endif /* OPENSSL */
        !           921: 
        !           922:                return;                         /* hooray */
        !           923: 
        !           924:        /*
        !           925:         * This is the first packet received from a symmetric active
        !           926:         * peer. If the packet is authentic and the first he sent,
        !           927:         * mobilize a passive association. If not, kiss the frog.
        !           928:         */
        !           929:        case AM_NEWPASS:
        !           930:                if (!AUTH(sys_authenticate | (restrict_mask &
        !           931:                    (RES_NOPEER | RES_DONTTRUST)), is_authentic)) {
        !           932: 
        !           933:                        /*
        !           934:                         * If authenticated but cannot mobilize an
        !           935:                         * association, send a symmetric passive
        !           936:                         * response without mobilizing an association.
        !           937:                         * This is for drat broken Windows clients. See
        !           938:                         * Microsoft KB 875424 for preferred workaround.
        !           939:                         */
        !           940:                        if (AUTH(restrict_mask & RES_DONTTRUST,
        !           941:                            is_authentic)) {
        !           942:                                fast_xmit(rbufp, MODE_PASSIVE, skeyid,
        !           943:                                    restrict_mask);
        !           944:                                return;                 /* hooray */
        !           945:                        }
        !           946:                        if (is_authentic == AUTH_ERROR) {
        !           947:                                fast_xmit(rbufp, MODE_ACTIVE, 0,
        !           948:                                    restrict_mask);
        !           949:                                sys_restricted++;
        !           950:                        }
        !           951:                }
        !           952: 
        !           953:                /*
        !           954:                 * Do not respond if synchronized and stratum is either
        !           955:                 * below the floor or at or above the ceiling. Note,
        !           956:                 * this allows an unsynchronized peer to synchronize to
        !           957:                 * us. It would be very strange if he did and then was
        !           958:                 * nipped, but that could only happen if we were
        !           959:                 * operating at the top end of the range.
        !           960:                 */
        !           961:                if (hisleap != LEAP_NOTINSYNC && (hisstratum <
        !           962:                    sys_floor || hisstratum >= sys_ceiling)) {
        !           963:                        sys_declined++;
        !           964:                        return;                 /* no help */
        !           965:                }
        !           966: 
        !           967:                /*
        !           968:                 * The message is correctly authenticated and
        !           969:                 * allowed. Mobiliae a symmetric passive association.
        !           970:                 */
        !           971:                if ((peer = newpeer(&rbufp->recv_srcadr,
        !           972:                    rbufp->dstadr, MODE_PASSIVE, hisversion, pkt->ppoll,
        !           973:                    NTP_MAXDPOLL, FLAG_PREEMPT, MDF_UCAST, 0,
        !           974:                    skeyid)) == NULL) {
        !           975:                        sys_declined++;
        !           976:                        return;                 /* ignore duplicate */
        !           977:                }
        !           978:                break;
        !           979: 
        !           980: 
        !           981:        /*
        !           982:         * Process regular packet. Nothing special.
        !           983:         */
        !           984:        case AM_PROCPKT:
        !           985:                break;
        !           986: 
        !           987:        /*
        !           988:         * A passive packet matches a passive association. This is
        !           989:         * usually the result of reconfiguring a client on the fly. As
        !           990:         * this association might be legitamate and this packet an
        !           991:         * attempt to deny service, just ignore it.
        !           992:         */
        !           993:        case AM_ERR:
        !           994:                sys_declined++;
        !           995:                return;
        !           996: 
        !           997:        /*
        !           998:         * For everything else there is the bit bucket.
        !           999:         */
        !          1000:        default:
        !          1001:                sys_declined++;
        !          1002:                return;
        !          1003:        }
        !          1004: 
        !          1005: #ifdef OPENSSL
        !          1006:        /*
        !          1007:         * If the association is configured for Autokey, the packet must
        !          1008:         * have a public key ID; if not, the packet must have a
        !          1009:         * symmetric key ID.
        !          1010:         */
        !          1011:        if (is_authentic != AUTH_CRYPTO && (((peer->flags &
        !          1012:            FLAG_SKEY) && skeyid <= NTP_MAXKEY) || (!(peer->flags &
        !          1013:            FLAG_SKEY) && skeyid > NTP_MAXKEY))) {
        !          1014:                sys_badauth++;
        !          1015:                return;
        !          1016:        }
        !          1017: #endif /* OPENSSL */
        !          1018:        peer->received++;
        !          1019:        peer->flash &= ~PKT_TEST_MASK;
        !          1020:        if (peer->flags & FLAG_XBOGUS) {
        !          1021:                peer->flags &= ~FLAG_XBOGUS;
        !          1022:                peer->flash |= TEST3;
        !          1023:        }
        !          1024: 
        !          1025:        /*
        !          1026:         * Next comes a rigorous schedule of timestamp checking. If the
        !          1027:         * transmit timestamp is zero, the server has not initialized in
        !          1028:         * interleaved modes or is horribly broken.
        !          1029:         */
        !          1030:        if (L_ISZERO(&p_xmt)) {
        !          1031:                peer->flash |= TEST3;                   /* unsynch */
        !          1032: 
        !          1033:        /*
        !          1034:         * If the transmit timestamp duplicates a previous one, the
        !          1035:         * packet is a replay. This prevents the bad guys from replaying
        !          1036:         * the most recent packet, authenticated or not.
        !          1037:         */
        !          1038:        } else if (L_ISEQU(&peer->xmt, &p_xmt)) {
        !          1039:                peer->flash |= TEST1;                   /* duplicate */
        !          1040:                peer->oldpkt++;
        !          1041:                return;
        !          1042: 
        !          1043:        /*
        !          1044:         * If this is a broadcast mode packet, skip further checking. If
        !          1045:         * an intial volley, bail out now and let the client do its
        !          1046:         * stuff. If the origin timestamp is nonzero, this is an
        !          1047:         * interleaved broadcast. so restart the protocol.
        !          1048:         */
        !          1049:        } else if (hismode == MODE_BROADCAST) {
        !          1050:                if (!L_ISZERO(&p_org) && !(peer->flags & FLAG_XB)) {
        !          1051:                        peer->flags |= FLAG_XB;
        !          1052:                        peer->aorg = p_xmt;
        !          1053:                        peer->borg = rbufp->recv_time;
        !          1054:                        report_event(PEVNT_XLEAVE, peer, NULL);
        !          1055:                        return;
        !          1056:                }
        !          1057: 
        !          1058:        /*
        !          1059:         * Check for bogus packet in basic mode. If found, switch to
        !          1060:         * interleaved mode and resynchronize, but only after confirming
        !          1061:         * the packet is not bogus in symmetric interleaved mode.
        !          1062:         */
        !          1063:        } else if (peer->flip == 0) {
        !          1064:                if (!L_ISEQU(&p_org, &peer->aorg)) {
        !          1065:                        peer->bogusorg++;
        !          1066:                        peer->flash |= TEST2;   /* bogus */
        !          1067:                        if (!L_ISZERO(&peer->dst) && L_ISEQU(&p_org,
        !          1068:                            &peer->dst)) {
        !          1069:                                peer->flip = 1;
        !          1070:                                report_event(PEVNT_XLEAVE, peer, NULL);
        !          1071:                        }
        !          1072:                } else {
        !          1073:                        L_CLR(&peer->aorg);
        !          1074:                }
        !          1075: 
        !          1076:        /*
        !          1077:         * Check for valid nonzero timestamp fields.
        !          1078:         */
        !          1079:        } else if (L_ISZERO(&p_org) || L_ISZERO(&p_rec) ||
        !          1080:            L_ISZERO(&peer->dst)) {
        !          1081:                peer->flash |= TEST3;           /* unsynch */
        !          1082: 
        !          1083:        /*
        !          1084:         * Check for bogus packet in interleaved symmetric mode. This
        !          1085:         * can happen if a packet is lost, duplicat or crossed. If
        !          1086:         * found, flip and resynchronize.
        !          1087:         */
        !          1088:        } else if (!L_ISZERO(&peer->dst) && !L_ISEQU(&p_org,
        !          1089:                    &peer->dst)) {
        !          1090:                        peer->bogusorg++;
        !          1091:                        peer->flags |= FLAG_XBOGUS;
        !          1092:                        peer->flash |= TEST2;           /* bogus */
        !          1093:        }
        !          1094: 
        !          1095:        /*
        !          1096:         * Update the state variables.
        !          1097:         */
        !          1098:        if (peer->flip == 0) {
        !          1099:                if (hismode != MODE_BROADCAST)
        !          1100:                        peer->rec = p_xmt;
        !          1101:                peer->dst = rbufp->recv_time;
        !          1102:        }
        !          1103:        peer->xmt = p_xmt;
        !          1104: 
        !          1105:        /*
        !          1106:         * If this is a crypto_NAK, the server cannot authenticate a
        !          1107:         * client packet. The server might have just changed keys. Clear
        !          1108:         * the association and restart the protocol.
        !          1109:         */
        !          1110:        if (is_authentic == AUTH_CRYPTO) {
        !          1111:                report_event(PEVNT_AUTH, peer, "crypto_NAK");
        !          1112:                peer->flash |= TEST5;           /* bad auth */
        !          1113:                peer->badauth++;
        !          1114:                if (peer->flags & FLAG_PREEMPT) {
        !          1115:                        unpeer(peer);
        !          1116:                        return;
        !          1117:                }
        !          1118: #ifdef OPENSSL
        !          1119:                if (peer->crypto)
        !          1120:                        peer_clear(peer, "AUTH");
        !          1121: #endif /* OPENSSL */
        !          1122:                return;
        !          1123: 
        !          1124:        /* 
        !          1125:         * If the digest fails, the client cannot authenticate a server
        !          1126:         * reply to a client packet previously sent. The loopback check
        !          1127:         * is designed to avoid a bait-and-switch attack, which was
        !          1128:         * possible in past versions. If symmetric modes, return a
        !          1129:         * crypto-NAK. The peer should restart the protocol.
        !          1130:         */
        !          1131:        } else if (!AUTH(has_mac || (restrict_mask & RES_DONTTRUST),
        !          1132:            is_authentic)) {
        !          1133:                report_event(PEVNT_AUTH, peer, "digest");
        !          1134:                peer->flash |= TEST5;           /* bad auth */
        !          1135:                peer->badauth++;
        !          1136:                if (hismode == MODE_ACTIVE || hismode == MODE_PASSIVE)
        !          1137:                        fast_xmit(rbufp, MODE_ACTIVE, 0, restrict_mask);
        !          1138:                if (peer->flags & FLAG_PREEMPT) {
        !          1139:                        unpeer(peer);
        !          1140:                        return;
        !          1141:                }
        !          1142: #ifdef OPENSSL
        !          1143:                if (peer->crypto)
        !          1144:                        peer_clear(peer, "AUTH");
        !          1145: #endif /* OPENSSL */
        !          1146:                return;
        !          1147:        }
        !          1148: 
        !          1149:        /*
        !          1150:         * Set the peer ppoll to the maximum of the packet ppoll and the
        !          1151:         * peer minpoll. If a kiss-o'-death, set the peer minpoll to
        !          1152:         * this maximumn and advance the headway to give the sender some
        !          1153:         * headroom. Very intricate.
        !          1154:         */
        !          1155:        peer->ppoll = max(peer->minpoll, pkt->ppoll);
        !          1156:        if (hismode == MODE_SERVER && hisleap == LEAP_NOTINSYNC &&
        !          1157:            hisstratum == STRATUM_UNSPEC && memcmp(&pkt->refid,
        !          1158:            "RATE", 4) == 0) {
        !          1159:                peer->selbroken++;
        !          1160:                report_event(PEVNT_RATE, peer, NULL);
        !          1161:                if (pkt->ppoll > peer->minpoll)
        !          1162:                        peer->minpoll = peer->ppoll;
        !          1163:                peer->burst = peer->retry = 0;
        !          1164:                peer->throttle = (NTP_SHIFT + 1) * (1 << peer->minpoll);
        !          1165:                poll_update(peer, pkt->ppoll);
        !          1166:                return;                         /* kiss-o'-death */
        !          1167:        }
        !          1168: 
        !          1169:        /*
        !          1170:         * That was hard and I am sweaty, but the packet is squeaky
        !          1171:         * clean. Get on with real work.
        !          1172:         */
        !          1173:        peer->timereceived = current_time;
        !          1174:        if (is_authentic == AUTH_OK)
        !          1175:                peer->flags |= FLAG_AUTHENTIC;
        !          1176:        else
        !          1177:                peer->flags &= ~FLAG_AUTHENTIC;
        !          1178: 
        !          1179: #ifdef OPENSSL
        !          1180:        /*
        !          1181:         * More autokey dance. The rules of the cha-cha are as follows:
        !          1182:         *
        !          1183:         * 1. If there is no key or the key is not auto, do nothing.
        !          1184:         *
        !          1185:         * 2. If this packet is in response to the one just previously
        !          1186:         *    sent or from a broadcast server, do the extension fields.
        !          1187:         *    Otherwise, assume bogosity and bail out.
        !          1188:         *
        !          1189:         * 3. If an extension field contains a verified signature, it is
        !          1190:         *    self-authenticated and we sit the dance.
        !          1191:         *
        !          1192:         * 4. If this is a server reply, check only to see that the
        !          1193:         *    transmitted key ID matches the received key ID.
        !          1194:         *
        !          1195:         * 5. Check to see that one or more hashes of the current key ID
        !          1196:         *    matches the previous key ID or ultimate original key ID
        !          1197:         *    obtained from the broadcaster or symmetric peer. If no
        !          1198:         *    match, sit the dance and call for new autokey values.
        !          1199:         *
        !          1200:         * In case of crypto error, fire the orchestra, stop dancing and
        !          1201:         * restart the protocol.
        !          1202:         */
        !          1203:        if (peer->flags & FLAG_SKEY) {
        !          1204:                /*
        !          1205:                 * Decrement remaining audokey hashes. This isn't
        !          1206:                 * perfect if a packet is lost, but results in no harm.
        !          1207:                 */
        !          1208:                ap = (struct autokey *)peer->recval.ptr;
        !          1209:                if (ap != NULL) {
        !          1210:                        if (ap->seq > 0)
        !          1211:                                ap->seq--;
        !          1212:                }
        !          1213:                peer->flash |= TEST8;
        !          1214:                rval = crypto_recv(peer, rbufp);
        !          1215:                if (rval == XEVNT_OK) {
        !          1216:                        peer->unreach = 0;
        !          1217:                } else {
        !          1218:                        if (rval == XEVNT_ERR) {
        !          1219:                                report_event(PEVNT_RESTART, peer,
        !          1220:                                    "crypto error");
        !          1221:                                peer_clear(peer, "CRYP");
        !          1222:                                peer->flash |= TEST9;   /* bad crypt */
        !          1223:                                if (peer->flags & FLAG_PREEMPT)
        !          1224:                                        unpeer(peer);
        !          1225:                        }
        !          1226:                        return;
        !          1227:                }
        !          1228: 
        !          1229:                /*
        !          1230:                 * If server mode, verify the receive key ID matches
        !          1231:                 * the transmit key ID.
        !          1232:                 */
        !          1233:                if (hismode == MODE_SERVER) {
        !          1234:                        if (skeyid == peer->keyid)
        !          1235:                                peer->flash &= ~TEST8;
        !          1236: 
        !          1237:                /*
        !          1238:                 * If an extension field is present, verify only that it
        !          1239:                 * has been correctly signed. We don't need a sequence
        !          1240:                 * check here, but the sequence continues.
        !          1241:                 */
        !          1242:                } else if (!(peer->flash & TEST8)) {
        !          1243:                        peer->pkeyid = skeyid;
        !          1244: 
        !          1245:                /*
        !          1246:                 * Now the fun part. Here, skeyid is the current ID in
        !          1247:                 * the packet, pkeyid is the ID in the last packet and
        !          1248:                 * tkeyid is the hash of skeyid. If the autokey values
        !          1249:                 * have not been received, this is an automatic error.
        !          1250:                 * If so, check that the tkeyid matches pkeyid. If not,
        !          1251:                 * hash tkeyid and try again. If the number of hashes
        !          1252:                 * exceeds the number remaining in the sequence, declare
        !          1253:                 * a successful failure and refresh the autokey values.
        !          1254:                 */
        !          1255:                } else if (ap != NULL) {
        !          1256:                        int i;
        !          1257: 
        !          1258:                        for (i = 0; ; i++) {
        !          1259:                                if (tkeyid == peer->pkeyid ||
        !          1260:                                    tkeyid == ap->key) {
        !          1261:                                        peer->flash &= ~TEST8;
        !          1262:                                        peer->pkeyid = skeyid;
        !          1263:                                        ap->seq -= i;
        !          1264:                                        break;
        !          1265:                                }
        !          1266:                                if (i > ap->seq) {
        !          1267:                                        peer->crypto &=
        !          1268:                                            ~CRYPTO_FLAG_AUTO;
        !          1269:                                        break;
        !          1270:                                }
        !          1271:                                tkeyid = session_key(
        !          1272:                                    &rbufp->recv_srcadr, dstadr_sin,
        !          1273:                                    tkeyid, pkeyid, 0);
        !          1274:                        }
        !          1275:                        if (peer->flash & TEST8)
        !          1276:                                report_event(PEVNT_AUTH, peer, "keylist");
        !          1277:                }
        !          1278:                if (!(peer->crypto & CRYPTO_FLAG_PROV)) /* test 9 */
        !          1279:                        peer->flash |= TEST8;   /* bad autokey */
        !          1280: 
        !          1281:                /*
        !          1282:                 * The maximum lifetime of the protocol is about one
        !          1283:                 * week before restarting the Autokey protocol to
        !          1284:                 * refreshed certificates and leapseconds values.
        !          1285:                 */
        !          1286:                if (current_time > peer->refresh) {
        !          1287:                        report_event(PEVNT_RESTART, peer,
        !          1288:                            "crypto refresh");
        !          1289:                        peer_clear(peer, "TIME");
        !          1290:                        return;
        !          1291:                }
        !          1292:        }
        !          1293: #endif /* OPENSSL */
        !          1294: 
        !          1295:        /*
        !          1296:         * The dance is complete and the flash bits have been lit. Toss
        !          1297:         * the packet over the fence for processing, which may light up
        !          1298:         * more flashers.
        !          1299:         */
        !          1300:        process_packet(peer, pkt, rbufp->recv_length);
        !          1301: 
        !          1302:        /*
        !          1303:         * In interleaved mode update the state variables. Also adjust the
        !          1304:         * transmit phase to avoid crossover.
        !          1305:         */
        !          1306:        if (peer->flip != 0) {
        !          1307:                peer->rec = p_rec;
        !          1308:                peer->dst = rbufp->recv_time;
        !          1309:                if (peer->nextdate - current_time < (1 << min(peer->ppoll,
        !          1310:                    peer->hpoll)) / 2)
        !          1311:                        peer->nextdate++;
        !          1312:                else
        !          1313:                        peer->nextdate--;
        !          1314:        }
        !          1315: }
        !          1316: 
        !          1317: 
        !          1318: /*
        !          1319:  * process_packet - Packet Procedure, a la Section 3.4.4 of the
        !          1320:  *     specification. Or almost, at least. If we're in here we have a
        !          1321:  *     reasonable expectation that we will be having a long term
        !          1322:  *     relationship with this host.
        !          1323:  */
        !          1324: void
        !          1325: process_packet(
        !          1326:        register struct peer *peer,
        !          1327:        register struct pkt *pkt,
        !          1328:        u_int   len
        !          1329:        )
        !          1330: {
        !          1331:        double  t34, t21;
        !          1332:        double  p_offset, p_del, p_disp;
        !          1333:        l_fp    p_rec, p_xmt, p_org, p_reftime, ci;
        !          1334:        u_char  pmode, pleap, pstratum;
        !          1335:        char    statstr[NTP_MAXSTRLEN];
        !          1336: #ifdef ASSYM
        !          1337:        int     itemp;
        !          1338:        double  etemp, ftemp, td;
        !          1339: #endif /* ASSYM */
        !          1340: 
        !          1341:        sys_processed++;
        !          1342:        peer->processed++;
        !          1343:        p_del = FPTOD(NTOHS_FP(pkt->rootdelay));
        !          1344:        p_offset = 0;
        !          1345:        p_disp = FPTOD(NTOHS_FP(pkt->rootdisp));
        !          1346:        NTOHL_FP(&pkt->reftime, &p_reftime);
        !          1347:        NTOHL_FP(&pkt->org, &p_org);
        !          1348:        NTOHL_FP(&pkt->rec, &p_rec);
        !          1349:        NTOHL_FP(&pkt->xmt, &p_xmt);
        !          1350:        pmode = PKT_MODE(pkt->li_vn_mode);
        !          1351:        pleap = PKT_LEAP(pkt->li_vn_mode);
        !          1352:        pstratum = PKT_TO_STRATUM(pkt->stratum);
        !          1353: 
        !          1354:        /*
        !          1355:         * Capture the header values in the client/peer association..
        !          1356:         */
        !          1357:        record_raw_stats(&peer->srcadr, peer->dstadr ?
        !          1358:            &peer->dstadr->sin : NULL, &p_org, &p_rec, &p_xmt,
        !          1359:            &peer->dst);
        !          1360:        peer->leap = pleap;
        !          1361:        peer->stratum = min(pstratum, STRATUM_UNSPEC);
        !          1362:        peer->pmode = pmode;
        !          1363:        peer->precision = pkt->precision;
        !          1364:        peer->rootdelay = p_del;
        !          1365:        peer->rootdisp = p_disp;
        !          1366:        peer->refid = pkt->refid;               /* network byte order */
        !          1367:        peer->reftime = p_reftime;
        !          1368: 
        !          1369:        /*
        !          1370:         * First, if either burst mode is armed, enable the burst.
        !          1371:         * Compute the headway for the next packet and delay if
        !          1372:         * necessary to avoid exceeding the threshold.
        !          1373:         */
        !          1374:        if (peer->retry > 0) {
        !          1375:                peer->retry = 0;
        !          1376:                if (peer->reach)
        !          1377:                        peer->burst = min(1 << (peer->hpoll -
        !          1378:                            peer->minpoll), NTP_SHIFT) - 1;
        !          1379:                else
        !          1380:                        peer->burst = NTP_IBURST - 1;
        !          1381:                if (peer->burst > 0)
        !          1382:                        peer->nextdate = current_time;
        !          1383:        }
        !          1384:        poll_update(peer, peer->hpoll);
        !          1385: 
        !          1386:        /*
        !          1387:         * Verify the server is synchronized; that is, the leap bits,
        !          1388:         * stratum and root distance are valid.
        !          1389:         */
        !          1390:        if (pleap == LEAP_NOTINSYNC ||          /* test 6 */
        !          1391:            pstratum < sys_floor || pstratum >= sys_ceiling)
        !          1392:                peer->flash |= TEST6;           /* bad synch or strat */
        !          1393:        if (p_del / 2 + p_disp >= MAXDISPERSE)  /* test 7 */
        !          1394:                peer->flash |= TEST7;           /* bad header */
        !          1395: 
        !          1396:        /*
        !          1397:         * If any tests fail at this point, the packet is discarded.
        !          1398:         * Note that some flashers may have already been set in the
        !          1399:         * receive() routine.
        !          1400:         */
        !          1401:        if (peer->flash & PKT_TEST_MASK) {
        !          1402:                peer->seldisptoolarge++;
        !          1403: #ifdef DEBUG
        !          1404:                if (debug)
        !          1405:                        printf("packet: flash header %04x\n",
        !          1406:                            peer->flash);
        !          1407: #endif
        !          1408:                return;
        !          1409:        }
        !          1410: 
        !          1411:        /*
        !          1412:         * If the peer was previously unreachable, raise a trap. In any
        !          1413:         * case, mark it reachable.
        !          1414:         */ 
        !          1415:        if (!peer->reach) {
        !          1416:                report_event(PEVNT_REACH, peer, NULL);
        !          1417:                peer->timereachable = current_time;
        !          1418:        }
        !          1419:        peer->reach |= 1;
        !          1420: 
        !          1421:        /*
        !          1422:         * For a client/server association, calculate the clock offset,
        !          1423:         * roundtrip delay and dispersion. The equations are reordered
        !          1424:         * from the spec for more efficient use of temporaries. For a
        !          1425:         * broadcast association, offset the last measurement by the
        !          1426:         * computed delay during the client/server volley. Note the
        !          1427:         * computation of dispersion includes the system precision plus
        !          1428:         * that due to the frequency error since the origin time.
        !          1429:         *
        !          1430:         * It is very important to respect the hazards of overflow. The
        !          1431:         * only permitted operation on raw timestamps is subtraction,
        !          1432:         * where the result is a signed quantity spanning from 68 years
        !          1433:         * in the past to 68 years in the future. To avoid loss of
        !          1434:         * precision, these calculations are done using 64-bit integer
        !          1435:         * arithmetic. However, the offset and delay calculations are
        !          1436:         * sums and differences of these first-order differences, which
        !          1437:         * if done using 64-bit integer arithmetic, would be valid over
        !          1438:         * only half that span. Since the typical first-order
        !          1439:         * differences are usually very small, they are converted to 64-
        !          1440:         * bit doubles and all remaining calculations done in floating-
        !          1441:         * double arithmetic. This preserves the accuracy while
        !          1442:         * retaining the 68-year span.
        !          1443:         *
        !          1444:         * There are three interleaving schemes, basic, interleaved
        !          1445:         * symmetric and interleaved broadcast. The timestamps are
        !          1446:         * idioscyncratically different. See the onwire briefing/white
        !          1447:         * paper at www.eecis.udel.edu/~mills for details.
        !          1448:         *
        !          1449:         * Interleaved symmetric mode
        !          1450:         * t1 = peer->aorg/borg, t2 = peer->rec, t3 = p_xmt,
        !          1451:         * t4 = peer->dst
        !          1452:         */
        !          1453:        if (peer->flip != 0) {
        !          1454:                ci = p_xmt;                             /* t3 - t4 */
        !          1455:                L_SUB(&ci, &peer->dst);
        !          1456:                LFPTOD(&ci, t34);
        !          1457:                ci = p_rec;                             /* t2 - t1 */
        !          1458:                if (peer->flip > 0)
        !          1459:                        L_SUB(&ci, &peer->borg);
        !          1460:                else
        !          1461:                        L_SUB(&ci, &peer->aorg);
        !          1462:                LFPTOD(&ci, t21);
        !          1463:                p_del = t21 - t34;
        !          1464:                p_offset = (t21 + t34) / 2.;
        !          1465:                if (p_del < 0 || p_del > 1.) {
        !          1466:                        sprintf(statstr, "t21 %.6f t34 %.6f", t21, t34);
        !          1467:                        report_event(PEVNT_XERR, peer, statstr);
        !          1468:                        return;
        !          1469:                }
        !          1470: 
        !          1471:        /*
        !          1472:         * Broadcast modes
        !          1473:         */
        !          1474:        } else if (peer->pmode == MODE_BROADCAST) {
        !          1475: 
        !          1476:                /*
        !          1477:                 * Interleaved broadcast mode. Use interleaved timestamps.
        !          1478:                 * t1 = peer->borg, t2 = p_org, t3 = p_org, t4 = aorg
        !          1479:                 */
        !          1480:                if (peer->flags & FLAG_XB) { 
        !          1481:                        ci = p_org;                     /* delay */ 
        !          1482:                        L_SUB(&ci, &peer->aorg);
        !          1483:                        LFPTOD(&ci, t34);
        !          1484:                        ci = p_org;                     /* t2 - t1 */
        !          1485:                        L_SUB(&ci, &peer->borg);
        !          1486:                        LFPTOD(&ci, t21);
        !          1487:                        peer->aorg = p_xmt;
        !          1488:                        peer->borg = peer->dst;
        !          1489:                        if (t34 < 0 || t34 > 1.) {
        !          1490:                                sprintf(statstr,
        !          1491:                                    "offset %.6f delay %.6f", t21, t34);
        !          1492:                                report_event(PEVNT_XERR, peer, statstr);
        !          1493:                                return;
        !          1494:                        }
        !          1495:                        p_offset = t21;
        !          1496:                        peer->xleave = t34;
        !          1497: 
        !          1498:                /*
        !          1499:                 * Basic broadcast - use direct timestamps.
        !          1500:                 * t3 = p_xmt, t4 = peer->dst
        !          1501:                 */
        !          1502:                } else {
        !          1503:                        ci = p_xmt;             /* t3 - t4 */
        !          1504:                        L_SUB(&ci, &peer->dst);
        !          1505:                        LFPTOD(&ci, t34);
        !          1506:                        p_offset = t34;
        !          1507:                }
        !          1508: 
        !          1509:                /*
        !          1510:                 * When calibration is complete and the clock is
        !          1511:                 * synchronized, the bias is calculated as the difference
        !          1512:                 * between the unicast timestamp and the broadcast
        !          1513:                 * timestamp. This works for both basic and interleaved
        !          1514:                 * modes.
        !          1515:                 */
        !          1516:                if (FLAG_BC_VOL & peer->flags) {
        !          1517:                        peer->flags &= ~FLAG_BC_VOL;
        !          1518:                        peer->delay = (peer->offset - p_offset) * 2;
        !          1519:                }
        !          1520:                p_del = peer->delay;
        !          1521:                p_offset += p_del / 2;
        !          1522: 
        !          1523: 
        !          1524:        /*
        !          1525:         * Basic mode, otherwise known as the old fashioned way.
        !          1526:         *
        !          1527:         * t1 = p_org, t2 = p_rec, t3 = p_xmt, t4 = peer->dst
        !          1528:         */
        !          1529:        } else {
        !          1530:                ci = p_xmt;                             /* t3 - t4 */
        !          1531:                L_SUB(&ci, &peer->dst);
        !          1532:                LFPTOD(&ci, t34);
        !          1533:                ci = p_rec;                             /* t2 - t1 */
        !          1534:                L_SUB(&ci, &p_org);
        !          1535:                LFPTOD(&ci, t21);
        !          1536:                p_del = fabs(t21 - t34);
        !          1537:                p_offset = (t21 + t34) / 2.;
        !          1538:        }
        !          1539:        p_offset += peer->bias;
        !          1540:        p_disp = LOGTOD(sys_precision) + LOGTOD(peer->precision) +
        !          1541:            clock_phi * p_del;
        !          1542: 
        !          1543: #if ASSYM
        !          1544:        /*
        !          1545:         * This code calculates the outbound and inbound data rates by
        !          1546:         * measuring the differences between timestamps at different
        !          1547:         * packet lengths. This is helpful in cases of large asymmetric
        !          1548:         * delays commonly experienced on deep space communication
        !          1549:         * links.
        !          1550:         */
        !          1551:        if (peer->t21_last > 0 && peer->t34_bytes > 0) {
        !          1552:                itemp = peer->t21_bytes - peer->t21_last;
        !          1553:                if (itemp > 25) {
        !          1554:                        etemp = t21 - peer->t21;
        !          1555:                        if (fabs(etemp) > 1e-6) {
        !          1556:                                ftemp = itemp / etemp;
        !          1557:                                if (ftemp > 1000.)
        !          1558:                                        peer->r21 = ftemp;
        !          1559:                        }
        !          1560:                }
        !          1561:                itemp = len - peer->t34_bytes;
        !          1562:                if (itemp > 25) {
        !          1563:                        etemp = -t34 - peer->t34;
        !          1564:                        if (fabs(etemp) > 1e-6) {
        !          1565:                                ftemp = itemp / etemp;
        !          1566:                                if (ftemp > 1000.)
        !          1567:                                        peer->r34 = ftemp;
        !          1568:                        }
        !          1569:                }
        !          1570:        }
        !          1571: 
        !          1572:        /*
        !          1573:         * The following section compensates for different data rates on
        !          1574:         * the outbound (d21) and inbound (t34) directions. To do this,
        !          1575:         * it finds t such that r21 * t - r34 * (d - t) = 0, where d is
        !          1576:         * the roundtrip delay. Then it calculates the correction as a
        !          1577:         * fraction of d.
        !          1578:         */
        !          1579:        peer->t21 = t21;
        !          1580:        peer->t21_last = peer->t21_bytes;
        !          1581:        peer->t34 = -t34;
        !          1582:        peer->t34_bytes = len;
        !          1583: #ifdef DEBUG
        !          1584:        if (debug > 1)
        !          1585:                printf("packet: t21 %.9lf %d t34 %.9lf %d\n", peer->t21,
        !          1586:                    peer->t21_bytes, peer->t34, peer->t34_bytes);
        !          1587: #endif
        !          1588:        if (peer->r21 > 0 && peer->r34 > 0 && p_del > 0) {
        !          1589:                if (peer->pmode != MODE_BROADCAST)
        !          1590:                        td = (peer->r34 / (peer->r21 + peer->r34) -
        !          1591:                            .5) * p_del;
        !          1592:                else
        !          1593:                        td = 0;
        !          1594: 
        !          1595:                /*
        !          1596:                 * Unfortunately, in many cases the errors are
        !          1597:                 * unacceptable, so for the present the rates are not
        !          1598:                 * used. In future, we might find conditions where the
        !          1599:                 * calculations are useful, so this should be considered
        !          1600:                 * a work in progress.
        !          1601:                 */
        !          1602:                t21 -= td;
        !          1603:                t34 -= td;
        !          1604: #ifdef DEBUG
        !          1605:                if (debug > 1)
        !          1606:                        printf("packet: del %.6lf r21 %.1lf r34 %.1lf %.6lf\n",
        !          1607:                            p_del, peer->r21 / 1e3, peer->r34 / 1e3,
        !          1608:                            td);
        !          1609: #endif
        !          1610:        } 
        !          1611: #endif /* ASSYM */
        !          1612: 
        !          1613:        /*
        !          1614:         * That was awesome. Now hand off to the clock filter.
        !          1615:         */
        !          1616:        clock_filter(peer, p_offset, p_del, p_disp);
        !          1617: 
        !          1618:        /*
        !          1619:         * If we are in broadcast calibrate mode, return to broadcast
        !          1620:         * client mode when the client is fit and the autokey dance is
        !          1621:         * complete.
        !          1622:         */
        !          1623:        if ((FLAG_BC_VOL & peer->flags) && MODE_CLIENT == peer->hmode &&
        !          1624:            !(TEST11 & peer_unfit(peer))) {     /* distance exceeded */
        !          1625: #ifdef OPENSSL
        !          1626:                if (peer->flags & FLAG_SKEY) {
        !          1627:                        if (!(~peer->crypto & CRYPTO_FLAG_ALL))
        !          1628:                                peer->hmode = MODE_BCLIENT;
        !          1629:                } else {
        !          1630:                        peer->hmode = MODE_BCLIENT;
        !          1631:                }
        !          1632: #else /* OPENSSL */
        !          1633:                peer->hmode = MODE_BCLIENT;
        !          1634: #endif /* OPENSSL */
        !          1635:        }
        !          1636: }
        !          1637: 
        !          1638: 
        !          1639: /*
        !          1640:  * clock_update - Called at system process update intervals.
        !          1641:  */
        !          1642: static void
        !          1643: clock_update(
        !          1644:        struct peer *peer       /* peer structure pointer */
        !          1645:        )
        !          1646: {
        !          1647:        double  dtemp;
        !          1648:        l_fp    now;
        !          1649: #ifdef HAVE_LIBSCF_H
        !          1650:        char    *fmri;
        !          1651: #endif /* HAVE_LIBSCF_H */
        !          1652: 
        !          1653:        /*
        !          1654:         * Update the system state variables. We do this very carefully,
        !          1655:         * as the poll interval might need to be clamped differently.
        !          1656:         */
        !          1657:        sys_peer = peer;
        !          1658:        sys_epoch = peer->epoch;
        !          1659:        if (sys_poll < peer->minpoll)
        !          1660:                sys_poll = peer->minpoll;
        !          1661:        if (sys_poll > peer->maxpoll)
        !          1662:                sys_poll = peer->maxpoll;
        !          1663:        poll_update(peer, sys_poll);
        !          1664:        sys_stratum = min(peer->stratum + 1, STRATUM_UNSPEC);
        !          1665:        if (peer->stratum == STRATUM_REFCLOCK ||
        !          1666:            peer->stratum == STRATUM_UNSPEC)
        !          1667:                sys_refid = peer->refid;
        !          1668:        else
        !          1669:                sys_refid = addr2refid(&peer->srcadr);
        !          1670:        dtemp = sys_jitter + fabs(sys_offset) + peer->disp +
        !          1671:            (peer->delay + peer->rootdelay) / 2 + clock_phi *
        !          1672:            (current_time - peer->update);
        !          1673:        sys_rootdisp = dtemp + peer->rootdisp;
        !          1674:        sys_rootdelay = peer->delay + peer->rootdelay;
        !          1675:        sys_reftime = peer->dst;
        !          1676: 
        !          1677: #ifdef DEBUG
        !          1678:        if (debug)
        !          1679:                printf(
        !          1680:                    "clock_update: at %lu sample %lu associd %d\n",
        !          1681:                    current_time, peer->epoch, peer->associd);
        !          1682: #endif
        !          1683: 
        !          1684:        /*
        !          1685:         * Comes now the moment of truth. Crank the clock discipline and
        !          1686:         * see what comes out.
        !          1687:         */
        !          1688:        switch (local_clock(peer, sys_offset)) {
        !          1689: 
        !          1690:        /*
        !          1691:         * Clock exceeds panic threshold. Life as we know it ends.
        !          1692:         */
        !          1693:        case -1:
        !          1694: #ifdef HAVE_LIBSCF_H
        !          1695:                /*
        !          1696:                 * For Solaris enter the maintenance mode.
        !          1697:                 */
        !          1698:                if ((fmri = getenv("SMF_FMRI")) != NULL) {
        !          1699:                        if (smf_maintain_instance(fmri, 0) < 0) {
        !          1700:                                printf("smf_maintain_instance: %s\n",
        !          1701:                                    scf_strerror(scf_error()));
        !          1702:                                exit(1);
        !          1703:                        }
        !          1704:                        /*
        !          1705:                         * Sleep until SMF kills us.
        !          1706:                         */
        !          1707:                        for (;;)
        !          1708:                                pause();
        !          1709:                }
        !          1710: #endif /* HAVE_LIBSCF_H */
        !          1711:                exit (-1);
        !          1712:                /* not reached */
        !          1713: 
        !          1714:        /*
        !          1715:         * Clock was stepped. Flush all time values of all peers.
        !          1716:         */
        !          1717:        case 2:
        !          1718:                clear_all();
        !          1719:                sys_leap = LEAP_NOTINSYNC;
        !          1720:                sys_stratum = STRATUM_UNSPEC;
        !          1721:                memcpy(&sys_refid, "STEP", 4);
        !          1722:                sys_rootdelay = 0;
        !          1723:                sys_rootdisp = 0;
        !          1724:                L_CLR(&sys_reftime);
        !          1725:                sys_jitter = LOGTOD(sys_precision);
        !          1726:                leapsec = 0;
        !          1727:                break;
        !          1728: 
        !          1729:        /*
        !          1730:         * Clock was slewed. Handle the leapsecond stuff.
        !          1731:         */
        !          1732:        case 1:
        !          1733: 
        !          1734:                /*
        !          1735:                 * If this is the first time the clock is set, reset the
        !          1736:                 * leap bits. If crypto, the timer will goose the setup
        !          1737:                 * process.
        !          1738:                 */
        !          1739:                if (sys_leap == LEAP_NOTINSYNC) {
        !          1740:                        sys_leap = LEAP_NOWARNING;
        !          1741: #ifdef OPENSSL
        !          1742:                        if (crypto_flags)
        !          1743:                                crypto_update();
        !          1744: #endif /* OPENSSL */
        !          1745:                }
        !          1746: 
        !          1747:                /*
        !          1748:                 * If the leapseconds values are from file or network
        !          1749:                 * and the leap is in the future, schedule a leap at the
        !          1750:                 * given epoch. Otherwise, if the number of survivor
        !          1751:                 * leap bits is greater than half the number of
        !          1752:                 * survivors, schedule a leap for the end of the current
        !          1753:                 * month.
        !          1754:                 */
        !          1755:                get_systime(&now);
        !          1756:                if (leap_sec > 0) {
        !          1757:                        if (leap_sec > now.l_ui) {
        !          1758:                                sys_tai = leap_tai - 1;
        !          1759:                                if (leapsec == 0)
        !          1760:                                        report_event(EVNT_ARMED, NULL,
        !          1761:                                            NULL);
        !          1762:                                leapsec = leap_sec - now.l_ui;
        !          1763:                        } else {
        !          1764:                                sys_tai = leap_tai;
        !          1765:                        }
        !          1766:                        break;
        !          1767: 
        !          1768:                } else if (leap_vote > sys_survivors / 2) {
        !          1769:                        leap_peers = now.l_ui + leap_month(now.l_ui);
        !          1770:                        if (leap_peers > now.l_ui) {
        !          1771:                                if (leapsec == 0)
        !          1772:                                        report_event(PEVNT_ARMED, peer,
        !          1773:                                            NULL);
        !          1774:                                leapsec = leap_peers - now.l_ui;
        !          1775:                        }
        !          1776:                } else if (leapsec > 0) {
        !          1777:                        report_event(EVNT_DISARMED, NULL, NULL);
        !          1778:                        leapsec = 0;
        !          1779:                }
        !          1780:                break;
        !          1781: 
        !          1782:        /*
        !          1783:         * Popcorn spike or step threshold exceeded. Pretend it never
        !          1784:         * happened.
        !          1785:         */
        !          1786:        default:
        !          1787:                break;
        !          1788:        }
        !          1789: }
        !          1790: 
        !          1791: 
        !          1792: /*
        !          1793:  * poll_update - update peer poll interval
        !          1794:  */
        !          1795: void
        !          1796: poll_update(
        !          1797:        struct peer *peer,      /* peer structure pointer */
        !          1798:        int     mpoll
        !          1799:        )
        !          1800: {
        !          1801:        int     hpoll, minpkt;
        !          1802:        u_long  next, utemp;
        !          1803: 
        !          1804:        /*
        !          1805:         * This routine figures out when the next poll should be sent.
        !          1806:         * That turns out to be wickedly complicated. One problem is
        !          1807:         * that sometimes the time for the next poll is in the past when
        !          1808:         * the poll interval is reduced. We watch out for races here
        !          1809:         * between the receive process and the poll process.
        !          1810:         *
        !          1811:         * First, bracket the poll interval according to the type of
        !          1812:         * association and options. If a fixed interval is configured,
        !          1813:         * use minpoll. This primarily is for reference clocks, but
        !          1814:         * works for any association. Otherwise, clamp the poll interval
        !          1815:         * between minpoll and maxpoll.
        !          1816:         */
        !          1817:        if (peer->cast_flags & MDF_BCLNT)
        !          1818:                hpoll = peer->minpoll;
        !          1819:        else
        !          1820:                hpoll = max(min(peer->maxpoll, mpoll), peer->minpoll);
        !          1821: 
        !          1822: #ifdef OPENSSL
        !          1823:        /*
        !          1824:         * If during the crypto protocol the poll interval has changed,
        !          1825:         * the lifetimes in the key list are probably bogus. Purge the
        !          1826:         * the key list and regenerate it later.
        !          1827:         */
        !          1828:        if ((peer->flags & FLAG_SKEY) && hpoll != peer->hpoll)
        !          1829:                key_expire(peer);
        !          1830: #endif /* OPENSSL */
        !          1831:        peer->hpoll = hpoll;
        !          1832: 
        !          1833:        /*
        !          1834:         * There are three variables important for poll scheduling, the
        !          1835:         * current time (current_time), next scheduled time (nextdate)
        !          1836:         * and the earliest time (utemp). The earliest time is 2 s
        !          1837:         * seconds, but could be more due to rate management. When
        !          1838:         * sending in a burst, use the earliest time. When not in a
        !          1839:         * burst but with a reply pending, send at the earliest time
        !          1840:         * unless the next scheduled time has not advanced. This can
        !          1841:         * only happen if multiple replies are peinding in the same
        !          1842:         * response interval. Otherwise, send at the later of the next
        !          1843:         * scheduled time and the earliest time.
        !          1844:         *
        !          1845:         * Now we figure out if there is an override. If a burst is in
        !          1846:         * progress and we get called from the receive process, just
        !          1847:         * slink away. If called from the poll process, delay 1 s for a
        !          1848:         * reference clock, otherwise 2 s.
        !          1849:         */
        !          1850:        minpkt = 1 << ntp_minpkt;
        !          1851:        utemp = current_time + max(peer->throttle - (NTP_SHIFT - 1) *
        !          1852:            (1 << peer->minpoll), minpkt);
        !          1853:        if (peer->burst > 0) {
        !          1854:                if (peer->nextdate > current_time)
        !          1855:                        return;
        !          1856: #ifdef REFCLOCK
        !          1857:                else if (peer->flags & FLAG_REFCLOCK)
        !          1858:                        peer->nextdate = current_time + RESP_DELAY;
        !          1859: #endif /* REFCLOCK */
        !          1860:                else
        !          1861:                        peer->nextdate = utemp;
        !          1862: 
        !          1863: #ifdef OPENSSL
        !          1864:        /*
        !          1865:         * If a burst is not in progress and a crypto response message
        !          1866:         * is pending, delay 2 s, but only if this is a new interval.
        !          1867:         */
        !          1868:        } else if (peer->cmmd != NULL) {
        !          1869:                if (peer->nextdate > current_time) {
        !          1870:                        if (peer->nextdate + minpkt != utemp)
        !          1871:                                peer->nextdate = utemp;
        !          1872:                } else {
        !          1873:                        peer->nextdate = utemp;
        !          1874:                }
        !          1875: #endif /* OPENSSL */
        !          1876: 
        !          1877:        /*
        !          1878:         * The ordinary case. If a retry, use minpoll; if unreachable,
        !          1879:         * use host poll; otherwise, use the minimum of host and peer
        !          1880:         * polls; In other words, oversampling is okay but
        !          1881:         * understampling is evil. Use the maximum of this value and the
        !          1882:         * headway. If the average headway is greater than the headway
        !          1883:         * threshold, increase the headway by the minimum interval.
        !          1884:         */
        !          1885:        } else {
        !          1886:                if (peer->retry > 0)
        !          1887:                        hpoll = peer->minpoll;
        !          1888:                else if (!(peer->reach))
        !          1889:                        hpoll = peer->hpoll;
        !          1890:                else
        !          1891:                        hpoll = min(peer->ppoll, peer->hpoll);
        !          1892: #ifdef REFCLOCK
        !          1893:                if (peer->flags & FLAG_REFCLOCK)
        !          1894:                        next = 1 << hpoll;
        !          1895:                else
        !          1896:                        next = ((0x1000UL | (ntp_random() & 0x0ff)) <<
        !          1897:                            hpoll) >> 12;
        !          1898: #else /* REFCLOCK */
        !          1899:                next = ((0x1000UL | (ntp_random() & 0x0ff)) << hpoll) >>
        !          1900:                    12;
        !          1901: #endif /* REFCLOCK */
        !          1902:                next += peer->outdate;
        !          1903:                if (next > utemp)
        !          1904:                        peer->nextdate = next;
        !          1905:                else
        !          1906:                        peer->nextdate = utemp;
        !          1907:                hpoll = peer->throttle - (1 << peer->minpoll);
        !          1908:                if (hpoll > 0)
        !          1909:                        peer->nextdate += minpkt;
        !          1910:        }
        !          1911: #ifdef DEBUG
        !          1912:        if (debug > 1)
        !          1913:                printf("poll_update: at %lu %s poll %d burst %d retry %d head %d early %lu next %lu\n",
        !          1914:                    current_time, ntoa(&peer->srcadr), peer->hpoll,
        !          1915:                    peer->burst, peer->retry, peer->throttle,
        !          1916:                    utemp - current_time, peer->nextdate -
        !          1917:                    current_time);
        !          1918: #endif
        !          1919: }
        !          1920: 
        !          1921: 
        !          1922: /*
        !          1923:  * peer_clear - clear peer filter registers.  See Section 3.4.8 of the
        !          1924:  * spec.
        !          1925:  */
        !          1926: void
        !          1927: peer_clear(
        !          1928:        struct peer *peer,              /* peer structure */
        !          1929:        char    *ident                  /* tally lights */
        !          1930:        )
        !          1931: {
        !          1932:        int     i;
        !          1933: 
        !          1934: #ifdef OPENSSL
        !          1935:        /*
        !          1936:         * If cryptographic credentials have been acquired, toss them to
        !          1937:         * Valhalla. Note that autokeys are ephemeral, in that they are
        !          1938:         * tossed immediately upon use. Therefore, the keylist can be
        !          1939:         * purged anytime without needing to preserve random keys. Note
        !          1940:         * that, if the peer is purged, the cryptographic variables are
        !          1941:         * purged, too. This makes it much harder to sneak in some
        !          1942:         * unauthenticated data in the clock filter.
        !          1943:         */
        !          1944:        key_expire(peer);
        !          1945:        if (peer->iffval != NULL)
        !          1946:                BN_free(peer->iffval);
        !          1947:        value_free(&peer->cookval);
        !          1948:        value_free(&peer->recval);
        !          1949:        value_free(&peer->encrypt);
        !          1950:        value_free(&peer->sndval);
        !          1951:        if (peer->cmmd != NULL)
        !          1952:                free(peer->cmmd);
        !          1953:        if (peer->subject != NULL)
        !          1954:                free(peer->subject);
        !          1955:        if (peer->issuer != NULL)
        !          1956:                free(peer->issuer);
        !          1957: #endif /* OPENSSL */
        !          1958: 
        !          1959:        /*
        !          1960:         * Clear all values, including the optional crypto values above.
        !          1961:         */
        !          1962:        memset(CLEAR_TO_ZERO(peer), 0, LEN_CLEAR_TO_ZERO);
        !          1963:        peer->ppoll = peer->maxpoll;
        !          1964:        peer->hpoll = peer->minpoll;
        !          1965:        peer->disp = MAXDISPERSE;
        !          1966:        peer->flash = peer_unfit(peer);
        !          1967:        peer->jitter = LOGTOD(sys_precision);
        !          1968: 
        !          1969:        /*
        !          1970:         * If interleave mode, initialize the alternate origin switch.
        !          1971:         */
        !          1972:        if (peer->flags & FLAG_XLEAVE)
        !          1973:                peer->flip = 1;
        !          1974:        for (i = 0; i < NTP_SHIFT; i++) {
        !          1975:                peer->filter_order[i] = i;
        !          1976:                peer->filter_disp[i] = MAXDISPERSE;
        !          1977:        }
        !          1978: #ifdef REFCLOCK
        !          1979:        if (!(peer->flags & FLAG_REFCLOCK)) {
        !          1980:                peer->leap = LEAP_NOTINSYNC;
        !          1981:                peer->stratum = STRATUM_UNSPEC;
        !          1982:                memcpy(&peer->refid, ident, 4);
        !          1983:        }
        !          1984: #else
        !          1985:        peer->leap = LEAP_NOTINSYNC;
        !          1986:        peer->stratum = STRATUM_UNSPEC;
        !          1987:        memcpy(&peer->refid, ident, 4);
        !          1988: #endif /* REFCLOCK */
        !          1989: 
        !          1990:        /*
        !          1991:         * During initialization use the association count to spread out
        !          1992:         * the polls at one-second intervals. Otherwise, randomize over
        !          1993:         * the minimum poll interval in order to avoid broadcast
        !          1994:         * implosion.
        !          1995:         */
        !          1996:        peer->nextdate = peer->update = peer->outdate = current_time;
        !          1997:        if (initializing) {
        !          1998:                peer->nextdate += peer_associations;
        !          1999:        } else if (peer->hmode == MODE_PASSIVE) {
        !          2000:                peer->nextdate += 1 << ntp_minpkt;
        !          2001:        } else {
        !          2002:                peer->nextdate += ntp_random() % peer_associations;
        !          2003:        }
        !          2004: #ifdef OPENSSL
        !          2005:        peer->refresh = current_time + (1 << NTP_REFRESH);
        !          2006: #endif /* OPENSSL */
        !          2007: #ifdef DEBUG
        !          2008:        if (debug)
        !          2009:                printf(
        !          2010:                    "peer_clear: at %ld next %ld associd %d refid %s\n",
        !          2011:                    current_time, peer->nextdate, peer->associd,
        !          2012:                    ident);
        !          2013: #endif
        !          2014: }
        !          2015: 
        !          2016: 
        !          2017: /*
        !          2018:  * clock_filter - add incoming clock sample to filter register and run
        !          2019:  *               the filter procedure to find the best sample.
        !          2020:  */
        !          2021: void
        !          2022: clock_filter(
        !          2023:        struct peer *peer,              /* peer structure pointer */
        !          2024:        double  sample_offset,          /* clock offset */
        !          2025:        double  sample_delay,           /* roundtrip delay */
        !          2026:        double  sample_disp             /* dispersion */
        !          2027:        )
        !          2028: {
        !          2029:        double  dst[NTP_SHIFT];         /* distance vector */
        !          2030:        int     ord[NTP_SHIFT];         /* index vector */
        !          2031:        int     i, j, k, m;
        !          2032:        double  dtemp, etemp;
        !          2033:        char    tbuf[80];
        !          2034: 
        !          2035:        /*
        !          2036:         * A sample consists of the offset, delay, dispersion and epoch
        !          2037:         * of arrival. The offset and delay are determined by the on-
        !          2038:         * wire protocol. The dispersion grows from the last outbound
        !          2039:         * packet to the arrival of this one increased by the sum of the
        !          2040:         * peer precision and the system precision as required by the
        !          2041:         * error budget. First, shift the new arrival into the shift
        !          2042:         * register discarding the oldest one.
        !          2043:         */
        !          2044:        j = peer->filter_nextpt;
        !          2045:        peer->filter_offset[j] = sample_offset;
        !          2046:        peer->filter_delay[j] = sample_delay;
        !          2047:        peer->filter_disp[j] = sample_disp;
        !          2048:        peer->filter_epoch[j] = current_time;
        !          2049:        j = (j + 1) % NTP_SHIFT;
        !          2050:        peer->filter_nextpt = j;
        !          2051: 
        !          2052:        /*
        !          2053:         * Update dispersions since the last update and at the same
        !          2054:         * time initialize the distance and index lists. Since samples
        !          2055:         * become increasingly uncorrelated beyond the Allan intercept,
        !          2056:         * only under exceptional cases will an older sample be used.
        !          2057:         * Therefore, the distance list uses a compound metric. If the
        !          2058:         * dispersion is greater than the maximum dispersion, clamp the
        !          2059:         * distance at that value. If the time since the last update is
        !          2060:         * less than the Allan intercept use the delay; otherwise, use
        !          2061:         * the sum of the delay and dispersion.
        !          2062:         */
        !          2063:        dtemp = clock_phi * (current_time - peer->update);
        !          2064:        peer->update = current_time;
        !          2065:        for (i = NTP_SHIFT - 1; i >= 0; i--) {
        !          2066:                if (i != 0)
        !          2067:                        peer->filter_disp[j] += dtemp;
        !          2068:                if (peer->filter_disp[j] >= MAXDISPERSE) { 
        !          2069:                        peer->filter_disp[j] = MAXDISPERSE;
        !          2070:                        dst[i] = MAXDISPERSE;
        !          2071:                } else if (peer->update - peer->filter_epoch[j] >
        !          2072:                    ULOGTOD(allan_xpt)) {
        !          2073:                        dst[i] = peer->filter_delay[j] +
        !          2074:                            peer->filter_disp[j];
        !          2075:                } else {
        !          2076:                        dst[i] = peer->filter_delay[j];
        !          2077:                }
        !          2078:                ord[i] = j;
        !          2079:                j = (j + 1) % NTP_SHIFT;
        !          2080:        }
        !          2081: 
        !          2082:         /*
        !          2083:         * If the clock discipline has stabilized, sort the samples by
        !          2084:         * distance.  
        !          2085:         */
        !          2086:        if (sys_leap != LEAP_NOTINSYNC) {
        !          2087:                for (i = 1; i < NTP_SHIFT; i++) {
        !          2088:                        for (j = 0; j < i; j++) {
        !          2089:                                if (dst[j] > dst[i]) {
        !          2090:                                        k = ord[j];
        !          2091:                                        ord[j] = ord[i];
        !          2092:                                        ord[i] = k;
        !          2093:                                        etemp = dst[j];
        !          2094:                                        dst[j] = dst[i];
        !          2095:                                        dst[i] = etemp;
        !          2096:                                }
        !          2097:                        }
        !          2098:                }
        !          2099:        }
        !          2100: 
        !          2101:        /*
        !          2102:         * Copy the index list to the association structure so ntpq
        !          2103:         * can see it later. Prune the distance list to leave only
        !          2104:         * samples less than the maximum dispersion, which disfavors
        !          2105:         * uncorrelated samples older than the Allan intercept. To
        !          2106:         * further improve the jitter estimate, of the remainder leave
        !          2107:         * only samples less than the maximum distance, but keep at
        !          2108:         * least two samples for jitter calculation.
        !          2109:         */
        !          2110:        m = 0;
        !          2111:        for (i = 0; i < NTP_SHIFT; i++) {
        !          2112:                peer->filter_order[i] = (u_char) ord[i];
        !          2113:                if (dst[i] >= MAXDISPERSE || (m >= 2 && dst[i] >=
        !          2114:                    sys_maxdist))
        !          2115:                        continue;
        !          2116:                m++;
        !          2117:        }
        !          2118:        
        !          2119:        /*
        !          2120:         * Compute the dispersion and jitter. The dispersion is weighted
        !          2121:         * exponentially by NTP_FWEIGHT (0.5) so it is normalized close
        !          2122:         * to 1.0. The jitter is the RMS differences relative to the
        !          2123:         * lowest delay sample.
        !          2124:         */
        !          2125:        peer->disp = peer->jitter = 0;
        !          2126:        k = ord[0];
        !          2127:        for (i = NTP_SHIFT - 1; i >= 0; i--) {
        !          2128:                j = ord[i];
        !          2129:                peer->disp = NTP_FWEIGHT * (peer->disp +
        !          2130:                    peer->filter_disp[j]);
        !          2131:                if (i < m)
        !          2132:                        peer->jitter += DIFF(peer->filter_offset[j],
        !          2133:                            peer->filter_offset[k]);
        !          2134:        }
        !          2135: 
        !          2136:        /*
        !          2137:         * If no acceptable samples remain in the shift register,
        !          2138:         * quietly tiptoe home leaving only the dispersion. Otherwise,
        !          2139:         * save the offset, delay and jitter. Note the jitter must not
        !          2140:         * be less than the precision.
        !          2141:         */
        !          2142:        if (m == 0) {
        !          2143:                clock_select();
        !          2144:                return;
        !          2145:        }
        !          2146: 
        !          2147:        etemp = fabs(peer->offset - peer->filter_offset[k]);
        !          2148:        peer->offset = peer->filter_offset[k];
        !          2149:        peer->delay = peer->filter_delay[k];
        !          2150:        if (m > 1)
        !          2151:                peer->jitter /= m - 1;
        !          2152:        peer->jitter = max(SQRT(peer->jitter), LOGTOD(sys_precision));
        !          2153: 
        !          2154:        /*
        !          2155:         * If the the new sample and the current sample are both valid
        !          2156:         * and the difference between their offsets exceeds CLOCK_SGATE
        !          2157:         * (3) times the jitter and the interval between them is less
        !          2158:         * than twice the host poll interval, consider the new sample
        !          2159:         * a popcorn spike and ignore it.
        !          2160:         */
        !          2161:        if (peer->disp < sys_maxdist && peer->filter_disp[k] <
        !          2162:            sys_maxdist && etemp > CLOCK_SGATE * peer->jitter &&
        !          2163:            peer->filter_epoch[k] - peer->epoch < 2. *
        !          2164:            ULOGTOD(peer->hpoll)) {
        !          2165:                snprintf(tbuf, sizeof(tbuf), "%.6f s", etemp);
        !          2166:                report_event(PEVNT_POPCORN, peer, tbuf);
        !          2167:                return;
        !          2168:        }
        !          2169: 
        !          2170:        /*
        !          2171:         * A new minimum sample is useful only if it is later than the
        !          2172:         * last one used. In this design the maximum lifetime of any
        !          2173:         * sample is not greater than eight times the poll interval, so
        !          2174:         * the maximum interval between minimum samples is eight
        !          2175:         * packets.
        !          2176:         */
        !          2177:        if (peer->filter_epoch[k] <= peer->epoch) {
        !          2178: #if DEBUG
        !          2179:        if (debug)
        !          2180:                printf("clock_filter: old sample %lu\n", current_time -
        !          2181:                    peer->filter_epoch[k]);
        !          2182: #endif
        !          2183:                return;
        !          2184:        }
        !          2185:        peer->epoch = peer->filter_epoch[k];
        !          2186: 
        !          2187:        /*
        !          2188:         * The mitigated sample statistics are saved for later
        !          2189:         * processing. If not synchronized or not in a burst, tickle the
        !          2190:         * clock select algorithm.
        !          2191:         */
        !          2192:        record_peer_stats(&peer->srcadr, ctlpeerstatus(peer),
        !          2193:            peer->offset, peer->delay, peer->disp, peer->jitter);
        !          2194: #ifdef DEBUG
        !          2195:        if (debug)
        !          2196:                printf(
        !          2197:                    "clock_filter: n %d off %.6f del %.6f dsp %.6f jit %.6f\n",
        !          2198:                    m, peer->offset, peer->delay, peer->disp,
        !          2199:                    peer->jitter);
        !          2200: #endif
        !          2201:        if (peer->burst == 0 || sys_leap == LEAP_NOTINSYNC)
        !          2202:                clock_select();
        !          2203: }
        !          2204: 
        !          2205: 
        !          2206: /*
        !          2207:  * clock_select - find the pick-of-the-litter clock
        !          2208:  *
        !          2209:  * LOCKCLOCK: (1) If the local clock is the prefer peer, it will always
        !          2210:  * be enabled, even if declared falseticker, (2) only the prefer peer
        !          2211:  * caN Be selected as the system peer, (3) if the external source is
        !          2212:  * down, the system leap bits are set to 11 and the stratum set to
        !          2213:  * infinity.
        !          2214:  */
        !          2215: void
        !          2216: clock_select(void)
        !          2217: {
        !          2218:        struct peer *peer;
        !          2219:        int     i, j, k, n;
        !          2220:        int     nlist, nl3;
        !          2221:        int     allow, osurv;
        !          2222:        double  d, e, f, g;
        !          2223:        double  high, low;
        !          2224:        double  seljitter;
        !          2225:        double  synch[NTP_MAXASSOC], error[NTP_MAXASSOC];
        !          2226:        double  orphmet = 2.0 * U_INT32_MAX; /* 2x is greater than */
        !          2227:        struct peer *osys_peer = NULL;
        !          2228:        struct peer *sys_prefer = NULL; /* prefer peer */
        !          2229:        struct peer *typesystem = NULL;
        !          2230:        struct peer *typeorphan = NULL;
        !          2231: #ifdef REFCLOCK
        !          2232:        struct peer *typeacts = NULL;
        !          2233:        struct peer *typelocal = NULL;
        !          2234:        struct peer *typepps = NULL;
        !          2235: #endif /* REFCLOCK */
        !          2236: 
        !          2237:        static int list_alloc = 0;
        !          2238:        static struct endpoint *endpoint = NULL;
        !          2239:        static int *indx = NULL;
        !          2240:        static struct peer **peer_list = NULL;
        !          2241:        static u_int endpoint_size = 0;
        !          2242:        static u_int indx_size = 0;
        !          2243:        static u_int peer_list_size = 0;
        !          2244: 
        !          2245:        /*
        !          2246:         * Initialize and create endpoint, index and peer lists big
        !          2247:         * enough to handle all associations.
        !          2248:         */
        !          2249:        osys_peer = sys_peer;
        !          2250:        osurv = sys_survivors;
        !          2251:        sys_survivors = 0;
        !          2252: #ifdef LOCKCLOCK
        !          2253:        sys_leap = LEAP_NOTINSYNC;
        !          2254:        sys_stratum = STRATUM_UNSPEC;
        !          2255:        memcpy(&sys_refid, "DOWN", 4);
        !          2256: #endif /* LOCKCLOCK */
        !          2257:        nlist = 0;
        !          2258:        for (n = 0; n < NTP_HASH_SIZE; n++)
        !          2259:                nlist += peer_hash_count[n];
        !          2260:        if (nlist > list_alloc) {
        !          2261:                if (list_alloc > 0) {
        !          2262:                        free(endpoint);
        !          2263:                        free(indx);
        !          2264:                        free(peer_list);
        !          2265:                }
        !          2266:                while (list_alloc < nlist) {
        !          2267:                        list_alloc += 5;
        !          2268:                        endpoint_size += 5 * 3 * sizeof(*endpoint);
        !          2269:                        indx_size += 5 * 3 * sizeof(*indx);
        !          2270:                        peer_list_size += 5 * sizeof(*peer_list);
        !          2271:                }
        !          2272:                endpoint = (struct endpoint *)emalloc(endpoint_size);
        !          2273:                indx = (int *)emalloc(indx_size);
        !          2274:                peer_list = (struct peer **)emalloc(peer_list_size);
        !          2275:        }
        !          2276: 
        !          2277:        /*
        !          2278:         * Initially, we populate the island with all the rifraff peers
        !          2279:         * that happen to be lying around. Those with seriously
        !          2280:         * defective clocks are immediately booted off the island. Then,
        !          2281:         * the falsetickers are culled and put to sea. The truechimers
        !          2282:         * remaining are subject to repeated rounds where the most
        !          2283:         * unpopular at each round is kicked off. When the population
        !          2284:         * has dwindled to sys_minclock, the survivors split a million
        !          2285:         * bucks and collectively crank the chimes.
        !          2286:         */
        !          2287:        nlist = nl3 = 0;        /* none yet */
        !          2288:        for (n = 0; n < NTP_HASH_SIZE; n++) {
        !          2289:                for (peer = peer_hash[n]; peer != NULL; peer =
        !          2290:                    peer->next) {
        !          2291:                        peer->new_status = CTL_PST_SEL_REJECT;
        !          2292: 
        !          2293:                        /*
        !          2294:                         * Leave the island immediately if the peer is
        !          2295:                         * unfit to synchronize.
        !          2296:                         */
        !          2297:                        if (peer_unfit(peer))
        !          2298:                                continue;
        !          2299: 
        !          2300:                        /*
        !          2301:                         * If this peer is an orphan parent, elect the
        !          2302:                         * one with the lowest metric defined as the
        !          2303:                         * IPv4 address or the first 64 bits of the
        !          2304:                         * hashed IPv6 address.  To ensure convergence
        !          2305:                         * on the same selected orphan, consider as
        !          2306:                         * well that this system may have the lowest
        !          2307:                         * metric and be the orphan parent.  If this
        !          2308:                         * system wins, sys_peer will be NULL to trigger
        !          2309:                         * orphan mode in timer().
        !          2310:                         */
        !          2311:                        if (peer->stratum == sys_orphan) {
        !          2312:                                u_int32 localmet;
        !          2313:                                u_int32 peermet;
        !          2314: 
        !          2315:                                if (peer->dstadr != NULL)
        !          2316:                                        localmet = ntohl(peer->dstadr->addr_refid);
        !          2317:                                else
        !          2318:                                        localmet = U_INT32_MAX;
        !          2319:                                peermet = ntohl(addr2refid(&peer->srcadr));
        !          2320:                                if (peermet < localmet &&
        !          2321:                                    peermet < orphmet) {
        !          2322:                                        typeorphan = peer;
        !          2323:                                        orphmet = peermet;
        !          2324:                                }
        !          2325:                                continue;
        !          2326:                        }
        !          2327: 
        !          2328:                        /*
        !          2329:                         * If this peer could have the orphan parent
        !          2330:                         * as a synchronization ancestor, exclude it
        !          2331:                         * from selection to avoid forming a 
        !          2332:                         * synchronization loop within the orphan mesh,
        !          2333:                         * triggering stratum climb to infinity 
        !          2334:                         * instability.  Peers at stratum higher than
        !          2335:                         * the orphan stratum could have the orphan
        !          2336:                         * parent in ancestry so are excluded.
        !          2337:                         * See http://bugs.ntp.org/2050
        !          2338:                         */
        !          2339:                        if (peer->stratum > sys_orphan)
        !          2340:                                continue;
        !          2341: #ifdef REFCLOCK
        !          2342:                        /*
        !          2343:                         * The following are special cases. We deal
        !          2344:                         * with them later.
        !          2345:                         */
        !          2346:                        if (!(peer->flags & FLAG_PREFER)) {
        !          2347:                                switch (peer->refclktype) {
        !          2348:                                case REFCLK_LOCALCLOCK:
        !          2349:                                        if (typelocal == NULL)
        !          2350:                                                typelocal = peer;
        !          2351:                                        continue;
        !          2352: 
        !          2353:                                case REFCLK_ACTS:
        !          2354:                                        if (typeacts == NULL)
        !          2355:                                                typeacts = peer;
        !          2356:                                        continue;
        !          2357:                                }
        !          2358:                        }
        !          2359: #endif /* REFCLOCK */
        !          2360: 
        !          2361:                        /*
        !          2362:                         * If we get this far, the peer can stay on the
        !          2363:                         * island, but does not yet have the immunity
        !          2364:                         * idol.
        !          2365:                         */
        !          2366:                        peer->new_status = CTL_PST_SEL_SANE;
        !          2367:                        peer_list[nlist++] = peer;
        !          2368: 
        !          2369:                        /*
        !          2370:                         * Insert each interval endpoint on the sorted
        !          2371:                         * list.
        !          2372:                         */
        !          2373:                        e = peer->offset;        /* Upper end */
        !          2374:                        f = root_distance(peer);
        !          2375:                        e = e + f;
        !          2376:                        for (i = nl3 - 1; i >= 0; i--) {
        !          2377:                                if (e >= endpoint[indx[i]].val)
        !          2378:                                        break;
        !          2379: 
        !          2380:                                indx[i + 3] = indx[i];
        !          2381:                        }
        !          2382:                        indx[i + 3] = nl3;
        !          2383:                        endpoint[nl3].type = 1;
        !          2384:                        endpoint[nl3++].val = e;
        !          2385: 
        !          2386:                        e = e - f;              /* Center point */
        !          2387:                        for (; i >= 0; i--) {
        !          2388:                                if (e >= endpoint[indx[i]].val)
        !          2389:                                        break;
        !          2390: 
        !          2391:                                indx[i + 2] = indx[i];
        !          2392:                        }
        !          2393:                        indx[i + 2] = nl3;
        !          2394:                        endpoint[nl3].type = 0;
        !          2395:                        endpoint[nl3++].val = e;
        !          2396: 
        !          2397:                        e = e - f;              /* Lower end */
        !          2398:                        for (; i >= 0; i--) {
        !          2399:                                if (e >= endpoint[indx[i]].val)
        !          2400:                                        break;
        !          2401: 
        !          2402:                                indx[i + 1] = indx[i];
        !          2403:                        }
        !          2404:                        indx[i + 1] = nl3;
        !          2405:                        endpoint[nl3].type = -1;
        !          2406:                        endpoint[nl3++].val = e;
        !          2407:                }
        !          2408:        }
        !          2409: #ifdef DEBUG
        !          2410:        if (debug > 2)
        !          2411:                for (i = 0; i < nl3; i++)
        !          2412:                        printf("select: endpoint %2d %.6f\n",
        !          2413:                           endpoint[indx[i]].type,
        !          2414:                           endpoint[indx[i]].val);
        !          2415: #endif
        !          2416:        /*
        !          2417:         * This is the actual algorithm that cleaves the truechimers
        !          2418:         * from the falsetickers. The original algorithm was described
        !          2419:         * in Keith Marzullo's dissertation, but has been modified for
        !          2420:         * better accuracy.
        !          2421:         *
        !          2422:         * Briefly put, we first assume there are no falsetickers, then
        !          2423:         * scan the candidate list first from the low end upwards and
        !          2424:         * then from the high end downwards. The scans stop when the
        !          2425:         * number of intersections equals the number of candidates less
        !          2426:         * the number of falsetickers. If this doesn't happen for a
        !          2427:         * given number of falsetickers, we bump the number of
        !          2428:         * falsetickers and try again. If the number of falsetickers
        !          2429:         * becomes equal to or greater than half the number of
        !          2430:         * candidates, the Albanians have won the Byzantine wars and
        !          2431:         * correct synchronization is not possible.
        !          2432:         *
        !          2433:         * Here, nlist is the number of candidates and allow is the
        !          2434:         * number of falsetickers. Upon exit, the truechimers are the
        !          2435:         * survivors with offsets not less than low and not greater than
        !          2436:         * high. There may be none of them.
        !          2437:         */
        !          2438:        low = 1e9;
        !          2439:        high = -1e9;
        !          2440:        for (allow = 0; 2 * allow < nlist; allow++) {
        !          2441:                int     found;
        !          2442: 
        !          2443:                /*
        !          2444:                 * Bound the interval (low, high) as the largest
        !          2445:                 * interval containing points from presumed truechimers.
        !          2446:                 */
        !          2447:                found = 0;
        !          2448:                n = 0;
        !          2449:                for (i = 0; i < nl3; i++) {
        !          2450:                        low = endpoint[indx[i]].val;
        !          2451:                        n -= endpoint[indx[i]].type;
        !          2452:                        if (n >= nlist - allow)
        !          2453:                                break;
        !          2454:                        if (endpoint[indx[i]].type == 0)
        !          2455:                                found++;
        !          2456:                }
        !          2457:                n = 0;
        !          2458:                for (j = nl3 - 1; j >= 0; j--) {
        !          2459:                        high = endpoint[indx[j]].val;
        !          2460:                        n += endpoint[indx[j]].type;
        !          2461:                        if (n >= nlist - allow)
        !          2462:                                break;
        !          2463:                        if (endpoint[indx[j]].type == 0)
        !          2464:                                found++;
        !          2465:                }
        !          2466: 
        !          2467:                /*
        !          2468:                 * If the number of candidates found outside the
        !          2469:                 * interval is greater than the number of falsetickers,
        !          2470:                 * then at least one truechimer is outside the interval,
        !          2471:                 * so go around again. This is what makes this algorithm
        !          2472:                 * different than Marzullo's.
        !          2473:                 */
        !          2474:                if (found > allow)
        !          2475:                        continue;
        !          2476: 
        !          2477:                /*
        !          2478:                 * If an interval containing truechimers is found, stop.
        !          2479:                 * If not, increase the number of falsetickers and go
        !          2480:                 * around again.
        !          2481:                 */
        !          2482:                if (high > low)
        !          2483:                        break;
        !          2484:        }
        !          2485: 
        !          2486:        /*
        !          2487:         * Clustering algorithm. Construct candidate list in order first
        !          2488:         * by stratum then by root distance, but keep only the best
        !          2489:         * NTP_MAXASSOC of them. Scan the list to find falsetickers, who
        !          2490:         * leave the island immediately. The TRUE peer is always a
        !          2491:         * truechimer. We must leave at least one peer to collect the
        !          2492:         * million bucks.
        !          2493:         */
        !          2494:        j = 0;
        !          2495:        for (i = 0; i < nlist; i++) {
        !          2496:                peer = peer_list[i];
        !          2497:                if (nlist > 1 && (peer->offset <= low || peer->offset >=
        !          2498:                    high) && !(peer->flags & FLAG_TRUE))
        !          2499:                        continue;
        !          2500: 
        !          2501: #ifdef REFCLOCK
        !          2502:                /*
        !          2503:                 * Eligible PPS peers must survive the intersection
        !          2504:                 * algorithm. Use the first one found, but don't
        !          2505:                 * include any of them in the cluster population.
        !          2506:                 */
        !          2507:                if (peer->flags & FLAG_PPS) {
        !          2508:                        if (typepps == NULL) 
        !          2509:                                typepps = peer;
        !          2510:                        continue;
        !          2511:                }
        !          2512: #endif /* REFCLOCK */
        !          2513: 
        !          2514:                /*
        !          2515:                 * The metric is the scaled root distance at the next
        !          2516:                 * poll interval plus the peer stratum.
        !          2517:                 */
        !          2518:                d = (root_distance(peer) + clock_phi * (peer->nextdate -
        !          2519:                    current_time)) / sys_maxdist + peer->stratum;
        !          2520:                if (j >= NTP_MAXASSOC) {
        !          2521:                        if (d >= synch[j - 1])
        !          2522:                                continue;
        !          2523:                        else
        !          2524:                                j--;
        !          2525:                }
        !          2526:                for (k = j; k > 0; k--) {
        !          2527:                        if (d >= synch[k - 1])
        !          2528:                                break;
        !          2529: 
        !          2530:                        peer_list[k] = peer_list[k - 1];
        !          2531:                        error[k] = error[k - 1];
        !          2532:                        synch[k] = synch[k - 1];
        !          2533:                }
        !          2534:                peer_list[k] = peer;
        !          2535:                error[k] = peer->jitter;
        !          2536:                synch[k] = d;
        !          2537:                j++;
        !          2538:        }
        !          2539:        nlist = j;
        !          2540: 
        !          2541:        /*
        !          2542:         * If no survivors remain at this point, check if the modem 
        !          2543:         * driver, local driver or orphan parent in that order. If so,
        !          2544:         * nominate the first one found as the only survivor.
        !          2545:         * Otherwise, give up and leave the island to the rats.
        !          2546:         */
        !          2547:        if (nlist == 0) {
        !          2548:                error[0] = 0;
        !          2549:                synch[0] = 0;
        !          2550: #ifdef REFCLOCK
        !          2551:                if (typeacts != NULL) {
        !          2552:                        peer_list[0] = typeacts;
        !          2553:                        nlist = 1;
        !          2554:                } else if (typelocal != NULL) {
        !          2555:                        peer_list[0] = typelocal;
        !          2556:                        nlist = 1;
        !          2557:                } else
        !          2558: #endif /* REFCLOCK */
        !          2559:                if (typeorphan != NULL) {
        !          2560:                        peer_list[0] = typeorphan;
        !          2561:                        nlist = 1;
        !          2562:                }
        !          2563:        }
        !          2564: 
        !          2565:        /*
        !          2566:         * Mark the candidates at this point as truechimers.
        !          2567:         */
        !          2568:        for (i = 0; i < nlist; i++) {
        !          2569:                peer_list[i]->new_status = CTL_PST_SEL_SELCAND;
        !          2570: #ifdef DEBUG
        !          2571:                if (debug > 1)
        !          2572:                        printf("select: survivor %s %f\n",
        !          2573:                            stoa(&peer_list[i]->srcadr), synch[i]);
        !          2574: #endif
        !          2575:        }
        !          2576: 
        !          2577:        /*
        !          2578:         * Now, vote outlyers off the island by select jitter weighted
        !          2579:         * by root distance. Continue voting as long as there are more
        !          2580:         * than sys_minclock survivors and the minimum select jitter is
        !          2581:         * greater than the maximum peer jitter. Stop if we are about to
        !          2582:         * discard a TRUE or PREFER  peer, who of course has the
        !          2583:         * immunity idol.
        !          2584:         */
        !          2585:        seljitter = 0;
        !          2586:        while (1) {
        !          2587:                d = 1e9;
        !          2588:                e = -1e9;
        !          2589:                f = g = 0;
        !          2590:                k = 0;
        !          2591:                for (i = 0; i < nlist; i++) {
        !          2592:                        if (error[i] < d)
        !          2593:                                d = error[i];
        !          2594:                        f = 0;
        !          2595:                        if (nlist > 1) {
        !          2596:                                for (j = 0; j < nlist; j++)
        !          2597:                                        f += DIFF(peer_list[j]->offset,
        !          2598:                                            peer_list[i]->offset);
        !          2599:                                f = SQRT(f / (nlist - 1));
        !          2600:                        }
        !          2601:                        if (f * synch[i] > e) {
        !          2602:                                g = f;
        !          2603:                                e = f * synch[i];
        !          2604:                                k = i;
        !          2605:                        }
        !          2606:                }
        !          2607:                f = max(f, LOGTOD(sys_precision));
        !          2608:                if (nlist <= sys_minsane || nlist <= sys_minclock) {
        !          2609:                        break;
        !          2610: 
        !          2611:                } else if (f <= d || peer_list[k]->flags &
        !          2612:                    (FLAG_TRUE | FLAG_PREFER)) {
        !          2613:                        seljitter = f;
        !          2614:                        break;
        !          2615:                }
        !          2616: #ifdef DEBUG
        !          2617:                if (debug > 2)
        !          2618:                        printf(
        !          2619:                            "select: drop %s seljit %.6f jit %.6f\n",
        !          2620:                            ntoa(&peer_list[k]->srcadr), g, d);
        !          2621: #endif
        !          2622:                if (nlist > sys_maxclock)
        !          2623:                        peer_list[k]->new_status = CTL_PST_SEL_EXCESS;
        !          2624:                for (j = k + 1; j < nlist; j++) {
        !          2625:                        peer_list[j - 1] = peer_list[j];
        !          2626:                        synch[j - 1] = synch[j];
        !          2627:                        error[j - 1] = error[j];
        !          2628:                }
        !          2629:                nlist--;
        !          2630:        }
        !          2631: 
        !          2632:        /*
        !          2633:         * What remains is a list usually not greater than sys_minclock
        !          2634:         * peers. Note that the head of the list is the system peer at
        !          2635:         * the lowest stratum and that unsynchronized peers cannot
        !          2636:         * survive this far.
        !          2637:         *
        !          2638:         * While at it, count the number of leap warning bits found.
        !          2639:         * This will be used later to vote the system leap warning bit.
        !          2640:         * If a leap warning bit is found on a reference clock, the vote
        !          2641:         * is always won.
        !          2642:         */
        !          2643:        leap_vote = 0;
        !          2644:        for (i = 0; i < nlist; i++) {
        !          2645:                peer = peer_list[i];
        !          2646:                peer->unreach = 0;
        !          2647:                peer->new_status = CTL_PST_SEL_SYNCCAND;
        !          2648:                sys_survivors++;
        !          2649:                if (peer->leap == LEAP_ADDSECOND) {
        !          2650:                        if (peer->flags & FLAG_REFCLOCK)
        !          2651:                                leap_vote = nlist;
        !          2652:                        else 
        !          2653:                                leap_vote++;
        !          2654:                }
        !          2655:                if (peer->flags & FLAG_PREFER)
        !          2656:                        sys_prefer = peer;
        !          2657:        }
        !          2658: 
        !          2659:        /*
        !          2660:         * Unless there are at least sys_misane survivors, leave the
        !          2661:         * building dark. Otherwise, do a clockhop dance. Ordinarily,
        !          2662:         * use the first survivor on the survivor list. However, if the
        !          2663:         * last selection is not first on the list, use it as long as
        !          2664:         * it doesn't get too old or too ugly.
        !          2665:         */
        !          2666:        if (nlist > 0 && nlist >= sys_minsane) {
        !          2667:                double  x;
        !          2668: 
        !          2669:                typesystem = peer_list[0];
        !          2670:                if (osys_peer == NULL || osys_peer == typesystem) {
        !          2671:                        sys_clockhop = 0; 
        !          2672:                } else if ((x = fabs(typesystem->offset -
        !          2673:                    osys_peer->offset)) < sys_mindisp) {
        !          2674:                        if (sys_clockhop == 0)
        !          2675:                                sys_clockhop = sys_mindisp;
        !          2676:                        else
        !          2677:                                sys_clockhop *= .5;
        !          2678: #ifdef DEBUG
        !          2679:                        if (debug)
        !          2680:                                printf("select: clockhop %d %.6f %.6f\n",
        !          2681:                                    j, x, sys_clockhop);
        !          2682: #endif
        !          2683:                        if (fabs(x) < sys_clockhop)
        !          2684:                                typesystem = osys_peer;
        !          2685:                        else
        !          2686:                                sys_clockhop = 0;
        !          2687:                } else {
        !          2688:                        sys_clockhop = 0;
        !          2689:                }
        !          2690:        }
        !          2691: 
        !          2692:        /*
        !          2693:         * Mitigation rules of the game. We have the pick of the
        !          2694:         * litter in typesystem if any survivors are left. If
        !          2695:         * there is a prefer peer, use its offset and jitter.
        !          2696:         * Otherwise, use the combined offset and jitter of all kitters.
        !          2697:         */
        !          2698:        if (typesystem != NULL) {
        !          2699:                if (sys_prefer == NULL) {
        !          2700:                        typesystem->new_status = CTL_PST_SEL_SYSPEER;
        !          2701:                        clock_combine(peer_list, sys_survivors);
        !          2702:                        sys_jitter = SQRT(SQUARE(sys_jitter) +
        !          2703:                            SQUARE(seljitter));
        !          2704:                } else {
        !          2705:                        typesystem = sys_prefer;
        !          2706:                        sys_clockhop = 0;
        !          2707:                        typesystem->new_status = CTL_PST_SEL_SYSPEER;
        !          2708:                        sys_offset = typesystem->offset;
        !          2709:                        sys_jitter = typesystem->jitter;
        !          2710:                }
        !          2711: #ifdef DEBUG
        !          2712:                if (debug)
        !          2713:                        printf("select: combine offset %.9f jitter %.9f\n",
        !          2714:                            sys_offset, sys_jitter);
        !          2715: #endif
        !          2716:        }
        !          2717: #ifdef REFCLOCK
        !          2718:        /*
        !          2719:         * If a PPS driver is lit and the combined offset is less than
        !          2720:         * 0.4 s, select the driver as the PPS peer and use its offset
        !          2721:         * and jitter. However, if this is the atom driver, use it only
        !          2722:         * if there is a prefer peer or there are no survivors and none
        !          2723:         * are required.
        !          2724:         */
        !          2725:        if (typepps != NULL && fabs(sys_offset) < 0.4 &&
        !          2726:            (typepps->refclktype != REFCLK_ATOM_PPS ||
        !          2727:            (typepps->refclktype == REFCLK_ATOM_PPS && (sys_prefer !=
        !          2728:            NULL || (typesystem == NULL && sys_minsane == 0))))) {
        !          2729:                typesystem = typepps;
        !          2730:                sys_clockhop = 0;
        !          2731:                typesystem->new_status = CTL_PST_SEL_PPS;
        !          2732:                sys_offset = typesystem->offset;
        !          2733:                sys_jitter = typesystem->jitter;
        !          2734: #ifdef DEBUG
        !          2735:                if (debug)
        !          2736:                        printf("select: pps offset %.9f jitter %.9f\n",
        !          2737:                            sys_offset, sys_jitter);
        !          2738: #endif
        !          2739:        }
        !          2740: #endif /* REFCLOCK */
        !          2741: 
        !          2742:        /*
        !          2743:         * If there are no survivors at this point, there is no
        !          2744:         * system peer. If so and this is an old update, keep the
        !          2745:         * current statistics, but do not update the clock.
        !          2746:         */
        !          2747:        if (typesystem == NULL) {
        !          2748:                if (osys_peer != NULL)
        !          2749:                        report_event(EVNT_NOPEER, NULL, NULL);
        !          2750:                sys_peer = NULL;                        
        !          2751:                for (n = 0; n < NTP_HASH_SIZE; n++)
        !          2752:                        for (peer = peer_hash[n]; peer != NULL; peer =
        !          2753:                            peer->next)
        !          2754:                                peer->status = peer->new_status;
        !          2755:                return;
        !          2756:        }
        !          2757: 
        !          2758:        /*
        !          2759:         * Do not use old data, as this may mess up the clock discipline
        !          2760:         * stability.
        !          2761:         */
        !          2762:        if (typesystem->epoch <= sys_epoch)
        !          2763:                return;
        !          2764: 
        !          2765:        /*
        !          2766:         * We have found the alpha male. Wind the clock.
        !          2767:         */
        !          2768:        if (osys_peer != typesystem)
        !          2769:                report_event(PEVNT_NEWPEER, typesystem, NULL);
        !          2770:        for (n = 0; n < NTP_HASH_SIZE; n++)
        !          2771:                for (peer = peer_hash[n]; peer != NULL; peer =
        !          2772:                    peer->next)
        !          2773:                        peer->status = peer->new_status;
        !          2774:        clock_update(typesystem);
        !          2775: }
        !          2776: 
        !          2777: 
        !          2778: /*
        !          2779:  * clock_combine - compute system offset and jitter from selected peers
        !          2780:  */
        !          2781: static void
        !          2782: clock_combine(
        !          2783:        struct peer **peers,    /* survivor list */
        !          2784:        int     npeers          /* number of survivors */
        !          2785:        )
        !          2786: {
        !          2787:        int     i;
        !          2788:        double  x, y, z, w;
        !          2789: 
        !          2790:        y = z = w = 0;
        !          2791:        for (i = 0; i < npeers; i++) {
        !          2792:                x = root_distance(peers[i]);
        !          2793:                y += 1. / x;
        !          2794:                z += peers[i]->offset / x;
        !          2795:                w += SQUARE(peers[i]->offset - peers[0]->offset) / x;
        !          2796:        }
        !          2797:        sys_offset = z / y;
        !          2798:        sys_jitter = SQRT(w / y);
        !          2799: }
        !          2800: 
        !          2801: 
        !          2802: /*
        !          2803:  * root_distance - compute synchronization distance from peer to root
        !          2804:  */
        !          2805: static double
        !          2806: root_distance(
        !          2807:        struct peer *peer       /* peer structure pointer */
        !          2808:        )
        !          2809: {
        !          2810:        double  dtemp;
        !          2811: 
        !          2812:        /*
        !          2813:         * Careful squeak here. The value returned must be greater than
        !          2814:         * the minimum root dispersion in order to avoid clockhop with
        !          2815:         * highly precise reference clocks. Note that the root distance
        !          2816:         * cannot exceed the sys_maxdist, as this is the cutoff by the
        !          2817:         * selection algorithm.
        !          2818:         */
        !          2819:        dtemp = (peer->delay + peer->rootdelay) / 2 + peer->disp +
        !          2820:            peer->rootdisp + clock_phi * (current_time - peer->update) +
        !          2821:            peer->jitter;
        !          2822:        if (dtemp < sys_mindisp)
        !          2823:                dtemp = sys_mindisp;
        !          2824:        return (dtemp);
        !          2825: }
        !          2826: 
        !          2827: 
        !          2828: /*
        !          2829:  * peer_xmit - send packet for persistent association.
        !          2830:  */
        !          2831: static void
        !          2832: peer_xmit(
        !          2833:        struct peer *peer       /* peer structure pointer */
        !          2834:        )
        !          2835: {
        !          2836:        struct pkt xpkt;        /* transmit packet */
        !          2837:        int     sendlen, authlen;
        !          2838:        keyid_t xkeyid = 0;     /* transmit key ID */
        !          2839:        l_fp    xmt_tx, xmt_ty;
        !          2840: 
        !          2841:        if (!peer->dstadr)      /* drop peers without interface */
        !          2842:                return;
        !          2843: 
        !          2844:        xpkt.li_vn_mode = PKT_LI_VN_MODE(sys_leap, peer->version,
        !          2845:            peer->hmode);
        !          2846:        xpkt.stratum = STRATUM_TO_PKT(sys_stratum);
        !          2847:        xpkt.ppoll = peer->hpoll;
        !          2848:        xpkt.precision = sys_precision;
        !          2849:        xpkt.refid = sys_refid;
        !          2850:        xpkt.rootdelay = HTONS_FP(DTOFP(sys_rootdelay));
        !          2851:        xpkt.rootdisp =  HTONS_FP(DTOUFP(sys_rootdisp));
        !          2852:        HTONL_FP(&sys_reftime, &xpkt.reftime);
        !          2853:        HTONL_FP(&peer->rec, &xpkt.org);
        !          2854:        HTONL_FP(&peer->dst, &xpkt.rec);
        !          2855: 
        !          2856:        /*
        !          2857:         * If the received packet contains a MAC, the transmitted packet
        !          2858:         * is authenticated and contains a MAC. If not, the transmitted
        !          2859:         * packet is not authenticated.
        !          2860:         *
        !          2861:         * It is most important when autokey is in use that the local
        !          2862:         * interface IP address be known before the first packet is
        !          2863:         * sent. Otherwise, it is not possible to compute a correct MAC
        !          2864:         * the recipient will accept. Thus, the I/O semantics have to do
        !          2865:         * a little more work. In particular, the wildcard interface
        !          2866:         * might not be usable.
        !          2867:         */
        !          2868:        sendlen = LEN_PKT_NOMAC;
        !          2869: #ifdef OPENSSL
        !          2870:        if (!(peer->flags & FLAG_SKEY) && peer->keyid == 0) {
        !          2871: #else
        !          2872:        if (peer->keyid == 0) {
        !          2873: #endif /* OPENSSL */
        !          2874: 
        !          2875:                /*
        !          2876:                 * Transmit a-priori timestamps
        !          2877:                 */
        !          2878:                get_systime(&xmt_tx);
        !          2879:                if (peer->flip == 0) {  /* basic mode */
        !          2880:                        peer->aorg = xmt_tx;
        !          2881:                        HTONL_FP(&xmt_tx, &xpkt.xmt);
        !          2882:                } else {                /* interleaved modes */
        !          2883:                        if (peer->hmode == MODE_BROADCAST) { /* bcst */
        !          2884:                                HTONL_FP(&xmt_tx, &xpkt.xmt);
        !          2885:                                if (peer->flip > 0)
        !          2886:                                        HTONL_FP(&peer->borg,
        !          2887:                                            &xpkt.org);
        !          2888:                                else
        !          2889:                                        HTONL_FP(&peer->aorg,
        !          2890:                                            &xpkt.org);
        !          2891:                        } else {        /* symmetric */
        !          2892:                                if (peer->flip > 0)
        !          2893:                                        HTONL_FP(&peer->borg,
        !          2894:                                            &xpkt.xmt);
        !          2895:                                else
        !          2896:                                        HTONL_FP(&peer->aorg,
        !          2897:                                            &xpkt.xmt);
        !          2898:                        }
        !          2899:                }
        !          2900:                peer->t21_bytes = sendlen;
        !          2901:                sendpkt(&peer->srcadr, peer->dstadr, sys_ttl[peer->ttl],
        !          2902:                    &xpkt, sendlen);
        !          2903:                peer->sent++;
        !          2904:                peer->throttle += (1 << peer->minpoll) - 2;
        !          2905: 
        !          2906:                /*
        !          2907:                 * Capture a-posteriori timestamps
        !          2908:                 */
        !          2909:                get_systime(&xmt_ty);
        !          2910:                if (peer->flip != 0) {          /* interleaved modes */
        !          2911:                        if (peer->flip > 0)
        !          2912:                                peer->aorg = xmt_ty;
        !          2913:                        else
        !          2914:                                peer->borg = xmt_ty;
        !          2915:                        peer->flip = -peer->flip;
        !          2916:                }
        !          2917:                L_SUB(&xmt_ty, &xmt_tx);
        !          2918:                LFPTOD(&xmt_ty, peer->xleave);
        !          2919: #ifdef DEBUG
        !          2920:                if (debug)
        !          2921:                        printf("transmit: at %ld %s->%s mode %d len %d\n",
        !          2922:                            current_time, peer->dstadr ?
        !          2923:                            stoa(&peer->dstadr->sin) : "-",
        !          2924:                            stoa(&peer->srcadr), peer->hmode, sendlen);
        !          2925: #endif
        !          2926:                return;
        !          2927:        }
        !          2928: 
        !          2929:        /*
        !          2930:         * Authentication is enabled, so the transmitted packet must be
        !          2931:         * authenticated. If autokey is enabled, fuss with the various
        !          2932:         * modes; otherwise, symmetric key cryptography is used.
        !          2933:         */
        !          2934: #ifdef OPENSSL
        !          2935:        if (peer->flags & FLAG_SKEY) {
        !          2936:                struct exten *exten;    /* extension field */
        !          2937: 
        !          2938:                /*
        !          2939:                 * The Public Key Dance (PKD): Cryptographic credentials
        !          2940:                 * are contained in extension fields, each including a
        !          2941:                 * 4-octet length/code word followed by a 4-octet
        !          2942:                 * association ID and optional additional data. Optional
        !          2943:                 * data includes a 4-octet data length field followed by
        !          2944:                 * the data itself. Request messages are sent from a
        !          2945:                 * configured association; response messages can be sent
        !          2946:                 * from a configured association or can take the fast
        !          2947:                 * path without ever matching an association. Response
        !          2948:                 * messages have the same code as the request, but have
        !          2949:                 * a response bit and possibly an error bit set. In this
        !          2950:                 * implementation, a message may contain no more than
        !          2951:                 * one command and one or more responses.
        !          2952:                 *
        !          2953:                 * Cryptographic session keys include both a public and
        !          2954:                 * a private componet. Request and response messages
        !          2955:                 * using extension fields are always sent with the
        !          2956:                 * private component set to zero. Packets without
        !          2957:                 * extension fields indlude the private component when
        !          2958:                 * the session key is generated.
        !          2959:                 */
        !          2960:                while (1) {
        !          2961:                
        !          2962:                        /*
        !          2963:                         * Allocate and initialize a keylist if not
        !          2964:                         * already done. Then, use the list in inverse
        !          2965:                         * order, discarding keys once used. Keep the
        !          2966:                         * latest key around until the next one, so
        !          2967:                         * clients can use client/server packets to
        !          2968:                         * compute propagation delay.
        !          2969:                         *
        !          2970:                         * Note that once a key is used from the list,
        !          2971:                         * it is retained in the key cache until the
        !          2972:                         * next key is used. This is to allow a client
        !          2973:                         * to retrieve the encrypted session key
        !          2974:                         * identifier to verify authenticity.
        !          2975:                         *
        !          2976:                         * If for some reason a key is no longer in the
        !          2977:                         * key cache, a birthday has happened or the key
        !          2978:                         * has expired, so the pseudo-random sequence is
        !          2979:                         * broken. In that case, purge the keylist and
        !          2980:                         * regenerate it.
        !          2981:                         */
        !          2982:                        if (peer->keynumber == 0)
        !          2983:                                make_keylist(peer, peer->dstadr);
        !          2984:                        else
        !          2985:                                peer->keynumber--;
        !          2986:                        xkeyid = peer->keylist[peer->keynumber];
        !          2987:                        if (authistrusted(xkeyid))
        !          2988:                                break;
        !          2989:                        else
        !          2990:                                key_expire(peer);
        !          2991:                }
        !          2992:                peer->keyid = xkeyid;
        !          2993:                exten = NULL;
        !          2994:                switch (peer->hmode) {
        !          2995: 
        !          2996:                /*
        !          2997:                 * In broadcast server mode the autokey values are
        !          2998:                 * required by the broadcast clients. Push them when a
        !          2999:                 * new keylist is generated; otherwise, push the
        !          3000:                 * association message so the client can request them at
        !          3001:                 * other times.
        !          3002:                 */
        !          3003:                case MODE_BROADCAST:
        !          3004:                        if (peer->flags & FLAG_ASSOC)
        !          3005:                                exten = crypto_args(peer, CRYPTO_AUTO |
        !          3006:                                    CRYPTO_RESP, peer->associd, NULL);
        !          3007:                        else
        !          3008:                                exten = crypto_args(peer, CRYPTO_ASSOC |
        !          3009:                                    CRYPTO_RESP, peer->associd, NULL);
        !          3010:                        break;
        !          3011: 
        !          3012:                /*
        !          3013:                 * In symmetric modes the parameter, certificate, 
        !          3014:                 * identity, cookie and autokey exchanges are
        !          3015:                 * required. The leapsecond exchange is optional. But, a
        !          3016:                 * peer will not believe the other peer until the other
        !          3017:                 * peer has synchronized, so the certificate exchange
        !          3018:                 * might loop until then. If a peer finds a broken
        !          3019:                 * autokey sequence, it uses the autokey exchange to
        !          3020:                 * retrieve the autokey values. In any case, if a new
        !          3021:                 * keylist is generated, the autokey values are pushed.
        !          3022:                 */
        !          3023:                case MODE_ACTIVE:
        !          3024:                case MODE_PASSIVE:
        !          3025: 
        !          3026:                        /*
        !          3027:                         * Parameter, certificate and identity.
        !          3028:                         */
        !          3029:                        if (!peer->crypto)
        !          3030:                                exten = crypto_args(peer, CRYPTO_ASSOC,
        !          3031:                                    peer->associd, sys_hostname);
        !          3032:                        else if (!(peer->crypto & CRYPTO_FLAG_CERT))
        !          3033:                                exten = crypto_args(peer, CRYPTO_CERT,
        !          3034:                                    peer->associd, peer->issuer);
        !          3035:                        else if (!(peer->crypto & CRYPTO_FLAG_VRFY))
        !          3036:                                exten = crypto_args(peer,
        !          3037:                                    crypto_ident(peer), peer->associd,
        !          3038:                                    NULL);
        !          3039: 
        !          3040:                        /*
        !          3041:                         * Cookie and autokey. We request the cookie
        !          3042:                         * only when the this peer and the other peer
        !          3043:                         * are synchronized. But, this peer needs the
        !          3044:                         * autokey values when the cookie is zero. Any
        !          3045:                         * time we regenerate the key list, we offer the
        !          3046:                         * autokey values without being asked. If for
        !          3047:                         * some reason either peer finds a broken
        !          3048:                         * autokey sequence, the autokey exchange is
        !          3049:                         * used to retrieve the autokey values.
        !          3050:                         */
        !          3051:                        else if (sys_leap != LEAP_NOTINSYNC &&
        !          3052:                            peer->leap != LEAP_NOTINSYNC &&
        !          3053:                            !(peer->crypto & CRYPTO_FLAG_COOK))
        !          3054:                                exten = crypto_args(peer, CRYPTO_COOK,
        !          3055:                                    peer->associd, NULL);
        !          3056:                        else if (!(peer->crypto & CRYPTO_FLAG_AUTO))
        !          3057:                                exten = crypto_args(peer, CRYPTO_AUTO,
        !          3058:                                    peer->associd, NULL);
        !          3059:                        else if (peer->flags & FLAG_ASSOC &&
        !          3060:                            peer->crypto & CRYPTO_FLAG_SIGN)
        !          3061:                                exten = crypto_args(peer, CRYPTO_AUTO |
        !          3062:                                    CRYPTO_RESP, peer->assoc, NULL);
        !          3063: 
        !          3064:                        /*
        !          3065:                         * Wait for clock sync, then sign the
        !          3066:                         * certificate and retrieve the leapsecond
        !          3067:                         * values.
        !          3068:                         */
        !          3069:                        else if (sys_leap == LEAP_NOTINSYNC)
        !          3070:                                break;
        !          3071: 
        !          3072:                        else if (!(peer->crypto & CRYPTO_FLAG_SIGN))
        !          3073:                                exten = crypto_args(peer, CRYPTO_SIGN,
        !          3074:                                    peer->associd, sys_hostname);
        !          3075:                        else if (!(peer->crypto & CRYPTO_FLAG_LEAP))
        !          3076:                                exten = crypto_args(peer, CRYPTO_LEAP,
        !          3077:                                    peer->associd, NULL);
        !          3078:                        break;
        !          3079: 
        !          3080:                /*
        !          3081:                 * In client mode the parameter, certificate, identity,
        !          3082:                 * cookie and sign exchanges are required. The
        !          3083:                 * leapsecond exchange is optional. If broadcast client
        !          3084:                 * mode the same exchanges are required, except that the
        !          3085:                 * autokey exchange is substitutes for the cookie
        !          3086:                 * exchange, since the cookie is always zero. If the
        !          3087:                 * broadcast client finds a broken autokey sequence, it
        !          3088:                 * uses the autokey exchange to retrieve the autokey
        !          3089:                 * values.
        !          3090:                 */
        !          3091:                case MODE_CLIENT:
        !          3092: 
        !          3093:                        /*
        !          3094:                         * Parameter, certificate and identity.
        !          3095:                         */
        !          3096:                        if (!peer->crypto)
        !          3097:                                exten = crypto_args(peer, CRYPTO_ASSOC,
        !          3098:                                    peer->associd, sys_hostname);
        !          3099:                        else if (!(peer->crypto & CRYPTO_FLAG_CERT))
        !          3100:                                exten = crypto_args(peer, CRYPTO_CERT,
        !          3101:                                    peer->associd, peer->issuer);
        !          3102:                        else if (!(peer->crypto & CRYPTO_FLAG_VRFY))
        !          3103:                                exten = crypto_args(peer,
        !          3104:                                    crypto_ident(peer), peer->associd,
        !          3105:                                    NULL);
        !          3106: 
        !          3107:                        /*
        !          3108:                         * Cookie and autokey. These are requests, but
        !          3109:                         * we use the peer association ID with autokey
        !          3110:                         * rather than our own.
        !          3111:                         */
        !          3112:                        else if (!(peer->crypto & CRYPTO_FLAG_COOK))
        !          3113:                                exten = crypto_args(peer, CRYPTO_COOK,
        !          3114:                                    peer->associd, NULL);
        !          3115:                        else if (!(peer->crypto & CRYPTO_FLAG_AUTO))
        !          3116:                                exten = crypto_args(peer, CRYPTO_AUTO,
        !          3117:                                    peer->assoc, NULL);
        !          3118: 
        !          3119:                        /*
        !          3120:                         * Wait for clock sync, then sign the
        !          3121:                         * certificate and retrieve the leapsecond
        !          3122:                         * values.
        !          3123:                         */
        !          3124:                        else if (sys_leap == LEAP_NOTINSYNC)
        !          3125:                                break;
        !          3126: 
        !          3127:                        else if (!(peer->crypto & CRYPTO_FLAG_SIGN))
        !          3128:                                exten = crypto_args(peer, CRYPTO_SIGN,
        !          3129:                                    peer->associd, sys_hostname);
        !          3130:                        else if (!(peer->crypto & CRYPTO_FLAG_LEAP))
        !          3131:                                exten = crypto_args(peer, CRYPTO_LEAP,
        !          3132:                                    peer->associd, NULL);
        !          3133:                        break;
        !          3134:                }
        !          3135: 
        !          3136:                /*
        !          3137:                 * Add a queued extension field if present. This is
        !          3138:                 * always a request message, so the reply ID is already
        !          3139:                 * in the message. If an error occurs, the error bit is
        !          3140:                 * lit in the response.
        !          3141:                 */
        !          3142:                if (peer->cmmd != NULL) {
        !          3143:                        u_int32 temp32;
        !          3144: 
        !          3145:                        temp32 = CRYPTO_RESP;
        !          3146:                        peer->cmmd->opcode |= htonl(temp32);
        !          3147:                        sendlen += crypto_xmit(peer, &xpkt, NULL,
        !          3148:                            sendlen, peer->cmmd, 0);
        !          3149:                        free(peer->cmmd);
        !          3150:                        peer->cmmd = NULL;
        !          3151:                }
        !          3152: 
        !          3153:                /*
        !          3154:                 * Add an extension field created above. All but the
        !          3155:                 * autokey response message are request messages.
        !          3156:                 */
        !          3157:                if (exten != NULL) {
        !          3158:                        if (exten->opcode != 0)
        !          3159:                                sendlen += crypto_xmit(peer, &xpkt,
        !          3160:                                    NULL, sendlen, exten, 0);
        !          3161:                        free(exten);
        !          3162:                }
        !          3163: 
        !          3164:                /*
        !          3165:                 * Calculate the next session key. Since extension
        !          3166:                 * fields are present, the cookie value is zero.
        !          3167:                 */
        !          3168:                if (sendlen > LEN_PKT_NOMAC) {
        !          3169:                        session_key(&peer->dstadr->sin, &peer->srcadr,
        !          3170:                            xkeyid, 0, 2);
        !          3171:                }
        !          3172:        } 
        !          3173: #endif /* OPENSSL */
        !          3174: 
        !          3175:        /*
        !          3176:         * Transmit a-priori timestamps
        !          3177:         */
        !          3178:        get_systime(&xmt_tx);
        !          3179:        if (peer->flip == 0) {          /* basic mode */
        !          3180:                peer->aorg = xmt_tx;
        !          3181:                HTONL_FP(&xmt_tx, &xpkt.xmt);
        !          3182:        } else {                        /* interleaved modes */
        !          3183:                if (peer->hmode == MODE_BROADCAST) { /* bcst */
        !          3184:                        HTONL_FP(&xmt_tx, &xpkt.xmt);
        !          3185:                        if (peer->flip > 0)
        !          3186:                                HTONL_FP(&peer->borg, &xpkt.org);
        !          3187:                        else
        !          3188:                                HTONL_FP(&peer->aorg, &xpkt.org);
        !          3189:                } else {                /* symmetric */
        !          3190:                        if (peer->flip > 0)
        !          3191:                                HTONL_FP(&peer->borg, &xpkt.xmt);
        !          3192:                        else
        !          3193:                                HTONL_FP(&peer->aorg, &xpkt.xmt);
        !          3194:                }
        !          3195:        }
        !          3196:        xkeyid = peer->keyid;
        !          3197:        authlen = authencrypt(xkeyid, (u_int32 *)&xpkt, sendlen);
        !          3198:        if (authlen == 0) {
        !          3199:                report_event(PEVNT_AUTH, peer, "no key");
        !          3200:                peer->flash |= TEST5;           /* auth error */
        !          3201:                peer->badauth++;
        !          3202:                return;
        !          3203:        }
        !          3204:        sendlen += authlen;
        !          3205: #ifdef OPENSSL
        !          3206:        if (xkeyid > NTP_MAXKEY)
        !          3207:                authtrust(xkeyid, 0);
        !          3208: #endif /* OPENSSL */
        !          3209:        if (sendlen > sizeof(xpkt)) {
        !          3210:                msyslog(LOG_ERR, "proto: buffer overflow %u", sendlen);
        !          3211:                exit (-1);
        !          3212:        }
        !          3213:        peer->t21_bytes = sendlen;
        !          3214:        sendpkt(&peer->srcadr, peer->dstadr, sys_ttl[peer->ttl], &xpkt,
        !          3215:            sendlen);
        !          3216:        peer->sent++;
        !          3217:        peer->throttle += (1 << peer->minpoll) - 2;
        !          3218: 
        !          3219:        /*
        !          3220:         * Capture a-posteriori timestamps
        !          3221:         */
        !          3222:        get_systime(&xmt_ty);
        !          3223:        if (peer->flip != 0) {                  /* interleaved modes */
        !          3224:                if (peer->flip > 0)
        !          3225:                        peer->aorg = xmt_ty;
        !          3226:                else
        !          3227:                        peer->borg = xmt_ty;
        !          3228:                peer->flip = -peer->flip;
        !          3229:        }
        !          3230:        L_SUB(&xmt_ty, &xmt_tx);
        !          3231:        LFPTOD(&xmt_ty, peer->xleave);
        !          3232: #ifdef OPENSSL
        !          3233: #ifdef DEBUG
        !          3234:        if (debug)
        !          3235:                printf("transmit: at %ld %s->%s mode %d keyid %08x len %d index %d\n",
        !          3236:                    current_time, peer->dstadr ?
        !          3237:                    ntoa(&peer->dstadr->sin) : "-",
        !          3238:                    ntoa(&peer->srcadr), peer->hmode, xkeyid, sendlen,
        !          3239:                    peer->keynumber);
        !          3240: #endif
        !          3241: #else /* OPENSSL */
        !          3242: #ifdef DEBUG
        !          3243:        if (debug)
        !          3244:                printf("transmit: at %ld %s->%s mode %d keyid %08x len %d\n",
        !          3245:                    current_time, peer->dstadr ?
        !          3246:                    ntoa(&peer->dstadr->sin) : "-",
        !          3247:                    ntoa(&peer->srcadr), peer->hmode, xkeyid, sendlen);
        !          3248: #endif
        !          3249: #endif /* OPENSSL */
        !          3250: }
        !          3251: 
        !          3252: 
        !          3253: /*
        !          3254:  * fast_xmit - Send packet for nonpersistent association. Note that
        !          3255:  * neither the source or destination can be a broadcast address.
        !          3256:  */
        !          3257: static void
        !          3258: fast_xmit(
        !          3259:        struct recvbuf *rbufp,  /* receive packet pointer */
        !          3260:        int     xmode,          /* receive mode */
        !          3261:        keyid_t xkeyid,         /* transmit key ID */
        !          3262:        int     flags           /* restrict mask */
        !          3263:        )
        !          3264: {
        !          3265:        struct pkt xpkt;        /* transmit packet structure */
        !          3266:        struct pkt *rpkt;       /* receive packet structure */
        !          3267:        l_fp    xmt_tx, xmt_ty;
        !          3268:        int     sendlen;
        !          3269: #ifdef OPENSSL
        !          3270:        u_int32 temp32;
        !          3271: #endif
        !          3272: 
        !          3273:        /*
        !          3274:         * Initialize transmit packet header fields from the receive
        !          3275:         * buffer provided. We leave the fields intact as received, but
        !          3276:         * set the peer poll at the maximum of the receive peer poll and
        !          3277:         * the system minimum poll (ntp_minpoll). This is for KoD rate
        !          3278:         * control and not strictly specification compliant, but doesn't
        !          3279:         * break anything.
        !          3280:         *
        !          3281:         * If the gazinta was from a multicast address, the gazoutta
        !          3282:         * must go out another way.
        !          3283:         */
        !          3284:        rpkt = &rbufp->recv_pkt;
        !          3285:        if (rbufp->dstadr->flags & INT_MCASTOPEN)
        !          3286:                rbufp->dstadr = findinterface(&rbufp->recv_srcadr);
        !          3287: 
        !          3288:        /*
        !          3289:         * If this is a kiss-o'-death (KoD) packet, show leap
        !          3290:         * unsynchronized, stratum zero, reference ID the four-character
        !          3291:         * kiss code and system root delay. Note we don't reveal the
        !          3292:         * local time, so these packets can't be used for
        !          3293:         * synchronization.
        !          3294:         */
        !          3295:        if (flags & RES_KOD) {
        !          3296:                sys_kodsent++;
        !          3297:                xpkt.li_vn_mode = PKT_LI_VN_MODE(LEAP_NOTINSYNC,
        !          3298:                    PKT_VERSION(rpkt->li_vn_mode), xmode);
        !          3299:                xpkt.stratum = STRATUM_PKT_UNSPEC;
        !          3300:                xpkt.ppoll = max(rpkt->ppoll, ntp_minpoll);
        !          3301:                memcpy(&xpkt.refid, "RATE", 4);
        !          3302:                xpkt.org = rpkt->xmt;
        !          3303:                xpkt.rec = rpkt->xmt;
        !          3304:                xpkt.xmt = rpkt->xmt;
        !          3305: 
        !          3306:        /*
        !          3307:         * This is a normal packet. Use the system variables.
        !          3308:         */
        !          3309:        } else {
        !          3310:                xpkt.li_vn_mode = PKT_LI_VN_MODE(sys_leap,
        !          3311:                    PKT_VERSION(rpkt->li_vn_mode), xmode);
        !          3312:                xpkt.stratum = STRATUM_TO_PKT(sys_stratum);
        !          3313:                xpkt.ppoll = max(rpkt->ppoll, ntp_minpoll);
        !          3314:                xpkt.precision = sys_precision;
        !          3315:                xpkt.refid = sys_refid;
        !          3316:                xpkt.rootdelay = HTONS_FP(DTOFP(sys_rootdelay));
        !          3317:                xpkt.rootdisp = HTONS_FP(DTOUFP(sys_rootdisp));
        !          3318:                HTONL_FP(&sys_reftime, &xpkt.reftime);
        !          3319:                xpkt.org = rpkt->xmt;
        !          3320:                HTONL_FP(&rbufp->recv_time, &xpkt.rec);
        !          3321:                get_systime(&xmt_tx);
        !          3322:                HTONL_FP(&xmt_tx, &xpkt.xmt);
        !          3323:        }
        !          3324: 
        !          3325: #ifdef HAVE_NTP_SIGND
        !          3326:        if (flags & RES_MSSNTP) {
        !          3327:                send_via_ntp_signd(rbufp, xmode, xkeyid, flags, &xpkt);
        !          3328:                return;
        !          3329:        }
        !          3330: #endif /* HAVE_NTP_SIGND */
        !          3331: 
        !          3332:        /*
        !          3333:         * If the received packet contains a MAC, the transmitted packet
        !          3334:         * is authenticated and contains a MAC. If not, the transmitted
        !          3335:         * packet is not authenticated.
        !          3336:         */
        !          3337:        sendlen = LEN_PKT_NOMAC;
        !          3338:        if (rbufp->recv_length == sendlen) {
        !          3339:                sendpkt(&rbufp->recv_srcadr, rbufp->dstadr, 0, &xpkt,
        !          3340:                    sendlen);
        !          3341: #ifdef DEBUG
        !          3342:                if (debug)
        !          3343:                        printf(
        !          3344:                            "transmit: at %ld %s->%s mode %d len %d\n",
        !          3345:                            current_time, stoa(&rbufp->dstadr->sin),
        !          3346:                            stoa(&rbufp->recv_srcadr), xmode, sendlen);
        !          3347: #endif
        !          3348:                return;
        !          3349:        }
        !          3350: 
        !          3351:        /*
        !          3352:         * The received packet contains a MAC, so the transmitted packet
        !          3353:         * must be authenticated. For symmetric key cryptography, use
        !          3354:         * the predefined and trusted symmetric keys to generate the
        !          3355:         * cryptosum. For autokey cryptography, use the server private
        !          3356:         * value to generate the cookie, which is unique for every
        !          3357:         * source-destination-key ID combination.
        !          3358:         */
        !          3359: #ifdef OPENSSL
        !          3360:        if (xkeyid > NTP_MAXKEY) {
        !          3361:                keyid_t cookie;
        !          3362: 
        !          3363:                /*
        !          3364:                 * The only way to get here is a reply to a legitimate
        !          3365:                 * client request message, so the mode must be
        !          3366:                 * MODE_SERVER. If an extension field is present, there
        !          3367:                 * can be only one and that must be a command. Do what
        !          3368:                 * needs, but with private value of zero so the poor
        !          3369:                 * jerk can decode it. If no extension field is present,
        !          3370:                 * use the cookie to generate the session key.
        !          3371:                 */
        !          3372:                cookie = session_key(&rbufp->recv_srcadr,
        !          3373:                    &rbufp->dstadr->sin, 0, sys_private, 0);
        !          3374:                if (rbufp->recv_length > sendlen + MAX_MAC_LEN) {
        !          3375:                        session_key(&rbufp->dstadr->sin,
        !          3376:                            &rbufp->recv_srcadr, xkeyid, 0, 2);
        !          3377:                        temp32 = CRYPTO_RESP;
        !          3378:                        rpkt->exten[0] |= htonl(temp32);
        !          3379:                        sendlen += crypto_xmit(NULL, &xpkt, rbufp,
        !          3380:                            sendlen, (struct exten *)rpkt->exten,
        !          3381:                            cookie);
        !          3382:                } else {
        !          3383:                        session_key(&rbufp->dstadr->sin,
        !          3384:                            &rbufp->recv_srcadr, xkeyid, cookie, 2);
        !          3385:                }
        !          3386:        }
        !          3387: #endif /* OPENSSL */
        !          3388:        get_systime(&xmt_tx);
        !          3389:        sendlen += authencrypt(xkeyid, (u_int32 *)&xpkt, sendlen);
        !          3390: #ifdef OPENSSL
        !          3391:        if (xkeyid > NTP_MAXKEY)
        !          3392:                authtrust(xkeyid, 0);
        !          3393: #endif /* OPENSSL */
        !          3394:        sendpkt(&rbufp->recv_srcadr, rbufp->dstadr, 0, &xpkt, sendlen);
        !          3395:        get_systime(&xmt_ty);
        !          3396:        L_SUB(&xmt_ty, &xmt_tx);
        !          3397:        sys_authdelay = xmt_ty;
        !          3398: #ifdef DEBUG
        !          3399:        if (debug)
        !          3400:                printf(
        !          3401:                    "transmit: at %ld %s->%s mode %d keyid %08x len %d\n",
        !          3402:                    current_time, ntoa(&rbufp->dstadr->sin),
        !          3403:                    ntoa(&rbufp->recv_srcadr), xmode, xkeyid, sendlen);
        !          3404: #endif
        !          3405: }
        !          3406: 
        !          3407: 
        !          3408: #ifdef OPENSSL
        !          3409: /*
        !          3410:  * key_expire - purge the key list
        !          3411:  */
        !          3412: void
        !          3413: key_expire(
        !          3414:        struct peer *peer       /* peer structure pointer */
        !          3415:        )
        !          3416: {
        !          3417:        int i;
        !          3418: 
        !          3419:        if (peer->keylist != NULL) {
        !          3420:                for (i = 0; i <= peer->keynumber; i++)
        !          3421:                        authtrust(peer->keylist[i], 0);
        !          3422:                free(peer->keylist);
        !          3423:                peer->keylist = NULL;
        !          3424:        }
        !          3425:        value_free(&peer->sndval);
        !          3426:        peer->keynumber = 0;
        !          3427:        peer->flags &= ~FLAG_ASSOC;
        !          3428: #ifdef DEBUG
        !          3429:        if (debug)
        !          3430:                printf("key_expire: at %lu associd %d\n", current_time,
        !          3431:                    peer->associd);
        !          3432: #endif
        !          3433: }
        !          3434: #endif /* OPENSSL */
        !          3435: 
        !          3436: 
        !          3437: /*
        !          3438:  * local_refid(peer) - check peer refid to avoid selecting peers
        !          3439:  *                    currently synced to this ntpd.
        !          3440:  */
        !          3441: static int
        !          3442: local_refid(
        !          3443:        struct peer *   p
        !          3444:        )
        !          3445: {
        !          3446:        endpt * unicast_ep;
        !          3447: 
        !          3448:        if (p->dstadr != NULL && !(INT_MCASTIF & p->dstadr->flags))
        !          3449:                unicast_ep = p->dstadr;
        !          3450:        else
        !          3451:                unicast_ep = findinterface(&p->srcadr);
        !          3452: 
        !          3453:        if (unicast_ep != NULL && p->refid == unicast_ep->addr_refid)
        !          3454:                return TRUE;
        !          3455:        else
        !          3456:                return FALSE;
        !          3457: }
        !          3458: 
        !          3459: 
        !          3460: /*
        !          3461:  * Determine if the peer is unfit for synchronization
        !          3462:  *
        !          3463:  * A peer is unfit for synchronization if
        !          3464:  * > TEST10 bad leap or stratum below floor or at or above ceiling
        !          3465:  * > TEST11 root distance exceeded for remote peer
        !          3466:  * > TEST12 a direct or indirect synchronization loop would form
        !          3467:  * > TEST13 unreachable or noselect
        !          3468:  */
        !          3469: int                            /* FALSE if fit, TRUE if unfit */
        !          3470: peer_unfit(
        !          3471:        struct peer *peer       /* peer structure pointer */
        !          3472:        )
        !          3473: {
        !          3474:        int     rval = 0;
        !          3475: 
        !          3476:        /*
        !          3477:         * A stratum error occurs if (1) the server has never been
        !          3478:         * synchronized, (2) the server stratum is below the floor or
        !          3479:         * greater than or equal to the ceiling.
        !          3480:         */
        !          3481:        if (peer->leap == LEAP_NOTINSYNC || peer->stratum < sys_floor ||
        !          3482:            peer->stratum >= sys_ceiling)
        !          3483:                rval |= TEST10;         /* bad synch or stratum */
        !          3484: 
        !          3485:        /*
        !          3486:         * A distance error for a remote peer occurs if the root
        !          3487:         * distance is greater than or equal to the distance threshold
        !          3488:         * plus the increment due to one host poll interval.
        !          3489:         */
        !          3490:        if (!(peer->flags & FLAG_REFCLOCK) && root_distance(peer) >=
        !          3491:            sys_maxdist + clock_phi * ULOGTOD(peer->hpoll))
        !          3492:                rval |= TEST11;         /* distance exceeded */
        !          3493: 
        !          3494:        /*
        !          3495:         * A loop error occurs if the remote peer is synchronized to the
        !          3496:         * local peer or if the remote peer is synchronized to the same
        !          3497:         * server as the local peer but only if the remote peer is
        !          3498:         * neither a reference clock nor an orphan.
        !          3499:         */
        !          3500:        if (peer->stratum > 1 && local_refid(peer))
        !          3501:                rval |= TEST12;         /* synchronization loop */
        !          3502: 
        !          3503:        /*
        !          3504:         * An unreachable error occurs if the server is unreachable or
        !          3505:         * the noselect bit is set.
        !          3506:         */
        !          3507:        if (!peer->reach || (peer->flags & FLAG_NOSELECT))
        !          3508:                rval |= TEST13;         /* unreachable */
        !          3509: 
        !          3510:        peer->flash &= ~PEER_TEST_MASK;
        !          3511:        peer->flash |= rval;
        !          3512:        return (rval);
        !          3513: }
        !          3514: 
        !          3515: 
        !          3516: /*
        !          3517:  * Find the precision of this particular machine
        !          3518:  */
        !          3519: #define MINSTEP 100e-9         /* minimum clock increment (s) */
        !          3520: #define MAXSTEP 20e-3          /* maximum clock increment (s) */
        !          3521: #define MINLOOPS 5             /* minimum number of step samples */
        !          3522: 
        !          3523: /*
        !          3524:  * This routine measures the system precision defined as the minimum of
        !          3525:  * a sequence of differences between successive readings of the system
        !          3526:  * clock. However, if a difference is less than MINSTEP, the clock has
        !          3527:  * been read more than once during a clock tick and the difference is
        !          3528:  * ignored. We set MINSTEP greater than zero in case something happens
        !          3529:  * like a cache miss.
        !          3530:  */
        !          3531: int
        !          3532: default_get_precision(void)
        !          3533: {
        !          3534:        l_fp    val;            /* current seconds fraction */
        !          3535:        l_fp    last;           /* last seconds fraction */
        !          3536:        l_fp    diff;           /* difference */
        !          3537:        double  tick;           /* computed tick value */
        !          3538:        double  dtemp;          /* scratch */
        !          3539:        int     i;              /* log2 precision */
        !          3540: 
        !          3541:        /*
        !          3542:         * Loop to find precision value in seconds.
        !          3543:         */
        !          3544:        tick = MAXSTEP;
        !          3545:        i = 0;
        !          3546:        get_systime(&last);
        !          3547:        while (1) {
        !          3548:                get_systime(&val);
        !          3549:                diff = val;
        !          3550:                L_SUB(&diff, &last);
        !          3551:                last = val;
        !          3552:                LFPTOD(&diff, dtemp);
        !          3553:                if (dtemp < MINSTEP)
        !          3554:                        continue;
        !          3555: 
        !          3556:                if (dtemp < tick)
        !          3557:                        tick = dtemp;
        !          3558:                if (++i >= MINLOOPS)
        !          3559:                        break;
        !          3560:        }
        !          3561:        sys_tick = tick;
        !          3562: 
        !          3563:        /*
        !          3564:         * Find the nearest power of two.
        !          3565:         */
        !          3566:        msyslog(LOG_NOTICE, "proto: precision = %.3f usec", tick * 1e6);
        !          3567:        for (i = 0; tick <= 1; i++)
        !          3568:                tick *= 2;
        !          3569:        if (tick - 1 > 1 - tick / 2)
        !          3570:                i--;
        !          3571:        return (-i);
        !          3572: }
        !          3573: 
        !          3574: 
        !          3575: /*
        !          3576:  * init_proto - initialize the protocol module's data
        !          3577:  */
        !          3578: void
        !          3579: init_proto(void)
        !          3580: {
        !          3581:        l_fp    dummy;
        !          3582:        int     i;
        !          3583: 
        !          3584:        /*
        !          3585:         * Fill in the sys_* stuff.  Default is don't listen to
        !          3586:         * broadcasting, require authentication.
        !          3587:         */
        !          3588:        sys_leap = LEAP_NOTINSYNC;
        !          3589:        sys_stratum = STRATUM_UNSPEC;
        !          3590:        memcpy(&sys_refid, "INIT", 4);
        !          3591:        sys_peer = NULL;
        !          3592:        sys_rootdelay = 0;
        !          3593:        sys_rootdisp = 0;
        !          3594:        L_CLR(&sys_reftime);
        !          3595:        sys_jitter = 0;
        !          3596:        sys_precision = (s_char)default_get_precision();
        !          3597:        get_systime(&dummy);
        !          3598:        sys_survivors = 0;
        !          3599:        sys_manycastserver = 0;
        !          3600:        sys_bclient = 0;
        !          3601:        sys_bdelay = 0;
        !          3602:        sys_authenticate = 1;
        !          3603:        sys_stattime = current_time;
        !          3604:        proto_clr_stats();
        !          3605:        for (i = 0; i < MAX_TTL; i++) {
        !          3606:                sys_ttl[i] = (u_char)((i * 256) / MAX_TTL);
        !          3607:                sys_ttlmax = i;
        !          3608:        }
        !          3609:        pps_enable = 0;
        !          3610:        stats_control = 1;
        !          3611: }
        !          3612: 
        !          3613: 
        !          3614: /*
        !          3615:  * proto_config - configure the protocol module
        !          3616:  */
        !          3617: void
        !          3618: proto_config(
        !          3619:        int     item,
        !          3620:        u_long  value,
        !          3621:        double  dvalue,
        !          3622:        sockaddr_u *svalue
        !          3623:        )
        !          3624: {
        !          3625:        /*
        !          3626:         * Figure out what he wants to change, then do it
        !          3627:         */
        !          3628:        DPRINTF(2, ("proto_config: code %d value %lu dvalue %lf\n",
        !          3629:                    item, value, dvalue));
        !          3630: 
        !          3631:        switch (item) {
        !          3632: 
        !          3633:        /*
        !          3634:         * enable and disable commands - arguments are Boolean.
        !          3635:         */
        !          3636:        case PROTO_AUTHENTICATE: /* authentication (auth) */
        !          3637:                sys_authenticate = value;
        !          3638:                break;
        !          3639: 
        !          3640:        case PROTO_BROADCLIENT: /* broadcast client (bclient) */
        !          3641:                sys_bclient = (int)value;
        !          3642:                if (sys_bclient == 0)
        !          3643:                        io_unsetbclient();
        !          3644:                else
        !          3645:                        io_setbclient();
        !          3646:                break;
        !          3647: 
        !          3648: #ifdef REFCLOCK
        !          3649:        case PROTO_CAL:         /* refclock calibrate (calibrate) */
        !          3650:                cal_enable = value;
        !          3651:                break;
        !          3652: #endif /* REFCLOCK */
        !          3653: 
        !          3654:        case PROTO_KERNEL:      /* kernel discipline (kernel) */
        !          3655:                kern_enable = value;
        !          3656:                break;
        !          3657: 
        !          3658:        case PROTO_MONITOR:     /* monitoring (monitor) */
        !          3659:                if (value)
        !          3660:                        mon_start(MON_ON);
        !          3661:                else
        !          3662:                        mon_stop(MON_ON);
        !          3663:                break;
        !          3664: 
        !          3665:        case PROTO_NTP:         /* NTP discipline (ntp) */
        !          3666:                ntp_enable = value;
        !          3667:                break;
        !          3668: 
        !          3669:        case PROTO_PPS:         /* PPS discipline (pps) */
        !          3670:                pps_enable = value;
        !          3671:                break;
        !          3672: 
        !          3673:        case PROTO_FILEGEN:     /* statistics (stats) */
        !          3674:                stats_control = value;
        !          3675:                break;
        !          3676: 
        !          3677:        /*
        !          3678:         * tos command - arguments are double, sometimes cast to int
        !          3679:         */
        !          3680:        case PROTO_BEACON:      /* manycast beacon (beacon) */
        !          3681:                sys_beacon = (int)dvalue;
        !          3682:                break;
        !          3683: 
        !          3684:        case PROTO_BROADDELAY:  /* default broadcast delay (bdelay) */
        !          3685:                sys_bdelay = dvalue;
        !          3686:                break;
        !          3687: 
        !          3688:        case PROTO_CEILING:     /* stratum ceiling (ceiling) */
        !          3689:                sys_ceiling = (int)dvalue;
        !          3690:                break;
        !          3691: 
        !          3692:        case PROTO_COHORT:      /* cohort switch (cohort) */
        !          3693:                sys_cohort = (int)dvalue;
        !          3694:                break;
        !          3695: 
        !          3696:        case PROTO_FLOOR:       /* stratum floor (floor) */
        !          3697:                sys_floor = (int)dvalue;
        !          3698:                break;
        !          3699: 
        !          3700:        case PROTO_MAXCLOCK:    /* maximum candidates (maxclock) */
        !          3701:                sys_maxclock = (int)dvalue;
        !          3702:                break;
        !          3703: 
        !          3704:        case PROTO_MAXDIST:     /* select threshold (maxdist) */
        !          3705:                sys_maxdist = dvalue;
        !          3706:                break;
        !          3707: 
        !          3708:        case PROTO_CALLDELAY:   /* modem call delay (mdelay) */
        !          3709:                break;          /* NOT USED */
        !          3710: 
        !          3711:        case PROTO_MINCLOCK:    /* minimum candidates (minclock) */
        !          3712:                sys_minclock = (int)dvalue;
        !          3713:                break;
        !          3714: 
        !          3715:        case PROTO_MINDISP:     /* minimum distance (mindist) */
        !          3716:                sys_mindisp = dvalue;
        !          3717:                break;
        !          3718: 
        !          3719:        case PROTO_MINSANE:     /* minimum survivors (minsane) */
        !          3720:                sys_minsane = (int)dvalue;
        !          3721:                break;
        !          3722: 
        !          3723:        case PROTO_ORPHAN:      /* orphan stratum (orphan) */
        !          3724:                sys_orphan = (int)dvalue;
        !          3725:                break;
        !          3726: 
        !          3727:        case PROTO_ADJ:         /* tick increment (tick) */
        !          3728:                sys_tick = dvalue;
        !          3729:                break;
        !          3730: 
        !          3731:        /*
        !          3732:         * Miscellaneous commands
        !          3733:         */
        !          3734:        case PROTO_MULTICAST_ADD: /* add group address */
        !          3735:                if (svalue != NULL)
        !          3736:                        io_multicast_add(svalue);
        !          3737:                sys_bclient = 1;
        !          3738:                break;
        !          3739: 
        !          3740:        case PROTO_MULTICAST_DEL: /* delete group address */
        !          3741:                if (svalue != NULL)
        !          3742:                        io_multicast_del(svalue);
        !          3743:                break;
        !          3744: 
        !          3745:        default:
        !          3746:                msyslog(LOG_NOTICE,
        !          3747:                    "proto: unsupported option %d", item);
        !          3748:        }
        !          3749: }
        !          3750: 
        !          3751: 
        !          3752: /*
        !          3753:  * proto_clr_stats - clear protocol stat counters
        !          3754:  */
        !          3755: void
        !          3756: proto_clr_stats(void)
        !          3757: {
        !          3758:        sys_stattime = current_time;
        !          3759:        sys_received = 0;
        !          3760:        sys_processed = 0;
        !          3761:        sys_newversion = 0;
        !          3762:        sys_oldversion = 0;
        !          3763:        sys_declined = 0;
        !          3764:        sys_restricted = 0;
        !          3765:        sys_badlength = 0;
        !          3766:        sys_badauth = 0;
        !          3767:        sys_limitrejected = 0;
        !          3768: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>