Reland: Replaced the SignalSelectedCandidatePairChanged with a new signal.

|packet_overhead| field is added to rtc::NetworkRoute structure.

In PackTransportInternal:
1. network_route() is added which returns the current network route.
2. debug_name() is removed.
3. transport_name() is moved from DtlsTransportInternal and
IceTransportInternal to PacketTransportInternal.

When the selected candidate pair is changed, the P2PTransportChannel
will fire the SignalNetworkRouteChanged instead of
SignalSelectedCandidatePairChanged to upper layers.

The Rtp/SrtpTransport takes the responsibility of calculating the
transport overhead from the BaseChannel so that the BaseChannel
doesn't need to depend on P2P layer transports.

TBR=pthatcher@webrtc.org

Bug: webrtc:7013
Change-Id: If9928b25a7259544c2d9c42048b53ab24292fc67
Reviewed-on: https://webrtc-review.googlesource.com/22767
Reviewed-by: Zhi Huang <zhihuang@webrtc.org>
Commit-Queue: Zhi Huang <zhihuang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20664}
diff --git a/pc/channel.cc b/pc/channel.cc
index 3950c03..4318aae 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -174,6 +174,8 @@
   // channel to signal.
   rtp_transport_->SignalPacketReceived.connect(this,
                                                &BaseChannel::OnPacketReceived);
+  rtp_transport_->SignalNetworkRouteChanged.connect(
+      this, &BaseChannel::OnNetworkRouteChanged);
   RTC_LOG(LS_INFO) << "Created channel for " << content_name;
 }
 
@@ -301,7 +303,7 @@
     transport_name_ = rtp_dtls_transport->transport_name();
     debug_name = transport_name_;
   } else {
-    debug_name = rtp_packet_transport->debug_name();
+    debug_name = rtp_packet_transport->transport_name();
   }
   if (rtp_packet_transport == rtp_transport_->rtp_packet_transport()) {
     // Nothing to do if transport isn't changing.
@@ -344,6 +346,9 @@
     DtlsTransportInternal* new_dtls_transport,
     rtc::PacketTransportInternal* new_packet_transport) {
   RTC_DCHECK(network_thread_->IsCurrent());
+  if (new_dtls_transport) {
+    RTC_DCHECK(new_dtls_transport == new_packet_transport);
+  }
   DtlsTransportInternal*& old_dtls_transport =
       rtcp ? rtcp_dtls_transport_ : rtp_dtls_transport_;
   rtc::PacketTransportInternal* old_packet_transport =
@@ -398,21 +403,14 @@
   transport->SignalWritableState.connect(this, &BaseChannel::OnWritableState);
   transport->SignalDtlsState.connect(this, &BaseChannel::OnDtlsState);
   transport->SignalSentPacket.connect(this, &BaseChannel::SignalSentPacket_n);
-  transport->ice_transport()->SignalSelectedCandidatePairChanged.connect(
-      this, &BaseChannel::OnSelectedCandidatePairChanged);
 }
 
 void BaseChannel::DisconnectFromDtlsTransport(
     DtlsTransportInternal* transport) {
   RTC_DCHECK(network_thread_->IsCurrent());
-  OnSelectedCandidatePairChanged(transport->ice_transport(), nullptr, -1,
-                                 false);
-
   transport->SignalWritableState.disconnect(this);
   transport->SignalDtlsState.disconnect(this);
   transport->SignalSentPacket.disconnect(this);
-  transport->ice_transport()->SignalSelectedCandidatePairChanged.disconnect(
-      this);
 }
 
 void BaseChannel::ConnectToPacketTransport(
@@ -592,29 +590,24 @@
   }
 }
 
