sources: turn select options into flags

This will allow adding new options for source selection which can be
combined with others.
This commit is contained in:
Miroslav Lichvar 2015-12-18 16:18:53 +01:00
parent 62d61de93d
commit fa15fb3d53
11 changed files with 34 additions and 58 deletions

View file

@ -1117,8 +1117,8 @@ process_cmd_add_server_or_peer(CMD_Request *msg, char *line)
(data.params.online ? REQ_ADDSRC_ONLINE : 0) | (data.params.online ? REQ_ADDSRC_ONLINE : 0) |
(data.params.auto_offline ? REQ_ADDSRC_AUTOOFFLINE : 0) | (data.params.auto_offline ? REQ_ADDSRC_AUTOOFFLINE : 0) |
(data.params.iburst ? REQ_ADDSRC_IBURST : 0) | (data.params.iburst ? REQ_ADDSRC_IBURST : 0) |
(data.params.sel_option == SRC_SelectPrefer ? REQ_ADDSRC_PREFER : 0) | (data.params.sel_options & SRC_SELECT_PREFER ? REQ_ADDSRC_PREFER : 0) |
(data.params.sel_option == SRC_SelectNoselect ? REQ_ADDSRC_NOSELECT : 0)); (data.params.sel_options & SRC_SELECT_NOSELECT ? REQ_ADDSRC_NOSELECT : 0));
result = 1; result = 1;
break; break;

View file

