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

Commit 3b791985 authored by chenbruce's avatar chenbruce
Browse files

Add sockets for mDns .local resolution testing

In DnsResponder, modifying createListeningSocket() to add sockets
to handle mDns packets.

Bug: 140857615
Test: cd packages/modules/DnsResolver && atest
Change-Id: I533c26d681586284f78e5ed571af632c3ebda049
parent ceb3c025
Loading
Loading
Loading
Loading
+75 −25
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
#include <netdutils/Slice.h>
#include <netdutils/SocketOption.h>

using android::base::unique_fd;
using android::netdutils::BackoffSequence;
using android::netdutils::enableSockopt;
using android::netdutils::ScopedAddrinfo;
@@ -587,6 +588,9 @@ void DNSResponder::setTtl(unsigned ttl) {
}

bool DNSResponder::running() const {
    if (listen_service_ == kDefaultMdnsListenService)
        return udp_socket_.ok();
    else
        return (udp_socket_.ok()) && (tcp_socket_.ok());
}

@@ -602,6 +606,7 @@ bool DNSResponder::startServer() {
        return false;
    }

    if (listen_service_ != kDefaultMdnsListenService) {
        if (tcp_socket_ = createListeningSocket(SOCK_STREAM); tcp_socket_.get() < 0) {
            PLOG(ERROR) << "failed to create TCP socket";
            return false;
@@ -611,6 +616,7 @@ bool DNSResponder::startServer() {
            PLOG(ERROR) << "failed to listen TCP socket";
            return false;
        }
    }

    // Set up eventfd socket.
    event_fd_.reset(eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC));
@@ -632,11 +638,13 @@ bool DNSResponder::startServer() {
        return false;
    }

    if (listen_service_ != kDefaultMdnsListenService) {
        LOG(INFO) << "adding TCP socket to epoll";
        if (!addFd(tcp_socket_.get(), EPOLLIN)) {
            LOG(ERROR) << "failed to add the TCP socket to epoll";
            return false;
        }
    }

    LOG(INFO) << "adding eventfd to epoll";
    if (!addFd(event_fd_.get(), EPOLLIN)) {
@@ -1093,7 +1101,7 @@ void DNSResponder::handleQuery(int protocol) {
    sockaddr_storage sa;
    socklen_t sa_len = sizeof(sa);
    ssize_t len = 0;
    android::base::unique_fd tcpFd;
    unique_fd tcpFd;
    switch (protocol) {
        case IPPROTO_UDP:
            do {
@@ -1209,7 +1217,7 @@ void DNSResponder::handleEventFd() {
    }
}

android::base::unique_fd DNSResponder::createListeningSocket(int socket_type) {
unique_fd DNSResponder::createListeningSocket(int socket_type) {
    addrinfo ai_hints{
            .ai_flags = AI_PASSIVE,
            .ai_family = AF_UNSPEC,
@@ -1225,17 +1233,58 @@ android::base::unique_fd DNSResponder::createListeningSocket(int socket_type) {
        return {};
    }
    for (const addrinfo* ai = ai_res; ai; ai = ai->ai_next) {
        android::base::unique_fd fd(
                socket(ai->ai_family, ai->ai_socktype | SOCK_NONBLOCK, ai->ai_protocol));
        unique_fd fd(socket(ai->ai_family, ai->ai_socktype | SOCK_NONBLOCK, ai->ai_protocol));
        if (fd.get() < 0) {
            PLOG(ERROR) << "ignore creating socket failed";
            continue;
        }
        enableSockopt(fd.get(), SOL_SOCKET, SO_REUSEPORT).ignoreError();

        enableSockopt(fd.get(), SOL_SOCKET, SO_REUSEADDR).ignoreError();
        const std::string host_str = addr2str(ai->ai_addr, ai->ai_addrlen);
        if ((listen_service_ == kDefaultMdnsListenService) && (socket_type == SOCK_DGRAM)) {
            const int mdns_port = 5353;
            const char mdns_multiaddrv4[] = "224.0.0.251";
            const char mdns_multiaddrv6[] = "ff02::fb";
            if (ai_res->ai_family == AF_INET) {
                // Join the MDNS IPV4 multicast group
                struct ip_mreq mreq;
                mreq.imr_multiaddr.s_addr = inet_addr(mdns_multiaddrv4);
                mreq.imr_interface.s_addr = inet_addr(host_str.c_str());
                if (setsockopt(fd.get(), IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq,
                               sizeof(struct ip_mreq)) == -1) {
                    LOG(ERROR) << "Error set setsockopt for IP_ADD_MEMBERSHIP ";
                    return {};
                }
                struct sockaddr_in addr = {.sin_family = AF_INET,
                                           .sin_port = htons(mdns_port),
                                           .sin_addr = {INADDR_ANY}};
                if (bindSocket(fd.get(), (struct sockaddr*)&addr, sizeof(addr))) {
                    LOG(ERROR) << "Unable to bind socket to interface.";
                    return {};
                }
            } else if (ai_res->ai_family == AF_INET6) {
                // Join the MDNS IPV6 multicast group
                struct ipv6_mreq mreqv6;
                inet_pton(AF_INET6, mdns_multiaddrv6, &mreqv6.ipv6mr_multiaddr.s6_addr);
                mreqv6.ipv6mr_interface = 0;
                if (setsockopt(fd.get(), IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreqv6, sizeof(mreqv6)) ==
                    -1) {
                    LOG(ERROR) << "Error set setsockopt for IPV6_JOIN_GROUP ";
                    return {};
                }
                struct sockaddr_in6 addr = {
                        .sin6_family = AF_INET6,
                        .sin6_port = htons(mdns_port),
                        .sin6_addr = IN6ADDR_ANY_INIT,
                };
                if (bindSocket(fd.get(), (struct sockaddr*)&addr, sizeof(addr))) {
                    LOG(ERROR) << "Unable to bind socket to interface.MDNS IPV6";
                    return {};
                }
            }
            return fd;
        } else {
            const char* socket_str = (socket_type == SOCK_STREAM) ? "TCP" : "UDP";

            if (bindSocket(fd.get(), ai->ai_addr, ai->ai_addrlen)) {
                PLOG(ERROR) << "failed to bind " << socket_str << " " << host_str << ":"
                            << listen_service_;
@@ -1244,6 +1293,7 @@ android::base::unique_fd DNSResponder::createListeningSocket(int socket_type) {
            LOG(INFO) << "bound to " << socket_str << " " << host_str << ":" << listen_service_;
            return fd;
        }
    }
    return {};
}

+1 −0
Original line number Diff line number Diff line
@@ -118,6 +118,7 @@ struct DNSHeader {

inline const std::string kDefaultListenAddr = "127.0.0.3";
inline const std::string kDefaultListenService = "53";
inline const std::string kDefaultMdnsListenService = "5353";
inline const ns_rcode kDefaultErrorCode = ns_rcode::ns_r_servfail;

/*