Index: webrtc/p2p/base/p2ptransportchannel.cc |
diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc |
index 61de2491bfcf981e8d779e67b373bd8041ec0a12..a4bde05d80cb9cac890e8aeaf81f76e3bd31611f 100644 |
--- a/webrtc/p2p/base/p2ptransportchannel.cc |
+++ b/webrtc/p2p/base/p2ptransportchannel.cc |
@@ -888,7 +888,9 @@ int P2PTransportChannel::SendPacket(const char *data, size_t len, |
error_ = EINVAL; |
return -1; |
} |
- if (selected_connection_ == NULL) { |
+ // If we don't think the connection is working yet, return EWOULDBLOCK |
+ // instead of sending a packet that will probably be dropped. |
+ if (!ReadyToSend()) { |
error_ = EWOULDBLOCK; |
return -1; |
} |
@@ -1228,7 +1230,7 @@ void P2PTransportChannel::SwitchSelectedConnection(Connection* conn) { |
LOG_J(LS_INFO, this) << "No selected connection"; |
} |
SignalSelectedCandidatePairChanged(this, selected_connection_, |
- last_sent_packet_id_); |
+ last_sent_packet_id_, ReadyToSend()); |
} |
// Warning: UpdateState should eventually be called whenever a connection |
@@ -1322,6 +1324,17 @@ bool P2PTransportChannel::weak() const { |
return !selected_connection_ || selected_connection_->weak(); |
} |
+bool P2PTransportChannel::ReadyToSend() const { |
+ // Note that we allow sending on an unreliable connection, because it's |
+ // possible that it became unreliable simply due to bad chance. |
+ // So this shouldn't prevent attempting to send media. |
+ return selected_connection_ != nullptr && |
+ (selected_connection_->writable() || |
+ PresumedWritable(selected_connection_) || |
+ selected_connection_->write_state() == |
+ Connection::STATE_WRITE_UNRELIABLE); |
+} |
+ |
// If we have a selected connection, return it, otherwise return top one in the |
// list (later we will mark it best). |
Connection* P2PTransportChannel::GetBestConnectionOnNetwork( |