Home | History | Annotate | Download | only in snoop
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 /*
     23  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 /*
     28  * University Copyright- Copyright (c) 1982, 1986, 1988
     29  * The Regents of the University of California
     30  * All Rights Reserved
     31  *
     32  * University Acknowledgment- Portions of this document are derived from
     33  * software developed by the University of California, Berkeley, and its
     34  * contributors.
     35  */
     36 
     37 #ifndef	_NTP_H
     38 #define	_NTP_H
     39 
     40 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     41 
     42 #ifdef __cplusplus
     43 extern "C" {
     44 #endif
     45 
     46 /* $Source: /usr/users/louie/ntp/RCS/ntp.h,v $  */
     47 /* $Revision: 3.4.1.5 $ $Date: 89/04/10 15:55:42 $ */
     48 
     49 /*
     50  *  $Log:	ntp.h,v $
     51  * Revision 3.4.1.5  89/04/10  15:55:42  louie
     52  * Provide default value for number of bits/byte if not defined.  Compute the
     53  * Window shift mask inside of conditional code on XTAL so we get the correct
     54  * value if configured without a crystal controled clock (!!)
     55  *
     56  * Revision 3.4.1.4  89/03/31  16:34:50  louie
     57  * Add bit in flags which allow a peer to be synced to.  Changed a char to a bit
     58  * field so that it is always signed.
     59  *
     60  * Revision 3.4.1.3  89/03/29  12:26:18  louie
     61  * Removed some unused #defines.  Replaced MAXSTRATUM with NTP_INFIN per new
     62  * spec.  The variable 'mode' in the peer structure has been renamed 'hmode'
     63  * per the new spec.
     64  *
     65  * Revision 3.4.1.2  89/03/22  18:28:18  louie
     66  * patch3: Use new RCS headers.
     67  *
     68  * Revision 3.4.1.1  89/03/20  00:02:53  louie
     69  * 1
     70  *
     71  * Revision 3.4  89/03/17  18:37:00  louie
     72  * Latest test release.
     73  *
     74  * Revision 3.3.1.1  89/03/17  18:23:49  louie
     75  * Change CLOCK_FACTOR to be a power of 2.
     76  *
     77  * Revision 3.3  89/03/15  14:19:36  louie
     78  * New baseline for next release.
     79  *
     80  * Revision 3.2.1.2  89/03/15  13:46:52  louie
     81  * The version number for that particular flavor of ntpd <--> ntpdc interaction
     82  * is now defined by NTPDC_VERSION.  The packet format for the ntpdc program
     83  * has changed slightly to improve robustness when dealing with multiple packets
     84  * of status data.
     85  *
     86  * Revision 3.2.1.1  89/03/09  17:11:24  louie
     87  * patch1: Updated constants, which were previously in incorrect units.
     88  *
     89  * Revision 3.2  89/03/07  18:21:45  louie
     90  * New version of UNIX NTP daemon and software based on the 6 March 1989
     91  * draft of the new NTP protocol specification.  This version doesn't
     92  * implement authentication, and accepts and send only NTP Version 1
     93  * packets.
     94  *
     95  * Revision 3.1.1.1  89/02/15  08:54:42  louie
     96  * *** empty log message ***
     97  *
     98  *
     99  * Revision 3.1  89/01/30  14:43:07  louie
    100  * Second UNIX NTP test release.
    101  *
    102  * Revision 3.0  88/12/12  16:01:07  louie
    103  * Test release of new UNIX NTP software.  This version should conform to the
    104  * revised NTP protocol specification.
    105  *
    106  */
    107 
    108 #ifndef FD_SET
    109 #define	NFDBITS		32
    110 #define	FD_SETSIZE	32
    111 #define	FD_SET(n, p)	((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
    112 #define	FD_CLR(n, p)	((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
    113 #define	FD_ISSET(n, p)	((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
    114 #define	FD_ZERO(p)	bzero((char *)(p), sizeof (*(p)))
    115 #endif
    116 
    117 #ifndef	NBBY
    118 #define	NBBY	8	/* number of bits per byte */
    119 #endif
    120 
    121 #define	MAXNETIF	10
    122 
    123 struct intf {
    124 	int fd;
    125 	char *name;
    126 	struct sockaddr_in sin;
    127 	struct sockaddr_in bcast;
    128 	struct sockaddr_in mask;
    129 	int uses;
    130 	int if_flags;
    131 };
    132 extern struct intf addrs[];
    133 extern int nintf;
    134 
    135 /*
    136  *  Definitions for the masses
    137  */
    138 #define	JAN_1970	2208988800U	/* 1970 - 1900 in seconds */
    139 
    140 /*
    141  *  Daemon specific (ntpd.c)
    142  */
    143 #define	SHIFT_MASK	0xff	/* number of intervals to wait */
    144 
    145 #ifndef	WAYTOOBIG
    146 #define	WAYTOOBIG	1000.0	/* Too many seconds to correct, something is */
    147 				/* really wrong */
    148 #endif
    149 
    150 #ifndef	XTAL
    151 #define	XTAL	1	/* crystal controlled clock by default */
    152 #endif
    153 
    154 #ifndef	NTPINITFILE
    155 #define	NTPINITFILE	"/etc/ntp.conf"
    156 #endif
    157 
    158 struct list {
    159 	struct ntp_peer *head;
    160 	struct ntp_peer *tail;
    161 	int members;
    162 };
    163 
    164 #define	STRMCMP(a, cond, b) \
    165 	(((a) == UNSPECIFIED ? NTP_INFIN+1 : a) cond \
    166 		((b) == UNSPECIFIED ? NTP_INFIN+1 : (b)))
    167 
    168 
    169 /*
    170  *  Definitions outlined in the NTP spec
    171  */
    172 #define	NTP_VERSION	1
    173 #define	NTP_PORT	123	/* for ref only (see /etc/services) */
    174 #define	NTP_INFIN	15
    175 #define	NTP_MAXAGE	86400
    176 #define	NTP_MAXSKW	0.01	/* seconds */
    177 #define	NTP_MINDIST	0.02	/* seconds */
    178 #define	NTP_MINPOLL	6	/* (64) seconds between messages */
    179 #define	NTP_MAXPOLL	10	/* (1024) secs to poll */
    180 #define	NTP_WINDOW	8	/* size of shift register */
    181 #define	NTP_MAXWGT	8	/* maximum allowable dispersion */
    182 #define	NTP_MAXLIST	5	/* max size of selection list */
    183 #define	NTP_MAXSTRA	2	/* max number of strata in selection list */
    184 #define	X_NTP_CANDIDATES 64	/* number of peers to consider when doing */
    185 				/*	clock selection */
    186 #define	NTP_SELECT	0.75	/* weight used to compute dispersion */
    187 
    188 #define	PEER_MAXDISP	64.0	/* Maximum dispersion  */
    189 #define	PEER_THRESHOLD	0.5	/* dispersion threshold */
    190 #define	PEER_FILTER	0.5	/* filter weight */
    191 
    192 #if	XTAL == 0
    193 #define	PEER_SHIFT	4
    194 #define	NTP_WINDOW_SHIFT_MASK 0x0f
    195 #else
    196 #define	PEER_SHIFT	8
    197 #define	NTP_WINDOW_SHIFT_MASK 0xff
    198 #endif
    199 
    200 
    201 /*
    202  *  5.1 Uniform Phase Adjustments
    203  *  Clock parameters
    204  */
    205 #define	CLOCK_UPDATE	8	/* update interval (1<<CLOCK_UPDATE secs) */
    206 #if	XTAL
    207 #define	CLOCK_ADJ	2	/* adjustment interval (1<<CLOCK_ADJ secs) */
    208 #define	CLOCK_PHASE	8	/* phase shift */
    209 #define	CLOCK_MAX	0.128	/* maximum aperture (milliseconds) */
    210 #else
    211 #define	CLOCK_ADJ	0
    212 #define	CLOCK_PHASE	6	/* phase shift */
    213 #define	CLOCK_MAX	0.512	/* maximum aperture (milliseconds) */
    214 #endif
    215 #define	CLOCK_FREQ	10	/* frequency shift */
    216 #define	CLOCK_TRACK	8
    217 #define	CLOCK_COMP	4
    218 #define	CLOCK_FACTOR	18
    219 
    220 /*
    221  * Structure definitions for NTP fixed point values
    222  *
    223  *    0			  1		      2			  3
    224  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    225  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    226  *   |			       Integer Part			     |
    227  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    228  *   |			       Fraction Part			     |
    229  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    230  *
    231  *
    232  *    0			  1		      2			  3
    233  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    234  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    235  *   |		  Integer Part	     |	   Fraction Part	     |
    236  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    237  */
    238 struct l_fixedpt {
    239 	ulong_t int_part;
    240 	ulong_t fraction;
    241 };
    242 
    243 struct s_fixedpt {
    244 	ushort_t int_part;
    245 	ushort_t fraction;
    246 };
    247 
    248 /*
    249  *  =================  Table 3.3. Packet Variables   =================
    250  *    0			  1		      2			  3
    251  *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    252  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    253  *   |LI | VN  | Mode|	  Stratum    |	    Poll     |	 Precision   |
    254  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    255  *   |			   Synchronizing Distance		     |
    256  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    257  *   |			  Synchronizing Dispersion		     |
    258  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    259  *   |			Reference Clock Identifier		     |
    260  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    261  *   |								     |
    262  *   |		       Reference Timestamp (64 bits)		     |
    263  *   |								     |
    264  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    265  *   |								     |
    266  *   |		       Originate Timestamp (64 bits)		     |
    267  *   |								     |
    268  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    269  *   |								     |
    270  *   |			Receive Timestamp (64 bits)		     |
    271  *   |								     |
    272  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    273  *   |								     |
    274  *   |			Transmit Timestamp (64 bits)		     |
    275  *   |								     |
    276  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    277  *   |		     Encryption Keyid (32 bits, when A bit set)	     |
    278  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    279  *   |								     |
    280  *   |		Message Authentication Code/MAC (when A bit set)     |
    281  *   |								     |
    282  *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    283  */
    284 
    285 #define	MAC_OCTETS_DES	8
    286 #define	MAC_OCTETS_MD5	16
    287 #define	MAC_OCTETS_MIN	MAC_OCTETS_DES
    288 #define	MAC_OCTETS_MAX	MAC_OCTETS_MD5
    289 #define	AUTH_OCTETS_V3	(MAC_OCTETS_MAX + sizeof (uint32_t))
    290 
    291 struct ntpdata {
    292 	uchar_t li_vn_mode;	/* contains leap indicator, version and mode */
    293 	uchar_t stratum; 	/* Stratum level */
    294 	uchar_t ppoll;		/* poll value */
    295 	int precision:8;
    296 	struct s_fixedpt distance;
    297 	struct s_fixedpt dispersion;
    298 	ulong_t refid;
    299 	struct l_fixedpt reftime;
    300 	struct l_fixedpt org;
    301 	struct l_fixedpt rec;
    302 	struct l_fixedpt xmt;
    303 	uint32_t keyid;
    304 	uchar_t mac[MAC_OCTETS_MAX];
    305 };
    306 
    307 #define	LEN_PKT_NOMAC	(sizeof (struct ntpdata) - AUTH_OCTETS_V3)
    308 
    309 /*
    310  *	Leap Second Codes (high order two bits)
    311  */
    312 #define	NO_WARNING	0x00	/* no warning */
    313 #define	PLUS_SEC	0x40	/* add a second (61 seconds) */
    314 #define	MINUS_SEC	0x80	/* minus a second (59 seconds) */
    315 #define	ALARM		0xc0	/* alarm condition (clock unsynchronized) */
    316 
    317 /*
    318  *	Clock Status Bits that Encode Version
    319  */
    320 #define	NTPVERSION_1	0x08
    321 #define	VERSIONMASK	0x38
    322 #define	LEAPMASK	0xc0
    323 #define	NTPMODEMASK	0x07
    324 
    325 /*
    326  *	Code values
    327  */
    328 #define	MODE_UNSPEC	0	/* unspecified */
    329 #define	MODE_SYM_ACT	1	/* symmetric active */
    330 #define	MODE_SYM_PAS	2	/* symmetric passive */
    331 #define	MODE_CLIENT	3	/* client */
    332 #define	MODE_SERVER	4	/* server */
    333 #define	MODE_BROADCAST	5	/* broadcast */
    334 #define	MODE_CONTROL	6	/* control */
    335 #define	MODE_PRIVATE	7	/* private */
    336 
    337 /*
    338  *	Stratum Definitions
    339  */
    340 #define	UNSPECIFIED	0
    341 #define	PRIM_REF	1	/* radio clock */
    342 #define	INFO_QUERY	62	/* **** THIS implementation dependent **** */
    343 #define	INFO_REPLY	63	/* **** THIS implementation dependent **** */
    344 
    345 
    346 /* =================  table 3.2 Peer Variables	================= */
    347 struct ntp_peer {
    348 	struct ntp_peer *next, *prev;
    349 	struct sockaddr_in src;		/* both peer.srcadr and peer.srcport */
    350 	int	flags;			/* local flags */
    351 #define	PEER_FL_CONFIG		1
    352 #define	PEER_FL_AUTHENABLE	2
    353 #define	PEER_FL_SYNC		0x1000	/* peer can bet sync'd to */
    354 #define	PEER_FL_BCAST		0x2000	/* broadcast peer */
    355 #define	PEER_FL_SELECTED	0x8000	/* actually used by query routine */
    356 
    357 	int	sock;			/* index into sockets to derive */
    358 					/*   peer.dstadr and peer.dstport */
    359 	uchar_t	leap;			/* receive */
    360 	uchar_t	hmode;			/* receive */
    361 	uchar_t	stratum;		/* receive */
    362 	uchar_t	ppoll;			/* receive */
    363 	uchar_t	hpoll;			/* poll update */
    364 	short	precision;		/* receive */
    365 	struct	s_fixedpt distance;	/* receive */
    366 	struct	s_fixedpt dispersion;	/* receive */
    367 	ulong_t	refid;			/* receive */
    368 	struct	l_fixedpt reftime;	/* receive */
    369 	struct	l_fixedpt org;		/* receive, clear */
    370 	struct	l_fixedpt rec;		/* receive, clear */
    371 	struct	l_fixedpt xmt;		/* transmit, clear */
    372 	ulong_t	reach;			/* receive, transmit, clear */
    373 	ulong_t	valid;			/* packet, transmit, clear */
    374 	ulong_t	timer;			/* receive, transmit, poll update */
    375 	long	stopwatch;		/* <<local>> for timing */
    376 	/*
    377 	 * first order offsets
    378 	 */
    379 	struct	filter {
    380 		short samples;		/* <<local>> */
    381 		double offset[PEER_SHIFT];
    382 		double delay[PEER_SHIFT];
    383 	} filter;			/* filter, clear */
    384 
    385 	double	estdelay;		/* filter */
    386 	double	estoffset;		/* filter */
    387 	double	estdisp;		/* filter */
    388 
    389 	ulong_t	pkt_sent;		/* <<local>> */
    390 	ulong_t pkt_rcvd;		/* <<local>> */
    391 	ulong_t	pkt_dropped;		/* <<local>> */
    392 };
    393 
    394 /* ================= table 3.1:  System Variables ================= */
    395 
    396 struct sysdata {			/* procedure */
    397 	uchar_t leap;			/* clock update */
    398 	uchar_t stratum;		/* clock update */
    399 	short precision;		/* system */
    400 	struct s_fixedpt distance;	/* clock update */
    401 	struct s_fixedpt dispersion;	/* clock update */
    402 	ulong_t refid;			/* clock update */
    403 	struct l_fixedpt reftime;	/* clock update */
    404 	int hold;			/* clock update */
    405 	struct ntp_peer *peer;		/* selection */
    406 	int maxpeers;			/* <<local>> */
    407 	uchar_t filler;			/* put here for %&*%$$ SUNs */
    408 };
    409 
    410 #define	NTPDC_VERSION	2
    411 
    412 /*
    413  *  These structures are used to pass information to the ntpdc (control)
    414  *  program.  They are unique to this implementation and not part of the
    415  *  NTP specification.
    416  */
    417 struct clockinfo {
    418 	ulong_t net_address;
    419 	ulong_t my_address;
    420 	ushort_t port;
    421 	ushort_t flags;
    422 	ulong_t pkt_sent;
    423 	ulong_t pkt_rcvd;
    424 	ulong_t pkt_dropped;
    425 	ulong_t timer;
    426 	uchar_t leap;
    427 	uchar_t stratum;
    428 	uchar_t ppoll;
    429 	int precision:8;
    430 
    431 	uchar_t hpoll;
    432 	uchar_t filler1;
    433 	ushort_t reach;
    434 
    435 	long	estdisp;			/* scaled by 1000 */
    436 	long	estdelay;			/* in milliseconds */
    437 	long	estoffset;			/* in milliseconds */
    438 	ulong_t refid;
    439 	struct l_fixedpt reftime;
    440 	struct info_filter {
    441 		short index;
    442 		short filler;
    443 		long offset[PEER_SHIFT];	/* in milliseconds */
    444 		long delay[PEER_SHIFT];		/* in milliseconds */
    445 	} info_filter;
    446 };
    447 
    448 struct ntpinfo {
    449 	uchar_t version;
    450 	uchar_t type;		/* request type (stratum in ntp packets) */
    451 	uchar_t count;		/* number of entries in this packet */
    452 	uchar_t seq;		/* sequence number of this packet */
    453 
    454 	uchar_t npkts;		/* total number of packets */
    455 	uchar_t peers;
    456 	uchar_t fill3;
    457 	uchar_t fill4;
    458 };
    459 
    460 /*
    461  * From usr/src/cmd/xntpd/include/ntp_control.h:
    462  * Definition of a mode 6 packet.
    463  */
    464 struct ntp_control {
    465 	uchar_t li_vn_mode;		/* leap, version, mode */
    466 	uchar_t r_m_e_op;		/* response, more, error, opcode */
    467 	ushort_t sequence;		/* sequence number of request */
    468 	ushort_t status;		/* status word for association */
    469 	ushort_t associd;		/* association ID */
    470 	ushort_t offset;		/* offset of this batch of data */
    471 	ushort_t count;			/* count of data in this packet */
    472 	uchar_t data[1];		/* data + auth */
    473 };
    474 
    475 #define	NTPC_DATA_MAXLEN	(480 + AUTH_OCTETS_V3)
    476 
    477 /*
    478  * Decoding for the r_m_e_op field
    479  */
    480 #define	CTL_RESPONSE	0x80
    481 #define	CTL_ERROR	0x40
    482 #define	CTL_MORE	0x20
    483 #define	CTL_OP_MASK	0x1f
    484 
    485 /*
    486  * Opcodes
    487  */
    488 #define	CTL_OP_UNSPEC		0
    489 #define	CTL_OP_READSTAT		1
    490 #define	CTL_OP_READVAR		2
    491 #define	CTL_OP_WRITEVAR		3
    492 #define	CTL_OP_READCLOCK	4
    493 #define	CTL_OP_WRITECLOCK	5
    494 #define	CTL_OP_SETTRAP		6
    495 #define	CTL_OP_ASYNCMSG		7
    496 #define	CTL_OP_UNSETTRAP	31
    497 
    498 /*
    499  * From usr/src/cmd/xntpd/include/ntp_request.h:
    500  * A mode 7 packet is used exchanging data between an NTP server
    501  * and a client for purposes other than time synchronization, e.g.
    502  * monitoring, statistics gathering and configuration.  A mode 7
    503  * packet has the following format:
    504  */
    505 
    506 struct ntp_private {
    507 	uchar_t rm_vn_mode;		/* response, more, version, mode */
    508 	uchar_t auth_seq;		/* key, sequence number */
    509 	uchar_t implementation;		/* implementation number */
    510 	uchar_t request;		/* request number */
    511 	ushort_t err_nitems;		/* error code/number of data items */
    512 	ushort_t mbz_itemsize;		/* item size */
    513 	char data[1];			/* data area */
    514 };
    515 
    516 #define	RESP_BIT		0x80
    517 #define	MORE_BIT		0x40
    518 #define	INFO_VERSION(rm_vn_mode) ((uchar_t)(((rm_vn_mode)>>3) & 0x7))
    519 #define	INFO_MODE(rm_vn_mode)	((rm_vn_mode) & 0x7)
    520 
    521 #define	AUTH_BIT		0x80
    522 #define	INFO_SEQ(auth_seq)	((auth_seq) & 0x7f)
    523 
    524 #define	INFO_ERR(err_nitems)	((ushort_t)((ntohs(err_nitems) >> 12) & 0xf))
    525 #define	INFO_NITEMS(err_nitems)	((ushort_t)(ntohs(err_nitems) & 0xfff))
    526 
    527 #define	INFO_ITEMSIZE(mbz_itemsize) (ntohs(mbz_itemsize) & 0xfff)
    528 
    529 #ifdef __cplusplus
    530 }
    531 #endif
    532 
    533 #endif	/* _NTP_H */
    534