From 38777348143ed2f6c41ff0fedb131181606d3a1a Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Wed, 14 Dec 2022 15:15:41 +0100 Subject: [PATCH] sources: add function to modify selection options Add a function to add new selection options or remove existing options specified in the configuration for both NTP sources and reference clocks. Provide a pair of IP address and reference ID to identify the source depending on the type. Find the source directly in the array of sources instead of going through the NSR hashtable for NTP sources to not complicate it unnecessarily. --- sources.c | 40 ++++++++++++++++++++++++++++++++++++++++ sources.h | 4 ++++ 2 files changed, 44 insertions(+) diff --git a/sources.c b/sources.c index 9ab5d10..b768b7b 100644 --- a/sources.c +++ b/sources.c @@ -1598,6 +1598,46 @@ SRC_ActiveSources(void) /* ================================================== */ +static SRC_Instance +find_source(IPAddr *ip, uint32_t ref_id) +{ + int i; + + for (i = 0; i < n_sources; i++) { + if ((ip->family != IPADDR_UNSPEC && sources[i]->type == SRC_NTP && + UTI_CompareIPs(ip, sources[i]->ip_addr, NULL) == 0) || + (ip->family == IPADDR_UNSPEC && sources[i]->type == SRC_REFCLOCK && + ref_id == sources[i]->ref_id)) + return sources[i]; + } + + return NULL; +} + +/* ================================================== */ + +int +SRC_ModifySelectOptions(IPAddr *ip, uint32_t ref_id, int options, int mask) +{ + SRC_Instance inst; + + inst = find_source(ip, ref_id); + if (!inst) + return 0; + + if ((inst->conf_sel_options & mask) == options) + return 1; + + inst->conf_sel_options = (inst->conf_sel_options & ~mask) | options; + LOG(LOGS_INFO, "Source %s selection options modified", source_to_string(inst)); + + update_sel_options(); + + return 1; +} + +/* ================================================== */ + int SRC_ReportSource(int index, RPT_SourceReport *report, struct timespec *now) { diff --git a/sources.h b/sources.h index 6c799bb..da3a533 100644 --- a/sources.h +++ b/sources.h @@ -131,6 +131,10 @@ extern int SRC_IsReachable(SRC_Instance inst); extern int SRC_ReadNumberOfSources(void); extern int SRC_ActiveSources(void); +/* Modify selection options of an NTP source specified by address, or + refclock specified by its reference ID */ +extern int SRC_ModifySelectOptions(IPAddr *ip, uint32_t ref_id, int options, int mask); + extern int SRC_ReportSource(int index, RPT_SourceReport *report, struct timespec *now); extern int SRC_ReportSourcestats(int index, RPT_SourcestatsReport *report, struct timespec *now); extern int SRC_GetSelectReport(int index, RPT_SelectReport *report);