xref: /aosp_15_r20/external/openscreen/discovery/mdns/mdns_service_impl.h (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #ifndef DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_
6*3f982cf4SFabien Sanglard #define DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_
7*3f982cf4SFabien Sanglard 
8*3f982cf4SFabien Sanglard #include <memory>
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard #include "discovery/common/config.h"
11*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_domain_confirmed_provider.h"
12*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_probe_manager.h"
13*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_publisher.h"
14*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_querier.h"
15*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_random.h"
16*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_reader.h"
17*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_receiver.h"
18*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_records.h"
19*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_responder.h"
20*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_sender.h"
21*3f982cf4SFabien Sanglard #include "discovery/mdns/mdns_writer.h"
22*3f982cf4SFabien Sanglard #include "discovery/mdns/public/mdns_constants.h"
23*3f982cf4SFabien Sanglard #include "discovery/mdns/public/mdns_service.h"
24*3f982cf4SFabien Sanglard #include "platform/api/udp_socket.h"
25*3f982cf4SFabien Sanglard 
26*3f982cf4SFabien Sanglard namespace openscreen {
27*3f982cf4SFabien Sanglard 
28*3f982cf4SFabien Sanglard class TaskRunner;
29*3f982cf4SFabien Sanglard 
30*3f982cf4SFabien Sanglard namespace discovery {
31*3f982cf4SFabien Sanglard 
32*3f982cf4SFabien Sanglard class NetworkConfig;
33*3f982cf4SFabien Sanglard class ReportingClient;
34*3f982cf4SFabien Sanglard 
35*3f982cf4SFabien Sanglard class MdnsServiceImpl : public MdnsService, public UdpSocket::Client {
36*3f982cf4SFabien Sanglard  public:
37*3f982cf4SFabien Sanglard   // |task_runner|, |reporting_client|, and |config| must exist for the duration
38*3f982cf4SFabien Sanglard   // of this instance's life.
39*3f982cf4SFabien Sanglard   MdnsServiceImpl(TaskRunner* task_runner,
40*3f982cf4SFabien Sanglard                   ClockNowFunctionPtr now_function,
41*3f982cf4SFabien Sanglard                   ReportingClient* reporting_client,
42*3f982cf4SFabien Sanglard                   const Config& config,
43*3f982cf4SFabien Sanglard                   const InterfaceInfo& network_info);
44*3f982cf4SFabien Sanglard   ~MdnsServiceImpl() override;
45*3f982cf4SFabien Sanglard 
46*3f982cf4SFabien Sanglard   // MdnsService Overrides.
47*3f982cf4SFabien Sanglard   void StartQuery(const DomainName& name,
48*3f982cf4SFabien Sanglard                   DnsType dns_type,
49*3f982cf4SFabien Sanglard                   DnsClass dns_class,
50*3f982cf4SFabien Sanglard                   MdnsRecordChangedCallback* callback) override;
51*3f982cf4SFabien Sanglard   void StopQuery(const DomainName& name,
52*3f982cf4SFabien Sanglard                  DnsType dns_type,
53*3f982cf4SFabien Sanglard                  DnsClass dns_class,
54*3f982cf4SFabien Sanglard                  MdnsRecordChangedCallback* callback) override;
55*3f982cf4SFabien Sanglard   void ReinitializeQueries(const DomainName& name) override;
56*3f982cf4SFabien Sanglard   Error StartProbe(MdnsDomainConfirmedProvider* callback,
57*3f982cf4SFabien Sanglard                    DomainName requested_name,
58*3f982cf4SFabien Sanglard                    IPAddress address) override;
59*3f982cf4SFabien Sanglard 
60*3f982cf4SFabien Sanglard   Error RegisterRecord(const MdnsRecord& record) override;
61*3f982cf4SFabien Sanglard   Error UpdateRegisteredRecord(const MdnsRecord& old_record,
62*3f982cf4SFabien Sanglard                                const MdnsRecord& new_record) override;
63*3f982cf4SFabien Sanglard   Error UnregisterRecord(const MdnsRecord& record) override;
64*3f982cf4SFabien Sanglard 
65*3f982cf4SFabien Sanglard   // UdpSocket::Client overrides.
66*3f982cf4SFabien Sanglard   void OnError(UdpSocket* socket, Error error) override;
67*3f982cf4SFabien Sanglard   void OnSendError(UdpSocket* socket, Error error) override;
68*3f982cf4SFabien Sanglard   void OnRead(UdpSocket* socket, ErrorOr<UdpPacket> packet) override;
69*3f982cf4SFabien Sanglard   void OnBound(UdpSocket* socket) override;
70*3f982cf4SFabien Sanglard 
71*3f982cf4SFabien Sanglard  private:
72*3f982cf4SFabien Sanglard   TaskRunner* const task_runner_;
73*3f982cf4SFabien Sanglard   ClockNowFunctionPtr now_function_;
74*3f982cf4SFabien Sanglard   ReportingClient* const reporting_client_;
75*3f982cf4SFabien Sanglard 
76*3f982cf4SFabien Sanglard   MdnsRandom random_delay_;
77*3f982cf4SFabien Sanglard   MdnsReceiver receiver_;
78*3f982cf4SFabien Sanglard 
79*3f982cf4SFabien Sanglard   // Sockets to send and receive mDNS data.
80*3f982cf4SFabien Sanglard   NetworkInterfaceIndex interface_;
81*3f982cf4SFabien Sanglard   std::unique_ptr<UdpSocket> socket_v4_;
82*3f982cf4SFabien Sanglard   std::unique_ptr<UdpSocket> socket_v6_;
83*3f982cf4SFabien Sanglard 
84*3f982cf4SFabien Sanglard   // unique_ptrs are used for the below objects so that they can be initialized
85*3f982cf4SFabien Sanglard   // in the body of the ctor, after send_socket is initialized.
86*3f982cf4SFabien Sanglard   std::unique_ptr<MdnsSender> sender_;
87*3f982cf4SFabien Sanglard   std::unique_ptr<MdnsQuerier> querier_;
88*3f982cf4SFabien Sanglard   std::unique_ptr<MdnsProbeManagerImpl> probe_manager_;
89*3f982cf4SFabien Sanglard   std::unique_ptr<MdnsPublisher> publisher_;
90*3f982cf4SFabien Sanglard   std::unique_ptr<MdnsResponder> responder_;
91*3f982cf4SFabien Sanglard };
92*3f982cf4SFabien Sanglard 
93*3f982cf4SFabien Sanglard }  // namespace discovery
94*3f982cf4SFabien Sanglard }  // namespace openscreen
95*3f982cf4SFabien Sanglard 
96*3f982cf4SFabien Sanglard #endif  // DISCOVERY_MDNS_MDNS_SERVICE_IMPL_H_
97