* Copyright (c) 1988-1990 The Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that: (1) source code distributions
* retain the above copyright notice and this paragraph in its entirety, (2)
* distributions including binary code include the above copyright notice and
* this paragraph in its entirety in the documentation or other materials
* provided with the distribution, and (3) all advertising materials mentioning
* features or use of this software display the following acknowledgement:
* ``This product includes software developed by the University of California,
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
* the University nor the names of its contributors may be used to endorse
* or promote products derived from this software without specific prior
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
* Format and print ntp packets.
* By Jeffrey Mogul/DECWRL
* loosely based on print-bootp.c
"@(#) $Header: print-ntp.c,v 1.7 92/01/04 01:45:16 leres Exp $ (LBL)";
#include <netinet/if_ether.h>
register struct ntpdata
*bp
;
int mode
, version
, leapind
;
#define TCHECK(var, l) if ((u_char *)&(var) > ep - l) goto trunc
/* Note funny sized packets */
if (length
!= sizeof(struct ntpdata
))
(void)printf(" [len=%d]", length
);
/* 'ep' points to the end of avaible data. */
TCHECK(bp
->status
, sizeof(bp
->status
));
version
= (bp
->status
& VERSIONMASK
) >> 3;
leapind
= bp
->status
& LEAPMASK
;
mode
= bp
->status
& MODEMASK
;
case MODE_UNSPEC
: /* unspecified */
fputs(" unspec", stdout
);
case MODE_SYM_ACT
: /* symmetric active */
fputs(" sym_act", stdout
);
case MODE_SYM_PAS
: /* symmetric passive */
fputs(" sym_pas", stdout
);
case MODE_CLIENT
: /* client */
fputs(" client", stdout
);
case MODE_SERVER
: /* server */
fputs(" server", stdout
);
case MODE_BROADCAST
: /* broadcast */
case MODE_RES1
: /* reserved */
case MODE_RES2
: /* reserved */
TCHECK(bp
->stratum
, sizeof(bp
->stratum
));
printf(" strat %d", bp
->stratum
);
TCHECK(bp
->ppoll
, sizeof(bp
->ppoll
));
printf(" poll %d", bp
->ppoll
);
/* Can't TCHECK bp->precision bitfield so bp->distance + 0 instead */
printf(" prec %d", bp
->precision
);
TCHECK(bp
->distance
, sizeof(bp
->distance
));
TCHECK(bp
->dispersion
, sizeof(bp
->dispersion
));
TCHECK(bp
->refid
, sizeof(bp
->refid
));
/* Interpretation depends on stratum */
strncpy(rclock
, (char *)&(bp
->refid
), 4);
printf("%s INFO_QUERY", ipaddr_string(&(bp
->refid
)));
/* this doesn't have more content */
printf("%s INFO_REPLY", ipaddr_string(&(bp
->refid
)));
/* this is too complex to be worth printing */
printf("%s", ipaddr_string(&(bp
->refid
)));
TCHECK(bp
->reftime
, sizeof(bp
->reftime
));
p_ntp_time(&(bp
->reftime
));
TCHECK(bp
->org
, sizeof(bp
->org
));
TCHECK(bp
->rec
, sizeof(bp
->rec
));
p_ntp_delta(&(bp
->org
), &(bp
->rec
));
TCHECK(bp
->xmt
, sizeof(bp
->xmt
));
p_ntp_delta(&(bp
->org
), &(bp
->xmt
));
fputs(" [|ntp]", stdout
);
register struct s_fixedpt
*sfp
;
i
= ntohs(sfp
->int_part
);
f
= ntohs(sfp
->fraction
);
ff
= f
/ 65536.0; /* shift radix point by 16 bits */
f
= ff
* 1000000.0; /* Treat fraction as parts per million */
#define FMAXINT (4294967296.0) /* floating point rep. of MAXINT */
register struct l_fixedpt
*lfp
;
register unsigned long uf
;
register unsigned long f
;
i
= ntohl(lfp
->int_part
);
uf
= ntohl(lfp
->fraction
);
if (ff
< 0.0) /* some compilers are buggy */
ff
= ff
/ FMAXINT
; /* shift radix point by 32 bits */
f
= ff
* 1000000000.0; /* treat fraction as parts per billion */
printf("%lu.%09d", i
, f
);
/* Prints time difference between *lfp and *olfp */
register struct l_fixedpt
*olfp
;
register struct l_fixedpt
*lfp
;
register unsigned long uf
;
register unsigned long ouf
;
register unsigned long f
;
i
= ntohl(lfp
->int_part
) - ntohl(olfp
->int_part
);
uf
= ntohl(lfp
->fraction
);
ouf
= ntohl(olfp
->fraction
);
if (i
> 0) { /* new is definitely greater than old */
if (ouf
> uf
) /* must borrow from high-order bits */
} else if (i
< 0) { /* new is definitely less than old */
if (uf
> ouf
) /* must carry into the high-order bits */
} else { /* int_part is zero */
if (ff
< 0.0) /* some compilers are buggy */
ff
= ff
/ FMAXINT
; /* shift radix point by 32 bits */
f
= ff
* 1000000000.0; /* treat fraction as parts per billion */