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}
diff --git a/p2p/base/ice_controller_interface.h b/p2p/base/ice_controller_interface.h
new file mode 100644
index 0000000..4f8dc72
--- /dev/null
+++ b/p2p/base/ice_controller_interface.h
@@ -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_