[LEDE-DEV] [PATCH mdns] Send reverse DNS lookup entry for IPv4 address

Rafał Miłecki zajec5 at gmail.com
Fri Feb 10 02:40:31 PST 2017


From: Rafał Miłecki <rafal at milecki.pl>

Whenever we send A(AAA) records, let's also include reverse lookup ones.
This should be extended in the future by adding IPv6.

Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
---
 announce.c  |  2 +-
 dns.c       | 38 +++++++++++++++++++++++++++++++++++---
 dns.h       |  2 +-
 interface.c |  2 +-
 4 files changed, 38 insertions(+), 6 deletions(-)

diff --git a/announce.c b/announce.c
index 7bbce4a..8d9b080 100644
--- a/announce.c
+++ b/announce.c
@@ -65,7 +65,7 @@ announce_timer(struct uloop_timeout *timeout)
 			/* Fall through */
 
 		case STATE_ANNOUNCE:
-			dns_reply_a(iface, announce_ttl);
+			dns_reply_domain_name(iface, announce_ttl);
 			service_announce(iface, announce_ttl);
 			uloop_timeout_set(timeout, announce_ttl * 800);
 			break;
diff --git a/dns.c b/dns.c
index de0c21a..e5703aa 100644
--- a/dns.c
+++ b/dns.c
@@ -181,7 +181,7 @@ dns_send_answer(struct interface *iface, const char *answer)
 		fprintf(stderr, "failed to send question\n");
 }
 
-void
+static void
 dns_reply_a(struct interface *iface, int ttl)
 {
 	struct ifaddrs *ifap, *ifa;
@@ -210,6 +210,38 @@ dns_reply_a(struct interface *iface, int ttl)
 	freeifaddrs(ifap);
 }
 
+static void
+dns_reply_rev_lookup(struct interface *iface, int ttl)
+{
+	char name[32];
+	int len;
+
+	if (!iface->v6) {
+		struct in_addr rev_v4_addr;
+
+		/* PTR recored starts with IP with reversed octets order */
+		memcpy(&rev_v4_addr, &iface->v4_addr, sizeof(iface->v4_addr));
+		rev_v4_addr.s_addr = bswap_32(rev_v4_addr.s_addr);
+
+		/* Prepare name with reversed IP & second level domain suffix */
+		inet_ntop(AF_INET, &rev_v4_addr, name, sizeof(name));
+		strcat(name, ".in-addr.arpa");
+
+		dns_init_answer();
+		len = dn_comp(mdns_hostname_local, mdns_buf, sizeof(mdns_buf), NULL, NULL);
+		if (len > 0)
+			dns_add_answer(TYPE_PTR, mdns_buf, len, ttl);
+		dns_send_answer(iface, name);
+	}
+}
+
+void
+dns_reply_domain_name(struct interface *iface, int ttl)
+{
+	dns_reply_a(iface, ttl);
+	dns_reply_rev_lookup(iface, ttl);
+}
+
 static int
 scan_name(const uint8_t *buffer, int len)
 {
@@ -361,8 +393,8 @@ parse_question(struct interface *iface, char *name, struct dns_question *q)
 	switch (q->type) {
 	case TYPE_ANY:
 		if (!strcmp(name, mdns_hostname_local)) {
+			dns_reply_domain_name(iface, announce_ttl);
 			service_reply(iface, NULL, announce_ttl);
-			dns_reply_a(iface, announce_ttl);
 		}
 		break;
 
@@ -377,7 +409,7 @@ parse_question(struct interface *iface, char *name, struct dns_question *q)
 		if (host)
 			*host = '\0';
 		if (!strcmp(mdns_hostname, name))
-			dns_reply_a(iface, announce_ttl);
+			dns_reply_domain_name(iface, announce_ttl);
 		break;
 	};
 }
diff --git a/dns.h b/dns.h
index 7f3cbe1..fa532a7 100644
--- a/dns.h
+++ b/dns.h
@@ -77,7 +77,7 @@ void dns_send_question(struct interface *iface, const char *question, int type,
 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, const char *answer);
-void dns_reply_a(struct interface *iface, int ttl);
+void dns_reply_domain_name(struct interface *iface, int ttl);
 const char* dns_type_string(uint16_t type);
 void dns_handle_packet(struct interface *iface, struct sockaddr *s, uint16_t port, uint8_t *buf, int len);
 
diff --git a/interface.c b/interface.c
index 463335a..4ddddde 100644
--- a/interface.c
+++ b/interface.c
@@ -621,7 +621,7 @@ void interface_shutdown(void)
 	vlist_for_each_element(&interfaces, iface, node)
 		if (iface->fd.fd > 0 && iface->multicast) {
 			service_announce(iface, 0);
-			dns_reply_a(iface, 0);
+			dns_reply_domain_name(iface, 0);
 		}
 	vlist_for_each_element(&interfaces, iface, node)
 		interface_close(iface);
-- 
2.11.0




More information about the Lede-dev mailing list