SDP is a detail of PeerConnection and is not used by anything in p2p, so it belongs in the pc/ directory. This also allows MediaContentDescription to be inlined in the future. Bug: webrtc:8620 Change-Id: I38b65ede9942e29eb15035ab29f2be988da1e5ce Reviewed-on: https://webrtc-review.googlesource.com/33781 Reviewed-by: Niklas Enbom <niklas.enbom@webrtc.org> Reviewed-by: Peter Thatcher <pthatcher@webrtc.org> Commit-Queue: Steve Anton <steveanton@webrtc.org> Cr-Commit-Position: refs/heads/master@{#21376}
206 lines
7.8 KiB
C++
206 lines
7.8 KiB
C++
/*
|
|
* 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.
|
|
*/
|
|
|
|
#ifndef PC_JSEPTRANSPORT_H_
|
|
#define PC_JSEPTRANSPORT_H_
|
|
|
|
#include <map>
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "api/candidate.h"
|
|
#include "api/jsep.h"
|
|
#include "api/optional.h"
|
|
#include "p2p/base/dtlstransport.h"
|
|
#include "p2p/base/p2pconstants.h"
|
|
#include "p2p/base/transportinfo.h"
|
|
#include "pc/sessiondescription.h"
|
|
#include "rtc_base/constructormagic.h"
|
|
#include "rtc_base/messagequeue.h"
|
|
#include "rtc_base/rtccertificate.h"
|
|
#include "rtc_base/sigslot.h"
|
|
#include "rtc_base/sslstreamadapter.h"
|
|
|
|
namespace cricket {
|
|
|
|
class DtlsTransportInternal;
|
|
|
|
struct TransportChannelStats {
|
|
TransportChannelStats();
|
|
TransportChannelStats(const TransportChannelStats&);
|
|
~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;
|
|
DtlsTransportState dtls_state = DTLS_TRANSPORT_NEW;
|
|
};
|
|
|
|
// 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 {
|
|
TransportStats();
|
|
~TransportStats();
|
|
|
|
std::string transport_name;
|
|
TransportChannelStatsList channel_stats;
|
|
};
|
|
|
|
bool BadTransportDescription(const std::string& desc, std::string* err_desc);
|
|
|
|
// 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).
|
|
//
|
|
// On Threading: Transport performs work solely on the network thread, and so
|
|
// its methods should only be called on the network thread.
|
|
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);
|
|
~JsepTransport() override;
|
|
|
|
// 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(DtlsTransportInternal* 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,
|
|
webrtc::SdpType type,
|
|
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,
|
|
webrtc::SdpType type,
|
|
std::string* error_desc);
|
|
|
|
// Set the "needs-ice-restart" flag as described in JSEP. After the flag is
|
|
// set, offers should generate new ufrags/passwords until an ICE restart
|
|
// occurs.
|
|
//
|
|
// This and the below method can be called safely from any thread as long as
|
|
// SetXTransportDescription is not in progress.
|
|
void SetNeedsIceRestartFlag();
|
|
// Returns true if the ICE restart flag above was set, and no ICE restart has
|
|
// occurred yet for this transport (by applying a local description with
|
|
// changed ufrag/password).
|
|
bool NeedsIceRestart() const;
|
|
|
|
// Returns role if negotiated, or empty Optional if it hasn't been negotiated
|
|
// yet.
|
|
rtc::Optional<rtc::SSLRole> GetSslRole() 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;
|
|
|
|
private:
|
|
// 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(webrtc::SdpType local_description_type,
|
|
std::string* error_desc);
|
|
|
|
// 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(webrtc::SdpType local_description_type,
|
|
std::string* error_desc);
|
|
|
|
// Pushes down the transport parameters from the local description, such
|
|
// as the ICE ufrag and pwd.
|
|
bool ApplyLocalTransportDescription(DtlsTransportInternal* dtls_transport,
|
|
std::string* error_desc);
|
|
|
|
// Pushes down the transport parameters from the remote description to the
|
|
// transport channel.
|
|
bool ApplyRemoteTransportDescription(DtlsTransportInternal* dtls_transport,
|
|
std::string* error_desc);
|
|
|
|
// Pushes down the transport parameters obtained via negotiation.
|
|
bool ApplyNegotiatedTransportDescription(
|
|
DtlsTransportInternal* dtls_transport,
|
|
std::string* error_desc);
|
|
|
|
const std::string mid_;
|
|
// needs-ice-restart bit as described in JSEP.
|
|
bool needs_ice_restart_ = false;
|
|
rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
|
|
rtc::Optional<rtc::SSLRole> ssl_role_;
|
|
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, DtlsTransportInternal*> channels_;
|
|
|
|
RTC_DISALLOW_COPY_AND_ASSIGN(JsepTransport);
|
|
};
|
|
|
|
} // namespace cricket
|
|
|
|
#endif // PC_JSEPTRANSPORT_H_
|