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

Unified Diff: net/quic/quic_connection.cc

Issue 14083012: QUIC: retransmit packets with the correct encryption. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Moved HandshakeMode enum to MockCryptoClientStream Created 7 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: net/quic/quic_connection.cc
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc
index 766274b9bdb4babcfa35d1b55e23bacb81ac5744..3820849dfa4325027bd92ab08f031f7afd205cb5 100644
--- a/net/quic/quic_connection.cc
+++ b/net/quic/quic_connection.cc
@@ -79,10 +79,9 @@ QuicConnection::QuicConnection(QuicGuid guid,
bool is_server)
: helper_(helper),
framer_(kQuicVersion1,
- QuicDecrypter::Create(kNULL),
- QuicEncrypter::Create(kNULL),
helper->GetClock()->ApproximateNow(),
is_server),
+ encryption_level_(ENCRYPTION_NONE),
clock_(helper->GetClock()),
random_generator_(helper->GetRandomGenerator()),
guid_(guid),
@@ -151,7 +150,9 @@ bool QuicConnection::SelectMutualVersion(
}
void QuicConnection::OnError(QuicFramer* framer) {
- if (!connected_) {
+ // Packets that we cannot decrypt are dropped.
+ // TODO(rch): add stats to measure this.
+ if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) {
return;
}
SendConnectionClose(framer->error());
@@ -727,7 +728,9 @@ void QuicConnection::ProcessUdpPacket(const IPEndPoint& self_address,
stats_.bytes_received += packet.length();
++stats_.packets_received;
- framer_.ProcessPacket(packet);
+ if (!framer_.ProcessPacket(packet)) {
+ return;
+ }
MaybeProcessRevivedPacket();
}
@@ -770,7 +773,8 @@ bool QuicConnection::WriteQueuedPackets() {
// TODO(rch): clean up and close the connection if we really hit this.
DCHECK_LT(queued_packets_.size(), num_queued_packets);
num_queued_packets = queued_packets_.size();
- if (WritePacket(packet_iterator->sequence_number,
+ if (WritePacket(packet_iterator->encryption_level,
+ packet_iterator->sequence_number,
packet_iterator->packet,
packet_iterator->retransmittable,
NO_FORCE)) {
@@ -883,7 +887,8 @@ void QuicConnection::RetransmitPacket(
unacked_packets_.rbegin()->first < serialized_packet.sequence_number);
unacked_packets_.insert(make_pair(serialized_packet.sequence_number,
unacked));
- SendOrQueuePacket(serialized_packet.sequence_number,
+ SendOrQueuePacket(unacked->encryption_level(),
+ serialized_packet.sequence_number,
serialized_packet.packet,
serialized_packet.entropy_hash,
HAS_RETRANSMITTABLE_DATA);
@@ -946,7 +951,8 @@ void QuicConnection::MaybeSetupRetransmission(
// SendStreamData().
}
-bool QuicConnection::WritePacket(QuicPacketSequenceNumber sequence_number,
+bool QuicConnection::WritePacket(EncryptionLevel level,
+ QuicPacketSequenceNumber sequence_number,
QuicPacket* packet,
HasRetransmittableData retransmittable,
Force forced) {
@@ -967,7 +973,7 @@ bool QuicConnection::WritePacket(QuicPacketSequenceNumber sequence_number,
}
scoped_ptr<QuicEncryptedPacket> encrypted(
- framer_.EncryptPacket(sequence_number, *packet));
+ framer_.EncryptPacket(level, sequence_number, *packet));
DLOG(INFO) << ENDPOINT << "Sending packet number " << sequence_number
<< " : " << (packet->is_fec_packet() ? "FEC " :
(retransmittable == HAS_RETRANSMITTABLE_DATA
@@ -1022,6 +1028,10 @@ bool QuicConnection::OnSerializedPacket(
DCHECK(unacked_packets_.empty() ||
unacked_packets_.rbegin()->first <
serialized_packet.sequence_number);
+ // Retransmitted frames will be sent with the same encryption level as the
+ // original.
+ serialized_packet.retransmittable_frames->set_encryption_level(
+ encryption_level_);
unacked_packets_.insert(
make_pair(serialized_packet.sequence_number,
serialized_packet.retransmittable_frames));
@@ -1030,7 +1040,8 @@ bool QuicConnection::OnSerializedPacket(
make_pair(serialized_packet.sequence_number,
RetransmissionInfo(serialized_packet.sequence_number)));
}
- return SendOrQueuePacket(serialized_packet.sequence_number,
+ return SendOrQueuePacket(encryption_level_,
+ serialized_packet.sequence_number,
serialized_packet.packet,
serialized_packet.entropy_hash,
serialized_packet.retransmittable_frames != NULL ?
@@ -1038,13 +1049,14 @@ bool QuicConnection::OnSerializedPacket(
NO_RETRANSMITTABLE_DATA);
}
-bool QuicConnection::SendOrQueuePacket(QuicPacketSequenceNumber sequence_number,
+bool QuicConnection::SendOrQueuePacket(EncryptionLevel level,
+ QuicPacketSequenceNumber sequence_number,
QuicPacket* packet,
QuicPacketEntropyHash entropy_hash,
HasRetransmittableData retransmittable) {
entropy_manager_.RecordSentPacketEntropyHash(sequence_number, entropy_hash);
- if (!WritePacket(sequence_number, packet, retransmittable, NO_FORCE)) {
- queued_packets_.push_back(QueuedPacket(sequence_number, packet,
+ if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) {
+ queued_packets_.push_back(QueuedPacket(sequence_number, packet, level,
retransmittable));
return false;
}
@@ -1134,16 +1146,35 @@ QuicTime QuicConnection::OnRetransmissionTimeout() {
return retransmission_timeouts_.top().scheduled_time;
}
-void QuicConnection::ChangeEncrypter(QuicEncrypter* encrypter) {
- framer_.set_encrypter(encrypter);
+void QuicConnection::SetEncrypter(EncryptionLevel level,
+ QuicEncrypter* encrypter) {
+ framer_.SetEncrypter(level, encrypter);
+}
+
+const QuicEncrypter* QuicConnection::encrypter(EncryptionLevel level) const {
+ return framer_.encrypter(level);
+}
+
+void QuicConnection::SetDefaultEncryptionLevel(
+ EncryptionLevel level) {
+ encryption_level_ = level;
+}
+
+void QuicConnection::SetDecrypter(QuicDecrypter* decrypter) {
+ framer_.SetDecrypter(decrypter);
+}
+
+void QuicConnection::SetAlternativeDecrypter(QuicDecrypter* decrypter,
+ bool latch_once_used) {
+ framer_.SetAlternativeDecrypter(decrypter, latch_once_used);
}
-void QuicConnection::PushDecrypter(QuicDecrypter* decrypter) {
- framer_.push_decrypter(decrypter);
+const QuicDecrypter* QuicConnection::decrypter() const {
+ return framer_.decrypter();
}
-void QuicConnection::PopDecrypter() {
- framer_.pop_decrypter();
+const QuicDecrypter* QuicConnection::alternative_decrypter() const {
+ return framer_.alternative_decrypter();
}
void QuicConnection::MaybeProcessRevivedPacket() {
@@ -1208,7 +1239,8 @@ void QuicConnection::SendConnectionClosePacket(QuicErrorCode error,
serialized_packet.sequence_number,
serialized_packet.entropy_hash);
- WritePacket(serialized_packet.sequence_number,
+ WritePacket(encryption_level_,
+ serialized_packet.sequence_number,
serialized_packet.packet,
serialized_packet.retransmittable_frames != NULL ?
HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA,

Powered by Google App Engine
This is Rietveld 408576698