cps_source.params.iburst = 1;
cps_source.params.connectivity = SRC_OFFLINE;
- NSR_AddSource(&ntp_addr, NTP_SERVER, &cps_source.params);
+ NSR_AddSource(&ntp_addr, NTP_SERVER, &cps_source.params, NULL);
}
ARR_SetSize(init_sources, 0);
for (i = 0; i < ARR_GetSize(ntp_sources); i++) {
source = (NTP_Source *)ARR_GetElement(ntp_sources, i);
NSR_AddSourceByName(source->params.name, source->params.port,
- source->pool, source->type, &source->params.params);
+ source->pool, source->type, &source->params.params, NULL);
Free(source->params.name);
}
added or INVALID_POOL */
int tentative; /* Flag indicating there was no valid response
received from the source yet */
+ uint32_t conf_id; /* Configuration ID, which can be shared with
+ different sources in case of a pool */
} SourceRecord;
/* Hash table of SourceRecord, its size is a power of two and it's never
/* Last assigned address ID */
static uint32_t last_address_id = 0;
+/* Last assigned configuration ID */
+static uint32_t last_conf_id = 0;
+
/* Source scheduled for name resolving (first resolving or replacement) */
struct UnresolvedSource {
/* Current address of the source (IDADDR_ID is used for a single source
/* Procedure to add a new source */
static NSR_Status
-add_source(NTP_Remote_Address *remote_addr, char *name, NTP_Source_Type type, SourceParameters *params, int pool)
+add_source(NTP_Remote_Address *remote_addr, char *name, NTP_Source_Type type,
+ SourceParameters *params, int pool, uint32_t conf_id)
{
SourceRecord *record;
int slot;
record->name = name ? Strdup(name) : NULL;
record->pool = pool;
record->tentative = 1;
+ record->conf_id = conf_id;
if (record->pool != INVALID_POOL) {
get_pool(record->pool)->sources++;
/* ================================================== */
NSR_Status
-NSR_AddSource(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourceParameters *params)
+NSR_AddSource(NTP_Remote_Address *remote_addr, NTP_Source_Type type,
+ SourceParameters *params, uint32_t *conf_id)
{
- return add_source(remote_addr, NULL, type, params, INVALID_POOL);
+ NSR_Status s;
+
+ s = add_source(remote_addr, NULL, type, params, INVALID_POOL, last_conf_id + 1);
+ if (s != NSR_Success)
+ return s;
+
+ last_conf_id++;
+ if (conf_id)
+ *conf_id = last_conf_id;
+
+ return s;
}
/* ================================================== */
NSR_Status
-NSR_AddSourceByName(char *name, int port, int pool, NTP_Source_Type type, SourceParameters *params)
+NSR_AddSourceByName(char *name, int port, int pool, NTP_Source_Type type,
+ SourceParameters *params, uint32_t *conf_id)
{
struct UnresolvedSource *us;
struct SourcePool *sp;
or later when trying to replace the source */
if (UTI_StringToIP(name, &remote_addr.ip_addr)) {
remote_addr.port = port;
- return NSR_AddSource(&remote_addr, type, params);
+ return NSR_AddSource(&remote_addr, type, params, conf_id);
}
/* Make sure the name is at least printable and has no spaces */
append_unresolved_source(us);
+ last_conf_id++;
+ if (conf_id)
+ *conf_id = last_conf_id;
+
for (i = 0; i < new_sources; i++) {
if (i > 0)
remote_addr.ip_addr.addr.id = ++last_address_id;
- if (add_source(&remote_addr, name, type, params, us->pool) != NSR_Success)
+ if (add_source(&remote_addr, name, type, params, us->pool, last_conf_id) != NSR_Success)
return NSR_TooManySources;
}
/* ================================================== */
+void
+NSR_RemoveSourcesById(uint32_t conf_id)
+{
+ SourceRecord *record;
+ unsigned int i;
+
+ for (i = 0; i < ARR_GetSize(records); i++) {
+ record = get_record(i);
+ if (!record->remote_addr || record->conf_id != conf_id)
+ continue;
+ clean_source_record(record);
+ }
+
+ rehash_records();
+}
+
+/* ================================================== */
+
void
NSR_RemoveAllSources(void)
{
} NSR_Status;
/* Procedure to add a new server or peer source. */
-extern NSR_Status NSR_AddSource(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourceParameters *params);
+extern NSR_Status NSR_AddSource(NTP_Remote_Address *remote_addr, NTP_Source_Type type,
+ SourceParameters *params, uint32_t *conf_id);
/* Procedure to add a new server, peer source, or pool of servers specified by
name instead of address. The name is resolved in exponentially increasing
intervals until it succeeds or fails with a non-temporary error. If the
name is an address, it is equivalent to NSR_AddSource(). */
extern NSR_Status NSR_AddSourceByName(char *name, int port, int pool, NTP_Source_Type type,
- SourceParameters *params);
+ SourceParameters *params, uint32_t *conf_id);
/* Function type for handlers to be called back when an attempt
* (possibly unsuccessful) to resolve unresolved sources ends */
/* Procedure to remove a source */
extern NSR_Status NSR_RemoveSource(IPAddr *address);
+/* Procedure to remove all sources matching a configuration ID */
+extern void NSR_RemoveSourcesById(uint32_t conf_id);
+
/* Procedure to remove all sources */
extern void NSR_RemoveAllSources(void);
}
NSR_Status
-NSR_AddSource(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourceParameters *params)
+NSR_AddSource(NTP_Remote_Address *remote_addr, NTP_Source_Type type,
+ SourceParameters *params, uint32_t *conf_id)
{
return NSR_TooManySources;
}
NSR_Status
-NSR_AddSourceByName(char *name, int port, int pool, NTP_Source_Type type, SourceParameters *params)
+NSR_AddSourceByName(char *name, int port, int pool, NTP_Source_Type type,
+ SourceParameters *params, uint32_t *conf_id)
{
return NSR_TooManySources;
}
return NSR_NoSuchSource;
}
+void
+NSR_RemoveSourcesById(uint32_t conf_id)
+{
+}
+
void
NSR_RemoveAllSources(void)
{