Fix comment typo in cache_gc_timer
[project/mdnsd.git] / cache.c
diff --git a/cache.c b/cache.c
index 07d4f20..6ff2479 100644 (file)
--- a/cache.c
+++ b/cache.c
@@ -42,7 +42,7 @@
 
 static struct uloop_timeout cache_gc;
 struct avl_tree services;
-static AVL_TREE(records, avl_strcmp, true, NULL);
+AVL_TREE(records, avl_strcmp, true, NULL);
 
 static void
 cache_record_free(struct cache_record *r)
@@ -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, r->refresh))
+                       continue;
+               /* Records other than 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,7 +101,7 @@ cache_gc_timer(struct uloop_timeout *timeout)
                        continue;
                }
                s->refresh += 50;
-               dns_send_question(s->iface, s->entry, TYPE_PTR, 1);
+               dns_send_question(s->iface, s->entry, TYPE_PTR, 0);
        }
 
        uloop_timeout_set(timeout, 10000);
@@ -121,14 +133,14 @@ void cache_cleanup(struct interface *iface)
 }
 
 void
-cache_scan(void)
+cache_update(void)
 {
        struct interface *iface;
        struct cache_service *s;
 
        vlist_for_each_element(&interfaces, iface, node)
                avl_for_each_element(&services, s, avl)
-                       dns_send_question(iface, s->entry, TYPE_PTR, 1);
+                       dns_send_question(iface, s->entry, TYPE_PTR, 0);
 }
 
 static struct cache_service*
@@ -143,6 +155,7 @@ cache_service(struct interface *iface, char *entry, int hlen, int ttl)
                if (!strcmp(s->entry, entry)) {
                        s->refresh = 50;
                        s->time = monotonic_time();
+                       s->ttl = ttl;
                        return s;
                }
 
@@ -167,7 +180,7 @@ cache_service(struct interface *iface, char *entry, int hlen, int ttl)
        avl_insert(&services, &s->avl);
 
        if (!hlen)
-               dns_send_question(iface, entry, TYPE_PTR, !iface->multicast);
+               dns_send_question(iface, entry, TYPE_PTR, iface->multicast);
 
        return s;
 }
@@ -261,7 +274,8 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc
                    nlen + 1 < rdlength && !strcmp(rdata_buffer + rdlength - nlen, name))
                        host_len = rdlength - nlen - 1;
 
-               cache_service(iface, rdata_buffer, host_len, a->ttl);
+               if (name[0] == '_')
+                       cache_service(iface, rdata_buffer, host_len, a->ttl);
 
                dlen = strlen(rdata_buffer) + 1;
                rdata = (uint8_t*)rdata_buffer;
@@ -302,14 +316,12 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc
                break;
 
        case TYPE_A:
-               cache_service(iface, name, strlen(name), a->ttl);
                if (a->rdlength != 4)
                        return;
                dlen = 4;
                break;
 
        case TYPE_AAAA:
-               cache_service(iface, name, strlen(name), a->ttl);
                if (a->rdlength != 16)
                        return;
                dlen = 16;
@@ -324,9 +336,11 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc
                if (!a->ttl) {
                        DBG(1, "D -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl);
                        r->time = now + 1 - r->ttl;
+                       r->refresh = 100;
                } else {
                        r->ttl = a->ttl;
                        r->time = now;
+                       r->refresh = 50;
                        DBG(1, "A -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl);
                }
                return;
@@ -347,6 +361,7 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc
        r->rdlength = dlen;
        r->time = now;
        r->iface = iface;
+       r->refresh = 50;
 
        if (tlen)
                r->txt = memcpy(txt_ptr, rdata_buffer, tlen);