blob: 7b7f81f17483c236efc2b21e61cd8b566a45395c [file] [log] [blame]
Mike Yubab3daa2018-10-19 22:11:43 +08001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef _DNS_DNSTLSTRANSPORT_H
18#define _DNS_DNSTLSTRANSPORT_H
19
20#include <future>
21#include <map>
22#include <mutex>
23#include <vector>
24
25#include <android-base/thread_annotations.h>
26#include <android-base/unique_fd.h>
Bernie Innocentiec4219b2019-01-30 11:16:36 +090027#include <netdutils/Slice.h>
Mike Yubab3daa2018-10-19 22:11:43 +080028
29#include "DnsTlsQueryMap.h"
30#include "DnsTlsServer.h"
31#include "DnsTlsSessionCache.h"
32#include "IDnsTlsSocket.h"
33#include "IDnsTlsSocketObserver.h"
Mike Yubab3daa2018-10-19 22:11:43 +080034
35namespace android {
36namespace net {
37
38class IDnsTlsSocketFactory;
39
40// Manages at most one DnsTlsSocket at a time. This class handles socket lifetime issues,
41// such as reopening the socket and reissuing pending queries.
Mike Yub601ff72018-11-01 20:07:00 +080042class DnsTlsTransport : public IDnsTlsSocketObserver {
43 public:
Mike Yubab3daa2018-10-19 22:11:43 +080044 DnsTlsTransport(const DnsTlsServer& server, unsigned mark,
Bernie Innocentiec4219b2019-01-30 11:16:36 +090045 IDnsTlsSocketFactory* _Nonnull factory)
46 : mMark(mark), mServer(server), mFactory(factory) {}
Mike Yubab3daa2018-10-19 22:11:43 +080047 ~DnsTlsTransport();
48
Mike Yubd136992019-12-04 15:01:07 +080049 using Response = DnsTlsQueryMap::Response;
50 using Result = DnsTlsQueryMap::Result;
Mike Yubab3daa2018-10-19 22:11:43 +080051
52 // Given a |query|, this method sends it to the server and returns the result asynchronously.
53 std::future<Result> query(const netdutils::Slice query) EXCLUDES(mLock);
54
Mike Yu74770542020-12-15 14:25:21 +080055 // Check that a given TLS server is fully working with a specified mark.
waynema0e73c2e2019-07-31 15:04:08 +080056 // This function is used in ResolverController to ensure that we don't enable DNS over TLS
57 // on networks where it doesn't actually work.
Mike Yu74770542020-12-15 14:25:21 +080058 static bool validate(const DnsTlsServer& server, uint32_t mark);
Mike Yubab3daa2018-10-19 22:11:43 +080059
Mike Yu1fea18c2019-12-06 10:59:17 +080060 int getConnectCounter() const EXCLUDES(mLock);
Mike Yucb2bb7c2019-11-22 20:42:13 +080061
Mike Yubab3daa2018-10-19 22:11:43 +080062 // Implement IDnsTlsSocketObserver
63 void onResponse(std::vector<uint8_t> response) override;
64 void onClosed() override EXCLUDES(mLock);
65
Bernie Innocentiec4219b2019-01-30 11:16:36 +090066 private:
Mike Yucb2bb7c2019-11-22 20:42:13 +080067 mutable std::mutex mLock;
Mike Yubab3daa2018-10-19 22:11:43 +080068
69 DnsTlsSessionCache mCache;
70 DnsTlsQueryMap mQueries;
71
72 const unsigned mMark; // Socket mark
73 const DnsTlsServer mServer;
74 IDnsTlsSocketFactory* _Nonnull const mFactory;
75
76 void doConnect() REQUIRES(mLock);
77
78 // doReconnect is used by onClosed. It runs on the reconnect thread.
79 void doReconnect() EXCLUDES(mLock);
80 std::unique_ptr<std::thread> mReconnectThread GUARDED_BY(mLock);
81
82 // Used to prevent onClosed from starting a reconnect during the destructor.
83 bool mClosing GUARDED_BY(mLock) = false;
84
85 // Sending queries on the socket is thread-safe, but construction/destruction is not.
86 std::unique_ptr<IDnsTlsSocket> mSocket GUARDED_BY(mLock);
87
88 // Send a query to the socket.
Mike Yu7e08b852019-10-18 18:27:43 +080089 bool sendQuery(const DnsTlsQueryMap::Query& q) REQUIRES(mLock);
Mike Yucb2bb7c2019-11-22 20:42:13 +080090
91 // The number of times an attempt to connect the nameserver.
Mike Yu1fea18c2019-12-06 10:59:17 +080092 int mConnectCounter GUARDED_BY(mLock) = 0;
Mike Yubab3daa2018-10-19 22:11:43 +080093};
94
95} // end of namespace net
96} // end of namespace android
97
98#endif // _DNS_DNSTLSTRANSPORT_H