Detangle p2p/connection.cc and port.cc

This CL does:
- Run IWYU on the relevant elements
- Make connection depend on port_interface, not port
- Make port_allocator depend only on port
- Move some constants from port.h into p2p_constants

This allows a dependency graph without ugly groups.

Bug: webrtc:15796
Change-Id: I0ff0e14eacdfe3b230a8d84902a78eb062d6c8af
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/336320
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41618}
This commit is contained in:
Harald Alvestrand 2024-01-26 07:11:50 +00:00 committed by WebRTC LUCI CQ
parent d213dd5517
commit 9a953b28f9
16 changed files with 327 additions and 111 deletions

View file

@ -334,7 +334,7 @@ rtc_library("libjingle_peerconnection_api") {
":sequence_checker",
":turn_customizer",
"../call:rtp_interfaces",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:rtc_p2p",
"../pc:media_factory",
"../rtc_base:copy_on_write_buffer",
@ -936,7 +936,7 @@ rtc_library("ice_transport_factory") {
":make_ref_counted",
":packet_socket_factory",
":scoped_refptr",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:ice_transport_internal",
"../p2p:p2p_constants",
"../p2p:p2p_transport_channel",

View file

@ -74,7 +74,7 @@ rtc_library("media_quality_test_params") {
"../../../api/transport:network_control",
"../../../api/video_codecs:video_codecs_api",
"../../../modules/audio_processing:api",
"../../../p2p:connection_and_port",
"../../../p2p:connection",
"../../../p2p:rtc_p2p",
"../../../rtc_base:network",
"../../../rtc_base:rtc_certificate_generator",

View file

@ -702,7 +702,7 @@ if (is_linux || is_chromeos || is_win) {
"../api/video_codecs:video_codecs_api",
"../media:media_channel",
"../media:rtc_media_base",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:rtc_p2p",
"../pc:video_track_source",
"../rtc_base:async_dns_resolver",

View file

@ -74,7 +74,7 @@ rtc_library("rtc_p2p") {
":basic_async_resolver_factory",
":basic_ice_controller",
":candidate_pair_interface",
":connection_and_port",
":connection",
":connection_info",
":ice_agent_interface",
":ice_controller_factory_interface",
@ -169,6 +169,7 @@ rtc_library("rtc_p2p") {
absl_deps = [
"//third_party/abseil-cpp/absl/algorithm:container",
"//third_party/abseil-cpp/absl/base:core_headers",
"//third_party/abseil-cpp/absl/functional:any_invocable",
"//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings",
"//third_party/abseil-cpp/absl/types:optional",
@ -187,7 +188,7 @@ rtc_source_set("active_ice_controller_factory_interface") {
rtc_source_set("active_ice_controller_interface") {
sources = [ "base/active_ice_controller_interface.h" ]
deps = [
":connection_and_port",
":connection",
":ice_switch_reason",
":ice_transport_internal",
":transport_description",
@ -248,14 +249,10 @@ rtc_source_set("candidate_pair_interface") {
# This set of files is too intertwined to break into separate
# targets at this point.
# TODO(bugs.webrtc.org/15796): Finish breakup
rtc_library("connection_and_port") {
rtc_library("connection") {
sources = [
"base/connection.cc",
"base/connection.h",
"base/port.cc",
"base/port.h",
"base/port_allocator.cc",
"base/port_allocator.h",
]
deps = [
":candidate_pair_interface",
@ -276,28 +273,37 @@ rtc_library("connection_and_port") {
"../api/transport:enums",
"../api/transport:field_trial_based_config",
"../api/transport:stun_types",
"../api/units:time_delta",
"../api/units:timestamp",
"../logging:ice_log",
"../rtc_base:async_packet_socket",
"../rtc_base:byte_buffer",
"../rtc_base:callback_list",
"../rtc_base:checks",
"../rtc_base:crc32",
"../rtc_base:dscp",
"../rtc_base:event_tracer",
"../rtc_base:ip_address",
"../rtc_base:logging",
"../rtc_base:macromagic",
"../rtc_base:mdns_responder_interface",
"../rtc_base:net_helper",
"../rtc_base:network",
"../rtc_base:network_constants",
"../rtc_base:proxy_info",
"../rtc_base:rate_tracker",
"../rtc_base:rtc_numerics",
"../rtc_base:safe_minmax",
"../rtc_base:socket",
"../rtc_base:socket_address",
"../rtc_base:ssl",
"../rtc_base:stringutils",
"../rtc_base:threading",
"../rtc_base:timeutils",
"../rtc_base:weak_ptr",
"../rtc_base/memory:always_valid_pointer",
"../rtc_base/network:received_packet",
"../rtc_base/network:sent_packet",
"../rtc_base/system:rtc_export",
"../rtc_base/third_party/base64",
"../rtc_base/third_party/sigslot",
@ -305,6 +311,7 @@ rtc_library("connection_and_port") {
absl_deps = [
"//third_party/abseil-cpp/absl/algorithm:container",
"//third_party/abseil-cpp/absl/base:core_headers",
"//third_party/abseil-cpp/absl/functional:any_invocable",
"//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings",
"//third_party/abseil-cpp/absl/strings:string_view",
@ -327,7 +334,7 @@ rtc_library("connection_info") {
rtc_source_set("ice_agent_interface") {
sources = [ "base/ice_agent_interface.h" ]
deps = [
":connection_and_port",
":connection",
":ice_switch_reason",
"../api:array_view",
]
@ -339,7 +346,7 @@ rtc_library("ice_controller_interface") {
"base/ice_controller_interface.h",
]
deps = [
":connection_and_port",
":connection",
":ice_switch_reason",
":ice_transport_internal",
"../rtc_base:checks",
@ -382,9 +389,10 @@ rtc_library("ice_transport_internal") {
"base/ice_transport_internal.h",
]
deps = [
":connection_and_port",
":connection",
":p2p_constants",
":packet_transport_internal",
":port",
":stun_dictionary",
":transport_description",
"../api:candidate",
@ -418,7 +426,7 @@ rtc_library("p2p_transport_channel") {
":active_ice_controller_factory_interface",
":basic_ice_controller",
":candidate_pair_interface",
":connection_and_port",
":connection",
":connection_info",
":ice_agent_interface",
":ice_controller_factory_interface",
@ -427,6 +435,8 @@ rtc_library("p2p_transport_channel") {
":ice_transport_internal",
":p2p_constants",
":p2p_transport_channel_ice_field_trials",
":port",
":port_allocator",
":port_interface",
":regathering_controller",
":stun_dictionary",
@ -487,7 +497,8 @@ rtc_library("packet_transport_internal") {
"base/packet_transport_internal.h",
]
deps = [
":connection_and_port",
":connection",
":port",
"../rtc_base:async_packet_socket",
"../rtc_base:network_route",
"../rtc_base:socket",
@ -497,6 +508,94 @@ rtc_library("packet_transport_internal") {
absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}
rtc_library("port") {
sources = [
"base/port.cc",
"base/port.h",
]
deps = [
":candidate_pair_interface",
":connection",
":connection_info",
":p2p_constants",
":port_interface",
":stun_request",
":transport_description",
"../api:array_view",
"../api:candidate",
"../api:field_trials_view",
"../api:packet_socket_factory",
"../api:rtc_error",
"../api:sequence_checker",
"../api/task_queue",
"../api/transport:field_trial_based_config",
"../api/transport:stun_types",
"../api/units:time_delta",
"../logging:ice_log",
"../rtc_base:async_packet_socket",
"../rtc_base:byte_buffer",
"../rtc_base:callback_list",
"../rtc_base:checks",
"../rtc_base:crc32",
"../rtc_base:dscp",
"../rtc_base:event_tracer",
"../rtc_base:ip_address",
"../rtc_base:logging",
"../rtc_base:macromagic",
"../rtc_base:mdns_responder_interface",
"../rtc_base:net_helper",
"../rtc_base:network",
"../rtc_base:proxy_info",
"../rtc_base:rate_tracker",
"../rtc_base:socket_address",
"../rtc_base:ssl",
"../rtc_base:stringutils",
"../rtc_base:timeutils",
"../rtc_base:weak_ptr",
"../rtc_base/memory:always_valid_pointer",
"../rtc_base/network:received_packet",
"../rtc_base/network:sent_packet",
"../rtc_base/system:rtc_export",
"../rtc_base/third_party/sigslot",
]
absl_deps = [
"//third_party/abseil-cpp/absl/base:core_headers",
"//third_party/abseil-cpp/absl/memory",
"//third_party/abseil-cpp/absl/strings",
"//third_party/abseil-cpp/absl/strings:string_view",
"//third_party/abseil-cpp/absl/types:optional",
]
}
rtc_library("port_allocator") {
sources = [
"base/port_allocator.cc",
"base/port_allocator.h",
]
deps = [
":connection",
":ice_credentials_iterator",
":port",
":port_interface",
":transport_description",
"../api:candidate",
"../api:sequence_checker",
"../api/transport:enums",
"../rtc_base:checks",
"../rtc_base:network",
"../rtc_base:proxy_info",
"../rtc_base:socket_address",
"../rtc_base:ssl",
"../rtc_base:threading",
"../rtc_base/system:rtc_export",
"../rtc_base/third_party/sigslot",
]
absl_deps = [
"//third_party/abseil-cpp/absl/strings:string_view",
"//third_party/abseil-cpp/absl/types:optional",
]
}
rtc_library("port_interface") {
sources = [
"base/port_interface.cc",
@ -505,8 +604,10 @@ rtc_library("port_interface") {
deps = [
":transport_description",
"../api:candidate",
"../api:packet_socket_factory",
"../rtc_base:async_packet_socket",
"../rtc_base:callback_list",
"../rtc_base:proxy_info",
"../rtc_base:socket_address",
]
absl_deps = [
@ -521,8 +622,9 @@ rtc_library("regathering_controller") {
"base/regathering_controller.h",
]
deps = [
":connection_and_port",
":connection",
":ice_transport_internal",
":port_allocator",
"../api/task_queue:pending_task_safety_flag",
"../api/units:time_delta",
"../rtc_base:threading",
@ -590,7 +692,7 @@ rtc_library("wrapping_active_ice_controller") {
deps = [
":active_ice_controller_interface",
":basic_ice_controller",
":connection_and_port",
":connection",
":ice_agent_interface",
":ice_controller_factory_interface",
":ice_controller_interface",
@ -634,7 +736,7 @@ if (rtc_include_tests) {
visibility = [ "*" ]
sources = [ "base/fake_port_allocator.h" ]
deps = [
":connection_and_port",
":connection",
":rtc_p2p",
"../rtc_base:net_helpers",
"../rtc_base:net_test_helpers",
@ -663,7 +765,7 @@ if (rtc_include_tests) {
deps = [
":active_ice_controller_factory_interface",
":active_ice_controller_interface",
":connection_and_port",
":connection",
":fake_ice_transport",
":fake_port_allocator",
":ice_agent_interface",
@ -731,7 +833,7 @@ if (rtc_include_tests) {
":active_ice_controller_interface",
":async_stun_tcp_socket",
":basic_ice_controller",
":connection_and_port",
":connection",
":fake_ice_transport",
":fake_port_allocator",
":ice_credentials_iterator",

View file

@ -23,6 +23,18 @@ class CandidatePairInterface {
virtual const Candidate& remote_candidate() const = 0;
};
// Specific implementation of the interface, suitable for being a
// data member of other structs.
struct CandidatePair final : public CandidatePairInterface {
~CandidatePair() override = default;
const Candidate& local_candidate() const override { return local; }
const Candidate& remote_candidate() const override { return remote; }
Candidate local;
Candidate remote;
};
} // namespace cricket
#endif // P2P_BASE_CANDIDATE_PAIR_INTERFACE_H_

View file

@ -19,25 +19,26 @@
#include <vector>
#include "absl/algorithm/container.h"
#include "absl/strings/escaping.h"
#include "absl/strings/match.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "api/array_view.h"
#include "api/units/timestamp.h"
#include "p2p/base/port_allocator.h"
#include "p2p/base/p2p_constants.h"
#include "rtc_base/byte_buffer.h"
#include "rtc_base/checks.h"
#include "rtc_base/crc32.h"
#include "rtc_base/helpers.h"
#include "rtc_base/logging.h"
#include "rtc_base/mdns_responder_interface.h"
#include "rtc_base/message_digest.h"
#include "rtc_base/net_helper.h"
#include "rtc_base/network.h"
#include "rtc_base/network/sent_packet.h"
#include "rtc_base/network_constants.h"
#include "rtc_base/numerics/safe_minmax.h"
#include "rtc_base/socket.h"
#include "rtc_base/socket_address.h"
#include "rtc_base/string_encode.h"
#include "rtc_base/string_utils.h"
#include "rtc_base/strings/string_builder.h"
#include "rtc_base/third_party/base64/base64.h"
#include "rtc_base/time_utils.h"
namespace cricket {
namespace {
@ -213,7 +214,7 @@ int Connection::ConnectionRequest::resend_delay() {
return CONNECTION_RESPONSE_TIMEOUT;
}
Connection::Connection(rtc::WeakPtr<Port> port,
Connection::Connection(rtc::WeakPtr<PortInterface> port,
size_t index,
const Candidate& remote_candidate)
: network_thread_(port->thread()),
@ -1784,7 +1785,7 @@ void Connection::ForgetLearnedState() {
pings_since_last_response_.clear();
}
ProxyConnection::ProxyConnection(rtc::WeakPtr<Port> port,
ProxyConnection::ProxyConnection(rtc::WeakPtr<PortInterface> port,
size_t index,
const Candidate& remote_candidate)
: Connection(std::move(port), index, remote_candidate) {}

View file

@ -11,19 +11,31 @@
#ifndef P2P_BASE_CONNECTION_H_
#define P2P_BASE_CONNECTION_H_
#include <stddef.h>
#include <cstdint>
#include <functional>
#include <memory>
#include <string>
#include <type_traits>
#include <utility>
#include <vector>
#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "api/candidate.h"
#include "api/rtc_error.h"
#include "api/sequence_checker.h"
#include "api/task_queue/task_queue_base.h"
#include "api/transport/stun.h"
#include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair.h"
#include "logging/rtc_event_log/events/rtc_event_ice_candidate_pair_config.h"
#include "logging/rtc_event_log/ice_logger.h"
#include "p2p/base/candidate_pair_interface.h"
#include "p2p/base/connection_info.h"
#include "p2p/base/p2p_transport_channel_ice_field_trials.h"
#include "p2p/base/port_interface.h"
#include "p2p/base/stun_request.h"
#include "p2p/base/transport_description.h"
#include "rtc_base/async_packet_socket.h"
@ -32,6 +44,8 @@
#include "rtc_base/numerics/event_based_exponential_moving_average.h"
#include "rtc_base/rate_tracker.h"
#include "rtc_base/system/rtc_export.h"
#include "rtc_base/third_party/sigslot/sigslot.h"
#include "rtc_base/thread_annotations.h"
#include "rtc_base/weak_ptr.h"
namespace cricket {
@ -40,23 +54,9 @@ namespace cricket {
// adding other flavors in the future.
constexpr int kGoogPingVersion = 1;
// Connection and Port has circular dependencies.
// So we use forward declaration rather than include.
class Port;
// Forward declaration so that a ConnectionRequest can contain a Connection.
class Connection;
struct CandidatePair final : public CandidatePairInterface {
~CandidatePair() override = default;
const Candidate& local_candidate() const override { return local; }
const Candidate& remote_candidate() const override { return remote; }
Candidate local;
Candidate remote;
};
// Represents a communication link between a port on the local client and a
// port on the remote client.
class RTC_EXPORT Connection : public CandidatePairInterface {
@ -102,7 +102,7 @@ class RTC_EXPORT Connection : public CandidatePairInterface {
bool writable() const;
bool receiving() const;
const Port* port() const {
const PortInterface* port() const {
RTC_DCHECK_RUN_ON(network_thread_);
return port_.get();
}
@ -326,8 +326,8 @@ class RTC_EXPORT Connection : public CandidatePairInterface {
void SendResponseMessage(const StunMessage& response);
// An accessor for unit tests.
Port* PortForTest() { return port_.get(); }
const Port* PortForTest() const { return port_.get(); }
PortInterface* PortForTest() { return port_.get(); }
const PortInterface* PortForTest() const { return port_.get(); }
std::unique_ptr<IceMessage> BuildPingRequestForTest() {
RTC_DCHECK_RUN_ON(network_thread_);
@ -364,7 +364,9 @@ class RTC_EXPORT Connection : public CandidatePairInterface {
class ConnectionRequest;
// Constructs a new connection to the given remote port.
Connection(rtc::WeakPtr<Port> port, size_t index, const Candidate& candidate);
Connection(rtc::WeakPtr<PortInterface> port,
size_t index,
const Candidate& candidate);
// Called back when StunRequestManager has a stun packet to send
void OnSendStunPacket(const void* data, size_t size, StunRequest* req);
@ -393,7 +395,7 @@ class RTC_EXPORT Connection : public CandidatePairInterface {
void set_connected(bool value);
// The local port where this connection sends and receives packets.
Port* port() { return port_.get(); }
PortInterface* port() { return port_.get(); }
// NOTE: A pointer to the network thread is held by `port_` so in theory we
// shouldn't need to hold on to this pointer here, but rather defer to
@ -402,7 +404,7 @@ class RTC_EXPORT Connection : public CandidatePairInterface {
// TODO(tommi): This ^^^ should be fixed.
webrtc::TaskQueueBase* const network_thread_;
const uint32_t id_;
rtc::WeakPtr<Port> port_;
rtc::WeakPtr<PortInterface> port_;
Candidate local_candidate_ RTC_GUARDED_BY(network_thread_);
Candidate remote_candidate_;
@ -515,7 +517,7 @@ class RTC_EXPORT Connection : public CandidatePairInterface {
// ProxyConnection defers all the interesting work to the port.
class ProxyConnection : public Connection {
public:
ProxyConnection(rtc::WeakPtr<Port> port,
ProxyConnection(rtc::WeakPtr<PortInterface> port,
size_t index,
const Candidate& remote_candidate);

View file

@ -111,6 +111,19 @@ extern const int CONNECTION_RESPONSE_TIMEOUT;
// it.
extern const int MIN_CONNECTION_LIFETIME;
// The type preference MUST be an integer from 0 to 126 inclusive.
// https://datatracker.ietf.org/doc/html/rfc5245#section-4.1.2.1
enum IcePriorityValue : uint8_t {
ICE_TYPE_PREFERENCE_RELAY_TLS = 0,
ICE_TYPE_PREFERENCE_RELAY_TCP = 1,
ICE_TYPE_PREFERENCE_RELAY_UDP = 2,
ICE_TYPE_PREFERENCE_PRFLX_TCP = 80,
ICE_TYPE_PREFERENCE_HOST_TCP = 90,
ICE_TYPE_PREFERENCE_SRFLX = 100,
ICE_TYPE_PREFERENCE_PRFLX = 110,
ICE_TYPE_PREFERENCE_HOST = 126
};
} // namespace cricket
#endif // P2P_BASE_P2P_CONSTANTS_H_

View file

@ -1693,7 +1693,7 @@ void P2PTransportChannel::OnStartedPinging() {
regathering_controller_->Start();
}
bool P2PTransportChannel::IsPortPruned(const Port* port) const {
bool P2PTransportChannel::IsPortPruned(const PortInterface* port) const {
RTC_DCHECK_RUN_ON(network_thread_);
return !absl::c_linear_search(ports_, port);
}

View file

@ -370,7 +370,7 @@ class RTC_EXPORT P2PTransportChannel : public IceTransportInternal,
}
// Indicates if the given local port has been pruned.
bool IsPortPruned(const Port* port) const;
bool IsPortPruned(const PortInterface* port) const;
// Indicates if the given remote candidate has been pruned.
bool IsRemoteCandidatePruned(const Candidate& cand) const;

View file

@ -10,31 +10,34 @@
#include "p2p/base/port.h"
#include <math.h>
#include <algorithm>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <utility>
#include <vector>
#include "absl/algorithm/container.h"
#include "absl/memory/memory.h"
#include "absl/strings/match.h"
#include "absl/strings/string_view.h"
#include "api/array_view.h"
#include "api/rtc_error.h"
#include "api/units/time_delta.h"
#include "p2p/base/p2p_constants.h"
#include "p2p/base/stun_request.h"
#include "rtc_base/byte_buffer.h"
#include "rtc_base/checks.h"
#include "rtc_base/crc32.h"
#include "rtc_base/helpers.h"
#include "rtc_base/ip_address.h"
#include "rtc_base/logging.h"
#include "rtc_base/mdns_responder_interface.h"
#include "rtc_base/message_digest.h"
#include "rtc_base/net_helper.h"
#include "rtc_base/network.h"
#include "rtc_base/numerics/safe_minmax.h"
#include "rtc_base/socket_address.h"
#include "rtc_base/string_encode.h"
#include "rtc_base/string_utils.h"
#include "rtc_base/strings/string_builder.h"
#include "rtc_base/third_party/base64/base64.h"
#include "rtc_base/time_utils.h"
#include "rtc_base/trace_event.h"
namespace cricket {

View file

@ -11,10 +11,15 @@
#ifndef P2P_BASE_PORT_H_
#define P2P_BASE_PORT_H_
#include <stddef.h>
#include <stdint.h>
#include <functional>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <type_traits>
#include <utility>
#include <vector>
@ -25,6 +30,7 @@
#include "api/field_trials_view.h"
#include "api/packet_socket_factory.h"
#include "api/rtc_error.h"
#include "api/sequence_checker.h"
#include "api/task_queue/task_queue_base.h"
#include "api/transport/field_trial_based_config.h"
#include "api/transport/stun.h"
@ -37,18 +43,22 @@
#include "p2p/base/p2p_constants.h"
#include "p2p/base/port_interface.h"
#include "p2p/base/stun_request.h"
#include "p2p/base/transport_description.h"
#include "rtc_base/async_packet_socket.h"
#include "rtc_base/callback_list.h"
#include "rtc_base/checks.h"
#include "rtc_base/dscp.h"
#include "rtc_base/memory/always_valid_pointer.h"
#include "rtc_base/net_helper.h"
#include "rtc_base/network.h"
#include "rtc_base/network/received_packet.h"
#include "rtc_base/network/sent_packet.h"
#include "rtc_base/proxy_info.h"
#include "rtc_base/rate_tracker.h"
#include "rtc_base/socket_address.h"
#include "rtc_base/system/rtc_export.h"
#include "rtc_base/third_party/sigslot/sigslot.h"
#include "rtc_base/thread_annotations.h"
#include "rtc_base/weak_ptr.h"
namespace cricket {
@ -59,19 +69,6 @@ extern const char TCPTYPE_ACTIVE_STR[];
extern const char TCPTYPE_PASSIVE_STR[];
extern const char TCPTYPE_SIMOPEN_STR[];
// The type preference MUST be an integer from 0 to 126 inclusive.
// https://datatracker.ietf.org/doc/html/rfc5245#section-4.1.2.1
enum IcePriorityValue : uint8_t {
ICE_TYPE_PREFERENCE_RELAY_TLS = 0,
ICE_TYPE_PREFERENCE_RELAY_TCP = 1,
ICE_TYPE_PREFERENCE_RELAY_UDP = 2,
ICE_TYPE_PREFERENCE_PRFLX_TCP = 80,
ICE_TYPE_PREFERENCE_HOST_TCP = 90,
ICE_TYPE_PREFERENCE_SRFLX = 100,
ICE_TYPE_PREFERENCE_PRFLX = 110,
ICE_TYPE_PREFERENCE_HOST = 126
};
enum class MdnsNameRegistrationStatus {
// IP concealment with mDNS is not enabled or the name registration process is
// not started yet.
@ -227,13 +224,13 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
void CancelPendingTasks();
// The thread on which this port performs its I/O.
webrtc::TaskQueueBase* thread() { return thread_; }
webrtc::TaskQueueBase* thread() override { return thread_; }
// The factory used to create the sockets of this port.
rtc::PacketSocketFactory* socket_factory() const { return factory_; }
rtc::PacketSocketFactory* socket_factory() const override { return factory_; }
// For debugging purposes.
const std::string& content_name() const { return content_name_; }
const std::string& content_name() const override { return content_name_; }
void set_content_name(absl::string_view content_name) {
content_name_ = std::string(content_name);
}
@ -241,7 +238,7 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
int component() const { return component_; }
void set_component(int component) { component_ = component; }
bool send_retransmit_count_attribute() const {
bool send_retransmit_count_attribute() const override {
return send_retransmit_count_attribute_;
}
void set_send_retransmit_count_attribute(bool enable) {
@ -249,8 +246,10 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
}
// Identifies the generation that this port was created in.
uint32_t generation() const { return generation_; }
void set_generation(uint32_t generation) { generation_ = generation; }
uint32_t generation() const override { return generation_; }
void set_generation(uint32_t generation) override {
generation_ = generation;
}
const std::string& username_fragment() const;
const std::string& password() const { return password_; }
@ -296,11 +295,11 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
// defers the `delete` operation to when the call stack has been unwound.
// Async may be needed when deleting a connection object from within a
// callback.
void DestroyConnection(Connection* conn) {
void DestroyConnection(Connection* conn) override {
DestroyConnectionInternal(conn, false);
}
void DestroyConnectionAsync(Connection* conn) {
void DestroyConnectionAsync(Connection* conn) override {
DestroyConnectionInternal(conn, true);
}
@ -330,8 +329,8 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
user_agent_ = std::string(user_agent);
proxy_ = proxy;
}
const std::string& user_agent() { return user_agent_; }
const rtc::ProxyInfo& proxy() { return proxy_; }
const std::string& user_agent() override { return user_agent_; }
const rtc::ProxyInfo& proxy() override { return proxy_; }
void EnablePortPackets() override;
@ -350,12 +349,13 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
// stun username attribute if present.
bool ParseStunUsername(const StunMessage* stun_msg,
std::string* local_username,
std::string* remote_username) const;
std::string CreateStunUsername(absl::string_view remote_username) const;
std::string* remote_username) const override;
std::string CreateStunUsername(
absl::string_view remote_username) const override;
bool MaybeIceRoleConflict(const rtc::SocketAddress& addr,
IceMessage* stun_msg,
absl::string_view remote_ufrag);
absl::string_view remote_ufrag) override;
// Called when a packet has been sent to the socket.
// This is made pure virtual to notify subclasses of Port that they MUST
@ -368,9 +368,9 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
void OnReadyToSend();
// Called when the Connection discovers a local peer reflexive candidate.
void AddPrflxCandidate(const Candidate& local);
void AddPrflxCandidate(const Candidate& local) override;
int16_t network_cost() const { return network_cost_; }
int16_t network_cost() const override { return network_cost_; }
void GetStunStats(absl::optional<StunStats>* stats) override {}
@ -380,13 +380,14 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
// then the foundation will be different. Two candidate pairs with
// the same foundation pairs are likely to have similar network
// characteristics. Foundations are used in the frozen algorithm.
std::string ComputeFoundation(absl::string_view type,
absl::string_view protocol,
absl::string_view relay_protocol,
const rtc::SocketAddress& base_address);
std::string ComputeFoundation(
absl::string_view type,
absl::string_view protocol,
absl::string_view relay_protocol,
const rtc::SocketAddress& base_address) override;
protected:
virtual void UpdateNetworkCost();
void UpdateNetworkCost() override;
rtc::WeakPtr<Port> NewWeakPtr() { return weak_factory_.GetWeakPtr(); }
@ -438,13 +439,13 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
size_t size,
const rtc::SocketAddress& addr,
std::unique_ptr<IceMessage>* out_msg,
std::string* out_username);
std::string* out_username) override;
// Checks if the address in addr is compatible with the port's ip.
bool IsCompatibleAddress(const rtc::SocketAddress& addr);
// Returns DSCP value packets generated by the port itself should use.
virtual rtc::DiffServCodePoint StunDscpValue() const;
rtc::DiffServCodePoint StunDscpValue() const override;
// Extra work to be done in subclasses when a connection is destroyed.
virtual void HandleConnectionDestroyed(Connection* conn) {}
@ -528,7 +529,6 @@ class RTC_EXPORT Port : public PortInterface, public sigslot::has_slots<> {
absl::string_view type,
bool is_final) RTC_RUN_ON(thread_);
friend class Connection;
webrtc::CallbackList<PortInterface*> port_destroyed_callback_list_;
};

View file

@ -11,13 +11,13 @@
#include "p2p/base/port_allocator.h"
#include <iterator>
#include <optional>
#include <set>
#include <utility>
#include "absl/strings/string_view.h"
#include "p2p/base/ice_credentials_iterator.h"
#include "rtc_base/checks.h"
#include "rtc_base/logging.h"
namespace cricket {

View file

@ -11,18 +11,26 @@
#ifndef P2P_BASE_PORT_ALLOCATOR_H_
#define P2P_BASE_PORT_ALLOCATOR_H_
#include <stdint.h>
#include <deque>
#include <memory>
#include <string>
#include <vector>
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "api/candidate.h"
#include "api/sequence_checker.h"
#include "api/transport/enums.h"
#include "p2p/base/port.h"
#include "p2p/base/port_interface.h"
#include "p2p/base/transport_description.h"
#include "rtc_base/checks.h"
#include "rtc_base/helpers.h"
#include "rtc_base/network.h"
#include "rtc_base/proxy_info.h"
#include "rtc_base/socket_address.h"
#include "rtc_base/ssl_certificate.h"
#include "rtc_base/system/rtc_export.h"
#include "rtc_base/third_party/sigslot/sigslot.h"

View file

@ -11,6 +11,7 @@
#ifndef P2P_BASE_PORT_INTERFACE_H_
#define P2P_BASE_PORT_INTERFACE_H_
#include <memory>
#include <string>
#include <utility>
#include <vector>
@ -18,9 +19,11 @@
#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "api/candidate.h"
#include "api/packet_socket_factory.h"
#include "p2p/base/transport_description.h"
#include "rtc_base/async_packet_socket.h"
#include "rtc_base/callback_list.h"
#include "rtc_base/proxy_info.h"
#include "rtc_base/socket_address.h"
namespace rtc {
@ -137,8 +140,80 @@ class PortInterface {
virtual void GetStunStats(absl::optional<StunStats>* stats) = 0;
// Removes and deletes a connection object. `DestroyConnection` will
// delete the connection object directly whereas `DestroyConnectionAsync`
// defers the `delete` operation to when the call stack has been unwound.
// Async may be needed when deleting a connection object from within a
// callback.
virtual void DestroyConnection(Connection* conn) = 0;
virtual void DestroyConnectionAsync(Connection* conn) = 0;
// The thread on which this port performs its I/O.
virtual webrtc::TaskQueueBase* thread() = 0;
// The factory used to create the sockets of this port.
virtual rtc::PacketSocketFactory* socket_factory() const = 0;
virtual const std::string& user_agent() = 0;
virtual const rtc::ProxyInfo& proxy() = 0;
// Identifies the generation that this port was created in.
virtual uint32_t generation() const = 0;
virtual void set_generation(uint32_t generation) = 0;
virtual bool send_retransmit_count_attribute() const = 0;
// For debugging purposes.
virtual const std::string& content_name() const = 0;
// Called when the Connection discovers a local peer reflexive candidate.
virtual void AddPrflxCandidate(const Candidate& local) = 0;
// Foundation: An arbitrary string that is the same for two candidates
// that have the same type, base IP address, protocol (UDP, TCP,
// etc.), and STUN or TURN server. If any of these are different,
// then the foundation will be different. Two candidate pairs with
// the same foundation pairs are likely to have similar network
// characteristics. Foundations are used in the frozen algorithm.
virtual std::string ComputeFoundation(
absl::string_view type,
absl::string_view protocol,
absl::string_view relay_protocol,
const rtc::SocketAddress& base_address) = 0;
protected:
PortInterface();
virtual void UpdateNetworkCost() = 0;
// Returns DSCP value packets generated by the port itself should use.
virtual rtc::DiffServCodePoint StunDscpValue() const = 0;
// If the given data comprises a complete and correct STUN message then the
// return value is true, otherwise false. If the message username corresponds
// with this port's username fragment, msg will contain the parsed STUN
// message. Otherwise, the function may send a STUN response internally.
// remote_username contains the remote fragment of the STUN username.
virtual bool GetStunMessage(const char* data,
size_t size,
const rtc::SocketAddress& addr,
std::unique_ptr<IceMessage>* out_msg,
std::string* out_username) = 0;
// This method will return local and remote username fragements from the
// stun username attribute if present.
virtual bool ParseStunUsername(const StunMessage* stun_msg,
std::string* local_username,
std::string* remote_username) const = 0;
virtual std::string CreateStunUsername(
absl::string_view remote_username) const = 0;
virtual bool MaybeIceRoleConflict(const rtc::SocketAddress& addr,
IceMessage* stun_msg,
absl::string_view remote_ufrag) = 0;
virtual int16_t network_cost() const = 0;
// Connection and Port are entangled; functions exposed to Port only
// should not be public.
friend class Connection;
};
} // namespace cricket

View file

@ -301,7 +301,7 @@ rtc_source_set("jsep_transport_controller") {
"../api/transport:enums",
"../api/transport:sctp_transport_factory_interface",
"../media:rtc_data_sctp_transport_internal",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:ice_transport_internal",
"../p2p:p2p_constants",
"../p2p:p2p_transport_channel",
@ -654,7 +654,7 @@ rtc_source_set("transport_stats") {
deps = [
"../api:dtls_transport_interface",
"../api:libjingle_peerconnection_api",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:ice_transport_internal",
"../p2p:rtc_p2p",
"../rtc_base:ssl",
@ -932,7 +932,7 @@ rtc_source_set("rtc_stats_collector") {
"../modules/audio_device",
"../modules/audio_processing:audio_processing_statistics",
"../modules/rtp_rtcp:rtp_rtcp_format",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:connection_info",
"../p2p:ice_transport_internal",
"../p2p:p2p_constants",
@ -1029,7 +1029,7 @@ rtc_source_set("sdp_offer_answer") {
"../media:rid_description",
"../media:rtc_media_base",
"../media:stream_params",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:ice_transport_internal",
"../p2p:p2p_constants",
"../p2p:p2p_transport_channel",
@ -1140,7 +1140,7 @@ rtc_source_set("peer_connection") {
"../media:stream_params",
"../modules/rtp_rtcp:rtp_rtcp_format",
"../p2p:basic_async_resolver_factory",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:connection_info",
"../p2p:ice_transport_internal",
"../p2p:p2p_constants",
@ -1237,7 +1237,7 @@ rtc_source_set("legacy_stats_collector") {
"../media:media_channel",
"../media:rtc_media_base",
"../modules/audio_processing:audio_processing_statistics",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:connection_info",
"../p2p:ice_transport_internal",
"../p2p:p2p_constants",
@ -1315,7 +1315,7 @@ rtc_source_set("webrtc_sdp") {
"../media:rtp_utils",
"../media:stream_params",
"../p2p:candidate_pair_interface",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:ice_transport_internal",
"../p2p:p2p_constants",
"../p2p:port_interface",
@ -1382,7 +1382,7 @@ rtc_library("ice_server_parsing") {
deps = [
"../api:libjingle_peerconnection_api",
"../api:rtc_error",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:port_interface",
"../p2p:rtc_p2p",
"../rtc_base:checks",
@ -1446,7 +1446,7 @@ rtc_source_set("peer_connection_factory") {
"../call:rtp_interfaces",
"../call:rtp_sender",
"../media:rtc_media_base",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:rtc_p2p",
"../pc:audio_track",
"../pc:connection_context",
@ -2167,7 +2167,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../media:rtc_media_tests_utils",
"../modules/audio_device:audio_device_api",
"../modules/audio_processing:api",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:p2p_test_utils",
"../p2p:port_interface",
"../p2p:rtc_p2p",
@ -2220,7 +2220,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../api:libjingle_peerconnection_api",
"../api:scoped_refptr",
"../api/units:time_delta",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:p2p_server_utils",
"../p2p:p2p_test_utils",
"../p2p:port_interface",
@ -2403,7 +2403,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../modules/audio_device:audio_device_api",
"../modules/audio_processing:audio_processing_statistics",
"../modules/rtp_rtcp:rtp_rtcp_format",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:connection_info",
"../p2p:fake_port_allocator",
"../p2p:ice_transport_internal",
@ -2619,7 +2619,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../modules/audio_processing:audio_processing_statistics",
"../modules/audio_processing:audioproc_test_utils",
"../modules/rtp_rtcp:rtp_rtcp_format",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:fake_ice_transport",
"../p2p:fake_port_allocator",
"../p2p:ice_transport_internal",
@ -2773,7 +2773,7 @@ if (rtc_include_tests && !build_with_chromium) {
"../modules/audio_processing",
"../modules/audio_processing:api",
"../modules/rtp_rtcp:rtp_rtcp_format",
"../p2p:connection_and_port",
"../p2p:connection",
"../p2p:fake_port_allocator",
"../p2p:p2p_test_utils",
"../p2p:rtc_p2p",