123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- /*
- * Copyright 2016 The WebRTC Project Authors. All rights reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
- #ifndef P2P_BASE_ICE_TRANSPORT_INTERNAL_H_
- #define P2P_BASE_ICE_TRANSPORT_INTERNAL_H_
- #include <stdint.h>
- #include <string>
- #include <vector>
- #include "absl/types/optional.h"
- #include "api/candidate.h"
- #include "api/transport/enums.h"
- #include "p2p/base/connection.h"
- #include "p2p/base/packet_transport_internal.h"
- #include "p2p/base/port.h"
- #include "p2p/base/transport_description.h"
- #include "rtc_base/network_constants.h"
- #include "rtc_base/system/rtc_export.h"
- #include "rtc_base/third_party/sigslot/sigslot.h"
- #include "rtc_base/time_utils.h"
- namespace cricket {
- struct IceTransportStats {
- CandidateStatsList candidate_stats_list;
- ConnectionInfos connection_infos;
- // Number of times the selected candidate pair has changed
- // Initially 0 and 1 once the first candidate pair has been selected.
- // The counter is increase also when "unselecting" a connection.
- uint32_t selected_candidate_pair_changes = 0;
- };
- typedef std::vector<Candidate> Candidates;
- enum IceConnectionState {
- kIceConnectionConnecting = 0,
- kIceConnectionFailed,
- kIceConnectionConnected, // Writable, but still checking one or more
- // connections
- kIceConnectionCompleted,
- };
- // TODO(deadbeef): Unify with PeerConnectionInterface::IceConnectionState
- // once /talk/ and /webrtc/ are combined, and also switch to ENUM_NAME naming
- // style.
- enum IceGatheringState {
- kIceGatheringNew = 0,
- kIceGatheringGathering,
- kIceGatheringComplete,
- };
- enum ContinualGatheringPolicy {
- // All port allocator sessions will stop after a writable connection is found.
- GATHER_ONCE = 0,
- // The most recent port allocator session will keep on running.
- GATHER_CONTINUALLY,
- };
- // ICE Nomination mode.
- enum class NominationMode {
- REGULAR, // Nominate once per ICE restart (Not implemented yet).
- AGGRESSIVE, // Nominate every connection except that it will behave as if
- // REGULAR when the remote is an ICE-LITE endpoint.
- SEMI_AGGRESSIVE // Our current implementation of the nomination algorithm.
- // The details are described in P2PTransportChannel.
- };
- // Information about ICE configuration.
- // TODO(deadbeef): Use absl::optional to represent unset values, instead of
- // -1.
- struct IceConfig {
- // The ICE connection receiving timeout value in milliseconds.
- absl::optional<int> receiving_timeout;
- // Time interval in milliseconds to ping a backup connection when the ICE
- // channel is strongly connected.
- absl::optional<int> backup_connection_ping_interval;
- ContinualGatheringPolicy continual_gathering_policy = GATHER_ONCE;
- bool gather_continually() const {
- return continual_gathering_policy == GATHER_CONTINUALLY;
- }
- // Whether we should prioritize Relay/Relay candidate when nothing
- // is writable yet.
- bool prioritize_most_likely_candidate_pairs = false;
- // Writable connections are pinged at a slower rate once stablized.
- absl::optional<int> stable_writable_connection_ping_interval;
- // If set to true, this means the ICE transport should presume TURN-to-TURN
- // candidate pairs will succeed, even before a binding response is received.
- bool presume_writable_when_fully_relayed = false;
- // If true, after the ICE transport type (as the candidate filter used by the
- // port allocator) is changed such that new types of ICE candidates are
- // allowed by the new filter, e.g. from CF_RELAY to CF_ALL, candidates that
- // have been gathered by the ICE transport but filtered out and not signaled
- // to the upper layers, will be surfaced.
- bool surface_ice_candidates_on_ice_transport_type_changed = false;
- // Interval to check on all networks and to perform ICE regathering on any
- // active network having no connection on it.
- absl::optional<int> regather_on_failed_networks_interval;
- // The time period in which we will not switch the selected connection
- // when a new connection becomes receiving but the selected connection is not
- // in case that the selected connection may become receiving soon.
- absl::optional<int> receiving_switching_delay;
- // TODO(honghaiz): Change the default to regular nomination.
- // Default nomination mode if the remote does not support renomination.
- NominationMode default_nomination_mode = NominationMode::SEMI_AGGRESSIVE;
- // The interval in milliseconds at which ICE checks (STUN pings) will be sent
- // for a candidate pair when it is both writable and receiving (strong
- // connectivity). This parameter overrides the default value given by
- // |STRONG_PING_INTERVAL| in p2ptransport.h if set.
- absl::optional<int> ice_check_interval_strong_connectivity;
- // The interval in milliseconds at which ICE checks (STUN pings) will be sent
- // for a candidate pair when it is either not writable or not receiving (weak
- // connectivity). This parameter overrides the default value given by
- // |WEAK_PING_INTERVAL| in p2ptransport.h if set.
- absl::optional<int> ice_check_interval_weak_connectivity;
- // ICE checks (STUN pings) will not be sent at higher rate (lower interval)
- // than this, no matter what other settings there are.
- // Measure in milliseconds.
- //
- // Note that this parameter overrides both the above check intervals for
- // candidate pairs with strong or weak connectivity, if either of the above
- // interval is shorter than the min interval.
- absl::optional<int> ice_check_min_interval;
- // The min time period for which a candidate pair must wait for response to
- // connectivity checks before it becomes unwritable. This parameter
- // overrides the default value given by |CONNECTION_WRITE_CONNECT_TIMEOUT|
- // in port.h if set, when determining the writability of a candidate pair.
- absl::optional<int> ice_unwritable_timeout;
- // The min number of connectivity checks that a candidate pair must sent
- // without receiving response before it becomes unwritable. This parameter
- // overrides the default value given by |CONNECTION_WRITE_CONNECT_FAILURES| in
- // port.h if set, when determining the writability of a candidate pair.
- absl::optional<int> ice_unwritable_min_checks;
- // The min time period for which a candidate pair must wait for response to
- // connectivity checks it becomes inactive. This parameter overrides the
- // default value given by |CONNECTION_WRITE_TIMEOUT| in port.h if set, when
- // determining the writability of a candidate pair.
- absl::optional<int> ice_inactive_timeout;
- // The interval in milliseconds at which STUN candidates will resend STUN
- // binding requests to keep NAT bindings open.
- absl::optional<int> stun_keepalive_interval;
- absl::optional<rtc::AdapterType> network_preference;
- IceConfig();
- IceConfig(int receiving_timeout_ms,
- int backup_connection_ping_interval,
- ContinualGatheringPolicy gathering_policy,
- bool prioritize_most_likely_candidate_pairs,
- int stable_writable_connection_ping_interval_ms,
- bool presume_writable_when_fully_relayed,
- int regather_on_failed_networks_interval_ms,
- int receiving_switching_delay_ms);
- ~IceConfig();
- // Helper getters for parameters with implementation-specific default value.
- // By convention, parameters with default value are represented by
- // absl::optional and setting a parameter to null restores its default value.
- int receiving_timeout_or_default() const;
- int backup_connection_ping_interval_or_default() const;
- int stable_writable_connection_ping_interval_or_default() const;
- int regather_on_failed_networks_interval_or_default() const;
- int receiving_switching_delay_or_default() const;
- int ice_check_interval_strong_connectivity_or_default() const;
- int ice_check_interval_weak_connectivity_or_default() const;
- int ice_check_min_interval_or_default() const;
- int ice_unwritable_timeout_or_default() const;
- int ice_unwritable_min_checks_or_default() const;
- int ice_inactive_timeout_or_default() const;
- int stun_keepalive_interval_or_default() const;
- };
- // TODO(zhihuang): Replace this with
- // PeerConnectionInterface::IceConnectionState.
- enum class IceTransportState {
- STATE_INIT,
- STATE_CONNECTING, // Will enter this state once a connection is created
- STATE_COMPLETED,
- STATE_FAILED
- };
- // TODO(zhihuang): Remove this once it's no longer used in
- // remoting/protocol/libjingle_transport_factory.cc
- enum IceProtocolType {
- ICEPROTO_RFC5245 // Standard RFC 5245 version of ICE.
- };
- // IceTransportInternal is an internal abstract class that does ICE.
- // Once the public interface is supported,
- // (https://www.w3.org/TR/webrtc/#rtcicetransport)
- // the IceTransportInterface will be split from this class.
- class RTC_EXPORT IceTransportInternal : public rtc::PacketTransportInternal {
- public:
- IceTransportInternal();
- ~IceTransportInternal() override;
- // TODO(bugs.webrtc.org/9308): Remove GetState once all uses have been
- // migrated to GetIceTransportState.
- virtual IceTransportState GetState() const = 0;
- virtual webrtc::IceTransportState GetIceTransportState() const = 0;
- virtual int component() const = 0;
- virtual IceRole GetIceRole() const = 0;
- virtual void SetIceRole(IceRole role) = 0;
- virtual void SetIceTiebreaker(uint64_t tiebreaker) = 0;
- // TODO(zhihuang): Remove this once it's no longer called in
- // remoting/protocol/libjingle_transport_factory.cc
- virtual void SetIceProtocolType(IceProtocolType type) {}
- virtual void SetIceCredentials(const std::string& ice_ufrag,
- const std::string& ice_pwd);
- virtual void SetRemoteIceCredentials(const std::string& ice_ufrag,
- const std::string& ice_pwd);
- // The ufrag and pwd in |ice_params| must be set
- // before candidate gathering can start.
- virtual void SetIceParameters(const IceParameters& ice_params) = 0;
- virtual void SetRemoteIceParameters(const IceParameters& ice_params) = 0;
- virtual void SetRemoteIceMode(IceMode mode) = 0;
- virtual void SetIceConfig(const IceConfig& config) = 0;
- // Start gathering candidates if not already started, or if an ICE restart
- // occurred.
- virtual void MaybeStartGathering() = 0;
- virtual void AddRemoteCandidate(const Candidate& candidate) = 0;
- virtual void RemoveRemoteCandidate(const Candidate& candidate) = 0;
- virtual void RemoveAllRemoteCandidates() = 0;
- virtual IceGatheringState gathering_state() const = 0;
- // Returns the current stats for this connection.
- virtual bool GetStats(IceTransportStats* ice_transport_stats) = 0;
- // Returns RTT estimate over the currently active connection, or an empty
- // absl::optional if there is none.
- virtual absl::optional<int> GetRttEstimate() = 0;
- // TODO(qingsi): Remove this method once Chrome does not depend on it anymore.
- virtual const Connection* selected_connection() const = 0;
- // Returns the selected candidate pair, or an empty absl::optional if there is
- // none.
- virtual absl::optional<const CandidatePair> GetSelectedCandidatePair()
- const = 0;
- sigslot::signal1<IceTransportInternal*> SignalGatheringState;
- // Handles sending and receiving of candidates.
- sigslot::signal2<IceTransportInternal*, const Candidate&>
- SignalCandidateGathered;
- sigslot::signal2<IceTransportInternal*, const IceCandidateErrorEvent&>
- SignalCandidateError;
- sigslot::signal2<IceTransportInternal*, const Candidates&>
- SignalCandidatesRemoved;
- // Deprecated by PacketTransportInternal::SignalNetworkRouteChanged.
- // This signal occurs when there is a change in the way that packets are
- // being routed, i.e. to a different remote location. The candidate
- // indicates where and how we are currently sending media.
- // TODO(zhihuang): Update the Chrome remoting to use the new
- // SignalNetworkRouteChanged.
- sigslot::signal2<IceTransportInternal*, const Candidate&> SignalRouteChange;
- sigslot::signal1<const cricket::CandidatePairChangeEvent&>
- SignalCandidatePairChanged;
- // Invoked when there is conflict in the ICE role between local and remote
- // agents.
- sigslot::signal1<IceTransportInternal*> SignalRoleConflict;
- // Emitted whenever the transport state changed.
- // TODO(bugs.webrtc.org/9308): Remove once all uses have migrated to the new
- // IceTransportState.
- sigslot::signal1<IceTransportInternal*> SignalStateChanged;
- // Emitted whenever the new standards-compliant transport state changed.
- sigslot::signal1<IceTransportInternal*> SignalIceTransportStateChanged;
- // Invoked when the transport is being destroyed.
- sigslot::signal1<IceTransportInternal*> SignalDestroyed;
- };
- } // namespace cricket
- #endif // P2P_BASE_ICE_TRANSPORT_INTERNAL_H_
|