| Index: webrtc/p2p/base/p2ptransportchannel.cc
|
| diff --git a/webrtc/p2p/base/p2ptransportchannel.cc b/webrtc/p2p/base/p2ptransportchannel.cc
|
| index 1eb63c5e69577269d7f0a8783a37c640246d337f..f68c6562a6585decad3d6cd059bfd1118c63fee7 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;
|
| }
|
| @@ -1262,7 +1264,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
|
| @@ -1356,6 +1358,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(
|
|
|