Revert "Replaced the SignalSelectedCandidatePairChanged with a new signal."
This reverts commit 71677452f9cf210aa98162c6f4bd8d339e625337.
Reason for revert: Broke Chromium.
Original change's description:
> Replaced the SignalSelectedCandidatePairChanged with a new signal.
>
> |transport 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.
>
> Bug: webrtc:7013
> Change-Id: I60d30d785666a50a95052d00bf08f829d8f57e9c
> Reviewed-on: https://webrtc-review.googlesource.com/13520
> Commit-Queue: Zhi Huang <zhihuang@webrtc.org>
> Reviewed-by: Peter Thatcher <pthatcher@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#20661}
TBR=steveanton@webrtc.org,zhihuang@webrtc.org,pthatcher@webrtc.org
Change-Id: Ie0c76786855b65bb8caba7065593c961e4bf9de7
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: webrtc:7013
Reviewed-on: https://webrtc-review.googlesource.com/22764
Reviewed-by: Zhi Huang <zhihuang@webrtc.org>
Commit-Queue: Zhi Huang <zhihuang@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20662}
diff --git a/pc/channel.cc b/pc/channel.cc
index 4318aae..3950c03 100644
--- a/pc/channel.cc
+++ b/pc/channel.cc
@@ -174,8 +174,6 @@
// 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;
}
@@ -303,7 +301,7 @@
transport_name_ = rtp_dtls_transport->transport_name();
debug_name = transport_name_;
} else {
- debug_name = rtp_packet_transport->transport_name();
+ debug_name = rtp_packet_transport->debug_name();
}
if (rtp_packet_transport == rtp_transport_->rtp_packet_transport()) {
// Nothing to do if transport isn't changing.
@@ -346,9 +344,6 @@
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 =
@@ -403,14 +398,21 @@
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(
@@ -590,24 +592,29 @@
}
}
-void BaseChannel::OnNetworkRouteChanged(
- rtc::Optional<rtc::NetworkRoute> network_route) {
+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()));
RTC_DCHECK(network_thread_->IsCurrent());
- 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);
- }
+ 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);
- // 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.
+ UpdateTransportOverhead();
+ }
invoker_.AsyncInvoke<void>(RTC_FROM_HERE, worker_thread_, [=] {
- media_channel_->OnNetworkRouteChanged(transport_name_, new_route);
+ media_channel_->OnNetworkRouteChanged(transport_name, network_route);
});
}
@@ -908,8 +915,9 @@
if (!ret) {
RTC_LOG(LS_WARNING) << "DTLS-SRTP key installation failed";
+ } else {
+ UpdateTransportOverhead();
}
-
return ret;
}
@@ -1013,7 +1021,6 @@
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_);
@@ -1024,8 +1031,6 @@
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.";
}
}
@@ -1155,7 +1160,7 @@
// the RTCP transport.
std::string debug_name =
transport_name_.empty()
- ? rtp_transport_->rtp_packet_transport()->transport_name()
+ ? rtp_transport_->rtp_packet_transport()->debug_name()
: transport_name_;
RTC_LOG(LS_INFO) << "Enabling rtcp-mux for " << content_name()
<< "; no longer need RTCP transport for "
@@ -1674,6 +1679,47 @@
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.