| OLD | NEW |
| 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 Loading... |
| 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 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1221 // send; then it will only signal ready-to-send if the media channel | 1223 // send; then it will only signal ready-to-send if the media channel |
| 1222 // has been disallowed to send. | 1224 // has been disallowed to send. |
| 1223 if (selected_connection_->writable() || | 1225 if (selected_connection_->writable() || |
| 1224 PresumedWritable(selected_connection_)) { | 1226 PresumedWritable(selected_connection_)) { |
| 1225 SignalReadyToSend(this); | 1227 SignalReadyToSend(this); |
| 1226 } | 1228 } |
| 1227 } else { | 1229 } else { |
| 1228 LOG_J(LS_INFO, this) << "No selected connection"; | 1230 LOG_J(LS_INFO, this) << "No selected connection"; |
| 1229 } | 1231 } |
| 1230 SignalSelectedCandidatePairChanged(this, selected_connection_, | 1232 SignalSelectedCandidatePairChanged(this, selected_connection_, |
| 1231 last_sent_packet_id_); | 1233 last_sent_packet_id_, ReadyToSend()); |
| 1232 } | 1234 } |
| 1233 | 1235 |
| 1234 // Warning: UpdateState should eventually be called whenever a connection | 1236 // Warning: UpdateState should eventually be called whenever a connection |
| 1235 // is added, deleted, or the write state of any connection changes so that the | 1237 // is added, deleted, or the write state of any connection changes so that the |
| 1236 // transport controller will get the up-to-date channel state. However it | 1238 // transport controller will get the up-to-date channel state. However it |
| 1237 // should not be called too often; in the case that multiple connection states | 1239 // should not be called too often; in the case that multiple connection states |
| 1238 // change, it should be called after all the connection states have changed. For | 1240 // change, it should be called after all the connection states have changed. For |
| 1239 // example, we call this at the end of SortConnections. | 1241 // example, we call this at the end of SortConnections. |
| 1240 void P2PTransportChannel::UpdateState() { | 1242 void P2PTransportChannel::UpdateState() { |
| 1241 TransportChannelState state = ComputeState(); | 1243 TransportChannelState state = ComputeState(); |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1315 void P2PTransportChannel::HandleAllTimedOut() { | 1317 void P2PTransportChannel::HandleAllTimedOut() { |
| 1316 for (Connection* connection : connections_) { | 1318 for (Connection* connection : connections_) { |
| 1317 connection->Destroy(); | 1319 connection->Destroy(); |
| 1318 } | 1320 } |
| 1319 } | 1321 } |
| 1320 | 1322 |
| 1321 bool P2PTransportChannel::weak() const { | 1323 bool P2PTransportChannel::weak() const { |
| 1322 return !selected_connection_ || selected_connection_->weak(); | 1324 return !selected_connection_ || selected_connection_->weak(); |
| 1323 } | 1325 } |
| 1324 | 1326 |
| 1327 bool P2PTransportChannel::ReadyToSend() const { |
| 1328 // Note that we allow sending on an unreliable connection, because it's |
| 1329 // possible that it became unreliable simply due to bad chance. |
| 1330 // So this shouldn't prevent attempting to send media. |
| 1331 return selected_connection_ != nullptr && |
| 1332 (selected_connection_->writable() || |
| 1333 PresumedWritable(selected_connection_) || |
| 1334 selected_connection_->write_state() == |
| 1335 Connection::STATE_WRITE_UNRELIABLE); |
| 1336 } |
| 1337 |
| 1325 // If we have a selected connection, return it, otherwise return top one in the | 1338 // If we have a selected connection, return it, otherwise return top one in the |
| 1326 // list (later we will mark it best). | 1339 // list (later we will mark it best). |
| 1327 Connection* P2PTransportChannel::GetBestConnectionOnNetwork( | 1340 Connection* P2PTransportChannel::GetBestConnectionOnNetwork( |
| 1328 rtc::Network* network) const { | 1341 rtc::Network* network) const { |
| 1329 // If the selected connection is on this network, then it wins. | 1342 // If the selected connection is on this network, then it wins. |
| 1330 if (selected_connection_ && | 1343 if (selected_connection_ && |
| 1331 (selected_connection_->port()->Network() == network)) { | 1344 (selected_connection_->port()->Network() == network)) { |
| 1332 return selected_connection_; | 1345 return selected_connection_; |
| 1333 } | 1346 } |
| 1334 | 1347 |
| (...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1765 | 1778 |
| 1766 // During the initial state when nothing has been pinged yet, return the first | 1779 // During the initial state when nothing has been pinged yet, return the first |
| 1767 // one in the ordered |connections_|. | 1780 // one in the ordered |connections_|. |
| 1768 return *(std::find_if(connections_.begin(), connections_.end(), | 1781 return *(std::find_if(connections_.begin(), connections_.end(), |
| 1769 [conn1, conn2](Connection* conn) { | 1782 [conn1, conn2](Connection* conn) { |
| 1770 return conn == conn1 || conn == conn2; | 1783 return conn == conn1 || conn == conn2; |
| 1771 })); | 1784 })); |
| 1772 } | 1785 } |
| 1773 | 1786 |
| 1774 } // namespace cricket | 1787 } // namespace cricket |
| OLD | NEW |