Split P2PTransportChannel
This patch moves the logic for - selection of connection to ping - selection of connection to use - selection of connection to prune into own file and puts it behind a new interface called 'IceControllerInterface'. BUG=webrtc:10647 Change-Id: I10228b3edd361d3200fa4a734d74a319560966c9 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/158205 Reviewed-by: Qingsi Wang <qingsi@webrtc.org> Reviewed-by: Honghai Zhang <honghaiz@webrtc.org> Commit-Queue: Jonas Oreland <jonaso@webrtc.org> Cr-Commit-Position: refs/heads/master@{#29850}
This commit is contained in:
committed by
Commit Bot
parent
d51cc7bd71
commit
09c452e7ba
117
p2p/base/ice_controller_interface.h
Normal file
117
p2p/base/ice_controller_interface.h
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
* 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
|
||||
};
|
||||
|
||||
IceControllerEvent(const Type& _type) // NOLINT: runtime/explicit
|
||||
: type(_type) {}
|
||||
std::string ToString() const;
|
||||
|
||||
Type type;
|
||||
int dampening_delay = 0;
|
||||
};
|
||||
|
||||
// Defines the interface for a module that control
|
||||
// - which connection to ping
|
||||
// - which connection to use
|
||||
// - which connection to prune
|
||||
//
|
||||
// P2PTransportChannel creates a |Connection| and adds a const pointer
|
||||
// to the IceController using |AddConnection|, i.e the IceController
|
||||
// should not call any non-const methods on a Connection.
|
||||
//
|
||||
// The IceController shall keeps 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;
|
||||
|
||||
// Delay in milliseconds when we should resort and try switching again.
|
||||
absl::optional<int> recheck_delay_ms;
|
||||
};
|
||||
|
||||
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 std::pair<Connection*, int> 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_
|
||||
Reference in New Issue
Block a user