| // Copyright 2022 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "services/network/broker_helper_win.h" |
| |
| #include "base/no_destructor.h" |
| #include "base/threading/thread_local.h" |
| #include "net/base/ip_address.h" |
| #include "net/base/network_change_notifier.h" |
| #include "net/base/network_interfaces.h" |
| |
| namespace network { |
| |
| BrokerHelperWin::BrokerHelperWin() { |
| net::NetworkChangeNotifier::AddNetworkChangeObserver(this); |
| RefreshNetworkList(); |
| } |
| |
| BrokerHelperWin::~BrokerHelperWin() { |
| net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this); |
| } |
| |
| void BrokerHelperWin::OnNetworkChanged( |
| net::NetworkChangeNotifier::ConnectionType type) { |
| RefreshNetworkList(); |
| } |
| |
| void BrokerHelperWin::RefreshNetworkList() { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| net::NetworkInterfaceList network_interfaces; |
| bool result = GetNetworkList(&network_interfaces, |
| net::INCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES); |
| if (result) |
| interfaces_ = std::move(network_interfaces); |
| } |
| |
| bool BrokerHelperWin::ShouldBroker(const net::IPAddress& address) const { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| if (delegate_) { |
| return delegate_->ShouldBroker(); |
| } |
| if (address.IsLoopback()) |
| return true; |
| |
| for (const auto& network_interface : interfaces_) { |
| if (network_interface.address == address) |
| return true; |
| } |
| return false; |
| } |
| |
| } // namespace network |