diff mbox

[LEDE-DEV,umdns,2/3] Refresh DNS records A and AAAA directly

Message ID 20170310075923.32025-3-zajec5@gmail.com
State Accepted
Delegated to: Rafał Miłecki
Headers show

Commit Message

Rafał Miłecki March 10, 2017, 7:59 a.m. UTC
From: Rafał Miłecki <rafal@milecki.pl>

So far records A and AAAA were being connected and stored as a single
*service*. It's possible to handle these records directly without this
service trick and it also provides better control over them (some corner
cases like different TTL values).

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
 cache.c | 25 +++++++++++++++++--------
 cache.h |  1 +
 2 files changed, 18 insertions(+), 8 deletions(-)
diff mbox

Patch

diff --git a/cache.c b/cache.c
index 3f3f617..08f6308 100644
--- a/cache.c
+++ b/cache.c
@@ -75,9 +75,21 @@  cache_gc_timer(struct uloop_timeout *timeout)
 	struct cache_record *r, *p;
 	struct cache_service *s, *t;
 
-	avl_for_each_element_safe(&records, r, avl, p)
-		if (cache_is_expired(r->time, r->ttl, 100))
+	avl_for_each_element_safe(&records, r, avl, p) {
+		if (!cache_is_expired(r->time, r->ttl, 100))
+			continue;
+		/* Records other and A(AAA) are handled as services */
+		if (r->type != TYPE_A && r->type != TYPE_AAAA) {
+			cache_record_free(r);
+			continue;
+		}
+		if (r->refresh >= 100) {
 			cache_record_free(r);
+			continue;
+		}
+		r->refresh += 50;
+		dns_send_question(r->iface, r->record, r->type, 0);
+	}
 
 	avl_for_each_element_safe(&services, s, avl, t) {
 		if (!s->host)
@@ -89,12 +101,9 @@  cache_gc_timer(struct uloop_timeout *timeout)
 			continue;
 		}
 		s->refresh += 50;
-		if (cache_service_is_host(s)) {
-			dns_send_question(s->iface, s->entry, TYPE_A, 0);
-			dns_send_question(s->iface, s->entry, TYPE_AAAA, 0);
-		} else {
-			dns_send_question(s->iface, s->entry, TYPE_PTR, 0);
-		}
+		if (cache_service_is_host(s))
+			continue;
+		dns_send_question(s->iface, s->entry, TYPE_PTR, 0);
 	}
 
 	uloop_timeout_set(timeout, 10000);
diff --git a/cache.h b/cache.h
index cfd6368..1315aad 100644
--- a/cache.h
+++ b/cache.h
@@ -44,6 +44,7 @@  struct cache_record {
 	uint16_t rdlength;
 	time_t time;
 	struct interface *iface;
+	int refresh;
 };
 
 extern struct avl_tree services;