[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