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