#ifdef UNSAFE_BUFFERS_BUILD
#pragma allow_unsafe_buffers
#endif
#include "services/network/p2p/socket_udp.h"
#include <tuple>
#include "base/containers/contains.h"
#include "base/functional/bind.h"
#include "base/memory/ptr_util.h"
#include "base/metrics/histogram_macros.h"
#include "base/strings/stringprintf.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "net/base/io_buffer.h"
#include "net/base/net_errors.h"
#include "net/log/net_log_source.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/throttling/throttling_controller.h"
#include "services/network/throttling/throttling_network_interceptor.h"
#include "services/network/throttling/throttling_p2p_network_interceptor.h"
#include "third_party/webrtc/media/base/rtp_utils.h"
namespace {
const int kUdpReadBufferSize = …;
const int kUdpRecvSocketBufferSize = …;
const int kUdpSendSocketBufferSize = …;
struct { … } static const kTransientErrors[]{ … };
bool IsTransientError(int error) { … }
const char* GetTransientErrorName(int error) { … }
std::unique_ptr<net::DatagramServerSocket> DefaultSocketFactory(
net::NetLog* net_log) { … }
rtc::EcnMarking GetEcnMarking(net::DscpAndEcn tos) { … }
}
namespace network {
P2PPendingPacket::P2PPendingPacket(const net::IPEndPoint& to,
base::span<const uint8_t> content,
const rtc::PacketOptions& options,
uint64_t id)
: … { … }
P2PPendingPacket::P2PPendingPacket(const P2PPendingPacket& other) = default;
P2PPendingPacket::~P2PPendingPacket() = default;
P2PSocketUdp::P2PSocketUdp(
Delegate* Delegate,
mojo::PendingRemote<mojom::P2PSocketClient> client,
mojo::PendingReceiver<mojom::P2PSocket> socket,
P2PMessageThrottler* throttler,
const net::NetworkTrafficAnnotationTag& traffic_annotation,
net::NetLog* net_log,
const DatagramServerSocketFactory& socket_factory,
std::optional<base::UnguessableToken> devtools_token)
: … { … }
P2PSocketUdp::P2PSocketUdp(
Delegate* Delegate,
mojo::PendingRemote<mojom::P2PSocketClient> client,
mojo::PendingReceiver<mojom::P2PSocket> socket,
P2PMessageThrottler* throttler,
const net::NetworkTrafficAnnotationTag& traffic_annotation,
net::NetLog* net_log,
std::optional<base::UnguessableToken> devtools_token)
: … { … }
P2PSocketUdp::~P2PSocketUdp() { … }
void P2PSocketUdp::Init(
const net::IPEndPoint& local_address,
uint16_t min_port,
uint16_t max_port,
const P2PHostAndIPEndPoint& remote_address,
const net::NetworkAnonymizationKey& network_anonymization_key) { … }
void P2PSocketUdp::DoRead() { … }
void P2PSocketUdp::OnRecv(int result) { … }
void P2PSocketUdp::MaybeDrainReceivedPackets(bool force) { … }
bool P2PSocketUdp::HandleReadResult(int result) { … }
bool P2PSocketUdp::DoSend(const P2PPendingPacket& packet) { … }
void P2PSocketUdp::OnSend(uint64_t packet_id,
int32_t transport_sequence_number,
int64_t send_time_ms,
int result) { … }
bool P2PSocketUdp::HandleSendResult(uint64_t packet_id,
int32_t transport_sequence_number,
int64_t send_time_ms,
int result) { … }
void P2PSocketUdp::Send(base::span<const uint8_t> data,
const P2PPacketInfo& packet_info) { … }
bool P2PSocketUdp::SendPacket(base::span<const uint8_t> data,
const P2PPacketInfo& packet_info) { … }
void P2PSocketUdp::SendBatch(
std::vector<mojom::P2PSendPacketPtr> packet_batch) { … }
void P2PSocketUdp::SendFromInterceptor(const P2PPendingPacket& packet) { … }
void P2PSocketUdp::SetOption(P2PSocketOption option, int32_t value) { … }
void P2PSocketUdp::ProcessSendCompletions() { … }
void P2PSocketUdp::SendCompletionFromInterceptor(P2PSendPacketMetrics metrics) { … }
int P2PSocketUdp::SetSocketDiffServCodePointInternal(
net::DiffServCodePoint dscp) { … }
void P2PSocketUdp::DisconnectInterceptor() { … }
void P2PSocketUdp::ReceiveFromInterceptor(mojom::P2PReceivedPacketPtr packet,
scoped_refptr<net::IOBuffer> buffer) { … }
}