diff --git a/candm.h b/candm.h index 5fe1222..65daedf 100644 --- a/candm.h +++ b/candm.h @@ -540,7 +540,8 @@ typedef struct { #define RPY_SELECT_DATA 23 #define RPY_SERVER_STATS3 24 #define RPY_SERVER_STATS4 25 -#define N_REPLY_TYPES 26 +#define RPY_NTP_DATA2 26 +#define N_REPLY_TYPES 27 /* Status codes */ #define STT_SUCCESS 0 @@ -763,7 +764,11 @@ typedef struct { uint32_t total_rx_count; uint32_t total_valid_count; uint32_t total_good_count; - uint32_t reserved[3]; + uint32_t total_kernel_tx_ts; + uint32_t total_kernel_rx_ts; + uint32_t total_hw_tx_ts; + uint32_t total_hw_rx_ts; + uint32_t reserved[4]; int32_t EOR; } RPY_NTPData; diff --git a/client.c b/client.c index d5e3be7..5ead2b0 100644 --- a/client.c +++ b/client.c @@ -2331,7 +2331,7 @@ process_cmd_ntpdata(char *line) 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)) + if (!request_reply(&request, &reply, RPY_NTP_DATA2, 0)) return 0; UTI_IPNetworkToHost(&reply.data.ntp_data.remote_addr, &remote_addr); @@ -2367,7 +2367,11 @@ process_cmd_ntpdata(char *line) "Total TX : %U\n" "Total RX : %U\n" "Total valid RX : %U\n" - "Total good RX : %U\n", + "Total good RX : %U\n" + "Total kernel TX : %U\n" + "Total kernel RX : %U\n" + "Total HW TX : %U\n" + "Total HW RX : %U\n", UTI_IPToString(&remote_addr), UTI_IPToRefid(&remote_addr), ntohs(reply.data.ntp_data.remote_port), UTI_IPToString(&local_addr), UTI_IPToRefid(&local_addr), @@ -2395,6 +2399,10 @@ process_cmd_ntpdata(char *line) ntohl(reply.data.ntp_data.total_rx_count), ntohl(reply.data.ntp_data.total_valid_count), ntohl(reply.data.ntp_data.total_good_count), + ntohl(reply.data.ntp_data.total_kernel_tx_ts), + ntohl(reply.data.ntp_data.total_kernel_rx_ts), + ntohl(reply.data.ntp_data.total_hw_tx_ts), + ntohl(reply.data.ntp_data.total_hw_rx_ts), REPORT_END); } diff --git a/cmdmon.c b/cmdmon.c index c5b00a4..0a0193b 100644 --- a/cmdmon.c +++ b/cmdmon.c @@ -1230,7 +1230,7 @@ handle_ntp_data(CMD_Request *rx_message, CMD_Reply *tx_message) return; } - tx_message->reply = htons(RPY_NTP_DATA); + tx_message->reply = htons(RPY_NTP_DATA2); UTI_IPHostToNetwork(&report.remote_addr, &tx_message->data.ntp_data.remote_addr); UTI_IPHostToNetwork(&report.local_addr, &tx_message->data.ntp_data.local_addr); tx_message->data.ntp_data.remote_port = htons(report.remote_port); @@ -1258,6 +1258,10 @@ handle_ntp_data(CMD_Request *rx_message, CMD_Reply *tx_message) tx_message->data.ntp_data.total_rx_count = htonl(report.total_rx_count); tx_message->data.ntp_data.total_valid_count = htonl(report.total_valid_count); tx_message->data.ntp_data.total_good_count = htonl(report.total_good_count); + tx_message->data.ntp_data.total_kernel_tx_ts = htonl(report.total_kernel_tx_ts); + tx_message->data.ntp_data.total_kernel_rx_ts = htonl(report.total_kernel_rx_ts); + tx_message->data.ntp_data.total_hw_tx_ts = htonl(report.total_hw_tx_ts); + tx_message->data.ntp_data.total_hw_rx_ts = htonl(report.total_hw_rx_ts); memset(tx_message->data.ntp_data.reserved, 0xff, sizeof (tx_message->data.ntp_data.reserved)); } diff --git a/doc/chronyc.adoc b/doc/chronyc.adoc index 96a0551..8e0d426 100644 --- a/doc/chronyc.adoc +++ b/doc/chronyc.adoc @@ -689,6 +689,10 @@ Total TX : 24 Total RX : 24 Total valid RX : 24 Total good RX : 22 +Total kernel TX : 24 +Total kernel RX : 24 +Total HW TX : 0 +Total HW RX : 0 ---- + The fields are explained as follows: @@ -746,6 +750,18 @@ The number of packets which passed the first two groups of NTP tests. *Total good RX*::: The number of packets which passed all three groups of NTP tests, i.e. the NTP measurement was accepted. +*Total kernel TX*::: +The number of packets sent to the source for which a timestamp was captured by +the kernel. +*Total kernel RX*::: +The number of packets received from the source for which a timestamp was +captured by the kernel. +*Total HW TX*::: +The number of packets sent to the source for which a timestamp was captured by +the NIC. +*Total HW RX*::: +The number of packets received from the source for which a timestamp was +captured by the NIC. [[add_peer]]*add peer* _name_ [_option_]...:: The *add peer* command allows a new NTP peer to be added whilst diff --git a/pktlength.c b/pktlength.c index d7ed272..3e0b319 100644 --- a/pktlength.c +++ b/pktlength.c @@ -149,7 +149,7 @@ static const uint16_t reply_lengths[] = { RPY_LENGTH_ENTRY(smoothing), /* SMOOTHING */ 0, /* SERVER_STATS - not supported */ 0, /* CLIENT_ACCESSES_BY_INDEX2 - not supported */ - RPY_LENGTH_ENTRY(ntp_data), /* NTP_DATA */ + 0, /* NTP_DATA - not supported */ RPY_LENGTH_ENTRY(manual_timestamp), /* MANUAL_TIMESTAMP2 */ RPY_LENGTH_ENTRY(manual_list), /* MANUAL_LIST2 */ RPY_LENGTH_ENTRY(ntp_source_name), /* NTP_SOURCE_NAME */ @@ -159,6 +159,7 @@ static const uint16_t reply_lengths[] = { RPY_LENGTH_ENTRY(select_data), /* SELECT_DATA */ 0, /* SERVER_STATS3 - not supported */ RPY_LENGTH_ENTRY(server_stats), /* SERVER_STATS4 */ + RPY_LENGTH_ENTRY(ntp_data), /* NTP_DATA2 */ }; /* ================================================== */ diff --git a/test/simulation/110-chronyc b/test/simulation/110-chronyc index 3cd1788..a261e7a 100755 --- a/test/simulation/110-chronyc +++ b/test/simulation/110-chronyc @@ -247,6 +247,10 @@ Total TX : 1 Total RX : 1 Total valid RX : 1 Total good RX : 0 +Total kernel TX : [01] +Total kernel RX : 1 +Total HW TX : 0 +Total HW RX : 0 S Name/IP Address Auth COpts EOpts Last Score Interval Leap ======================================================================= M node1\.net1\.clk N ----- ----- 0 1\.0 \+0ns \+0ns N diff --git a/test/system/007-cmdmon b/test/system/007-cmdmon index f9541d3..8599503 100755 --- a/test/system/007-cmdmon +++ b/test/system/007-cmdmon @@ -97,7 +97,11 @@ RX timestamping : (Daemon|Kernel) Total TX : [0-9]+ Total RX : [0-9]+ Total valid RX : [0-9]+ -Total good RX : [0-9]+$" || test_fail +Total good RX : [0-9]+ +Total kernel TX : [0-9]+ +Total kernel RX : [0-9]+ +Total HW TX : 0 +Total HW RX : 0$" || test_fail run_chronyc "selectdata" || test_fail check_chronyc_output "^S Name/IP Address Auth COpts EOpts Last Score Interval Leap