diff options
author | Daniel Mack <daniel@zonque.org> | 2015-12-09 13:09:35 +0100 |
---|---|---|
committer | Daniel Mack <daniel@zonque.org> | 2015-12-10 10:21:50 +0100 |
commit | 261f3673c197ff7e52722c212ae63baf853b6896 (patch) | |
tree | ee0b3e425fcd2773274ba1a80b74960fd4ae6504 | |
parent | 80a62095dc5af36d9f46de693f3a84835bc28e96 (diff) |
resolved: add more linked packets for overlong known answers
For mDNS, if we're unable to stuff all known answers into the given packet,
allocate a new one, push the RR into that one and link it to the current
one.
-rw-r--r-- | src/resolve/resolved-dns-cache.c | 18 | ||||
-rw-r--r-- | src/resolve/resolved-dns-scope.c | 2 |
2 files changed, 19 insertions, 1 deletions
diff --git a/src/resolve/resolved-dns-cache.c b/src/resolve/resolved-dns-cache.c index 6124ff659c..1774ae6cb8 100644 --- a/src/resolve/resolved-dns-cache.c +++ b/src/resolve/resolved-dns-cache.c @@ -738,6 +738,7 @@ int dns_cache_export_shared_to_packet(DnsCache *cache, DnsPacket *p) { int r; assert(cache); + assert(p); HASHMAP_FOREACH(i, cache->by_key, iterator) { DnsCacheItem *j; @@ -752,6 +753,23 @@ int dns_cache_export_shared_to_packet(DnsCache *cache, DnsPacket *p) { continue; r = dns_packet_append_rr(p, j->rr, NULL, NULL); + if (r == -EMSGSIZE && p->protocol == DNS_PROTOCOL_MDNS) { + /* For mDNS, if we're unable to stuff all known answers into the given packet, + * allocate a new one, push the RR into that one and link it to the current one. + */ + + DNS_PACKET_HEADER(p)->ancount = htobe16(ancount); + ancount = 0; + + r = dns_packet_new_query(&p->more, p->protocol, 0, true); + if (r < 0) + return r; + + /* continue with new packet */ + p = p->more; + r = dns_packet_append_rr(p, j->rr, NULL, NULL); + } + if (r < 0) return r; diff --git a/src/resolve/resolved-dns-scope.c b/src/resolve/resolved-dns-scope.c index 11c3294ff3..4d83ac597c 100644 --- a/src/resolve/resolved-dns-scope.c +++ b/src/resolve/resolved-dns-scope.c @@ -290,7 +290,7 @@ int dns_scope_emit(DnsScope *s, int fd, DnsServer *server, DnsPacket *p) { /* If there are multiple linked packets, set the TC bit in all but the last of them */ if (p->more) { assert(p->protocol == DNS_PROTOCOL_MDNS); - dns_packet_set_truncated_flag(p, true); + dns_packet_set_flags(p, true, true); } r = dns_scope_emit_one(s, fd, server, p); |