| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 } // namespace | 72 } // namespace |
| 73 | 73 |
| 74 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") | 74 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") |
| 75 | 75 |
| 76 QuicConnection::QuicConnection(QuicGuid guid, | 76 QuicConnection::QuicConnection(QuicGuid guid, |
| 77 IPEndPoint address, | 77 IPEndPoint address, |
| 78 QuicConnectionHelperInterface* helper, | 78 QuicConnectionHelperInterface* helper, |
| 79 bool is_server) | 79 bool is_server) |
| 80 : helper_(helper), | 80 : helper_(helper), |
| 81 framer_(kQuicVersion1, | 81 framer_(kQuicVersion1, |
| 82 QuicDecrypter::Create(kNULL), | |
| 83 QuicEncrypter::Create(kNULL), | |
| 84 helper->GetClock()->ApproximateNow(), | 82 helper->GetClock()->ApproximateNow(), |
| 85 is_server), | 83 is_server), |
| 84 encryption_level_(ENCRYPTION_NONE), |
| 86 clock_(helper->GetClock()), | 85 clock_(helper->GetClock()), |
| 87 random_generator_(helper->GetRandomGenerator()), | 86 random_generator_(helper->GetRandomGenerator()), |
| 88 guid_(guid), | 87 guid_(guid), |
| 89 peer_address_(address), | 88 peer_address_(address), |
| 90 largest_seen_packet_with_ack_(0), | 89 largest_seen_packet_with_ack_(0), |
| 91 peer_largest_observed_packet_(0), | 90 peer_largest_observed_packet_(0), |
| 92 least_packet_awaited_by_peer_(1), | 91 least_packet_awaited_by_peer_(1), |
| 93 peer_least_packet_awaiting_ack_(0), | 92 peer_least_packet_awaiting_ack_(0), |
| 94 handling_retransmission_timeout_(false), | 93 handling_retransmission_timeout_(false), |
| 95 write_blocked_(false), | 94 write_blocked_(false), |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 144 return false; | 143 return false; |
| 145 } | 144 } |
| 146 | 145 |
| 147 // Right now we only support kQuicVersion1 so it's okay not to | 146 // Right now we only support kQuicVersion1 so it's okay not to |
| 148 // update the framer and quic_version_. When start supporting more | 147 // update the framer and quic_version_. When start supporting more |
| 149 // versions please update both. | 148 // versions please update both. |
| 150 return true; | 149 return true; |
| 151 } | 150 } |
| 152 | 151 |
| 153 void QuicConnection::OnError(QuicFramer* framer) { | 152 void QuicConnection::OnError(QuicFramer* framer) { |
| 154 if (!connected_) { | 153 // Packets that we cannot decrypt are dropped. |
| 154 // TODO(rch): add stats to measure this. |
| 155 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { |
| 155 return; | 156 return; |
| 156 } | 157 } |
| 157 SendConnectionClose(framer->error()); | 158 SendConnectionClose(framer->error()); |
| 158 } | 159 } |
| 159 | 160 |
| 160 void QuicConnection::OnPacket() { | 161 void QuicConnection::OnPacket() { |
| 161 // TODO(satyamshekhar): Validate packet before updating the time | 162 // TODO(satyamshekhar): Validate packet before updating the time |
| 162 // since it affects the timeout of the connection. | 163 // since it affects the timeout of the connection. |
| 163 time_of_last_received_packet_ = clock_->Now(); | 164 time_of_last_received_packet_ = clock_->Now(); |
| 164 DVLOG(1) << "time of last received packet: " | 165 DVLOG(1) << "time of last received packet: " |
| (...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 720 debug_visitor_->OnPacketReceived(self_address, peer_address, packet); | 721 debug_visitor_->OnPacketReceived(self_address, peer_address, packet); |
| 721 } | 722 } |
| 722 last_packet_revived_ = false; | 723 last_packet_revived_ = false; |
| 723 last_size_ = packet.length(); | 724 last_size_ = packet.length(); |
| 724 last_self_address_ = self_address; | 725 last_self_address_ = self_address; |
| 725 last_peer_address_ = peer_address; | 726 last_peer_address_ = peer_address; |
| 726 | 727 |
| 727 stats_.bytes_received += packet.length(); | 728 stats_.bytes_received += packet.length(); |
| 728 ++stats_.packets_received; | 729 ++stats_.packets_received; |
| 729 | 730 |
| 730 framer_.ProcessPacket(packet); | 731 if (!framer_.ProcessPacket(packet)) { |
| 732 return; |
| 733 } |
| 731 MaybeProcessRevivedPacket(); | 734 MaybeProcessRevivedPacket(); |
| 732 } | 735 } |
| 733 | 736 |
| 734 bool QuicConnection::OnCanWrite() { | 737 bool QuicConnection::OnCanWrite() { |
| 735 write_blocked_ = false; | 738 write_blocked_ = false; |
| 736 | 739 |
| 737 WriteQueuedPackets(); | 740 WriteQueuedPackets(); |
| 738 | 741 |
| 739 // Sending queued packets may have caused the socket to become write blocked, | 742 // Sending queued packets may have caused the socket to become write blocked, |
| 740 // or the congestion manager to prohibit sending. If we've sent everything | 743 // or the congestion manager to prohibit sending. If we've sent everything |
| (...skipping 22 matching lines...) Expand all Loading... |
| 763 DCHECK(!write_blocked_); | 766 DCHECK(!write_blocked_); |
| 764 | 767 |
| 765 size_t num_queued_packets = queued_packets_.size() + 1; | 768 size_t num_queued_packets = queued_packets_.size() + 1; |
| 766 QueuedPacketList::iterator packet_iterator = queued_packets_.begin(); | 769 QueuedPacketList::iterator packet_iterator = queued_packets_.begin(); |
| 767 while (!write_blocked_ && packet_iterator != queued_packets_.end()) { | 770 while (!write_blocked_ && packet_iterator != queued_packets_.end()) { |
| 768 // Ensure that from one iteration of this loop to the next we | 771 // Ensure that from one iteration of this loop to the next we |
| 769 // succeeded in sending a packet so we don't infinitely loop. | 772 // succeeded in sending a packet so we don't infinitely loop. |
| 770 // TODO(rch): clean up and close the connection if we really hit this. | 773 // TODO(rch): clean up and close the connection if we really hit this. |
| 771 DCHECK_LT(queued_packets_.size(), num_queued_packets); | 774 DCHECK_LT(queued_packets_.size(), num_queued_packets); |
| 772 num_queued_packets = queued_packets_.size(); | 775 num_queued_packets = queued_packets_.size(); |
| 773 if (WritePacket(packet_iterator->sequence_number, | 776 if (WritePacket(packet_iterator->encryption_level, |
| 777 packet_iterator->sequence_number, |
| 774 packet_iterator->packet, | 778 packet_iterator->packet, |
| 775 packet_iterator->retransmittable, | 779 packet_iterator->retransmittable, |
| 776 NO_FORCE)) { | 780 NO_FORCE)) { |
| 777 packet_iterator = queued_packets_.erase(packet_iterator); | 781 packet_iterator = queued_packets_.erase(packet_iterator); |
| 778 } else { | 782 } else { |
| 779 // Continue, because some queued packets may still be writable. | 783 // Continue, because some queued packets may still be writable. |
| 780 // This can happen if a retransmit send fail. | 784 // This can happen if a retransmit send fail. |
| 781 ++packet_iterator; | 785 ++packet_iterator; |
| 782 } | 786 } |
| 783 } | 787 } |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 876 retransmission_info)); | 880 retransmission_info)); |
| 877 // Remove info with old sequence number. | 881 // Remove info with old sequence number. |
| 878 unacked_packets_.erase(unacked_it); | 882 unacked_packets_.erase(unacked_it); |
| 879 retransmission_map_.erase(retransmission_it); | 883 retransmission_map_.erase(retransmission_it); |
| 880 DVLOG(1) << "Retransmitting unacked packet " << sequence_number << " as " | 884 DVLOG(1) << "Retransmitting unacked packet " << sequence_number << " as " |
| 881 << serialized_packet.sequence_number; | 885 << serialized_packet.sequence_number; |
| 882 DCHECK(unacked_packets_.empty() || | 886 DCHECK(unacked_packets_.empty() || |
| 883 unacked_packets_.rbegin()->first < serialized_packet.sequence_number); | 887 unacked_packets_.rbegin()->first < serialized_packet.sequence_number); |
| 884 unacked_packets_.insert(make_pair(serialized_packet.sequence_number, | 888 unacked_packets_.insert(make_pair(serialized_packet.sequence_number, |
| 885 unacked)); | 889 unacked)); |
| 886 SendOrQueuePacket(serialized_packet.sequence_number, | 890 SendOrQueuePacket(unacked->encryption_level(), |
| 891 serialized_packet.sequence_number, |
| 887 serialized_packet.packet, | 892 serialized_packet.packet, |
| 888 serialized_packet.entropy_hash, | 893 serialized_packet.entropy_hash, |
| 889 HAS_RETRANSMITTABLE_DATA); | 894 HAS_RETRANSMITTABLE_DATA); |
| 890 } | 895 } |
| 891 | 896 |
| 892 bool QuicConnection::CanWrite(Retransmission retransmission, | 897 bool QuicConnection::CanWrite(Retransmission retransmission, |
| 893 HasRetransmittableData retransmittable) { | 898 HasRetransmittableData retransmittable) { |
| 894 // TODO(ianswett): If the packet is a retransmit, the current send alarm may | 899 // TODO(ianswett): If the packet is a retransmit, the current send alarm may |
| 895 // be too long. | 900 // be too long. |
| 896 if (write_blocked_ || helper_->IsSendAlarmSet()) { | 901 if (write_blocked_ || helper_->IsSendAlarmSet()) { |
| 897 return false; | 902 return false; |
| 898 } | 903 } |
| 899 | 904 |
| 900 QuicTime now = clock_->Now(); | 905 QuicTime now = clock_->Now(); |
| 901 QuicTime::Delta delay = congestion_manager_.TimeUntilSend( | 906 QuicTime::Delta delay = congestion_manager_.TimeUntilSend( |
| 902 now, retransmission, retransmittable); | 907 now, retransmission, retransmittable); |
| 903 if (delay.IsInfinite()) { | 908 if (delay.IsInfinite()) { |
| 904 return false; | 909 // TODO(pwestin): should be false but trigger other bugs see b/8350327. |
| 910 return true; |
| 905 } | 911 } |
| 906 | 912 |
| 907 // If the scheduler requires a delay, then we can not send this packet now. | 913 // If the scheduler requires a delay, then we can not send this packet now. |
| 908 if (!delay.IsZero()) { | 914 if (!delay.IsZero()) { |
| 909 helper_->SetSendAlarm(now.Add(delay)); | 915 helper_->SetSendAlarm(now.Add(delay)); |
| 910 return false; | 916 return false; |
| 911 } | 917 } |
| 912 return true; | 918 return true; |
| 913 } | 919 } |
| 914 | 920 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 939 // Do not set the retransmisson alarm if we're already handling the | 945 // Do not set the retransmisson alarm if we're already handling the |
| 940 // retransmission alarm because the retransmission alarm will be reset when | 946 // retransmission alarm because the retransmission alarm will be reset when |
| 941 // OnRetransmissionTimeout completes. | 947 // OnRetransmissionTimeout completes. |
| 942 if (!handling_retransmission_timeout_) { | 948 if (!handling_retransmission_timeout_) { |
| 943 helper_->SetRetransmissionAlarm(retransmission_delay); | 949 helper_->SetRetransmissionAlarm(retransmission_delay); |
| 944 } | 950 } |
| 945 // TODO(satyamshekhar): restore packet reordering with Ian's TODO in | 951 // TODO(satyamshekhar): restore packet reordering with Ian's TODO in |
| 946 // SendStreamData(). | 952 // SendStreamData(). |
| 947 } | 953 } |
| 948 | 954 |
| 949 bool QuicConnection::WritePacket(QuicPacketSequenceNumber sequence_number, | 955 bool QuicConnection::WritePacket(EncryptionLevel level, |
| 956 QuicPacketSequenceNumber sequence_number, |
| 950 QuicPacket* packet, | 957 QuicPacket* packet, |
| 951 HasRetransmittableData retransmittable, | 958 HasRetransmittableData retransmittable, |
| 952 Force forced) { | 959 Force forced) { |
| 953 if (!connected_) { | 960 if (!connected_) { |
| 954 DLOG(INFO) << ENDPOINT | 961 DLOG(INFO) << ENDPOINT |
| 955 << "Not sending packet as connection is disconnected."; | 962 << "Not sending packet as connection is disconnected."; |
| 956 delete packet; | 963 delete packet; |
| 957 // Returning true because we deleted the packet and the caller shouldn't | 964 // Returning true because we deleted the packet and the caller shouldn't |
| 958 // delete it again. | 965 // delete it again. |
| 959 return true; | 966 return true; |
| 960 } | 967 } |
| 961 | 968 |
| 962 Retransmission retransmission = IsRetransmission(sequence_number) ? | 969 Retransmission retransmission = IsRetransmission(sequence_number) ? |
| 963 IS_RETRANSMISSION : NOT_RETRANSMISSION; | 970 IS_RETRANSMISSION : NOT_RETRANSMISSION; |
| 964 // If we are not forced and we can't write, then simply return false; | 971 // If we are not forced and we can't write, then simply return false; |
| 965 if (forced == NO_FORCE && !CanWrite(retransmission, retransmittable)) { | 972 if (forced == NO_FORCE && !CanWrite(retransmission, retransmittable)) { |
| 966 return false; | 973 return false; |
| 967 } | 974 } |
| 968 | 975 |
| 969 scoped_ptr<QuicEncryptedPacket> encrypted( | 976 scoped_ptr<QuicEncryptedPacket> encrypted( |
| 970 framer_.EncryptPacket(sequence_number, *packet)); | 977 framer_.EncryptPacket(level, sequence_number, *packet)); |
| 971 DLOG(INFO) << ENDPOINT << "Sending packet number " << sequence_number | 978 DLOG(INFO) << ENDPOINT << "Sending packet number " << sequence_number |
| 972 << " : " << (packet->is_fec_packet() ? "FEC " : | 979 << " : " << (packet->is_fec_packet() ? "FEC " : |
| 973 (retransmittable == HAS_RETRANSMITTABLE_DATA | 980 (retransmittable == HAS_RETRANSMITTABLE_DATA |
| 974 ? "data bearing " : " ack only ")) | 981 ? "data bearing " : " ack only ")) |
| 975 << " Packet length:" << packet->length(); | 982 << " Packet length:" << packet->length(); |
| 976 | 983 |
| 977 DCHECK(encrypted->length() <= kMaxPacketSize) | 984 DCHECK(encrypted->length() <= kMaxPacketSize) |
| 978 << "Packet " << sequence_number << " will not be read; too large: " | 985 << "Packet " << sequence_number << " will not be read; too large: " |
| 979 << packet->length() << " " << encrypted->length() << " " | 986 << packet->length() << " " << encrypted->length() << " " |
| 980 << outgoing_ack_ << " forced: " << (forced == FORCE ? "yes" : "no"); | 987 << outgoing_ack_ << " forced: " << (forced == FORCE ? "yes" : "no"); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1015 delete packet; | 1022 delete packet; |
| 1016 return true; | 1023 return true; |
| 1017 } | 1024 } |
| 1018 | 1025 |
| 1019 bool QuicConnection::OnSerializedPacket( | 1026 bool QuicConnection::OnSerializedPacket( |
| 1020 const SerializedPacket& serialized_packet) { | 1027 const SerializedPacket& serialized_packet) { |
| 1021 if (serialized_packet.retransmittable_frames != NULL) { | 1028 if (serialized_packet.retransmittable_frames != NULL) { |
| 1022 DCHECK(unacked_packets_.empty() || | 1029 DCHECK(unacked_packets_.empty() || |
| 1023 unacked_packets_.rbegin()->first < | 1030 unacked_packets_.rbegin()->first < |
| 1024 serialized_packet.sequence_number); | 1031 serialized_packet.sequence_number); |
| 1032 // Retransmitted frames will be sent with the same encryption level as the |
| 1033 // original. |
| 1034 serialized_packet.retransmittable_frames->set_encryption_level( |
| 1035 encryption_level_); |
| 1025 unacked_packets_.insert( | 1036 unacked_packets_.insert( |
| 1026 make_pair(serialized_packet.sequence_number, | 1037 make_pair(serialized_packet.sequence_number, |
| 1027 serialized_packet.retransmittable_frames)); | 1038 serialized_packet.retransmittable_frames)); |
| 1028 // All unacked packets might be retransmitted. | 1039 // All unacked packets might be retransmitted. |
| 1029 retransmission_map_.insert( | 1040 retransmission_map_.insert( |
| 1030 make_pair(serialized_packet.sequence_number, | 1041 make_pair(serialized_packet.sequence_number, |
| 1031 RetransmissionInfo(serialized_packet.sequence_number))); | 1042 RetransmissionInfo(serialized_packet.sequence_number))); |
| 1032 } | 1043 } |
| 1033 return SendOrQueuePacket(serialized_packet.sequence_number, | 1044 return SendOrQueuePacket(encryption_level_, |
| 1045 serialized_packet.sequence_number, |
| 1034 serialized_packet.packet, | 1046 serialized_packet.packet, |
| 1035 serialized_packet.entropy_hash, | 1047 serialized_packet.entropy_hash, |
| 1036 serialized_packet.retransmittable_frames != NULL ? | 1048 serialized_packet.retransmittable_frames != NULL ? |
| 1037 HAS_RETRANSMITTABLE_DATA : | 1049 HAS_RETRANSMITTABLE_DATA : |
| 1038 NO_RETRANSMITTABLE_DATA); | 1050 NO_RETRANSMITTABLE_DATA); |
| 1039 } | 1051 } |
| 1040 | 1052 |
| 1041 bool QuicConnection::SendOrQueuePacket(QuicPacketSequenceNumber sequence_number, | 1053 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level, |
| 1054 QuicPacketSequenceNumber sequence_number, |
| 1042 QuicPacket* packet, | 1055 QuicPacket* packet, |
| 1043 QuicPacketEntropyHash entropy_hash, | 1056 QuicPacketEntropyHash entropy_hash, |
| 1044 HasRetransmittableData retransmittable) { | 1057 HasRetransmittableData retransmittable) { |
| 1045 entropy_manager_.RecordSentPacketEntropyHash(sequence_number, entropy_hash); | 1058 entropy_manager_.RecordSentPacketEntropyHash(sequence_number, entropy_hash); |
| 1046 if (!WritePacket(sequence_number, packet, retransmittable, NO_FORCE)) { | 1059 if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) { |
| 1047 queued_packets_.push_back(QueuedPacket(sequence_number, packet, | 1060 queued_packets_.push_back(QueuedPacket(sequence_number, packet, level, |
| 1048 retransmittable)); | 1061 retransmittable)); |
| 1049 return false; | 1062 return false; |
| 1050 } | 1063 } |
| 1051 return true; | 1064 return true; |
| 1052 } | 1065 } |
| 1053 | 1066 |
| 1054 bool QuicConnection::ShouldSimulateLostPacket() { | 1067 bool QuicConnection::ShouldSimulateLostPacket() { |
| 1055 // TODO(rch): enable this | 1068 // TODO(rch): enable this |
| 1056 return false; | 1069 return false; |
| 1057 /* | 1070 /* |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1127 | 1140 |
| 1128 if (retransmission_timeouts_.empty()) { | 1141 if (retransmission_timeouts_.empty()) { |
| 1129 return QuicTime::Zero(); | 1142 return QuicTime::Zero(); |
| 1130 } | 1143 } |
| 1131 | 1144 |
| 1132 // We have packets remaining. Return the absolute RTO of the oldest packet | 1145 // We have packets remaining. Return the absolute RTO of the oldest packet |
| 1133 // on the list. | 1146 // on the list. |
| 1134 return retransmission_timeouts_.top().scheduled_time; | 1147 return retransmission_timeouts_.top().scheduled_time; |
| 1135 } | 1148 } |
| 1136 | 1149 |
| 1137 void QuicConnection::ChangeEncrypter(QuicEncrypter* encrypter) { | 1150 void QuicConnection::SetEncrypter(EncryptionLevel level, |
| 1138 framer_.set_encrypter(encrypter); | 1151 QuicEncrypter* encrypter) { |
| 1152 framer_.SetEncrypter(level, encrypter); |
| 1139 } | 1153 } |
| 1140 | 1154 |
| 1141 void QuicConnection::PushDecrypter(QuicDecrypter* decrypter) { | 1155 const QuicEncrypter* QuicConnection::encrypter(EncryptionLevel level) const { |
| 1142 framer_.push_decrypter(decrypter); | 1156 return framer_.encrypter(level); |
| 1143 } | 1157 } |
| 1144 | 1158 |
| 1145 void QuicConnection::PopDecrypter() { | 1159 void QuicConnection::SetDefaultEncryptionLevel( |
| 1146 framer_.pop_decrypter(); | 1160 EncryptionLevel level) { |
| 1161 encryption_level_ = level; |
| 1162 } |
| 1163 |
| 1164 void QuicConnection::SetDecrypter(QuicDecrypter* decrypter) { |
| 1165 framer_.SetDecrypter(decrypter); |
| 1166 } |
| 1167 |
| 1168 void QuicConnection::SetAlternativeDecrypter(QuicDecrypter* decrypter, |
| 1169 bool latch_once_used) { |
| 1170 framer_.SetAlternativeDecrypter(decrypter, latch_once_used); |
| 1171 } |
| 1172 |
| 1173 const QuicDecrypter* QuicConnection::decrypter() const { |
| 1174 return framer_.decrypter(); |
| 1175 } |
| 1176 |
| 1177 const QuicDecrypter* QuicConnection::alternative_decrypter() const { |
| 1178 return framer_.alternative_decrypter(); |
| 1147 } | 1179 } |
| 1148 | 1180 |
| 1149 void QuicConnection::MaybeProcessRevivedPacket() { | 1181 void QuicConnection::MaybeProcessRevivedPacket() { |
| 1150 QuicFecGroup* group = GetFecGroup(); | 1182 QuicFecGroup* group = GetFecGroup(); |
| 1151 if (group == NULL || !group->CanRevive()) { | 1183 if (group == NULL || !group->CanRevive()) { |
| 1152 return; | 1184 return; |
| 1153 } | 1185 } |
| 1154 QuicPacketHeader revived_header; | 1186 QuicPacketHeader revived_header; |
| 1155 char revived_payload[kMaxPacketSize]; | 1187 char revived_payload[kMaxPacketSize]; |
| 1156 size_t len = group->Revive(&revived_header, revived_payload, kMaxPacketSize); | 1188 size_t len = group->Revive(&revived_header, revived_payload, kMaxPacketSize); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1201 frame.ack_frame = outgoing_ack_; | 1233 frame.ack_frame = outgoing_ack_; |
| 1202 | 1234 |
| 1203 SerializedPacket serialized_packet = | 1235 SerializedPacket serialized_packet = |
| 1204 packet_creator_.SerializeConnectionClose(&frame); | 1236 packet_creator_.SerializeConnectionClose(&frame); |
| 1205 | 1237 |
| 1206 // We need to update the sent entrophy hash for all sent packets. | 1238 // We need to update the sent entrophy hash for all sent packets. |
| 1207 entropy_manager_.RecordSentPacketEntropyHash( | 1239 entropy_manager_.RecordSentPacketEntropyHash( |
| 1208 serialized_packet.sequence_number, | 1240 serialized_packet.sequence_number, |
| 1209 serialized_packet.entropy_hash); | 1241 serialized_packet.entropy_hash); |
| 1210 | 1242 |
| 1211 WritePacket(serialized_packet.sequence_number, | 1243 WritePacket(encryption_level_, |
| 1244 serialized_packet.sequence_number, |
| 1212 serialized_packet.packet, | 1245 serialized_packet.packet, |
| 1213 serialized_packet.retransmittable_frames != NULL ? | 1246 serialized_packet.retransmittable_frames != NULL ? |
| 1214 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA, | 1247 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA, |
| 1215 FORCE); | 1248 FORCE); |
| 1216 } | 1249 } |
| 1217 | 1250 |
| 1218 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error, | 1251 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error, |
| 1219 const string& details) { | 1252 const string& details) { |
| 1220 SendConnectionClosePacket(error, details); | 1253 SendConnectionClosePacket(error, details); |
| 1221 CloseConnection(error, false); | 1254 CloseConnection(error, false); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1272 << " delta:" << delta.ToMicroseconds(); | 1305 << " delta:" << delta.ToMicroseconds(); |
| 1273 if (delta >= timeout_) { | 1306 if (delta >= timeout_) { |
| 1274 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); | 1307 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); |
| 1275 return true; | 1308 return true; |
| 1276 } | 1309 } |
| 1277 helper_->SetTimeoutAlarm(timeout_.Subtract(delta)); | 1310 helper_->SetTimeoutAlarm(timeout_.Subtract(delta)); |
| 1278 return false; | 1311 return false; |
| 1279 } | 1312 } |
| 1280 | 1313 |
| 1281 } // namespace net | 1314 } // namespace net |
| OLD | NEW |