diff --git a/candm.h b/candm.h
index 0a0ea98..92df80c 100644
--- a/candm.h
+++ b/candm.h
@@ -105,7 +105,8 @@
#define REQ_NTP_SOURCE_NAME 65
#define REQ_RESET_SOURCES 66
#define REQ_AUTH_DATA 67
-#define N_REQUEST_TYPES 68
+#define REQ_CLIENT_ACCESSES_BY_INDEX3 68
+#define N_REQUEST_TYPES 69
/* Structure used to exchange timespecs independent of time_t size */
typedef struct {
@@ -321,6 +322,7 @@ typedef struct {
typedef struct {
uint32_t first_index;
uint32_t n_clients;
+ uint32_t reset;
int32_t EOR;
} REQ_ClientAccessesByIndex;
diff --git a/client.c b/client.c
index 77c9184..34cb679 100644
--- a/client.c
+++ b/client.c
@@ -1243,7 +1243,7 @@ give_help(void)
"\0(e.g. Sep 25, 2015 16:30:05 or 16:30:05)\0"
"\0\0NTP access:\0\0"
"accheck
\0Check whether address is allowed\0"
- "clients\0Report on clients that have accessed the server\0"
+ "clients [-r]\0Report on clients that have accessed the server\0"
"serverstats\0Display statistics of the server\0"
"allow []\0Allow access to subnet as a default\0"
"allow all []\0Allow access to subnet and all children\0"
@@ -2673,18 +2673,27 @@ process_cmd_clients(char *line)
CMD_Request request;
CMD_Reply reply;
IPAddr ip;
- uint32_t i, n_clients, next_index, n_indices;
+ uint32_t i, n_clients, next_index, n_indices, reset;
RPY_ClientAccesses_Client *client;
- char name[50];
+ char name[50], *opt;
next_index = 0;
+ reset = 0;
+
+ while (*line) {
+ opt = line;
+ line = CPS_SplitWord(line);
+ if (strcmp(opt, "-r") == 0)
+ reset = 1;
+ }
print_header("Hostname NTP Drop Int IntL Last Cmd Drop Int Last");
while (1) {
- request.command = htons(REQ_CLIENT_ACCESSES_BY_INDEX2);
+ request.command = htons(REQ_CLIENT_ACCESSES_BY_INDEX3);
request.data.client_accesses_by_index.first_index = htonl(next_index);
request.data.client_accesses_by_index.n_clients = htonl(MAX_CLIENT_ACCESSES);
+ request.data.client_accesses_by_index.reset = htonl(reset);
if (!request_reply(&request, &reply, RPY_CLIENT_ACCESSES_BY_INDEX2, 0))
return 0;
diff --git a/clientlog.c b/clientlog.c
index 86962a7..99a1074 100644
--- a/clientlog.c
+++ b/clientlog.c
@@ -653,7 +653,8 @@ static uint32_t get_last_ago(uint32_t x, uint32_t y)
/* ================================================== */
int
-CLG_GetClientAccessReportByIndex(int index, RPT_ClientAccessByIndex_Report *report, struct timespec *now)
+CLG_GetClientAccessReportByIndex(int index, int reset,
+ RPT_ClientAccessByIndex_Report *report, struct timespec *now)
{
Record *record;
uint32_t now_ts;
@@ -679,6 +680,11 @@ CLG_GetClientAccessReportByIndex(int index, RPT_ClientAccessByIndex_Report *repo
report->last_ntp_hit_ago = get_last_ago(now_ts, record->last_ntp_hit);
report->last_cmd_hit_ago = get_last_ago(now_ts, record->last_cmd_hit);
+ if (reset) {
+ record->ntp_hits = record->cmd_hits = 0;
+ record->ntp_drops = record->cmd_drops = 0;
+ }
+
return 1;
}
diff --git a/clientlog.h b/clientlog.h
index 552c767..1d0fc6a 100644
--- a/clientlog.h
+++ b/clientlog.h
@@ -44,7 +44,9 @@ extern int CLG_GetNtpMinPoll(void);
/* And some reporting functions, for use by chronyc. */
extern int CLG_GetNumberOfIndices(void);
-extern int CLG_GetClientAccessReportByIndex(int index, RPT_ClientAccessByIndex_Report *report, struct timespec *now);
+extern int CLG_GetClientAccessReportByIndex(int index, int reset,
+ RPT_ClientAccessByIndex_Report *report,
+ struct timespec *now);
extern void CLG_GetServerStatsReport(RPT_ServerStatsReport *report);
#endif /* GOT_CLIENTLOG_H */
diff --git a/cmdmon.c b/cmdmon.c
index 9a7927f..341cc1d 100644
--- a/cmdmon.c
+++ b/cmdmon.c
@@ -137,6 +137,7 @@ static const char permissions[] = {
PERMIT_OPEN, /* NTP_SOURCE_NAME */
PERMIT_AUTH, /* RESET_SOURCES */
PERMIT_AUTH, /* AUTH_DATA */
+ PERMIT_AUTH, /* CLIENT_ACCESSES_BY_INDEX3 */
};
/* ================================================== */
@@ -1001,7 +1002,7 @@ handle_client_accesses_by_index(CMD_Request *rx_message, CMD_Reply *tx_message)
RPT_ClientAccessByIndex_Report report;
RPY_ClientAccesses_Client *client;
int n_indices;
- uint32_t i, j, req_first_index, req_n_clients;
+ uint32_t i, j, req_first_index, req_n_clients, req_reset;
struct timespec now;
SCH_GetLastEventTime(&now, NULL, NULL);
@@ -1010,6 +1011,7 @@ handle_client_accesses_by_index(CMD_Request *rx_message, CMD_Reply *tx_message)
req_n_clients = ntohl(rx_message->data.client_accesses_by_index.n_clients);
if (req_n_clients > MAX_CLIENT_ACCESSES)
req_n_clients = MAX_CLIENT_ACCESSES;
+ req_reset = ntohl(rx_message->data.client_accesses_by_index.reset);
n_indices = CLG_GetNumberOfIndices();
if (n_indices < 0) {
@@ -1021,7 +1023,7 @@ handle_client_accesses_by_index(CMD_Request *rx_message, CMD_Reply *tx_message)
tx_message->data.client_accesses_by_index.n_indices = htonl(n_indices);
for (i = req_first_index, j = 0; i < (uint32_t)n_indices && j < req_n_clients; i++) {
- if (!CLG_GetClientAccessReportByIndex(i, &report, &now))
+ if (!CLG_GetClientAccessReportByIndex(i, req_reset, &report, &now))
continue;
client = &tx_message->data.client_accesses_by_index.clients[j++];
@@ -1594,7 +1596,7 @@ read_from_cmd_socket(int sock_fd, int event, void *anything)
handle_cyclelogs(&rx_message, &tx_message);
break;
- case REQ_CLIENT_ACCESSES_BY_INDEX2:
+ case REQ_CLIENT_ACCESSES_BY_INDEX3:
handle_client_accesses_by_index(&rx_message, &tx_message);
break;
diff --git a/doc/chronyc.adoc b/doc/chronyc.adoc
index 514a95f..3e5d3d3 100644
--- a/doc/chronyc.adoc
+++ b/doc/chronyc.adoc
@@ -954,10 +954,13 @@ This command can be used to examine the effect of a series of *allow*, *allow
all*, *deny*, and *deny all* commands specified either via *chronyc*, or in
*chronyd*'s configuration file.
-[[clients]]*clients*::
+[[clients]]*clients* [*-r*]::
This command shows a list of clients that have accessed the server, through
either the NTP or command ports. It does not include accesses over
-the Unix domain command socket. There are no arguments.
+the Unix domain command socket.
++
+If the *-r* option is specified, *chronyd* will reset the counters of received
+and dropped packets after reporting the current values.
+
An example of the output is:
+
diff --git a/pktlength.c b/pktlength.c
index 69032db..3a7b2ea 100644
--- a/pktlength.c
+++ b/pktlength.c
@@ -110,8 +110,7 @@ static const struct request_length request_lengths[] = {
REQ_LENGTH_ENTRY(smoothtime, null), /* SMOOTHTIME */
REQ_LENGTH_ENTRY(null, null), /* REFRESH */
REQ_LENGTH_ENTRY(null, server_stats), /* SERVER_STATS */
- REQ_LENGTH_ENTRY(client_accesses_by_index,
- client_accesses_by_index), /* CLIENT_ACCESSES_BY_INDEX2 */
+ { 0, 0 }, /* CLIENT_ACCESSES_BY_INDEX2 - not supported */
REQ_LENGTH_ENTRY(local, null), /* LOCAL2 */
REQ_LENGTH_ENTRY(ntp_data, ntp_data), /* NTP_DATA */
{ 0, 0 }, /* ADD_SERVER2 */
@@ -125,6 +124,8 @@ static const struct request_length request_lengths[] = {
ntp_source_name), /* NTP_SOURCE_NAME */
REQ_LENGTH_ENTRY(null, null), /* RESET_SOURCES */
REQ_LENGTH_ENTRY(auth_data, auth_data), /* AUTH_DATA */
+ REQ_LENGTH_ENTRY(client_accesses_by_index,
+ client_accesses_by_index), /* CLIENT_ACCESSES_BY_INDEX3 */
};
static const uint16_t reply_lengths[] = {