/****************************************************************************
 * apps/netutils/ntpclient/ntpv3.h
 *
 *   Copyright (C) 2014 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <gnutt@nuttx.org>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ****************************************************************************/

#ifndef __APPS_NETUTILS_NTPCLIENT_NTPV3_H
#define __APPS_NETUTILS_NTPCLIENT_NTPV3_H 1

/****************************************************************************
 * Included Files
 ****************************************************************************/

/****************************************************************************
 * Pre-processor Definitions
 ****************************************************************************/

/* The NTP version is described in RFC 1305 (NTP version 3), Appendix A:
 *
 *    0                   1                   2                   3
 *    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
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |LI | VN  |Mode |    Stratum    |     Poll      |   Precision   |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                          Root Delay                           |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                       Root Dispersion                         |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                     Reference Identifier                      |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                                                               |
 *   |                   Reference Timestamp (64)                    |
 *   |                                                               |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                                                               |
 *   |                   Originate Timestamp (64)                    |
 *   |                                                               |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                                                               |
 *   |                    Receive Timestamp (64)                     |
 *   |                                                               |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                                                               |
 *   |                    Transmit Timestamp (64)                    |
 *   |                                                               |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                 Key Identifier (optional) (32)                |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 *   |                                                               |
 *   |                                                               |
 *   |                 Message Digest (optional) (128)               |
 *   |                                                               |
 *   |                                                               |
 *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 */

#define NTP_DATAGRAM_MINSIZE (12 * sizeof(uint32_t))
#define NTP_DATAGRAM_MAXSIZE (17 * sizeof(uint32_t))

/*  Leap Indicator (LI):  2-bit code warning of impending leap-second to be
 *  inserted at the end of the last day of the current month. Bits are coded
 *  as follows:
 *
 *    00      no warning
 *    01      last minute has 61 seconds
 *    10      last minute has 59 seconds
 *    11      alarm condition (clock not synchronized)
 *
 *  Version Number (VN):  This is a three-bit integer indicating the NTP
 *  version number.  In this case, three (3).
 *
 *  Mode: This is a three-bit integer indicating the mode, with values
 *  defined as follows:
 *
 *    0 reserved
 *    1 symmetric active
 *    2 symmetric passive
 *    3 client
 *    4 server
 *    5 broadcast
 *    6 reserved for NTP control message (see Appendix B)
 *    7 reserved for private use
 *
 * Stratum: This is a eight-bit integer indicating the stratum level of the
 * local clock, with values defined as follows:
 *
 *    0 unspecified
 *    1 primary reference (e.g., radio clock)
 *    2-255 secondary reference (via NTP)
 *
 * Poll Interval: This is an eight-bit signed integer indicating the maximum
 * interval between successive messages, in seconds to the nearest power of
 * two.
 *
 * Precision: This is an eight-bit signed integer indicating the precision
 * of the local clock, in seconds to the nearest power of two.
 *
 * Root Delay: This is a 32-bit signed fixed-point number indicating the
 * total roundtrip delay to the primary reference source, in seconds with
 * fraction point between bits 15 and 16. Note that this variable can take
 * on both positive and negative values, depending on clock precision and
 * skew.
 *
 * Root Dispersion: This is a 32-bit signed fixed-point number indicating
 * the maximum error relative to the primary reference source, in seconds
 * with fraction point between bits 15 and 16. Only positive values greater
 * than zero are possible.
 *
 * Reference Clock Identifier: This is a 32-bit code identifying the
 * particular reference clock. In the case of stratum 0 (unspecified) or
 * stratum 1 (primary reference), this is a four-octet, left-justified,
 * zero-padded ASCII string.
 *
 * While not enumerated as part of the NTP specification, the following are
 * suggested ASCII identifiers:
 *
 *    Stratum Code     Meaning
 *      0     DCN      DCN routing protocol
 *      0     NIST     NIST public modem
 *      0     TSP      TSP time protocol
 *      0     DTS      Digital Time Service
 *      1     ATOM     Atomic clock (calibrated)
 *      1     VLF      VLF radio (OMEGA, etc.)
 *      1     callsign Generic radio
 *      1     LORC     LORAN-C radionavigation
 *      1     GOES     GOES UHF environment satellite
 *      1     GPS      GPS UHF satellite positioning
 *
 * In the case of stratum 2 and greater (secondary reference) this is the
 * four-octet Internet address of the primary reference host.
 *
 * Reference Timestamp: This is the local time at which the local clock was
 * last set or corrected, in 64-bit timestamp format.
 *
 * Originate Timestamp: This is the local time at which the request departed
 * the client host for the service host, in 64-bit timestamp format.
 *
 * Receive Timestamp: This is the local time at which the request arrived at
 * the service host, in 64-bit timestamp format.
 *
 * Transmit Timestamp: This is the local time at which the reply departed
 * the service host for the client host, in 64-bit timestamp format.
 *
 * Authenticator (optional): When the NTP authentication mechanism is
 * implemented, this contains the authenticator information defined in
 * Appendix C.
 */

#define MKLVM(l,v,m) ((uint8_t)(l) << 6 | (uint8_t)(v) << 3 | (uint8_t)(m))
#define GETLI(lvm)   ((uint8_t)(lvm) >> 6)
#define GETVN(lvm)   ((uint8_t)(lvm) >> 3) & 7)
#define GETMODE(lvm) ((uint8_t)(lvm) & 7)

/****************************************************************************
 * Public Types
 ****************************************************************************/

struct ntp_datagram_s
{
  uint8_t lvm;               /* LI | VN | Mode */
  uint8_t stratum;           /* Stratum */
  uint8_t poll;              /* Poll interval */
  uint8_t precision;         /* Precision */
  uint8_t rootdelay[4];      /* Root Delay */
  uint8_t rootdispersion[4]; /* Root dispersion */
  uint8_t refid[4];          /* Reference Clock Identifier */
  uint8_t reftimestamp[8];   /* Rererence Timestamp */
  uint8_t origtimestamp[8];  /* Originate Timestamp */
  uint8_t recvtimestamp[8];  /* Receive Timestamp */
  uint8_t xmittimestamp[8];  /* Transmit Timestamp */
  uint8_t keyid[4];          /* Authenticator data */
  uint8_t digest1[4];
  uint8_t digest2[4];
  uint8_t digest3[4];
  uint8_t digest4[4];
};

#endif /* __APPS_NETUTILS_NTPCLIENT_NTPV3_H */
