Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(351)

Side by Side Diff: webrtc/p2p/base/p2ptransportchannel.cc

Issue 2099783002: Fixing bug where Connection drops packets when presumed writable. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 870 matching lines...) Expand 10 before | Expand all | Expand 10 after
881 881
882 // Send data to the other side, using our selected connection. 882 // Send data to the other side, using our selected connection.
883 int P2PTransportChannel::SendPacket(const char *data, size_t len, 883 int P2PTransportChannel::SendPacket(const char *data, size_t len,
884 const rtc::PacketOptions& options, 884 const rtc::PacketOptions& options,
885 int flags) { 885 int flags) {
886 ASSERT(worker_thread_ == rtc::Thread::Current()); 886 ASSERT(worker_thread_ == rtc::Thread::Current());
887 if (flags != 0) { 887 if (flags != 0) {
888 error_ = EINVAL; 888 error_ = EINVAL;
889 return -1; 889 return -1;
890 } 890 }
891 if (selected_connection_ == NULL) { 891 // If we don't think the connection is working yet, return EWOULDBLOCK
892 // instead of sending a packet that will probably be dropped.
893 if (!ReadyToSend()) {
892 error_ = EWOULDBLOCK; 894 error_ = EWOULDBLOCK;
893 return -1; 895 return -1;
894 } 896 }
895 897
896 last_sent_packet_id_ = options.packet_id; 898 last_sent_packet_id_ = options.packet_id;
897 int sent = selected_connection_->Send(data, len, options); 899 int sent = selected_connection_->Send(data, len, options);
898 if (sent <= 0) { 900 if (sent <= 0) {
899 ASSERT(sent < 0); 901 ASSERT(sent < 0);
900 error_ = selected_connection_->GetError(); 902 error_ = selected_connection_->GetError();
901 } 903 }
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1255 // send; then it will only signal ready-to-send if the media channel 1257 // send; then it will only signal ready-to-send if the media channel
1256 // has been disallowed to send. 1258 // has been disallowed to send.
1257 if (selected_connection_->writable() || 1259 if (selected_connection_->writable() ||
1258 PresumedWritable(selected_connection_)) { 1260 PresumedWritable(selected_connection_)) {
1259 SignalReadyToSend(this); 1261 SignalReadyToSend(this);
1260 } 1262 }
1261 } else { 1263 } else {
1262 LOG_J(LS_INFO, this) << "No selected connection"; 1264 LOG_J(LS_INFO, this) << "No selected connection";
1263 } 1265 }
1264 SignalSelectedCandidatePairChanged(this, selected_connection_, 1266 SignalSelectedCandidatePairChanged(this, selected_connection_,
1265 last_sent_packet_id_); 1267 last_sent_packet_id_, ReadyToSend());
1266 } 1268 }
1267 1269
1268 // Warning: UpdateState should eventually be called whenever a connection 1270 // Warning: UpdateState should eventually be called whenever a connection
1269 // is added, deleted, or the write state of any connection changes so that the 1271 // is added, deleted, or the write state of any connection changes so that the
1270 // transport controller will get the up-to-date channel state. However it 1272 // transport controller will get the up-to-date channel state. However it
1271 // should not be called too often; in the case that multiple connection states 1273 // should not be called too often; in the case that multiple connection states
1272 // change, it should be called after all the connection states have changed. For 1274 // change, it should be called after all the connection states have changed. For
1273 // example, we call this at the end of SortConnections. 1275 // example, we call this at the end of SortConnections.
1274 void P2PTransportChannel::UpdateState() { 1276 void P2PTransportChannel::UpdateState() {
1275 TransportChannelState state = ComputeState(); 1277 TransportChannelState state = ComputeState();
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
1349 void P2PTransportChannel::HandleAllTimedOut() { 1351 void P2PTransportChannel::HandleAllTimedOut() {
1350 for (Connection* connection : connections_) { 1352 for (Connection* connection : connections_) {
1351 connection->Destroy(); 1353 connection->Destroy();
1352 } 1354 }
1353 } 1355 }
1354 1356
1355 bool P2PTransportChannel::weak() const { 1357 bool P2PTransportChannel::weak() const {
1356 return !selected_connection_ || selected_connection_->weak(); 1358 return !selected_connection_ || selected_connection_->weak();
1357 } 1359 }
1358 1360
1361 bool P2PTransportChannel::ReadyToSend() const {
1362 // Note that we allow sending on an unreliable connection, because it's
1363 // possible that it became unreliable simply due to bad chance.
1364 // So this shouldn't prevent attempting to send media.
1365 return selected_connection_ != nullptr &&
1366 (selected_connection_->writable() ||
1367 PresumedWritable(selected_connection_) ||
1368 selected_connection_->write_state() ==
1369 Connection::STATE_WRITE_UNRELIABLE);
1370 }
1371
1359 // If we have a selected connection, return it, otherwise return top one in the 1372 // If we have a selected connection, return it, otherwise return top one in the
1360 // list (later we will mark it best). 1373 // list (later we will mark it best).
1361 Connection* P2PTransportChannel::GetBestConnectionOnNetwork( 1374 Connection* P2PTransportChannel::GetBestConnectionOnNetwork(
1362 rtc::Network* network) const { 1375 rtc::Network* network) const {
1363 // If the selected connection is on this network, then it wins. 1376 // If the selected connection is on this network, then it wins.
1364 if (selected_connection_ && 1377 if (selected_connection_ &&
1365 (selected_connection_->port()->Network() == network)) { 1378 (selected_connection_->port()->Network() == network)) {
1366 return selected_connection_; 1379 return selected_connection_;
1367 } 1380 }
1368 1381
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
1799 1812
1800 // During the initial state when nothing has been pinged yet, return the first 1813 // During the initial state when nothing has been pinged yet, return the first
1801 // one in the ordered |connections_|. 1814 // one in the ordered |connections_|.
1802 return *(std::find_if(connections_.begin(), connections_.end(), 1815 return *(std::find_if(connections_.begin(), connections_.end(),
1803 [conn1, conn2](Connection* conn) { 1816 [conn1, conn2](Connection* conn) {
1804 return conn == conn1 || conn == conn2; 1817 return conn == conn1 || conn == conn2;
1805 })); 1818 }));
1806 } 1819 }
1807 1820
1808 } // namespace cricket 1821 } // namespace cricket
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698