Index: net/quic/quic_packet_creator.cc |
diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc |
index bb4d8e5dfaf475b61eb0fee1a316dac31a251c3c..a375e8e39a53ef8d43eda5c04d75cfd4e2d9277c 100644 |
--- a/net/quic/quic_packet_creator.cc |
+++ b/net/quic/quic_packet_creator.cc |
@@ -70,6 +70,7 @@ QuicPacketCreator::QuicPacketCreator(QuicConnectionId connection_id, |
send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT), |
send_path_id_in_packet_(false), |
next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER), |
+ have_diversification_nonce_(false), |
max_packet_length_(0), |
connection_id_length_(PACKET_8BYTE_CONNECTION_ID), |
packet_size_(0), |
@@ -135,6 +136,13 @@ void QuicPacketCreator::StopSendingVersion() { |
} |
} |
+void QuicPacketCreator::SetDiversificationNonce( |
+ const DiversificationNonce nonce) { |
+ DCHECK(!have_diversification_nonce_); |
+ have_diversification_nonce_ = true; |
+ memcpy(&diversification_nonce_, nonce, sizeof(diversification_nonce_)); |
+} |
+ |
void QuicPacketCreator::UpdatePacketNumberLength( |
QuicPacketNumber least_packet_awaited_by_peer, |
QuicPacketCount max_packets_in_flight) { |
@@ -178,10 +186,12 @@ size_t QuicPacketCreator::StreamFramePacketOverhead( |
QuicConnectionIdLength connection_id_length, |
bool include_version, |
bool include_path_id, |
+ bool include_diversification_nonce, |
QuicPacketNumberLength packet_number_length, |
QuicStreamOffset offset) { |
return GetPacketHeaderSize(connection_id_length, include_version, |
- include_path_id, packet_number_length) + |
+ include_path_id, include_diversification_nonce, |
+ packet_number_length) + |
// Assumes this is a stream with a single lone packet. |
QuicFramer::GetMinStreamFrameSize(1u, offset, true); |
} |
@@ -192,10 +202,11 @@ void QuicPacketCreator::CreateStreamFrame(QuicStreamId id, |
QuicStreamOffset offset, |
bool fin, |
QuicFrame* frame) { |
- DCHECK_GT(max_packet_length_, |
- StreamFramePacketOverhead(connection_id_length_, kIncludeVersion, |
- kIncludePathId, |
- PACKET_6BYTE_PACKET_NUMBER, offset)); |
+ DCHECK_GT( |
+ max_packet_length_, |
+ StreamFramePacketOverhead(connection_id_length_, kIncludeVersion, |
+ kIncludePathId, IncludeNonceInPublicHeader(), |
+ PACKET_6BYTE_PACKET_NUMBER, offset)); |
MaybeUpdatePacketNumberLength(); |
@@ -389,7 +400,7 @@ size_t QuicPacketCreator::PacketSize() { |
packet_.packet_number_length = next_packet_number_length_; |
packet_size_ = GetPacketHeaderSize( |
connection_id_length_, send_version_in_packet_, send_path_id_in_packet_, |
- packet_.packet_number_length); |
+ IncludeNonceInPublicHeader(), packet_.packet_number_length); |
return packet_size_; |
} |
@@ -481,7 +492,12 @@ void QuicPacketCreator::FillPacketHeader(QuicPacketHeader* header) { |
header->public_header.multipath_flag = send_path_id_in_packet_; |
header->public_header.reset_flag = false; |
header->public_header.version_flag = send_version_in_packet_; |
- header->fec_flag = false; |
+ if (IncludeNonceInPublicHeader()) { |
+ DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective()); |
+ header->public_header.nonce = &diversification_nonce_; |
+ } else { |
+ header->public_header.nonce = nullptr; |
+ } |
header->path_id = packet_.path_id; |
header->packet_number = ++packet_.packet_number; |
header->public_header.packet_number_length = packet_.packet_number_length; |
@@ -595,4 +611,9 @@ void QuicPacketCreator::SetCurrentPath( |
UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); |
} |
+bool QuicPacketCreator::IncludeNonceInPublicHeader() { |
+ return have_diversification_nonce_ && |
+ packet_.encryption_level == ENCRYPTION_INITIAL; |
+} |
+ |
} // namespace net |