ntp: add configuration ID to sources
Provide an ID for each configured NTP source to enable tracking and removing of its corresponding sources, even after they change their address.
This commit is contained in:
parent
428f9e4228
commit
951f14ae06
6 changed files with 66 additions and 14 deletions
2
cmdmon.c
2
cmdmon.c
|
@ -750,7 +750,7 @@ handle_add_source(CMD_Request *rx_message, CMD_Reply *tx_message)
|
||||||
(ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_TRUST ? SRC_SELECT_TRUST : 0) |
|
(ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_TRUST ? SRC_SELECT_TRUST : 0) |
|
||||||
(ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_REQUIRE ? SRC_SELECT_REQUIRE : 0);
|
(ntohl(rx_message->data.ntp_source.flags) & REQ_ADDSRC_REQUIRE ? SRC_SELECT_REQUIRE : 0);
|
||||||
|
|
||||||
status = NSR_AddSourceByName(name, port, pool, type, ¶ms);
|
status = NSR_AddSourceByName(name, port, pool, type, ¶ms, NULL);
|
||||||
switch (status) {
|
switch (status) {
|
||||||
case NSR_Success:
|
case NSR_Success:
|
||||||
break;
|
break;
|
||||||
|
|
4
conf.c
4
conf.c
|
@ -1577,7 +1577,7 @@ CNF_AddInitSources(void)
|
||||||
cps_source.params.iburst = 1;
|
cps_source.params.iburst = 1;
|
||||||
cps_source.params.connectivity = SRC_OFFLINE;
|
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);
|
ARR_SetSize(init_sources, 0);
|
||||||
|
@ -1594,7 +1594,7 @@ CNF_AddSources(void)
|
||||||
for (i = 0; i < ARR_GetSize(ntp_sources); i++) {
|
for (i = 0; i < ARR_GetSize(ntp_sources); i++) {
|
||||||
source = (NTP_Source *)ARR_GetElement(ntp_sources, i);
|
source = (NTP_Source *)ARR_GetElement(ntp_sources, i);
|
||||||
NSR_AddSourceByName(source->params.name, source->params.port,
|
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);
|
Free(source->params.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,6 +58,8 @@ typedef struct {
|
||||||
added or INVALID_POOL */
|
added or INVALID_POOL */
|
||||||
int tentative; /* Flag indicating there was no valid response
|
int tentative; /* Flag indicating there was no valid response
|
||||||
received from the source yet */
|
received from the source yet */
|
||||||
|
uint32_t conf_id; /* Configuration ID, which can be shared with
|
||||||
|
different sources in case of a pool */
|
||||||
} SourceRecord;
|
} SourceRecord;
|
||||||
|
|
||||||
/* Hash table of SourceRecord, its size is a power of two and it's never
|
/* Hash table of SourceRecord, its size is a power of two and it's never
|
||||||
|
@ -73,6 +75,9 @@ static int auto_start_sources = 0;
|
||||||
/* Last assigned address ID */
|
/* Last assigned address ID */
|
||||||
static uint32_t last_address_id = 0;
|
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) */
|
/* Source scheduled for name resolving (first resolving or replacement) */
|
||||||
struct UnresolvedSource {
|
struct UnresolvedSource {
|
||||||
/* Current address of the source (IDADDR_ID is used for a single source
|
/* Current address of the source (IDADDR_ID is used for a single source
|
||||||
|
@ -302,7 +307,8 @@ rehash_records(void)
|
||||||
|
|
||||||
/* Procedure to add a new source */
|
/* Procedure to add a new source */
|
||||||
static NSR_Status
|
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;
|
SourceRecord *record;
|
||||||
int slot;
|
int slot;
|
||||||
|
@ -332,6 +338,7 @@ add_source(NTP_Remote_Address *remote_addr, char *name, NTP_Source_Type type, So
|
||||||
record->name = name ? Strdup(name) : NULL;
|
record->name = name ? Strdup(name) : NULL;
|
||||||
record->pool = pool;
|
record->pool = pool;
|
||||||
record->tentative = 1;
|
record->tentative = 1;
|
||||||
|
record->conf_id = conf_id;
|
||||||
|
|
||||||
if (record->pool != INVALID_POOL) {
|
if (record->pool != INVALID_POOL) {
|
||||||
get_pool(record->pool)->sources++;
|
get_pool(record->pool)->sources++;
|
||||||
|
@ -604,15 +611,27 @@ remove_unresolved_source(struct UnresolvedSource *us)
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
NSR_Status
|
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_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 UnresolvedSource *us;
|
||||||
struct SourcePool *sp;
|
struct SourcePool *sp;
|
||||||
|
@ -623,7 +642,7 @@ NSR_AddSourceByName(char *name, int port, int pool, NTP_Source_Type type, Source
|
||||||
or later when trying to replace the source */
|
or later when trying to replace the source */
|
||||||
if (UTI_StringToIP(name, &remote_addr.ip_addr)) {
|
if (UTI_StringToIP(name, &remote_addr.ip_addr)) {
|
||||||
remote_addr.port = port;
|
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 */
|
/* Make sure the name is at least printable and has no spaces */
|
||||||
|
@ -657,10 +676,14 @@ NSR_AddSourceByName(char *name, int port, int pool, NTP_Source_Type type, Source
|
||||||
|
|
||||||
append_unresolved_source(us);
|
append_unresolved_source(us);
|
||||||
|
|
||||||
|
last_conf_id++;
|
||||||
|
if (conf_id)
|
||||||
|
*conf_id = last_conf_id;
|
||||||
|
|
||||||
for (i = 0; i < new_sources; i++) {
|
for (i = 0; i < new_sources; i++) {
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
remote_addr.ip_addr.addr.id = ++last_address_id;
|
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;
|
return NSR_TooManySources;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -774,6 +797,24 @@ NSR_RemoveSource(IPAddr *address)
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
|
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
|
void
|
||||||
NSR_RemoveAllSources(void)
|
NSR_RemoveAllSources(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,14 +50,15 @@ typedef enum {
|
||||||
} NSR_Status;
|
} NSR_Status;
|
||||||
|
|
||||||
/* Procedure to add a new server or peer source. */
|
/* 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
|
/* 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
|
name instead of address. The name is resolved in exponentially increasing
|
||||||
intervals until it succeeds or fails with a non-temporary error. If the
|
intervals until it succeeds or fails with a non-temporary error. If the
|
||||||
name is an address, it is equivalent to NSR_AddSource(). */
|
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,
|
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
|
/* Function type for handlers to be called back when an attempt
|
||||||
* (possibly unsuccessful) to resolve unresolved sources ends */
|
* (possibly unsuccessful) to resolve unresolved sources ends */
|
||||||
|
@ -78,6 +79,9 @@ extern void NSR_AutoStartSources(void);
|
||||||
/* Procedure to remove a source */
|
/* Procedure to remove a source */
|
||||||
extern NSR_Status NSR_RemoveSource(IPAddr *address);
|
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 */
|
/* Procedure to remove all sources */
|
||||||
extern void NSR_RemoveAllSources(void);
|
extern void NSR_RemoveAllSources(void);
|
||||||
|
|
||||||
|
|
11
stubs.c
11
stubs.c
|
@ -194,13 +194,15 @@ NSR_Finalise(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
NSR_Status
|
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;
|
return NSR_TooManySources;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSR_Status
|
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_TooManySources;
|
||||||
}
|
}
|
||||||
|
@ -211,6 +213,11 @@ NSR_RemoveSource(IPAddr *address)
|
||||||
return NSR_NoSuchSource;
|
return NSR_NoSuchSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
NSR_RemoveSourcesById(uint32_t conf_id)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
NSR_RemoveAllSources(void)
|
NSR_RemoveAllSources(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -66,7 +66,7 @@ test_unit(void)
|
||||||
DEBUG_LOG("adding source %s hash %"PRIu32, UTI_IPToString(&addrs[j].ip_addr),
|
DEBUG_LOG("adding source %s hash %"PRIu32, UTI_IPToString(&addrs[j].ip_addr),
|
||||||
UTI_IPToHash(&addrs[j].ip_addr) % (1U << i));
|
UTI_IPToHash(&addrs[j].ip_addr) % (1U << i));
|
||||||
|
|
||||||
NSR_AddSource(&addrs[j], random() % 2 ? NTP_SERVER : NTP_PEER, ¶ms);
|
NSR_AddSource(&addrs[j], random() % 2 ? NTP_SERVER : NTP_PEER, ¶ms, NULL);
|
||||||
|
|
||||||
for (k = 0; k < j; k++) {
|
for (k = 0; k < j; k++) {
|
||||||
addr = addrs[k];
|
addr = addrs[k];
|
||||||
|
|
Loading…
Reference in a new issue