-void BaseChannel::OnSelectedCandidatePairChanged(
-    IceTransportInternal* ice_transport,
-    CandidatePairInterface* selected_candidate_pair,
-    int last_sent_packet_id,
-    bool ready_to_send) {
-  RTC_DCHECK((rtp_dtls_transport_ &&
-              ice_transport == rtp_dtls_transport_->ice_transport()) ||
-             (rtcp_dtls_transport_ &&
-              ice_transport == rtcp_dtls_transport_->ice_transport()));
+void BaseChannel::OnNetworkRouteChanged(
+    rtc::Optional<rtc::NetworkRoute> network_route) {
   RTC_DCHECK(network_thread_->IsCurrent());
-  selected_candidate_pair_ = selected_candidate_pair;
-  std::string transport_name = ice_transport->transport_name();
-  rtc::NetworkRoute network_route;
-  if (selected_candidate_pair) {
-    network_route = rtc::NetworkRoute(
-        ready_to_send, selected_candidate_pair->local_candidate().network_id(),
-        selected_candidate_pair->remote_candidate().network_id(),
-        last_sent_packet_id);
-
-    UpdateTransportOverhead();
+  rtc::NetworkRoute new_route;
+  if (network_route) {
+    invoker_.AsyncInvoke<void>(RTC_FROM_HERE, worker_thread_, [=] {
+      media_channel_->OnTransportOverheadChanged(
+          network_route->packet_overhead);
+    });
+    new_route = *(network_route);
   }
+
+  // Note: When the RTCP-muxing is not enabled, RTCP transport and RTP transport
+  // use the same transport name and MediaChannel::OnNetworkRouteChanged cannot
+  // work correctly. Intentionally leave it broken to simplify the code and
+  // encourage the users to stop using non-muxing RTCP.
   invoker_.AsyncInvoke<void>(RTC_FROM_HERE, worker_thread_, [=] {
-    media_channel_->OnNetworkRouteChanged(transport_name, network_route);
+    media_channel_->OnNetworkRouteChanged(transport_name_, new_route);
   });
 }
 
@@ -915,9 +908,8 @@
 
   if (!ret) {
     RTC_LOG(LS_WARNING) << "DTLS-SRTP key installation failed";
-  } else {
-    UpdateTransportOverhead();
   }
+
   return ret;
 }
 
@@ -1021,6 +1013,7 @@
   if (srtp_transport_ == nullptr) {
     rtp_transport_->SignalReadyToSend.disconnect(this);
     rtp_transport_->SignalPacketReceived.disconnect(this);
+    rtp_transport_->SignalNetworkRouteChanged.disconnect(this);
 
     auto transport = rtc::MakeUnique<webrtc::SrtpTransport>(
         std::move(rtp_transport_), content_name_);
@@ -1031,6 +1024,8 @@
         this, &BaseChannel::OnTransportReadyToSend);
     rtp_transport_->SignalPacketReceived.connect(
         this, &BaseChannel::OnPacketReceived);
+    rtp_transport_->SignalNetworkRouteChanged.connect(
+        this, &BaseChannel::OnNetworkRouteChanged);
     RTC_LOG(LS_INFO) << "Wrapping RtpTransport in SrtpTransport.";
   }
 }
@@ -1160,7 +1155,7 @@
         // the RTCP transport.
         std::string debug_name =
             transport_name_.empty()
-                ? rtp_transport_->rtp_packet_transport()->debug_name()
+                ? rtp_transport_->rtp_packet_transport()->transport_name()
                 : transport_name_;
         RTC_LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name()
                          << "; no longer need RTCP transport for "
@@ -1679,47 +1674,6 @@
       Bind(&BaseChannel::UpdateMediaSendRecvState_w, this));
 }
 
