[LEDE-DEV,umdns,2/2] Fix sending unicast questions on cache expire

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

Commit Message

Rafał Miłecki March 20, 2017, 11 p.m.
From: Rafał Miłecki <rafal@milecki.pl>

Sending unicast questions requires passing IP address. Pass the one that
was cached when caching DNS record.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
 announce.c  | 2 +-
 cache.c     | 8 ++++----
 dns.c       | 5 +++--
 dns.h       | 3 ++-
 interface.c | 4 ++--
 ubus.c      | 4 ++--
 6 files changed, 14 insertions(+), 12 deletions(-)

Patch

diff --git a/announce.c b/announce.c
index fed1b21..3c8ea16 100644
--- a/announce.c
+++ b/announce.c
@@ -46,7 +46,7 @@  announce_timer(struct uloop_timeout *timeout)
 		case STATE_PROBE1:
 		case STATE_PROBE2:
 		case STATE_PROBE3:
-			dns_send_question(iface, mdns_hostname_local, TYPE_ANY, 1);
+			dns_send_question(iface, NULL, mdns_hostname_local, TYPE_ANY, 1);
 			uloop_timeout_set(timeout, 250);
 			iface->announce_state++;
 			break;
diff --git a/cache.c b/cache.c
index fea9035..7d2aa8f 100644
--- a/cache.c
+++ b/cache.c
@@ -89,7 +89,7 @@  cache_gc_timer(struct uloop_timeout *timeout)
 			continue;
 		}
 		r->refresh += 50;
-		dns_send_question(r->iface, r->record, r->type, 0);
+		dns_send_question(r->iface, (struct sockaddr *)&r->from, r->record, r->type, 0);
 	}
 
 	avl_for_each_element_safe(&services, s, avl, t) {
@@ -102,7 +102,7 @@  cache_gc_timer(struct uloop_timeout *timeout)
 			continue;
 		}
 		s->refresh += 50;
-		dns_send_question(s->iface, s->entry, TYPE_PTR, 0);
+		dns_send_question(s->iface, NULL, s->entry, TYPE_PTR, 0);
 	}
 
 	uloop_timeout_set(timeout, 10000);
@@ -141,7 +141,7 @@  cache_update(void)
 
 	vlist_for_each_element(&interfaces, iface, node)
 		avl_for_each_element(&services, s, avl)
-			dns_send_question(iface, s->entry, TYPE_PTR, 0);
+			dns_send_question(iface, NULL, s->entry, TYPE_PTR, 0);
 }
 
 static struct cache_service*
@@ -181,7 +181,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, NULL, entry, TYPE_PTR, iface->multicast);
 
 	return s;
 }
diff --git a/dns.c b/dns.c
index 899b124..d384f58 100644
--- a/dns.c
+++ b/dns.c
@@ -68,7 +68,8 @@  dns_type_string(uint16_t type)
 }
 
 void
-dns_send_question(struct interface *iface, const char *question, int type, int multicast)
+dns_send_question(struct interface *iface, struct sockaddr *to,
+		  const char *question, int type, int multicast)
 {
 	static struct dns_header h;
 	static struct dns_question q;
@@ -98,7 +99,7 @@  dns_send_question(struct interface *iface, const char *question, int type, int m
 	iov[1].iov_len = len;
 
 	DBG(1, "Q <- %s %s\n", dns_type_string(type), question);
-	if (interface_send_packet(iface, NULL, iov, ARRAY_SIZE(iov)) < 0)
+	if (interface_send_packet(iface, to, iov, ARRAY_SIZE(iov)) < 0)
 		perror("failed to send question");
 }
 
diff --git a/dns.h b/dns.h
index 38ab41f..f1f0212 100644
--- a/dns.h
+++ b/dns.h
@@ -73,7 +73,8 @@  struct interface;
 extern int cfg_proto;
 extern int cfg_no_subnet;
 
-void dns_send_question(struct interface *iface, const char *question, int type, int multicast);
+void dns_send_question(struct interface *iface, struct sockaddr *to,
+		       const char *question, int type, int multicast);
 void dns_init_answer(void);
 void dns_add_answer(int type, const uint8_t *rdata, uint16_t rdlength, int ttl);
 void dns_send_answer(struct interface *iface, struct sockaddr *to, const char *answer);
diff --git a/interface.c b/interface.c
index e898784..3904c89 100644
--- a/interface.c
+++ b/interface.c
@@ -441,7 +441,7 @@  reconnect_socket4(struct uloop_timeout *timeout)
 
 	uloop_fd_add(&iface->fd, ULOOP_READ);
 	if (iface->multicast) {
-		dns_send_question(iface, C_DNS_SD, TYPE_PTR, 0);
+		dns_send_question(iface, NULL, C_DNS_SD, TYPE_PTR, 0);
 		announce_init(iface);
 	}
 
@@ -489,7 +489,7 @@  reconnect_socket6(struct uloop_timeout *timeout)
 	uloop_fd_add(&iface->fd, ULOOP_READ);
 
 	if (iface->multicast) {
-		dns_send_question(iface, C_DNS_SD, TYPE_PTR, 0);
+		dns_send_question(iface, NULL, C_DNS_SD, TYPE_PTR, 0);
 		announce_init(iface);
 	}
 
diff --git a/ubus.c b/ubus.c
index ba89fdd..7b1c811 100644
--- a/ubus.c
+++ b/ubus.c
@@ -201,10 +201,10 @@  umdns_query(struct ubus_context *ctx, struct ubus_object *obj,
 
 	if (!strcmp(method, "query")) {
 		if (iface_v4)
-			dns_send_question(iface_v4, question, type, 1);
+			dns_send_question(iface_v4, NULL, question, type, 1);
 
 		if (iface_v6)
-			dns_send_question(iface_v6, question, type, 1);
+			dns_send_question(iface_v6, NULL, question, type, 1);
 
 		return UBUS_STATUS_OK;
 	} else if (!strcmp(method, "fetch")) {