xref: /aosp_15_r20/external/cronet/net/dns/mdns_client.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2013 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef NET_DNS_MDNS_CLIENT_H_
6*6777b538SAndroid Build Coastguard Worker #define NET_DNS_MDNS_CLIENT_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <stdint.h>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include <memory>
11*6777b538SAndroid Build Coastguard Worker #include <string>
12*6777b538SAndroid Build Coastguard Worker #include <utility>
13*6777b538SAndroid Build Coastguard Worker #include <vector>
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
16*6777b538SAndroid Build Coastguard Worker #include "base/time/time.h"
17*6777b538SAndroid Build Coastguard Worker #include "net/base/ip_endpoint.h"
18*6777b538SAndroid Build Coastguard Worker #include "net/base/net_export.h"
19*6777b538SAndroid Build Coastguard Worker #include "net/dns/dns_query.h"
20*6777b538SAndroid Build Coastguard Worker #include "net/dns/dns_response.h"
21*6777b538SAndroid Build Coastguard Worker #include "net/dns/record_parsed.h"
22*6777b538SAndroid Build Coastguard Worker 
23*6777b538SAndroid Build Coastguard Worker namespace net {
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker class DatagramServerSocket;
26*6777b538SAndroid Build Coastguard Worker class NetLog;
27*6777b538SAndroid Build Coastguard Worker class RecordParsed;
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker // Represents a one-time record lookup. A transaction takes one
30*6777b538SAndroid Build Coastguard Worker // associated callback (see |MDnsClient::CreateTransaction|) and calls it
31*6777b538SAndroid Build Coastguard Worker // whenever a matching record has been found, either from the cache or
32*6777b538SAndroid Build Coastguard Worker // by querying the network (it may choose to query either or both based on its
33*6777b538SAndroid Build Coastguard Worker // creation flags, see MDnsTransactionFlags). Network-based transactions will
34*6777b538SAndroid Build Coastguard Worker // time out after a reasonable number of seconds.
35*6777b538SAndroid Build Coastguard Worker class NET_EXPORT MDnsTransaction {
36*6777b538SAndroid Build Coastguard Worker  public:
37*6777b538SAndroid Build Coastguard Worker   static const base::TimeDelta kTransactionTimeout;
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   // Used to signify what type of result the transaction has received.
40*6777b538SAndroid Build Coastguard Worker   enum Result {
41*6777b538SAndroid Build Coastguard Worker     // Passed whenever a record is found.
42*6777b538SAndroid Build Coastguard Worker     RESULT_RECORD,
43*6777b538SAndroid Build Coastguard Worker     // The transaction is done. Applies to non-single-valued transactions. Is
44*6777b538SAndroid Build Coastguard Worker     // called when the transaction has finished (this is the last call to the
45*6777b538SAndroid Build Coastguard Worker     // callback).
46*6777b538SAndroid Build Coastguard Worker     RESULT_DONE,
47*6777b538SAndroid Build Coastguard Worker     // No results have been found. Applies to single-valued transactions. Is
48*6777b538SAndroid Build Coastguard Worker     // called when the transaction has finished without finding any results.
49*6777b538SAndroid Build Coastguard Worker     // For transactions that use the network, this happens when a timeout
50*6777b538SAndroid Build Coastguard Worker     // occurs, for transactions that are cache-only, this happens when no
51*6777b538SAndroid Build Coastguard Worker     // results are in the cache.
52*6777b538SAndroid Build Coastguard Worker     RESULT_NO_RESULTS,
53*6777b538SAndroid Build Coastguard Worker     // Called when an NSec record is read for this transaction's
54*6777b538SAndroid Build Coastguard Worker     // query. This means there cannot possibly be a record of the type
55*6777b538SAndroid Build Coastguard Worker     // and name for this transaction.
56*6777b538SAndroid Build Coastguard Worker     RESULT_NSEC
57*6777b538SAndroid Build Coastguard Worker   };
58*6777b538SAndroid Build Coastguard Worker 
59*6777b538SAndroid Build Coastguard Worker   // Used when creating an MDnsTransaction.
60*6777b538SAndroid Build Coastguard Worker   enum Flags {
61*6777b538SAndroid Build Coastguard Worker     // Transaction should return only one result, and stop listening after it.
62*6777b538SAndroid Build Coastguard Worker     // Note that single result transactions will signal when their timeout is
63*6777b538SAndroid Build Coastguard Worker     // reached, whereas multi-result transactions will not.
64*6777b538SAndroid Build Coastguard Worker     SINGLE_RESULT = 1 << 0,
65*6777b538SAndroid Build Coastguard Worker     // Query the cache or the network. May both be used. One must be present.
66*6777b538SAndroid Build Coastguard Worker     QUERY_CACHE = 1 << 1,
67*6777b538SAndroid Build Coastguard Worker     QUERY_NETWORK = 1 << 2,
68*6777b538SAndroid Build Coastguard Worker     // TODO(noamsml): Add flag for flushing cache when feature is implemented
69*6777b538SAndroid Build Coastguard Worker     // Mask of all possible flags on MDnsTransaction.
70*6777b538SAndroid Build Coastguard Worker     FLAG_MASK = (1 << 3) - 1,
71*6777b538SAndroid Build Coastguard Worker   };
72*6777b538SAndroid Build Coastguard Worker 
73*6777b538SAndroid Build Coastguard Worker   typedef base::RepeatingCallback<void(Result, const RecordParsed*)>
74*6777b538SAndroid Build Coastguard Worker       ResultCallback;
75*6777b538SAndroid Build Coastguard Worker 
76*6777b538SAndroid Build Coastguard Worker   // Destroying the transaction cancels it.
77*6777b538SAndroid Build Coastguard Worker   virtual ~MDnsTransaction() = default;
78*6777b538SAndroid Build Coastguard Worker 
79*6777b538SAndroid Build Coastguard Worker   // Start the transaction. Return true on success. Cache-based transactions
80*6777b538SAndroid Build Coastguard Worker   // will execute the callback synchronously.
81*6777b538SAndroid Build Coastguard Worker   virtual bool Start() = 0;
82*6777b538SAndroid Build Coastguard Worker 
83*6777b538SAndroid Build Coastguard Worker   // Get the host or service name for the transaction.
84*6777b538SAndroid Build Coastguard Worker   virtual const std::string& GetName() const = 0;
85*6777b538SAndroid Build Coastguard Worker 
86*6777b538SAndroid Build Coastguard Worker   // Get the type for this transaction (SRV, TXT, A, AAA, etc)
87*6777b538SAndroid Build Coastguard Worker   virtual uint16_t GetType() const = 0;
88*6777b538SAndroid Build Coastguard Worker };
89*6777b538SAndroid Build Coastguard Worker 
90*6777b538SAndroid Build Coastguard Worker // A listener listens for updates regarding a specific record or set of records.
91*6777b538SAndroid Build Coastguard Worker // Created by the MDnsClient (see |MDnsClient::CreateListener|) and used to keep
92*6777b538SAndroid Build Coastguard Worker // track of listeners.
93*6777b538SAndroid Build Coastguard Worker //
94*6777b538SAndroid Build Coastguard Worker // TODO([email protected]): Consider moving this inside MDnsClient to better
95*6777b538SAndroid Build Coastguard Worker // organize the namespace and avoid confusion with
96*6777b538SAndroid Build Coastguard Worker // net::HostResolver::MdnsListener.
97*6777b538SAndroid Build Coastguard Worker class NET_EXPORT MDnsListener {
98*6777b538SAndroid Build Coastguard Worker  public:
99*6777b538SAndroid Build Coastguard Worker   // Used in the MDnsListener delegate to signify what type of change has been
100*6777b538SAndroid Build Coastguard Worker   // made to a record.
101*6777b538SAndroid Build Coastguard Worker   enum UpdateType {
102*6777b538SAndroid Build Coastguard Worker     RECORD_ADDED,
103*6777b538SAndroid Build Coastguard Worker     RECORD_CHANGED,
104*6777b538SAndroid Build Coastguard Worker     RECORD_REMOVED
105*6777b538SAndroid Build Coastguard Worker   };
106*6777b538SAndroid Build Coastguard Worker 
107*6777b538SAndroid Build Coastguard Worker   class Delegate {
108*6777b538SAndroid Build Coastguard Worker    public:
109*6777b538SAndroid Build Coastguard Worker     virtual ~Delegate() = default;
110*6777b538SAndroid Build Coastguard Worker 
111*6777b538SAndroid Build Coastguard Worker     // Called when a record is added, removed or updated.
112*6777b538SAndroid Build Coastguard Worker     virtual void OnRecordUpdate(UpdateType update,
113*6777b538SAndroid Build Coastguard Worker                                 const RecordParsed* record) = 0;
114*6777b538SAndroid Build Coastguard Worker 
115*6777b538SAndroid Build Coastguard Worker     // Called when a record is marked nonexistent by an NSEC record.
116*6777b538SAndroid Build Coastguard Worker     virtual void OnNsecRecord(const std::string& name, unsigned type) = 0;
117*6777b538SAndroid Build Coastguard Worker 
118*6777b538SAndroid Build Coastguard Worker     // Called when the cache is purged (due, for example, ot the network
119*6777b538SAndroid Build Coastguard Worker     // disconnecting).
120*6777b538SAndroid Build Coastguard Worker     virtual void OnCachePurged() = 0;
121*6777b538SAndroid Build Coastguard Worker   };
122*6777b538SAndroid Build Coastguard Worker 
123*6777b538SAndroid Build Coastguard Worker   // Destroying the listener stops listening.
124*6777b538SAndroid Build Coastguard Worker   virtual ~MDnsListener() = default;
125*6777b538SAndroid Build Coastguard Worker 
126*6777b538SAndroid Build Coastguard Worker   // Start the listener. Return true on success.
127*6777b538SAndroid Build Coastguard Worker   virtual bool Start() = 0;
128*6777b538SAndroid Build Coastguard Worker 
129*6777b538SAndroid Build Coastguard Worker   // Actively refresh any received records.
130*6777b538SAndroid Build Coastguard Worker   virtual void SetActiveRefresh(bool active_refresh) = 0;
131*6777b538SAndroid Build Coastguard Worker 
132*6777b538SAndroid Build Coastguard Worker   // Get the host or service name for this query.
133*6777b538SAndroid Build Coastguard Worker   // Return an empty string for no name.
134*6777b538SAndroid Build Coastguard Worker   virtual const std::string& GetName() const = 0;
135*6777b538SAndroid Build Coastguard Worker 
136*6777b538SAndroid Build Coastguard Worker   // Get the type for this query (SRV, TXT, A, AAA, etc)
137*6777b538SAndroid Build Coastguard Worker   virtual uint16_t GetType() const = 0;
138*6777b538SAndroid Build Coastguard Worker };
139*6777b538SAndroid Build Coastguard Worker 
140*6777b538SAndroid Build Coastguard Worker // Creates bound datagram sockets ready to use by MDnsClient.
141*6777b538SAndroid Build Coastguard Worker class NET_EXPORT MDnsSocketFactory {
142*6777b538SAndroid Build Coastguard Worker  public:
143*6777b538SAndroid Build Coastguard Worker   virtual ~MDnsSocketFactory() = default;
144*6777b538SAndroid Build Coastguard Worker   virtual void CreateSockets(
145*6777b538SAndroid Build Coastguard Worker       std::vector<std::unique_ptr<DatagramServerSocket>>* sockets) = 0;
146*6777b538SAndroid Build Coastguard Worker 
147*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MDnsSocketFactory> CreateDefault();
148*6777b538SAndroid Build Coastguard Worker };
149*6777b538SAndroid Build Coastguard Worker 
150*6777b538SAndroid Build Coastguard Worker // Listens for Multicast DNS on the local network. You can access information
151*6777b538SAndroid Build Coastguard Worker // regarding multicast DNS either by creating an |MDnsListener| to be notified
152*6777b538SAndroid Build Coastguard Worker // of new records, or by creating an |MDnsTransaction| to look up the value of a
153*6777b538SAndroid Build Coastguard Worker // specific records. When all listeners and active transactions are destroyed,
154*6777b538SAndroid Build Coastguard Worker // the client stops listening on the network and destroys the cache.
155*6777b538SAndroid Build Coastguard Worker class NET_EXPORT MDnsClient {
156*6777b538SAndroid Build Coastguard Worker  public:
157*6777b538SAndroid Build Coastguard Worker   virtual ~MDnsClient() = default;
158*6777b538SAndroid Build Coastguard Worker 
159*6777b538SAndroid Build Coastguard Worker   // Create listener object for RRType |rrtype| and name |name|.
160*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<MDnsListener> CreateListener(
161*6777b538SAndroid Build Coastguard Worker       uint16_t rrtype,
162*6777b538SAndroid Build Coastguard Worker       const std::string& name,
163*6777b538SAndroid Build Coastguard Worker       MDnsListener::Delegate* delegate) = 0;
164*6777b538SAndroid Build Coastguard Worker 
165*6777b538SAndroid Build Coastguard Worker   // Create a transaction that can be used to query either the MDns cache, the
166*6777b538SAndroid Build Coastguard Worker   // network, or both for records of type |rrtype| and name |name|. |flags| is
167*6777b538SAndroid Build Coastguard Worker   // defined by MDnsTransactionFlags.
168*6777b538SAndroid Build Coastguard Worker   virtual std::unique_ptr<MDnsTransaction> CreateTransaction(
169*6777b538SAndroid Build Coastguard Worker       uint16_t rrtype,
170*6777b538SAndroid Build Coastguard Worker       const std::string& name,
171*6777b538SAndroid Build Coastguard Worker       int flags,
172*6777b538SAndroid Build Coastguard Worker       const MDnsTransaction::ResultCallback& callback) = 0;
173*6777b538SAndroid Build Coastguard Worker 
174*6777b538SAndroid Build Coastguard Worker   virtual int StartListening(MDnsSocketFactory* factory) = 0;
175*6777b538SAndroid Build Coastguard Worker 
176*6777b538SAndroid Build Coastguard Worker   // Do not call this inside callbacks from related MDnsListener and
177*6777b538SAndroid Build Coastguard Worker   // MDnsTransaction objects.
178*6777b538SAndroid Build Coastguard Worker   virtual void StopListening() = 0;
179*6777b538SAndroid Build Coastguard Worker   virtual bool IsListening() const = 0;
180*6777b538SAndroid Build Coastguard Worker 
181*6777b538SAndroid Build Coastguard Worker   // Create the default MDnsClient
182*6777b538SAndroid Build Coastguard Worker   static std::unique_ptr<MDnsClient> CreateDefault();
183*6777b538SAndroid Build Coastguard Worker };
184*6777b538SAndroid Build Coastguard Worker 
185*6777b538SAndroid Build Coastguard Worker // Gets the endpoint for the multicast group a socket should join to receive
186*6777b538SAndroid Build Coastguard Worker // MDNS messages. Such sockets should also bind to the endpoint from
187*6777b538SAndroid Build Coastguard Worker // GetMDnsReceiveEndPoint().
188*6777b538SAndroid Build Coastguard Worker //
189*6777b538SAndroid Build Coastguard Worker // This is also the endpoint messages should be sent to to send MDNS messages.
190*6777b538SAndroid Build Coastguard Worker NET_EXPORT IPEndPoint GetMDnsGroupEndPoint(AddressFamily address_family);
191*6777b538SAndroid Build Coastguard Worker 
192*6777b538SAndroid Build Coastguard Worker // Gets the endpoint sockets should be bound to to receive MDNS messages. Such
193*6777b538SAndroid Build Coastguard Worker // sockets should also join the multicast group from GetMDnsGroupEndPoint().
194*6777b538SAndroid Build Coastguard Worker NET_EXPORT IPEndPoint GetMDnsReceiveEndPoint(AddressFamily address_family);
195*6777b538SAndroid Build Coastguard Worker 
196*6777b538SAndroid Build Coastguard Worker typedef std::vector<std::pair<uint32_t, AddressFamily>>
197*6777b538SAndroid Build Coastguard Worker     InterfaceIndexFamilyList;
198*6777b538SAndroid Build Coastguard Worker // Returns pairs of interface and address family to bind. Current
199*6777b538SAndroid Build Coastguard Worker // implementation returns unique list of all available interfaces.
200*6777b538SAndroid Build Coastguard Worker NET_EXPORT InterfaceIndexFamilyList GetMDnsInterfacesToBind();
201*6777b538SAndroid Build Coastguard Worker 
202*6777b538SAndroid Build Coastguard Worker // Create sockets, binds socket to MDns endpoint, and sets multicast interface
203*6777b538SAndroid Build Coastguard Worker // and joins multicast group on for |interface_index|.
204*6777b538SAndroid Build Coastguard Worker // Returns NULL if failed.
205*6777b538SAndroid Build Coastguard Worker NET_EXPORT std::unique_ptr<DatagramServerSocket> CreateAndBindMDnsSocket(
206*6777b538SAndroid Build Coastguard Worker     AddressFamily address_family,
207*6777b538SAndroid Build Coastguard Worker     uint32_t interface_index,
208*6777b538SAndroid Build Coastguard Worker     NetLog* net_log);
209*6777b538SAndroid Build Coastguard Worker 
210*6777b538SAndroid Build Coastguard Worker }  // namespace net
211*6777b538SAndroid Build Coastguard Worker 
212*6777b538SAndroid Build Coastguard Worker #endif  // NET_DNS_MDNS_CLIENT_H_
213