@ -661,17 +661,9 @@ handle_source_data(CMD_Request *rx_message, CMD_Reply *tx_message)
tx_message->data.source_data.mode = htons(RPY_SD_MD_REF); tx_message->data.source_data.mode = htons(RPY_SD_MD_REF);
break; break;
} }
switch (report.sel_option) { tx_message->data.source_data.flags =
case RPT_NORMAL: htons((report.sel_options & SRC_SELECT_PREFER ? RPY_SD_FLAG_PREFER : 0) |
tx_message->data.source_data.flags = htons(0); (report.sel_options & SRC_SELECT_NOSELECT ? RPY_SD_FLAG_NOSELECT : 0));
break;
case RPT_PREFER:
tx_message->data.source_data.flags = htons(RPY_SD_FLAG_PREFER);
break;
case RPT_NOSELECT:
tx_message->data.source_data.flags = htons(RPY_SD_FLAG_NOSELECT);
break;
}
tx_message->data.source_data.reachability = htons(report.reachability); tx_message->data.source_data.reachability = htons(report.reachability);
tx_message->data.source_data.since_sample = htonl(report.latest_meas_ago); tx_message->data.source_data.since_sample = htonl(report.latest_meas_ago);
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);
@ -764,8 +756,9 @@ handle_add_source(NTP_Source_Type type, CMD_Request *rx_message, CMD_Reply *tx_m
params.online = ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_ONLINE ? 1 : 0; params.online = ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_ONLINE ? 1 : 0;
params.auto_offline = ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_AUTOOFFLINE ? 1 : 0; params.auto_offline = ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_AUTOOFFLINE ? 1 : 0;
params.iburst = ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_IBURST ? 1 : 0; params.iburst = ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_IBURST ? 1 : 0;
params.sel_option = ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_PREFER ? SRC_SelectPrefer : params.sel_options =
ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_NOSELECT ? SRC_SelectNoselect : SRC_SelectNormal; (ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_PREFER ? SRC_SELECT_PREFER : 0) |
(ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_NOSELECT ? SRC_SELECT_NOSELECT : 0);
params.max_delay = UTI_FloatNetworkToHost(rx_message->data.ntp_source.max_delay); params.max_delay = UTI_FloatNetworkToHost(rx_message->data.ntp_source.max_delay);
params.max_delay_ratio = UTI_FloatNetworkToHost(rx_message->data.ntp_source.max_delay_ratio); params.max_delay_ratio = UTI_FloatNetworkToHost(rx_message->data.ntp_source.max_delay_ratio);

View file

@ -63,7 +63,7 @@ CPS_ParseNTPSourceAdd(char *line, CPS_NTP_Source *src)
src->params.max_sources = SRC_DEFAULT_MAXSOURCES; src->params.max_sources = SRC_DEFAULT_MAXSOURCES;
src->params.min_samples = SRC_DEFAULT_MINSAMPLES; src->params.min_samples = SRC_DEFAULT_MINSAMPLES;
src->params.max_samples = SRC_DEFAULT_MAXSAMPLES; src->params.max_samples = SRC_DEFAULT_MAXSAMPLES;
src->params.sel_option = SRC_SelectNormal; src->params.sel_options = 0;
result = CPS_Success; result = CPS_Success;
@ -165,10 +165,10 @@ CPS_ParseNTPSourceAdd(char *line, CPS_NTP_Source *src)
} }
} else if (!strcasecmp(cmd, "noselect")) { } else if (!strcasecmp(cmd, "noselect")) {
src->params.sel_option = SRC_SelectNoselect; src->params.sel_options |= SRC_SELECT_NOSELECT;
} else if (!strcasecmp(cmd, "prefer")) { } else if (!strcasecmp(cmd, "prefer")) {
src->params.sel_option = SRC_SelectPrefer; src->params.sel_options |= SRC_SELECT_PREFER;
} else if (!strcasecmp(cmd, "version")) { } else if (!strcasecmp(cmd, "version")) {
if (sscanf(line, "%d%n", &src->params.version, &n) != 1) { if (sscanf(line, "%d%n", &src->params.version, &n) != 1) {

11
conf.c
View file

@ -653,12 +653,11 @@ parse_ratelimit(char *line, int *enabled, int *interval, int *burst, int *leak)
static void static void
parse_refclock(char *line) parse_refclock(char *line)
{ {
int n, poll, dpoll, filter_length, pps_rate, min_samples, max_samples; int n, poll, dpoll, filter_length, pps_rate, min_samples, max_samples, sel_options;
uint32_t ref_id, lock_ref_id; uint32_t ref_id, lock_ref_id;
double offset, delay, precision, max_dispersion; double offset, delay, precision, max_dispersion;
char *p, *cmd, *name, *param; char *p, *cmd, *name, *param;
unsigned char ref[5]; unsigned char ref[5];
SRC_SelectOption sel_option;
RefclockParameters *refclock; RefclockParameters *refclock;
poll = 4; poll = 4;
@ -667,13 +666,13 @@ parse_refclock(char *line)
pps_rate = 0; pps_rate = 0;
min_samples = SRC_DEFAULT_MINSAMPLES; min_samples = SRC_DEFAULT_MINSAMPLES;
max_samples = SRC_DEFAULT_MAXSAMPLES; max_samples = SRC_DEFAULT_MAXSAMPLES;
sel_options = 0;
offset = 0.0; offset = 0.0;
delay = 1e-9; delay = 1e-9;
precision = 0.0; precision = 0.0;
max_dispersion = 0.0; max_dispersion = 0.0;
ref_id = 0; ref_id = 0;
lock_ref_id = 0; lock_ref_id = 0;
sel_option = SRC_SelectNormal;
if (!*line) { if (!*line) {
command_parse_error(); command_parse_error();
@ -740,10 +739,10 @@ parse_refclock(char *line)
break; break;
} else if (!strcasecmp(cmd, "noselect")) { } else if (!strcasecmp(cmd, "noselect")) {
n = 0; n = 0;
sel_option = SRC_SelectNoselect; sel_options |= SRC_SELECT_NOSELECT;
} else if (!strcasecmp(cmd, "prefer")) { } else if (!strcasecmp(cmd, "prefer")) {
n = 0; n = 0;
sel_option = SRC_SelectPrefer; sel_options |= SRC_SELECT_PREFER;
} else { } else {
other_parse_error("Invalid refclock option"); other_parse_error("Invalid refclock option");
return; return;
@ -765,11 +764,11 @@ parse_refclock(char *line)
refclock->pps_rate = pps_rate; refclock->pps_rate = pps_rate;
refclock->min_samples = min_samples; refclock->min_samples = min_samples;
refclock->max_samples = max_samples; refclock->max_samples = max_samples;
refclock->sel_options = sel_options;
refclock->offset = offset; refclock->offset = offset;
refclock->delay = delay; refclock->delay = delay;
refclock->precision = precision; refclock->precision = precision;
refclock->max_dispersion = max_dispersion; refclock->max_dispersion = max_dispersion;
refclock->sel_option = sel_option;
refclock->ref_id = ref_id; refclock->ref_id = ref_id;
refclock->lock_ref_id = lock_ref_id; refclock->lock_ref_id = lock_ref_id;
} }

View file

@ -504,7 +504,7 @@ NCR_GetInstance(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourcePar
/* Create a source instance for this NTP source */ /* Create a source instance for this NTP source */
result->source = SRC_CreateNewInstance(UTI_IPToRefid(&remote_addr->ip_addr), result->source = SRC_CreateNewInstance(UTI_IPToRefid(&remote_addr->ip_addr),
SRC_NTP, params->sel_option, SRC_NTP, params->sel_options,
&result->remote_addr.ip_addr, &result->remote_addr.ip_addr,
params->min_samples, params->max_samples); params->min_samples, params->max_samples);

View file

@ -260,7 +260,7 @@ RCL_AddRefclock(RefclockParameters *params)
filter_init(&inst->filter, params->filter_length, params->max_dispersion); filter_init(&inst->filter, params->filter_length, params->max_dispersion);
inst->source = SRC_CreateNewInstance(inst->ref_id, SRC_REFCLOCK, params->sel_option, NULL, inst->source = SRC_CreateNewInstance(inst->ref_id, SRC_REFCLOCK, params->sel_options, NULL,
params->min_samples, params->max_samples); params->min_samples, params->max_samples);
DEBUG_LOG(LOGF_Refclock, "refclock %s refid=%s poll=%d dpoll=%d filter=%d", DEBUG_LOG(LOGF_Refclock, "refclock %s refid=%s poll=%d dpoll=%d filter=%d",

View file

@ -40,13 +40,13 @@ typedef struct {
int pps_rate; int pps_rate;
int min_samples; int min_samples;
int max_samples; int max_samples;
int sel_options;
uint32_t ref_id; uint32_t ref_id;
uint32_t lock_ref_id; uint32_t lock_ref_id;
double offset; double offset;
double delay; double delay;
double precision; double precision;
double max_dispersion; double max_dispersion;
SRC_SelectOption sel_option;
} RefclockParameters; } RefclockParameters;
typedef struct RCL_Instance_Record *RCL_Instance; typedef struct RCL_Instance_Record *RCL_Instance;

View file

@ -38,7 +38,7 @@ typedef struct {
int poll; int poll;
enum {RPT_NTP_CLIENT, RPT_NTP_PEER, RPT_LOCAL_REFERENCE} mode; enum {RPT_NTP_CLIENT, RPT_NTP_PEER, RPT_LOCAL_REFERENCE} mode;
enum {RPT_SYNC, RPT_UNREACH, RPT_FALSETICKER, RPT_JITTERY, RPT_CANDIDATE, RPT_OUTLIER} state; enum {RPT_SYNC, RPT_UNREACH, RPT_FALSETICKER, RPT_JITTERY, RPT_CANDIDATE, RPT_OUTLIER} state;
enum {RPT_NORMAL, RPT_PREFER, RPT_NOSELECT} sel_option; int sel_options;
int reachability; int reachability;
unsigned long latest_meas_ago; /* seconds */ unsigned long latest_meas_ago; /* seconds */

View file

@ -118,7 +118,7 @@ struct SRC_Instance_Record {
SRC_Type type; SRC_Type type;
/* Options used when selecting sources */ /* Options used when selecting sources */
SRC_SelectOption sel_option; int sel_options;
/* Score against currently selected source */ /* Score against currently selected source */
double sel_score; double sel_score;
@ -209,7 +209,7 @@ void SRC_Finalise(void)
/* Function to create a new instance. This would be called by one of /* Function to create a new instance. This would be called by one of
the individual source-type instance creation routines. */ the individual source-type instance creation routines. */
SRC_Instance SRC_CreateNewInstance(uint32_t ref_id, SRC_Type type, SRC_SelectOption sel_option, IPAddr *addr, int min_samples, int max_samples) SRC_Instance SRC_CreateNewInstance(uint32_t ref_id, SRC_Type type, int sel_options, IPAddr *addr, int min_samples, int max_samples)
{ {
SRC_Instance result; SRC_Instance result;
@ -241,7 +241,7 @@ SRC_Instance SRC_CreateNewInstance(uint32_t ref_id, SRC_Type type, SRC_SelectOpt
result->index = n_sources; result->index = n_sources;
result->type = type; result->type = type;
result->sel_option = sel_option; result->sel_options = sel_options;
SRC_SetRefid(result, ref_id, addr); SRC_SetRefid(result, ref_id, addr);
SRC_ResetInstance(result); SRC_ResetInstance(result);
@ -637,7 +637,7 @@ SRC_SelectSource(SRC_Instance updated_inst)
assert(sources[i]->status != SRC_OK); assert(sources[i]->status != SRC_OK);
/* Ignore sources which were added with the noselect option */ /* Ignore sources which were added with the noselect option */
if (sources[i]->sel_option == SRC_SelectNoselect) { if (sources[i]->sel_options & SRC_SELECT_NOSELECT) {
sources[i]->status = SRC_UNSELECTABLE; sources[i]->status = SRC_UNSELECTABLE;
continue; continue;
} }
@ -845,12 +845,12 @@ SRC_SelectSource(SRC_Instance updated_inst)
/* If there are any sources with prefer option, reduce the list again /* If there are any sources with prefer option, reduce the list again
only to the preferred sources */ only to the preferred sources */
for (i = 0; i < n_sel_sources; i++) { for (i = 0; i < n_sel_sources; i++) {
if (sources[sel_sources[i]]->sel_option == SRC_SelectPrefer) if (sources[sel_sources[i]]->sel_options & SRC_SELECT_PREFER)
break; break;
} }
if (i < n_sel_sources) { if (i < n_sel_sources) {
for (i = j = 0; i < n_sel_sources; i++) { for (i = j = 0; i < n_sel_sources; i++) {
if (sources[sel_sources[i]]->sel_option != SRC_SelectPrefer) if (!(sources[sel_sources[i]]->sel_options & SRC_SELECT_PREFER))
sources[sel_sources[i]]->status = SRC_NONPREFERRED; sources[sel_sources[i]]->status = SRC_NONPREFERRED;
else else
sel_sources[j++] = sel_sources[i]; sel_sources[j++] = sel_sources[i];
@ -886,7 +886,7 @@ SRC_SelectSource(SRC_Instance updated_inst)
for (i = 0; i < n_sources; i++) { for (i = 0; i < n_sources; i++) {
/* Reset score for non-selectable sources */ /* Reset score for non-selectable sources */
if (sources[i]->status != SRC_OK || if (sources[i]->status != SRC_OK ||
(sel_prefer && sources[i]->sel_option != SRC_SelectPrefer)) { (sel_prefer && !(sources[i]->sel_options & SRC_SELECT_PREFER))) {
sources[i]->sel_score = 1.0; sources[i]->sel_score = 1.0;
sources[i]->distant = DISTANT_PENALTY; sources[i]->distant = DISTANT_PENALTY;
continue; continue;
@ -1256,20 +1256,7 @@ SRC_ReportSource(int index, RPT_SourceReport *report, struct timeval *now)
break; break;
} }
switch (src->sel_option) { report->sel_options = src->sel_options;
case SRC_SelectNormal:
report->sel_option = RPT_NORMAL;
break;
case SRC_SelectPrefer:
report->sel_option = RPT_PREFER;
break;
case SRC_SelectNoselect:
report->sel_option = RPT_NOSELECT;
break;
default:
assert(0);
}
report->reachability = src->reachability; report->reachability = src->reachability;
/* Call stats module to fill out estimates */ /* Call stats module to fill out estimates */

View file

@ -55,17 +55,10 @@ typedef enum {
SRC_REFCLOCK /* Rerefence clock */ SRC_REFCLOCK /* Rerefence clock */
} SRC_Type; } SRC_Type;
/* Options used when selecting sources */
typedef enum {
SRC_SelectNormal,
SRC_SelectNoselect,
SRC_SelectPrefer
} SRC_SelectOption;
/* Function to create a new instance. This would be called by one of /* Function to create a new instance. This would be called by one of
the individual source-type instance creation routines. */ the individual source-type instance creation routines. */
extern SRC_Instance SRC_CreateNewInstance(uint32_t ref_id, SRC_Type type, SRC_SelectOption sel_option, IPAddr *addr, int min_samples, int max_samples); extern SRC_Instance SRC_CreateNewInstance(uint32_t ref_id, SRC_Type type, int sel_options, IPAddr *addr, int min_samples, int max_samples);
/* Function to get rid of a source when it is being unconfigured. /* Function to get rid of a source when it is being unconfigured.
This may cause the current reference source to be reselected, if this This may cause the current reference source to be reselected, if this

View file

@ -42,11 +42,11 @@ typedef struct {
int max_sources; int max_sources;
int min_samples; int min_samples;
int max_samples; int max_samples;
int sel_options;
uint32_t authkey; uint32_t authkey;
double max_delay; double max_delay;
double max_delay_ratio; double max_delay_ratio;
double max_delay_dev_ratio; double max_delay_dev_ratio;
SRC_SelectOption sel_option;
} SourceParameters; } SourceParameters;
#define SRC_DEFAULT_PORT 123 #define SRC_DEFAULT_PORT 123
@ -63,4 +63,8 @@ typedef struct {
#define SRC_DEFAULT_MAXSAMPLES (-1) #define SRC_DEFAULT_MAXSAMPLES (-1)
#define INACTIVE_AUTHKEY 0 #define INACTIVE_AUTHKEY 0
/* Flags for source selection */
#define SRC_SELECT_NOSELECT 0x1
#define SRC_SELECT_PREFER 0x2
#endif /* GOT_SRCPARAMS_H */ #endif /* GOT_SRCPARAMS_H */