webrtc_m130/p2p/base/ice_controller_interface.h
Sameer Vijaykar 794e68cf3d Refactor IceControllerEvent
This change is the first step in decoupling IceControllerEvent from the
ICE switch reason. Further cleanup is earmarked, and will be landed
after some internal cleanup.

This change
- adds a new enum - IceSwitchReason
- adds a member for the new enum in IceControllerEvent
- uses the new enum within P2PTransportChannel
- adds methods to IceControllerInterface accepting the new enum
- deprecates usages of the old enum in IceControllerInterface
- adds conversion between the old and new enums for compatibility

Bug: webrtc:14125, webrtc:14131
Change-Id: I5b7201c3f631eb40db334dfeec842841a7e58174
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/264140
Reviewed-by: Jonas Oreland <jonaso@webrtc.org>
Commit-Queue: Sameer Vijaykar <samvi@google.com>
Cr-Commit-Position: refs/heads/main@{#37051}
2022-05-31 07:32:54 +00:00

183 lines
7.0 KiB
C++

/*
* 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 "absl/types/optional.h"
#include "p2p/base/connection.h"
#include "p2p/base/ice_switch_reason.h"
#include "p2p/base/ice_transport_internal.h"
namespace cricket {
struct IceFieldTrials; // Forward declaration to avoid circular dependency.
struct IceControllerEvent {
// TODO(bugs.webrtc.org/14125) replace with IceSwitchReason.
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(IceSwitchReason _reason, int _recheck_delay_ms)
: reason(_reason),
type(FromIceSwitchReason(_reason)),
recheck_delay_ms(_recheck_delay_ms) {}
[[deprecated("bugs.webrtc.org/14125")]] IceControllerEvent(
const Type& _type) // NOLINT: runtime/explicit
: reason(FromType(_type)), type(_type) {}
static Type FromIceSwitchReason(IceSwitchReason reason);
static IceSwitchReason FromType(Type type);
std::string ToString() const;
IceSwitchReason reason;
// TODO(bugs.webrtc.org/14125) replace usage with IceSwitchReason.
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 ? absl::optional<const Connection*>(conn)
: absl::nullopt),
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 IceSwitchReasons that can switch directly
// i.e without resorting.
// TODO(bugs.webrtc.org/14125) change to pure virtual.
virtual SwitchResult ShouldSwitchConnection(IceSwitchReason reason,
const Connection* connection) {
return {absl::nullopt, absl::nullopt};
}
[[deprecated("bugs.webrtc.org/14125")]] virtual SwitchResult
ShouldSwitchConnection(IceControllerEvent reason,
const Connection* connection) {
return ShouldSwitchConnection(IceControllerEvent::FromType(reason.type),
connection);
}
// Sort connections and check if we should switch.
// TODO(bugs.webrtc.org/14125) change to pure virtual.
virtual SwitchResult SortAndSwitchConnection(IceSwitchReason reason) {
return {absl::nullopt, absl::nullopt};
}
[[deprecated("bugs.webrtc.org/14125")]] virtual SwitchResult
SortAndSwitchConnection(IceControllerEvent reason) {
return SortAndSwitchConnection(IceControllerEvent::FromType(reason.type));
}
// Prune connections.
virtual std::vector<const Connection*> PruneConnections() = 0;
};
} // namespace cricket
#endif // P2P_BASE_ICE_CONTROLLER_INTERFACE_H_