123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /*
- * Copyright 2019 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_CONTROLLER_INTERFACE_H_
- #define P2P_BASE_ICE_CONTROLLER_INTERFACE_H_
- #include <string>
- #include <utility>
- #include <vector>
- #include "p2p/base/connection.h"
- #include "p2p/base/ice_transport_internal.h"
- namespace cricket {
- struct IceFieldTrials; // Forward declaration to avoid circular dependency.
- struct IceControllerEvent {
- enum Type {
- REMOTE_CANDIDATE_GENERATION_CHANGE,
- NETWORK_PREFERENCE_CHANGE,
- NEW_CONNECTION_FROM_LOCAL_CANDIDATE,
- NEW_CONNECTION_FROM_REMOTE_CANDIDATE,
- NEW_CONNECTION_FROM_UNKNOWN_REMOTE_ADDRESS,
- NOMINATION_ON_CONTROLLED_SIDE,
- DATA_RECEIVED,
- CONNECT_STATE_CHANGE,
- SELECTED_CONNECTION_DESTROYED,
- // The ICE_CONTROLLER_RECHECK enum value lets an IceController request
- // P2PTransportChannel to recheck a switch periodically without an event
- // taking place.
- ICE_CONTROLLER_RECHECK,
- };
- IceControllerEvent(const Type& _type) // NOLINT: runtime/explicit
- : type(_type) {}
- std::string ToString() const;
- Type type;
- int recheck_delay_ms = 0;
- };
- // Defines the interface for a module that control
- // - which connection to ping
- // - which connection to use
- // - which connection to prune
- // - which connection to forget learned state on
- //
- // The P2PTransportChannel owns (creates and destroys) Connections,
- // but P2PTransportChannel gives const pointers to the the IceController using
- // |AddConnection|, i.e the IceController should not call any non-const methods
- // on a Connection but signal back in the interface if any mutable function
- // shall be called.
- //
- // Current these are limited to:
- // Connection::Ping - returned in PingResult
- // Connection::Prune - retuned in PruneConnections
- // Connection::ForgetLearnedState - return in SwitchResult
- //
- // The IceController shall keep track of all connections added
- // (and not destroyed) and give them back using the connections()-function-
- //
- // When a Connection gets destroyed
- // - signals on Connection::SignalDestroyed
- // - P2PTransportChannel calls IceController::OnConnectionDestroyed
- class IceControllerInterface {
- public:
- // This represents the result of a switch call.
- struct SwitchResult {
- // Connection that we should (optionally) switch to.
- absl::optional<const Connection*> connection;
- // An optional recheck event for when a Switch() should be attempted again.
- absl::optional<IceControllerEvent> recheck_event;
- // A vector with connection to run ForgetLearnedState on.
- std::vector<const Connection*> connections_to_forget_state_on;
- };
- // This represents the result of a call to SelectConnectionToPing.
- struct PingResult {
- PingResult(const Connection* conn, int _recheck_delay_ms)
- : connection(conn), recheck_delay_ms(_recheck_delay_ms) {}
- // Connection that we should (optionally) ping.
- const absl::optional<const Connection*> connection;
- // The delay before P2PTransportChannel shall call SelectConnectionToPing()
- // again.
- //
- // Since the IceController determines which connection to ping and
- // only returns one connection at a time, the recheck_delay_ms does not have
- // any obvious implication on bitrate for pings. E.g the recheck_delay_ms
- // will be shorter if there are more connections available.
- const int recheck_delay_ms = 0;
- };
- virtual ~IceControllerInterface() = default;
- // These setters are called when the state of P2PTransportChannel is mutated.
- virtual void SetIceConfig(const IceConfig& config) = 0;
- virtual void SetSelectedConnection(const Connection* selected_connection) = 0;
- virtual void AddConnection(const Connection* connection) = 0;
- virtual void OnConnectionDestroyed(const Connection* connection) = 0;
- // These are all connections that has been added and not destroyed.
- virtual rtc::ArrayView<const Connection*> connections() const = 0;
- // Is there a pingable connection ?
- // This function is used to boot-strap pinging, after this returns true
- // SelectConnectionToPing() will be called periodically.
- virtual bool HasPingableConnection() const = 0;
- // Select a connection to Ping, or nullptr if none.
- virtual PingResult SelectConnectionToPing(int64_t last_ping_sent_ms) = 0;
- // Compute the "STUN_ATTR_USE_CANDIDATE" for |conn|.
- virtual bool GetUseCandidateAttr(const Connection* conn,
- NominationMode mode,
- IceMode remote_ice_mode) const = 0;
- // These methods is only added to not have to change all unit tests
- // that simulate pinging by marking a connection pinged.
- virtual const Connection* FindNextPingableConnection() = 0;
- virtual void MarkConnectionPinged(const Connection* con) = 0;
- // Check if we should switch to |connection|.
- // This method is called for IceControllerEvent's that can switch directly
- // i.e without resorting.
- virtual SwitchResult ShouldSwitchConnection(IceControllerEvent reason,
- const Connection* connection) = 0;
- // Sort connections and check if we should switch.
- virtual SwitchResult SortAndSwitchConnection(IceControllerEvent reason) = 0;
- // Prune connections.
- virtual std::vector<const Connection*> PruneConnections() = 0;
- };
- } // namespace cricket
- #endif // P2P_BASE_ICE_CONTROLLER_INTERFACE_H_
|