manual: check offset sanity

This commit is contained in:
Miroslav Lichvar 2015-04-07 15:01:30 +02:00
parent aec97397e8
commit 4e26f48781
3 changed files with 28 additions and 5 deletions

View file

@ -926,14 +926,16 @@ handle_settime(CMD_Request *rx_message, CMD_Reply *tx_message)
long offset_cs; long offset_cs;
double dfreq_ppm, new_afreq_ppm; double dfreq_ppm, new_afreq_ppm;
UTI_TimevalNetworkToHost(&rx_message->data.settime.ts, &ts); UTI_TimevalNetworkToHost(&rx_message->data.settime.ts, &ts);
if (MNL_AcceptTimestamp(&ts, &offset_cs, &dfreq_ppm, &new_afreq_ppm)) { if (!MNL_IsEnabled()) {
tx_message->status = htons(STT_NOTENABLED);
} else if (MNL_AcceptTimestamp(&ts, &offset_cs, &dfreq_ppm, &new_afreq_ppm)) {
tx_message->status = htons(STT_SUCCESS); tx_message->status = htons(STT_SUCCESS);
tx_message->reply = htons(RPY_MANUAL_TIMESTAMP); tx_message->reply = htons(RPY_MANUAL_TIMESTAMP);
tx_message->data.manual_timestamp.centiseconds = htonl((int32_t)offset_cs); tx_message->data.manual_timestamp.centiseconds = htonl((int32_t)offset_cs);
tx_message->data.manual_timestamp.dfreq_ppm = UTI_FloatHostToNetwork(dfreq_ppm); tx_message->data.manual_timestamp.dfreq_ppm = UTI_FloatHostToNetwork(dfreq_ppm);
tx_message->data.manual_timestamp.new_afreq_ppm = UTI_FloatHostToNetwork(new_afreq_ppm); tx_message->data.manual_timestamp.new_afreq_ppm = UTI_FloatHostToNetwork(new_afreq_ppm);
} else { } else {
tx_message->status = htons(STT_NOTENABLED); tx_message->status = htons(STT_FAILED);
} }
} }

View file

@ -54,6 +54,8 @@ typedef struct {
(measured-predicted)) */ (measured-predicted)) */
} Sample; } Sample;
#define MIN_SAMPLE_SEPARATION 1.0
#define MAX_SAMPLES 16 #define MAX_SAMPLES 16
static Sample samples[16]; static Sample samples[16];
@ -174,14 +176,24 @@ int
MNL_AcceptTimestamp(struct timeval *ts, long *offset_cs, double *dfreq_ppm, double *new_afreq_ppm) MNL_AcceptTimestamp(struct timeval *ts, long *offset_cs, double *dfreq_ppm, double *new_afreq_ppm)
{ {
struct timeval now; struct timeval now;
double offset; double offset, diff;
int i; int i;
if (enabled) { if (enabled) {
/* Check whether timestamp is within margin of old one */
LCL_ReadCookedTime(&now, NULL); LCL_ReadCookedTime(&now, NULL);
/* Make sure the provided timestamp is sane and the sample
is not too close to the last one */
if (!UTI_IsTimeOffsetSane(ts, 0.0))
return 0;
if (n_samples) {
UTI_DiffTimevalsToDouble(&diff, &now, &samples[n_samples - 1].when);
if (diff < MIN_SAMPLE_SEPARATION)
return 0;
}
UTI_DiffTimevalsToDouble(&offset, &now, ts); UTI_DiffTimevalsToDouble(&offset, &now, ts);
/* Check if buffer full up */ /* Check if buffer full up */
@ -258,6 +270,14 @@ MNL_Reset(void)
n_samples = 0; n_samples = 0;
} }
/* ================================================== */
int
MNL_IsEnabled(void)
{
return enabled;
}
/* ================================================== */ /* ================================================== */
/* Generate report data for the REQ_MANUAL_LIST command/monitoring /* Generate report data for the REQ_MANUAL_LIST command/monitoring
protocol */ protocol */

View file

@ -38,6 +38,7 @@ extern int MNL_AcceptTimestamp(struct timeval *ts, long *offset_cs, double *dfre
extern void MNL_Enable(void); extern void MNL_Enable(void);
extern void MNL_Disable(void); extern void MNL_Disable(void);
extern void MNL_Reset(void); extern void MNL_Reset(void);
extern int MNL_IsEnabled(void);
extern void MNL_ReportSamples(RPT_ManualSamplesReport *report, int max, int *n); extern void MNL_ReportSamples(RPT_ManualSamplesReport *report, int max, int *n);
extern int MNL_DeleteSample(int index); extern int MNL_DeleteSample(int index);