-int BaseChannel::GetTransportOverheadPerPacket() const {
-  RTC_DCHECK(network_thread_->IsCurrent());
-
-  if (!selected_candidate_pair_)
-    return 0;
-
-  int transport_overhead_per_packet = 0;
-
-  constexpr int kIpv4Overhaed = 20;
-  constexpr int kIpv6Overhaed = 40;
-  transport_overhead_per_packet +=
-      selected_candidate_pair_->local_candidate().address().family() == AF_INET
-          ? kIpv4Overhaed
-          : kIpv6Overhaed;
-
-  constexpr int kUdpOverhaed = 8;
-  constexpr int kTcpOverhaed = 20;
-  transport_overhead_per_packet +=
-      selected_candidate_pair_->local_candidate().protocol() ==
-              TCP_PROTOCOL_NAME
-          ? kTcpOverhaed
-          : kUdpOverhaed;
-
-  if (srtp_active()) {
-    int srtp_overhead = 0;
-    if (srtp_transport_->GetSrtpOverhead(&srtp_overhead))
-      transport_overhead_per_packet += srtp_overhead;
-  }
-
-  return transport_overhead_per_packet;
-}
-
-void BaseChannel::UpdateTransportOverhead() {
-  int transport_overhead_per_packet = GetTransportOverheadPerPacket();
-  if (transport_overhead_per_packet)
-    invoker_.AsyncInvoke<void>(
-        RTC_FROM_HERE, worker_thread_,
-        Bind(&MediaChannel::OnTransportOverheadChanged, media_channel_.get(),
-             transport_overhead_per_packet));
-}
-
 void VoiceChannel::UpdateMediaSendRecvState_w() {
   // Render incoming data if we're the active call, and we have the local
   // content. We receive data on the default channel and multiplexed streams.
diff --git a/pc/channel.h b/pc/channel.h
index ec13f07..352fda4 100644
--- a/pc/channel.h
+++ b/pc/channel.h
@@ -243,11 +243,7 @@
 
   void OnDtlsState(DtlsTransportInternal* transport, DtlsTransportState state);
 
-  void OnSelectedCandidatePairChanged(
-      IceTransportInternal* ice_transport,
-      CandidatePairInterface* selected_candidate_pair,
-      int last_sent_packet_id,
-      bool ready_to_send);
+  void OnNetworkRouteChanged(rtc::Optional<rtc::NetworkRoute> network_route);
 
   bool PacketIsRtcp(const rtc::PacketTransportInternal* transport,
                     const char* data,
@@ -363,8 +359,6 @@
   void SignalSentPacket_w(const rtc::SentPacket& sent_packet);
   bool IsReadyToSendMedia_n() const;
   void CacheRtpAbsSendTimeHeaderExtension_n(int rtp_abs_sendtime_extn_id);
-  int GetTransportOverheadPerPacket() const;
-  void UpdateTransportOverhead();
   // Wraps the existing RtpTransport in an SrtpTransport.
   void EnableSrtpTransport_n();
 
diff --git a/pc/channel_unittest.cc b/pc/channel_unittest.cc
index 5736bb6..36d7b00 100644
--- a/pc/channel_unittest.cc
+++ b/pc/channel_unittest.cc
@@ -1202,6 +1202,8 @@
     static constexpr uint16_t kLocalNetId = 1;
     static constexpr uint16_t kRemoteNetId = 2;
     static constexpr int kLastPacketId = 100;
+    // Ipv4(20) + UDP(8).
+    static constexpr int kTransportOverheadPerPacket = 28;
 
     CreateChannels(0, 0);
 
@@ -1209,12 +1211,17 @@
         static_cast<typename T::MediaChannel*>(channel1_->media_channel());
     ASSERT_TRUE(media_channel1);
 
+    // Need to wait for the threads before calling
+    // |set_num_network_route_changes| because the network route would be set
+    // when creating the channel.
+    WaitForThreads();
     media_channel1->set_num_network_route_changes(0);
     network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
+      rtc::NetworkRoute network_route;
       // The transport channel becomes disconnected.
-      fake_rtp_dtls_transport1_->ice_transport()
-          ->SignalSelectedCandidatePairChanged(
-              fake_rtp_dtls_transport1_->ice_transport(), nullptr, -1, false);
+      fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
+
+          rtc::Optional<rtc::NetworkRoute>(network_route));
     });
     WaitForThreads();
     EXPECT_EQ(1, media_channel1->num_network_route_changes());
@@ -1222,15 +1229,16 @@
     media_channel1->set_num_network_route_changes(0);
 
     network_thread_->Invoke<void>(RTC_FROM_HERE, [this] {
+      rtc::NetworkRoute network_route;
+      network_route.connected = true;
+      network_route.local_network_id = kLocalNetId;
+      network_route.remote_network_id = kRemoteNetId;
+      network_route.last_sent_packet_id = kLastPacketId;
+      network_route.packet_overhead = kTransportOverheadPerPacket;
       // The transport channel becomes connected.
-      rtc::SocketAddress local_address("192.168.1.1", 1000 /* port number */);
-      rtc::SocketAddress remote_address("192.168.1.2", 2000 /* port number */);
-      auto candidate_pair = cricket::FakeCandidatePair::Create(
-          local_address, kLocalNetId, remote_address, kRemoteNetId);
-      fake_rtp_dtls_transport1_->ice_transport()
-          ->SignalSelectedCandidatePairChanged(
-              fake_rtp_dtls_transport1_->ice_transport(), candidate_pair.get(),
-              kLastPacketId, true);
+      fake_rtp_dtls_transport1_->ice_transport()->SignalNetworkRouteChanged(
+
+          rtc::Optional<rtc::NetworkRoute>(network_route));
     });
     WaitForThreads();
     EXPECT_EQ(1, media_channel1->num_network_route_changes());
@@ -1239,7 +1247,6 @@
     EXPECT_EQ(expected_network_route, media_channel1->last_network_route());
     EXPECT_EQ(kLastPacketId,
               media_channel1->last_network_route().last_sent_packet_id);
