Index: webrtc/p2p/base/jseptransport.h |
diff --git a/webrtc/p2p/base/jseptransport.h b/webrtc/p2p/base/jseptransport.h |
deleted file mode 100644 |
index 537ddea01ac39e4308c549e760b7d8d94cc3c719..0000000000000000000000000000000000000000 |
--- a/webrtc/p2p/base/jseptransport.h |
+++ /dev/null |
@@ -1,377 +0,0 @@ |
-/* |
- * Copyright 2004 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. |
- */ |
- |
-// A Transport manages a set of named channels of the same type. |
-// |
-// Subclasses choose the appropriate class to instantiate for each channel; |
-// however, this base class keeps track of the channels by name, watches their |
-// state changes (in order to update the manager's state), and forwards |
-// requests to begin connecting or to reset to each of the channels. |
-// |
-// On Threading: Transport performs work solely on the network thread, and so |
-// its methods should only be called on the network thread. |
-// |
-// Note: Subclasses must call DestroyChannels() in their own destructors. |
-// It is not possible to do so here because the subclass destructor will |
-// already have run. |
- |
-#ifndef WEBRTC_P2P_BASE_JSEPTRANSPORT_H_ |
-#define WEBRTC_P2P_BASE_JSEPTRANSPORT_H_ |
- |
-#include <map> |
-#include <memory> |
-#include <string> |
-#include <vector> |
- |
-#include "webrtc/base/constructormagic.h" |
-#include "webrtc/base/optional.h" |
-#include "webrtc/p2p/base/candidate.h" |
-#include "webrtc/p2p/base/p2pconstants.h" |
-#include "webrtc/p2p/base/sessiondescription.h" |
-#include "webrtc/p2p/base/transportinfo.h" |
-#include "webrtc/base/messagequeue.h" |
-#include "webrtc/base/rtccertificate.h" |
-#include "webrtc/base/sigslot.h" |
-#include "webrtc/base/sslstreamadapter.h" |
- |
-namespace cricket { |
- |
-class TransportChannelImpl; |
-class TransportChannelImpl; |
- |
-typedef std::vector<Candidate> Candidates; |
- |
-// TODO(deadbeef): Move all of these enums, POD types and utility methods to |
-// another header file. |
- |
-// TODO(deadbeef): Unify with PeerConnectionInterface::IceConnectionState |
-// once /talk/ and /webrtc/ are combined, and also switch to ENUM_NAME naming |
-// style. |
-enum IceConnectionState { |
- kIceConnectionConnecting = 0, |
- kIceConnectionFailed, |
- kIceConnectionConnected, // Writable, but still checking one or more |
- // connections |
- kIceConnectionCompleted, |
-}; |
- |
-enum DtlsTransportState { |
- // Haven't started negotiating. |
- DTLS_TRANSPORT_NEW = 0, |
- // Have started negotiating. |
- DTLS_TRANSPORT_CONNECTING, |
- // Negotiated, and has a secure connection. |
- DTLS_TRANSPORT_CONNECTED, |
- // Transport is closed. |
- DTLS_TRANSPORT_CLOSED, |
- // Failed due to some error in the handshake process. |
- DTLS_TRANSPORT_FAILED, |
-}; |
- |
-// 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, |
- // The most recent port allocator session will keep on running, and it will |
- // try to recover connectivity if the channel becomes disconnected. |
- GATHER_CONTINUALLY_AND_RECOVER, |
-}; |
- |
-// Stats that we can return about the connections for a transport channel. |
-// TODO(hta): Rename to ConnectionStats |
-struct ConnectionInfo { |
- ConnectionInfo() |
- : best_connection(false), |
- writable(false), |
- receiving(false), |
- timeout(false), |
- new_connection(false), |
- rtt(0), |
- sent_total_bytes(0), |
- sent_bytes_second(0), |
- sent_discarded_packets(0), |
- sent_total_packets(0), |
- sent_ping_requests_total(0), |
- sent_ping_requests_before_first_response(0), |
- sent_ping_responses(0), |
- recv_total_bytes(0), |
- recv_bytes_second(0), |
- recv_ping_requests(0), |
- recv_ping_responses(0), |
- key(NULL) {} |
- |
- bool best_connection; // Is this the best connection we have? |
- bool writable; // Has this connection received a STUN response? |
- bool receiving; // Has this connection received anything? |
- bool timeout; // Has this connection timed out? |
- bool new_connection; // Is this a newly created connection? |
- size_t rtt; // The STUN RTT for this connection. |
- size_t sent_total_bytes; // Total bytes sent on this connection. |
- size_t sent_bytes_second; // Bps over the last measurement interval. |
- size_t sent_discarded_packets; // Number of outgoing packets discarded due to |
- // socket errors. |
- size_t sent_total_packets; // Number of total outgoing packets attempted for |
- // sending. |
- size_t sent_ping_requests_total; // Number of STUN ping request sent. |
- size_t sent_ping_requests_before_first_response; // Number of STUN ping |
- // sent before receiving the first response. |
- size_t sent_ping_responses; // Number of STUN ping response sent. |
- |
- size_t recv_total_bytes; // Total bytes received on this connection. |
- size_t recv_bytes_second; // Bps over the last measurement interval. |
- size_t recv_ping_requests; // Number of STUN ping request received. |
- size_t recv_ping_responses; // Number of STUN ping response received. |
- Candidate local_candidate; // The local candidate for this connection. |
- Candidate remote_candidate; // The remote candidate for this connection. |
- void* key; // A static value that identifies this conn. |
-}; |
- |
-// Information about all the connections of a channel. |
-typedef std::vector<ConnectionInfo> ConnectionInfos; |
- |
-// Information about a specific channel |
-struct TransportChannelStats { |
- int component = 0; |
- ConnectionInfos connection_infos; |
- int srtp_crypto_suite = rtc::SRTP_INVALID_CRYPTO_SUITE; |
- int ssl_cipher_suite = rtc::TLS_NULL_WITH_NULL_NULL; |
-}; |
- |
-// Information about all the channels of a transport. |
-// TODO(hta): Consider if a simple vector is as good as a map. |
-typedef std::vector<TransportChannelStats> TransportChannelStatsList; |
- |
-// Information about the stats of a transport. |
-struct TransportStats { |
- std::string transport_name; |
- TransportChannelStatsList channel_stats; |
-}; |
- |
-// 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 rtc::Optional to represent unset values, instead of |
-// -1. |
-struct IceConfig { |
- // The ICE connection receiving timeout value in milliseconds. |
- int receiving_timeout = -1; |
- // Time interval in milliseconds to ping a backup connection when the ICE |
- // channel is strongly connected. |
- int backup_connection_ping_interval = -1; |
- |
- ContinualGatheringPolicy continual_gathering_policy = GATHER_ONCE; |
- |
- bool gather_continually() const { |
- return continual_gathering_policy == GATHER_CONTINUALLY || |
- continual_gathering_policy == GATHER_CONTINUALLY_AND_RECOVER; |
- } |
- |
- // 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. |
- int stable_writable_connection_ping_interval = -1; |
- |
- // 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; |
- |
- // Interval to check on all networks and to perform ICE regathering on any |
- // active network having no connection on it. |
- rtc::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. |
- rtc::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; |
- |
- 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) |
- : receiving_timeout(receiving_timeout_ms), |
- backup_connection_ping_interval(backup_connection_ping_interval), |
- continual_gathering_policy(gathering_policy), |
- prioritize_most_likely_candidate_pairs( |
- prioritize_most_likely_candidate_pairs), |
- stable_writable_connection_ping_interval( |
- stable_writable_connection_ping_interval_ms), |
- presume_writable_when_fully_relayed( |
- presume_writable_when_fully_relayed), |
- regather_on_failed_networks_interval( |
- regather_on_failed_networks_interval_ms), |
- receiving_switching_delay(receiving_switching_delay_ms) {} |
-}; |
- |
-bool BadTransportDescription(const std::string& desc, std::string* err_desc); |
- |
-bool IceCredentialsChanged(const std::string& old_ufrag, |
- const std::string& old_pwd, |
- const std::string& new_ufrag, |
- const std::string& new_pwd); |
- |
-// If a candidate is not acceptable, returns false and sets error. |
-bool VerifyCandidate(const Candidate& candidate, std::string* error); |
-bool VerifyCandidates(const Candidates& candidates, std::string* error); |
- |
-// Helper class used by TransportController that processes |
-// TransportDescriptions. A TransportDescription represents the |
-// transport-specific properties of an SDP m= section, processed according to |
-// JSEP. Each transport consists of DTLS and ICE transport channels for RTP |
-// (and possibly RTCP, if rtcp-mux isn't used). |
-// TODO(deadbeef): Move this into /pc/ and out of /p2p/base/, since it's |
-// PeerConnection-specific. |
-class JsepTransport : public sigslot::has_slots<> { |
- public: |
- // |mid| is just used for log statements in order to identify the Transport. |
- // Note that |certificate| is allowed to be null since a remote description |
- // may be set before a local certificate is generated. |
- JsepTransport(const std::string& mid, |
- const rtc::scoped_refptr<rtc::RTCCertificate>& certificate); |
- |
- // Returns the MID of this transport. |
- const std::string& mid() const { return mid_; } |
- |
- // Add or remove channel that is affected when a local/remote transport |
- // description is set on this transport. Need to add all channels before |
- // setting a transport description. |
- bool AddChannel(TransportChannelImpl* dtls, int component); |
- bool RemoveChannel(int component); |
- bool HasChannels() const; |
- |
- bool ready_for_remote_candidates() const { |
- return local_description_set_ && remote_description_set_; |
- } |
- |
- // Must be called before applying local session description. |
- // Needed in order to verify the local fingerprint. |
- void SetLocalCertificate( |
- const rtc::scoped_refptr<rtc::RTCCertificate>& certificate); |
- |
- // Get a copy of the local certificate provided by SetLocalCertificate. |
- bool GetLocalCertificate( |
- rtc::scoped_refptr<rtc::RTCCertificate>* certificate) const; |
- |
- // Set the local TransportDescription to be used by DTLS and ICE channels |
- // that are part of this Transport. |
- bool SetLocalTransportDescription(const TransportDescription& description, |
- ContentAction action, |
- std::string* error_desc); |
- |
- // Set the remote TransportDescription to be used by DTLS and ICE channels |
- // that are part of this Transport. |
- bool SetRemoteTransportDescription(const TransportDescription& description, |
- ContentAction action, |
- std::string* error_desc); |
- |
- void GetSslRole(rtc::SSLRole* ssl_role) const; |
- |
- // TODO(deadbeef): Make this const. See comment in transportcontroller.h. |
- bool GetStats(TransportStats* stats); |
- |
- // The current local transport description, possibly used |
- // by the transport controller. |
- const TransportDescription* local_description() const { |
- return local_description_.get(); |
- } |
- |
- // The current remote transport description, possibly used |
- // by the transport controller. |
- const TransportDescription* remote_description() const { |
- return remote_description_.get(); |
- } |
- |
- // TODO(deadbeef): The methods below are only public for testing. Should make |
- // them utility functions or objects so they can be tested independently from |
- // this class. |
- |
- // Returns false if the certificate's identity does not match the fingerprint, |
- // or either is NULL. |
- bool VerifyCertificateFingerprint(const rtc::RTCCertificate* certificate, |
- const rtc::SSLFingerprint* fingerprint, |
- std::string* error_desc) const; |
- |
- // Negotiates the SSL role based off the offer and answer as specified by |
- // RFC 4145, section-4.1. Returns false if the SSL role cannot be determined |
- // from the local description and remote description. |
- bool NegotiateRole(ContentAction local_role, |
- rtc::SSLRole* ssl_role, |
- std::string* error_desc) const; |
- |
- private: |
- TransportChannelImpl* GetChannel(int component); |
- |
- // Negotiates the transport parameters based on the current local and remote |
- // transport description, such as the ICE role to use, and whether DTLS |
- // should be activated. |
- // |
- // Called when an answer TransportDescription is applied. |
- bool NegotiateTransportDescription(ContentAction local_role, |
- std::string* error_desc); |
- |
- // Pushes down the transport parameters from the local description, such |
- // as the ICE ufrag and pwd. |
- bool ApplyLocalTransportDescription(TransportChannelImpl* channel, |
- std::string* error_desc); |
- |
- // Pushes down the transport parameters from the remote description to the |
- // transport channel. |
- bool ApplyRemoteTransportDescription(TransportChannelImpl* channel, |
- std::string* error_desc); |
- |
- // Pushes down the transport parameters obtained via negotiation. |
- bool ApplyNegotiatedTransportDescription(TransportChannelImpl* channel, |
- std::string* error_desc); |
- |
- const std::string mid_; |
- rtc::scoped_refptr<rtc::RTCCertificate> certificate_; |
- rtc::SSLRole secure_role_ = rtc::SSL_CLIENT; |
- std::unique_ptr<rtc::SSLFingerprint> remote_fingerprint_; |
- std::unique_ptr<TransportDescription> local_description_; |
- std::unique_ptr<TransportDescription> remote_description_; |
- bool local_description_set_ = false; |
- bool remote_description_set_ = false; |
- |
- // Candidate component => DTLS channel |
- std::map<int, TransportChannelImpl*> channels_; |
- |
- RTC_DISALLOW_COPY_AND_ASSIGN(JsepTransport); |
-}; |
- |
-} // namespace cricket |
- |
-#endif // WEBRTC_P2P_BASE_JSEPTRANSPORT_H_ |