webrtc_m130/pc/sctp_transport.h
Tomas Gunnarsson 92eebefd47 Reland "Fix unsynchronized access to mid_to_transport_ in JsepTransportController"
This reverts commit 6b143c1c0686519bc9d73223c1350cee286c8d78.

Reason for revert:
  Relanding with updated expectations for SctpTransport::Information
  based on TransceiverStateSurfacer in Chromium.


Original change's description:
> Revert "Fix unsynchronized access to mid_to_transport_ in JsepTransportController"
>
> This reverts commit 6cd405850467683cf10d05028ea0f644a68a91a4.
>
> Reason for revert: Breaks WebRTC Chromium FYI Bots
>
> First failure:
> https://ci.chromium.org/p/chromium/builders/webrtc.fyi/WebRTC%20Chromium%20FYI%20Android%20Tests%20%28dbg%29%20%28L%20Nexus5%29/1925
>
> Failed tests:
> WebRtcDataBrowserTest.CallWithSctpDataAndMedia
> WebRtcDataBrowserTest.CallWithSctpDataOnly
>
> Original change's description:
> > Fix unsynchronized access to mid_to_transport_ in JsepTransportController
> >
> > * Added several thread checks to JTC to help with programmer errors.
> > * Avoid a few Invokes() to the network thread here and there such
> >   as for fetching sctp transport name for getStats(). The transport
> >   name is now cached when it changes on the network thread.
> > * JsepTransportController instances now get deleted on the network
> >   thread rather than on the signaling thread + issuing an Invoke()
> >   in the dtor.
> > * Moved some thread hops from JTC over to PC which is where the problem
> >   exists and also (imho) makes it easier to see where hops happen in
> >   the PC code.
> > * The sctp transport is now started asynchronously when we push down the
> >   media description.
> > * PeerConnection proxy calls GetSctpTransport directly on the network
> >   thread instead of to the signaling thread + blocking on the network
> >   thread.
> > * The above changes simplified things for webrtc::SctpTransport which
> >   allowed for removing locking from that class and delete some code.
> >
> > Bug: webrtc:9987, webrtc:12445
> > Change-Id: Ic89a9426e314e1b93c81751d4f732f05fa448fbc
> > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/205620
> > Commit-Queue: Tommi <tommi@webrtc.org>
> > Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> > Cr-Commit-Position: refs/heads/master@{#33191}
>
> TBR=tommi@webrtc.org,hta@webrtc.org
>
> Change-Id: I7b2913d5133807589461105cf07eff3e9bb7157e
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: webrtc:9987
> Bug: webrtc:12445
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/206466
> Reviewed-by: Guido Urdaneta <guidou@webrtc.org>
> Commit-Queue: Guido Urdaneta <guidou@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#33204}

TBR=tommi@webrtc.org,hta@webrtc.org,guidou@webrtc.org

# Not skipping CQ checks because this is a reland.

Bug: webrtc:9987
Bug: webrtc:12445
Change-Id: Icb205cbac493ed3b881d71ea3af4fb9018701bf4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/206560
Reviewed-by: Tommi <tommi@webrtc.org>
Reviewed-by: Guido Urdaneta <guidou@webrtc.org>
Commit-Queue: Tommi <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#33219}
2021-02-10 13:40:22 +00:00

91 lines
3.3 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 PC_SCTP_TRANSPORT_H_
#define PC_SCTP_TRANSPORT_H_
#include <memory>
#include "api/dtls_transport_interface.h"
#include "api/scoped_refptr.h"
#include "api/sctp_transport_interface.h"
#include "media/sctp/sctp_transport.h"
#include "media/sctp/sctp_transport_internal.h"
#include "p2p/base/dtls_transport_internal.h"
#include "pc/dtls_transport.h"
#include "rtc_base/third_party/sigslot/sigslot.h"
#include "rtc_base/thread.h"
#include "rtc_base/thread_annotations.h"
namespace webrtc {
// This implementation wraps a cricket::SctpTransport, and takes
// ownership of it.
// This object must be constructed and updated on the networking thread,
// the same thread as the one the cricket::SctpTransportInternal object
// lives on.
class SctpTransport : public SctpTransportInterface,
public sigslot::has_slots<> {
public:
explicit SctpTransport(
std::unique_ptr<cricket::SctpTransportInternal> internal);
rtc::scoped_refptr<DtlsTransportInterface> dtls_transport() const override;
SctpTransportInformation Information() const override;
void RegisterObserver(SctpTransportObserverInterface* observer) override;
void UnregisterObserver() override;
// Internal functions
void Clear();
void SetDtlsTransport(rtc::scoped_refptr<DtlsTransport>);
// Initialize the cricket::SctpTransport. This can be called from
// the signaling thread.
void Start(int local_port, int remote_port, int max_message_size);
// TODO(https://bugs.webrtc.org/10629): Move functions that need
// internal() to be functions on the webrtc::SctpTransport interface,
// and make the internal() function private.
cricket::SctpTransportInternal* internal() {
RTC_DCHECK_RUN_ON(owner_thread_);
return internal_sctp_transport_.get();
}
const cricket::SctpTransportInternal* internal() const {
RTC_DCHECK_RUN_ON(owner_thread_);
return internal_sctp_transport_.get();
}
protected:
~SctpTransport() override;
private:
void UpdateInformation(SctpTransportState state);
void OnInternalReadyToSendData();
void OnAssociationChangeCommunicationUp();
void OnInternalClosingProcedureStartedRemotely(int sid);
void OnInternalClosingProcedureComplete(int sid);
void OnDtlsStateChange(cricket::DtlsTransportInternal* transport,
cricket::DtlsTransportState state);
// NOTE: |owner_thread_| is the thread that the SctpTransport object is
// constructed on. In the context of PeerConnection, it's the network thread.
rtc::Thread* const owner_thread_;
SctpTransportInformation info_ RTC_GUARDED_BY(owner_thread_);
std::unique_ptr<cricket::SctpTransportInternal> internal_sctp_transport_
RTC_GUARDED_BY(owner_thread_);
SctpTransportObserverInterface* observer_ RTC_GUARDED_BY(owner_thread_) =
nullptr;
rtc::scoped_refptr<DtlsTransport> dtls_transport_
RTC_GUARDED_BY(owner_thread_);
};
} // namespace webrtc
#endif // PC_SCTP_TRANSPORT_H_