-    constexpr int kTransportOverheadPerPacket = 28;  // Ipv4(20) + UDP(8).
     EXPECT_EQ(kTransportOverheadPerPacket,
               media_channel1->transport_overhead_per_packet());
   }
diff --git a/pc/rtptransport.cc b/pc/rtptransport.cc
index 1701c4d..d2604f9 100644
--- a/pc/rtptransport.cc
+++ b/pc/rtptransport.cc
@@ -11,6 +11,7 @@
 #include "pc/rtptransport.h"
 
 #include "media/base/rtputils.h"
+#include "p2p/base/p2pconstants.h"
 #include "p2p/base/packettransportinterface.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/copyonwritebuffer.h"
@@ -31,15 +32,22 @@
   if (rtp_packet_transport_) {
     rtp_packet_transport_->SignalReadyToSend.disconnect(this);
     rtp_packet_transport_->SignalReadPacket.disconnect(this);
+    rtp_packet_transport_->SignalNetworkRouteChanged.disconnect(this);
+    // Reset the network route of the old transport.
+    SignalNetworkRouteChanged(rtc::Optional<rtc::NetworkRoute>());
   }
   if (new_packet_transport) {
     new_packet_transport->SignalReadyToSend.connect(
         this, &RtpTransport::OnReadyToSend);
     new_packet_transport->SignalReadPacket.connect(this,
                                                    &RtpTransport::OnReadPacket);
+    new_packet_transport->SignalNetworkRouteChanged.connect(
+        this, &RtpTransport::OnNetworkRouteChange);
+    // Set the network route for the new transport.
+    SignalNetworkRouteChanged(new_packet_transport->network_route());
   }
-  rtp_packet_transport_ = new_packet_transport;
 
+  rtp_packet_transport_ = new_packet_transport;
   // Assumes the transport is ready to send if it is writable. If we are wrong,
   // ready to send will be updated the next time we try to send.
   SetReadyToSend(false,
@@ -54,12 +62,19 @@
   if (rtcp_packet_transport_) {
     rtcp_packet_transport_->SignalReadyToSend.disconnect(this);
     rtcp_packet_transport_->SignalReadPacket.disconnect(this);
+    rtcp_packet_transport_->SignalNetworkRouteChanged.disconnect(this);
+    // Reset the network route of the old transport.
+    SignalNetworkRouteChanged(rtc::Optional<rtc::NetworkRoute>());
   }
   if (new_packet_transport) {
     new_packet_transport->SignalReadyToSend.connect(
         this, &RtpTransport::OnReadyToSend);
     new_packet_transport->SignalReadPacket.connect(this,
                                                    &RtpTransport::OnReadPacket);
+    new_packet_transport->SignalNetworkRouteChanged.connect(
+        this, &RtpTransport::OnNetworkRouteChange);
+    // Set the network route for the new transport.
+    SignalNetworkRouteChanged(new_packet_transport->network_route());
   }
   rtcp_packet_transport_ = new_packet_transport;
 
@@ -161,6 +176,11 @@
   SetReadyToSend(transport == rtcp_packet_transport_, true);
 }
 
