projects
/
oweals
/
mdnsd.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ubus: add ubus fetch call
[oweals/mdnsd.git]
/
dns.c
diff --git
a/dns.c
b/dns.c
index 6fac7d19f440df32fb76ae3467d821834778ab1f..89cd4ce5a76fc4ebd736784cf6d6fcbe4180bf0d 100644
(file)
--- a/
dns.c
+++ b/
dns.c
@@
-39,6
+39,7
@@
#include "interface.h"
static char name_buffer[MAX_NAME_LEN + 1];
#include "interface.h"
static char name_buffer[MAX_NAME_LEN + 1];
+static char dns_buffer[MAX_NAME_LEN];
static struct blob_buf ans_buf;
const char*
static struct blob_buf ans_buf;
const char*
@@
-66,7
+67,7
@@
dns_type_string(uint16_t type)
}
void
}
void
-dns_send_question(struct interface *iface, const char *question, int type)
+dns_send_question(struct interface *iface, const char *question, int type
, int unicast
)
{
static struct dns_header h;
static struct dns_question q;
{
static struct dns_header h;
static struct dns_question q;
@@
-76,7
+77,7
@@
dns_send_question(struct interface *iface, const char *question, int type)
.iov_len = sizeof(h),
},
{
.iov_len = sizeof(h),
},
{
- .iov_base =
name
_buffer,
+ .iov_base =
dns
_buffer,
},
{
.iov_base = &q,
},
{
.iov_base = &q,
@@
-86,19
+87,18
@@
dns_send_question(struct interface *iface, const char *question, int type)
int len;
h.questions = cpu_to_be16(1);
int len;
h.questions = cpu_to_be16(1);
- q.class = cpu_to_be16(1);
+ q.class = cpu_to_be16(
((unicast) ? (CLASS_UNICAST) : (0)) |
1);
q.type = cpu_to_be16(type);
q.type = cpu_to_be16(type);
- len = dn_comp(question, (void *)
name_buffer, sizeof(name
_buffer), NULL, NULL);
+ len = dn_comp(question, (void *)
dns_buffer, sizeof(dns
_buffer), NULL, NULL);
if (len < 1)
return;
iov[1].iov_len = len;
if (len < 1)
return;
iov[1].iov_len = len;
+ DBG(1, "Q <- %s %s\n", dns_type_string(type), question);
if (interface_send_packet(iface, iov, ARRAY_SIZE(iov)) < 0)
if (interface_send_packet(iface, iov, ARRAY_SIZE(iov)) < 0)
- fprintf(stderr, "failed to send question\n");
- else
- DBG(1, "Q <- %s %s\n", dns_type_string(type), question);
+ perror("failed to send question :");
}
}
@@
-300,6
+300,9
@@
parse_answer(struct interface *iface, uint8_t *buffer, int len, uint8_t **b, int
return -1;
}
return -1;
}
+ if ((a->class & ~CLASS_FLUSH) != CLASS_IN)
+ return -1;
+
rdata = *b;
if (a->rdlength > *rlen) {
fprintf(stderr, "dropping: bad question\n");
rdata = *b;
if (a->rdlength > *rlen) {
fprintf(stderr, "dropping: bad question\n");
@@
-310,7
+313,7
@@
parse_answer(struct interface *iface, uint8_t *buffer, int len, uint8_t **b, int
*b += a->rdlength;
if (cache)
*b += a->rdlength;
if (cache)
- cache_answer(iface, buffer, len, name, a, rdata);
+ cache_answer(iface, buffer, len, name, a, rdata
, a->class & CLASS_FLUSH
);
return 0;
}
return 0;
}
@@
-320,17
+323,20
@@
parse_question(struct interface *iface, char *name, struct dns_question *q)
{
char *host;
{
char *host;
+ if ((q->class & CLASS_UNICAST) && iface->multicast)
+ iface = iface->peer;
+
DBG(1, "Q -> %s %s\n", dns_type_string(q->type), name);
switch (q->type) {
case TYPE_ANY:
if (!strcmp(name, mdns_hostname_local))
DBG(1, "Q -> %s %s\n", dns_type_string(q->type), name);
switch (q->type) {
case TYPE_ANY:
if (!strcmp(name, mdns_hostname_local))
- service_reply(iface, NULL);
+ service_reply(iface, NULL
, announce_ttl
);
break;
case TYPE_PTR:
break;
case TYPE_PTR:
- service_announce_services(iface, name);
- service_reply(iface, name);
+ service_announce_services(iface, name
, announce_ttl
);
+ service_reply(iface, name
, announce_ttl
);
break;
case TYPE_AAAA:
break;
case TYPE_AAAA:
@@
-339,13
+345,13
@@
parse_question(struct interface *iface, char *name, struct dns_question *q)
if (host)
*host = '\0';
if (!strcmp(mdns_hostname, name))
if (host)
*host = '\0';
if (!strcmp(mdns_hostname, name))
- service_reply_a(iface,
q->type
);
+ service_reply_a(iface,
announce_ttl
);
break;
};
}
void
break;
};
}
void
-dns_handle_packet(struct interface *iface, uint8_t *buffer, int len)
+dns_handle_packet(struct interface *iface,
struct sockaddr *s, uint16_t port,
uint8_t *buffer, int len)
{
struct dns_header *h;
uint8_t *b = buffer;
{
struct dns_header *h;
uint8_t *b = buffer;
@@
-357,6
+363,10
@@
dns_handle_packet(struct interface *iface, uint8_t *buffer, int len)
return;
}
return;
}
+ if (h->questions && !iface->multicast && port != 5353)
+ // silently drop unicast questions that dont originate from port 5353
+ return;
+
while (h->questions-- > 0) {
char *name = dns_consume_name(buffer, len, &b, &rlen);
struct dns_question *q;
while (h->questions-- > 0) {
char *name = dns_consume_name(buffer, len, &b, &rlen);
struct dns_question *q;