12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * The Regents of the University of California. All rights reserved. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that: (1) source code distributions 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * retain the above copyright notice and this paragraph in its entirety, (2) 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * distributions including binary code include the above copyright notice and 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * this paragraph in its entirety in the documentation or other materials 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * provided with the distribution, and (3) all advertising materials mentioning 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * features or use of this software display the following acknowledgement: 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * ``This product includes software developed by the University of California, 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * the University nor the names of its contributors may be used to endorse 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * or promote products derived from this software without specific prior 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * written permission. 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Format and print ntp packets. 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * By Jeffrey Mogul/DECWRL 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * loosely based on print-bootp.c 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 2853f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/print-ntp.c,v 1.43 2007-11-30 13:45:10 hannes Exp $ (LBL)"; 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_STRFTIME 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <time.h> 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef MODEMASK 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#undef MODEMASK /* Solaris sucks */ 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ntp.h" 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void p_sfix(const struct s_fixedpt *); 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void p_ntp_time(const struct l_fixedpt *); 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void p_ntp_delta(const struct l_fixedpt *, const struct l_fixedpt *); 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 5553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ntp_mode_values[] = { 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_UNSPEC, "unspecified" }, 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_SYM_ACT, "symmetric active" }, 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_SYM_PAS, "symmetric passive" }, 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_CLIENT, "Client" }, 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_SERVER, "Server" }, 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_BROADCAST, "Broadcast" }, 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_RES1, "Reserved" }, 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MODE_RES2, "Reserved" }, 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 6753f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ntp_leapind_values[] = { 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { NO_WARNING, "" }, 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { PLUS_SEC, "+1s" }, 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { MINUS_SEC, "-1s" }, 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { ALARM, "clock unsynchronized" }, 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project { 0, NULL } 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 7553f17a9db278d33517d9888dd77848f554522a38JP Abgrallstatic const struct tok ntp_stratum_values[] = { 7653f17a9db278d33517d9888dd77848f554522a38JP Abgrall { UNSPECIFIED, "unspecified" }, 7753f17a9db278d33517d9888dd77848f554522a38JP Abgrall { PRIM_REF, "primary reference" }, 7853f17a9db278d33517d9888dd77848f554522a38JP Abgrall { 0, NULL } 7953f17a9db278d33517d9888dd77848f554522a38JP Abgrall}; 8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Print ntp requests 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectntp_print(register const u_char *cp, u_int length) 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct ntpdata *bp; 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int mode, version, leapind; 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bp = (struct ntpdata *)cp; 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->status); 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project version = (int)(bp->status & VERSIONMASK) >> 3; 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("NTPv%d", version); 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project mode = bp->status & MODEMASK; 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!vflag) { 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf (", %s, length %u", 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ntp_mode_values, "Unknown mode", mode), 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length); 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf (", length %u\n\t%s", 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project length, 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ntp_mode_values, "Unknown mode", mode)); 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project leapind = bp->status & LEAPMASK; 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf (", Leap indicator: %s (%u)", 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tok2str(ntp_leapind_values, "Unknown", leapind), 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project leapind); 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->stratum); 11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", Stratum %u (%s)", 11653f17a9db278d33517d9888dd77848f554522a38JP Abgrall bp->stratum, 11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall tok2str(ntp_stratum_values, (bp->stratum >=2 && bp->stratum<=15) ? "secondary reference" : "reserved", bp->stratum)); 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->ppoll); 12053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf(", poll %u (%us)", bp->ppoll, 1 << bp->ppoll); 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Can't TCHECK bp->precision bitfield so bp->distance + 0 instead */ 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK2(bp->root_delay, 0); 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(", precision %d", bp->precision); 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->root_delay); 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\tRoot Delay: ", stdout); 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_sfix(&bp->root_delay); 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->root_dispersion); 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(", Root dispersion: ", stdout); 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_sfix(&bp->root_dispersion); 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->refid); 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(", Reference-ID: ", stdout); 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* Interpretation depends on stratum */ 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project switch (bp->stratum) { 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case UNSPECIFIED: 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("(unspec)"); 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case PRIM_REF: 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (fn_printn((u_char *)&(bp->refid), 4, snapend)) 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project goto trunc; 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case INFO_QUERY: 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s INFO_QUERY", ipaddr_string(&(bp->refid))); 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this doesn't have more content */ 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project case INFO_REPLY: 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s INFO_REPLY", ipaddr_string(&(bp->refid))); 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* this is too complex to be worth printing */ 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project default: 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s", ipaddr_string(&(bp->refid))); 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project break; 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->ref_timestamp); 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Reference Timestamp: ", stdout); 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(&(bp->ref_timestamp)); 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->org_timestamp); 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Originator Timestamp: ", stdout); 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(&(bp->org_timestamp)); 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->rec_timestamp); 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Receive Timestamp: ", stdout); 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(&(bp->rec_timestamp)); 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project TCHECK(bp->xmt_timestamp); 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Transmit Timestamp: ", stdout); 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(&(bp->xmt_timestamp)); 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Originator - Receive Timestamp: ", stdout); 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_delta(&(bp->org_timestamp), &(bp->rec_timestamp)); 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs("\n\t Originator - Transmit Timestamp: ", stdout); 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_delta(&(bp->org_timestamp), &(bp->xmt_timestamp)); 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 18553f17a9db278d33517d9888dd77848f554522a38JP Abgrall if ( (sizeof(struct ntpdata) - length) == 16) { /* Optional: key-id */ 18653f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK(bp->key_id); 18753f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\tKey id: %u", bp->key_id); 18853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } else if ( (sizeof(struct ntpdata) - length) == 0) { /* Optional: key-id + authentication */ 18953f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK(bp->key_id); 19053f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\tKey id: %u", bp->key_id); 19153f17a9db278d33517d9888dd77848f554522a38JP Abgrall TCHECK2(bp->message_digest, sizeof (bp->message_digest)); 19253f17a9db278d33517d9888dd77848f554522a38JP Abgrall printf("\n\tAuthentication: %08x%08x%08x%08x", 19353f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_32BITS(bp->message_digest), 19453f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_32BITS(bp->message_digest + 4), 19553f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_32BITS(bp->message_digest + 8), 19653f17a9db278d33517d9888dd77848f554522a38JP Abgrall EXTRACT_32BITS(bp->message_digest + 12)); 19753f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 1982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projecttrunc: 2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project fputs(" [|ntp]", stdout); 2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectp_sfix(register const struct s_fixedpt *sfp) 2062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int i; 2082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int f; 2092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register float ff; 2102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = EXTRACT_16BITS(&sfp->int_part); 2122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = EXTRACT_16BITS(&sfp->fraction); 2132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = f / 65536.0; /* shift radix point by 16 bits */ 2142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ff * 1000000.0; /* Treat fraction as parts per million */ 2152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%d.%06d", i, f); 2162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#define FMAXINT (4294967296.0) /* floating point rep. of MAXINT */ 2192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectp_ntp_time(register const struct l_fixedpt *lfp) 2222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int32_t i; 2242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t uf; 2252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t f; 2262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register float ff; 2272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = EXTRACT_32BITS(&lfp->int_part); 2292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project uf = EXTRACT_32BITS(&lfp->fraction); 2302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = uf; 2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ff < 0.0) /* some compilers are buggy */ 2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff += FMAXINT; 2332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = ff / FMAXINT; /* shift radix point by 32 bits */ 2342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ff * 1000000000.0; /* treat fraction as parts per billion */ 2352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%u.%09d", i, f); 2362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_STRFTIME 2382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 2392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * print the time in human-readable format. 2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 2412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i) { 2422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project time_t seconds = i - JAN_1970; 2432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct tm *tm; 2442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char time_buf[128]; 2452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project tm = localtime(&seconds); 2472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project strftime(time_buf, sizeof (time_buf), "%Y/%m/%d %H:%M:%S", tm); 2482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf (" (%s)", time_buf); 2492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 2512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 2522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Prints time difference between *lfp and *olfp */ 2542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic void 2552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectp_ntp_delta(register const struct l_fixedpt *olfp, 2562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct l_fixedpt *lfp) 2572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 2582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register int32_t i; 2592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t u, uf; 2602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t ou, ouf; 2612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register u_int32_t f; 2622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register float ff; 2632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int signbit; 2642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u = EXTRACT_32BITS(&lfp->int_part); 2662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ou = EXTRACT_32BITS(&olfp->int_part); 2672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project uf = EXTRACT_32BITS(&lfp->fraction); 2682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ouf = EXTRACT_32BITS(&olfp->fraction); 2692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ou == 0 && ouf == 0) { 2702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project p_ntp_time(lfp); 2712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 2722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = u - ou; 2752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (i > 0) { /* new is definitely greater than old */ 2772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project signbit = 0; 2782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = uf - ouf; 2792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ouf > uf) /* must borrow from high-order bits */ 2802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i -= 1; 2812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else if (i < 0) { /* new is definitely less than old */ 2822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project signbit = 1; 2832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ouf - uf; 2842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (uf > ouf) /* must carry into the high-order bits */ 2852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i += 1; 2862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project i = -i; 2872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { /* int_part is zero */ 2882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (uf > ouf) { 2892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project signbit = 0; 2902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = uf - ouf; 2912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 2922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project signbit = 1; 2932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ouf - uf; 2942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 2962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = f; 2982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ff < 0.0) /* some compilers are buggy */ 2992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff += FMAXINT; 3002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ff = ff / FMAXINT; /* shift radix point by 32 bits */ 3012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project f = ff * 1000000000.0; /* treat fraction as parts per billion */ 3022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (signbit) 3032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('-'); 3042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 3052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar('+'); 3062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%d.%09d", i, f); 3072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 3082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 309