File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / ntp / ntpd / ntp_proto.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue May 29 12:08:38 2012 UTC (12 years, 1 month ago) by misho
Branches: ntp, MAIN
CVS tags: v4_2_6p5p0, v4_2_6p5, HEAD
ntp 4.2.6p5

    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>