Refresh DNS records A and AAAA directly
authorRafał Miłecki <rafal@milecki.pl>
Fri, 10 Mar 2017 07:59:22 +0000 (08:59 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Tue, 14 Mar 2017 10:45:44 +0000 (11:45 +0100)
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
cache.h

diff --git a/cache.c b/cache.c
index 3f3f617d4dc85a7b6ca3edf4e9e2cfdaaf10db84..08f6308dc6fa6e6d5ba30b409cd08b06df152370 100644 (file)
--- 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 cfd63680518080236aef4c43511f96d69331d607..1315aad130827f19b3aef37590a81ac04cdf91a2 100644 (file)
--- 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;