From 64f92051897d12f5fce799f0989beb45534af563 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Fri, 25 Nov 2016 16:28:09 +0100 Subject: [PATCH] client: add ntpdata command --- client.c | 81 +++++++++++++++++++++++++++++++++++++++++++++ doc/chronyc.adoc | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) diff --git a/client.c b/client.c index ccf7a36..1be211e 100644 --- a/client.c +++ b/client.c @@ -1193,6 +1193,7 @@ give_help(void) "\0\0" "NTP sources:\0\0" "activity\0Check how many NTP sources are online/offline\0" + "ntpdata
\0Display information about last valid measurement\0" "add server
[options]\0Add new NTP server\0" "add peer
[options]\0Add new NTP peer\0" "delete
\0Remove server or peer\0" @@ -2193,6 +2194,83 @@ process_cmd_tracking(char *line) /* ================================================== */ +static int +process_cmd_ntpdata(char *line) +{ + CMD_Request request; + CMD_Reply reply; + IPAddr remote_addr, local_addr; + struct timespec ref_time; + + if (DNS_Name2IPAddress(line, &remote_addr, 1) != DNS_Success) { + LOG(LOGS_ERR, LOGF_Client, "Could not get address for hostname"); + return 0; + } + + request.command = htons(REQ_NTP_DATA); + UTI_IPHostToNetwork(&remote_addr, &request.data.ntp_data.ip_addr); + if (!request_reply(&request, &reply, RPY_NTP_DATA, 0)) + return 0; + + UTI_IPNetworkToHost(&reply.data.ntp_data.remote_addr, &remote_addr); + UTI_IPNetworkToHost(&reply.data.ntp_data.local_addr, &local_addr); + UTI_TimespecNetworkToHost(&reply.data.ntp_data.ref_time, &ref_time); + + print_report("Remote address : %s\n" + "Remote port : %u\n" + "Local address : %s\n" + "Leap status : %L\n" + "Version : %u\n" + "Mode : %M\n" + "Stratum : %u\n" + "Poll : %u\n" + "Precision : %.9f seconds\n" + "Root delay : %.6f seconds\n" + "Root dispersion : %.6f seconds\n" + "Reference ID : %R\n" + "Reference time : %T\n" + "Offset : %+.9f seconds\n" + "Peer delay : %.9f seconds\n" + "Peer dispersion : %.9f seconds\n" + "Response time : %.9f seconds\n" + "Jitter asymmetry: %+.2f\n" + "NTP tests : %.3b %.3b %.4b\n" + "Interleaved : %B\n" + "Authenticated : %B\n" + "TX timestamping : %N\n" + "RX timestamping : %N\n" + "Total TX : %U\n" + "Total RX : %U\n" + "Total valid RX : %U\n", + UTI_IPToString(&remote_addr), ntohs(reply.data.ntp_data.remote_port), + UTI_IPToString(&local_addr), + reply.data.ntp_data.leap, reply.data.ntp_data.version, + reply.data.ntp_data.mode, reply.data.ntp_data.stratum, + reply.data.ntp_data.poll, UTI_Log2ToDouble(reply.data.ntp_data.precision), + UTI_FloatNetworkToHost(reply.data.ntp_data.root_delay), + UTI_FloatNetworkToHost(reply.data.ntp_data.root_dispersion), + (unsigned long)ntohl(reply.data.ntp_data.ref_id), &ref_time, + UTI_FloatNetworkToHost(reply.data.ntp_data.offset), + UTI_FloatNetworkToHost(reply.data.ntp_data.peer_delay), + UTI_FloatNetworkToHost(reply.data.ntp_data.peer_dispersion), + UTI_FloatNetworkToHost(reply.data.ntp_data.response_time), + UTI_FloatNetworkToHost(reply.data.ntp_data.jitter_asymmetry), + ntohs(reply.data.ntp_data.flags) >> 7, + ntohs(reply.data.ntp_data.flags) >> 4, + ntohs(reply.data.ntp_data.flags), + ntohs(reply.data.ntp_data.flags) & RPY_NTP_FLAG_INTERLEAVED, + ntohs(reply.data.ntp_data.flags) & RPY_NTP_FLAG_AUTHENTICATED, + reply.data.ntp_data.tx_tss_char, reply.data.ntp_data.rx_tss_char, + (unsigned long)ntohl(reply.data.ntp_data.total_tx_count), + (unsigned long)ntohl(reply.data.ntp_data.total_rx_count), + (unsigned long)ntohl(reply.data.ntp_data.total_valid_count), + REPORT_END); + + return 1; +} + +/* ================================================== */ + static int process_cmd_serverstats(char *line) { @@ -2809,6 +2887,9 @@ process_line(char *line) do_normal_submit = process_cmd_minpoll(&tx_message, line); } else if (!strcmp(command, "minstratum")) { do_normal_submit = process_cmd_minstratum(&tx_message, line); + } else if (!strcmp(command, "ntpdata")) { + do_normal_submit = 0; + ret = process_cmd_ntpdata(line); } else if (!strcmp(command, "offline")) { do_normal_submit = process_cmd_offline(&tx_message, line); } else if (!strcmp(command, "online")) { diff --git a/doc/chronyc.adoc b/doc/chronyc.adoc index a3807b3..a49e156 100644 --- a/doc/chronyc.adoc +++ b/doc/chronyc.adoc @@ -441,6 +441,91 @@ the offline state. the name of the server or peer was not resolved to an address yet; this source is not visible in the *sources* and *sourcestats* reports. +[[ntpdata]]*ntpdata* _address_:: +The *ntpdata* command displays the last valid measurement and other +NTP-specific information about the NTP source. An example of the output is +shown below. ++ +---- +Remote address : 203.0.113.15 +Remote port : 123 +Local address : 203.0.113.74 +Leap status : Normal +Version : 4 +Mode : Server +Stratum : 1 +Poll : 10 +Precision : 0.000000060 seconds +Root delay : 0.000015 seconds +Root dispersion : 0.000015 seconds +Reference ID : 50505331 +Reference time : Fri Nov 25 15:22:12 2016 +Offset : -0.000060878 seconds +Peer delay : 0.000175634 seconds +Peer dispersion : 0.000000681 seconds +Response time : 0.000053050 seconds +Jitter asymmetry: +0.00 +NTP tests : 111 111 1111 +Interleaved : No +Authenticated : No +TX timestamping : Kernel +RX timestamping : Kernel +Total TX : 24 +Total RX : 24 +Total valid RX : 24 +---- ++ +The fields are explained as follows: ++ +*Remote address*::: +The IP address of the NTP server or peer. +*Remote port*::: +The UDP port number to which the request was sent. The standard NTP port is +123. +*Local address*::: +The local IP address which received the response. +*Leap status*::: +*Version*::: +*Mode*::: +*Stratum*::: +*Poll*::: +*Precision*::: +*Root delay*::: +*Root dispersion*::: +*Reference ID*::: +*Reference time*::: +The NTP values from the last valid response. +*Offset*::: +*Peer delay*::: +*Peer dispersion*::: +The measured values. +*Response time*::: +The time the server or peer spent in processing of the request and waiting +before sending the response. +*Jitter asymmetry*::: +The estimated asymmetry of network jitter on the path to the source. The +asymmetry can be between -0.5 and 0.5. A negative value means the delay of +packets sent to the source is more variable than the delay of packets sent +from the source back. +*NTP tests*::: +Results of RFC 5905 tests 1 through 3, 5 through 7, and tests for maximum +delay, delay ratio, delay dev ratio, and synchronisation loop. +*Interleaved*::: +This shows if the response was in the interleaved mode. +*Authenticated*::: +This shows if the response was authenticated. +*TX timestamping*::: +The source of the local transmit timestamp. Valid values are _Daemon_, +_Kernel_, and _Hardware_. +*RX timestamping*::: +The source of the local receive timestamp. +*Total TX*::: +The number of packets sent to the source. +*Total RX*::: +The number of all packets received from the source. +*Total valid RX*::: +The number of valid packets received from the source. + [[add_peer]]*add peer* _address_ [_option_]...:: The *add peer* command allows a new NTP peer to be added whilst *chronyd* is running.