blob: 7420c7230740872ea29ee87d8dd3e3d2502251a8 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/quic_packet_creator.h"
6
7#include <algorithm>
8#include <cstdint>
vasilvv872e7a32019-03-12 16:42:44 -07009#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -050010
QUICHE teama6ef0a62019-03-07 20:34:33 -050011#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
12#include "net/third_party/quiche/src/quic/core/quic_connection_id.h"
ianswettb239f862019-04-05 09:15:06 -070013#include "net/third_party/quiche/src/quic/core/quic_constants.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050014#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
15#include "net/third_party/quiche/src/quic/core/quic_types.h"
16#include "net/third_party/quiche/src/quic/core/quic_utils.h"
ianswettb239f862019-04-05 09:15:06 -070017#include "net/third_party/quiche/src/quic/core/quic_versions.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050018#include "net/third_party/quiche/src/quic/platform/api/quic_aligned.h"
19#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.h"
20#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
21#include "net/third_party/quiche/src/quic/platform/api/quic_flag_utils.h"
22#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
23#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
24#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
bnc2c2444e2019-05-03 08:18:23 -070025#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050026#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
27#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
28
29namespace quic {
30namespace {
31
32QuicLongHeaderType EncryptionlevelToLongHeaderType(EncryptionLevel level) {
33 switch (level) {
QUICHE team6987b4a2019-03-15 16:23:04 -070034 case ENCRYPTION_INITIAL:
QUICHE teama6ef0a62019-03-07 20:34:33 -050035 return INITIAL;
QUICHE team88ea0082019-03-15 10:05:26 -070036 case ENCRYPTION_HANDSHAKE:
37 return HANDSHAKE;
QUICHE teama6ef0a62019-03-07 20:34:33 -050038 case ENCRYPTION_ZERO_RTT:
39 return ZERO_RTT_PROTECTED;
40 case ENCRYPTION_FORWARD_SECURE:
41 QUIC_BUG
42 << "Try to derive long header type for packet with encryption level: "
43 << QuicUtils::EncryptionLevelToString(level);
44 return INVALID_PACKET_TYPE;
45 default:
46 QUIC_BUG << QuicUtils::EncryptionLevelToString(level);
47 return INVALID_PACKET_TYPE;
48 }
49}
50
51} // namespace
52
53#define ENDPOINT \
54 (framer_->perspective() == Perspective::IS_SERVER ? "Server: " : "Client: ")
55
dschinazi7b9278c2019-05-20 07:36:21 -070056QuicPacketCreator::QuicPacketCreator(QuicConnectionId server_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -050057 QuicFramer* framer,
58 DelegateInterface* delegate)
dschinazi7b9278c2019-05-20 07:36:21 -070059 : QuicPacketCreator(server_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -050060 framer,
61 QuicRandom::GetInstance(),
62 delegate) {}
63
dschinazi7b9278c2019-05-20 07:36:21 -070064QuicPacketCreator::QuicPacketCreator(QuicConnectionId server_connection_id,
QUICHE teama6ef0a62019-03-07 20:34:33 -050065 QuicFramer* framer,
66 QuicRandom* random,
67 DelegateInterface* delegate)
68 : delegate_(delegate),
69 debug_delegate_(nullptr),
70 framer_(framer),
71 random_(random),
72 send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT),
73 have_diversification_nonce_(false),
74 max_packet_length_(0),
dschinazi7b9278c2019-05-20 07:36:21 -070075 server_connection_id_included_(CONNECTION_ID_PRESENT),
QUICHE teama6ef0a62019-03-07 20:34:33 -050076 packet_size_(0),
dschinazi7b9278c2019-05-20 07:36:21 -070077 server_connection_id_(server_connection_id),
QUICHE teama6ef0a62019-03-07 20:34:33 -050078 packet_(QuicPacketNumber(),
79 PACKET_1BYTE_PACKET_NUMBER,
80 nullptr,
81 0,
82 false,
83 false),
84 pending_padding_bytes_(0),
85 needs_full_padding_(false),
wub98669f52019-04-18 10:49:18 -070086 can_set_transmission_type_(false) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050087 SetMaxPacketLength(kDefaultMaxPacketSize);
88}
89
90QuicPacketCreator::~QuicPacketCreator() {
91 DeleteFrames(&packet_.retransmittable_frames);
92}
93
94void QuicPacketCreator::SetEncrypter(EncryptionLevel level,
95 std::unique_ptr<QuicEncrypter> encrypter) {
96 framer_->SetEncrypter(level, std::move(encrypter));
97 max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_);
98}
99
100bool QuicPacketCreator::CanSetMaxPacketLength() const {
101 // |max_packet_length_| should not be changed mid-packet.
102 return queued_frames_.empty();
103}
104
105void QuicPacketCreator::SetMaxPacketLength(QuicByteCount length) {
106 DCHECK(CanSetMaxPacketLength());
107
108 // Avoid recomputing |max_plaintext_size_| if the length does not actually
109 // change.
110 if (length == max_packet_length_) {
111 return;
112 }
113
114 max_packet_length_ = length;
115 max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_);
nharper55fa6132019-05-07 19:37:21 -0700116 QUIC_BUG_IF(max_plaintext_size_ - PacketHeaderSize() <
QUICHE team2252b702019-05-14 23:55:14 -0400117 MinPlaintextPacketSize(framer_->version()))
nharper55fa6132019-05-07 19:37:21 -0700118 << "Attempted to set max packet length too small";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500119}
120
121// Stops serializing version of the protocol in packets sent after this call.
122// A packet that is already open might send kQuicVersionSize bytes less than the
123// maximum packet size if we stop sending version before it is serialized.
124void QuicPacketCreator::StopSendingVersion() {
125 DCHECK(send_version_in_packet_);
126 DCHECK_LE(framer_->transport_version(), QUIC_VERSION_43);
127 send_version_in_packet_ = false;
128 if (packet_size_ > 0) {
129 DCHECK_LT(kQuicVersionSize, packet_size_);
130 packet_size_ -= kQuicVersionSize;
131 }
132}
133
134void QuicPacketCreator::SetDiversificationNonce(
135 const DiversificationNonce& nonce) {
136 DCHECK(!have_diversification_nonce_);
137 have_diversification_nonce_ = true;
138 diversification_nonce_ = nonce;
139}
140
141void QuicPacketCreator::UpdatePacketNumberLength(
142 QuicPacketNumber least_packet_awaited_by_peer,
143 QuicPacketCount max_packets_in_flight) {
144 if (!queued_frames_.empty()) {
145 // Don't change creator state if there are frames queued.
146 QUIC_BUG << "Called UpdatePacketNumberLength with " << queued_frames_.size()
147 << " queued_frames. First frame type:"
148 << queued_frames_.front().type
149 << " last frame type:" << queued_frames_.back().type;
150 return;
151 }
152
153 DCHECK_LE(least_packet_awaited_by_peer, packet_.packet_number + 1);
154 const uint64_t current_delta =
155 packet_.packet_number + 1 - least_packet_awaited_by_peer;
156 const uint64_t delta = std::max(current_delta, max_packets_in_flight);
157 packet_.packet_number_length = QuicFramer::GetMinPacketNumberLength(
158 framer_->transport_version(), QuicPacketNumber(delta * 4));
159}
160
161bool QuicPacketCreator::ConsumeCryptoData(EncryptionLevel level,
162 size_t write_length,
163 QuicStreamOffset offset,
nharper51961cf2019-05-13 13:23:24 -0700164 bool needs_full_padding,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500165 TransmissionType transmission_type,
166 QuicFrame* frame) {
167 if (!CreateCryptoFrame(level, write_length, offset, frame)) {
168 return false;
169 }
170 // When crypto data was sent in stream frames, ConsumeData is called with
171 // |needs_full_padding = true|. Keep the same behavior here when sending
172 // crypto frames.
173 //
174 // TODO(nharper): Check what the IETF drafts say about padding out initial
175 // messages and change this as appropriate.
nharper51961cf2019-05-13 13:23:24 -0700176 if (needs_full_padding) {
177 needs_full_padding_ = true;
178 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500179 return AddFrame(*frame, /*save_retransmittable_frames*/ true,
180 transmission_type);
181}
182
183bool QuicPacketCreator::ConsumeData(QuicStreamId id,
ianswette28f0222019-04-04 13:31:22 -0700184 size_t data_size,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500185 QuicStreamOffset offset,
186 bool fin,
187 bool needs_full_padding,
188 TransmissionType transmission_type,
189 QuicFrame* frame) {
QUICHE teamf08778a2019-03-14 08:10:26 -0700190 if (!HasRoomForStreamFrame(id, offset, data_size)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500191 return false;
192 }
QUICHE teamf08778a2019-03-14 08:10:26 -0700193 CreateStreamFrame(id, data_size, offset, fin, frame);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500194 // Explicitly disallow multi-packet CHLOs.
195 if (FLAGS_quic_enforce_single_packet_chlo &&
ianswette28f0222019-04-04 13:31:22 -0700196 StreamFrameIsClientHello(frame->stream_frame) &&
197 frame->stream_frame.data_length < data_size) {
vasilvvc48c8712019-03-11 13:38:16 -0700198 const std::string error_details =
QUICHE teama6ef0a62019-03-07 20:34:33 -0500199 "Client hello won't fit in a single packet.";
200 QUIC_BUG << error_details << " Constructed stream frame length: "
201 << frame->stream_frame.data_length
ianswette28f0222019-04-04 13:31:22 -0700202 << " CHLO length: " << data_size;
fkastenholz85f18902019-05-28 12:47:00 -0700203 delegate_->OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500204 return false;
205 }
206 if (!AddFrame(*frame, /*save_retransmittable_frames=*/true,
207 transmission_type)) {
208 // Fails if we try to write unencrypted stream data.
209 return false;
210 }
211 if (needs_full_padding) {
212 needs_full_padding_ = true;
213 }
214
215 return true;
216}
217
218bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id,
219 QuicStreamOffset offset,
220 size_t data_size) {
221 return BytesFree() >
222 QuicFramer::GetMinStreamFrameSize(framer_->transport_version(), id,
223 offset, true, data_size);
224}
225
226bool QuicPacketCreator::HasRoomForMessageFrame(QuicByteCount length) {
227 return BytesFree() >= QuicFramer::GetMessageFrameSize(
228 framer_->transport_version(), true, length);
229}
230
231// TODO(fkastenholz): this method should not use constant values for
232// the last-frame-in-packet and data-length parameters to
233// GetMinStreamFrameSize. Proper values should be plumbed in from
234// higher up. This was left this way for now for a few reasons. First,
235// higher up calls to StreamFramePacketOverhead() do not always know
236// this information, leading to a cascade of changes and B) the
237// higher-up software does not always loop, calling
238// StreamFramePacketOverhead() once for every packet -- eg there is
239// a test in quic_connection_test that calls it once and assumes that
240// the value is the same for all packets.
241
242// static
243size_t QuicPacketCreator::StreamFramePacketOverhead(
244 QuicTransportVersion version,
245 QuicConnectionIdLength destination_connection_id_length,
246 QuicConnectionIdLength source_connection_id_length,
247 bool include_version,
248 bool include_diversification_nonce,
249 QuicPacketNumberLength packet_number_length,
250 QuicVariableLengthIntegerLength retry_token_length_length,
251 QuicVariableLengthIntegerLength length_length,
252 QuicStreamOffset offset) {
253 return GetPacketHeaderSize(version, destination_connection_id_length,
254 source_connection_id_length, include_version,
255 include_diversification_nonce,
256 packet_number_length, retry_token_length_length, 0,
257 length_length) +
258
259 // Assumes this is a packet with a single stream frame in it. Since
260 // last_frame_in_packet is set true, the size of the length field is
261 // not included in the calculation. This is OK because in other places
262 // in the code, the logic adds back 2 (the size of the Google QUIC
263 // length) when a frame is not the last frame of the packet. This is
264 // also acceptable for IETF Quic; even though the length field could be
265 // 8 bytes long, in practice it will not be longer than 2 bytes (enough
266 // to encode 16K). A length that would be encoded in 2 bytes (0xfff)
267 // is passed just for cleanliness.
268 //
269 // TODO(fkastenholz): This is very hacky and feels brittle. Ideally we
270 // would calculate the correct lengths at the correct time, based on
271 // the state at that time/place.
272 QuicFramer::GetMinStreamFrameSize(version, 1u, offset, true,
dschinazi66dea072019-04-09 11:41:06 -0700273 kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500274}
275
276void QuicPacketCreator::CreateStreamFrame(QuicStreamId id,
QUICHE teamf08778a2019-03-14 08:10:26 -0700277 size_t data_size,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500278 QuicStreamOffset offset,
279 bool fin,
280 QuicFrame* frame) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500281 DCHECK_GT(
282 max_packet_length_,
283 StreamFramePacketOverhead(
284 framer_->transport_version(), GetDestinationConnectionIdLength(),
285 GetSourceConnectionIdLength(), kIncludeVersion,
286 IncludeNonceInPublicHeader(), PACKET_6BYTE_PACKET_NUMBER,
287 GetRetryTokenLengthLength(), GetLengthLength(), offset));
288
289 QUIC_BUG_IF(!HasRoomForStreamFrame(id, offset, data_size))
290 << "No room for Stream frame, BytesFree: " << BytesFree()
291 << " MinStreamFrameSize: "
292 << QuicFramer::GetMinStreamFrameSize(framer_->transport_version(), id,
293 offset, true, data_size);
294
QUICHE teamf08778a2019-03-14 08:10:26 -0700295 QUIC_BUG_IF(data_size == 0 && !fin)
296 << "Creating a stream frame for stream ID:" << id
297 << " with no data or fin.";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500298 size_t min_frame_size = QuicFramer::GetMinStreamFrameSize(
299 framer_->transport_version(), id, offset,
300 /* last_frame_in_packet= */ true, data_size);
301 size_t bytes_consumed =
302 std::min<size_t>(BytesFree() - min_frame_size, data_size);
303
304 bool set_fin = fin && bytes_consumed == data_size; // Last frame.
305 *frame = QuicFrame(QuicStreamFrame(id, set_fin, offset, bytes_consumed));
306}
307
308bool QuicPacketCreator::CreateCryptoFrame(EncryptionLevel level,
309 size_t write_length,
310 QuicStreamOffset offset,
311 QuicFrame* frame) {
312 size_t min_frame_size =
313 QuicFramer::GetMinCryptoFrameSize(write_length, offset);
314 if (BytesFree() <= min_frame_size) {
315 return false;
316 }
317 size_t max_write_length = BytesFree() - min_frame_size;
318 size_t bytes_consumed = std::min<size_t>(max_write_length, write_length);
319 *frame = QuicFrame(new QuicCryptoFrame(level, offset, bytes_consumed));
320 return true;
321}
322
323void QuicPacketCreator::ReserializeAllFrames(
324 const QuicPendingRetransmission& retransmission,
325 char* buffer,
326 size_t buffer_len) {
327 DCHECK(queued_frames_.empty());
328 DCHECK_EQ(0, packet_.num_padding_bytes);
329 QUIC_BUG_IF(retransmission.retransmittable_frames.empty())
330 << "Attempt to serialize empty packet";
331 const EncryptionLevel default_encryption_level = packet_.encryption_level;
332
333 // Temporarily set the packet number length and change the encryption level.
334 packet_.packet_number_length = retransmission.packet_number_length;
335 if (retransmission.num_padding_bytes == -1) {
336 // Only retransmit padding when original packet needs full padding. Padding
337 // from pending_padding_bytes_ are not retransmitted.
338 needs_full_padding_ = true;
339 }
340 // Only preserve the original encryption level if it's a handshake packet or
341 // if we haven't gone forward secure.
342 if (retransmission.has_crypto_handshake ||
343 packet_.encryption_level != ENCRYPTION_FORWARD_SECURE) {
344 packet_.encryption_level = retransmission.encryption_level;
345 }
346
347 // Serialize the packet and restore packet number length state.
348 for (const QuicFrame& frame : retransmission.retransmittable_frames) {
349 bool success = AddFrame(frame, false, retransmission.transmission_type);
350 QUIC_BUG_IF(!success) << " Failed to add frame of type:" << frame.type
351 << " num_frames:"
352 << retransmission.retransmittable_frames.size()
353 << " retransmission.packet_number_length:"
354 << retransmission.packet_number_length
355 << " packet_.packet_number_length:"
356 << packet_.packet_number_length;
357 }
358 packet_.transmission_type = retransmission.transmission_type;
359 SerializePacket(buffer, buffer_len);
360 packet_.original_packet_number = retransmission.packet_number;
361 OnSerializedPacket();
362 // Restore old values.
363 packet_.encryption_level = default_encryption_level;
364}
365
366void QuicPacketCreator::Flush() {
367 if (!HasPendingFrames() && pending_padding_bytes_ == 0) {
368 return;
369 }
370
dschinazi66dea072019-04-09 11:41:06 -0700371 QUIC_CACHELINE_ALIGNED char stack_buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500372 char* serialized_packet_buffer = delegate_->GetPacketBuffer();
373 if (serialized_packet_buffer == nullptr) {
374 serialized_packet_buffer = stack_buffer;
375 }
376
dschinazi66dea072019-04-09 11:41:06 -0700377 SerializePacket(serialized_packet_buffer, kMaxOutgoingPacketSize);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500378 OnSerializedPacket();
379}
380
381void QuicPacketCreator::OnSerializedPacket() {
382 if (packet_.encrypted_buffer == nullptr) {
vasilvvc48c8712019-03-11 13:38:16 -0700383 const std::string error_details = "Failed to SerializePacket.";
QUICHE teama6ef0a62019-03-07 20:34:33 -0500384 QUIC_BUG << error_details;
385 delegate_->OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET,
fkastenholz85f18902019-05-28 12:47:00 -0700386 error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500387 return;
388 }
389
390 SerializedPacket packet(std::move(packet_));
391 ClearPacket();
392 delegate_->OnSerializedPacket(&packet);
393}
394
395void QuicPacketCreator::ClearPacket() {
396 packet_.has_ack = false;
397 packet_.has_stop_waiting = false;
398 packet_.has_crypto_handshake = NOT_HANDSHAKE;
399 packet_.num_padding_bytes = 0;
400 packet_.original_packet_number.Clear();
wub98669f52019-04-18 10:49:18 -0700401 packet_.transmission_type = NOT_RETRANSMISSION;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500402 packet_.encrypted_buffer = nullptr;
403 packet_.encrypted_length = 0;
404 DCHECK(packet_.retransmittable_frames.empty());
405 packet_.largest_acked.Clear();
406 needs_full_padding_ = false;
407}
408
409void QuicPacketCreator::CreateAndSerializeStreamFrame(
410 QuicStreamId id,
411 size_t write_length,
412 QuicStreamOffset iov_offset,
413 QuicStreamOffset stream_offset,
414 bool fin,
415 TransmissionType transmission_type,
416 size_t* num_bytes_consumed) {
417 DCHECK(queued_frames_.empty());
418 // Write out the packet header
419 QuicPacketHeader header;
420 FillPacketHeader(&header);
421
dschinazi66dea072019-04-09 11:41:06 -0700422 QUIC_CACHELINE_ALIGNED char stack_buffer[kMaxOutgoingPacketSize];
QUICHE teama6ef0a62019-03-07 20:34:33 -0500423 char* encrypted_buffer = delegate_->GetPacketBuffer();
424 if (encrypted_buffer == nullptr) {
425 encrypted_buffer = stack_buffer;
426 }
427
dschinazi66dea072019-04-09 11:41:06 -0700428 QuicDataWriter writer(kMaxOutgoingPacketSize, encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500429 size_t length_field_offset = 0;
430 if (!framer_->AppendPacketHeader(header, &writer, &length_field_offset)) {
431 QUIC_BUG << "AppendPacketHeader failed";
432 return;
433 }
434
435 // Create a Stream frame with the remaining space.
436 QUIC_BUG_IF(iov_offset == write_length && !fin)
437 << "Creating a stream frame with no data or fin.";
438 const size_t remaining_data_size = write_length - iov_offset;
439 const size_t min_frame_size = QuicFramer::GetMinStreamFrameSize(
440 framer_->transport_version(), id, stream_offset,
441 /* last_frame_in_packet= */ true, remaining_data_size);
442 const size_t available_size =
443 max_plaintext_size_ - writer.length() - min_frame_size;
444 const size_t bytes_consumed =
445 std::min<size_t>(available_size, remaining_data_size);
nharper55fa6132019-05-07 19:37:21 -0700446 const size_t plaintext_bytes_written = min_frame_size + bytes_consumed;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500447
448 const bool set_fin = fin && (bytes_consumed == remaining_data_size);
449 QuicStreamFrame frame(id, set_fin, stream_offset, bytes_consumed);
rchc76cd742019-03-26 16:00:03 -0700450 if (debug_delegate_ != nullptr) {
451 debug_delegate_->OnFrameAddedToPacket(QuicFrame(frame));
452 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500453 QUIC_DVLOG(1) << ENDPOINT << "Adding frame: " << frame;
454
455 // TODO(ianswett): AppendTypeByte and AppendStreamFrame could be optimized
456 // into one method that takes a QuicStreamFrame, if warranted.
457 if (!framer_->AppendTypeByte(QuicFrame(frame),
458 /* no stream frame length */ true, &writer)) {
459 QUIC_BUG << "AppendTypeByte failed";
460 return;
461 }
462 if (!framer_->AppendStreamFrame(frame, /* no stream frame length */ true,
463 &writer)) {
464 QUIC_BUG << "AppendStreamFrame failed";
465 return;
466 }
QUICHE team2252b702019-05-14 23:55:14 -0400467 if (plaintext_bytes_written < MinPlaintextPacketSize(framer_->version()) &&
468 !writer.WritePaddingBytes(MinPlaintextPacketSize(framer_->version()) -
nharper55fa6132019-05-07 19:37:21 -0700469 plaintext_bytes_written)) {
470 QUIC_BUG << "Unable to add padding bytes";
471 return;
472 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500473
474 if (!framer_->WriteIetfLongHeaderLength(header, &writer, length_field_offset,
475 packet_.encryption_level)) {
476 return;
477 }
478
wub98669f52019-04-18 10:49:18 -0700479 if (can_set_transmission_type()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500480 packet_.transmission_type = transmission_type;
481 }
482
483 size_t encrypted_length = framer_->EncryptInPlace(
484 packet_.encryption_level, packet_.packet_number,
485 GetStartOfEncryptedData(framer_->transport_version(), header),
dschinazi66dea072019-04-09 11:41:06 -0700486 writer.length(), kMaxOutgoingPacketSize, encrypted_buffer);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500487 if (encrypted_length == 0) {
488 QUIC_BUG << "Failed to encrypt packet number " << header.packet_number;
489 return;
490 }
491 // TODO(ianswett): Optimize the storage so RetransmitableFrames can be
492 // unioned with a QuicStreamFrame and a UniqueStreamBuffer.
493 *num_bytes_consumed = bytes_consumed;
494 packet_size_ = 0;
495 packet_.encrypted_buffer = encrypted_buffer;
496 packet_.encrypted_length = encrypted_length;
497 packet_.retransmittable_frames.push_back(QuicFrame(frame));
498 OnSerializedPacket();
499}
500
501bool QuicPacketCreator::HasPendingFrames() const {
502 return !queued_frames_.empty();
503}
504
505bool QuicPacketCreator::HasPendingRetransmittableFrames() const {
506 return !packet_.retransmittable_frames.empty();
507}
508
509bool QuicPacketCreator::HasPendingStreamFramesOfStream(QuicStreamId id) const {
510 for (const auto& frame : packet_.retransmittable_frames) {
511 if (frame.type == STREAM_FRAME && frame.stream_frame.stream_id == id) {
512 return true;
513 }
514 }
515 return false;
516}
517
518size_t QuicPacketCreator::ExpansionOnNewFrame() const {
519 // If the last frame in the packet is a message frame, then it will expand to
520 // include the varint message length when a new frame is added.
521 const bool has_trailing_message_frame =
522 !queued_frames_.empty() && queued_frames_.back().type == MESSAGE_FRAME;
523 if (has_trailing_message_frame) {
524 return QuicDataWriter::GetVarInt62Len(
525 queued_frames_.back().message_frame->message_length);
526 }
527 // If the last frame in the packet is a stream frame, then it will expand to
528 // include the stream_length field when a new frame is added.
529 const bool has_trailing_stream_frame =
530 !queued_frames_.empty() && queued_frames_.back().type == STREAM_FRAME;
531 if (!has_trailing_stream_frame) {
532 return 0;
533 }
534 if (framer_->transport_version() == QUIC_VERSION_99) {
535 return QuicDataWriter::GetVarInt62Len(
536 queued_frames_.back().stream_frame.data_length);
537 }
538 return kQuicStreamPayloadLengthSize;
539}
540
541size_t QuicPacketCreator::BytesFree() {
542 DCHECK_GE(max_plaintext_size_, PacketSize());
543 return max_plaintext_size_ -
544 std::min(max_plaintext_size_, PacketSize() + ExpansionOnNewFrame());
545}
546
547size_t QuicPacketCreator::PacketSize() {
548 if (!queued_frames_.empty()) {
549 return packet_size_;
550 }
nharper55fa6132019-05-07 19:37:21 -0700551 packet_size_ = PacketHeaderSize();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500552 return packet_size_;
553}
554
555bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame,
556 TransmissionType transmission_type) {
557 return AddFrame(frame, /*save_retransmittable_frames=*/true,
558 transmission_type);
559}
560
561bool QuicPacketCreator::AddPaddedSavedFrame(
562 const QuicFrame& frame,
563 TransmissionType transmission_type) {
564 if (AddFrame(frame, /*save_retransmittable_frames=*/true,
565 transmission_type)) {
566 needs_full_padding_ = true;
567 return true;
568 }
569 return false;
570}
571
572void QuicPacketCreator::SerializePacket(char* encrypted_buffer,
573 size_t encrypted_buffer_len) {
574 DCHECK_LT(0u, encrypted_buffer_len);
575 QUIC_BUG_IF(queued_frames_.empty() && pending_padding_bytes_ == 0)
576 << "Attempt to serialize empty packet";
577 QuicPacketHeader header;
578 // FillPacketHeader increments packet_number_.
579 FillPacketHeader(&header);
580
581 MaybeAddPadding();
582
583 DCHECK_GE(max_plaintext_size_, packet_size_);
584 // Use the packet_size_ instead of the buffer size to ensure smaller
585 // packet sizes are properly used.
586 size_t length =
587 framer_->BuildDataPacket(header, queued_frames_, encrypted_buffer,
588 packet_size_, packet_.encryption_level);
589 if (length == 0) {
590 QUIC_BUG << "Failed to serialize " << queued_frames_.size() << " frames.";
591 return;
592 }
593
594 // ACK Frames will be truncated due to length only if they're the only frame
595 // in the packet, and if packet_size_ was set to max_plaintext_size_. If
596 // truncation due to length occurred, then GetSerializedFrameLength will have
597 // returned all bytes free.
598 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size_ &&
599 queued_frames_.size() == 1 &&
600 queued_frames_.back().type == ACK_FRAME;
601 // Because of possible truncation, we can't be confident that our
602 // packet size calculation worked correctly.
603 if (!possibly_truncated_by_length) {
604 DCHECK_EQ(packet_size_, length);
605 }
606 const size_t encrypted_length = framer_->EncryptInPlace(
607 packet_.encryption_level, packet_.packet_number,
608 GetStartOfEncryptedData(framer_->transport_version(), header), length,
609 encrypted_buffer_len, encrypted_buffer);
610 if (encrypted_length == 0) {
611 QUIC_BUG << "Failed to encrypt packet number " << packet_.packet_number;
612 return;
613 }
614
615 packet_size_ = 0;
616 queued_frames_.clear();
617 packet_.encrypted_buffer = encrypted_buffer;
618 packet_.encrypted_length = encrypted_length;
619}
620
621std::unique_ptr<QuicEncryptedPacket>
622QuicPacketCreator::SerializeVersionNegotiationPacket(
623 bool ietf_quic,
624 const ParsedQuicVersionVector& supported_versions) {
625 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective());
626 std::unique_ptr<QuicEncryptedPacket> encrypted =
dschinazi7b9278c2019-05-20 07:36:21 -0700627 QuicFramer::BuildVersionNegotiationPacket(server_connection_id_,
dschinazib417d602019-05-29 13:08:45 -0700628 EmptyQuicConnectionId(),
dschinazi7b9278c2019-05-20 07:36:21 -0700629 ietf_quic, supported_versions);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500630 DCHECK(encrypted);
631 DCHECK_GE(max_packet_length_, encrypted->length());
632 return encrypted;
633}
634
635OwningSerializedPacketPointer
636QuicPacketCreator::SerializeConnectivityProbingPacket() {
637 QUIC_BUG_IF(framer_->transport_version() == QUIC_VERSION_99)
638 << "Must not be version 99 to serialize padded ping connectivity probe";
639 QuicPacketHeader header;
640 // FillPacketHeader increments packet_number_.
641 FillPacketHeader(&header);
642
dschinazi66dea072019-04-09 11:41:06 -0700643 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500644 size_t length = framer_->BuildConnectivityProbingPacket(
645 header, buffer.get(), max_plaintext_size_, packet_.encryption_level);
646 DCHECK(length);
647
648 const size_t encrypted_length = framer_->EncryptInPlace(
649 packet_.encryption_level, packet_.packet_number,
650 GetStartOfEncryptedData(framer_->transport_version(), header), length,
dschinazi66dea072019-04-09 11:41:06 -0700651 kMaxOutgoingPacketSize, buffer.get());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500652 DCHECK(encrypted_length);
653
654 OwningSerializedPacketPointer serialize_packet(new SerializedPacket(
655 header.packet_number, header.packet_number_length, buffer.release(),
656 encrypted_length, /*has_ack=*/false, /*has_stop_waiting=*/false));
657
658 serialize_packet->encryption_level = packet_.encryption_level;
659 serialize_packet->transmission_type = NOT_RETRANSMISSION;
660
661 return serialize_packet;
662}
663
664OwningSerializedPacketPointer
665QuicPacketCreator::SerializePathChallengeConnectivityProbingPacket(
666 QuicPathFrameBuffer* payload) {
667 QUIC_BUG_IF(framer_->transport_version() != QUIC_VERSION_99)
668 << "Must be version 99 to serialize path challenge connectivity probe, "
669 "is version "
670 << framer_->transport_version();
671 QuicPacketHeader header;
672 // FillPacketHeader increments packet_number_.
673 FillPacketHeader(&header);
674
dschinazi66dea072019-04-09 11:41:06 -0700675 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500676 size_t length = framer_->BuildPaddedPathChallengePacket(
677 header, buffer.get(), max_plaintext_size_, payload, random_,
678 packet_.encryption_level);
679 DCHECK(length);
680
681 const size_t encrypted_length = framer_->EncryptInPlace(
682 packet_.encryption_level, packet_.packet_number,
683 GetStartOfEncryptedData(framer_->transport_version(), header), length,
dschinazi66dea072019-04-09 11:41:06 -0700684 kMaxOutgoingPacketSize, buffer.get());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500685 DCHECK(encrypted_length);
686
687 OwningSerializedPacketPointer serialize_packet(new SerializedPacket(
688 header.packet_number, header.packet_number_length, buffer.release(),
689 encrypted_length, /*has_ack=*/false, /*has_stop_waiting=*/false));
690
691 serialize_packet->encryption_level = packet_.encryption_level;
692 serialize_packet->transmission_type = NOT_RETRANSMISSION;
693
694 return serialize_packet;
695}
696
697OwningSerializedPacketPointer
698QuicPacketCreator::SerializePathResponseConnectivityProbingPacket(
699 const QuicDeque<QuicPathFrameBuffer>& payloads,
700 const bool is_padded) {
701 QUIC_BUG_IF(framer_->transport_version() != QUIC_VERSION_99)
702 << "Must be version 99 to serialize path response connectivity probe, is "
703 "version "
704 << framer_->transport_version();
705 QuicPacketHeader header;
706 // FillPacketHeader increments packet_number_.
707 FillPacketHeader(&header);
708
dschinazi66dea072019-04-09 11:41:06 -0700709 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500710 size_t length = framer_->BuildPathResponsePacket(
711 header, buffer.get(), max_plaintext_size_, payloads, is_padded,
712 packet_.encryption_level);
713 DCHECK(length);
714
715 const size_t encrypted_length = framer_->EncryptInPlace(
716 packet_.encryption_level, packet_.packet_number,
717 GetStartOfEncryptedData(framer_->transport_version(), header), length,
dschinazi66dea072019-04-09 11:41:06 -0700718 kMaxOutgoingPacketSize, buffer.get());
QUICHE teama6ef0a62019-03-07 20:34:33 -0500719 DCHECK(encrypted_length);
720
721 OwningSerializedPacketPointer serialize_packet(new SerializedPacket(
722 header.packet_number, header.packet_number_length, buffer.release(),
723 encrypted_length, /*has_ack=*/false, /*has_stop_waiting=*/false));
724
725 serialize_packet->encryption_level = packet_.encryption_level;
726 serialize_packet->transmission_type = NOT_RETRANSMISSION;
727
728 return serialize_packet;
729}
730
731// TODO(b/74062209): Make this a public method of framer?
732SerializedPacket QuicPacketCreator::NoPacket() {
733 return SerializedPacket(QuicPacketNumber(), PACKET_1BYTE_PACKET_NUMBER,
734 nullptr, 0, false, false);
735}
736
QUICHE team2252b702019-05-14 23:55:14 -0400737QuicConnectionId QuicPacketCreator::GetDestinationConnectionId() const {
738 if (!GetQuicRestartFlag(quic_do_not_override_connection_id)) {
dschinazi7b9278c2019-05-20 07:36:21 -0700739 return server_connection_id_;
QUICHE team2252b702019-05-14 23:55:14 -0400740 }
741 QUIC_RESTART_FLAG_COUNT_N(quic_do_not_override_connection_id, 1, 5);
742 if (framer_->perspective() == Perspective::IS_SERVER) {
743 return EmptyQuicConnectionId();
744 }
dschinazi7b9278c2019-05-20 07:36:21 -0700745 return server_connection_id_;
QUICHE team2252b702019-05-14 23:55:14 -0400746}
747
748QuicConnectionId QuicPacketCreator::GetSourceConnectionId() const {
749 if (!GetQuicRestartFlag(quic_do_not_override_connection_id)) {
dschinazi7b9278c2019-05-20 07:36:21 -0700750 return server_connection_id_;
QUICHE team2252b702019-05-14 23:55:14 -0400751 }
752 QUIC_RESTART_FLAG_COUNT_N(quic_do_not_override_connection_id, 6, 6);
753 if (framer_->perspective() == Perspective::IS_CLIENT) {
754 return EmptyQuicConnectionId();
755 }
dschinazi7b9278c2019-05-20 07:36:21 -0700756 return server_connection_id_;
QUICHE team2252b702019-05-14 23:55:14 -0400757}
758
QUICHE teama6ef0a62019-03-07 20:34:33 -0500759QuicConnectionIdIncluded QuicPacketCreator::GetDestinationConnectionIdIncluded()
760 const {
QUICHE team2252b702019-05-14 23:55:14 -0400761 if (framer_->transport_version() > QUIC_VERSION_43 ||
762 GetQuicRestartFlag(quic_do_not_override_connection_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500763 // Packets sent by client always include destination connection ID, and
764 // those sent by the server do not include destination connection ID.
765 return framer_->perspective() == Perspective::IS_CLIENT
766 ? CONNECTION_ID_PRESENT
767 : CONNECTION_ID_ABSENT;
768 }
dschinazi7b9278c2019-05-20 07:36:21 -0700769 return server_connection_id_included_;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500770}
771
772QuicConnectionIdIncluded QuicPacketCreator::GetSourceConnectionIdIncluded()
773 const {
774 // Long header packets sent by server include source connection ID.
775 if (HasIetfLongHeader() && framer_->perspective() == Perspective::IS_SERVER) {
776 return CONNECTION_ID_PRESENT;
777 }
QUICHE team2252b702019-05-14 23:55:14 -0400778 if (GetQuicRestartFlag(quic_do_not_override_connection_id) &&
779 framer_->perspective() == Perspective::IS_SERVER) {
780 QUIC_RESTART_FLAG_COUNT_N(quic_do_not_override_connection_id, 2, 5);
dschinazi7b9278c2019-05-20 07:36:21 -0700781 return server_connection_id_included_;
QUICHE team2252b702019-05-14 23:55:14 -0400782 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500783 return CONNECTION_ID_ABSENT;
784}
785
786QuicConnectionIdLength QuicPacketCreator::GetDestinationConnectionIdLength()
787 const {
dschinazi7b9278c2019-05-20 07:36:21 -0700788 DCHECK(QuicUtils::IsConnectionIdValidForVersion(server_connection_id_,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500789 transport_version()));
790 return GetDestinationConnectionIdIncluded() == CONNECTION_ID_PRESENT
QUICHE team2252b702019-05-14 23:55:14 -0400791 ? static_cast<QuicConnectionIdLength>(
792 GetDestinationConnectionId().length())
QUICHE teama6ef0a62019-03-07 20:34:33 -0500793 : PACKET_0BYTE_CONNECTION_ID;
794}
795
796QuicConnectionIdLength QuicPacketCreator::GetSourceConnectionIdLength() const {
dschinazi7b9278c2019-05-20 07:36:21 -0700797 DCHECK(QuicUtils::IsConnectionIdValidForVersion(server_connection_id_,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500798 transport_version()));
799 return GetSourceConnectionIdIncluded() == CONNECTION_ID_PRESENT
QUICHE team2252b702019-05-14 23:55:14 -0400800 ? static_cast<QuicConnectionIdLength>(
801 GetSourceConnectionId().length())
QUICHE teama6ef0a62019-03-07 20:34:33 -0500802 : PACKET_0BYTE_CONNECTION_ID;
803}
804
805QuicPacketNumberLength QuicPacketCreator::GetPacketNumberLength() const {
806 if (HasIetfLongHeader() && framer_->transport_version() != QUIC_VERSION_99) {
807 return PACKET_4BYTE_PACKET_NUMBER;
808 }
809 return packet_.packet_number_length;
810}
811
nharper55fa6132019-05-07 19:37:21 -0700812size_t QuicPacketCreator::PacketHeaderSize() const {
813 return GetPacketHeaderSize(
814 framer_->transport_version(), GetDestinationConnectionIdLength(),
815 GetSourceConnectionIdLength(), IncludeVersionInHeader(),
816 IncludeNonceInPublicHeader(), GetPacketNumberLength(),
817 GetRetryTokenLengthLength(), GetRetryToken().length(), GetLengthLength());
818}
819
QUICHE teama6ef0a62019-03-07 20:34:33 -0500820QuicVariableLengthIntegerLength QuicPacketCreator::GetRetryTokenLengthLength()
821 const {
822 if (QuicVersionHasLongHeaderLengths(framer_->transport_version()) &&
823 HasIetfLongHeader() &&
824 EncryptionlevelToLongHeaderType(packet_.encryption_level) == INITIAL) {
825 return QuicDataWriter::GetVarInt62Len(GetRetryToken().length());
826 }
827 return VARIABLE_LENGTH_INTEGER_LENGTH_0;
828}
829
830QuicStringPiece QuicPacketCreator::GetRetryToken() const {
dschinazi0db87092019-05-20 07:59:15 -0700831 if (QuicVersionHasLongHeaderLengths(framer_->transport_version()) &&
832 HasIetfLongHeader() &&
833 EncryptionlevelToLongHeaderType(packet_.encryption_level) == INITIAL) {
834 return retry_token_;
835 }
836 return QuicStringPiece();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500837}
838
839void QuicPacketCreator::SetRetryToken(QuicStringPiece retry_token) {
vasilvvc48c8712019-03-11 13:38:16 -0700840 retry_token_ = std::string(retry_token);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500841}
842
843QuicVariableLengthIntegerLength QuicPacketCreator::GetLengthLength() const {
844 if (QuicVersionHasLongHeaderLengths(framer_->transport_version()) &&
845 HasIetfLongHeader()) {
846 QuicLongHeaderType long_header_type =
847 EncryptionlevelToLongHeaderType(packet_.encryption_level);
848 if (long_header_type == INITIAL || long_header_type == ZERO_RTT_PROTECTED ||
849 long_header_type == HANDSHAKE) {
850 return VARIABLE_LENGTH_INTEGER_LENGTH_2;
851 }
852 }
853 return VARIABLE_LENGTH_INTEGER_LENGTH_0;
854}
855
856void QuicPacketCreator::FillPacketHeader(QuicPacketHeader* header) {
QUICHE team2252b702019-05-14 23:55:14 -0400857 header->destination_connection_id = GetDestinationConnectionId();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500858 header->destination_connection_id_included =
859 GetDestinationConnectionIdIncluded();
QUICHE team2252b702019-05-14 23:55:14 -0400860 header->source_connection_id = GetSourceConnectionId();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500861 header->source_connection_id_included = GetSourceConnectionIdIncluded();
862 header->reset_flag = false;
863 header->version_flag = IncludeVersionInHeader();
864 if (IncludeNonceInPublicHeader()) {
865 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective());
866 header->nonce = &diversification_nonce_;
867 } else {
868 header->nonce = nullptr;
869 }
fayang354c9422019-05-21 08:10:35 -0700870 packet_.packet_number = NextSendingPacketNumber();
QUICHE teama6ef0a62019-03-07 20:34:33 -0500871 header->packet_number = packet_.packet_number;
872 header->packet_number_length = GetPacketNumberLength();
873 header->retry_token_length_length = GetRetryTokenLengthLength();
874 header->retry_token = GetRetryToken();
875 header->length_length = GetLengthLength();
876 header->remaining_packet_length = 0;
877 if (!HasIetfLongHeader()) {
878 return;
879 }
880 header->long_packet_type =
881 EncryptionlevelToLongHeaderType(packet_.encryption_level);
882}
883
884bool QuicPacketCreator::AddFrame(const QuicFrame& frame,
885 bool save_retransmittable_frames,
886 TransmissionType transmission_type) {
887 QUIC_DVLOG(1) << ENDPOINT << "Adding frame with transmission type "
888 << transmission_type << ": " << frame;
889 if (frame.type == STREAM_FRAME &&
nharper46833c32019-05-15 21:33:05 -0700890 !QuicUtils::IsCryptoStreamId(framer_->transport_version(),
891 frame.stream_frame.stream_id) &&
fayang49523232019-05-03 06:28:22 -0700892 (packet_.encryption_level == ENCRYPTION_INITIAL ||
893 packet_.encryption_level == ENCRYPTION_HANDSHAKE)) {
894 const std::string error_details = QuicStrCat(
895 "Cannot send stream data with level: ",
896 QuicUtils::EncryptionLevelToString(packet_.encryption_level));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500897 QUIC_BUG << error_details;
898 delegate_->OnUnrecoverableError(
fkastenholz85f18902019-05-28 12:47:00 -0700899 QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, error_details);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500900 return false;
901 }
902 size_t frame_len = framer_->GetSerializedFrameLength(
903 frame, BytesFree(), queued_frames_.empty(),
904 /* last_frame_in_packet= */ true, GetPacketNumberLength());
905 if (frame_len == 0) {
906 // Current open packet is full.
907 Flush();
908 return false;
909 }
910 DCHECK_LT(0u, packet_size_);
911
912 packet_size_ += ExpansionOnNewFrame() + frame_len;
913
914 if (save_retransmittable_frames &&
915 QuicUtils::IsRetransmittableFrame(frame.type)) {
916 packet_.retransmittable_frames.push_back(frame);
917 queued_frames_.push_back(frame);
918 if (QuicUtils::IsHandshakeFrame(frame, framer_->transport_version())) {
919 packet_.has_crypto_handshake = IS_HANDSHAKE;
920 }
921 } else {
922 queued_frames_.push_back(frame);
923 }
924
925 if (frame.type == ACK_FRAME) {
926 packet_.has_ack = true;
927 packet_.largest_acked = LargestAcked(*frame.ack_frame);
928 }
929 if (frame.type == STOP_WAITING_FRAME) {
930 packet_.has_stop_waiting = true;
931 }
932 if (debug_delegate_ != nullptr) {
933 debug_delegate_->OnFrameAddedToPacket(frame);
934 }
935
936 // Packet transmission type is determined by the last added retransmittable
937 // frame.
wub98669f52019-04-18 10:49:18 -0700938 if (can_set_transmission_type() &&
QUICHE teama6ef0a62019-03-07 20:34:33 -0500939 QuicUtils::IsRetransmittableFrame(frame.type)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500940 packet_.transmission_type = transmission_type;
941 }
942 return true;
943}
944
945void QuicPacketCreator::MaybeAddPadding() {
946 // The current packet should have no padding bytes because padding is only
947 // added when this method is called just before the packet is serialized.
948 DCHECK_EQ(0, packet_.num_padding_bytes);
949 if (BytesFree() == 0) {
950 // Don't pad full packets.
951 return;
952 }
953
954 if (packet_.transmission_type == PROBING_RETRANSMISSION) {
955 needs_full_padding_ = true;
956 }
957
nharper55fa6132019-05-07 19:37:21 -0700958 // Header protection requires a minimum plaintext packet size.
959 size_t extra_padding_bytes = 0;
960 if (framer_->version().HasHeaderProtection()) {
961 size_t frame_bytes = PacketSize() - PacketHeaderSize();
962
QUICHE team2252b702019-05-14 23:55:14 -0400963 if (frame_bytes + pending_padding_bytes_ <
964 MinPlaintextPacketSize(framer_->version()) &&
nharper55fa6132019-05-07 19:37:21 -0700965 !needs_full_padding_) {
QUICHE team2252b702019-05-14 23:55:14 -0400966 extra_padding_bytes =
967 MinPlaintextPacketSize(framer_->version()) - frame_bytes;
nharper55fa6132019-05-07 19:37:21 -0700968 }
969 }
970
971 if (!needs_full_padding_ && pending_padding_bytes_ == 0 &&
972 extra_padding_bytes == 0) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500973 // Do not need padding.
974 return;
975 }
976
nharper55fa6132019-05-07 19:37:21 -0700977 int padding_bytes = -1;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500978 if (needs_full_padding_) {
979 // Full padding does not consume pending padding bytes.
980 packet_.num_padding_bytes = -1;
981 } else {
982 packet_.num_padding_bytes =
983 std::min<int16_t>(pending_padding_bytes_, BytesFree());
984 pending_padding_bytes_ -= packet_.num_padding_bytes;
nharper55fa6132019-05-07 19:37:21 -0700985 padding_bytes =
986 std::max<int16_t>(packet_.num_padding_bytes, extra_padding_bytes);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500987 }
988
nharper55fa6132019-05-07 19:37:21 -0700989 bool success = AddFrame(QuicFrame(QuicPaddingFrame(padding_bytes)), false,
990 packet_.transmission_type);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500991 DCHECK(success);
992}
993
994bool QuicPacketCreator::IncludeNonceInPublicHeader() const {
995 return have_diversification_nonce_ &&
996 packet_.encryption_level == ENCRYPTION_ZERO_RTT;
997}
998
999bool QuicPacketCreator::IncludeVersionInHeader() const {
1000 if (framer_->transport_version() > QUIC_VERSION_43) {
1001 return packet_.encryption_level < ENCRYPTION_FORWARD_SECURE;
1002 }
1003 return send_version_in_packet_;
1004}
1005
1006void QuicPacketCreator::AddPendingPadding(QuicByteCount size) {
1007 pending_padding_bytes_ += size;
1008}
1009
ianswette28f0222019-04-04 13:31:22 -07001010bool QuicPacketCreator::StreamFrameIsClientHello(
QUICHE teama6ef0a62019-03-07 20:34:33 -05001011 const QuicStreamFrame& frame) const {
1012 if (framer_->perspective() == Perspective::IS_SERVER ||
nharper46833c32019-05-15 21:33:05 -07001013 !QuicUtils::IsCryptoStreamId(framer_->transport_version(),
1014 frame.stream_id)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001015 return false;
1016 }
ianswette28f0222019-04-04 13:31:22 -07001017 // The ClientHello is always sent with INITIAL encryption.
1018 return packet_.encryption_level == ENCRYPTION_INITIAL;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001019}
1020
dschinazi7b9278c2019-05-20 07:36:21 -07001021void QuicPacketCreator::SetServerConnectionIdIncluded(
1022 QuicConnectionIdIncluded server_connection_id_included) {
1023 DCHECK(server_connection_id_included == CONNECTION_ID_PRESENT ||
1024 server_connection_id_included == CONNECTION_ID_ABSENT);
QUICHE teama6ef0a62019-03-07 20:34:33 -05001025 DCHECK(framer_->perspective() == Perspective::IS_SERVER ||
dschinazi7b9278c2019-05-20 07:36:21 -07001026 server_connection_id_included != CONNECTION_ID_ABSENT);
1027 server_connection_id_included_ = server_connection_id_included;
QUICHE teama6ef0a62019-03-07 20:34:33 -05001028}
1029
dschinazi7b9278c2019-05-20 07:36:21 -07001030void QuicPacketCreator::SetServerConnectionId(
1031 QuicConnectionId server_connection_id) {
1032 server_connection_id_ = server_connection_id;
QUICHE teamc65d1d12019-03-19 20:58:04 -07001033}
1034
QUICHE teama6ef0a62019-03-07 20:34:33 -05001035void QuicPacketCreator::SetTransmissionType(TransmissionType type) {
1036 DCHECK(can_set_transmission_type_);
1037
wub98669f52019-04-18 10:49:18 -07001038 if (!can_set_transmission_type()) {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001039 QUIC_DVLOG_IF(1, type != packet_.transmission_type)
1040 << ENDPOINT << "Setting Transmission type to "
1041 << QuicUtils::TransmissionTypeToString(type);
1042
1043 packet_.transmission_type = type;
1044 }
1045}
1046
ianswettb239f862019-04-05 09:15:06 -07001047QuicPacketLength QuicPacketCreator::GetCurrentLargestMessagePayload() const {
QUICHE teama6ef0a62019-03-07 20:34:33 -05001048 if (framer_->transport_version() <= QUIC_VERSION_44) {
1049 return 0;
1050 }
1051 const size_t packet_header_size = GetPacketHeaderSize(
1052 framer_->transport_version(), GetDestinationConnectionIdLength(),
1053 GetSourceConnectionIdLength(), IncludeVersionInHeader(),
1054 IncludeNonceInPublicHeader(), GetPacketNumberLength(),
ianswettb239f862019-04-05 09:15:06 -07001055 // No Retry token on packets containing application data.
1056 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, GetLengthLength());
QUICHE teama6ef0a62019-03-07 20:34:33 -05001057 // This is the largest possible message payload when the length field is
1058 // omitted.
1059 return max_plaintext_size_ -
1060 std::min(max_plaintext_size_, packet_header_size + kQuicFrameTypeSize);
1061}
1062
ianswettb239f862019-04-05 09:15:06 -07001063QuicPacketLength QuicPacketCreator::GetGuaranteedLargestMessagePayload() const {
1064 if (framer_->transport_version() <= QUIC_VERSION_44) {
1065 return 0;
1066 }
1067 // QUIC Crypto server packets may include a diversification nonce.
1068 const bool may_include_nonce =
1069 framer_->version().handshake_protocol == PROTOCOL_QUIC_CRYPTO &&
1070 framer_->perspective() == Perspective::IS_SERVER;
1071 // IETF QUIC long headers include a length on client 0RTT packets.
1072 QuicVariableLengthIntegerLength length_length =
1073 framer_->perspective() == Perspective::IS_CLIENT
1074 ? VARIABLE_LENGTH_INTEGER_LENGTH_2
1075 : VARIABLE_LENGTH_INTEGER_LENGTH_0;
1076 const size_t packet_header_size = GetPacketHeaderSize(
1077 framer_->transport_version(), GetDestinationConnectionIdLength(),
1078 // Assume CID lengths don't change, but version may be present.
1079 GetSourceConnectionIdLength(), kIncludeVersion, may_include_nonce,
1080 PACKET_4BYTE_PACKET_NUMBER,
1081 // No Retry token on packets containing application data.
1082 VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, length_length);
1083 // This is the largest possible message payload when the length field is
1084 // omitted.
1085 const QuicPacketLength largest_payload =
1086 max_plaintext_size_ -
1087 std::min(max_plaintext_size_, packet_header_size + kQuicFrameTypeSize);
1088 // This must always be less than or equal to GetCurrentLargestMessagePayload.
1089 DCHECK_LE(largest_payload, GetCurrentLargestMessagePayload());
1090 return largest_payload;
1091}
1092
QUICHE teama6ef0a62019-03-07 20:34:33 -05001093bool QuicPacketCreator::HasIetfLongHeader() const {
1094 return framer_->transport_version() > QUIC_VERSION_43 &&
1095 packet_.encryption_level < ENCRYPTION_FORWARD_SECURE;
1096}
1097
QUICHE team2252b702019-05-14 23:55:14 -04001098size_t QuicPacketCreator::MinPlaintextPacketSize(
1099 const ParsedQuicVersion& version) {
1100 if (!version.HasHeaderProtection()) {
nharper55fa6132019-05-07 19:37:21 -07001101 return 0;
1102 }
1103 // Header protection samples 16 bytes of ciphertext starting 4 bytes after the
1104 // packet number. In IETF QUIC, all AEAD algorithms have a 16-byte auth tag
1105 // (i.e. the ciphertext is 16 bytes larger than the plaintext). Since packet
1106 // numbers could be as small as 1 byte, but the sample starts 4 bytes after
1107 // the packet number, at least 3 bytes of plaintext are needed to make sure
1108 // that there is enough ciphertext to sample.
1109 //
1110 // Google QUIC crypto uses different AEAD algorithms - in particular the auth
1111 // tags are only 12 bytes instead of 16 bytes. Since the auth tag is 4 bytes
1112 // shorter, 4 more bytes of plaintext are needed to guarantee there is enough
1113 // ciphertext to sample.
1114 //
1115 // This method could check for PROTOCOL_TLS1_3 vs PROTOCOL_QUIC_CRYPTO and
1116 // return 3 when TLS 1.3 is in use (the use of IETF vs Google QUIC crypters is
1117 // determined based on the handshake protocol used). However, even when TLS
1118 // 1.3 is used, unittests still use NullEncrypter/NullDecrypter (and other
1119 // test crypters) which also only use 12 byte tags.
1120 //
1121 // TODO(nharper): Set this based on the handshake protocol in use.
1122 return 7;
1123}
1124
fayang354c9422019-05-21 08:10:35 -07001125QuicPacketNumber QuicPacketCreator::NextSendingPacketNumber() const {
1126 if (!packet_number().IsInitialized()) {
1127 return framer_->first_sending_packet_number();
1128 }
1129 return packet_number() + 1;
1130}
1131
QUICHE teama6ef0a62019-03-07 20:34:33 -05001132#undef ENDPOINT // undef for jumbo builds
1133} // namespace quic