10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004--2005, Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/transport.h"
29cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/transportchannelimpl.h"
300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/transportchannelproxy.h"
312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/common.h"
322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/logging.h"
332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/thread.h"
340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket {
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgenum {
380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  MSG_UPDATESTATE,
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTransportChannelProxy::TransportChannelProxy(const std::string& content_name,
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             const std::string& name,
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                             int component)
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    : TransportChannel(content_name, component),
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      name_(name),
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      impl_(NULL) {
472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  worker_thread_ = rtc::Thread::Current();
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTransportChannelProxy::~TransportChannelProxy() {
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Clearing any pending signal.
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  worker_thread_->Clear(this);
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (impl_)
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    impl_->GetTransport()->DestroyChannel(impl_->component());
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::SetImplementation(TransportChannelImpl* impl) {
582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
595528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org
605528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  if (impl == impl_) {
615528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    // Ignore if the |impl| has already been set.
625528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    LOG(LS_WARNING) << "Ignored TransportChannelProxy::SetImplementation call "
635528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org                    << "with a same impl as the existing one.";
645528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org    return;
655528070a0c76057a000b877fc56ca4180ad2087bmallinath@webrtc.org  }
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Destroy any existing impl_.
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (impl_) {
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    impl_->GetTransport()->DestroyChannel(impl_->component());
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Adopt the supplied impl, and connect to its signals.
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  impl_ = impl;
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (impl_) {
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    impl_->SignalReadableState.connect(
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &TransportChannelProxy::OnReadableState);
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    impl_->SignalWritableState.connect(
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &TransportChannelProxy::OnWritableState);
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    impl_->SignalReadPacket.connect(
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &TransportChannelProxy::OnReadPacket);
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    impl_->SignalReadyToSend.connect(
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &TransportChannelProxy::OnReadyToSend);
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    impl_->SignalRouteChange.connect(
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &TransportChannelProxy::OnRouteChange);
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (OptionList::iterator it = pending_options_.begin();
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         it != pending_options_.end();
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         ++it) {
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      impl_->SetOption(it->first, it->second);
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Push down the SRTP ciphers, if any were set.
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (!pending_srtp_ciphers_.empty()) {
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      impl_->SetSrtpCiphers(pending_srtp_ciphers_);
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    pending_options_.clear();
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Post ourselves a message to see if we need to fire state callbacks.
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  worker_thread_->Post(this, MSG_UPDATESTATE);
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
103391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.orgint TransportChannelProxy::SendPacket(const char* data, size_t len,
1042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                                      const rtc::PacketOptions& options,
105391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                                      int flags) {
1062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Fail if we don't have an impl yet.
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!impl_) {
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return -1;
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
111f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org  return impl_->SendPacket(data, len, options, flags);
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1142a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgint TransportChannelProxy::SetOption(rtc::Socket::Option opt, int value) {
1152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!impl_) {
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    pending_options_.push_back(OptionPair(opt, value));
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return impl_->SetOption(opt, value);
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgint TransportChannelProxy::GetError() {
1242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!impl_) {
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return 0;
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return impl_->GetError();
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::GetStats(ConnectionInfos* infos) {
1322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!impl_) {
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return impl_->GetStats(infos);
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::IsDtlsActive() const {
1402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!impl_) {
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return impl_->IsDtlsActive();
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgbool TransportChannelProxy::GetSslRole(rtc::SSLRole* role) const {
1482a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
149a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  if (!impl_) {
150a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org    return false;
151a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  }
152a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  return impl_->GetSslRole(role);
153a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org}
154a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org
1552a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgbool TransportChannelProxy::SetSslRole(rtc::SSLRole role) {
1562a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
157a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  if (!impl_) {
158a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org    return false;
159a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  }
160a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org  return impl_->SetSslRole(role);
161a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org}
162a487db2aeda23ade81f0b2e5fd4d50f874d06a9csergeyu@chromium.org
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::SetSrtpCiphers(const std::vector<std::string>&
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                           ciphers) {
1652a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  pending_srtp_ciphers_ = ciphers;  // Cache so we can send later, but always
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                    // set so it stays consistent.
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (impl_) {
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return impl_->SetSrtpCiphers(ciphers);
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return true;
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::GetSrtpCipher(std::string* cipher) {
1752a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!impl_) {
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return impl_->GetSrtpCipher(cipher);
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
18262fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.orgbool TransportChannelProxy::GetLocalIdentity(
1832a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::SSLIdentity** identity) const {
1842a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
18562fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  if (!impl_) {
18662fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org    return false;
18762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  }
18862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  return impl_->GetLocalIdentity(identity);
18962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org}
19062fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org
19162fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.orgbool TransportChannelProxy::GetRemoteCertificate(
1922a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::SSLCertificate** cert) const {
1932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
19462fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  if (!impl_) {
19562fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org    return false;
19662fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  }
19762fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org  return impl_->GetRemoteCertificate(cert);
19862fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org}
19962fe97f10a7a3200c9724851f6a18537ed270cddwu@webrtc.org
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgbool TransportChannelProxy::ExportKeyingMaterial(const std::string& label,
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 const uint8* context,
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 size_t context_len,
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 bool use_context,
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 uint8* result,
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                                 size_t result_len) {
2062a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!impl_) {
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return false;
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return impl_->ExportKeyingMaterial(label, context, context_len, use_context,
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                     result, result_len);
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
214e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.orgIceRole TransportChannelProxy::GetIceRole() const {
2152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (!impl_) {
217e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    return ICEROLE_UNKNOWN;
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
219e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org  return impl_->GetIceRole();
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::OnReadableState(TransportChannel* channel) {
2232a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT(channel == impl_);
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  set_readable(impl_->readable());
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Note: SignalReadableState fired by set_readable.
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::OnWritableState(TransportChannel* channel) {
2302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT(channel == impl_);
2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  set_writable(impl_->writable());
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Note: SignalWritableState fired by set_readable.
2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
236f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.orgvoid TransportChannelProxy::OnReadPacket(
237f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org    TransportChannel* channel, const char* data, size_t size,
2382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    const rtc::PacketTime& packet_time, int flags) {
2392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT(channel == impl_);
241f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org  SignalReadPacket(this, data, size, packet_time, flags);
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::OnReadyToSend(TransportChannel* channel) {
2452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT(channel == impl_);
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SignalReadyToSend(this);
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgvoid TransportChannelProxy::OnRouteChange(TransportChannel* channel,
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                          const Candidate& candidate) {
2522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT(channel == impl_);
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SignalRouteChange(this, candidate);
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2572a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgvoid TransportChannelProxy::OnMessage(rtc::Message* msg) {
2582a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  ASSERT(rtc::Thread::Current() == worker_thread_);
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  if (msg->message_id == MSG_UPDATESTATE) {
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     // If impl_ is already readable or writable, push up those signals.
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     set_readable(impl_ ? impl_->readable() : false);
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org     set_writable(impl_ ? impl_->writable() : false);
2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}  // namespace cricket
267