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

Commit 32372175 authored by Chiachang Wang's avatar Chiachang Wang
Browse files

Add socket mark info into SSL_connect error

Current log does not specify that the SSL_connect error happened
in which network if there are multiple networks connected. Print
the socket mark for better debugging.

Sample log:
resolv  : SSL_connect ssl error =5, 100, 1, 1, 3, 0: Connection timed out

Bug: 132925257
Test: atest resolv_integration_test
Change-Id: Id691b3590d89bed363aac70f2297d3a734e0a396
parent 514e772a
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -32,7 +32,9 @@
#include "DnsTlsSessionCache.h"
#include "IDnsTlsSocketObserver.h"

#include <Fwmark.h>
#include <android-base/logging.h>
#include <android-base/stringprintf.h>

#include "netdutils/SocketOption.h"
#include "private/android_filesystem_config.h"  // AID_DNS
@@ -63,6 +65,13 @@ int waitForWriting(int fd) {
    return ret;
}

std::string markToFwmarkString(unsigned mMark) {
    Fwmark mark;
    mark.intValue = mMark;
    return android::base::StringPrintf("%d, %d, %d, %d, %d", mark.netId, mark.explicitlySelected,
                                       mark.protectedFromVpn, mark.permission, mark.uidBillingDone);
}

}  // namespace

Status DnsTlsSocket::tcpConnect() {
@@ -223,27 +232,28 @@ bssl::UniquePtr<SSL> DnsTlsSocket::sslConnect(int fd) {
    }

    for (;;) {
        LOG(DEBUG) << mMark << " Calling SSL_connect";
        LOG(DEBUG) << " Calling SSL_connect with " << markToFwmarkString(mMark);
        int ret = SSL_connect(ssl.get());
        LOG(DEBUG) << mMark << " SSL_connect returned " << ret;
        LOG(DEBUG) << " SSL_connect returned " << ret << " with " << markToFwmarkString(mMark);
        if (ret == 1) break;  // SSL handshake complete;

        const int ssl_err = SSL_get_error(ssl.get(), ret);
        switch (ssl_err) {
            case SSL_ERROR_WANT_READ:
                if (waitForReading(fd) != 1) {
                    LOG(WARNING) << "SSL_connect read error: " << errno;
                    PLOG(WARNING) << "SSL_connect read error, " << markToFwmarkString(mMark);
                    return nullptr;
                }
                break;
            case SSL_ERROR_WANT_WRITE:
                if (waitForWriting(fd) != 1) {
                    LOG(WARNING) << "SSL_connect write error";
                    PLOG(WARNING) << "SSL_connect write error, " << markToFwmarkString(mMark);
                    return nullptr;
                }
                break;
            default:
                LOG(WARNING) << "SSL_connect error " << ssl_err << ", errno=" << errno;
                PLOG(WARNING) << "SSL_connect ssl error =" << ssl_err << ", "
                              << markToFwmarkString(mMark);
                return nullptr;
        }
    }