aboutsummaryrefslogtreecommitdiff
path: root/res_cache.cpp
diff options
context:
space:
mode:
authorKen Chen <cken@google.com>2022-03-29 23:48:05 +0800
committerKen Chen <cken@google.com>2022-04-08 02:29:50 +0000
commit84f5fa8bca6b2bb693700a65844165cdf3a7a8ed (patch)
treeaa273fd76c5c50c7bbc07beff5829ae04b57ce8f /res_cache.cpp
parentf3c4207551b096dfa148fc5fe3382f96dc970ca1 (diff)
downloadDnsResolver-84f5fa8bca6b2bb693700a65844165cdf3a7a8ed.tar.gz
Remove unicast-response bit from .local resolution
RFC 6762 section 6.7 says that the Multicast DNS responder MUST send a UDP response directly back to the querier, via unicast, to the query packet's source IP address and port if the source UDP port in a received Multicast DNS query is not 5353. Section 5.4 also mentions "...New questions created by local clients afterwards should be treated as normal 'QM' questions and SHOULD NOT have the unicast-response bit set on the first question of the series." DNS resolver works as a one-shot Multicast DNS querier, which send queries from random ports. The unicast-response bit is not necessary to be set. Setting the unicast-response bit may also cause malfunction on .local fallback queries. Currently, the bit is not cleared while .local resolution is fallbacked from Multicast to Unicast DNS queries. DNS server may send a no error response without Answer RR, or a failure. One way to fix this is clearing the unicast-response bit before fallback. However, it needs to parse packet bytes in res_nsend() because the query packet is made before the res_nsend() but the fallback decision is made in res_nsend(). Besides, it can cause problems in cache. The query class is counted in cache key hashing. The answer obtained by fallback queries is hashed (without unicast-response bit) and stored in cache. But subsequent .local queries cannot match the record because their unicast-response bit is initially set. To avoid adding more complexity, the unnecessary unicast-response bit should be removed. Bug: 227147672 Test: atest Test: Ping test.local on openWRT with fallback and without fallback. Change-Id: Ib703a7537f638669fdc1d9c6927800e5c901786a
Diffstat (limited to 'res_cache.cpp')
-rw-r--r--res_cache.cpp4
1 files changed, 1 insertions, 3 deletions
diff --git a/res_cache.cpp b/res_cache.cpp
index a43c9a30..cc9a98db 100644
--- a/res_cache.cpp
+++ b/res_cache.cpp
@@ -260,7 +260,6 @@ static time_t _time_now(void) {
#define DNS_TYPE_ALL "\00\0377" /* big-endian decimal 255 */
#define DNS_CLASS_IN "\00\01" /* big-endian decimal 1 */
-#define MDNS_CLASS_UNICAST_IN "\200\01" /* big-endian decimal 32769 */
struct DnsPacket {
const uint8_t* base;
@@ -375,8 +374,7 @@ static int _dnsPacket_checkQR(DnsPacket* packet) {
return 0;
}
/* CLASS must be IN */
- if (!_dnsPacket_checkBytes(packet, 2, DNS_CLASS_IN) &&
- !_dnsPacket_checkBytes(packet, 2, MDNS_CLASS_UNICAST_IN)) {
+ if (!_dnsPacket_checkBytes(packet, 2, DNS_CLASS_IN)) {
LOG(INFO) << __func__ << ": unsupported CLASS";
return 0;
}