From ef02fa5ede6a33d7066863d0c2357c18cf4796a1 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Thu, 17 Dec 2020 09:39:20 +0100 Subject: [PATCH 1/4] Add REFRESH_HOSTNAMES=UNKNWON to support only refreshing recently active clients with unknown hostnames Signed-off-by: DL6ER --- src/config.c | 5 +++++ src/enums.h | 1 + src/resolve.c | 10 +++++++--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 7d840524e..85c6d58c2 100644 --- a/src/config.c +++ b/src/config.c @@ -438,6 +438,11 @@ void read_FTLconf(void) config.refresh_hostnames = REFRESH_NONE; logg(" REFRESH_HOSTNAMES: Not periodically refreshing names"); } + else if(buffer != NULL && strcasecmp(buffer, "UNKNOWN") == 0) + { + config.refresh_hostnames = REFRESH_NONE; + logg(" REFRESH_HOSTNAMES: Only refreshing recently active clients with unknown hostnames"); + } else { config.refresh_hostnames = REFRESH_IPV4_ONLY; diff --git a/src/enums.h b/src/enums.h index 35caf92c0..fbccba59f 100644 --- a/src/enums.h +++ b/src/enums.h @@ -153,6 +153,7 @@ enum events { enum refresh_hostnames { REFRESH_ALL, REFRESH_IPV4_ONLY, + REFRESH_UNKNOWN, REFRESH_NONE } __attribute__ ((packed)); diff --git a/src/resolve.c b/src/resolve.c index cd71996ef..bee3dd9ac 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -419,10 +419,14 @@ static void resolveClients(const bool onlynew) IPv6 = true; // If we're in refreshing mode (onlynew == false), we skip clients if - // either IPv4-only or none is selected + // 1. We should not refresh any hostnames + // 2. We should only refresh IPv4 client, but this client is IPv6 + // 3. We should only refresh unknown hostnames, but leave + // existing ones as they are if(onlynew == false && - (config.refresh_hostnames == REFRESH_NONE || - (config.refresh_hostnames == REFRESH_IPV4_ONLY && IPv6))) + (config.refresh_hostnames == REFRESH_NONE || + (config.refresh_hostnames == REFRESH_IPV4_ONLY && IPv6) || + (config.refresh_hostnames == REFRESH_UNKNOWN && oldnamepos != 0))) { if(config.debug & DEBUG_RESOLVER) { From 65dd6f93f698ff12ac89de4b46caf69d6b8553e9 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Thu, 17 Dec 2020 09:46:43 +0100 Subject: [PATCH 2/4] Force refreshing of hostnames (according to REFRESH_HOSTNAMES config) on receipt of SIGRT4 Signed-off-by: DL6ER --- src/enums.h | 1 + src/events.c | 2 ++ src/resolve.c | 18 +++++++++++++----- src/signals.c | 4 +++- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/enums.h b/src/enums.h index fbccba59f..447bf50a9 100644 --- a/src/enums.h +++ b/src/enums.h @@ -145,6 +145,7 @@ enum events { RELOAD_GRAVITY, RELOAD_PRIVACY_LEVEL, RERESOLVE_HOSTNAMES, + RERESOLVE_HOSTNAMES_FORCE, REIMPORT_ALIASCLIENTS, PARSE_NEIGHBOR_CACHE, EVENTS_MAX diff --git a/src/events.c b/src/events.c index 845837026..062807075 100644 --- a/src/events.c +++ b/src/events.c @@ -92,6 +92,8 @@ static const char *eventtext(const enum events event) return "RELOAD_PRIVACY_LEVEL"; case RERESOLVE_HOSTNAMES: return "RERESOLVE_HOSTNAMES"; + case RERESOLVE_HOSTNAMES_FORCE: + return "RERESOLVE_HOSTNAMES_FORCE"; case REIMPORT_ALIASCLIENTS: return "REIMPORT_ALIASCLIENTS"; case PARSE_NEIGHBOR_CACHE: diff --git a/src/resolve.c b/src/resolve.c index bee3dd9ac..24576530c 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -350,7 +350,7 @@ static size_t resolveAndAddHostname(size_t ippos, size_t oldnamepos) } // Resolve client host names -static void resolveClients(const bool onlynew) +static void resolveClients(const bool onlynew, const bool force_refreshing) { const time_t now = time(NULL); // Lock counter access here, we use a copy in the following loop @@ -386,7 +386,7 @@ static void resolveClients(const bool onlynew) // Only try to resolve host names of clients which were recently active if we are re-resolving // Limit for a "recently active" client is two hours ago - if(onlynew == false && client->lastQuery < now - 2*60*60) + if(!force_refreshing && onlynew == false && client->lastQuery < now - 2*60*60) { if(config.debug & DEBUG_RESOLVER) { @@ -401,7 +401,7 @@ static void resolveClients(const bool onlynew) // If onlynew flag is set, we will only resolve new clients // If not, we will try to re-resolve all known clients - if(onlynew && !newflag) + if(!force_refreshing && onlynew && !newflag) { if(config.debug & DEBUG_RESOLVER) { @@ -563,7 +563,8 @@ void *DNSclient_thread(void *val) if(resolver_ready && (time(NULL) % RESOLVE_INTERVAL == 0)) { // Try to resolve new client host names (onlynew=true) - resolveClients(true); + // We're not forcing refreshing here + resolveClients(true, false); // Try to resolve new upstream destination host names (onlynew=true) resolveUpstreams(true); // Prevent immediate re-run of this routine @@ -576,11 +577,18 @@ void *DNSclient_thread(void *val) set_event(RERESOLVE_HOSTNAMES); // done below } + bool force_refreshing = false; + if(get_and_clear_event(RERESOLVE_HOSTNAMES_FORCE)) + { + set_event(RERESOLVE_HOSTNAMES); // done below + force_refreshing = true; + } + // Process resolver related event queue elements if(get_and_clear_event(RERESOLVE_HOSTNAMES)) { // Try to resolve all client host names (onlynew=false) - resolveClients(false); + resolveClients(false, force_refreshing); // Try to resolve all upstream destination host names (onlynew=false) resolveUpstreams(false); // Prevent immediate re-run of this routine diff --git a/src/signals.c b/src/signals.c index b5ec061da..ec3705071 100644 --- a/src/signals.c +++ b/src/signals.c @@ -283,7 +283,9 @@ static void SIGRT_handler(int signum, siginfo_t *si, void *unused) else if(rtsig == 4) { // Re-resolve all clients and forward destinations - set_event(RERESOLVE_HOSTNAMES); + // Force refreshing hostnames according to + // REFRESH_HOSTNAMES config option + set_event(RERESOLVE_HOSTNAMES_FORCE); } else if(rtsig == 5) { From d46acb547d952114d3794372ea754ea3c63b763e Mon Sep 17 00:00:00 2001 From: DL6ER Date: Thu, 17 Dec 2020 11:32:26 +0100 Subject: [PATCH 3/4] Give explicit reason for skipping in debug message Signed-off-by: DL6ER --- src/config.c | 2 +- src/resolve.c | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/config.c b/src/config.c index 85c6d58c2..e118d74df 100644 --- a/src/config.c +++ b/src/config.c @@ -440,7 +440,7 @@ void read_FTLconf(void) } else if(buffer != NULL && strcasecmp(buffer, "UNKNOWN") == 0) { - config.refresh_hostnames = REFRESH_NONE; + config.refresh_hostnames = REFRESH_UNKNOWN; logg(" REFRESH_HOSTNAMES: Only refreshing recently active clients with unknown hostnames"); } else diff --git a/src/resolve.c b/src/resolve.c index 24576530c..7b49048bc 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -430,8 +430,16 @@ static void resolveClients(const bool onlynew, const bool force_refreshing) { if(config.debug & DEBUG_RESOLVER) { - logg("Skipping client %s (%s) because it should not be refreshed", - getstr(ippos), getstr(oldnamepos)); + const char *reason = "N/A"; + if(config.refresh_hostnames == REFRESH_NONE) + reason = "Not refreshing any hostnames"; + else if(config.refresh_hostnames == REFRESH_IPV4_ONLY) + reason = "Only refreshing IPv4 names"; + else if(config.refresh_hostnames == REFRESH_UNKNOWN) + reason = "Looking only for unknown hostnames"; + + logg("Skipping client %s (%s) because it should not be refreshed: %s", + getstr(ippos), getstr(oldnamepos), reason); } skipped++; continue; From 0a07385f88426365ee86243c5a011618ee2b8916 Mon Sep 17 00:00:00 2001 From: DL6ER Date: Fri, 18 Dec 2020 08:46:40 +0100 Subject: [PATCH 4/4] Update src/resolve.c Co-authored-by: Adam Warner --- src/resolve.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resolve.c b/src/resolve.c index 7b49048bc..7262f677b 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -386,7 +386,7 @@ static void resolveClients(const bool onlynew, const bool force_refreshing) // Only try to resolve host names of clients which were recently active if we are re-resolving // Limit for a "recently active" client is two hours ago - if(!force_refreshing && onlynew == false && client->lastQuery < now - 2*60*60) + if(!force_refreshing && !onlynew && client->lastQuery < now - 2*60*60) { if(config.debug & DEBUG_RESOLVER) {