Lines Matching +full:non +full:- +full:interleaved
2 * ntp_proto.c - NTP version 4 protocol machinery
31 # define BDELAY_DEFAULT (-0.050)
38 x.l_ui &= ~((1 << SRVFUZ_SHIFT) - 1U); \
50 AUTH_UNKNOWN = -1, /* Unknown */
167 int sys_ceiling = STRATUM_UNSPEC - 1; /* cluster stratum ceiling */
179 * Statistics counters - first the good, then the bad
196 * The default way is "on-receipt". If this was a packet from a
197 * well-behaved source, on-receipt will offer the fastest recovery.
199 * for a bad-guy to DoS us. So look and see what bites you harder
314 if (rbufp->recv_length == base_packet_length) { in valid_NAK()
318 remainder_size = rbufp->recv_length - base_packet_length; in valid_NAK()
340 rpkt = &rbufp->recv_pkt; in valid_NAK()
352 if (!peer || (!peer->keyid && !(peer->flags & FLAG_SKEY))) { in valid_NAK()
360 if (FLAG_LOOPNONCE & peer->flags) { in valid_NAK()
361 myorg = &peer->nonce; in valid_NAK()
363 if (peer->flip > 0) { in valid_NAK()
364 myorg = &peer->borg; in valid_NAK()
366 myorg = &peer->aorg; in valid_NAK()
370 NTOHL_FP(&rpkt->org, &p_org); in valid_NAK()
379 * as safe as we can ever be with an unauthenticated crypto-nak. in valid_NAK()
386 * transmit - transmit procedure called by poll timeout
401 hpoll = peer->hpoll; in transmit()
407 if (peer->outdate > peer->timelastrec && !peer->reach) in transmit()
408 peer->ppoll = peer->maxpoll; in transmit()
414 if (peer->cast_flags & (MDF_BCAST | MDF_MCAST)) { in transmit()
415 peer->outdate = current_time; in transmit()
431 * this code is not quite right -- peer->unreach counts polls in transmit()
435 if (peer->cast_flags & MDF_ACAST) { in transmit()
436 peer->outdate = current_time; in transmit()
438 if (peer->unreach > sys_beacon) { in transmit()
439 peer->unreach = 0; in transmit()
440 peer->ttl = 0; in transmit()
444 if (peer->ttl < sys_ttlmax) in transmit()
445 peer->ttl++; in transmit()
448 peer->unreach++; in transmit()
464 if (peer->cast_flags & MDF_POOL) { in transmit()
465 peer->outdate = current_time; in transmit()
475 if (MDF_PCLNT & peer->cast_flags) { in transmit()
476 if ( (IS_IPV6(&peer->srcadr) && !nonlocal_v6_addr_up) in transmit()
477 || (IS_IPV4(&peer->srcadr) && !nonlocal_v4_addr_up)) { in transmit()
488 if (peer->burst == 0) { in transmit()
496 oreach = peer->reach; in transmit()
497 peer->outdate = current_time; in transmit()
498 peer->unreach++; in transmit()
499 peer->reach <<= 1; in transmit()
500 if (!peer->reach) { in transmit()
512 if ( (peer->flags & FLAG_IBURST) in transmit()
513 && peer->retry == 0) in transmit()
514 peer->retry = NTP_RETRY; in transmit()
525 if (!(peer->flags & FLAG_PREEMPT)) in transmit()
526 peer->unreach = 0; in transmit()
527 if ( (peer->flags & FLAG_BURST) in transmit()
528 && peer->retry == 0 in transmit()
530 peer->retry = NTP_RETRY; in transmit()
541 if (peer->unreach >= NTP_UNREACH) { in transmit()
544 if (!(peer->flags & (FLAG_CONFIG | FLAG_PREEMPT))) { in transmit()
550 if ( (peer->flags & FLAG_PREEMPT) in transmit()
560 peer->burst--; in transmit()
561 if (peer->burst == 0) { in transmit()
569 peer_ntpdate--; in transmit()
581 if (peer->retry > 0) in transmit()
582 peer->retry--; in transmit()
587 poll_update(peer, hpoll, (peer->hmode == MODE_CLIENT)); in transmit()
588 if (peer->hmode != MODE_BCLIENT) in transmit()
623 * receive - receive procedure called for each packet received
643 nak_code crypto_nak_test; /* result of crypto-NAK check */ in receive()
679 * later in order to generate a kiss-o'-death packet. in receive()
687 if (0 == SRCPORT(&rbufp->recv_srcadr) || rbufp->recv_length < 2) { in receive()
691 restrictions(&rbufp->recv_srcadr, &r4a); in receive()
694 pkt = &rbufp->recv_pkt; in receive()
695 hisversion = PKT_VERSION(pkt->li_vn_mode); in receive()
696 hismode = (int)PKT_MODE(pkt->li_vn_mode); in receive()
733 if (rbufp->recv_length < LEN_PKT_NOMAC) { in receive()
738 hisleap = PKT_LEAP(pkt->li_vn_mode); in receive()
739 hisstratum = PKT_TO_STRATUM(pkt->stratum); in receive()
742 DPRINTF(1, ("receive: at %ld %s<-%s ippeerlimit %d mode %d iflags %s " in receive()
744 current_time, stoa(&rbufp->dstadr->sin), in receive()
745 stoa(&rbufp->recv_srcadr), r4a.ippeerlimit, hismode, in receive()
746 iflags_str(rbufp->dstadr->flags), in receive()
748 ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf), in receive()
749 ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf))); in receive()
808 * 0 probably indicates a data-minimized packet. in receive()
817 if ( pkt->ppoll in receive()
818 && ( (NTP_MINPOLL > pkt->ppoll) in receive()
819 || (NTP_MAXPOLL < pkt->ppoll) in receive()
824 pkt->ppoll, stoa(&rbufp->recv_srcadr))); in receive()
829 pkt->ppoll, stoa(&rbufp->recv_srcadr))); in receive()
838 * packet is a crypto-NAK; if 3, the packet is authenticated in receive()
857 has_mac = rbufp->recv_length - authlen; in receive()
866 DPRINTF(2, ("receive: drop: bad post-packet length\n")); in receive()
871 * This next test is clearly wrong - it needlessly in receive()
883 || (int)len + authlen > rbufp->recv_length) { in receive()
891 * sys_groupname is non-NULL, there must be in receive()
897 hostlen = ntohl(ep->vallen); in receive()
899 || hostlen > len - in receive()
905 memcpy(hostname, &ep->pkt, hostlen); in receive()
917 has_mac -= len; in receive()
925 DPRINTF(2, ("receive: drop: post-packet under-read\n")); in receive()
936 ** Crypto-NAK? Look - a shiny thing! in receive()
963 DPRINTF(1, ("Possibly self-induced rate limiting of MODE_SERVER from %s\n", in receive()
964 stoa(&rbufp->recv_srcadr))); in receive()
1002 dstadr_sin = &rbufp->dstadr->sin; in receive()
1003 NTOHL_FP(&pkt->org, &p_org); in receive()
1004 NTOHL_FP(&pkt->rec, &p_rec); in receive()
1005 NTOHL_FP(&pkt->xmt, &p_xmt); in receive()
1021 * The NOPEER and NOTRUST can be specified on a per-client basis in receive()
1028 * CRYPTO crypto-NAK. The MAC has four octets only. in receive()
1037 * Drop any invalid crypto-NAKs in receive()
1042 peer->badNAK++; in receive()
1044 msyslog(LOG_ERR, "Invalid-NAK error at %ld %s<-%s", in receive()
1045 current_time, stoa(dstadr_sin), stoa(&rbufp->recv_srcadr)); in receive()
1052 DPRINTF(1, ("receive: at %ld %s<-%s mode %d/%s:%s len %d org 0x%x.%08x xmt 0x%x.%08x NOMAC\n", in receive()
1054 stoa(&rbufp->recv_srcadr), hismode, hm_str, am_str, in receive()
1056 ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf), in receive()
1057 ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf))); in receive()
1060 is_authentic = AUTH_CRYPTO; /* crypto-NAK */ in receive()
1061 …DPRINTF(1, ("receive: at %ld %s<-%s mode %d/%s:%s keyid %08x len %d auth %d org 0x%x.%08x xmt 0x%x… in receive()
1063 stoa(&rbufp->recv_srcadr), hismode, hm_str, am_str, in receive()
1065 ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf), in receive()
1066 ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf))); in receive()
1072 * wanting AD-style authentication of the server's in receive()
1075 * This is described in Microsoft's WSPP docs, in MS-SNTP: in receive()
1076 * http://msdn.microsoft.com/en-us/library/cc212930.aspx in receive()
1082 MAX_MD5_LEN - 4) == 0)) { in receive()
1084 DPRINTF(1, ("receive: at %ld %s<-%s mode %d/%s:%s len %d org %x.%08x xmt %x.%08x SIGND\n", in receive()
1086 stoa(&rbufp->recv_srcadr), hismode, hm_str, am_str, in receive()
1088 ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf), in receive()
1089 ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf))); in receive()
1096 * Not an MS-SNTP SIGND packet in receive()
1151 && rbufp->dstadr == in receive()
1152 ANY_INTERFACE_CHOOSE(&rbufp->recv_srcadr)) { in receive()
1158 if (!SOCK_UNSPEC(&rbufp->dstadr->bcast)) in receive()
1160 &rbufp->dstadr->bcast; in receive()
1163 &rbufp->recv_srcadr, dstadr_sin, 0, in receive()
1166 pkeyid = peer->pcookie; in receive()
1177 session_key(&rbufp->recv_srcadr, in receive()
1180 &rbufp->recv_srcadr, dstadr_sin, in receive()
1184 &rbufp->recv_srcadr, dstadr_sin, in receive()
1207 …DPRINTF(1, ("receive: at %ld %s<-%s mode %d/%s:%s keyid %08x len %d auth %d org 0x%x.%08x xmt 0x%x… in receive()
1209 stoa(&rbufp->recv_srcadr), hismode, hm_str, am_str, in receive()
1211 ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf), in receive()
1212 ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf))); in receive()
1220 * - If we expect a MAC and it's not there, we drop it. in receive()
1221 * - If we expect one keyID and get another, we drop it. in receive()
1222 * - If we have a MAC ahd it hasn't been validated yet, try. in receive()
1223 * - if the provided MAC doesn't validate, we drop it. in receive()
1227 if (0 != peer && 0 != peer->keyid) { in receive()
1232 * - no keyID where one is expected, in receive()
1233 * - different keyID than what we expect. in receive()
1235 if (peer->keyid != skeyid) { in receive()
1237 peer->keyid, skeyid, in receive()
1238 stoa(&rbufp->recv_srcadr))); in receive()
1245 * - If it has not yet been validated, do so. in receive()
1247 * - if missing or bad MAC, log and drop. in receive()
1253 stoa(&rbufp->recv_srcadr))); in receive()
1264 stoa(&rbufp->recv_srcadr))); in receive()
1273 ** On-Wire Protocol Layer in receive()
1275 ** Verify protocol operations consistent with the on-wire protocol. in receive()
1315 * send a crypto-NAK. in receive()
1317 if (!(rbufp->dstadr->flags & INT_MCASTOPEN)) { in receive()
1319 record_raw_stats(&rbufp->recv_srcadr, in receive()
1320 &rbufp->dstadr->sin, in receive()
1321 &p_org, &p_rec, &p_xmt, &rbufp->recv_time, in receive()
1322 PKT_LEAP(pkt->li_vn_mode), in receive()
1323 PKT_VERSION(pkt->li_vn_mode), in receive()
1324 PKT_MODE(pkt->li_vn_mode), in receive()
1325 PKT_TO_STRATUM(pkt->stratum), in receive()
1326 pkt->ppoll, in receive()
1327 pkt->precision, in receive()
1328 FPTOD(NTOHS_FP(pkt->rootdelay)), in receive()
1329 FPTOD(NTOHS_FP(pkt->rootdisp)), in receive()
1330 pkt->refid, in receive()
1331 rbufp->recv_length - MIN_V4_PKT_LEN, (u_char *)&pkt->exten); in receive()
1380 || rbufp->dstadr->addr_refid == pkt->refid in receive()
1382 || ( IS_IPV6(&rbufp->dstadr->sin) in receive()
1383 &&rbufp->dstadr->old_refid == pkt->refid) in receive()
1386 …#x\n", sys_leap, sys_stratum, hisstratum + 1, !sys_cohort, rbufp->dstadr->addr_refid, pkt->refid)); in receive()
1393 * Do not respond if the packet came into an IPv6 link-local in receive()
1397 if (INT_LL_OF_GLOB & rbufp->dstadr->flags) { in receive()
1398 DPRINTF(2, ("receive: declining manycast solicitation on link-local IPv6\n")); in receive()
1405 * crypto-NAK, as that would not be useful. in receive()
1408 record_raw_stats(&rbufp->recv_srcadr, in receive()
1409 &rbufp->dstadr->sin, in receive()
1410 &p_org, &p_rec, &p_xmt, &rbufp->recv_time, in receive()
1411 PKT_LEAP(pkt->li_vn_mode), in receive()
1412 PKT_VERSION(pkt->li_vn_mode), in receive()
1413 PKT_MODE(pkt->li_vn_mode), in receive()
1414 PKT_TO_STRATUM(pkt->stratum), in receive()
1415 pkt->ppoll, in receive()
1416 pkt->precision, in receive()
1417 FPTOD(NTOHS_FP(pkt->rootdelay)), in receive()
1418 FPTOD(NTOHS_FP(pkt->rootdisp)), in receive()
1419 pkt->refid, in receive()
1420 rbufp->recv_length - MIN_V4_PKT_LEN, (u_char *)&pkt->exten); in receive()
1462 if (INT_LL_OF_GLOB & rbufp->dstadr->flags) { in receive()
1463 DPRINTF(2, ("receive: AM_MANYCAST drop: link-local server\n")); in receive()
1472 if (!AUTH( (!(peer2->cast_flags & MDF_POOL) in receive()
1495 if (MDF_POOL & peer2->cast_flags) { in receive()
1498 peer = newpeer(&rbufp->recv_srcadr, NULL, rbufp->dstadr, in receive()
1500 peer2->minpoll, peer2->maxpoll, in receive()
1501 (FLAG_PREEMPT | (POOL_FLAG_PMASK & peer2->flags)), in receive()
1514 if (peer2->cast_flags & MDF_POOL) in receive()
1515 peer2->nextdate = current_time + 1; in receive()
1520 * brand-new association (it matches the prototype in receive()
1521 * association) and tinker with peer->nextdate delaying in receive()
1590 * if a non-NULL endpoint is supplied. multicastclient in receive()
1594 if (!(INT_MCASTOPEN & rbufp->dstadr->flags)) in receive()
1595 match_ep = rbufp->dstadr; in receive()
1605 * If a two-way exchange is not possible, in receive()
1610 DPRINTF(2, ("receive: AM_NEWBCL drop: Autokey but not 2-way\n")); in receive()
1619 peer = newpeer(&rbufp->recv_srcadr, NULL, match_ep, in receive()
1621 pkt->ppoll, pkt->ppoll, in receive()
1629 peer->delay = sys_bdelay; in receive()
1630 peer->bxmt = p_xmt; in receive()
1643 peer = newpeer(&rbufp->recv_srcadr, NULL, match_ep, in receive()
1645 pkt->ppoll, pkt->ppoll, in receive()
1653 peer->bxmt = p_xmt; in receive()
1722 * crypto-NAKs (is_authentic == AUTH_CRYPTO) in receive()
1724 * debug-printed and not logged to avoid log in receive()
1729 current_time, stoa(&rbufp->recv_srcadr), in receive()
1765 if ((peer = newpeer(&rbufp->recv_srcadr, NULL, rbufp->dstadr, in receive()
1767 pkt->ppoll, NTP_MAXDPOLL, 0, MDF_UCAST, 0, in receive()
1787 if (group_test(groupname, peer->ident)) { in receive()
1800 (current_time - peer->timelastrec), in receive()
1801 peer->ppoll, (1 << peer->ppoll) in receive()
1806 * Is the poll interval in the packet in-range? in receive()
1812 /* This is noteworthy, not error-worthy */ in receive()
1813 if (pkt->ppoll != peer->ppoll) { in receive()
1815 stoa(&rbufp->recv_srcadr), in receive()
1816 peer->ppoll, pkt->ppoll); in receive()
1819 /* This is error-worthy */ in receive()
1820 if ( pkt->ppoll < peer->minpoll in receive()
1821 || pkt->ppoll > peer->maxpoll) { in receive()
1822 msyslog(LOG_INFO, "receive: broadcast poll of %u from %s is out-of-range (%d to %d)!", in receive()
1823 pkt->ppoll, stoa(&rbufp->recv_srcadr), in receive()
1824 peer->minpoll, peer->maxpoll); in receive()
1838 deadband = (1u << pkt->ppoll); in receive()
1839 if (FLAG_BC_VOL & peer->flags) in receive()
1840 deadband -= 3; /* allow greater fuzz after volley */ in receive()
1841 if ((current_time - peer->timereceived) < deadband) { in receive()
1843 stoa(&rbufp->recv_srcadr), in receive()
1844 (current_time - peer->timereceived), in receive()
1849 /* Alert if time from the server is non-monotonic. in receive()
1861 * - the broadcast server had a backward step. in receive()
1863 * - somebody is trying a replay attack. in receive()
1872 /* pkt->ppoll or peer->ppoll ? */ in receive()
1873 deadband = (1u << pkt->ppoll) in receive()
1879 if (L_ISZERO(&peer->bxmt)) { in receive()
1883 L_SUB(&tdiff, &peer->bxmt); in receive()
1886 && (current_time - peer->timereceived) < deadband) in receive()
1888 …log(LOG_INFO, "receive: broadcast packet from %s contains non-monotonic timestamp: 0x%x.%08x -> 0x… in receive()
1889 stoa(&rbufp->recv_srcadr), in receive()
1890 peer->bxmt.l_ui, peer->bxmt.l_uf, in receive()
1898 peer->timelastrec = current_time; in receive()
1933 && ( ((peer->flags & FLAG_SKEY) && skeyid <= NTP_MAXKEY) in receive()
1934 || (!(peer->flags & FLAG_SKEY) && skeyid > NTP_MAXKEY))) { in receive()
1941 peer->received++; in receive()
1942 peer->flash &= ~PKT_TEST_MASK; in receive()
1943 if (peer->flags & FLAG_XBOGUS) { in receive()
1944 peer->flags &= ~FLAG_XBOGUS; in receive()
1945 peer->flash |= TEST3; in receive()
1951 * interleaved modes or is horribly broken. in receive()
1957 kissCode = kiss_code_check(hisleap, hisstratum, hismode, pkt->refid); in receive()
1960 peer->flash |= TEST3; /* unsynch */ in receive()
1962 peer->bogusorg++; /* for TEST2 or TEST3 */ in receive()
1965 ntoa(&peer->srcadr)); in receive()
1974 } else if ( ((FLAG_LOOPNONCE & peer->flags) && L_ISEQU(&peer->nonce, &p_xmt)) in receive()
1975 || (!(FLAG_LOOPNONCE & peer->flags) && L_ISEQU(&peer->xmt, &p_xmt)) in receive()
1978 peer->flash |= TEST1; /* duplicate */ in receive()
1979 peer->oldpkt++; in receive()
1984 * is appropriate. Don't do anything else here - we wait to in receive()
1988 * hisstratum cannot be 0 - see assertion above. in receive()
1998 hisstratum, ntoa(&peer->srcadr)); in receive()
2005 * KoD packets are a mixed-blessing. Forged KoD packets in receive()
2019 peer->bogusorg++; in receive()
2022 ntoa(&peer->srcadr)); in receive()
2028 peer->bogusorg++; in receive()
2031 ntoa(&peer->srcadr)); in receive()
2036 if (peer->flip == 0 && !L_ISEQU(&p_org, &peer->aorg)) { in receive()
2037 peer->bogusorg++; in receive()
2039 "receive: flip 0 KoD origin timestamp 0x%x.%08x from %s does not match 0x%x.%08x - ignoring.", in receive()
2041 ntoa(&peer->srcadr), in receive()
2042 peer->aorg.l_ui, peer->aorg.l_uf); in receive()
2044 } else if (peer->flip == 1 && !L_ISEQU(&p_org, &peer->borg)) { in receive()
2045 peer->bogusorg++; in receive()
2047 …"receive: flip 1 KoD origin timestamp 0x%x.%08x from %s does not match interleave 0x%x.%08x - igno… in receive()
2049 ntoa(&peer->srcadr), in receive()
2050 peer->borg.l_ui, peer->borg.l_uf); in receive()
2059 * Of course, should 'aorg' be all-zero because this really in receive()
2067 * If it is bogus, switch to interleaved mode and in receive()
2069 * not bogus in symmetric interleaved mode. in receive()
2079 DEBUG_INSIST(0 == (FLAG_LOOPNONCE & peer->flags)); in receive()
2083 ntoa(&peer->srcadr), 1u << pkt->ppoll); in receive()
2086 refid_str(pkt->refid, -1), in receive()
2087 ntoa(&peer->srcadr)); in receive()
2089 } else if (peer->flip == 0) { in receive()
2096 "receive: BUG 3361: Clearing peer->aorg "); in receive()
2097 L_CLR(&peer->aorg); in receive()
2098 /* Clear peer->nonce, too? */ in receive()
2114 peer->bogusorg++; in receive()
2115 peer->flash |= TEST2; /* bogus */ in receive()
2125 action, hm_str, ntoa(&peer->srcadr), in receive()
2126 ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf)); in receive()
2127 } else if ( L_ISZERO(&peer->aorg) && MODE_CLIENT != hismode in receive()
2128 && !memcmp("STEP", &peer->refid, 4)) { in receive()
2130 } else if (!L_ISEQU(&p_org, &peer->aorg)) { in receive()
2133 peer->bogusorg++; in receive()
2134 peer->flash |= TEST2; /* bogus */ in receive()
2137 ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf), in receive()
2138 peer->aorg.l_ui, peer->aorg.l_uf, in receive()
2139 hm_str, ntoa(&peer->srcadr)); in receive()
2140 if ( !L_ISZERO(&peer->dst) in receive()
2141 && L_ISEQU(&p_org, &peer->dst)) { in receive()
2144 peer->flip = 1; in receive()
2149 hm_str, ntoa(&peer->srcadr)); in receive()
2153 L_CLR(&peer->aorg); in receive()
2162 || L_ISZERO(&peer->dst)) { in receive()
2163 peer->flash |= TEST3; /* unsynch */ in receive()
2166 * Check for bogus packet in interleaved symmetric mode. This in receive()
2170 } else if ( !L_ISZERO(&peer->dst) in receive()
2171 && !L_ISEQU(&p_org, &peer->dst)) { in receive()
2172 DPRINTF(2, ("receive: drop: Bogus packet in interleaved symmetric mode\n")); in receive()
2173 peer->bogusorg++; in receive()
2174 peer->flags |= FLAG_XBOGUS; in receive()
2175 peer->flash |= TEST2; /* bogus */ in receive()
2190 peer->flash |= TEST5; /* bad auth */ in receive()
2191 peer->badauth++; in receive()
2192 if (peer->flags & FLAG_PREEMPT) { in receive()
2200 if (peer->crypto) { in receive()
2211 * is designed to avoid a bait-and-switch attack, which was in receive()
2213 * crypto-NAK. The peer should restart the protocol. in receive()
2215 } else if (!AUTH(peer->keyid || has_mac || in receive()
2218 if (peer->flash & PKT_TEST_MASK) { in receive()
2220 "receive: Bad auth in packet with bad timestamps from %s denied - spoof?", in receive()
2221 ntoa(&peer->srcadr)); in receive()
2226 peer->flash |= TEST5; /* bad auth */ in receive()
2227 peer->badauth++; in receive()
2232 if (peer->flags & FLAG_PREEMPT) { in receive()
2238 else if (peer_clear_digest_early && peer->crypto) { in receive()
2255 * - if the origin timestamp is nonzero this is an in receive()
2256 * interleaved broadcast, so restart the protocol. in receive()
2257 * - else, this is not an interleaved broadcast packet. in receive()
2263 if (!(peer->flags & FLAG_XB)) { in receive()
2266 ntoa(&peer->srcadr)); in receive()
2267 peer->flags |= FLAG_XB; in receive()
2268 peer->aorg = p_xmt; in receive()
2269 peer->borg = rbufp->recv_time; in receive()
2273 } else if (peer->flags & FLAG_XB) { in receive()
2276 ntoa(&peer->srcadr)); in receive()
2277 peer->flags &= ~FLAG_XB; in receive()
2282 is_authentic, ntoa(&peer->srcadr)); in receive()
2287 * update peer->bxmt. in receive()
2289 peer->bxmt = p_xmt; in receive()
2296 if (peer->flip == 0) { in receive()
2298 peer->rec = p_xmt; in receive()
2299 peer->dst = rbufp->recv_time; in receive()
2301 peer->xmt = p_xmt; in receive()
2305 * peer minpoll. If a kiss-o'-death, set the peer minpoll to in receive()
2320 if ( (NTP_MINPOLL > pkt->ppoll) in receive()
2321 || (NTP_MAXPOLL < pkt->ppoll) in receive()
2324 pkt->ppoll, stoa(&rbufp->recv_srcadr))); in receive()
2328 peer->ppoll = max(peer->minpoll, pkt->ppoll); in receive()
2330 peer->selbroken++; /* Increment the KoD count */ in receive()
2332 if (pkt->ppoll > peer->minpoll) in receive()
2333 peer->minpoll = peer->ppoll; in receive()
2334 peer->burst = peer->retry = 0; in receive()
2335 peer->throttle = (NTP_SHIFT + 1) * (1 << peer->minpoll); in receive()
2336 poll_update(peer, pkt->ppoll, 0); in receive()
2337 return; /* kiss-o'-death */ in receive()
2340 peer->selbroken++; /* Increment the KoD count */ in receive()
2352 * - this is a *cast (uni-, broad-, or m-) server packet in receive()
2353 * - and it's symmetric-key authenticated in receive()
2355 * If it is, great - nothing special to do here. in receive()
2358 * Autokey-authenticated packets are accepted. in receive()
2369 && !authistrustedip(skeyid, &peer->srcadr)) { in receive()
2371 peer->badauth++; in receive()
2388 hismode, ntoa(&peer->srcadr)); in receive()
2397 peer->timereceived = current_time; in receive()
2398 peer->timelastrec = current_time; in receive()
2400 peer->flags |= FLAG_AUTHENTIC; in receive()
2402 peer->flags &= ~FLAG_AUTHENTIC; in receive()
2406 * More autokey dance. The rules of the cha-cha are as follows: in receive()
2415 * self-authenticated and we sit the dance. in receive()
2428 if (peer->flags & FLAG_SKEY) { in receive()
2433 ap = (struct autokey *)peer->recval.ptr; in receive()
2435 if (ap->seq > 0) in receive()
2436 ap->seq--; in receive()
2438 peer->flash |= TEST8; in receive()
2441 peer->unreach = 0; in receive()
2447 peer->flash |= TEST9; /* bad crypt */ in receive()
2448 if (peer->flags & FLAG_PREEMPT) { in receive()
2462 if (skeyid == peer->keyid) in receive()
2463 peer->flash &= ~TEST8; in receive()
2470 } else if (!(peer->flash & TEST8)) { in receive()
2471 peer->pkeyid = skeyid; in receive()
2487 if ( tkeyid == peer->pkeyid in receive()
2488 || tkeyid == ap->key) { in receive()
2489 peer->flash &= ~TEST8; in receive()
2490 peer->pkeyid = skeyid; in receive()
2491 ap->seq -= i; in receive()
2494 if (i > ap->seq) { in receive()
2495 peer->crypto &= in receive()
2500 &rbufp->recv_srcadr, dstadr_sin, in receive()
2503 if (peer->flash & TEST8) in receive()
2506 if (!(peer->crypto & CRYPTO_FLAG_PROV)) /* test 9 */ in receive()
2507 peer->flash |= TEST8; /* bad autokey */ in receive()
2514 if (current_time > peer->refresh) { in receive()
2528 process_packet(peer, pkt, rbufp->recv_length); in receive()
2530 if ((~TEST3 & peer->flash) & PKT_TEST_MASK) { in receive()
2538 poll_update(peer, peer->hpoll, (peer->hmode == MODE_CLIENT)); in receive()
2541 * In interleaved mode update the state variables. Also adjust the in receive()
2544 if (peer->flip != 0) { in receive()
2545 peer->rec = p_rec; in receive()
2546 peer->dst = rbufp->recv_time; in receive()
2547 if (peer->nextdate - current_time < (1U << min(peer->ppoll, in receive()
2548 peer->hpoll)) / 2) in receive()
2549 peer->nextdate++; in receive()
2551 peer->nextdate--; in receive()
2557 * process_packet - Packet Procedure, a la Section 3.4.4 of RFC-1305
2578 p_del = FPTOD(NTOHS_FP(pkt->rootdelay)); in process_packet()
2580 p_disp = FPTOD(NTOHS_FP(pkt->rootdisp)); in process_packet()
2581 NTOHL_FP(&pkt->reftime, &p_reftime); in process_packet()
2582 NTOHL_FP(&pkt->org, &p_org); in process_packet()
2583 NTOHL_FP(&pkt->rec, &p_rec); in process_packet()
2584 NTOHL_FP(&pkt->xmt, &p_xmt); in process_packet()
2585 pmode = PKT_MODE(pkt->li_vn_mode); in process_packet()
2586 pleap = PKT_LEAP(pkt->li_vn_mode); in process_packet()
2587 pversion = PKT_VERSION(pkt->li_vn_mode); in process_packet()
2588 pstratum = PKT_TO_STRATUM(pkt->stratum); in process_packet()
2596 peer->flash |= TEST6; /* bad synch or strat */ in process_packet()
2598 peer->flash |= TEST7; /* bad header */ in process_packet()
2605 if (peer->flash & PKT_TEST_MASK) { in process_packet()
2606 peer->seldisptoolarge++; in process_packet()
2608 peer->flash)); in process_packet()
2617 peer->processed++; in process_packet()
2622 record_raw_stats(&peer->srcadr, in process_packet()
2623 peer->dstadr ? &peer->dstadr->sin : NULL, in process_packet()
2624 &p_org, &p_rec, &p_xmt, &peer->dst, in process_packet()
2625 pleap, pversion, pmode, pstratum, pkt->ppoll, pkt->precision, in process_packet()
2626 p_del, p_disp, pkt->refid, in process_packet()
2627 len - MIN_V4_PKT_LEN, (u_char *)&pkt->exten); in process_packet()
2628 peer->leap = pleap; in process_packet()
2629 peer->stratum = min(pstratum, STRATUM_UNSPEC); in process_packet()
2630 peer->pmode = pmode; in process_packet()
2631 peer->precision = pkt->precision; in process_packet()
2632 peer->rootdelay = p_del; in process_packet()
2633 peer->rootdisp = p_disp; in process_packet()
2634 peer->refid = pkt->refid; /* network byte order */ in process_packet()
2635 peer->reftime = p_reftime; in process_packet()
2642 if (peer->retry > 0) { in process_packet()
2643 peer->retry = 0; in process_packet()
2644 if (peer->reach) in process_packet()
2645 peer->burst = min(1 << (peer->hpoll - in process_packet()
2646 peer->minpoll), NTP_SHIFT) - 1; in process_packet()
2648 peer->burst = NTP_IBURST - 1; in process_packet()
2649 if (peer->burst > 0) in process_packet()
2650 peer->nextdate = current_time; in process_packet()
2657 if (!peer->reach) { in process_packet()
2659 peer->timereachable = current_time; in process_packet()
2661 peer->reach |= 1; in process_packet()
2676 * precision, these calculations are done using 64-bit integer in process_packet()
2678 * sums and differences of these first-order differences, which in process_packet()
2679 * if done using 64-bit integer arithmetic, would be valid over in process_packet()
2680 * only half that span. Since the typical first-order in process_packet()
2681 * differences are usually very small, they are converted to 64- in process_packet()
2682 * bit doubles and all remaining calculations done in floating- in process_packet()
2684 * retaining the 68-year span. in process_packet()
2686 * There are three interleaving schemes, basic, interleaved in process_packet()
2687 * symmetric and interleaved broadcast. The timestamps are in process_packet()
2691 * Interleaved symmetric mode in process_packet()
2692 * t1 = peer->aorg/borg, t2 = peer->rec, t3 = p_xmt, in process_packet()
2693 * t4 = peer->dst in process_packet()
2695 if (peer->flip != 0) { in process_packet()
2696 ci = p_xmt; /* t3 - t4 */ in process_packet()
2697 L_SUB(&ci, &peer->dst); in process_packet()
2699 ci = p_rec; /* t2 - t1 */ in process_packet()
2700 if (peer->flip > 0) in process_packet()
2701 L_SUB(&ci, &peer->borg); in process_packet()
2703 L_SUB(&ci, &peer->aorg); in process_packet()
2705 p_del = t21 - t34; in process_packet()
2716 } else if (peer->pmode == MODE_BROADCAST) { in process_packet()
2719 * Interleaved broadcast mode. Use interleaved timestamps. in process_packet()
2720 * t1 = peer->borg, t2 = p_org, t3 = p_org, t4 = aorg in process_packet()
2722 if (peer->flags & FLAG_XB) { in process_packet()
2724 L_SUB(&ci, &peer->aorg); in process_packet()
2726 ci = p_org; /* t2 - t1 */ in process_packet()
2727 L_SUB(&ci, &peer->borg); in process_packet()
2729 peer->aorg = p_xmt; in process_packet()
2730 peer->borg = peer->dst; in process_packet()
2733 if (FLAG_BC_VOL & peer->flags) in process_packet()
2741 peer->xleave = t34; in process_packet()
2744 * Basic broadcast - use direct timestamps. in process_packet()
2745 * t3 = p_xmt, t4 = peer->dst in process_packet()
2748 ci = p_xmt; /* t3 - t4 */ in process_packet()
2749 L_SUB(&ci, &peer->dst); in process_packet()
2758 * timestamp. This works for both basic and interleaved in process_packet()
2764 if (FLAG_BC_VOL & peer->flags) { in process_packet()
2765 peer->flags &= ~FLAG_BC_VOL; in process_packet()
2766 peer->delay = fabs(peer->offset - p_offset) * 2; in process_packet()
2768 peer->delay)); in process_packet()
2769 if (peer->delay > fabs(sys_bdelay)) { in process_packet()
2776 peer->nextdate = current_time + (1u << peer->ppoll) - 2u; in process_packet()
2777 p_del = peer->delay; in process_packet()
2784 * t1 = p_org, t2 = p_rec, t3 = p_xmt, t4 = peer->dst in process_packet()
2787 ci = p_xmt; /* t3 - t4 */ in process_packet()
2788 L_SUB(&ci, &peer->dst); in process_packet()
2790 ci = p_rec; /* t2 - t1 */ in process_packet()
2793 p_del = fabs(t21 - t34); in process_packet()
2797 p_disp = LOGTOD(sys_precision) + LOGTOD(peer->precision) + in process_packet()
2808 if (peer->t21_last > 0 && peer->t34_bytes > 0) { in process_packet()
2809 itemp = peer->t21_bytes - peer->t21_last; in process_packet()
2811 etemp = t21 - peer->t21; in process_packet()
2812 if (fabs(etemp) > 1e-6) { in process_packet()
2815 peer->r21 = ftemp; in process_packet()
2818 itemp = len - peer->t34_bytes; in process_packet()
2820 etemp = -t34 - peer->t34; in process_packet()
2821 if (fabs(etemp) > 1e-6) { in process_packet()
2824 peer->r34 = ftemp; in process_packet()
2832 * it finds t such that r21 * t - r34 * (d - t) = 0, where d is in process_packet()
2836 peer->t21 = t21; in process_packet()
2837 peer->t21_last = peer->t21_bytes; in process_packet()
2838 peer->t34 = -t34; in process_packet()
2839 peer->t34_bytes = len; in process_packet()
2840 DPRINTF(2, ("packet: t21 %.9lf %d t34 %.9lf %d\n", peer->t21, in process_packet()
2841 peer->t21_bytes, peer->t34, peer->t34_bytes)); in process_packet()
2842 if (peer->r21 > 0 && peer->r34 > 0 && p_del > 0) { in process_packet()
2843 if (peer->pmode != MODE_BROADCAST) in process_packet()
2844 td = (peer->r34 / (peer->r21 + peer->r34) - in process_packet()
2856 t21 -= td; in process_packet()
2857 t34 -= td; in process_packet()
2859 p_del, peer->r21 / 1e3, peer->r34 / 1e3, in process_packet()
2867 clock_filter(peer, p_offset + peer->bias, p_del, p_disp); in process_packet()
2874 if ( (FLAG_BC_VOL & peer->flags) in process_packet()
2875 && MODE_CLIENT == peer->hmode in process_packet()
2878 if (peer->flags & FLAG_SKEY) { in process_packet()
2879 if (!(~peer->crypto & CRYPTO_FLAG_ALL)) in process_packet()
2880 peer->hmode = MODE_BCLIENT; in process_packet()
2882 peer->hmode = MODE_BCLIENT; in process_packet()
2885 peer->hmode = MODE_BCLIENT; in process_packet()
2892 * clock_update - Called at system process update intervals.
2910 sys_epoch = peer->epoch; in clock_update()
2911 if (sys_poll < peer->minpoll) in clock_update()
2912 sys_poll = peer->minpoll; in clock_update()
2913 if (sys_poll > peer->maxpoll) in clock_update()
2914 sys_poll = peer->maxpoll; in clock_update()
2916 sys_stratum = min(peer->stratum + 1, STRATUM_UNSPEC); in clock_update()
2917 if ( peer->stratum == STRATUM_REFCLOCK in clock_update()
2918 || peer->stratum == STRATUM_UNSPEC) in clock_update()
2919 sys_refid = peer->refid; in clock_update()
2921 sys_refid = addr2refid(&peer->srcadr); in clock_update()
2925 * E = p.epsilon_r + p.epsilon + p.psi + PHI*(s.t - p.t) + |THETA| in clock_update()
2934 * what they mean. When did peer->update happen? Has anything in clock_update()
2940 dtemp = peer->rootdisp in clock_update()
2941 + peer->disp in clock_update()
2943 + clock_phi * (current_time - peer->update) in clock_update()
2953 sys_rootdelay = peer->delay + peer->rootdelay; in clock_update()
2959 prev_time = current_time + 64 + (rand() & 0x3f); /* 64-127 s */ in clock_update()
2961 sys_reftime = peer->dst; in clock_update()
2964 current_time, peer->epoch, peer->associd)); in clock_update()
2975 case -1: in clock_update()
2998 exit (-1); in clock_update()
3072 * poll_update - update peer poll interval
3093 hpoll = max(min(peer->maxpoll, mpoll), peer->minpoll); in poll_update()
3101 if ((peer->flags & FLAG_SKEY) && hpoll != peer->hpoll) in poll_update()
3104 peer->hpoll = hpoll; in poll_update()
3123 utemp = current_time + max(peer->throttle - (NTP_SHIFT - 1) * in poll_update()
3124 (1 << peer->minpoll), ntp_minpkt); in poll_update()
3129 limit -= (limit >> 2); in poll_update()
3130 limit += peer->outdate; in poll_update()
3134 if (peer->burst > 0) { in poll_update()
3135 if (peer->nextdate > current_time) in poll_update()
3138 else if (peer->flags & FLAG_REFCLOCK) in poll_update()
3139 peer->nextdate = current_time + RESP_DELAY; in poll_update()
3142 peer->nextdate = utemp; in poll_update()
3149 } else if (peer->cmmd != NULL) { in poll_update()
3150 if (peer->nextdate > current_time) { in poll_update()
3151 if (peer->nextdate + ntp_minpkt != utemp) in poll_update()
3152 peer->nextdate = utemp; in poll_update()
3154 peer->nextdate = utemp; in poll_update()
3167 if (peer->retry > 0) in poll_update()
3168 hpoll = peer->minpoll; in poll_update()
3170 hpoll = min(peer->ppoll, peer->hpoll); in poll_update()
3172 if (peer->flags & FLAG_REFCLOCK) in poll_update()
3178 next += peer->outdate; in poll_update()
3195 next -= sub; in poll_update()
3203 peer->nextdate = next; in poll_update()
3205 peer->nextdate = utemp; in poll_update()
3206 if (peer->throttle > (1 << peer->minpoll)) in poll_update()
3207 peer->nextdate += ntp_minpkt; in poll_update()
3211 if (peer->nextdate > limit) { in poll_update()
3213 limit, peer->nextdate)); in poll_update()
3214 peer->nextdate = limit; in poll_update()
3217 current_time, ntoa(&peer->srcadr), peer->hpoll, in poll_update()
3218 peer->burst, peer->retry, peer->throttle, in poll_update()
3219 utemp - current_time, peer->nextdate - in poll_update()
3225 * peer_clear - clear peer filter registers. See Section 3.4.8 of the
3236 l_fp bxmt = peer->bxmt; /* bcast clients retain this! */ in peer_clear()
3249 if (peer->iffval != NULL) in peer_clear()
3250 BN_free(peer->iffval); in peer_clear()
3251 value_free(&peer->cookval); in peer_clear()
3252 value_free(&peer->recval); in peer_clear()
3253 value_free(&peer->encrypt); in peer_clear()
3254 value_free(&peer->sndval); in peer_clear()
3255 if (peer->cmmd != NULL) in peer_clear()
3256 free(peer->cmmd); in peer_clear()
3257 if (peer->subject != NULL) in peer_clear()
3258 free(peer->subject); in peer_clear()
3259 if (peer->issuer != NULL) in peer_clear()
3260 free(peer->issuer); in peer_clear()
3267 peer->ppoll = peer->maxpoll; in peer_clear()
3268 peer->hpoll = peer->minpoll; in peer_clear()
3269 peer->disp = MAXDISPERSE; in peer_clear()
3270 peer->flash = peer_unfit(peer); in peer_clear()
3271 peer->jitter = LOGTOD(sys_precision); in peer_clear()
3274 if (peer->hmode == MODE_BCLIENT) in peer_clear()
3275 peer->bxmt = bxmt; in peer_clear()
3280 if (peer->flags & FLAG_XLEAVE) in peer_clear()
3281 peer->flip = 1; in peer_clear()
3283 peer->filter_order[u] = u; in peer_clear()
3284 peer->filter_disp[u] = MAXDISPERSE; in peer_clear()
3287 if (!(peer->flags & FLAG_REFCLOCK)) { in peer_clear()
3289 peer->leap = LEAP_NOTINSYNC; in peer_clear()
3290 peer->stratum = STRATUM_UNSPEC; in peer_clear()
3291 memcpy(&peer->refid, ident, 4); in peer_clear()
3295 peer->procptr->codeproc = 0; in peer_clear()
3296 peer->procptr->coderecv = 0; in peer_clear()
3302 * the polls at one-second intervals. Unconfigured associations' in peer_clear()
3304 * rate limiting. Other post-startup new or cleared associations in peer_clear()
3308 peer->nextdate = peer->update = peer->outdate = current_time; in peer_clear()
3310 peer->nextdate += peer_associations; in peer_clear()
3311 } else if (!(FLAG_CONFIG & peer->flags)) { in peer_clear()
3312 peer->nextdate += ntp_minpkt + 1; in peer_clear()
3314 if (peer->nextdate < earliest) { in peer_clear()
3315 peer->nextdate = earliest; in peer_clear()
3317 earliest = peer->nextdate + 1; in peer_clear()
3319 peer->nextdate += ntp_random() % (1 << peer->minpoll); in peer_clear()
3322 peer->refresh = current_time + (1 << NTP_REFRESH); in peer_clear()
3325 current_time, peer->nextdate, peer->associd, in peer_clear()
3331 * clock_filter - add incoming clock sample to filter register and run
3350 * of arrival. The offset and delay are determined by the on- in clock_filter()
3357 j = peer->filter_nextpt; in clock_filter()
3358 peer->filter_offset[j] = sample_offset; in clock_filter()
3359 peer->filter_delay[j] = sample_delay; in clock_filter()
3360 peer->filter_disp[j] = sample_disp; in clock_filter()
3361 peer->filter_epoch[j] = current_time; in clock_filter()
3363 peer->filter_nextpt = (u_char)j; in clock_filter()
3376 dtemp = clock_phi * (current_time - peer->update); in clock_filter()
3377 peer->update = current_time; in clock_filter()
3378 for (i = NTP_SHIFT - 1; i >= 0; i--) { in clock_filter()
3380 peer->filter_disp[j] += dtemp; in clock_filter()
3381 if (peer->filter_disp[j] >= MAXDISPERSE) { in clock_filter()
3382 peer->filter_disp[j] = MAXDISPERSE; in clock_filter()
3384 } else if (peer->update - peer->filter_epoch[j] > in clock_filter()
3386 dst[i] = peer->filter_delay[j] + in clock_filter()
3387 peer->filter_disp[j]; in clock_filter()
3389 dst[i] = peer->filter_delay[j]; in clock_filter()
3424 peer->filter_order[i] = ord[i]; in clock_filter()
3437 peer->disp = peer->jitter = 0; in clock_filter()
3439 for (i = NTP_SHIFT - 1; i >= 0; i--) { in clock_filter()
3441 peer->disp = NTP_FWEIGHT * ( peer->disp in clock_filter()
3442 + peer->filter_disp[j]); in clock_filter()
3444 peer->jitter += DIFF(peer->filter_offset[j], in clock_filter()
3445 peer->filter_offset[k]); in clock_filter()
3459 etemp = fabs(peer->offset - peer->filter_offset[k]); in clock_filter()
3460 peer->offset = peer->filter_offset[k]; in clock_filter()
3461 peer->delay = peer->filter_delay[k]; in clock_filter()
3463 peer->jitter /= m - 1; in clock_filter()
3465 peer->jitter = max(SQRT(peer->jitter), LOGTOD(sys_precision)); in clock_filter()
3474 if ( peer->disp < sys_maxdist in clock_filter()
3475 && peer->filter_disp[k] < sys_maxdist in clock_filter()
3476 && etemp > CLOCK_SGATE * peer->jitter in clock_filter()
3477 && peer->filter_epoch[k] - peer->epoch in clock_filter()
3478 < 2. * ULOGTOD(peer->hpoll)) { in clock_filter()
3490 if (peer->filter_epoch[k] <= peer->epoch) { in clock_filter()
3492 current_time - peer->filter_epoch[k])); in clock_filter()
3495 peer->epoch = peer->filter_epoch[k]; in clock_filter()
3502 record_peer_stats(&peer->srcadr, ctlpeerstatus(peer), peer->offset, in clock_filter()
3503 peer->delay, peer->disp, peer->jitter); in clock_filter()
3505 (u_short)m, peer->offset, peer->delay, peer->disp, in clock_filter()
3506 peer->jitter)); in clock_filter()
3507 if (0 == peer->burst || LEAP_NOTINSYNC == sys_leap) { in clock_filter()
3514 * clock_select - find the pick-of-the-litter clock
3571 for (peer = peer_list; peer != NULL; peer = peer->p_link) in clock_select()
3592 for (peer = peer_list; peer != NULL; peer = peer->p_link) { in clock_select()
3593 peer->new_status = CTL_PST_SEL_REJECT; in clock_select()
3613 if (!L_ISZERO(&peer->reftime) && d < lastresort_dist) { in clock_select()
3630 if (peer->stratum == sys_orphan) { in clock_select()
3634 if (peer->dstadr != NULL) in clock_select()
3635 localmet = ntohl(peer->dstadr->addr_refid); in clock_select()
3638 peermet = ntohl(addr2refid(&peer->srcadr)); in clock_select()
3657 if (peer->stratum > sys_orphan) { in clock_select()
3665 if (!(peer->flags & FLAG_PREFER)) { in clock_select()
3666 switch (peer->refclktype) { in clock_select()
3687 peer->new_status = CTL_PST_SEL_SANE; in clock_select()
3690 peers[nlist].error = peer->jitter; in clock_select()
3698 e = peer->offset; in clock_select()
3699 endpoint[nl2].type = -1; /* lower end */ in clock_select()
3700 endpoint[nl2].val = e - f; in clock_select()
3756 high = -1e9; in clock_select()
3766 n -= endpoint[indx[i]].type; in clock_select()
3767 if (n >= nlist - allow) in clock_select()
3771 for (j = nl2 - 1; j >= 0; j--) { in clock_select()
3774 if (n >= nlist - allow) in clock_select()
3806 || peer->offset + h < low in clock_select()
3807 || peer->offset - h > high in clock_select()
3808 ) && !(peer->flags & FLAG_TRUE)) in clock_select()
3817 if (peer->flags & FLAG_PPS) { in clock_select()
3820 if (!(peer->flags & FLAG_TSTAMP_PPS)) in clock_select()
3862 peers[i].peer->new_status = CTL_PST_SEL_SELCAND; in clock_select()
3864 stoa(&peers[i].peer->srcadr), peers[i].synch)); in clock_select()
3877 e = -1e9; in clock_select()
3887 f += DIFF(peers[j].peer->offset, in clock_select()
3888 peers[i].peer->offset); in clock_select()
3889 peers[i].seljit = SQRT(f / (nlist - 1)); in clock_select()
3900 || ((FLAG_TRUE | FLAG_PREFER) & peers[k].peer->flags)) in clock_select()
3904 ntoa(&peers[k].peer->srcadr), g, d)); in clock_select()
3906 peers[k].peer->new_status = CTL_PST_SEL_EXCESS; in clock_select()
3908 peers[j - 1] = peers[j]; in clock_select()
3909 nlist--; in clock_select()
3942 peer->unreach = 0; in clock_select()
3943 peer->new_status = CTL_PST_SEL_SYNCCAND; in clock_select()
3945 if (peer->leap == LEAP_ADDSECOND) { in clock_select()
3946 if (peer->flags & FLAG_REFCLOCK) in clock_select()
3951 if (peer->leap == LEAP_DELSECOND) { in clock_select()
3952 if (peer->flags & FLAG_REFCLOCK) in clock_select()
3957 if (peer->flags & FLAG_PREFER) in clock_select()
3960 peer->stratum * sys_mindisp; in clock_select()
3980 } else if ((x = fabs(typesystem->offset - in clock_select()
3981 osys_peer->offset)) < sys_mindisp) { in clock_select()
4005 typesystem->new_status = CTL_PST_SEL_SYSPEER; in clock_select()
4010 typesystem->new_status = CTL_PST_SEL_SYSPEER; in clock_select()
4011 sys_offset = typesystem->offset; in clock_select()
4012 sys_jitter = typesystem->jitter; in clock_select()
4027 && ( typepps->refclktype != REFCLK_ATOM_PPS in clock_select()
4028 || ( typepps->refclktype == REFCLK_ATOM_PPS in clock_select()
4033 typesystem->new_status = CTL_PST_SEL_PPS; in clock_select()
4034 sys_offset = typesystem->offset; in clock_select()
4035 sys_jitter = typesystem->jitter; in clock_select()
4052 for (peer = peer_list; peer != NULL; peer = peer->p_link) in clock_select()
4053 peer->status = peer->new_status; in clock_select()
4061 if (typesystem->epoch <= sys_epoch) in clock_select()
4069 for (peer = peer_list; peer != NULL; peer = peer->p_link) in clock_select()
4070 peer->status = peer->new_status; in clock_select()
4089 z += x * peers[i].peer->offset; in clock_combine()
4090 w += x * DIFF(peers[i].peer->offset, in clock_combine()
4091 peers[syspeer].peer->offset); in clock_combine()
4099 * root_distance - compute synchronization distance from peer to root
4113 * delta is the round-trip delay in root_distance()
4126 dtemp = (peer->delay + peer->rootdelay) / 2 in root_distance()
4127 + peer->disp in root_distance()
4128 + clock_phi * (current_time - peer->update) in root_distance()
4129 + peer->rootdisp in root_distance()
4130 + peer->jitter; in root_distance()
4145 * peer_xmit - send packet for persistent association.
4157 if (!peer->dstadr) { /* can't send */ in peer_xmit()
4160 xpkt.li_vn_mode = PKT_LI_VN_MODE(sys_leap, peer->version, in peer_xmit()
4161 peer->hmode); in peer_xmit()
4163 xpkt.ppoll = peer->hpoll; in peer_xmit()
4170 HTONL_FP(&peer->rec, &xpkt.org); in peer_xmit()
4171 HTONL_FP(&peer->dst, &xpkt.rec); in peer_xmit()
4188 !(peer->flags & FLAG_SKEY) && in peer_xmit()
4190 peer->keyid == 0) { in peer_xmit()
4193 * Transmit a-priori timestamps in peer_xmit()
4196 if (peer->flip == 0) { /* basic mode */ in peer_xmit()
4197 peer->aorg = xmt_tx; in peer_xmit()
4199 } else { /* interleaved modes */ in peer_xmit()
4200 if (peer->hmode == MODE_BROADCAST) { /* bcst */ in peer_xmit()
4202 if (peer->flip > 0) in peer_xmit()
4203 HTONL_FP(&peer->borg, in peer_xmit()
4206 HTONL_FP(&peer->aorg, in peer_xmit()
4209 if (peer->flip > 0) in peer_xmit()
4210 HTONL_FP(&peer->borg, in peer_xmit()
4213 HTONL_FP(&peer->aorg, in peer_xmit()
4217 peer->t21_bytes = sendlen; in peer_xmit()
4218 sendpkt(&peer->srcadr, peer->dstadr, in peer_xmit()
4219 sys_ttl[(peer->ttl >= sys_ttlmax) ? sys_ttlmax : peer->ttl], in peer_xmit()
4221 peer->sent++; in peer_xmit()
4222 peer->throttle += (1 << peer->minpoll) - 2; in peer_xmit()
4225 * Capture a-posteriori timestamps in peer_xmit()
4228 if (peer->flip != 0) { /* interleaved modes */ in peer_xmit()
4229 if (peer->flip > 0) in peer_xmit()
4230 peer->aorg = xmt_ty; in peer_xmit()
4232 peer->borg = xmt_ty; in peer_xmit()
4233 peer->flip = -peer->flip; in peer_xmit()
4236 LFPTOD(&xmt_ty, peer->xleave); in peer_xmit()
4237 DPRINTF(1, ("peer_xmit: at %ld %s->%s mode %d len %zu xmt 0x%x.%08x\n", in peer_xmit()
4238 current_time, latoa(peer->dstadr), in peer_xmit()
4239 stoa(&peer->srcadr), peer->hmode, sendlen, in peer_xmit()
4250 if (peer->flags & FLAG_SKEY) { in peer_xmit()
4256 * 4-octet length/code word followed by a 4-octet in peer_xmit()
4258 * data includes a 4-octet data length field followed by in peer_xmit()
4293 * has expired, so the pseudo-random sequence is in peer_xmit()
4297 if (peer->keynumber == 0) in peer_xmit()
4298 make_keylist(peer, peer->dstadr); in peer_xmit()
4300 peer->keynumber--; in peer_xmit()
4301 xkeyid = peer->keylist[peer->keynumber]; in peer_xmit()
4307 peer->keyid = xkeyid; in peer_xmit()
4309 switch (peer->hmode) { in peer_xmit()
4319 if (peer->flags & FLAG_ASSOC) in peer_xmit()
4321 CRYPTO_RESP, peer->associd, NULL); in peer_xmit()
4324 CRYPTO_RESP, peer->associd, NULL); in peer_xmit()
4344 if (!peer->crypto) in peer_xmit()
4346 peer->associd, hostval.ptr); in peer_xmit()
4347 else if (!(peer->crypto & CRYPTO_FLAG_CERT)) in peer_xmit()
4349 peer->associd, peer->issuer); in peer_xmit()
4350 else if (!(peer->crypto & CRYPTO_FLAG_VRFY)) in peer_xmit()
4352 crypto_ident(peer), peer->associd, in peer_xmit()
4367 && peer->leap != LEAP_NOTINSYNC in peer_xmit()
4368 && !(peer->crypto & CRYPTO_FLAG_COOK)) in peer_xmit()
4370 peer->associd, NULL); in peer_xmit()
4371 else if (!(peer->crypto & CRYPTO_FLAG_AUTO)) in peer_xmit()
4373 peer->associd, NULL); in peer_xmit()
4374 else if ( peer->flags & FLAG_ASSOC in peer_xmit()
4375 && peer->crypto & CRYPTO_FLAG_SIGN) in peer_xmit()
4377 CRYPTO_RESP, peer->assoc, NULL); in peer_xmit()
4387 else if (!(peer->crypto & CRYPTO_FLAG_SIGN)) in peer_xmit()
4389 peer->associd, hostval.ptr); in peer_xmit()
4390 else if (!(peer->crypto & CRYPTO_FLAG_LEAP)) in peer_xmit()
4392 peer->associd, NULL); in peer_xmit()
4411 if (!peer->crypto) in peer_xmit()
4413 peer->associd, hostval.ptr); in peer_xmit()
4414 else if (!(peer->crypto & CRYPTO_FLAG_CERT)) in peer_xmit()
4416 peer->associd, peer->issuer); in peer_xmit()
4417 else if (!(peer->crypto & CRYPTO_FLAG_VRFY)) in peer_xmit()
4419 crypto_ident(peer), peer->associd, in peer_xmit()
4427 else if (!(peer->crypto & CRYPTO_FLAG_COOK)) in peer_xmit()
4429 peer->associd, NULL); in peer_xmit()
4430 else if (!(peer->crypto & CRYPTO_FLAG_AUTO)) in peer_xmit()
4432 peer->assoc, NULL); in peer_xmit()
4442 else if (!(peer->crypto & CRYPTO_FLAG_SIGN)) in peer_xmit()
4444 peer->associd, hostval.ptr); in peer_xmit()
4445 else if (!(peer->crypto & CRYPTO_FLAG_LEAP)) in peer_xmit()
4447 peer->associd, NULL); in peer_xmit()
4457 if (peer->cmmd != NULL) { in peer_xmit()
4461 peer->cmmd->opcode |= htonl(temp32); in peer_xmit()
4463 sendlen, peer->cmmd, 0); in peer_xmit()
4464 free(peer->cmmd); in peer_xmit()
4465 peer->cmmd = NULL; in peer_xmit()
4473 if (exten->opcode != 0) in peer_xmit()
4484 session_key(&peer->dstadr->sin, &peer->srcadr, in peer_xmit()
4491 * Transmit a-priori timestamps in peer_xmit()
4494 if (peer->flip == 0) { /* basic mode */ in peer_xmit()
4495 peer->aorg = xmt_tx; in peer_xmit()
4497 } else { /* interleaved modes */ in peer_xmit()
4498 if (peer->hmode == MODE_BROADCAST) { /* bcst */ in peer_xmit()
4500 if (peer->flip > 0) in peer_xmit()
4501 HTONL_FP(&peer->borg, &xpkt.org); in peer_xmit()
4503 HTONL_FP(&peer->aorg, &xpkt.org); in peer_xmit()
4505 if (peer->flip > 0) in peer_xmit()
4506 HTONL_FP(&peer->borg, &xpkt.xmt); in peer_xmit()
4508 HTONL_FP(&peer->aorg, &xpkt.xmt); in peer_xmit()
4511 xkeyid = peer->keyid; in peer_xmit()
4515 peer->flash |= TEST5; /* auth error */ in peer_xmit()
4516 peer->badauth++; in peer_xmit()
4528 peer->t21_bytes = sendlen; in peer_xmit()
4529 sendpkt(&peer->srcadr, peer->dstadr, in peer_xmit()
4530 sys_ttl[(peer->ttl >= sys_ttlmax) ? sys_ttlmax : peer->ttl], in peer_xmit()
4532 peer->sent++; in peer_xmit()
4533 peer->throttle += (1 << peer->minpoll) - 2; in peer_xmit()
4536 * Capture a-posteriori timestamps in peer_xmit()
4539 if (peer->flip != 0) { /* interleaved modes */ in peer_xmit()
4540 if (peer->flip > 0) in peer_xmit()
4541 peer->aorg = xmt_ty; in peer_xmit()
4543 peer->borg = xmt_ty; in peer_xmit()
4544 peer->flip = -peer->flip; in peer_xmit()
4547 LFPTOD(&xmt_ty, peer->xleave); in peer_xmit()
4549 DPRINTF(1, ("peer_xmit: at %ld %s->%s mode %d keyid %08x len %zu index %d\n", in peer_xmit()
4550 current_time, latoa(peer->dstadr), stoa(&peer->srcadr), in peer_xmit()
4551 peer->hmode, xkeyid, sendlen, peer->keynumber)); in peer_xmit()
4553 DPRINTF(1, ("peer_xmit: at %ld %s->%s mode %d keyid %08x len %zu\n", in peer_xmit()
4554 current_time, peer->dstadr ? in peer_xmit()
4555 ntoa(&peer->dstadr->sin) : "-", in peer_xmit()
4556 ntoa(&peer->srcadr), peer->hmode, xkeyid, sendlen)); in peer_xmit()
4585 * fast_xmit - Send packet for nonpersistent association. Note that
4612 rpkt = &rbufp->recv_pkt; in fast_xmit()
4619 if (rbufp->dstadr->flags & INT_MCASTOPEN) { in fast_xmit()
4620 rbufp->dstadr = findinterface(&rbufp->recv_srcadr); in fast_xmit()
4621 if (NULL == rbufp->dstadr || in fast_xmit()
4622 ANY_INTERFACE_CHOOSE(&rbufp->recv_srcadr) /* wildcard */ in fast_xmit()
4623 == rbufp->dstadr) { in fast_xmit()
4626 stoa(&rbufp->recv_srcadr))); in fast_xmit()
4633 * If this is a kiss-o'-death (KoD) packet, show leap in fast_xmit()
4634 * unsynchronized, stratum zero, reference ID the four-character in fast_xmit()
4642 PKT_VERSION(rpkt->li_vn_mode), xmode); in fast_xmit()
4644 xpkt.ppoll = max(rpkt->ppoll, ntp_minpoll); in fast_xmit()
4645 xpkt.precision = rpkt->precision; in fast_xmit()
4647 xpkt.rootdelay = rpkt->rootdelay; in fast_xmit()
4648 xpkt.rootdisp = rpkt->rootdisp; in fast_xmit()
4649 xpkt.reftime = rpkt->reftime; in fast_xmit()
4650 xpkt.org = rpkt->xmt; in fast_xmit()
4651 xpkt.rec = rpkt->xmt; in fast_xmit()
4652 xpkt.xmt = rpkt->xmt; in fast_xmit()
4671 * - the packet receive time, in fast_xmit()
4672 * - the packet transmit time, in fast_xmit()
4673 * - and eventually to the reftime to make sure the in fast_xmit()
4677 PKT_VERSION(rpkt->li_vn_mode), xmode); in fast_xmit()
4680 xpkt.ppoll = max(rpkt->ppoll, ntp_minpoll); in fast_xmit()
4750 xpkt.org = rpkt->xmt; in fast_xmit()
4756 this_recv_time = rbufp->recv_time; in fast_xmit()
4761 HTONL_FP(&rbufp->recv_time, &xpkt.rec); in fast_xmit()
4789 if (rbufp->recv_length == sendlen) { in fast_xmit()
4790 sendpkt(&rbufp->recv_srcadr, rbufp->dstadr, 0, &xpkt, in fast_xmit()
4792 DPRINTF(1, ("fast_xmit: at %ld %s->%s mode %d len %lu\n", in fast_xmit()
4793 current_time, stoa(&rbufp->dstadr->sin), in fast_xmit()
4794 stoa(&rbufp->recv_srcadr), xmode, in fast_xmit()
4805 * source-destination-key ID combination. in fast_xmit()
4820 cookie = session_key(&rbufp->recv_srcadr, in fast_xmit()
4821 &rbufp->dstadr->sin, 0, sys_private, 0); in fast_xmit()
4822 if ((size_t)rbufp->recv_length > sendlen + MAX_MAC_LEN) { in fast_xmit()
4823 session_key(&rbufp->dstadr->sin, in fast_xmit()
4824 &rbufp->recv_srcadr, xkeyid, 0, 2); in fast_xmit()
4826 rpkt->exten[0] |= htonl(temp32); in fast_xmit()
4828 sendlen, (struct exten *)rpkt->exten, in fast_xmit()
4831 session_key(&rbufp->dstadr->sin, in fast_xmit()
4832 &rbufp->recv_srcadr, xkeyid, cookie, 2); in fast_xmit()
4842 sendpkt(&rbufp->recv_srcadr, rbufp->dstadr, 0, &xpkt, sendlen); in fast_xmit()
4846 DPRINTF(1, ("fast_xmit: at %ld %s->%s mode %d keyid %08x len %lu\n", in fast_xmit()
4847 current_time, ntoa(&rbufp->dstadr->sin), in fast_xmit()
4848 ntoa(&rbufp->recv_srcadr), xmode, xkeyid, in fast_xmit()
4854 * pool_xmit - resolve hostname or send unicast solicitation for pool.
4872 if (NULL == pool->ai) { in pool_xmit()
4873 if (pool->addrs != NULL) { in pool_xmit()
4875 free(pool->addrs); in pool_xmit()
4876 pool->addrs = NULL; in pool_xmit()
4878 af = AF(&pool->srcadr); in pool_xmit()
4889 hints.ai_family = AF(&pool->srcadr); in pool_xmit()
4894 pool->hostname, in pool_xmit()
4899 (void *)(intptr_t)pool->associd); in pool_xmit()
4902 pool->hostname)); in pool_xmit()
4906 pool->hostname); in pool_xmit()
4912 rmtadr = (sockaddr_u *)(void *)pool->ai->ai_addr; in pool_xmit()
4913 pool->ai = pool->ai->ai_next; in pool_xmit()
4920 } while (p != NULL && pool->ai != NULL); in pool_xmit()
4922 return; /* out of addresses, re-query DNS next poll */ in pool_xmit()
4927 xpkt.li_vn_mode = PKT_LI_VN_MODE(sys_leap, pool->version, in pool_xmit()
4930 xpkt.ppoll = pool->hpoll; in pool_xmit()
4939 pool->aorg = xmt_tx; in pool_xmit()
4941 if (FLAG_LOOPNONCE & pool->flags) { in pool_xmit()
4950 pool->nonce = nonce; in pool_xmit()
4953 L_CLR(&pool->nonce); in pool_xmit()
4956 pool->sent++; in pool_xmit()
4957 pool->throttle += (1 << pool->minpoll) - 2; in pool_xmit()
4958 DPRINTF(1, ("pool_xmit: at %ld %s->%s pool\n", in pool_xmit()
4962 sys_ttl[(pool->ttl >= sys_ttlmax) ? sys_ttlmax : pool->ttl], in pool_xmit()
4970 * group_test - test if this is the same group
5034 pool->addrs = copy_addrinfo_list(res); in pool_name_resolved()
5035 pool->ai = pool->addrs; in pool_name_resolved()
5044 * key_expire - purge the key list
5053 if (peer->keylist != NULL) { in key_expire()
5054 for (i = 0; i <= peer->keynumber; i++) in key_expire()
5055 authtrust(peer->keylist[i], 0); in key_expire()
5056 free(peer->keylist); in key_expire()
5057 peer->keylist = NULL; in key_expire()
5059 value_free(&peer->sndval); in key_expire()
5060 peer->keynumber = 0; in key_expire()
5061 peer->flags &= ~FLAG_ASSOC; in key_expire()
5063 peer->associd)); in key_expire()
5069 * local_refid(peer) - Check peer refid to avoid selecting peers
5072 * refid differently on different-endian systems. It now calculates
5073 * the refid the same on both, the same way it did on little-endian
5074 * in the past. On big-endian systems, ntpd also calculates a
5075 * byte-swapped version of each of its IPv6 local addresses' refids,
5078 * BE ntpd, and keeps the more-common LE old ntpd code detecting
5080 * the byte-swapping idea.
5089 if (p->dstadr != NULL && !(INT_MCASTIF & p->dstadr->flags)) in local_refid()
5090 unicast_ep = p->dstadr; in local_refid()
5092 unicast_ep = findinterface(&p->srcadr); in local_refid()
5095 && ( p->refid == unicast_ep->addr_refid in local_refid()
5097 || ( IS_IPV6(&unicast_ep->sin) in local_refid()
5098 && p->refid == unicast_ep->old_refid) in local_refid()
5129 if ( peer->leap == LEAP_NOTINSYNC in peer_unfit()
5130 || peer->stratum < sys_floor in peer_unfit()
5131 || peer->stratum >= sys_ceiling) { in peer_unfit()
5140 if ( !(peer->flags & FLAG_REFCLOCK) in peer_unfit()
5142 + clock_phi * ULOGTOD(peer->hpoll)) { in peer_unfit()
5152 if (peer->stratum > 1 && local_refid(peer)) { in peer_unfit()
5160 if (!peer->reach || (peer->flags & FLAG_NOSELECT)) { in peer_unfit()
5164 peer->flash &= ~PEER_TEST_MASK; in peer_unfit()
5165 peer->flash |= rval; in peer_unfit()
5173 #define MINSTEP 20e-9 /* minimum clock increment (s) */
5189 * systems with high-precision clocks, and the tick interval or step
5190 * size for lower-precision stepping clocks.
5204 * get_ostime() simulation of a low-precision system clock. in measure_precision()
5232 l_fp ldiff; /* val - last */ in measure_tick_fuzz()
5304 for (i = 0; tick <= 1; i--) in set_sys_tick_precision()
5306 if (tick - 1 > 1 - tick / 2) in set_sys_tick_precision()
5314 * init_proto - initialize the protocol module's data
5347 sys_ttlmax = (MAX_TTL - 1); in init_proto()
5354 * proto_config - configure the protocol module
5373 * enable and disable commands - arguments are Boolean. in proto_config()
5425 * tos command - arguments are double, sometimes cast to int in proto_config()
5480 orphwait -= sys_orphwait; in proto_config()
5531 * proto_clr_stats - clear protocol stat counters