xref: /aosp_15_r20/external/cronet/net/dns/mdns_client.cc (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 #include "net/dns/mdns_client.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "net/base/address_family.h"
8*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
9*6777b538SAndroid Build Coastguard Worker #include "net/base/network_interfaces.h"
10*6777b538SAndroid Build Coastguard Worker #include "net/dns/mdns_client_impl.h"
11*6777b538SAndroid Build Coastguard Worker #include "net/dns/public/util.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_source.h"
14*6777b538SAndroid Build Coastguard Worker 
15*6777b538SAndroid Build Coastguard Worker namespace net {
16*6777b538SAndroid Build Coastguard Worker 
17*6777b538SAndroid Build Coastguard Worker namespace {
18*6777b538SAndroid Build Coastguard Worker 
Bind(AddressFamily address_family,uint32_t interface_index,DatagramServerSocket * socket)19*6777b538SAndroid Build Coastguard Worker int Bind(AddressFamily address_family,
20*6777b538SAndroid Build Coastguard Worker          uint32_t interface_index,
21*6777b538SAndroid Build Coastguard Worker          DatagramServerSocket* socket) {
22*6777b538SAndroid Build Coastguard Worker   socket->AllowAddressSharingForMulticast();
23*6777b538SAndroid Build Coastguard Worker   socket->SetMulticastInterface(interface_index);
24*6777b538SAndroid Build Coastguard Worker 
25*6777b538SAndroid Build Coastguard Worker   int rv = socket->Listen(dns_util::GetMdnsReceiveEndPoint(address_family));
26*6777b538SAndroid Build Coastguard Worker   if (rv < OK)
27*6777b538SAndroid Build Coastguard Worker     return rv;
28*6777b538SAndroid Build Coastguard Worker 
29*6777b538SAndroid Build Coastguard Worker   return socket->JoinGroup(
30*6777b538SAndroid Build Coastguard Worker       dns_util::GetMdnsGroupEndPoint(address_family).address());
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker }  // namespace
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker const base::TimeDelta MDnsTransaction::kTransactionTimeout = base::Seconds(3);
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker // static
CreateDefault()38*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MDnsSocketFactory> MDnsSocketFactory::CreateDefault() {
39*6777b538SAndroid Build Coastguard Worker   return std::make_unique<MDnsSocketFactoryImpl>();
40*6777b538SAndroid Build Coastguard Worker }
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker // static
CreateDefault()43*6777b538SAndroid Build Coastguard Worker std::unique_ptr<MDnsClient> MDnsClient::CreateDefault() {
44*6777b538SAndroid Build Coastguard Worker   return std::make_unique<MDnsClientImpl>();
45*6777b538SAndroid Build Coastguard Worker }
46*6777b538SAndroid Build Coastguard Worker 
GetMDnsInterfacesToBind()47*6777b538SAndroid Build Coastguard Worker InterfaceIndexFamilyList GetMDnsInterfacesToBind() {
48*6777b538SAndroid Build Coastguard Worker   NetworkInterfaceList network_list;
49*6777b538SAndroid Build Coastguard Worker   InterfaceIndexFamilyList interfaces;
50*6777b538SAndroid Build Coastguard Worker   if (!GetNetworkList(&network_list, INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES))
51*6777b538SAndroid Build Coastguard Worker     return interfaces;
52*6777b538SAndroid Build Coastguard Worker   for (const auto& network_interface : network_list) {
53*6777b538SAndroid Build Coastguard Worker     AddressFamily family = GetAddressFamily(network_interface.address);
54*6777b538SAndroid Build Coastguard Worker     if (family == ADDRESS_FAMILY_IPV4 || family == ADDRESS_FAMILY_IPV6) {
55*6777b538SAndroid Build Coastguard Worker       interfaces.emplace_back(network_interface.interface_index, family);
56*6777b538SAndroid Build Coastguard Worker     }
57*6777b538SAndroid Build Coastguard Worker   }
58*6777b538SAndroid Build Coastguard Worker   std::sort(interfaces.begin(), interfaces.end());
59*6777b538SAndroid Build Coastguard Worker   // Interfaces could have multiple addresses. Filter out duplicate entries.
60*6777b538SAndroid Build Coastguard Worker   interfaces.erase(std::unique(interfaces.begin(), interfaces.end()),
61*6777b538SAndroid Build Coastguard Worker                    interfaces.end());
62*6777b538SAndroid Build Coastguard Worker   return interfaces;
63*6777b538SAndroid Build Coastguard Worker }
64*6777b538SAndroid Build Coastguard Worker 
CreateAndBindMDnsSocket(AddressFamily address_family,uint32_t interface_index,NetLog * net_log)65*6777b538SAndroid Build Coastguard Worker std::unique_ptr<DatagramServerSocket> CreateAndBindMDnsSocket(
66*6777b538SAndroid Build Coastguard Worker     AddressFamily address_family,
67*6777b538SAndroid Build Coastguard Worker     uint32_t interface_index,
68*6777b538SAndroid Build Coastguard Worker     NetLog* net_log) {
69*6777b538SAndroid Build Coastguard Worker   auto socket = std::make_unique<UDPServerSocket>(net_log, NetLogSource());
70*6777b538SAndroid Build Coastguard Worker 
71*6777b538SAndroid Build Coastguard Worker   int rv = Bind(address_family, interface_index, socket.get());
72*6777b538SAndroid Build Coastguard Worker   if (rv != OK) {
73*6777b538SAndroid Build Coastguard Worker     socket.reset();
74*6777b538SAndroid Build Coastguard Worker     VLOG(1) << "MDNS bind failed, address_family=" << address_family
75*6777b538SAndroid Build Coastguard Worker             << ", error=" << rv;
76*6777b538SAndroid Build Coastguard Worker   }
77*6777b538SAndroid Build Coastguard Worker   return socket;
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker }  // namespace net
81