X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fmdnsd.git;a=blobdiff_plain;f=cache.c;h=190290a9afa3ab7a9343355051d82dea82866646;hp=cdc4a792c122cfe7f642ddd38d6d6576d489f19e;hb=d958ed0a279467d7a4e538b52214ab36c8b2abd8;hpb=029c1bb0168e3fc6d71846b2ea79e2ac32e29cc2 diff --git a/cache.c b/cache.c index cdc4a79..190290a 100644 --- a/cache.c +++ b/cache.c @@ -41,7 +41,7 @@ #include "interface.h" static struct uloop_timeout cache_gc; -struct avl_tree entries; +struct avl_tree services; static AVL_TREE(records, avl_strcmp, true, NULL); static void @@ -53,10 +53,10 @@ cache_record_free(struct cache_record *r) } static void -cache_entry_free(struct cache_entry *s) +cache_service_free(struct cache_service *s) { DBG(2, "%s\n", s->entry); - avl_delete(&entries, &s->avl); + avl_delete(&services, &s->avl); free(s); } @@ -73,17 +73,17 @@ static void cache_gc_timer(struct uloop_timeout *timeout) { struct cache_record *r, *p; - struct cache_entry *s, *t; + struct cache_service *s, *t; avl_for_each_element_safe(&records, r, avl, p) if (cache_is_expired(r->time, r->ttl)) cache_record_free(r); - avl_for_each_element_safe(&entries, s, avl, t) { + avl_for_each_element_safe(&services, s, avl, t) { if (!s->host) continue; if (cache_is_expired(s->time, s->ttl)) - cache_entry_free(s); + cache_service_free(s); } uloop_timeout_set(timeout, 10000); @@ -92,7 +92,7 @@ cache_gc_timer(struct uloop_timeout *timeout) int cache_init(void) { - avl_init(&entries, avl_strcmp, true, NULL); + avl_init(&services, avl_strcmp, true, NULL); cache_gc.cb = cache_gc_timer; uloop_timeout_set(&cache_gc, 10000); @@ -103,35 +103,35 @@ cache_init(void) void cache_cleanup(void) { struct cache_record *r, *p; - struct cache_entry *s, *t; + struct cache_service *s, *t; avl_for_each_element_safe(&records, r, avl, p) cache_record_free(r); - avl_for_each_element_safe(&entries, s, avl, t) - cache_entry_free(s); + avl_for_each_element_safe(&services, s, avl, t) + cache_service_free(s); } void cache_scan(void) { struct interface *iface; - struct cache_entry *s; + struct cache_service *s; vlist_for_each_element(&interfaces, iface, node) - avl_for_each_element(&entries, s, avl) - dns_send_question(iface, s->entry, TYPE_PTR); + avl_for_each_element(&services, s, avl) + dns_send_question(iface, s->entry, TYPE_PTR, 1); } -static struct cache_entry* -cache_entry(struct interface *iface, char *entry, int hlen, int ttl) +static struct cache_service* +cache_service(struct interface *iface, char *entry, int hlen, int ttl) { - struct cache_entry *s, *t; + struct cache_service *s, *t; char *entry_buf; char *host_buf; char *type; - avl_for_each_element_safe(&entries, s, avl, t) + avl_for_each_element_safe(&services, s, avl, t) if (!strcmp(s->entry, entry)) return s; @@ -151,10 +151,10 @@ cache_entry(struct interface *iface, char *entry, int hlen, int ttl) type++; if (type) s->avl.key = type; - avl_insert(&entries, &s->avl); + avl_insert(&services, &s->avl); if (!hlen) - dns_send_question(iface, entry, TYPE_PTR); + dns_send_question(iface, entry, TYPE_PTR, !iface->multicast); return s; } @@ -167,7 +167,7 @@ cache_record_find(char *record, int type, int port, int rdlength, uint8_t *rdata if (!l) return NULL; - while (l && !strcmp(l->record, record)) { + while (l && l->record && !strcmp(l->record, record)) { struct cache_record *r = l; l = avl_next_element(l, avl); @@ -216,7 +216,7 @@ cache_host_is_known(char *record) } void -cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struct dns_answer *a, uint8_t *rdata) +cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struct dns_answer *a, uint8_t *rdata, int flush) { struct dns_srv_data *dsd = (struct dns_srv_data *) rdata; struct cache_record *r; @@ -227,9 +227,6 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc int host_len = 0; static char *rdata_buffer = (char *) mdns_buf; - if (!(a->class & CLASS_IN)) - return; - nlen = strlen(name); switch (a->type) { @@ -242,7 +239,7 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc return; } - DBG(1, "A -> %s %s %s\n", dns_type_string(a->type), name, rdata_buffer); + DBG(1, "A -> %s %s %s ttl:%d\n", dns_type_string(a->type), name, rdata_buffer, a->ttl); rdlength = strlen(rdata_buffer); @@ -250,7 +247,7 @@ 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_entry(iface, rdata_buffer, host_len, a->ttl); + cache_service(iface, rdata_buffer, host_len, a->ttl); return; case TYPE_SRV: @@ -280,14 +277,14 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc break; case TYPE_A: - cache_entry(iface, name, strlen(name), a->ttl); + cache_service(iface, name, strlen(name), a->ttl); if (a->rdlength != 4) return; dlen = 4; break; case TYPE_AAAA: - cache_entry(iface, name, strlen(name), a->ttl); + cache_service(iface, name, strlen(name), a->ttl); if (a->rdlength != 16) return; dlen = 16; @@ -301,7 +298,7 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc if (r) { if (!a->ttl) { DBG(1, "D -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl); - cache_record_free(r); + r->time = time(0) + 1 - r->ttl; } else { r->ttl = a->ttl; DBG(1, "A -> %s %s ttl:%d\n", dns_type_string(r->type), r->record, r->ttl);