home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / tcpdumpb.zip / print-ntp.c < prev    next >
C/C++ Source or Header  |  1996-07-23  |  7KB  |  285 lines

  1. /*
  2.  * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996
  3.  *    The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  *
  21.  * Format and print ntp packets.
  22.  *    By Jeffrey Mogul/DECWRL
  23.  *    loosely based on print-bootp.c
  24.  */
  25.  
  26. #ifndef lint
  27. static char rcsid[] =
  28.     "@(#) $Header: print-ntp.c,v 1.23 96/07/23 14:17:26 leres Exp $ (LBL)";
  29. #endif
  30.  
  31. #include <sys/param.h>
  32. #include <sys/time.h>
  33. #include <sys/socket.h>
  34.  
  35. #if __STDC__
  36. struct mbuf;
  37. struct rtentry;
  38. #endif
  39. #include <net/if.h>
  40.  
  41. #include <netinet/in.h>
  42. #include <netinet/if_ether.h>
  43.  
  44. #include <ctype.h>
  45. #include <stdio.h>
  46. #include <string.h>
  47.  
  48. #include "interface.h"
  49. #include "addrtoname.h"
  50. #undef MODEMASK                    /* Solaris sucks */
  51. #include "ntp.h"
  52.  
  53. static void p_sfix(const struct s_fixedpt *);
  54. static void p_ntp_time(const struct l_fixedpt *);
  55. static void p_ntp_delta(const struct l_fixedpt *, const struct l_fixedpt *);
  56.  
  57. /*
  58.  * Print ntp requests
  59.  */
  60. void
  61. ntp_print(register const u_char *cp, u_int length)
  62. {
  63.     register const struct ntpdata *bp;
  64.     int mode, version, leapind;
  65.     static char rclock[5];
  66.  
  67.     bp = (struct ntpdata *)cp;
  68.     /* Note funny sized packets */
  69.     if (length != sizeof(struct ntpdata))
  70.         (void)printf(" [len=%d]", length);
  71.  
  72.     TCHECK(bp->status);
  73.  
  74.     version = (bp->status & VERSIONMASK) >> 3;
  75.     printf(" v%d", version);
  76.  
  77.     leapind = bp->status & LEAPMASK;
  78.     switch (leapind) {
  79.  
  80.     case NO_WARNING:
  81.         break;
  82.  
  83.     case PLUS_SEC:
  84.         fputs(" +1s", stdout);
  85.         break;
  86.  
  87.     case MINUS_SEC:
  88.         fputs(" -1s", stdout);
  89.         break;
  90.     }
  91.  
  92.     mode = bp->status & MODEMASK;
  93.     switch (mode) {
  94.  
  95.     case MODE_UNSPEC:    /* unspecified */
  96.         fputs(" unspec", stdout);
  97.         break;
  98.  
  99.     case MODE_SYM_ACT:    /* symmetric active */
  100.         fputs(" sym_act", stdout);
  101.         break;
  102.  
  103.     case MODE_SYM_PAS:    /* symmetric passive */
  104.         fputs(" sym_pas", stdout);
  105.         break;
  106.  
  107.     case MODE_CLIENT:    /* client */
  108.         fputs(" client", stdout);
  109.         break;
  110.  
  111.     case MODE_SERVER:    /* server */
  112.         fputs(" server", stdout);
  113.         break;
  114.  
  115.     case MODE_BROADCAST:    /* broadcast */
  116.         fputs(" bcast", stdout);
  117.         break;
  118.  
  119.     case MODE_RES1:        /* reserved */
  120.         fputs(" res1", stdout);
  121.         break;
  122.  
  123.     case MODE_RES2:        /* reserved */
  124.         fputs(" res2", stdout);
  125.         break;
  126.  
  127.     }
  128.  
  129.     TCHECK(bp->stratum);
  130.     printf(" strat %d", bp->stratum);
  131.  
  132.     TCHECK(bp->ppoll);
  133.     printf(" poll %d", bp->ppoll);
  134.  
  135.     /* Can't TCHECK bp->precision bitfield so bp->distance + 0 instead */
  136.     TCHECK2(bp->distance, 0);
  137.     printf(" prec %d", bp->precision);
  138.  
  139.     if (!vflag)
  140.         return;
  141.  
  142.     TCHECK(bp->distance);
  143.     fputs(" dist ", stdout);
  144.     p_sfix(&bp->distance);
  145.  
  146.     TCHECK(bp->dispersion);
  147.     fputs(" disp ", stdout);
  148.     p_sfix(&bp->dispersion);
  149.  
  150.     TCHECK(bp->refid);
  151.     fputs(" ref ", stdout);
  152.     /* Interpretation depends on stratum */
  153.     switch (bp->stratum) {
  154.  
  155.     case UNSPECIFIED:
  156.         printf("(unspec)");
  157.         break;
  158.  
  159.     case PRIM_REF:
  160.         strncpy(rclock, (char *)&(bp->refid), 4);
  161.         rclock[4] = '\0';
  162.         fputs(rclock, stdout);
  163.         break;
  164.  
  165.     case INFO_QUERY:
  166.         printf("%s INFO_QUERY", ipaddr_string(&(bp->refid)));
  167.         /* this doesn't have more content */
  168.         return;
  169.  
  170.     case INFO_REPLY:
  171.         printf("%s INFO_REPLY", ipaddr_string(&(bp->refid)));
  172.         /* this is too complex to be worth printing */
  173.         return;
  174.  
  175.     default:
  176.         printf("%s", ipaddr_string(&(bp->refid)));
  177.         break;
  178.     }
  179.  
  180.     TCHECK(bp->reftime);
  181.     putchar('@');
  182.     p_ntp_time(&(bp->reftime));
  183.  
  184.     TCHECK(bp->org);
  185.     fputs(" orig ", stdout);
  186.     p_ntp_time(&(bp->org));
  187.  
  188.     TCHECK(bp->rec);
  189.     fputs(" rec ", stdout);
  190.     p_ntp_delta(&(bp->org), &(bp->rec));
  191.  
  192.     TCHECK(bp->xmt);
  193.     fputs(" xmt ", stdout);
  194.     p_ntp_delta(&(bp->org), &(bp->xmt));
  195.  
  196.     return;
  197.  
  198. trunc:
  199.     fputs(" [|ntp]", stdout);
  200. }
  201.  
  202. static void
  203. p_sfix(register const struct s_fixedpt *sfp)
  204. {
  205.     register int i;
  206.     register int f;
  207.     register float ff;
  208.  
  209.     i = ntohs(sfp->int_part);
  210.     f = ntohs(sfp->fraction);
  211.     ff = f / 65536.0;    /* shift radix point by 16 bits */
  212.     f = ff * 1000000.0;    /* Treat fraction as parts per million */
  213.     printf("%d.%06d", i, f);
  214. }
  215.  
  216. #define    FMAXINT    (4294967296.0)    /* floating point rep. of MAXINT */
  217.  
  218. static void
  219. p_ntp_time(register const struct l_fixedpt *lfp)
  220. {
  221.     register int32_t i;
  222.     register u_int32_t uf;
  223.     register u_int32_t f;
  224.     register float ff;
  225.  
  226.     i = ntohl(lfp->int_part);
  227.     uf = ntohl(lfp->fraction);
  228.     ff = uf;
  229.     if (ff < 0.0)        /* some compilers are buggy */
  230.         ff += FMAXINT;
  231.     ff = ff / FMAXINT;    /* shift radix point by 32 bits */
  232.     f = ff * 1000000000.0;    /* treat fraction as parts per billion */
  233.     printf("%u.%09d", i, f);
  234. }
  235.  
  236. /* Prints time difference between *lfp and *olfp */
  237. static void
  238. p_ntp_delta(register const struct l_fixedpt *olfp,
  239.         register const struct l_fixedpt *lfp)
  240. {
  241.     register int32_t i;
  242.     register u_int32_t uf;
  243.     register u_int32_t ouf;
  244.     register u_int32_t f;
  245.     register float ff;
  246.     int signbit;
  247.  
  248.     i = ntohl(lfp->int_part) - ntohl(olfp->int_part);
  249.  
  250.     uf = ntohl(lfp->fraction);
  251.     ouf = ntohl(olfp->fraction);
  252.  
  253.     if (i > 0) {        /* new is definitely greater than old */
  254.         signbit = 0;
  255.         f = uf - ouf;
  256.         if (ouf > uf)    /* must borrow from high-order bits */
  257.             i -= 1;
  258.     } else if (i < 0) {    /* new is definitely less than old */
  259.         signbit = 1;
  260.         f = ouf - uf;
  261.         if (uf > ouf)    /* must carry into the high-order bits */
  262.             i += 1;
  263.         i = -i;
  264.     } else {        /* int_part is zero */
  265.         if (uf > ouf) {
  266.             signbit = 0;
  267.             f = uf - ouf;
  268.         } else {
  269.             signbit = 1;
  270.             f = ouf - uf;
  271.         }
  272.     }
  273.  
  274.     ff = f;
  275.     if (ff < 0.0)        /* some compilers are buggy */
  276.         ff += FMAXINT;
  277.     ff = ff / FMAXINT;    /* shift radix point by 32 bits */
  278.     f = ff * 1000000000.0;    /* treat fraction as parts per billion */
  279.     if (signbit)
  280.         putchar('-');
  281.     else
  282.         putchar('+');
  283.     printf("%d.%09d", i, f);
  284. }
  285.