mirror of
https://gitlab.com/chrony/chrony.git
synced 2026-01-20 21:00:20 -05:00
cmdmon: refactor handling of sources report
The NSR_ReportSource() and RCL_ReportSource() functions assume that the provided report already has some data prefilled by SRC_ReportSource() and it's assumed these functions cannot fail. Change them to accept the required data (refid and IP address) as a parameter, remove unneeded parameters, and return an error status (if the refid/address doesn't exist) to be handled in cmdmon handle_source_data(). Also, catch unexpected values of the source state and mode to make chronyc report an error instead of incorrect data.
This commit is contained in:
17
cmdmon.c
17
cmdmon.c
@@ -504,15 +504,18 @@ handle_source_data(CMD_Request *rx_message, CMD_Reply *tx_message)
|
|||||||
if (SRC_ReportSource(ntohl(rx_message->data.source_data.index), &report, &now_corr)) {
|
if (SRC_ReportSource(ntohl(rx_message->data.source_data.index), &report, &now_corr)) {
|
||||||
switch (SRC_GetType(ntohl(rx_message->data.source_data.index))) {
|
switch (SRC_GetType(ntohl(rx_message->data.source_data.index))) {
|
||||||
case SRC_NTP:
|
case SRC_NTP:
|
||||||
NSR_ReportSource(&report, &now_corr);
|
if (!NSR_ReportSource(&report.ip_addr, &report))
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
case SRC_REFCLOCK:
|
case SRC_REFCLOCK:
|
||||||
RCL_ReportSource(&report, &now_corr);
|
if (report.ip_addr.family != IPADDR_INET4 ||
|
||||||
|
!RCL_ReportSource(report.ip_addr.addr.in4, &report))
|
||||||
|
return;
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
tx_message->reply = htons(RPY_SOURCE_DATA);
|
|
||||||
|
|
||||||
UTI_IPHostToNetwork(&report.ip_addr, &tx_message->data.source_data.ip_addr);
|
UTI_IPHostToNetwork(&report.ip_addr, &tx_message->data.source_data.ip_addr);
|
||||||
tx_message->data.source_data.stratum = htons(report.stratum);
|
tx_message->data.source_data.stratum = htons(report.stratum);
|
||||||
tx_message->data.source_data.poll = htons(report.poll);
|
tx_message->data.source_data.poll = htons(report.poll);
|
||||||
@@ -535,6 +538,8 @@ handle_source_data(CMD_Request *rx_message, CMD_Reply *tx_message)
|
|||||||
case RPT_SELECTED:
|
case RPT_SELECTED:
|
||||||
tx_message->data.source_data.state = htons(RPY_SD_ST_SELECTED);
|
tx_message->data.source_data.state = htons(RPY_SD_ST_SELECTED);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
switch (report.mode) {
|
switch (report.mode) {
|
||||||
case RPT_NTP_CLIENT:
|
case RPT_NTP_CLIENT:
|
||||||
@@ -546,6 +551,8 @@ handle_source_data(CMD_Request *rx_message, CMD_Reply *tx_message)
|
|||||||
case RPT_LOCAL_REFERENCE:
|
case RPT_LOCAL_REFERENCE:
|
||||||
tx_message->data.source_data.mode = htons(RPY_SD_MD_REF);
|
tx_message->data.source_data.mode = htons(RPY_SD_MD_REF);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
tx_message->data.source_data.flags = htons(0);
|
tx_message->data.source_data.flags = htons(0);
|
||||||
tx_message->data.source_data.reachability = htons(report.reachability);
|
tx_message->data.source_data.reachability = htons(report.reachability);
|
||||||
@@ -553,6 +560,8 @@ handle_source_data(CMD_Request *rx_message, CMD_Reply *tx_message)
|
|||||||
tx_message->data.source_data.orig_latest_meas = UTI_FloatHostToNetwork(report.orig_latest_meas);
|
tx_message->data.source_data.orig_latest_meas = UTI_FloatHostToNetwork(report.orig_latest_meas);
|
||||||
tx_message->data.source_data.latest_meas = UTI_FloatHostToNetwork(report.latest_meas);
|
tx_message->data.source_data.latest_meas = UTI_FloatHostToNetwork(report.latest_meas);
|
||||||
tx_message->data.source_data.latest_meas_err = UTI_FloatHostToNetwork(report.latest_meas_err);
|
tx_message->data.source_data.latest_meas_err = UTI_FloatHostToNetwork(report.latest_meas_err);
|
||||||
|
|
||||||
|
tx_message->reply = htons(RPY_SOURCE_DATA);
|
||||||
} else {
|
} else {
|
||||||
tx_message->status = htons(STT_NOSUCHSOURCE);
|
tx_message->status = htons(STT_NOSUCHSOURCE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3098,7 +3098,7 @@ NCR_InitiateSampleBurst(NCR_Instance inst, int n_good_samples, int n_total_sampl
|
|||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
void
|
void
|
||||||
NCR_ReportSource(NCR_Instance inst, RPT_SourceReport *report, struct timespec *now)
|
NCR_ReportSource(NCR_Instance inst, RPT_SourceReport *report)
|
||||||
{
|
{
|
||||||
report->poll = get_transmit_poll(inst);
|
report->poll = get_transmit_poll(inst);
|
||||||
|
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ extern void NCR_ModifyPolltarget(NCR_Instance inst, int new_poll_target);
|
|||||||
|
|
||||||
extern void NCR_InitiateSampleBurst(NCR_Instance inst, int n_good_samples, int n_total_samples);
|
extern void NCR_InitiateSampleBurst(NCR_Instance inst, int n_good_samples, int n_total_samples);
|
||||||
|
|
||||||
extern void NCR_ReportSource(NCR_Instance inst, RPT_SourceReport *report, struct timespec *now);
|
extern void NCR_ReportSource(NCR_Instance inst, RPT_SourceReport *report);
|
||||||
extern void NCR_GetAuthReport(NCR_Instance inst, RPT_AuthReport *report);
|
extern void NCR_GetAuthReport(NCR_Instance inst, RPT_AuthReport *report);
|
||||||
extern void NCR_GetNTPReport(NCR_Instance inst, RPT_NTPReport *report);
|
extern void NCR_GetNTPReport(NCR_Instance inst, RPT_NTPReport *report);
|
||||||
|
|
||||||
|
|||||||
@@ -1523,20 +1523,17 @@ NSR_InitiateSampleBurst(int n_good_samples, int n_total_samples,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
/* The ip address is assumed to be completed on input, that is how we
|
|
||||||
identify the source record. */
|
|
||||||
|
|
||||||
void
|
int
|
||||||
NSR_ReportSource(RPT_SourceReport *report, struct timespec *now)
|
NSR_ReportSource(IPAddr *ip_addr, RPT_SourceReport *report)
|
||||||
{
|
{
|
||||||
int slot;
|
int slot;
|
||||||
|
|
||||||
if (find_slot(&report->ip_addr, &slot)) {
|
if (!find_slot(ip_addr, &slot))
|
||||||
NCR_ReportSource(get_record(slot)->data, report, now);
|
return 0;
|
||||||
} else {
|
|
||||||
report->poll = 0;
|
NCR_ReportSource(get_record(slot)->data, report);
|
||||||
report->latest_meas_ago = 0;
|
return 1;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|||||||
@@ -146,7 +146,7 @@ extern int NSR_ModifyPolltarget(IPAddr *address, int new_poll_target);
|
|||||||
|
|
||||||
extern int NSR_InitiateSampleBurst(int n_good_samples, int n_total_samples, IPAddr *mask, IPAddr *address);
|
extern int NSR_InitiateSampleBurst(int n_good_samples, int n_total_samples, IPAddr *mask, IPAddr *address);
|
||||||
|
|
||||||
extern void NSR_ReportSource(RPT_SourceReport *report, struct timespec *now);
|
extern int NSR_ReportSource(IPAddr *ip_addr, RPT_SourceReport *report);
|
||||||
|
|
||||||
extern int NSR_GetAuthReport(IPAddr *address, RPT_AuthReport *report);
|
extern int NSR_GetAuthReport(IPAddr *address, RPT_AuthReport *report);
|
||||||
|
|
||||||
|
|||||||
12
refclock.c
12
refclock.c
@@ -294,23 +294,21 @@ RCL_StartRefclocks(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
int
|
||||||
RCL_ReportSource(RPT_SourceReport *report, struct timespec *now)
|
RCL_ReportSource(uint32_t ref_id, RPT_SourceReport *report)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
uint32_t ref_id;
|
|
||||||
|
|
||||||
assert(report->ip_addr.family == IPADDR_INET4);
|
|
||||||
ref_id = report->ip_addr.addr.in4;
|
|
||||||
|
|
||||||
for (i = 0; i < ARR_GetSize(refclocks); i++) {
|
for (i = 0; i < ARR_GetSize(refclocks); i++) {
|
||||||
RCL_Instance inst = get_refclock(i);
|
RCL_Instance inst = get_refclock(i);
|
||||||
if (inst->ref_id == ref_id) {
|
if (inst->ref_id == ref_id) {
|
||||||
report->poll = inst->poll;
|
report->poll = inst->poll;
|
||||||
report->mode = RPT_LOCAL_REFERENCE;
|
report->mode = RPT_LOCAL_REFERENCE;
|
||||||
break;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ extern void RCL_Initialise(void);
|
|||||||
extern void RCL_Finalise(void);
|
extern void RCL_Finalise(void);
|
||||||
extern int RCL_AddRefclock(RefclockParameters *params);
|
extern int RCL_AddRefclock(RefclockParameters *params);
|
||||||
extern void RCL_StartRefclocks(void);
|
extern void RCL_StartRefclocks(void);
|
||||||
extern void RCL_ReportSource(RPT_SourceReport *report, struct timespec *now);
|
extern int RCL_ReportSource(uint32_t ref_id, RPT_SourceReport *report);
|
||||||
extern int RCL_ModifyOffset(uint32_t ref_id, double offset);
|
extern int RCL_ModifyOffset(uint32_t ref_id, double offset);
|
||||||
|
|
||||||
/* functions used by drivers */
|
/* functions used by drivers */
|
||||||
|
|||||||
Reference in New Issue
Block a user