+void RtpTransport::OnNetworkRouteChange(
+    rtc::Optional<rtc::NetworkRoute> network_route) {
+  SignalNetworkRouteChanged(network_route);
+}
+
 void RtpTransport::SetReadyToSend(bool rtcp, bool ready) {
   if (rtcp) {
     rtcp_ready_to_send_ = ready;
diff --git a/pc/rtptransport.h b/pc/rtptransport.h
index 5e1aa20..34ec1b4 100644
--- a/pc/rtptransport.h
+++ b/pc/rtptransport.h
@@ -11,6 +11,8 @@
 #ifndef PC_RTPTRANSPORT_H_
 #define PC_RTPTRANSPORT_H_
 
+#include <string>
+
 #include "pc/bundlefilter.h"
 #include "pc/rtptransportinternal.h"
 #include "rtc_base/sigslot.h"
@@ -76,6 +78,7 @@
   bool HandlesPacket(const uint8_t* data, size_t len);
 
   void OnReadyToSend(rtc::PacketTransportInternal* transport);
+  void OnNetworkRouteChange(rtc::Optional<rtc::NetworkRoute> network_route);
 
   // Updates "ready to send" for an individual channel and fires
   // SignalReadyToSend.
diff --git a/pc/rtptransport_unittest.cc b/pc/rtptransport_unittest.cc
index 1e1657d..d6eb336 100644
--- a/pc/rtptransport_unittest.cc
+++ b/pc/rtptransport_unittest.cc
@@ -19,6 +19,10 @@
 
 constexpr bool kMuxDisabled = false;
 constexpr bool kMuxEnabled = true;
+constexpr uint16_t kLocalNetId = 1;
+constexpr uint16_t kRemoteNetId = 2;
+constexpr int kLastPacketId = 100;
+constexpr int kTransportOverheadPerPacket = 28;  // Ipv4(20) + UDP(8).
 
 TEST(RtpTransportTest, SetRtcpParametersCantDisableRtcpMux) {
   RtpTransport transport(kMuxDisabled);
@@ -56,12 +60,21 @@
  public:
   explicit SignalObserver(RtpTransport* transport) {
     transport->SignalReadyToSend.connect(this, &SignalObserver::OnReadyToSend);
+    transport->SignalNetworkRouteChanged.connect(
+        this, &SignalObserver::OnNetworkRouteChanged);
   }
+
   bool ready() const { return ready_; }
   void OnReadyToSend(bool ready) { ready_ = ready; }
 
+  rtc::Optional<rtc::NetworkRoute> network_route() { return network_route_; }
+  void OnNetworkRouteChanged(rtc::Optional<rtc::NetworkRoute> network_route) {
+    network_route_ = network_route;
+  }
+
  private:
   bool ready_ = false;
+  rtc::Optional<rtc::NetworkRoute> network_route_;
 };
 
 TEST(RtpTransportTest, SettingRtcpAndRtpSignalsReady) {
@@ -128,6 +141,61 @@
   EXPECT_TRUE(observer.ready());
 }
 
+// Tests the SignalNetworkRoute is fired when setting a packet transport.
+TEST(RtpTransportTest, SetRtpTransportWithNetworkRouteChanged) {
+  RtpTransport transport(kMuxDisabled);
+  SignalObserver observer(&transport);
+  rtc::FakePacketTransport fake_rtp("fake_rtp");
+
+  EXPECT_FALSE(observer.network_route());
+
+  rtc::NetworkRoute network_route;
+  // Set a non-null RTP transport with a new network route.
+  network_route.connected = true;
+  network_route.local_network_id = kLocalNetId;
+  network_route.remote_network_id = kRemoteNetId;
+  network_route.last_sent_packet_id = kLastPacketId;
+  network_route.packet_overhead = kTransportOverheadPerPacket;
+  fake_rtp.SetNetworkRoute(rtc::Optional<rtc::NetworkRoute>(network_route));
+  transport.SetRtpPacketTransport(&fake_rtp);
+  ASSERT_TRUE(observer.network_route());
+  EXPECT_EQ(network_route, *(observer.network_route()));
+  EXPECT_EQ(kTransportOverheadPerPacket,
+            observer.network_route()->packet_overhead);
+  EXPECT_EQ(kLastPacketId, observer.network_route()->last_sent_packet_id);
+
+  // Set a null RTP transport.
+  transport.SetRtpPacketTransport(nullptr);
+  EXPECT_FALSE(observer.network_route());
+}
+
+TEST(RtpTransportTest, SetRtcpTransportWithNetworkRouteChanged) {
+  RtpTransport transport(kMuxDisabled);
+  SignalObserver observer(&transport);
+  rtc::FakePacketTransport fake_rtcp("fake_rtcp");
+
+  EXPECT_FALSE(observer.network_route());
+
+  rtc::NetworkRoute network_route;
+  // Set a non-null RTCP transport with a new network route.
+  network_route.connected = true;
+  network_route.local_network_id = kLocalNetId;
+  network_route.remote_network_id = kRemoteNetId;
+  network_route.last_sent_packet_id = kLastPacketId;
+  network_route.packet_overhead = kTransportOverheadPerPacket;
+  fake_rtcp.SetNetworkRoute(rtc::Optional<rtc::NetworkRoute>(network_route));
+  transport.SetRtcpPacketTransport(&fake_rtcp);
+  ASSERT_TRUE(observer.network_route());
+  EXPECT_EQ(network_route, *(observer.network_route()));
+  EXPECT_EQ(kTransportOverheadPerPacket,
+            observer.network_route()->packet_overhead);
+  EXPECT_EQ(kLastPacketId, observer.network_route()->last_sent_packet_id);
+
+  // Set a null RTCP transport.
+  transport.SetRtcpPacketTransport(nullptr);
+  EXPECT_FALSE(observer.network_route());
+}
+
 class SignalCounter : public sigslot::has_slots<> {
  public:
   explicit SignalCounter(RtpTransport* transport) {
diff --git a/pc/rtptransportinternal.h b/pc/rtptransportinternal.h
index e589619..04d2ef3 100644
--- a/pc/rtptransportinternal.h
+++ b/pc/rtptransportinternal.h
@@ -11,7 +11,11 @@
 #ifndef PC_RTPTRANSPORTINTERNAL_H_
 #define PC_RTPTRANSPORTINTERNAL_H_
 
+#include <string>
+
 #include "api/ortc/rtptransportinterface.h"
+#include "p2p/base/icetransportinternal.h"
+#include "rtc_base/networkroute.h"
 #include "rtc_base/sigslot.h"
 
 namespace rtc {
@@ -52,6 +56,10 @@
   sigslot::signal3<bool, rtc::CopyOnWriteBuffer*, const rtc::PacketTime&>
       SignalPacketReceived;
 
+  // Called whenever the network route of the P2P layer transport changes.
+  // The argument is an optional network route.
+  sigslot::signal1<rtc::Optional<rtc::NetworkRoute>> SignalNetworkRouteChanged;
+
   virtual bool IsWritable(bool rtcp) const = 0;
 
   virtual bool SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
diff --git a/pc/srtptransport.cc b/pc/srtptransport.cc
index 1343fd0..bb42ad4 100644
--- a/pc/srtptransport.cc
+++ b/pc/srtptransport.cc
@@ -42,6 +42,8 @@
       this, &SrtpTransport::OnPacketReceived);
   rtp_transport_->SignalReadyToSend.connect(this,
                                             &SrtpTransport::OnReadyToSend);
+  rtp_transport_->SignalNetworkRouteChanged.connect(
+      this, &SrtpTransport::OnNetworkRouteChanged);
 }
 
 bool SrtpTransport::SendRtpPacket(rtc::CopyOnWriteBuffer* packet,
@@ -170,6 +172,20 @@
   SignalPacketReceived(rtcp, packet, packet_time);
 }
 
+void SrtpTransport::OnNetworkRouteChanged(
+
+    rtc::Optional<rtc::NetworkRoute> network_route) {
+  // Only append the SRTP overhead when there is a selected network route.
+  if (network_route) {
+    int srtp_overhead = 0;
+    if (IsActive()) {
+      GetSrtpOverhead(&srtp_overhead);
+    }
+    network_route->packet_overhead += srtp_overhead;
+  }
+  SignalNetworkRouteChanged(network_route);
+}
+
 bool SrtpTransport::SetRtpParams(int send_cs,
                                  const uint8_t* send_key,
                                  int send_key_len,
diff --git a/pc/srtptransport.h b/pc/srtptransport.h
index 13abd6b..919d4b9 100644
--- a/pc/srtptransport.h
+++ b/pc/srtptransport.h
@@ -16,6 +16,7 @@
 #include <utility>
 #include <vector>
 
+#include "p2p/base/icetransportinternal.h"
 #include "pc/rtptransportinternal.h"
 #include "pc/srtpfilter.h"
 #include "pc/srtpsession.h"
@@ -158,8 +159,8 @@
   void OnPacketReceived(bool rtcp,
                         rtc::CopyOnWriteBuffer* packet,
                         const rtc::PacketTime& packet_time);
-
   void OnReadyToSend(bool ready) { SignalReadyToSend(ready); }
+  void OnNetworkRouteChanged(rtc::Optional<rtc::NetworkRoute> network_route);
 
   bool ProtectRtp(void* data, int in_len, int max_len, int* out_len);
 
diff --git a/pc/transportcontroller.cc b/pc/transportcontroller.cc
index 57f90b7..7cf9bbd 100644
--- a/pc/transportcontroller.cc
+++ b/pc/transportcontroller.cc
@@ -761,7 +761,7 @@
 void TransportController::OnChannelWritableState_n(
     rtc::PacketTransportInternal* transport) {
   RTC_DCHECK(network_thread_->IsCurrent());
-  RTC_LOG(LS_INFO) << " TransportChannel " << transport->debug_name()
+  RTC_LOG(LS_INFO) << " Transport " << transport->transport_name()
                    << " writability changed to " << transport->writable()
                    << ".";
   UpdateAggregateStates_n();