Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f0bc27e authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Set UNICAST-RESPONSE bit for mDNS" am: 8bb6da03

Original change: https://android-review.googlesource.com/c/platform/packages/modules/DnsResolver/+/1759091

Change-Id: Idcf3c940f8c32915944bbe9d46a758481deb77fd
parents 67bb6270 8bb6da03
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -1439,6 +1439,11 @@ static int dns_getaddrinfo(const char* name, const addrinfo* pai,


    setMdnsFlag(name, &(res.flags));
    setMdnsFlag(name, &(res.flags));


    if (isMdnsResolution(res.flags)) {
        q.qclass |= C_UNICAST;
        q2.qclass |= C_UNICAST;
    }

    int he;
    int he;
    if (res_searchN(name, &q, &res, &he) < 0) {
    if (res_searchN(name, &q, &res, &he) < 0) {
        // Return h_errno (he) to catch more detailed errors rather than EAI_NODATA.
        // Return h_errno (he) to catch more detailed errors rather than EAI_NODATA.
+2 −1
Original line number Original line Diff line number Diff line
@@ -631,7 +631,8 @@ static int dns_gethtbyname(ResState* res, const char* name, int addr_type, getna
    auto buf = std::make_unique<querybuf>();
    auto buf = std::make_unique<querybuf>();


    int he;
    int he;
    n = res_nsearch(res, name, C_IN, type, buf->buf, (int)sizeof(buf->buf), &he);
    const unsigned qclass = isMdnsResolution(res->flags) ? C_IN | C_UNICAST : C_IN;
    n = res_nsearch(res, name, qclass, type, buf->buf, (int)sizeof(buf->buf), &he);
    if (n < 0) {
    if (n < 0) {
        LOG(DEBUG) << __func__ << ": res_nsearch failed (" << n << ")";
        LOG(DEBUG) << __func__ << ": res_nsearch failed (" << n << ")";
        // Return h_errno (he) to catch more detailed errors rather than EAI_NODATA.
        // Return h_errno (he) to catch more detailed errors rather than EAI_NODATA.
+3 −1
Original line number Original line Diff line number Diff line
@@ -260,6 +260,7 @@ static time_t _time_now(void) {
#define DNS_TYPE_ALL "\00\0377" /* big-endian decimal 255 */
#define DNS_TYPE_ALL "\00\0377" /* big-endian decimal 255 */


#define DNS_CLASS_IN "\00\01" /* big-endian decimal 1 */
#define DNS_CLASS_IN "\00\01" /* big-endian decimal 1 */
#define MDNS_CLASS_UNICAST_IN "\200\01" /* big-endian decimal 32769 */


struct DnsPacket {
struct DnsPacket {
    const uint8_t* base;
    const uint8_t* base;
@@ -374,7 +375,8 @@ static int _dnsPacket_checkQR(DnsPacket* packet) {
        return 0;
        return 0;
    }
    }
    /* CLASS must be IN */
    /* CLASS must be IN */
    if (!_dnsPacket_checkBytes(packet, 2, DNS_CLASS_IN)) {
    if (!_dnsPacket_checkBytes(packet, 2, DNS_CLASS_IN) &&
        !_dnsPacket_checkBytes(packet, 2, MDNS_CLASS_UNICAST_IN)) {
        LOG(INFO) << __func__ << ": unsupported CLASS";
        LOG(INFO) << __func__ << ": unsupported CLASS";
        return 0;
        return 0;
    }
    }
+2 −0
Original line number Original line Diff line number Diff line
@@ -88,6 +88,8 @@ union sockaddr_union {
};
};
constexpr int MAXPACKET = 8 * 1024;
constexpr int MAXPACKET = 8 * 1024;


const unsigned C_UNICAST = 0x8000;  // unicast-response bit for MDNS

struct ResState {
struct ResState {
    ResState(const android_net_context* netcontext, android::net::NetworkDnsEventReported* dnsEvent)
    ResState(const android_net_context* netcontext, android::net::NetworkDnsEventReported* dnsEvent)
        : netid(netcontext->dns_netid),
        : netid(netcontext->dns_netid),
+3 −1
Original line number Original line Diff line number Diff line
@@ -979,8 +979,10 @@ bool DNSResponder::makeResponse(DNSHeader* header, int protocol, char* response,


bool DNSResponder::makeResponseFromAddressOrHostname(DNSHeader* header, char* response,
bool DNSResponder::makeResponseFromAddressOrHostname(DNSHeader* header, char* response,
                                                     size_t* response_len) const {
                                                     size_t* response_len) const {
    const unsigned unicast_bit = 0x8000;  // unicast-response bit for MDNS
    for (const DNSQuestion& question : header->questions) {
    for (const DNSQuestion& question : header->questions) {
        if (question.qclass != ns_class::ns_c_in && question.qclass != ns_class::ns_c_any) {
        if (question.qclass != ns_class::ns_c_in && question.qclass != ns_class::ns_c_any &&
            question.qclass != (unicast_bit | ns_class::ns_c_in)) {
            LOG(INFO) << "unsupported question class " << question.qclass;
            LOG(INFO) << "unsupported question class " << question.qclass;
            return makeErrorResponse(header, ns_rcode::ns_r_notimpl, response, response_len);
            return makeErrorResponse(header, ns_rcode::ns_r_notimpl, response, response_len);
        }
        }