diff options
Diffstat (limited to 'chromium/services/network/p2p')
-rw-r--r-- | chromium/services/network/p2p/socket.h | 5 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_manager.cc | 15 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_manager.h | 3 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_tcp.cc | 13 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_tcp.h | 3 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_tcp_server.cc | 10 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_tcp_server.h | 3 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_tcp_server_unittest.cc | 4 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_tcp_unittest.cc | 101 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_udp.cc | 3 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_udp.h | 3 | ||||
-rw-r--r-- | chromium/services/network/p2p/socket_udp_unittest.cc | 16 |
12 files changed, 152 insertions, 27 deletions
diff --git a/chromium/services/network/p2p/socket.h b/chromium/services/network/p2p/socket.h index 3904fb6414a..63a42ac6b29 100644 --- a/chromium/services/network/p2p/socket.h +++ b/chromium/services/network/p2p/socket.h @@ -26,6 +26,7 @@ namespace net { class NetLog; +class NetworkIsolationKey; } namespace network { @@ -79,10 +80,12 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocket : public mojom::P2PSocket { // in the valid range. // If |local_address.port()| is nonzero and not in the valid range, // initialization will fail. + // |network_isolation_key| specifies the network stack cache shard to used. virtual void Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, - const P2PHostAndIPEndPoint& remote_address) = 0; + const P2PHostAndIPEndPoint& remote_address, + const net::NetworkIsolationKey& network_isolation_key) = 0; mojo::PendingRemote<mojom::P2PSocketClient> ReleaseClientForTesting(); mojo::PendingReceiver<mojom::P2PSocket> ReleaseReceiverForTesting(); diff --git a/chromium/services/network/p2p/socket_manager.cc b/chromium/services/network/p2p/socket_manager.cc index 56dc77eddb7..8b149110739 100644 --- a/chromium/services/network/p2p/socket_manager.cc +++ b/chromium/services/network/p2p/socket_manager.cc @@ -15,6 +15,7 @@ #include "net/base/address_list.h" #include "net/base/net_errors.h" #include "net/base/network_interfaces.h" +#include "net/base/network_isolation_key.h" #include "net/base/sys_addrinfo.h" #include "net/dns/host_resolver.h" #include "net/log/net_log_source.h" @@ -79,7 +80,9 @@ class P2PSocketManager::DnsRequest { DnsRequest(net::HostResolver* host_resolver, bool enable_mdns) : resolver_(host_resolver), enable_mdns_(enable_mdns) {} - void Resolve(const std::string& host_name, DoneCallback done_callback) { + void Resolve(const std::string& host_name, + const net::NetworkIsolationKey& network_isolation_key, + DoneCallback done_callback) { DCHECK(!done_callback.is_null()); host_name_ = host_name; @@ -107,8 +110,8 @@ class P2PSocketManager::DnsRequest { parameters.source = net::HostResolverSource::MULTICAST_DNS; #endif // ENABLE_MDNS } - request_ = - resolver_->CreateRequest(host, net::NetLogWithSource(), parameters); + request_ = resolver_->CreateRequest(host, network_isolation_key, + net::NetLogWithSource(), parameters); int result = request_->Start(base::BindOnce( &P2PSocketManager::DnsRequest::OnDone, base::Unretained(this))); @@ -144,6 +147,7 @@ class P2PSocketManager::DnsRequest { }; P2PSocketManager::P2PSocketManager( + const net::NetworkIsolationKey& network_isolation_key, mojo::PendingRemote<mojom::P2PTrustedSocketManagerClient> trusted_socket_manager_client, mojo::PendingReceiver<mojom::P2PTrustedSocketManager> @@ -153,6 +157,7 @@ P2PSocketManager::P2PSocketManager( net::URLRequestContext* url_request_context) : delete_callback_(std::move(delete_callback)), url_request_context_(url_request_context), + network_isolation_key_(network_isolation_key), network_list_task_runner_(base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::USER_VISIBLE})), trusted_socket_manager_client_(std::move(trusted_socket_manager_client)), @@ -286,7 +291,7 @@ void P2PSocketManager::GetHostAddress( DnsRequest* request_ptr = request.get(); dns_requests_.insert(std::move(request)); request_ptr->Resolve( - host_name, + host_name, network_isolation_key_, base::BindOnce(&P2PSocketManager::OnAddressResolved, base::Unretained(this), request_ptr, std::move(callback))); } @@ -327,7 +332,7 @@ void P2PSocketManager::CreateSocket( // Init() may call SocketManager::DestroySocket(), so it must be called after // adding the socket to |sockets_|. socket_ptr->Init(local_address, port_range.min_port, port_range.max_port, - remote_address); + remote_address, network_isolation_key_); } void P2PSocketManager::StartRtpDump(bool incoming, bool outgoing) { diff --git a/chromium/services/network/p2p/socket_manager.h b/chromium/services/network/p2p/socket_manager.h index f6e793fa556..79f6546cf68 100644 --- a/chromium/services/network/p2p/socket_manager.h +++ b/chromium/services/network/p2p/socket_manager.h @@ -26,6 +26,7 @@ #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" #include "net/base/network_change_notifier.h" +#include "net/base/network_isolation_key.h" #include "services/network/p2p/socket.h" #include "services/network/p2p/socket_throttler.h" #include "services/network/public/cpp/p2p_socket_type.h" @@ -58,6 +59,7 @@ class P2PSocketManager // P2PSocketManager. The P2PSocketManager must be destroyed before the // |url_request_context|. P2PSocketManager( + const net::NetworkIsolationKey& network_isolation_key, mojo::PendingRemote<mojom::P2PTrustedSocketManagerClient> trusted_socket_manager_client, mojo::PendingReceiver<mojom::P2PTrustedSocketManager> @@ -121,6 +123,7 @@ class P2PSocketManager DeleteCallback delete_callback_; net::URLRequestContext* url_request_context_; + const net::NetworkIsolationKey network_isolation_key_; std::unique_ptr<ProxyResolvingClientSocketFactory> proxy_resolving_socket_factory_; diff --git a/chromium/services/network/p2p/socket_tcp.cc b/chromium/services/network/p2p/socket_tcp.cc index 385433b53d8..9d7d9fd7495 100644 --- a/chromium/services/network/p2p/socket_tcp.cc +++ b/chromium/services/network/p2p/socket_tcp.cc @@ -14,6 +14,7 @@ #include "jingle/glue/fake_ssl_client_socket.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" +#include "net/base/network_isolation_key.h" #include "net/socket/client_socket_factory.h" #include "net/socket/client_socket_handle.h" #include "net/socket/ssl_client_socket.h" @@ -78,10 +79,12 @@ void P2PSocketTcpBase::InitAccepted(const net::IPEndPoint& remote_address, DoRead(); } -void P2PSocketTcpBase::Init(const net::IPEndPoint& local_address, - uint16_t min_port, - uint16_t max_port, - const P2PHostAndIPEndPoint& remote_address) { +void P2PSocketTcpBase::Init( + const net::IPEndPoint& local_address, + uint16_t min_port, + uint16_t max_port, + const P2PHostAndIPEndPoint& remote_address, + const net::NetworkIsolationKey& network_isolation_key) { DCHECK(!socket_); remote_address_ = remote_address; @@ -105,7 +108,7 @@ void P2PSocketTcpBase::Init(const net::IPEndPoint& local_address, // a problem on multi-homed host. socket_ = proxy_resolving_socket_factory_->CreateSocket( - GURL("https://" + dest_host_port_pair.ToString()), + GURL("https://" + dest_host_port_pair.ToString()), network_isolation_key, IsTlsClientSocket(type_)); if (IsPseudoTlsClientSocket(type_)) { diff --git a/chromium/services/network/p2p/socket_tcp.h b/chromium/services/network/p2p/socket_tcp.h index e4640f181d7..b086186a6aa 100644 --- a/chromium/services/network/p2p/socket_tcp.h +++ b/chromium/services/network/p2p/socket_tcp.h @@ -48,7 +48,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketTcpBase : public P2PSocket { void Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, - const P2PHostAndIPEndPoint& remote_address) override; + const P2PHostAndIPEndPoint& remote_address, + const net::NetworkIsolationKey& network_isolation_key) override; // mojom::P2PSocket implementation: void Send(const std::vector<int8_t>& data, diff --git a/chromium/services/network/p2p/socket_tcp_server.cc b/chromium/services/network/p2p/socket_tcp_server.cc index d2bdc4fcd2b..f9dafef98aa 100644 --- a/chromium/services/network/p2p/socket_tcp_server.cc +++ b/chromium/services/network/p2p/socket_tcp_server.cc @@ -37,10 +37,12 @@ P2PSocketTcpServer::P2PSocketTcpServer( P2PSocketTcpServer::~P2PSocketTcpServer() = default; // TODO(guidou): Add support for port range. -void P2PSocketTcpServer::Init(const net::IPEndPoint& local_address, - uint16_t min_port, - uint16_t max_port, - const P2PHostAndIPEndPoint& remote_address) { +void P2PSocketTcpServer::Init( + const net::IPEndPoint& local_address, + uint16_t min_port, + uint16_t max_port, + const P2PHostAndIPEndPoint& remote_address, + const net::NetworkIsolationKey& network_isolation_key) { int result = socket_->Listen(local_address, kListenBacklog); if (result < 0) { LOG(ERROR) << "Listen() failed: " << result; diff --git a/chromium/services/network/p2p/socket_tcp_server.h b/chromium/services/network/p2p/socket_tcp_server.h index b496ba2574e..527110ea7d7 100644 --- a/chromium/services/network/p2p/socket_tcp_server.h +++ b/chromium/services/network/p2p/socket_tcp_server.h @@ -39,7 +39,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketTcpServer : public P2PSocket { void Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, - const P2PHostAndIPEndPoint& remote_address) override; + const P2PHostAndIPEndPoint& remote_address, + const net::NetworkIsolationKey& network_isolation_key) override; // mojom::P2PSocket implementation: void Send(const std::vector<int8_t>& data, diff --git a/chromium/services/network/p2p/socket_tcp_server_unittest.cc b/chromium/services/network/p2p/socket_tcp_server_unittest.cc index 87876968539..0c0ec2f4c5d 100644 --- a/chromium/services/network/p2p/socket_tcp_server_unittest.cc +++ b/chromium/services/network/p2p/socket_tcp_server_unittest.cc @@ -12,6 +12,7 @@ #include "base/run_loop.h" #include "base/test/task_environment.h" #include "net/base/completion_once_callback.h" +#include "net/base/network_isolation_key.h" #include "services/network/p2p/socket_tcp.h" #include "services/network/p2p/socket_test_utils.h" #include "testing/gmock/include/gmock/gmock.h" @@ -105,7 +106,8 @@ class P2PSocketTcpServerTest : public testing::Test { P2PHostAndIPEndPoint dest; dest.ip_address = ParseAddress(kTestIpAddress1, kTestPort1); - p2p_socket_->Init(ParseAddress(kTestLocalIpAddress, 0), 0, 0, dest); + p2p_socket_->Init(ParseAddress(kTestLocalIpAddress, 0), 0, 0, dest, + net::NetworkIsolationKey()); EXPECT_TRUE(socket_->listening()); base::RunLoop().RunUntilIdle(); } diff --git a/chromium/services/network/p2p/socket_tcp_unittest.cc b/chromium/services/network/p2p/socket_tcp_unittest.cc index 1150cf293b8..dd1f75cb2a2 100644 --- a/chromium/services/network/p2p/socket_tcp_unittest.cc +++ b/chromium/services/network/p2p/socket_tcp_unittest.cc @@ -9,12 +9,17 @@ #include "base/run_loop.h" #include "base/stl_util.h" +#include "base/strings/stringprintf.h" #include "base/sys_byteorder.h" #include "base/test/bind_test_util.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "jingle/glue/fake_ssl_client_socket.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" +#include "net/base/features.h" +#include "net/base/network_isolation_key.h" +#include "net/dns/mock_host_resolver.h" #include "net/socket/socket_test_util.h" #include "net/socket/stream_socket.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" @@ -522,13 +527,104 @@ TEST(P2PSocketTcpWithPseudoTlsTest, Basic) { &factory); P2PHostAndIPEndPoint dest; dest.ip_address = server_addr; - host.Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0), 0, 0, dest); + host.Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0), 0, 0, dest, + net::NetworkIsolationKey()); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(data_provider.AllReadDataConsumed()); EXPECT_TRUE(data_provider.AllWriteDataConsumed()); } +// Test the case where P2PHostAndIPEndPoint::hostname is populated. Make sure +// there's a DNS lookup using the right hostname and NetworkIsolationKey. +TEST(P2PSocketTcpWithPseudoTlsTest, Hostname) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + net::features::kSplitHostCacheByNetworkIsolationKey); + + const char kHostname[] = "foo.test"; + base::test::TaskEnvironment task_environment( + base::test::TaskEnvironment::MainThreadType::IO); + + mojo::PendingRemote<mojom::P2PSocketClient> socket_client; + mojo::PendingRemote<mojom::P2PSocket> socket; + auto socket_receiver = socket.InitWithNewPipeAndPassReceiver(); + + FakeSocketClient fake_client2(std::move(socket), + socket_client.InitWithNewPipeAndPassReceiver()); + EXPECT_CALL(fake_client2, SocketCreated(_, _)).Times(1); + + net::TestURLRequestContext context(true); + net::MockClientSocketFactory mock_socket_factory; + context.set_client_socket_factory(&mock_socket_factory); + net::MockCachingHostResolver host_resolver; + host_resolver.rules()->AddRule(kHostname, "1.2.3.4"); + context.set_host_resolver(&host_resolver); + context.Init(); + ProxyResolvingClientSocketFactory factory(&context); + + base::StringPiece ssl_client_hello = + jingle_glue::FakeSSLClientSocket::GetSslClientHello(); + base::StringPiece ssl_server_hello = + jingle_glue::FakeSSLClientSocket::GetSslServerHello(); + net::MockRead reads[] = { + net::MockRead(net::ASYNC, ssl_server_hello.data(), + ssl_server_hello.size()), + net::MockRead(net::SYNCHRONOUS, net::ERR_IO_PENDING)}; + net::MockWrite writes[] = {net::MockWrite( + net::SYNCHRONOUS, ssl_client_hello.data(), ssl_client_hello.size())}; + net::StaticSocketDataProvider data_provider(reads, writes); + net::IPEndPoint server_addr(net::IPAddress::IPv4Localhost(), 1234); + data_provider.set_connect_data( + net::MockConnect(net::SYNCHRONOUS, net::OK, server_addr)); + mock_socket_factory.AddSocketDataProvider(&data_provider); + + FakeP2PSocketDelegate socket_delegate; + P2PSocketTcp host(&socket_delegate, std::move(socket_client), + std::move(socket_receiver), P2P_SOCKET_SSLTCP_CLIENT, + &factory); + P2PHostAndIPEndPoint dest; + dest.ip_address = server_addr; + dest.hostname = kHostname; + net::NetworkIsolationKey network_isolation_key = + net::NetworkIsolationKey::CreateTransient(); + host.Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0), 0, 0, dest, + network_isolation_key); + + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(data_provider.AllReadDataConsumed()); + EXPECT_TRUE(data_provider.AllWriteDataConsumed()); + + // Check that the URL in kHostname is in the HostCache, with + // |network_isolation_key|. + const net::HostPortPair kHostPortPair = net::HostPortPair(kHostname, 0); + net::HostResolver::ResolveHostParameters params; + params.source = net::HostResolverSource::LOCAL_ONLY; + std::unique_ptr<net::HostResolver::ResolveHostRequest> request1 = + context.host_resolver()->CreateRequest(kHostPortPair, + network_isolation_key, + net::NetLogWithSource(), params); + net::TestCompletionCallback callback1; + int result = request1->Start(callback1.callback()); + EXPECT_EQ(net::OK, callback1.GetResult(result)); + + // Check that the hostname is not in the DNS cache for other possible NIKs. + const url::Origin kDestinationOrigin = + url::Origin::Create(GURL(base::StringPrintf("https://%s", kHostname))); + const net::NetworkIsolationKey kOtherNiks[] = { + net::NetworkIsolationKey(), + net::NetworkIsolationKey(kDestinationOrigin /* top_frame_origin */, + kDestinationOrigin /* frame_origin */)}; + for (const auto& other_nik : kOtherNiks) { + std::unique_ptr<net::HostResolver::ResolveHostRequest> request2 = + context.host_resolver()->CreateRequest(kHostPortPair, other_nik, + net::NetLogWithSource(), params); + net::TestCompletionCallback callback2; + int result = request2->Start(callback2.callback()); + EXPECT_EQ(net::ERR_NAME_NOT_RESOLVED, callback2.GetResult(result)); + } +} + class P2PSocketTcpWithTlsTest : public testing::TestWithParam<std::tuple<net::IoMode, P2PSocketType>> {}; @@ -585,7 +681,8 @@ TEST_P(P2PSocketTcpWithTlsTest, Basic) { } P2PHostAndIPEndPoint dest; dest.ip_address = server_addr; - host->Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0), 0, 0, dest); + host->Init(net::IPEndPoint(net::IPAddress::IPv4Localhost(), 0), 0, 0, dest, + net::NetworkIsolationKey()); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(data_provider.AllReadDataConsumed()); diff --git a/chromium/services/network/p2p/socket_udp.cc b/chromium/services/network/p2p/socket_udp.cc index b6d6392873d..bf042cfd6de 100644 --- a/chromium/services/network/p2p/socket_udp.cc +++ b/chromium/services/network/p2p/socket_udp.cc @@ -129,7 +129,8 @@ P2PSocketUdp::~P2PSocketUdp() = default; void P2PSocketUdp::Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, - const P2PHostAndIPEndPoint& remote_address) { + const P2PHostAndIPEndPoint& remote_address, + const net::NetworkIsolationKey& network_isolation_key) { DCHECK(!socket_); DCHECK((min_port == 0 && max_port == 0) || min_port > 0); DCHECK_LE(min_port, max_port); diff --git a/chromium/services/network/p2p/socket_udp.h b/chromium/services/network/p2p/socket_udp.h index 7ffa5e5fead..e2e4f540845 100644 --- a/chromium/services/network/p2p/socket_udp.h +++ b/chromium/services/network/p2p/socket_udp.h @@ -58,7 +58,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketUdp : public P2PSocket { void Init(const net::IPEndPoint& local_address, uint16_t min_port, uint16_t max_port, - const P2PHostAndIPEndPoint& remote_address) override; + const P2PHostAndIPEndPoint& remote_address, + const net::NetworkIsolationKey& network_isolation_key) override; // mojom::P2PSocket implementation: void Send(const std::vector<int8_t>& data, diff --git a/chromium/services/network/p2p/socket_udp_unittest.cc b/chromium/services/network/p2p/socket_udp_unittest.cc index 624a3b05dac..48d9379dcf8 100644 --- a/chromium/services/network/p2p/socket_udp_unittest.cc +++ b/chromium/services/network/p2p/socket_udp_unittest.cc @@ -21,6 +21,7 @@ #include "net/base/io_buffer.h" #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" +#include "net/base/network_isolation_key.h" #include "net/log/net_log_with_source.h" #include "net/socket/datagram_server_socket.h" #include "net/traffic_annotation/network_traffic_annotation_test_helper.h" @@ -233,7 +234,8 @@ class P2PSocketUdpTest : public testing::Test { socket_impl_->Init( local_address_, 0, 0, P2PHostAndIPEndPoint(std::string(), - ParseAddress(kTestIpAddress1, kTestPort1))); + ParseAddress(kTestIpAddress1, kTestPort1)), + net::NetworkIsolationKey()); socket_ = GetSocketFromHost(socket_impl_.get()); dest1_ = ParseAddress(kTestIpAddress1, kTestPort1); @@ -577,7 +579,8 @@ TEST_F(P2PSocketUdpTest, PortRangeImplicitPort) { socket_impl->Init( local_address, min_port, max_port, P2PHostAndIPEndPoint(std::string(), - ParseAddress(kTestIpAddress1, kTestPort1))); + ParseAddress(kTestIpAddress1, kTestPort1)), + net::NetworkIsolationKey()); FakeDatagramServerSocket* socket = GetSocketFromHost(socket_impl.get()); net::IPEndPoint bound_address; @@ -601,7 +604,8 @@ TEST_F(P2PSocketUdpTest, PortRangeImplicitPort) { socket_impl_ptr->Init( local_address, min_port, max_port, P2PHostAndIPEndPoint(std::string(), - ParseAddress(kTestIpAddress1, kTestPort1))); + ParseAddress(kTestIpAddress1, kTestPort1)), + net::NetworkIsolationKey()); base::RunLoop().RunUntilIdle(); @@ -638,7 +642,8 @@ TEST_F(P2PSocketUdpTest, PortRangeExplictValidPort) { socket_host->Init( local_address, min_port, max_port, P2PHostAndIPEndPoint(std::string(), - ParseAddress(kTestIpAddress1, kTestPort1))); + ParseAddress(kTestIpAddress1, kTestPort1)), + net::NetworkIsolationKey()); FakeDatagramServerSocket* fake_socket = GetSocketFromHost(socket_host.get()); net::IPEndPoint bound_address; @@ -679,7 +684,8 @@ TEST_F(P2PSocketUdpTest, PortRangeExplictInvalidPort) { socket_impl_ptr->Init( local_address, min_port, max_port, P2PHostAndIPEndPoint(std::string(), - ParseAddress(kTestIpAddress1, kTestPort1))); + ParseAddress(kTestIpAddress1, kTestPort1)), + net::NetworkIsolationKey()); base::RunLoop().RunUntilIdle(); |