Browse Source

add a iface pointer to services and records

Signed-off-by: John Crispin <blogic@openwrt.org>
John Crispin 9 years ago
parent
commit
60ca4afc61
3 changed files with 14 additions and 7 deletions
  1. 9 5
      cache.c
  2. 4 1
      cache.h
  3. 1 1
      main.c

+ 9 - 5
cache.c

@@ -100,16 +100,18 @@ cache_init(void)
 	return 0;
 }
 
-void cache_cleanup(void)
+void cache_cleanup(struct interface *iface)
 {
 	struct cache_record *r, *p;
 	struct cache_service *s, *t;
 
-	avl_for_each_element_safe(&records, r, avl, p)
-		cache_record_free(r);
-
 	avl_for_each_element_safe(&services, s, avl, t)
-		cache_service_free(s);
+		if (!iface || iface == s->iface)
+			cache_service_free(s);
+
+	avl_for_each_element_safe(&records, r, avl, p)
+		if (!iface || iface == r->iface)
+			cache_record_free(r);
 }
 
 void
@@ -142,6 +144,7 @@ cache_service(struct interface *iface, char *entry, int hlen, int ttl)
 	s->avl.key = s->entry = strcpy(entry_buf, entry);
 	s->time = time(NULL);
 	s->ttl = ttl;
+	s->iface = iface;
 
 	if (hlen)
 		s->host = strncpy(host_buf, s->entry, hlen);
@@ -320,6 +323,7 @@ cache_answer(struct interface *iface, uint8_t *base, int blen, char *name, struc
 	r->port = port;
 	r->rdlength = dlen;
 	r->time = time(NULL);
+	r->iface = iface;
 
 	if (tlen)
 		r->txt = memcpy(txt_ptr, rdata_buffer, tlen);

+ 4 - 1
cache.h

@@ -19,6 +19,7 @@
 #include <libubox/blob.h>
 
 #include "dns.h"
+#include "interface.h"
 
 struct cache_service {
 	struct avl_node avl;
@@ -27,6 +28,7 @@ struct cache_service {
 	const char *host;
 	uint32_t ttl;
 	time_t time;
+	struct interface *iface;
 };
 
 struct cache_record {
@@ -40,13 +42,14 @@ struct cache_record {
 	const uint8_t *rdata;
 	uint16_t rdlength;
 	time_t time;
+	struct interface *iface;
 };
 
 extern struct avl_tree services;
 
 int cache_init(void);
 void cache_scan(void);
-void cache_cleanup(void);
+void cache_cleanup(struct interface *iface);
 void cache_answer(struct interface *iface, uint8_t *base, int blen,
 		  char *name, struct dns_answer *a, uint8_t *rdata, int flush);
 int cache_host_is_known(char *record);

+ 1 - 1
main.c

@@ -98,7 +98,7 @@ main(int argc, char **argv)
 	uloop_done();
 
 	interface_shutdown();
-	cache_cleanup();
+	cache_cleanup(NULL);
 	service_cleanup();
 	vlist_flush(&interfaces);