#ifndef SERVICES_NETWORK_P2P_SOCKET_MANAGER_H_
#define SERVICES_NETWORK_P2P_SOCKET_MANAGER_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include "base/containers/flat_map.h"
#include "base/containers/unique_ptr_adapters.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/memory/weak_ptr.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/single_thread_task_runner.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "net/base/ip_address.h"
#include "net/base/ip_endpoint.h"
#include "net/base/network_anonymization_key.h"
#include "net/base/network_change_notifier.h"
#include "net/socket/client_socket_factory.h"
#include "net/socket/datagram_client_socket.h"
#include "services/network/p2p/socket.h"
#include "services/network/p2p/socket_throttler.h"
#include "services/network/public/cpp/p2p_socket_type.h"
#include "services/network/public/mojom/p2p.mojom.h"
#include "services/network/public/mojom/p2p_trusted.mojom.h"
namespace net {
class URLRequestContext;
}
namespace network {
class ProxyResolvingClientSocketFactory;
}
namespace network {
struct DefaultLocalAddresses {
DefaultLocalAddresses();
~DefaultLocalAddresses();
std::optional<net::IPAddress> default_ipv4_local_address;
std::optional<net::IPAddress> default_ipv6_local_address;
};
class COMPONENT_EXPORT(NETWORK_SERVICE) P2PSocketManager
: public net::NetworkChangeNotifier::NetworkChangeObserver,
public mojom::P2PSocketManager,
public mojom::P2PTrustedSocketManager,
public P2PSocket::Delegate {
public:
using DeleteCallback =
base::OnceCallback<void(P2PSocketManager* socket_manager)>;
P2PSocketManager(
const net::NetworkAnonymizationKey& network_anonymization_key,
mojo::PendingRemote<mojom::P2PTrustedSocketManagerClient>
trusted_socket_manager_client,
mojo::PendingReceiver<mojom::P2PTrustedSocketManager>
trusted_socket_manager_receiver,
mojo::PendingReceiver<mojom::P2PSocketManager> socket_manager_receiver,
DeleteCallback delete_callback,
net::URLRequestContext* url_request_context);
P2PSocketManager(const P2PSocketManager&) = delete;
P2PSocketManager& operator=(const P2PSocketManager&) = delete;
~P2PSocketManager() override;
void OnNetworkChanged(
net::NetworkChangeNotifier::ConnectionType type) override;
void PauseNetworkChangeNotifications() override;
void ResumeNetworkChangeNotifications() override;
private:
class DnsRequest;
static net::NetworkInterfaceList DoGetNetworkList();
using GetDefaultCallback = base::OnceCallback<void(net::IPAddress)>;
void DoGetDefaultLocalAddresses(net::NetworkInterfaceList list);
void MaybeFinishDoGetDefaultLocalAddresses(
DefaultLocalAddresses* default_local_addresses,
net::NetworkInterfaceList list,
int family,
net::IPAddress addr);
void GetDefaultLocalAddress(int family, GetDefaultCallback callback);
void FinishGetDefaultLocalAddress(
std::unique_ptr<net::DatagramClientSocket> socket,
GetDefaultCallback callback,
int result);
void SendNetworkList(const net::NetworkInterfaceList& list,
net::IPAddress default_ipv4_local_address,
net::IPAddress default_ipv6_local_address);
void DestroySocket(P2PSocket* socket) override;
void DumpPacket(base::span<const uint8_t> data, bool incoming) override;
void StartNetworkNotifications(
mojo::PendingRemote<mojom::P2PNetworkNotificationClient> client) override;
void GetHostAddress(
const std::string& host_name,
std::optional<net::AddressFamily> address_family,
bool enable_mdns,
mojom::P2PSocketManager::GetHostAddressCallback callback) override;
void CreateSocket(
P2PSocketType type,
const net::IPEndPoint& local_address,
const P2PPortRange& port_range,
const P2PHostAndIPEndPoint& remote_address,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation,
const std::optional<base::UnguessableToken>& devtools_token,
mojo::PendingRemote<mojom::P2PSocketClient> client,
mojo::PendingReceiver<mojom::P2PSocket> receiver) override;
void StartRtpDump(bool incoming, bool outgoing) override;
void StopRtpDump(bool incoming, bool outgoing) override;
void NetworkNotificationClientConnectionError();
void OnAddressResolved(
DnsRequest* request,
mojom::P2PSocketManager::GetHostAddressCallback callback,
const net::IPAddressList& addresses);
void OnConnectionError();
DeleteCallback delete_callback_;
raw_ptr<net::URLRequestContext> url_request_context_;
const net::NetworkAnonymizationKey network_anonymization_key_;
std::unique_ptr<ProxyResolvingClientSocketFactory>
proxy_resolving_socket_factory_;
base::flat_map<P2PSocket*, std::unique_ptr<P2PSocket>> sockets_;
std::set<std::unique_ptr<DnsRequest>, base::UniquePtrComparator>
dns_requests_;
P2PMessageThrottler throttler_;
bool dump_incoming_rtp_packet_ = false;
bool dump_outgoing_rtp_packet_ = false;
bool notifications_paused_ = false;
bool pending_network_change_notification_ = false;
const scoped_refptr<base::SequencedTaskRunner> network_list_task_runner_;
mojo::Remote<mojom::P2PTrustedSocketManagerClient>
trusted_socket_manager_client_;
mojo::Receiver<mojom::P2PTrustedSocketManager>
trusted_socket_manager_receiver_;
mojo::Receiver<mojom::P2PSocketManager> socket_manager_receiver_;
mojo::Remote<mojom::P2PNetworkNotificationClient>
network_notification_client_;
base::WeakPtrFactory<P2PSocketManager> weak_factory_{this};
};
}
#endif