Index: webrtc/p2p/base/dtlstransportchannel.cc |
diff --git a/webrtc/p2p/base/dtlstransportchannel.cc b/webrtc/p2p/base/dtlstransportchannel.cc |
index dcebdee53e48828842b0d8929a2a780e77c69311..3474237269bcf0a74a347781a800599f64aab029 100644 |
--- a/webrtc/p2p/base/dtlstransportchannel.cc |
+++ b/webrtc/p2p/base/dtlstransportchannel.cc |
@@ -97,6 +97,8 @@ |
dtls_state_(STATE_NONE), |
ssl_role_(rtc::SSL_CLIENT), |
ssl_max_version_(rtc::SSL_PROTOCOL_DTLS_10) { |
+ channel_->SignalReadableState.connect(this, |
+ &DtlsTransportChannelWrapper::OnReadableState); |
channel_->SignalWritableState.connect(this, |
&DtlsTransportChannelWrapper::OnWritableState); |
channel_->SignalReadPacket.connect(this, |
@@ -390,12 +392,25 @@ |
// (1) If we're not doing DTLS-SRTP, then the state is just the |
// state of the underlying impl() |
// (2) If we're doing DTLS-SRTP: |
-// - Prior to the DTLS handshake, the state is neither receiving nor |
+// - Prior to the DTLS handshake, the state is neither readable or |
// writable |
// - When the impl goes writable for the first time we |
// start the DTLS handshake |
// - Once the DTLS handshake completes, the state is that of the |
// impl again |
+void DtlsTransportChannelWrapper::OnReadableState(TransportChannel* channel) { |
+ ASSERT(rtc::Thread::Current() == worker_thread_); |
+ ASSERT(channel == channel_); |
+ LOG_J(LS_VERBOSE, this) |
+ << "DTLSTransportChannelWrapper: channel readable state changed to " |
+ << channel_->readable(); |
+ |
+ if (dtls_state_ == STATE_NONE || dtls_state_ == STATE_OPEN) { |
+ set_readable(channel_->readable()); |
+ // Note: SignalReadableState fired by set_readable. |
+ } |
+} |
+ |
void DtlsTransportChannelWrapper::OnWritableState(TransportChannel* channel) { |
ASSERT(rtc::Thread::Current() == worker_thread_); |
ASSERT(channel == channel_); |
@@ -530,6 +545,8 @@ |
// The check for OPEN shouldn't be necessary but let's make |
// sure we don't accidentally frob the state if it's closed. |
dtls_state_ = STATE_OPEN; |
+ |
+ set_readable(true); |
set_writable(true); |
} |
} |
@@ -547,6 +564,8 @@ |
} else { |
LOG_J(LS_INFO, this) << "DTLS channel error, code=" << err; |
} |
+ |
+ set_readable(false); |
set_writable(false); |
dtls_state_ = STATE_CLOSED; |
} |