| 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 880 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 891 void Connection::set_write_state(WriteState value) { | 891 void Connection::set_write_state(WriteState value) { |
| 892 WriteState old_value = write_state_; | 892 WriteState old_value = write_state_; |
| 893 write_state_ = value; | 893 write_state_ = value; |
| 894 if (value != old_value) { | 894 if (value != old_value) { |
| 895 LOG_J(LS_VERBOSE, this) << "set_write_state from: " << old_value << " to " | 895 LOG_J(LS_VERBOSE, this) << "set_write_state from: " << old_value << " to " |
| 896 << value; | 896 << value; |
| 897 SignalStateChange(this); | 897 SignalStateChange(this); |
| 898 } | 898 } |
| 899 } | 899 } |
| 900 | 900 |
| 901 void Connection::set_receiving(bool value) { | 901 void Connection::UpdateReceiving(int64_t now) { |
| 902 if (value != receiving_) { | 902 bool receiving = now <= last_received() + receiving_timeout_; |
| 903 LOG_J(LS_VERBOSE, this) << "set_receiving to " << value; | 903 if (receiving_ == receiving) { |
| 904 receiving_ = value; | 904 return; |
| 905 SignalStateChange(this); | |
| 906 } | 905 } |
| 906 LOG_J(LS_VERBOSE, this) << "set_receiving to " << receiving; |
| 907 receiving_ = receiving; |
| 908 receiving_unchanged_since_ = now; |
| 909 SignalStateChange(this); |
| 907 } | 910 } |
| 908 | 911 |
| 909 void Connection::set_state(State state) { | 912 void Connection::set_state(State state) { |
| 910 State old_state = state_; | 913 State old_state = state_; |
| 911 state_ = state; | 914 state_ = state; |
| 912 if (state != old_state) { | 915 if (state != old_state) { |
| 913 LOG_J(LS_VERBOSE, this) << "set_state"; | 916 LOG_J(LS_VERBOSE, this) << "set_state"; |
| 914 } | 917 } |
| 915 } | 918 } |
| 916 | 919 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 941 } | 944 } |
| 942 | 945 |
| 943 void Connection::OnReadPacket( | 946 void Connection::OnReadPacket( |
| 944 const char* data, size_t size, const rtc::PacketTime& packet_time) { | 947 const char* data, size_t size, const rtc::PacketTime& packet_time) { |
| 945 std::unique_ptr<IceMessage> msg; | 948 std::unique_ptr<IceMessage> msg; |
| 946 std::string remote_ufrag; | 949 std::string remote_ufrag; |
| 947 const rtc::SocketAddress& addr(remote_candidate_.address()); | 950 const rtc::SocketAddress& addr(remote_candidate_.address()); |
| 948 if (!port_->GetStunMessage(data, size, addr, &msg, &remote_ufrag)) { | 951 if (!port_->GetStunMessage(data, size, addr, &msg, &remote_ufrag)) { |
| 949 // The packet did not parse as a valid STUN message | 952 // The packet did not parse as a valid STUN message |
| 950 // This is a data packet, pass it along. | 953 // This is a data packet, pass it along. |
| 951 set_receiving(true); | |
| 952 last_data_received_ = rtc::TimeMillis(); | 954 last_data_received_ = rtc::TimeMillis(); |
| 955 UpdateReceiving(last_data_received_); |
| 953 recv_rate_tracker_.AddSamples(size); | 956 recv_rate_tracker_.AddSamples(size); |
| 954 SignalReadPacket(this, data, size, packet_time); | 957 SignalReadPacket(this, data, size, packet_time); |
| 955 | 958 |
| 956 // If timed out sending writability checks, start up again | 959 // If timed out sending writability checks, start up again |
| 957 if (!pruned_ && (write_state_ == STATE_WRITE_TIMEOUT)) { | 960 if (!pruned_ && (write_state_ == STATE_WRITE_TIMEOUT)) { |
| 958 LOG(LS_WARNING) << "Received a data packet on a timed-out Connection. " | 961 LOG(LS_WARNING) << "Received a data packet on a timed-out Connection. " |
| 959 << "Resetting state to STATE_WRITE_INIT."; | 962 << "Resetting state to STATE_WRITE_INIT."; |
| 960 set_write_state(STATE_WRITE_INIT); | 963 set_write_state(STATE_WRITE_INIT); |
| 961 } | 964 } |
| 962 } else if (!msg) { | 965 } else if (!msg) { |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1158 TooLongWithoutResponse(pings_since_last_response_, | 1161 TooLongWithoutResponse(pings_since_last_response_, |
| 1159 CONNECTION_WRITE_TIMEOUT, | 1162 CONNECTION_WRITE_TIMEOUT, |
| 1160 now)) { | 1163 now)) { |
| 1161 LOG_J(LS_INFO, this) << "Timed out after " | 1164 LOG_J(LS_INFO, this) << "Timed out after " |
| 1162 << now - pings_since_last_response_[0].sent_time | 1165 << now - pings_since_last_response_[0].sent_time |
| 1163 << " ms without a response" | 1166 << " ms without a response" |
| 1164 << ", rtt=" << rtt; | 1167 << ", rtt=" << rtt; |
| 1165 set_write_state(STATE_WRITE_TIMEOUT); | 1168 set_write_state(STATE_WRITE_TIMEOUT); |
| 1166 } | 1169 } |
| 1167 | 1170 |
| 1168 // Check the receiving state. | 1171 // Update the receiving state. |
| 1169 int64_t last_recv_time = last_received(); | 1172 UpdateReceiving(now); |
| 1170 bool receiving = now <= last_recv_time + receiving_timeout_; | |
| 1171 set_receiving(receiving); | |
| 1172 if (dead(now)) { | 1173 if (dead(now)) { |
| 1173 Destroy(); | 1174 Destroy(); |
| 1174 } | 1175 } |
| 1175 } | 1176 } |
| 1176 | 1177 |
| 1177 void Connection::Ping(int64_t now) { | 1178 void Connection::Ping(int64_t now) { |
| 1178 last_ping_sent_ = now; | 1179 last_ping_sent_ = now; |
| 1179 ConnectionRequest *req = new ConnectionRequest(this); | 1180 ConnectionRequest *req = new ConnectionRequest(this); |
| 1180 pings_since_last_response_.push_back(SentPing(req->id(), now)); | 1181 pings_since_last_response_.push_back(SentPing(req->id(), now)); |
| 1181 LOG_J(LS_VERBOSE, this) << "Sending STUN ping " | 1182 LOG_J(LS_VERBOSE, this) << "Sending STUN ping " |
| 1182 << ", id=" << rtc::hex_encode(req->id()); | 1183 << ", id=" << rtc::hex_encode(req->id()); |
| 1183 requests_.Send(req); | 1184 requests_.Send(req); |
| 1184 state_ = STATE_INPROGRESS; | 1185 state_ = STATE_INPROGRESS; |
| 1185 num_pings_sent_++; | 1186 num_pings_sent_++; |
| 1186 } | 1187 } |
| 1187 | 1188 |
| 1188 void Connection::ReceivedPing() { | 1189 void Connection::ReceivedPing() { |
| 1189 set_receiving(true); | |
| 1190 last_ping_received_ = rtc::TimeMillis(); | 1190 last_ping_received_ = rtc::TimeMillis(); |
| 1191 UpdateReceiving(last_ping_received_); |
| 1191 } | 1192 } |
| 1192 | 1193 |
| 1193 void Connection::ReceivedPingResponse(int rtt) { | 1194 void Connection::ReceivedPingResponse(int rtt) { |
| 1194 // We've already validated that this is a STUN binding response with | 1195 // We've already validated that this is a STUN binding response with |
| 1195 // the correct local and remote username for this connection. | 1196 // the correct local and remote username for this connection. |
| 1196 // So if we're not already, become writable. We may be bringing a pruned | 1197 // So if we're not already, become writable. We may be bringing a pruned |
| 1197 // connection back to life, but if we don't really want it, we can always | 1198 // connection back to life, but if we don't really want it, we can always |
| 1198 // prune it again. | 1199 // prune it again. |
| 1199 set_receiving(true); | 1200 last_ping_response_received_ = rtc::TimeMillis(); |
| 1201 UpdateReceiving(last_ping_response_received_); |
| 1200 set_write_state(STATE_WRITABLE); | 1202 set_write_state(STATE_WRITABLE); |
| 1201 set_state(STATE_SUCCEEDED); | 1203 set_state(STATE_SUCCEEDED); |
| 1202 pings_since_last_response_.clear(); | 1204 pings_since_last_response_.clear(); |
| 1203 last_ping_response_received_ = rtc::TimeMillis(); | |
| 1204 rtt_samples_++; | 1205 rtt_samples_++; |
| 1205 rtt_ = (RTT_RATIO * rtt_ + rtt) / (RTT_RATIO + 1); | 1206 rtt_ = (RTT_RATIO * rtt_ + rtt) / (RTT_RATIO + 1); |
| 1206 } | 1207 } |
| 1207 | 1208 |
| 1208 bool Connection::dead(int64_t now) const { | 1209 bool Connection::dead(int64_t now) const { |
| 1209 if (last_received() > 0) { | 1210 if (last_received() > 0) { |
| 1210 // If it has ever received anything, we keep it alive until it hasn't | 1211 // If it has ever received anything, we keep it alive until it hasn't |
| 1211 // received anything for DEAD_CONNECTION_RECEIVE_TIMEOUT. This covers the | 1212 // received anything for DEAD_CONNECTION_RECEIVE_TIMEOUT. This covers the |
| 1212 // normal case of a successfully used connection that stops working. This | 1213 // normal case of a successfully used connection that stops working. This |
| 1213 // also allows a remote peer to continue pinging over a locally inactive | 1214 // also allows a remote peer to continue pinging over a locally inactive |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1529 ASSERT(sent < 0); | 1530 ASSERT(sent < 0); |
| 1530 error_ = port_->GetError(); | 1531 error_ = port_->GetError(); |
| 1531 stats_.sent_discarded_packets++; | 1532 stats_.sent_discarded_packets++; |
| 1532 } else { | 1533 } else { |
| 1533 send_rate_tracker_.AddSamples(sent); | 1534 send_rate_tracker_.AddSamples(sent); |
| 1534 } | 1535 } |
| 1535 return sent; | 1536 return sent; |
| 1536 } | 1537 } |
| 1537 | 1538 |
| 1538 } // namespace cricket | 1539 } // namespace cricket |
| OLD | NEW |