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
5 files changed
tree: aa273fd76c5c50c7bbc07beff5829ae04b57ce8f
  1. aidl_api/
  2. apex/
  3. binder/
  4. doh/
  5. include/
  6. tests/
  7. .editorconfig
  8. Android.bp
  9. cbindgen.toml
  10. Dns64Configuration.cpp
  11. Dns64Configuration.h
  12. DnsProxyListener.cpp
  13. DnsProxyListener.h
  14. DnsQueryLog.cpp
  15. DnsQueryLog.h
  16. DnsQueryLogTest.cpp
  17. DnsResolver.cpp
  18. DnsResolver.h
  19. DnsResolverService.cpp
  20. DnsResolverService.h
  21. DnsStats.cpp
  22. DnsStats.h
  23. DnsStatsTest.cpp
  24. DnsTlsDispatcher.cpp
  25. DnsTlsDispatcher.h
  26. DnsTlsQueryMap.cpp
  27. DnsTlsQueryMap.h
  28. DnsTlsServer.cpp
  29. DnsTlsServer.h
  30. DnsTlsSessionCache.cpp
  31. DnsTlsSessionCache.h
  32. DnsTlsSocket.cpp
  33. DnsTlsSocket.h
  34. DnsTlsSocketFactory.h
  35. DnsTlsTransport.cpp
  36. DnsTlsTransport.h
  37. doh.h
  38. Experiments.cpp
  39. Experiments.h
  40. ExperimentsTest.cpp
  41. getaddrinfo.cpp
  42. getaddrinfo.h
  43. gethnamaddr.cpp
  44. gethnamaddr.h
  45. hostent.h
  46. IDnsTlsSocket.h
  47. IDnsTlsSocketFactory.h
  48. IDnsTlsSocketObserver.h
  49. IPrivateDnsServer.h
  50. libnetd_resolv.map.txt
  51. LockedQueue.h
  52. NOTICE
  53. OperationLimiter.h
  54. OperationLimiterTest.cpp
  55. OWNERS
  56. params.h
  57. PREUPLOAD.cfg
  58. PrivateDnsCommon.h
  59. PrivateDnsConfiguration.cpp
  60. PrivateDnsConfiguration.h
  61. PrivateDnsConfigurationTest.cpp
  62. PrivateDnsValidationObserver.h
  63. README-DoT.md
  64. README.md
  65. res_cache.cpp
  66. res_comp.cpp
  67. res_comp.h
  68. res_debug.cpp
  69. res_debug.h
  70. res_mkquery.cpp
  71. res_query.cpp
  72. res_send.cpp
  73. res_send.h
  74. res_stats.cpp
  75. resolv_cache.h
  76. resolv_private.h
  77. resolv_rust_test_config_template.xml
  78. resolv_test_config_template.xml
  79. ResolverController.cpp
  80. ResolverController.h
  81. ResolverEventReporter.cpp
  82. ResolverEventReporter.h
  83. ResolverStats.h
  84. sethostent.cpp
  85. stats.h
  86. stats.proto
  87. TEST_MAPPING
  88. util.cpp
  89. util.h
README.md

Logging

This code uses LOG(X) for logging. Log levels are VERBOSE,DEBUG,INFO,WARNING and ERROR. The default setting is WARNING and logs relate to WARNING and ERROR will be shown. If you want to enable the DEBUG level logs, using following command. adb shell service call dnsresolver 10 i32 1 VERBOSE 0 DEBUG 1 INFO 2 WARNING 3 ERROR 4 Verbose resolver logs could contain PII -- do NOT enable in production builds.