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
3 // found in the LICENSE file.
4
5 #include "quiche/quic/core/quic_packet_creator.h"
6
7 #include <algorithm>
8 #include <cstddef>
9 #include <cstdint>
10 #include <limits>
11 #include <optional>
12 #include <string>
13 #include <utility>
14
15 #include "absl/base/macros.h"
16 #include "absl/base/optimization.h"
17 #include "absl/strings/str_cat.h"
18 #include "absl/strings/str_join.h"
19 #include "absl/strings/string_view.h"
20 #include "quiche/quic/core/crypto/crypto_protocol.h"
21 #include "quiche/quic/core/frames/quic_frame.h"
22 #include "quiche/quic/core/frames/quic_padding_frame.h"
23 #include "quiche/quic/core/frames/quic_path_challenge_frame.h"
24 #include "quiche/quic/core/frames/quic_stream_frame.h"
25 #include "quiche/quic/core/quic_chaos_protector.h"
26 #include "quiche/quic/core/quic_connection_id.h"
27 #include "quiche/quic/core/quic_constants.h"
28 #include "quiche/quic/core/quic_data_writer.h"
29 #include "quiche/quic/core/quic_error_codes.h"
30 #include "quiche/quic/core/quic_types.h"
31 #include "quiche/quic/core/quic_utils.h"
32 #include "quiche/quic/core/quic_versions.h"
33 #include "quiche/quic/platform/api/quic_bug_tracker.h"
34 #include "quiche/quic/platform/api/quic_exported_stats.h"
35 #include "quiche/quic/platform/api/quic_flag_utils.h"
36 #include "quiche/quic/platform/api/quic_flags.h"
37 #include "quiche/quic/platform/api/quic_logging.h"
38 #include "quiche/quic/platform/api/quic_server_stats.h"
39 #include "quiche/common/print_elements.h"
40
41 namespace quic {
42 namespace {
43
EncryptionlevelToLongHeaderType(EncryptionLevel level)44 QuicLongHeaderType EncryptionlevelToLongHeaderType(EncryptionLevel level) {
45 switch (level) {
46 case ENCRYPTION_INITIAL:
47 return INITIAL;
48 case ENCRYPTION_HANDSHAKE:
49 return HANDSHAKE;
50 case ENCRYPTION_ZERO_RTT:
51 return ZERO_RTT_PROTECTED;
52 case ENCRYPTION_FORWARD_SECURE:
53 QUIC_BUG(quic_bug_12398_1)
54 << "Try to derive long header type for packet with encryption level: "
55 << level;
56 return INVALID_PACKET_TYPE;
57 default:
58 QUIC_BUG(quic_bug_10752_1) << level;
59 return INVALID_PACKET_TYPE;
60 }
61 }
62
LogCoalesceStreamFrameStatus(bool success)63 void LogCoalesceStreamFrameStatus(bool success) {
64 QUIC_HISTOGRAM_BOOL("QuicSession.CoalesceStreamFrameStatus", success,
65 "Success rate of coalesing stream frames attempt.");
66 }
67
68 // ScopedPacketContextSwitcher saves |packet|'s states and change states
69 // during its construction. When the switcher goes out of scope, it restores
70 // saved states.
71 class ScopedPacketContextSwitcher {
72 public:
ScopedPacketContextSwitcher(QuicPacketNumber packet_number,QuicPacketNumberLength packet_number_length,EncryptionLevel encryption_level,SerializedPacket * packet)73 ScopedPacketContextSwitcher(QuicPacketNumber packet_number,
74 QuicPacketNumberLength packet_number_length,
75 EncryptionLevel encryption_level,
76 SerializedPacket* packet)
77
78 : saved_packet_number_(packet->packet_number),
79 saved_packet_number_length_(packet->packet_number_length),
80 saved_encryption_level_(packet->encryption_level),
81 packet_(packet) {
82 packet_->packet_number = packet_number,
83 packet_->packet_number_length = packet_number_length;
84 packet_->encryption_level = encryption_level;
85 }
86
~ScopedPacketContextSwitcher()87 ~ScopedPacketContextSwitcher() {
88 packet_->packet_number = saved_packet_number_;
89 packet_->packet_number_length = saved_packet_number_length_;
90 packet_->encryption_level = saved_encryption_level_;
91 }
92
93 private:
94 const QuicPacketNumber saved_packet_number_;
95 const QuicPacketNumberLength saved_packet_number_length_;
96 const EncryptionLevel saved_encryption_level_;
97 SerializedPacket* packet_;
98 };
99
100 } // namespace
101
102 #define ENDPOINT \
103 (framer_->perspective() == Perspective::IS_SERVER ? "Server: " : "Client: ")
104
QuicPacketCreator(QuicConnectionId server_connection_id,QuicFramer * framer,DelegateInterface * delegate)105 QuicPacketCreator::QuicPacketCreator(QuicConnectionId server_connection_id,
106 QuicFramer* framer,
107 DelegateInterface* delegate)
108 : QuicPacketCreator(server_connection_id, framer, QuicRandom::GetInstance(),
109 delegate) {}
110
QuicPacketCreator(QuicConnectionId server_connection_id,QuicFramer * framer,QuicRandom * random,DelegateInterface * delegate)111 QuicPacketCreator::QuicPacketCreator(QuicConnectionId server_connection_id,
112 QuicFramer* framer, QuicRandom* random,
113 DelegateInterface* delegate)
114 : delegate_(delegate),
115 debug_delegate_(nullptr),
116 framer_(framer),
117 random_(random),
118 have_diversification_nonce_(false),
119 max_packet_length_(0),
120 server_connection_id_included_(CONNECTION_ID_PRESENT),
121 packet_size_(0),
122 server_connection_id_(server_connection_id),
123 client_connection_id_(EmptyQuicConnectionId()),
124 packet_(QuicPacketNumber(), PACKET_1BYTE_PACKET_NUMBER, nullptr, 0, false,
125 false),
126 pending_padding_bytes_(0),
127 needs_full_padding_(false),
128 next_transmission_type_(NOT_RETRANSMISSION),
129 flusher_attached_(false),
130 fully_pad_crypto_handshake_packets_(true),
131 latched_hard_max_packet_length_(0),
132 max_datagram_frame_size_(0) {
133 SetMaxPacketLength(kDefaultMaxPacketSize);
134 if (!framer_->version().UsesTls()) {
135 // QUIC+TLS negotiates the maximum datagram frame size via the
136 // IETF QUIC max_datagram_frame_size transport parameter.
137 // QUIC_CRYPTO however does not negotiate this so we set its value here.
138 SetMaxDatagramFrameSize(kMaxAcceptedDatagramFrameSize);
139 }
140 }
141
~QuicPacketCreator()142 QuicPacketCreator::~QuicPacketCreator() {
143 DeleteFrames(&packet_.retransmittable_frames);
144 }
145
SetEncrypter(EncryptionLevel level,std::unique_ptr<QuicEncrypter> encrypter)146 void QuicPacketCreator::SetEncrypter(EncryptionLevel level,
147 std::unique_ptr<QuicEncrypter> encrypter) {
148 framer_->SetEncrypter(level, std::move(encrypter));
149 max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_);
150 }
151
CanSetMaxPacketLength() const152 bool QuicPacketCreator::CanSetMaxPacketLength() const {
153 // |max_packet_length_| should not be changed mid-packet.
154 return queued_frames_.empty();
155 }
156
SetMaxPacketLength(QuicByteCount length)157 void QuicPacketCreator::SetMaxPacketLength(QuicByteCount length) {
158 QUICHE_DCHECK(CanSetMaxPacketLength()) << ENDPOINT;
159
160 // Avoid recomputing |max_plaintext_size_| if the length does not actually
161 // change.
162 if (length == max_packet_length_) {
163 return;
164 }
165 QUIC_DVLOG(1) << ENDPOINT << "Updating packet creator max packet length from "
166 << max_packet_length_ << " to " << length;
167
168 max_packet_length_ = length;
169 max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_);
170 QUIC_BUG_IF(
171 quic_bug_12398_2,
172 max_plaintext_size_ - PacketHeaderSize() <
173 MinPlaintextPacketSize(framer_->version(), GetPacketNumberLength()))
174 << ENDPOINT << "Attempted to set max packet length too small";
175 }
176
SetMaxDatagramFrameSize(QuicByteCount max_datagram_frame_size)177 void QuicPacketCreator::SetMaxDatagramFrameSize(
178 QuicByteCount max_datagram_frame_size) {
179 constexpr QuicByteCount upper_bound =
180 std::min<QuicByteCount>(std::numeric_limits<QuicPacketLength>::max(),
181 std::numeric_limits<size_t>::max());
182 if (max_datagram_frame_size > upper_bound) {
183 // A value of |max_datagram_frame_size| that is equal or greater than
184 // 2^16-1 is effectively infinite because QUIC packets cannot be that large.
185 // We therefore clamp the value here to allow us to safely cast
186 // |max_datagram_frame_size_| to QuicPacketLength or size_t.
187 max_datagram_frame_size = upper_bound;
188 }
189 max_datagram_frame_size_ = max_datagram_frame_size;
190 }
191
SetSoftMaxPacketLength(QuicByteCount length)192 void QuicPacketCreator::SetSoftMaxPacketLength(QuicByteCount length) {
193 QUICHE_DCHECK(CanSetMaxPacketLength()) << ENDPOINT;
194 if (length > max_packet_length_) {
195 QUIC_BUG(quic_bug_10752_2)
196 << ENDPOINT
197 << "Try to increase max_packet_length_ in "
198 "SetSoftMaxPacketLength, use SetMaxPacketLength instead.";
199 return;
200 }
201 if (framer_->GetMaxPlaintextSize(length) <
202 PacketHeaderSize() +
203 MinPlaintextPacketSize(framer_->version(), GetPacketNumberLength())) {
204 // Please note: this would not guarantee to fit next packet if the size of
205 // packet header increases (e.g., encryption level changes).
206 QUIC_DLOG(INFO) << ENDPOINT << length
207 << " is too small to fit packet header";
208 RemoveSoftMaxPacketLength();
209 return;
210 }
211 QUIC_DVLOG(1) << ENDPOINT << "Setting soft max packet length to: " << length;
212 latched_hard_max_packet_length_ = max_packet_length_;
213 max_packet_length_ = length;
214 max_plaintext_size_ = framer_->GetMaxPlaintextSize(length);
215 }
216
SetDiversificationNonce(const DiversificationNonce & nonce)217 void QuicPacketCreator::SetDiversificationNonce(
218 const DiversificationNonce& nonce) {
219 QUICHE_DCHECK(!have_diversification_nonce_) << ENDPOINT;
220 have_diversification_nonce_ = true;
221 diversification_nonce_ = nonce;
222 }
223
UpdatePacketNumberLength(QuicPacketNumber least_packet_awaited_by_peer,QuicPacketCount max_packets_in_flight)224 void QuicPacketCreator::UpdatePacketNumberLength(
225 QuicPacketNumber least_packet_awaited_by_peer,
226 QuicPacketCount max_packets_in_flight) {
227 if (!queued_frames_.empty()) {
228 // Don't change creator state if there are frames queued.
229 QUIC_BUG(quic_bug_10752_3)
230 << ENDPOINT << "Called UpdatePacketNumberLength with "
231 << queued_frames_.size()
232 << " queued_frames. First frame type:" << queued_frames_.front().type
233 << " last frame type:" << queued_frames_.back().type;
234 return;
235 }
236
237 const QuicPacketNumber next_packet_number = NextSendingPacketNumber();
238 QUICHE_DCHECK_LE(least_packet_awaited_by_peer, next_packet_number)
239 << ENDPOINT;
240 const uint64_t current_delta =
241 next_packet_number - least_packet_awaited_by_peer;
242 const uint64_t delta = std::max(current_delta, max_packets_in_flight);
243 const QuicPacketNumberLength packet_number_length =
244 QuicFramer::GetMinPacketNumberLength(QuicPacketNumber(delta * 4));
245 if (packet_.packet_number_length == packet_number_length) {
246 return;
247 }
248 QUIC_DVLOG(1) << ENDPOINT << "Updating packet number length from "
249 << static_cast<int>(packet_.packet_number_length) << " to "
250 << static_cast<int>(packet_number_length)
251 << ", least_packet_awaited_by_peer: "
252 << least_packet_awaited_by_peer
253 << " max_packets_in_flight: " << max_packets_in_flight
254 << " next_packet_number: " << next_packet_number;
255 packet_.packet_number_length = packet_number_length;
256 }
257
SkipNPacketNumbers(QuicPacketCount count,QuicPacketNumber least_packet_awaited_by_peer,QuicPacketCount max_packets_in_flight)258 void QuicPacketCreator::SkipNPacketNumbers(
259 QuicPacketCount count, QuicPacketNumber least_packet_awaited_by_peer,
260 QuicPacketCount max_packets_in_flight) {
261 if (!queued_frames_.empty()) {
262 // Don't change creator state if there are frames queued.
263 QUIC_BUG(quic_bug_10752_4)
264 << ENDPOINT << "Called SkipNPacketNumbers with "
265 << queued_frames_.size()
266 << " queued_frames. First frame type:" << queued_frames_.front().type
267 << " last frame type:" << queued_frames_.back().type;
268 return;
269 }
270 if (packet_.packet_number > packet_.packet_number + count) {
271 // Skipping count packet numbers causes packet number wrapping around,
272 // reject it.
273 QUIC_LOG(WARNING) << ENDPOINT << "Skipping " << count
274 << " packet numbers causes packet number wrapping "
275 "around, least_packet_awaited_by_peer: "
276 << least_packet_awaited_by_peer
277 << " packet_number:" << packet_.packet_number;
278 return;
279 }
280 packet_.packet_number += count;
281 // Packet number changes, update packet number length if necessary.
282 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight);
283 }
284
ConsumeCryptoDataToFillCurrentPacket(EncryptionLevel level,size_t write_length,QuicStreamOffset offset,bool needs_full_padding,TransmissionType transmission_type,QuicFrame * frame)285 bool QuicPacketCreator::ConsumeCryptoDataToFillCurrentPacket(
286 EncryptionLevel level, size_t write_length, QuicStreamOffset offset,
287 bool needs_full_padding, TransmissionType transmission_type,
288 QuicFrame* frame) {
289 QUIC_DVLOG(2) << ENDPOINT << "ConsumeCryptoDataToFillCurrentPacket " << level
290 << " write_length " << write_length << " offset " << offset
291 << (needs_full_padding ? " needs_full_padding" : "") << " "
292 << transmission_type;
293 if (!CreateCryptoFrame(level, write_length, offset, frame)) {
294 return false;
295 }
296 // When crypto data was sent in stream frames, ConsumeData is called with
297 // |needs_full_padding = true|. Keep the same behavior here when sending
298 // crypto frames.
299 //
300 // TODO(nharper): Check what the IETF drafts say about padding out initial
301 // messages and change this as appropriate.
302 if (needs_full_padding) {
303 needs_full_padding_ = true;
304 }
305 return AddFrame(*frame, transmission_type);
306 }
307
ConsumeDataToFillCurrentPacket(QuicStreamId id,size_t data_size,QuicStreamOffset offset,bool fin,bool needs_full_padding,TransmissionType transmission_type,QuicFrame * frame)308 bool QuicPacketCreator::ConsumeDataToFillCurrentPacket(
309 QuicStreamId id, size_t data_size, QuicStreamOffset offset, bool fin,
310 bool needs_full_padding, TransmissionType transmission_type,
311 QuicFrame* frame) {
312 if (!HasRoomForStreamFrame(id, offset, data_size)) {
313 return false;
314 }
315 CreateStreamFrame(id, data_size, offset, fin, frame);
316 // Explicitly disallow multi-packet CHLOs.
317 if (GetQuicFlag(quic_enforce_single_packet_chlo) &&
318 StreamFrameIsClientHello(frame->stream_frame) &&
319 frame->stream_frame.data_length < data_size) {
320 const std::string error_details =
321 "Client hello won't fit in a single packet.";
322 QUIC_BUG(quic_bug_10752_5)
323 << ENDPOINT << error_details << " Constructed stream frame length: "
324 << frame->stream_frame.data_length << " CHLO length: " << data_size;
325 delegate_->OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, error_details);
326 return false;
327 }
328 if (!AddFrame(*frame, transmission_type)) {
329 // Fails if we try to write unencrypted stream data.
330 return false;
331 }
332 if (needs_full_padding) {
333 needs_full_padding_ = true;
334 }
335
336 return true;
337 }
338
HasRoomForStreamFrame(QuicStreamId id,QuicStreamOffset offset,size_t data_size)339 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id,
340 QuicStreamOffset offset,
341 size_t data_size) {
342 const size_t min_stream_frame_size = QuicFramer::GetMinStreamFrameSize(
343 framer_->transport_version(), id, offset, /*last_frame_in_packet=*/true,
344 data_size);
345 if (BytesFree() > min_stream_frame_size) {
346 return true;
347 }
348 if (!RemoveSoftMaxPacketLength()) {
349 return false;
350 }
351 return BytesFree() > min_stream_frame_size;
352 }
353
HasRoomForMessageFrame(QuicByteCount length)354 bool QuicPacketCreator::HasRoomForMessageFrame(QuicByteCount length) {
355 const size_t message_frame_size =
356 QuicFramer::GetMessageFrameSize(/*last_frame_in_packet=*/true, length);
357 if (static_cast<QuicByteCount>(message_frame_size) >
358 max_datagram_frame_size_) {
359 return false;
360 }
361 if (BytesFree() >= message_frame_size) {
362 return true;
363 }
364 if (!RemoveSoftMaxPacketLength()) {
365 return false;
366 }
367 return BytesFree() >= message_frame_size;
368 }
369
370 // static
StreamFramePacketOverhead(QuicTransportVersion version,uint8_t destination_connection_id_length,uint8_t source_connection_id_length,bool include_version,bool include_diversification_nonce,QuicPacketNumberLength packet_number_length,quiche::QuicheVariableLengthIntegerLength retry_token_length_length,quiche::QuicheVariableLengthIntegerLength length_length,QuicStreamOffset offset)371 size_t QuicPacketCreator::StreamFramePacketOverhead(
372 QuicTransportVersion version, uint8_t destination_connection_id_length,
373 uint8_t source_connection_id_length, bool include_version,
374 bool include_diversification_nonce,
375 QuicPacketNumberLength packet_number_length,
376 quiche::QuicheVariableLengthIntegerLength retry_token_length_length,
377 quiche::QuicheVariableLengthIntegerLength length_length,
378 QuicStreamOffset offset) {
379 return GetPacketHeaderSize(version, destination_connection_id_length,
380 source_connection_id_length, include_version,
381 include_diversification_nonce,
382 packet_number_length, retry_token_length_length, 0,
383 length_length) +
384
385 // Assumes a packet with a single stream frame, which omits the length,
386 // causing the data length argument to be ignored.
387 QuicFramer::GetMinStreamFrameSize(version, 1u, offset, true,
388 kMaxOutgoingPacketSize /* unused */);
389 }
390
CreateStreamFrame(QuicStreamId id,size_t data_size,QuicStreamOffset offset,bool fin,QuicFrame * frame)391 void QuicPacketCreator::CreateStreamFrame(QuicStreamId id, size_t data_size,
392 QuicStreamOffset offset, bool fin,
393 QuicFrame* frame) {
394 // Make sure max_packet_length_ is greater than the largest possible overhead
395 // or max_packet_length_ is set to the soft limit.
396 QUICHE_DCHECK(
397 max_packet_length_ >
398 StreamFramePacketOverhead(
399 framer_->transport_version(), GetDestinationConnectionIdLength(),
400 GetSourceConnectionIdLength(), kIncludeVersion,
401 IncludeNonceInPublicHeader(), PACKET_6BYTE_PACKET_NUMBER,
402 GetRetryTokenLengthLength(), GetLengthLength(), offset) ||
403 latched_hard_max_packet_length_ > 0)
404 << ENDPOINT;
405
406 QUIC_BUG_IF(quic_bug_12398_3, !HasRoomForStreamFrame(id, offset, data_size))
407 << ENDPOINT << "No room for Stream frame, BytesFree: " << BytesFree()
408 << " MinStreamFrameSize: "
409 << QuicFramer::GetMinStreamFrameSize(framer_->transport_version(), id,
410 offset, true, data_size);
411
412 QUIC_BUG_IF(quic_bug_12398_4, data_size == 0 && !fin)
413 << ENDPOINT << "Creating a stream frame for stream ID:" << id
414 << " with no data or fin.";
415 size_t min_frame_size = QuicFramer::GetMinStreamFrameSize(
416 framer_->transport_version(), id, offset,
417 /* last_frame_in_packet= */ true, data_size);
418 size_t bytes_consumed =
419 std::min<size_t>(BytesFree() - min_frame_size, data_size);
420
421 bool set_fin = fin && bytes_consumed == data_size; // Last frame.
422 *frame = QuicFrame(QuicStreamFrame(id, set_fin, offset, bytes_consumed));
423 }
424
CreateCryptoFrame(EncryptionLevel level,size_t write_length,QuicStreamOffset offset,QuicFrame * frame)425 bool QuicPacketCreator::CreateCryptoFrame(EncryptionLevel level,
426 size_t write_length,
427 QuicStreamOffset offset,
428 QuicFrame* frame) {
429 const size_t min_frame_size =
430 QuicFramer::GetMinCryptoFrameSize(write_length, offset);
431 if (BytesFree() <= min_frame_size &&
432 (!RemoveSoftMaxPacketLength() || BytesFree() <= min_frame_size)) {
433 return false;
434 }
435 size_t max_write_length = BytesFree() - min_frame_size;
436 size_t bytes_consumed = std::min<size_t>(max_write_length, write_length);
437 *frame = QuicFrame(new QuicCryptoFrame(level, offset, bytes_consumed));
438 return true;
439 }
440
FlushCurrentPacket()441 void QuicPacketCreator::FlushCurrentPacket() {
442 if (!HasPendingFrames() && pending_padding_bytes_ == 0) {
443 return;
444 }
445
446 ABSL_CACHELINE_ALIGNED char stack_buffer[kMaxOutgoingPacketSize];
447 QuicOwnedPacketBuffer external_buffer(delegate_->GetPacketBuffer());
448
449 if (external_buffer.buffer == nullptr) {
450 external_buffer.buffer = stack_buffer;
451 external_buffer.release_buffer = nullptr;
452 }
453
454 QUICHE_DCHECK_EQ(nullptr, packet_.encrypted_buffer) << ENDPOINT;
455 if (!SerializePacket(std::move(external_buffer), kMaxOutgoingPacketSize,
456 /*allow_padding=*/true)) {
457 return;
458 }
459 OnSerializedPacket();
460 }
461
OnSerializedPacket()462 void QuicPacketCreator::OnSerializedPacket() {
463 QUIC_BUG_IF(quic_bug_12398_5, packet_.encrypted_buffer == nullptr)
464 << ENDPOINT;
465
466 // Clear bytes_not_retransmitted for packets containing only
467 // NOT_RETRANSMISSION frames.
468 if (packet_.transmission_type == NOT_RETRANSMISSION) {
469 packet_.bytes_not_retransmitted.reset();
470 }
471
472 SerializedPacket packet(std::move(packet_));
473 ClearPacket();
474 RemoveSoftMaxPacketLength();
475 delegate_->OnSerializedPacket(std::move(packet));
476 }
477
ClearPacket()478 void QuicPacketCreator::ClearPacket() {
479 packet_.has_ack = false;
480 packet_.has_stop_waiting = false;
481 packet_.has_ack_ecn = false;
482 packet_.has_crypto_handshake = NOT_HANDSHAKE;
483 packet_.transmission_type = NOT_RETRANSMISSION;
484 packet_.encrypted_buffer = nullptr;
485 packet_.encrypted_length = 0;
486 packet_.has_ack_frequency = false;
487 packet_.has_message = false;
488 packet_.fate = SEND_TO_WRITER;
489 QUIC_BUG_IF(quic_bug_12398_6, packet_.release_encrypted_buffer != nullptr)
490 << ENDPOINT << "packet_.release_encrypted_buffer should be empty";
491 packet_.release_encrypted_buffer = nullptr;
492 QUICHE_DCHECK(packet_.retransmittable_frames.empty()) << ENDPOINT;
493 QUICHE_DCHECK(packet_.nonretransmittable_frames.empty()) << ENDPOINT;
494 packet_.largest_acked.Clear();
495 needs_full_padding_ = false;
496 packet_.bytes_not_retransmitted.reset();
497 packet_.initial_header.reset();
498 }
499
ReserializeInitialPacketInCoalescedPacket(const SerializedPacket & packet,size_t padding_size,char * buffer,size_t buffer_len)500 size_t QuicPacketCreator::ReserializeInitialPacketInCoalescedPacket(
501 const SerializedPacket& packet, size_t padding_size, char* buffer,
502 size_t buffer_len) {
503 QUIC_BUG_IF(quic_bug_12398_7, packet.encryption_level != ENCRYPTION_INITIAL);
504 QUIC_BUG_IF(quic_bug_12398_8, packet.nonretransmittable_frames.empty() &&
505 packet.retransmittable_frames.empty())
506 << ENDPOINT
507 << "Attempt to serialize empty ENCRYPTION_INITIAL packet in coalesced "
508 "packet";
509
510 if (HasPendingFrames()) {
511 QUIC_BUG(quic_packet_creator_unexpected_queued_frames)
512 << "Unexpected queued frames: " << GetPendingFramesInfo();
513 return 0;
514 }
515
516 ScopedPacketContextSwitcher switcher(
517 packet.packet_number -
518 1, // -1 because serialize packet increase packet number.
519 packet.packet_number_length, packet.encryption_level, &packet_);
520 for (const QuicFrame& frame : packet.nonretransmittable_frames) {
521 if (!AddFrame(frame, packet.transmission_type)) {
522 QUIC_BUG(quic_bug_10752_6)
523 << ENDPOINT << "Failed to serialize frame: " << frame;
524 return 0;
525 }
526 }
527 for (const QuicFrame& frame : packet.retransmittable_frames) {
528 if (!AddFrame(frame, packet.transmission_type)) {
529 QUIC_BUG(quic_bug_10752_7)
530 << ENDPOINT << "Failed to serialize frame: " << frame;
531 return 0;
532 }
533 }
534 // Add necessary padding.
535 if (padding_size > 0) {
536 QUIC_DVLOG(2) << ENDPOINT << "Add padding of size: " << padding_size;
537 if (!AddFrame(QuicFrame(QuicPaddingFrame(padding_size)),
538 packet.transmission_type)) {
539 QUIC_BUG(quic_bug_10752_8)
540 << ENDPOINT << "Failed to add padding of size " << padding_size
541 << " when serializing ENCRYPTION_INITIAL "
542 "packet in coalesced packet";
543 return 0;
544 }
545 }
546
547 if (!SerializePacket(QuicOwnedPacketBuffer(buffer, nullptr), buffer_len,
548 /*allow_padding=*/false)) {
549 return 0;
550 }
551 if (!packet.initial_header.has_value() ||
552 !packet_.initial_header.has_value()) {
553 QUIC_BUG(missing initial packet header)
554 << "initial serialized packet does not have header populated";
555 } else if (*packet.initial_header != *packet_.initial_header) {
556 QUIC_BUG(initial packet header changed before reserialization)
557 << ENDPOINT << "original header: " << *packet.initial_header
558 << ", new header: " << *packet_.initial_header;
559 }
560 const size_t encrypted_length = packet_.encrypted_length;
561 // Clear frames in packet_. No need to DeleteFrames since frames are owned by
562 // initial_packet.
563 packet_.retransmittable_frames.clear();
564 packet_.nonretransmittable_frames.clear();
565 ClearPacket();
566 return encrypted_length;
567 }
568
CreateAndSerializeStreamFrame(QuicStreamId id,size_t write_length,QuicStreamOffset iov_offset,QuicStreamOffset stream_offset,bool fin,TransmissionType transmission_type,size_t * num_bytes_consumed)569 void QuicPacketCreator::CreateAndSerializeStreamFrame(
570 QuicStreamId id, size_t write_length, QuicStreamOffset iov_offset,
571 QuicStreamOffset stream_offset, bool fin,
572 TransmissionType transmission_type, size_t* num_bytes_consumed) {
573 // TODO(b/167222597): consider using ScopedSerializationFailureHandler.
574 QUICHE_DCHECK(queued_frames_.empty()) << ENDPOINT;
575 QUICHE_DCHECK(!QuicUtils::IsCryptoStreamId(transport_version(), id))
576 << ENDPOINT;
577 // Write out the packet header
578 QuicPacketHeader header;
579 FillPacketHeader(&header);
580 packet_.fate = delegate_->GetSerializedPacketFate(
581 /*is_mtu_discovery=*/false, packet_.encryption_level);
582 QUIC_DVLOG(1) << ENDPOINT << "fate of packet " << packet_.packet_number
583 << ": " << SerializedPacketFateToString(packet_.fate) << " of "
584 << EncryptionLevelToString(packet_.encryption_level);
585
586 ABSL_CACHELINE_ALIGNED char stack_buffer[kMaxOutgoingPacketSize];
587 QuicOwnedPacketBuffer packet_buffer(delegate_->GetPacketBuffer());
588
589 if (packet_buffer.buffer == nullptr) {
590 packet_buffer.buffer = stack_buffer;
591 packet_buffer.release_buffer = nullptr;
592 }
593
594 char* encrypted_buffer = packet_buffer.buffer;
595
596 QuicDataWriter writer(kMaxOutgoingPacketSize, encrypted_buffer);
597 size_t length_field_offset = 0;
598 if (!framer_->AppendIetfPacketHeader(header, &writer, &length_field_offset)) {
599 QUIC_BUG(quic_bug_10752_9) << ENDPOINT << "AppendPacketHeader failed";
600 return;
601 }
602
603 // Create a Stream frame with the remaining space.
604 QUIC_BUG_IF(quic_bug_12398_9, iov_offset == write_length && !fin)
605 << ENDPOINT << "Creating a stream frame with no data or fin.";
606 const size_t remaining_data_size = write_length - iov_offset;
607 size_t min_frame_size = QuicFramer::GetMinStreamFrameSize(
608 framer_->transport_version(), id, stream_offset,
609 /* last_frame_in_packet= */ true, remaining_data_size);
610 size_t available_size =
611 max_plaintext_size_ - writer.length() - min_frame_size;
612 size_t bytes_consumed = std::min<size_t>(available_size, remaining_data_size);
613 size_t plaintext_bytes_written = min_frame_size + bytes_consumed;
614 bool needs_padding = false;
615 const size_t min_plaintext_size =
616 MinPlaintextPacketSize(framer_->version(), GetPacketNumberLength());
617 if (plaintext_bytes_written < min_plaintext_size) {
618 needs_padding = true;
619 }
620
621 const bool set_fin = fin && (bytes_consumed == remaining_data_size);
622 QuicStreamFrame frame(id, set_fin, stream_offset, bytes_consumed);
623 if (debug_delegate_ != nullptr) {
624 debug_delegate_->OnFrameAddedToPacket(QuicFrame(frame));
625 }
626 QUIC_DVLOG(1) << ENDPOINT << "Adding frame: " << frame;
627
628 QUIC_DVLOG(2) << ENDPOINT << "Serializing stream packet " << header << frame;
629
630 // TODO(ianswett): AppendTypeByte and AppendStreamFrame could be optimized
631 // into one method that takes a QuicStreamFrame, if warranted.
632 if (needs_padding) {
633 if (!writer.WritePaddingBytes(min_plaintext_size -
634 plaintext_bytes_written)) {
635 QUIC_BUG(quic_bug_10752_12) << ENDPOINT << "Unable to add padding bytes";
636 return;
637 }
638 needs_padding = false;
639 }
640 bool omit_frame_length = !needs_padding;
641 if (!framer_->AppendTypeByte(QuicFrame(frame), omit_frame_length, &writer)) {
642 QUIC_BUG(quic_bug_10752_10) << ENDPOINT << "AppendTypeByte failed";
643 return;
644 }
645 if (!framer_->AppendStreamFrame(frame, omit_frame_length, &writer)) {
646 QUIC_BUG(quic_bug_10752_11) << ENDPOINT << "AppendStreamFrame failed";
647 return;
648 }
649 if (needs_padding && plaintext_bytes_written < min_plaintext_size &&
650 !writer.WritePaddingBytes(min_plaintext_size - plaintext_bytes_written)) {
651 QUIC_BUG(quic_bug_10752_12) << ENDPOINT << "Unable to add padding bytes";
652 return;
653 }
654
655 if (!framer_->WriteIetfLongHeaderLength(header, &writer, length_field_offset,
656 packet_.encryption_level)) {
657 return;
658 }
659
660 packet_.transmission_type = transmission_type;
661
662 QUICHE_DCHECK(packet_.encryption_level == ENCRYPTION_FORWARD_SECURE ||
663 packet_.encryption_level == ENCRYPTION_ZERO_RTT)
664 << ENDPOINT << packet_.encryption_level;
665 size_t encrypted_length = framer_->EncryptInPlace(
666 packet_.encryption_level, packet_.packet_number,
667 GetStartOfEncryptedData(framer_->transport_version(), header),
668 writer.length(), kMaxOutgoingPacketSize, encrypted_buffer);
669 if (encrypted_length == 0) {
670 QUIC_BUG(quic_bug_10752_13)
671 << ENDPOINT << "Failed to encrypt packet number "
672 << header.packet_number;
673 return;
674 }
675 // TODO(ianswett): Optimize the storage so RetransmitableFrames can be
676 // unioned with a QuicStreamFrame and a UniqueStreamBuffer.
677 *num_bytes_consumed = bytes_consumed;
678 packet_size_ = 0;
679 packet_.encrypted_buffer = encrypted_buffer;
680 packet_.encrypted_length = encrypted_length;
681
682 packet_buffer.buffer = nullptr;
683 packet_.release_encrypted_buffer = std::move(packet_buffer).release_buffer;
684
685 packet_.retransmittable_frames.push_back(QuicFrame(frame));
686 OnSerializedPacket();
687 }
688
HasPendingFrames() const689 bool QuicPacketCreator::HasPendingFrames() const {
690 return !queued_frames_.empty();
691 }
692
GetPendingFramesInfo() const693 std::string QuicPacketCreator::GetPendingFramesInfo() const {
694 return QuicFramesToString(queued_frames_);
695 }
696
HasPendingRetransmittableFrames() const697 bool QuicPacketCreator::HasPendingRetransmittableFrames() const {
698 return !packet_.retransmittable_frames.empty();
699 }
700
HasPendingStreamFramesOfStream(QuicStreamId id) const701 bool QuicPacketCreator::HasPendingStreamFramesOfStream(QuicStreamId id) const {
702 for (const auto& frame : packet_.retransmittable_frames) {
703 if (frame.type == STREAM_FRAME && frame.stream_frame.stream_id == id) {
704 return true;
705 }
706 }
707 return false;
708 }
709
ExpansionOnNewFrame() const710 size_t QuicPacketCreator::ExpansionOnNewFrame() const {
711 // If the last frame in the packet is a message frame, then it will expand to
712 // include the varint message length when a new frame is added.
713 if (queued_frames_.empty()) {
714 return 0;
715 }
716 return ExpansionOnNewFrameWithLastFrame(queued_frames_.back(),
717 framer_->transport_version());
718 }
719
720 // static
ExpansionOnNewFrameWithLastFrame(const QuicFrame & last_frame,QuicTransportVersion version)721 size_t QuicPacketCreator::ExpansionOnNewFrameWithLastFrame(
722 const QuicFrame& last_frame, QuicTransportVersion version) {
723 if (last_frame.type == MESSAGE_FRAME) {
724 return QuicDataWriter::GetVarInt62Len(
725 last_frame.message_frame->message_length);
726 }
727 if (last_frame.type != STREAM_FRAME) {
728 return 0;
729 }
730 if (VersionHasIetfQuicFrames(version)) {
731 return QuicDataWriter::GetVarInt62Len(last_frame.stream_frame.data_length);
732 }
733 return kQuicStreamPayloadLengthSize;
734 }
735
BytesFree() const736 size_t QuicPacketCreator::BytesFree() const {
737 return max_plaintext_size_ -
738 std::min(max_plaintext_size_, PacketSize() + ExpansionOnNewFrame());
739 }
740
BytesFreeForPadding() const741 size_t QuicPacketCreator::BytesFreeForPadding() const {
742 size_t consumed = PacketSize();
743 return max_plaintext_size_ - std::min(max_plaintext_size_, consumed);
744 }
745
PacketSize() const746 size_t QuicPacketCreator::PacketSize() const {
747 return queued_frames_.empty() ? PacketHeaderSize() : packet_size_;
748 }
749
AddPaddedSavedFrame(const QuicFrame & frame,TransmissionType transmission_type)750 bool QuicPacketCreator::AddPaddedSavedFrame(
751 const QuicFrame& frame, TransmissionType transmission_type) {
752 if (AddFrame(frame, transmission_type)) {
753 needs_full_padding_ = true;
754 return true;
755 }
756 return false;
757 }
758
759 std::optional<size_t>
MaybeBuildDataPacketWithChaosProtection(const QuicPacketHeader & header,char * buffer)760 QuicPacketCreator::MaybeBuildDataPacketWithChaosProtection(
761 const QuicPacketHeader& header, char* buffer) {
762 if (!GetQuicFlag(quic_enable_chaos_protection) ||
763 framer_->perspective() != Perspective::IS_CLIENT ||
764 packet_.encryption_level != ENCRYPTION_INITIAL ||
765 !framer_->version().UsesCryptoFrames() || queued_frames_.size() != 2u ||
766 queued_frames_[0].type != CRYPTO_FRAME ||
767 queued_frames_[1].type != PADDING_FRAME ||
768 // Do not perform chaos protection if we do not have a known number of
769 // padding bytes to work with.
770 queued_frames_[1].padding_frame.num_padding_bytes <= 0 ||
771 // Chaos protection relies on the framer using a crypto data producer,
772 // which is always the case in practice.
773 framer_->data_producer() == nullptr) {
774 return std::nullopt;
775 }
776 const QuicCryptoFrame& crypto_frame = *queued_frames_[0].crypto_frame;
777 if (packet_.encryption_level != crypto_frame.level) {
778 QUIC_BUG(chaos frame level)
779 << ENDPOINT << packet_.encryption_level << " != " << crypto_frame.level;
780 return std::nullopt;
781 }
782 QuicChaosProtector chaos_protector(
783 crypto_frame, queued_frames_[1].padding_frame.num_padding_bytes,
784 packet_size_, framer_, random_);
785 return chaos_protector.BuildDataPacket(header, buffer);
786 }
787
SerializePacket(QuicOwnedPacketBuffer encrypted_buffer,size_t encrypted_buffer_len,bool allow_padding)788 bool QuicPacketCreator::SerializePacket(QuicOwnedPacketBuffer encrypted_buffer,
789 size_t encrypted_buffer_len,
790 bool allow_padding) {
791 if (packet_.encrypted_buffer != nullptr) {
792 const std::string error_details =
793 "Packet's encrypted buffer is not empty before serialization";
794 QUIC_BUG(quic_bug_10752_14) << ENDPOINT << error_details;
795 delegate_->OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET,
796 error_details);
797 return false;
798 }
799 ScopedSerializationFailureHandler handler(this);
800
801 QUICHE_DCHECK_LT(0u, encrypted_buffer_len) << ENDPOINT;
802 QUIC_BUG_IF(quic_bug_12398_10,
803 queued_frames_.empty() && pending_padding_bytes_ == 0)
804 << ENDPOINT << "Attempt to serialize empty packet";
805 QuicPacketHeader header;
806 // FillPacketHeader increments packet_number_.
807 FillPacketHeader(&header);
808 if (packet_.encryption_level == ENCRYPTION_INITIAL) {
809 packet_.initial_header = header;
810 }
811 if (delegate_ != nullptr) {
812 packet_.fate = delegate_->GetSerializedPacketFate(
813 /*is_mtu_discovery=*/QuicUtils::ContainsFrameType(queued_frames_,
814 MTU_DISCOVERY_FRAME),
815 packet_.encryption_level);
816 QUIC_DVLOG(1) << ENDPOINT << "fate of packet " << packet_.packet_number
817 << ": " << SerializedPacketFateToString(packet_.fate)
818 << " of "
819 << EncryptionLevelToString(packet_.encryption_level);
820 }
821
822 if (allow_padding) {
823 MaybeAddPadding();
824 }
825
826 QUIC_DVLOG(2) << ENDPOINT << "Serializing packet " << header
827 << QuicFramesToString(queued_frames_) << " at encryption_level "
828 << packet_.encryption_level
829 << ", allow_padding:" << allow_padding;
830
831 if (!framer_->HasEncrypterOfEncryptionLevel(packet_.encryption_level)) {
832 // TODO(fayang): Use QUIC_MISSING_WRITE_KEYS for serialization failures due
833 // to missing keys.
834 QUIC_BUG(quic_bug_10752_15)
835 << ENDPOINT << "Attempting to serialize " << header
836 << QuicFramesToString(queued_frames_) << " at missing encryption_level "
837 << packet_.encryption_level << " using " << framer_->version();
838 return false;
839 }
840
841 QUICHE_DCHECK_GE(max_plaintext_size_, packet_size_) << ENDPOINT;
842 // Use the packet_size_ instead of the buffer size to ensure smaller
843 // packet sizes are properly used.
844
845 size_t length;
846 std::optional<size_t> length_with_chaos_protection =
847 MaybeBuildDataPacketWithChaosProtection(header, encrypted_buffer.buffer);
848 if (length_with_chaos_protection.has_value()) {
849 length = *length_with_chaos_protection;
850 } else {
851 length = framer_->BuildDataPacket(header, queued_frames_,
852 encrypted_buffer.buffer, packet_size_,
853 packet_.encryption_level);
854 }
855
856 if (length == 0) {
857 QUIC_BUG(quic_bug_10752_16)
858 << ENDPOINT << "Failed to serialize "
859 << QuicFramesToString(queued_frames_)
860 << " at encryption_level: " << packet_.encryption_level
861 << ", needs_full_padding_: " << needs_full_padding_
862 << ", pending_padding_bytes_: " << pending_padding_bytes_
863 << ", latched_hard_max_packet_length_: "
864 << latched_hard_max_packet_length_
865 << ", max_packet_length_: " << max_packet_length_
866 << ", header: " << header;
867 return false;
868 }
869
870 // ACK Frames will be truncated due to length only if they're the only frame
871 // in the packet, and if packet_size_ was set to max_plaintext_size_. If
872 // truncation due to length occurred, then GetSerializedFrameLength will have
873 // returned all bytes free.
874 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size_ &&
875 queued_frames_.size() == 1 &&
876 queued_frames_.back().type == ACK_FRAME;
877 // Because of possible truncation, we can't be confident that our
878 // packet size calculation worked correctly.
879 if (!possibly_truncated_by_length) {
880 QUICHE_DCHECK_EQ(packet_size_, length) << ENDPOINT;
881 }
882 const size_t encrypted_length = framer_->EncryptInPlace(
883 packet_.encryption_level, packet_.packet_number,
884 GetStartOfEncryptedData(framer_->transport_version(), header), length,
885 encrypted_buffer_len, encrypted_buffer.buffer);
886 if (encrypted_length == 0) {
887 QUIC_BUG(quic_bug_10752_17)
888 << ENDPOINT << "Failed to encrypt packet number "
889 << packet_.packet_number;
890 return false;
891 }
892
893 packet_size_ = 0;
894 packet_.encrypted_buffer = encrypted_buffer.buffer;
895 packet_.encrypted_length = encrypted_length;
896
897 encrypted_buffer.buffer = nullptr;
898 packet_.release_encrypted_buffer = std::move(encrypted_buffer).release_buffer;
899 return true;
900 }
901
902 std::unique_ptr<SerializedPacket>
SerializeConnectivityProbingPacket()903 QuicPacketCreator::SerializeConnectivityProbingPacket() {
904 QUIC_BUG_IF(quic_bug_12398_11,
905 VersionHasIetfQuicFrames(framer_->transport_version()))
906 << ENDPOINT
907 << "Must not be version 99 to serialize padded ping connectivity probe";
908 RemoveSoftMaxPacketLength();
909 QuicPacketHeader header;
910 // FillPacketHeader increments packet_number_.
911 FillPacketHeader(&header);
912
913 QUIC_DVLOG(2) << ENDPOINT << "Serializing connectivity probing packet "
914 << header;
915
916 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
917 size_t length = BuildConnectivityProbingPacket(
918 header, buffer.get(), max_plaintext_size_, packet_.encryption_level);
919 QUICHE_DCHECK(length) << ENDPOINT;
920
921 QUICHE_DCHECK_EQ(packet_.encryption_level, ENCRYPTION_FORWARD_SECURE)
922 << ENDPOINT;
923 const size_t encrypted_length = framer_->EncryptInPlace(
924 packet_.encryption_level, packet_.packet_number,
925 GetStartOfEncryptedData(framer_->transport_version(), header), length,
926 kMaxOutgoingPacketSize, buffer.get());
927 QUICHE_DCHECK(encrypted_length) << ENDPOINT;
928
929 std::unique_ptr<SerializedPacket> serialize_packet(new SerializedPacket(
930 header.packet_number, header.packet_number_length, buffer.release(),
931 encrypted_length, /*has_ack=*/false, /*has_stop_waiting=*/false));
932
933 serialize_packet->release_encrypted_buffer = [](const char* p) {
934 delete[] p;
935 };
936 serialize_packet->encryption_level = packet_.encryption_level;
937 serialize_packet->transmission_type = NOT_RETRANSMISSION;
938
939 return serialize_packet;
940 }
941
942 std::unique_ptr<SerializedPacket>
SerializePathChallengeConnectivityProbingPacket(const QuicPathFrameBuffer & payload)943 QuicPacketCreator::SerializePathChallengeConnectivityProbingPacket(
944 const QuicPathFrameBuffer& payload) {
945 QUIC_BUG_IF(quic_bug_12398_12,
946 !VersionHasIetfQuicFrames(framer_->transport_version()))
947 << ENDPOINT
948 << "Must be version 99 to serialize path challenge connectivity probe, "
949 "is version "
950 << framer_->transport_version();
951 RemoveSoftMaxPacketLength();
952 QuicPacketHeader header;
953 // FillPacketHeader increments packet_number_.
954 FillPacketHeader(&header);
955
956 QUIC_DVLOG(2) << ENDPOINT << "Serializing path challenge packet " << header;
957
958 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
959 size_t length =
960 BuildPaddedPathChallengePacket(header, buffer.get(), max_plaintext_size_,
961 payload, packet_.encryption_level);
962 QUICHE_DCHECK(length) << ENDPOINT;
963
964 QUICHE_DCHECK_EQ(packet_.encryption_level, ENCRYPTION_FORWARD_SECURE)
965 << ENDPOINT;
966 const size_t encrypted_length = framer_->EncryptInPlace(
967 packet_.encryption_level, packet_.packet_number,
968 GetStartOfEncryptedData(framer_->transport_version(), header), length,
969 kMaxOutgoingPacketSize, buffer.get());
970 QUICHE_DCHECK(encrypted_length) << ENDPOINT;
971
972 std::unique_ptr<SerializedPacket> serialize_packet(
973 new SerializedPacket(header.packet_number, header.packet_number_length,
974 buffer.release(), encrypted_length,
975 /*has_ack=*/false, /*has_stop_waiting=*/false));
976
977 serialize_packet->release_encrypted_buffer = [](const char* p) {
978 delete[] p;
979 };
980 serialize_packet->encryption_level = packet_.encryption_level;
981 serialize_packet->transmission_type = NOT_RETRANSMISSION;
982
983 return serialize_packet;
984 }
985
986 std::unique_ptr<SerializedPacket>
SerializePathResponseConnectivityProbingPacket(const quiche::QuicheCircularDeque<QuicPathFrameBuffer> & payloads,const bool is_padded)987 QuicPacketCreator::SerializePathResponseConnectivityProbingPacket(
988 const quiche::QuicheCircularDeque<QuicPathFrameBuffer>& payloads,
989 const bool is_padded) {
990 QUIC_BUG_IF(quic_bug_12398_13,
991 !VersionHasIetfQuicFrames(framer_->transport_version()))
992 << ENDPOINT
993 << "Must be version 99 to serialize path response connectivity probe, is "
994 "version "
995 << framer_->transport_version();
996 RemoveSoftMaxPacketLength();
997 QuicPacketHeader header;
998 // FillPacketHeader increments packet_number_.
999 FillPacketHeader(&header);
1000
1001 QUIC_DVLOG(2) << ENDPOINT << "Serializing path response packet " << header;
1002
1003 std::unique_ptr<char[]> buffer(new char[kMaxOutgoingPacketSize]);
1004 size_t length =
1005 BuildPathResponsePacket(header, buffer.get(), max_plaintext_size_,
1006 payloads, is_padded, packet_.encryption_level);
1007 QUICHE_DCHECK(length) << ENDPOINT;
1008
1009 QUICHE_DCHECK_EQ(packet_.encryption_level, ENCRYPTION_FORWARD_SECURE)
1010 << ENDPOINT;
1011 const size_t encrypted_length = framer_->EncryptInPlace(
1012 packet_.encryption_level, packet_.packet_number,
1013 GetStartOfEncryptedData(framer_->transport_version(), header), length,
1014 kMaxOutgoingPacketSize, buffer.get());
1015 QUICHE_DCHECK(encrypted_length) << ENDPOINT;
1016
1017 std::unique_ptr<SerializedPacket> serialize_packet(
1018 new SerializedPacket(header.packet_number, header.packet_number_length,
1019 buffer.release(), encrypted_length,
1020 /*has_ack=*/false, /*has_stop_waiting=*/false));
1021
1022 serialize_packet->release_encrypted_buffer = [](const char* p) {
1023 delete[] p;
1024 };
1025 serialize_packet->encryption_level = packet_.encryption_level;
1026 serialize_packet->transmission_type = NOT_RETRANSMISSION;
1027
1028 return serialize_packet;
1029 }
1030
BuildPaddedPathChallengePacket(const QuicPacketHeader & header,char * buffer,size_t packet_length,const QuicPathFrameBuffer & payload,EncryptionLevel level)1031 size_t QuicPacketCreator::BuildPaddedPathChallengePacket(
1032 const QuicPacketHeader& header, char* buffer, size_t packet_length,
1033 const QuicPathFrameBuffer& payload, EncryptionLevel level) {
1034 QUICHE_DCHECK(VersionHasIetfQuicFrames(framer_->transport_version()))
1035 << ENDPOINT;
1036 QuicFrames frames;
1037
1038 // Write a PATH_CHALLENGE frame, which has a random 8-byte payload
1039 frames.push_back(QuicFrame(QuicPathChallengeFrame(0, payload)));
1040
1041 if (debug_delegate_ != nullptr) {
1042 debug_delegate_->OnFrameAddedToPacket(frames.back());
1043 }
1044
1045 // Add padding to the rest of the packet in order to assess Path MTU
1046 // characteristics.
1047 QuicPaddingFrame padding_frame;
1048 frames.push_back(QuicFrame(padding_frame));
1049
1050 return framer_->BuildDataPacket(header, frames, buffer, packet_length, level);
1051 }
1052
BuildPathResponsePacket(const QuicPacketHeader & header,char * buffer,size_t packet_length,const quiche::QuicheCircularDeque<QuicPathFrameBuffer> & payloads,const bool is_padded,EncryptionLevel level)1053 size_t QuicPacketCreator::BuildPathResponsePacket(
1054 const QuicPacketHeader& header, char* buffer, size_t packet_length,
1055 const quiche::QuicheCircularDeque<QuicPathFrameBuffer>& payloads,
1056 const bool is_padded, EncryptionLevel level) {
1057 if (payloads.empty()) {
1058 QUIC_BUG(quic_bug_12398_14)
1059 << ENDPOINT
1060 << "Attempt to generate connectivity response with no request payloads";
1061 return 0;
1062 }
1063 QUICHE_DCHECK(VersionHasIetfQuicFrames(framer_->transport_version()))
1064 << ENDPOINT;
1065
1066 QuicFrames frames;
1067 for (const QuicPathFrameBuffer& payload : payloads) {
1068 // Note that the control frame ID can be 0 since this is not retransmitted.
1069 frames.push_back(QuicFrame(QuicPathResponseFrame(0, payload)));
1070 if (debug_delegate_ != nullptr) {
1071 debug_delegate_->OnFrameAddedToPacket(frames.back());
1072 }
1073 }
1074
1075 if (is_padded) {
1076 // Add padding to the rest of the packet in order to assess Path MTU
1077 // characteristics.
1078 QuicPaddingFrame padding_frame;
1079 frames.push_back(QuicFrame(padding_frame));
1080 }
1081
1082 return framer_->BuildDataPacket(header, frames, buffer, packet_length, level);
1083 }
1084
BuildConnectivityProbingPacket(const QuicPacketHeader & header,char * buffer,size_t packet_length,EncryptionLevel level)1085 size_t QuicPacketCreator::BuildConnectivityProbingPacket(
1086 const QuicPacketHeader& header, char* buffer, size_t packet_length,
1087 EncryptionLevel level) {
1088 QuicFrames frames;
1089
1090 // Write a PING frame, which has no data payload.
1091 QuicPingFrame ping_frame;
1092 frames.push_back(QuicFrame(ping_frame));
1093
1094 // Add padding to the rest of the packet.
1095 QuicPaddingFrame padding_frame;
1096 frames.push_back(QuicFrame(padding_frame));
1097
1098 return framer_->BuildDataPacket(header, frames, buffer, packet_length, level);
1099 }
1100
SerializeCoalescedPacket(const QuicCoalescedPacket & coalesced,char * buffer,size_t buffer_len)1101 size_t QuicPacketCreator::SerializeCoalescedPacket(
1102 const QuicCoalescedPacket& coalesced, char* buffer, size_t buffer_len) {
1103 if (HasPendingFrames()) {
1104 QUIC_BUG(quic_bug_10752_18)
1105 << ENDPOINT << "Try to serialize coalesced packet with pending frames";
1106 return 0;
1107 }
1108 RemoveSoftMaxPacketLength();
1109 QUIC_BUG_IF(quic_bug_12398_15, coalesced.length() == 0)
1110 << ENDPOINT << "Attempt to serialize empty coalesced packet";
1111 size_t packet_length = 0;
1112 size_t initial_length = 0;
1113 size_t padding_size = 0;
1114 if (coalesced.initial_packet() != nullptr) {
1115 // Padding coalesced packet containing initial packet to full.
1116 padding_size = coalesced.max_packet_length() - coalesced.length();
1117 if (framer_->perspective() == Perspective::IS_SERVER &&
1118 QuicUtils::ContainsFrameType(
1119 coalesced.initial_packet()->retransmittable_frames,
1120 CONNECTION_CLOSE_FRAME)) {
1121 // Do not pad server initial connection close packet.
1122 padding_size = 0;
1123 }
1124 initial_length = ReserializeInitialPacketInCoalescedPacket(
1125 *coalesced.initial_packet(), padding_size, buffer, buffer_len);
1126 if (initial_length == 0) {
1127 QUIC_BUG(quic_bug_10752_19)
1128 << ENDPOINT
1129 << "Failed to reserialize ENCRYPTION_INITIAL packet in "
1130 "coalesced packet";
1131 return 0;
1132 }
1133 QUIC_BUG_IF(quic_reserialize_initial_packet_unexpected_size,
1134 coalesced.initial_packet()->encrypted_length + padding_size !=
1135 initial_length)
1136 << "Reserialize initial packet in coalescer has unexpected size, "
1137 "original_length: "
1138 << coalesced.initial_packet()->encrypted_length
1139 << ", coalesced.max_packet_length: " << coalesced.max_packet_length()
1140 << ", coalesced.length: " << coalesced.length()
1141 << ", padding_size: " << padding_size
1142 << ", serialized_length: " << initial_length
1143 << ", retransmittable frames: "
1144 << QuicFramesToString(
1145 coalesced.initial_packet()->retransmittable_frames)
1146 << ", nonretransmittable frames: "
1147 << QuicFramesToString(
1148 coalesced.initial_packet()->nonretransmittable_frames);
1149 buffer += initial_length;
1150 buffer_len -= initial_length;
1151 packet_length += initial_length;
1152 }
1153 size_t length_copied = 0;
1154 if (!coalesced.CopyEncryptedBuffers(buffer, buffer_len, &length_copied)) {
1155 QUIC_BUG(quic_serialize_coalesced_packet_copy_failure)
1156 << "SerializeCoalescedPacket failed. buffer_len:" << buffer_len
1157 << ", initial_length:" << initial_length
1158 << ", padding_size: " << padding_size
1159 << ", length_copied:" << length_copied
1160 << ", coalesced.length:" << coalesced.length()
1161 << ", coalesced.max_packet_length:" << coalesced.max_packet_length()
1162 << ", coalesced.packet_lengths:"
1163 << absl::StrJoin(coalesced.packet_lengths(), ":");
1164 return 0;
1165 }
1166 packet_length += length_copied;
1167 QUIC_DVLOG(1) << ENDPOINT
1168 << "Successfully serialized coalesced packet of length: "
1169 << packet_length;
1170 return packet_length;
1171 }
1172
1173 // TODO(b/74062209): Make this a public method of framer?
NoPacket()1174 SerializedPacket QuicPacketCreator::NoPacket() {
1175 return SerializedPacket(QuicPacketNumber(), PACKET_1BYTE_PACKET_NUMBER,
1176 nullptr, 0, false, false);
1177 }
1178
GetDestinationConnectionId() const1179 QuicConnectionId QuicPacketCreator::GetDestinationConnectionId() const {
1180 if (framer_->perspective() == Perspective::IS_SERVER) {
1181 return client_connection_id_;
1182 }
1183 return server_connection_id_;
1184 }
1185
GetSourceConnectionId() const1186 QuicConnectionId QuicPacketCreator::GetSourceConnectionId() const {
1187 if (framer_->perspective() == Perspective::IS_CLIENT) {
1188 return client_connection_id_;
1189 }
1190 return server_connection_id_;
1191 }
1192
GetDestinationConnectionIdIncluded() const1193 QuicConnectionIdIncluded QuicPacketCreator::GetDestinationConnectionIdIncluded()
1194 const {
1195 // In versions that do not support client connection IDs, the destination
1196 // connection ID is only sent from client to server.
1197 return (framer_->perspective() == Perspective::IS_CLIENT ||
1198 framer_->version().SupportsClientConnectionIds())
1199 ? CONNECTION_ID_PRESENT
1200 : CONNECTION_ID_ABSENT;
1201 }
1202
GetSourceConnectionIdIncluded() const1203 QuicConnectionIdIncluded QuicPacketCreator::GetSourceConnectionIdIncluded()
1204 const {
1205 // Long header packets sent by server include source connection ID.
1206 // Ones sent by the client only include source connection ID if the version
1207 // supports client connection IDs.
1208 if (HasIetfLongHeader() &&
1209 (framer_->perspective() == Perspective::IS_SERVER ||
1210 framer_->version().SupportsClientConnectionIds())) {
1211 return CONNECTION_ID_PRESENT;
1212 }
1213 if (framer_->perspective() == Perspective::IS_SERVER) {
1214 return server_connection_id_included_;
1215 }
1216 return CONNECTION_ID_ABSENT;
1217 }
1218
GetDestinationConnectionIdLength() const1219 uint8_t QuicPacketCreator::GetDestinationConnectionIdLength() const {
1220 QUICHE_DCHECK(QuicUtils::IsConnectionIdValidForVersion(server_connection_id_,
1221 transport_version()))
1222 << ENDPOINT;
1223 return GetDestinationConnectionIdIncluded() == CONNECTION_ID_PRESENT
1224 ? GetDestinationConnectionId().length()
1225 : 0;
1226 }
1227
GetSourceConnectionIdLength() const1228 uint8_t QuicPacketCreator::GetSourceConnectionIdLength() const {
1229 QUICHE_DCHECK(QuicUtils::IsConnectionIdValidForVersion(server_connection_id_,
1230 transport_version()))
1231 << ENDPOINT;
1232 return GetSourceConnectionIdIncluded() == CONNECTION_ID_PRESENT
1233 ? GetSourceConnectionId().length()
1234 : 0;
1235 }
1236
GetPacketNumberLength() const1237 QuicPacketNumberLength QuicPacketCreator::GetPacketNumberLength() const {
1238 if (HasIetfLongHeader() &&
1239 !framer_->version().SendsVariableLengthPacketNumberInLongHeader()) {
1240 return PACKET_4BYTE_PACKET_NUMBER;
1241 }
1242 return packet_.packet_number_length;
1243 }
1244
PacketHeaderSize() const1245 size_t QuicPacketCreator::PacketHeaderSize() const {
1246 return GetPacketHeaderSize(
1247 framer_->transport_version(), GetDestinationConnectionIdLength(),
1248 GetSourceConnectionIdLength(), IncludeVersionInHeader(),
1249 IncludeNonceInPublicHeader(), GetPacketNumberLength(),
1250 GetRetryTokenLengthLength(), GetRetryToken().length(), GetLengthLength());
1251 }
1252
1253 quiche::QuicheVariableLengthIntegerLength
GetRetryTokenLengthLength() const1254 QuicPacketCreator::GetRetryTokenLengthLength() const {
1255 if (QuicVersionHasLongHeaderLengths(framer_->transport_version()) &&
1256 HasIetfLongHeader() &&
1257 EncryptionlevelToLongHeaderType(packet_.encryption_level) == INITIAL) {
1258 return QuicDataWriter::GetVarInt62Len(GetRetryToken().length());
1259 }
1260 return quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
1261 }
1262
GetRetryToken() const1263 absl::string_view QuicPacketCreator::GetRetryToken() const {
1264 if (QuicVersionHasLongHeaderLengths(framer_->transport_version()) &&
1265 HasIetfLongHeader() &&
1266 EncryptionlevelToLongHeaderType(packet_.encryption_level) == INITIAL) {
1267 return retry_token_;
1268 }
1269 return absl::string_view();
1270 }
1271
SetRetryToken(absl::string_view retry_token)1272 void QuicPacketCreator::SetRetryToken(absl::string_view retry_token) {
1273 retry_token_ = std::string(retry_token);
1274 }
1275
ConsumeRetransmittableControlFrame(const QuicFrame & frame)1276 bool QuicPacketCreator::ConsumeRetransmittableControlFrame(
1277 const QuicFrame& frame) {
1278 QUIC_BUG_IF(quic_bug_12398_16, IsControlFrame(frame.type) &&
1279 !GetControlFrameId(frame) &&
1280 frame.type != PING_FRAME)
1281 << ENDPOINT
1282 << "Adding a control frame with no control frame id: " << frame;
1283 QUICHE_DCHECK(QuicUtils::IsRetransmittableFrame(frame.type))
1284 << ENDPOINT << frame;
1285 delegate_->MaybeBundleOpportunistically();
1286 if (HasPendingFrames()) {
1287 if (AddFrame(frame, next_transmission_type_)) {
1288 // There is pending frames and current frame fits.
1289 return true;
1290 }
1291 }
1292 QUICHE_DCHECK(!HasPendingFrames()) << ENDPOINT;
1293 if (frame.type != PING_FRAME && frame.type != CONNECTION_CLOSE_FRAME &&
1294 !delegate_->ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA,
1295 NOT_HANDSHAKE)) {
1296 // Do not check congestion window for ping or connection close frames.
1297 return false;
1298 }
1299 const bool success = AddFrame(frame, next_transmission_type_);
1300 QUIC_BUG_IF(quic_bug_10752_20, !success)
1301 << ENDPOINT << "Failed to add frame:" << frame
1302 << " transmission_type:" << next_transmission_type_;
1303 return success;
1304 }
1305
ConsumeData(QuicStreamId id,size_t write_length,QuicStreamOffset offset,StreamSendingState state)1306 QuicConsumedData QuicPacketCreator::ConsumeData(QuicStreamId id,
1307 size_t write_length,
1308 QuicStreamOffset offset,
1309 StreamSendingState state) {
1310 QUIC_BUG_IF(quic_bug_10752_21, !flusher_attached_)
1311 << ENDPOINT
1312 << "Packet flusher is not attached when "
1313 "generator tries to write stream data.";
1314 bool has_handshake = QuicUtils::IsCryptoStreamId(transport_version(), id);
1315 delegate_->MaybeBundleOpportunistically();
1316 // If the data being consumed is subject to flow control, check the flow
1317 // control send window to see if |write_length| exceeds the send window after
1318 // bundling opportunistic data, if so, reduce |write_length| to the send
1319 // window size.
1320 // The data being consumed is subject to flow control iff
1321 // - It is not a retransmission. We check next_transmission_type_ for that.
1322 // - And it's not handshake data. This is always true for ConsumeData because
1323 // the function is not called for handshake data.
1324 if (GetQuicRestartFlag(quic_opport_bundle_qpack_decoder_data2) &&
1325 next_transmission_type_ == NOT_RETRANSMISSION) {
1326 if (QuicByteCount send_window = delegate_->GetFlowControlSendWindowSize(id);
1327 write_length > send_window) {
1328 QUIC_RESTART_FLAG_COUNT_N(quic_opport_bundle_qpack_decoder_data2, 4, 4);
1329 QUIC_DLOG(INFO) << ENDPOINT
1330 << "After bundled data, reducing (old) write_length:"
1331 << write_length << "to (new) send_window:" << send_window;
1332 write_length = send_window;
1333 state = NO_FIN;
1334 }
1335 }
1336 bool fin = state != NO_FIN;
1337 QUIC_BUG_IF(quic_bug_12398_17, has_handshake && fin)
1338 << ENDPOINT << "Handshake packets should never send a fin";
1339 // To make reasoning about crypto frames easier, we don't combine them with
1340 // other retransmittable frames in a single packet.
1341 if (has_handshake && HasPendingRetransmittableFrames()) {
1342 FlushCurrentPacket();
1343 }
1344
1345 size_t total_bytes_consumed = 0;
1346 bool fin_consumed = false;
1347
1348 if (!HasRoomForStreamFrame(id, offset, write_length)) {
1349 FlushCurrentPacket();
1350 }
1351
1352 if (!fin && (write_length == 0)) {
1353 QUIC_BUG(quic_bug_10752_22)
1354 << ENDPOINT << "Attempt to consume empty data without FIN.";
1355 return QuicConsumedData(0, false);
1356 }
1357 // We determine if we can enter the fast path before executing
1358 // the slow path loop.
1359 bool run_fast_path =
1360 !has_handshake && state != FIN_AND_PADDING && !HasPendingFrames() &&
1361 write_length - total_bytes_consumed > kMaxOutgoingPacketSize &&
1362 latched_hard_max_packet_length_ == 0;
1363
1364 while (!run_fast_path &&
1365 (has_handshake || delegate_->ShouldGeneratePacket(
1366 HAS_RETRANSMITTABLE_DATA, NOT_HANDSHAKE))) {
1367 QuicFrame frame;
1368 bool needs_full_padding =
1369 has_handshake && fully_pad_crypto_handshake_packets_;
1370
1371 if (!ConsumeDataToFillCurrentPacket(id, write_length - total_bytes_consumed,
1372 offset + total_bytes_consumed, fin,
1373 needs_full_padding,
1374 next_transmission_type_, &frame)) {
1375 // The creator is always flushed if there's not enough room for a new
1376 // stream frame before ConsumeData, so ConsumeData should always succeed.
1377 QUIC_BUG(quic_bug_10752_23)
1378 << ENDPOINT << "Failed to ConsumeData, stream:" << id;
1379 return QuicConsumedData(0, false);
1380 }
1381
1382 // A stream frame is created and added.
1383 size_t bytes_consumed = frame.stream_frame.data_length;
1384 total_bytes_consumed += bytes_consumed;
1385 fin_consumed = fin && total_bytes_consumed == write_length;
1386 if (fin_consumed && state == FIN_AND_PADDING) {
1387 AddRandomPadding();
1388 }
1389 QUICHE_DCHECK(total_bytes_consumed == write_length ||
1390 (bytes_consumed > 0 && HasPendingFrames()))
1391 << ENDPOINT;
1392
1393 if (total_bytes_consumed == write_length) {
1394 // We're done writing the data. Exit the loop.
1395 // We don't make this a precondition because we could have 0 bytes of data
1396 // if we're simply writing a fin.
1397 break;
1398 }
1399 FlushCurrentPacket();
1400
1401 run_fast_path =
1402 !has_handshake && state != FIN_AND_PADDING && !HasPendingFrames() &&
1403 write_length - total_bytes_consumed > kMaxOutgoingPacketSize &&
1404 latched_hard_max_packet_length_ == 0;
1405 }
1406
1407 if (run_fast_path) {
1408 return ConsumeDataFastPath(id, write_length, offset, state != NO_FIN,
1409 total_bytes_consumed);
1410 }
1411
1412 // Don't allow the handshake to be bundled with other retransmittable frames.
1413 if (has_handshake) {
1414 FlushCurrentPacket();
1415 }
1416
1417 return QuicConsumedData(total_bytes_consumed, fin_consumed);
1418 }
1419
ConsumeDataFastPath(QuicStreamId id,size_t write_length,QuicStreamOffset offset,bool fin,size_t total_bytes_consumed)1420 QuicConsumedData QuicPacketCreator::ConsumeDataFastPath(
1421 QuicStreamId id, size_t write_length, QuicStreamOffset offset, bool fin,
1422 size_t total_bytes_consumed) {
1423 QUICHE_DCHECK(!QuicUtils::IsCryptoStreamId(transport_version(), id))
1424 << ENDPOINT;
1425 if (AttemptingToSendUnencryptedStreamData()) {
1426 return QuicConsumedData(total_bytes_consumed,
1427 fin && (total_bytes_consumed == write_length));
1428 }
1429
1430 while (total_bytes_consumed < write_length &&
1431 delegate_->ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA,
1432 NOT_HANDSHAKE)) {
1433 // Serialize and encrypt the packet.
1434 size_t bytes_consumed = 0;
1435 CreateAndSerializeStreamFrame(id, write_length, total_bytes_consumed,
1436 offset + total_bytes_consumed, fin,
1437 next_transmission_type_, &bytes_consumed);
1438 if (bytes_consumed == 0) {
1439 const std::string error_details =
1440 "Failed in CreateAndSerializeStreamFrame.";
1441 QUIC_BUG(quic_bug_10752_24) << ENDPOINT << error_details;
1442 delegate_->OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET,
1443 error_details);
1444 break;
1445 }
1446 total_bytes_consumed += bytes_consumed;
1447 }
1448
1449 return QuicConsumedData(total_bytes_consumed,
1450 fin && (total_bytes_consumed == write_length));
1451 }
1452
ConsumeCryptoData(EncryptionLevel level,size_t write_length,QuicStreamOffset offset)1453 size_t QuicPacketCreator::ConsumeCryptoData(EncryptionLevel level,
1454 size_t write_length,
1455 QuicStreamOffset offset) {
1456 QUIC_DVLOG(2) << ENDPOINT << "ConsumeCryptoData " << level << " write_length "
1457 << write_length << " offset " << offset;
1458 QUIC_BUG_IF(quic_bug_10752_25, !flusher_attached_)
1459 << ENDPOINT
1460 << "Packet flusher is not attached when "
1461 "generator tries to write crypto data.";
1462 delegate_->MaybeBundleOpportunistically();
1463 // To make reasoning about crypto frames easier, we don't combine them with
1464 // other retransmittable frames in a single packet.
1465 // TODO(nharper): Once we have separate packet number spaces, everything
1466 // should be driven by encryption level, and we should stop flushing in this
1467 // spot.
1468 if (HasPendingRetransmittableFrames()) {
1469 FlushCurrentPacket();
1470 }
1471
1472 size_t total_bytes_consumed = 0;
1473
1474 while (
1475 total_bytes_consumed < write_length &&
1476 delegate_->ShouldGeneratePacket(HAS_RETRANSMITTABLE_DATA, IS_HANDSHAKE)) {
1477 QuicFrame frame;
1478 if (!ConsumeCryptoDataToFillCurrentPacket(
1479 level, write_length - total_bytes_consumed,
1480 offset + total_bytes_consumed, fully_pad_crypto_handshake_packets_,
1481 next_transmission_type_, &frame)) {
1482 // The only pending data in the packet is non-retransmittable frames.
1483 // I'm assuming here that they won't occupy so much of the packet that a
1484 // CRYPTO frame won't fit.
1485 QUIC_BUG_IF(quic_bug_10752_26, !HasSoftMaxPacketLength()) << absl::StrCat(
1486 ENDPOINT, "Failed to ConsumeCryptoData at level ", level,
1487 ", pending_frames: ", GetPendingFramesInfo(),
1488 ", has_soft_max_packet_length: ", HasSoftMaxPacketLength(),
1489 ", max_packet_length: ", max_packet_length_, ", transmission_type: ",
1490 TransmissionTypeToString(next_transmission_type_),
1491 ", packet_number: ", packet_number().ToString());
1492 return 0;
1493 }
1494 total_bytes_consumed += frame.crypto_frame->data_length;
1495 FlushCurrentPacket();
1496 }
1497
1498 // Don't allow the handshake to be bundled with other retransmittable frames.
1499 FlushCurrentPacket();
1500
1501 return total_bytes_consumed;
1502 }
1503
GenerateMtuDiscoveryPacket(QuicByteCount target_mtu)1504 void QuicPacketCreator::GenerateMtuDiscoveryPacket(QuicByteCount target_mtu) {
1505 // MTU discovery frames must be sent by themselves.
1506 if (!CanSetMaxPacketLength()) {
1507 QUIC_BUG(quic_bug_10752_27)
1508 << ENDPOINT
1509 << "MTU discovery packets should only be sent when no other "
1510 << "frames needs to be sent.";
1511 return;
1512 }
1513 const QuicByteCount current_mtu = max_packet_length();
1514
1515 // The MTU discovery frame is allocated on the stack, since it is going to be
1516 // serialized within this function.
1517 QuicMtuDiscoveryFrame mtu_discovery_frame;
1518 QuicFrame frame(mtu_discovery_frame);
1519
1520 // Send the probe packet with the new length.
1521 SetMaxPacketLength(target_mtu);
1522 const bool success = AddPaddedSavedFrame(frame, next_transmission_type_);
1523 FlushCurrentPacket();
1524 // The only reason AddFrame can fail is that the packet is too full to fit in
1525 // a ping. This is not possible for any sane MTU.
1526 QUIC_BUG_IF(quic_bug_10752_28, !success)
1527 << ENDPOINT << "Failed to send path MTU target_mtu:" << target_mtu
1528 << " transmission_type:" << next_transmission_type_;
1529
1530 // Reset the packet length back.
1531 SetMaxPacketLength(current_mtu);
1532 }
1533
FlushAckFrame(const QuicFrames & frames)1534 bool QuicPacketCreator::FlushAckFrame(const QuicFrames& frames) {
1535 QUIC_BUG_IF(quic_bug_10752_30, !flusher_attached_)
1536 << ENDPOINT
1537 << "Packet flusher is not attached when "
1538 "generator tries to send ACK frame.";
1539 // delegate_->MaybeBundleOpportunistically could be called nestedly when
1540 // sending a control frame causing another control frame to be sent.
1541 QUIC_BUG_IF(quic_bug_12398_18, !frames.empty() && has_ack())
1542 << ENDPOINT << "Trying to flush " << quiche::PrintElements(frames)
1543 << " when there is ACK queued";
1544 for (const auto& frame : frames) {
1545 QUICHE_DCHECK(frame.type == ACK_FRAME || frame.type == STOP_WAITING_FRAME)
1546 << ENDPOINT;
1547 if (HasPendingFrames()) {
1548 if (AddFrame(frame, next_transmission_type_)) {
1549 // There is pending frames and current frame fits.
1550 continue;
1551 }
1552 }
1553 QUICHE_DCHECK(!HasPendingFrames()) << ENDPOINT;
1554 // There is no pending frames, consult the delegate whether a packet can be
1555 // generated.
1556 if (!delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
1557 NOT_HANDSHAKE)) {
1558 return false;
1559 }
1560 const bool success = AddFrame(frame, next_transmission_type_);
1561 QUIC_BUG_IF(quic_bug_10752_31, !success)
1562 << ENDPOINT << "Failed to flush " << frame;
1563 }
1564 return true;
1565 }
1566
AddRandomPadding()1567 void QuicPacketCreator::AddRandomPadding() {
1568 AddPendingPadding(random_->RandUint64() % kMaxNumRandomPaddingBytes + 1);
1569 }
1570
AttachPacketFlusher()1571 void QuicPacketCreator::AttachPacketFlusher() {
1572 flusher_attached_ = true;
1573 if (!write_start_packet_number_.IsInitialized()) {
1574 write_start_packet_number_ = NextSendingPacketNumber();
1575 }
1576 }
1577
Flush()1578 void QuicPacketCreator::Flush() {
1579 FlushCurrentPacket();
1580 SendRemainingPendingPadding();
1581 flusher_attached_ = false;
1582 if (GetQuicFlag(quic_export_write_path_stats_at_server)) {
1583 if (!write_start_packet_number_.IsInitialized()) {
1584 QUIC_BUG(quic_bug_10752_32)
1585 << ENDPOINT << "write_start_packet_number is not initialized";
1586 return;
1587 }
1588 QUIC_SERVER_HISTOGRAM_COUNTS(
1589 "quic_server_num_written_packets_per_write",
1590 NextSendingPacketNumber() - write_start_packet_number_, 1, 200, 50,
1591 "Number of QUIC packets written per write operation");
1592 }
1593 write_start_packet_number_.Clear();
1594 }
1595
SendRemainingPendingPadding()1596 void QuicPacketCreator::SendRemainingPendingPadding() {
1597 while (
1598 pending_padding_bytes() > 0 && !HasPendingFrames() &&
1599 delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA, NOT_HANDSHAKE)) {
1600 FlushCurrentPacket();
1601 }
1602 }
1603
SetServerConnectionIdLength(uint32_t length)1604 void QuicPacketCreator::SetServerConnectionIdLength(uint32_t length) {
1605 if (length == 0) {
1606 SetServerConnectionIdIncluded(CONNECTION_ID_ABSENT);
1607 } else {
1608 SetServerConnectionIdIncluded(CONNECTION_ID_PRESENT);
1609 }
1610 }
1611
SetTransmissionType(TransmissionType type)1612 void QuicPacketCreator::SetTransmissionType(TransmissionType type) {
1613 next_transmission_type_ = type;
1614 }
1615
AddMessageFrame(QuicMessageId message_id,absl::Span<quiche::QuicheMemSlice> message)1616 MessageStatus QuicPacketCreator::AddMessageFrame(
1617 QuicMessageId message_id, absl::Span<quiche::QuicheMemSlice> message) {
1618 QUIC_BUG_IF(quic_bug_10752_33, !flusher_attached_)
1619 << ENDPOINT
1620 << "Packet flusher is not attached when "
1621 "generator tries to add message frame.";
1622 delegate_->MaybeBundleOpportunistically();
1623 const QuicByteCount message_length = MemSliceSpanTotalSize(message);
1624 if (message_length > GetCurrentLargestMessagePayload()) {
1625 return MESSAGE_STATUS_TOO_LARGE;
1626 }
1627 if (!HasRoomForMessageFrame(message_length)) {
1628 FlushCurrentPacket();
1629 }
1630 QuicMessageFrame* frame = new QuicMessageFrame(message_id, message);
1631 const bool success = AddFrame(QuicFrame(frame), next_transmission_type_);
1632 if (!success) {
1633 QUIC_BUG(quic_bug_10752_34)
1634 << ENDPOINT << "Failed to send message " << message_id;
1635 delete frame;
1636 return MESSAGE_STATUS_INTERNAL_ERROR;
1637 }
1638 QUICHE_DCHECK_EQ(MemSliceSpanTotalSize(message),
1639 0u); // Ensure the old slices are empty.
1640 return MESSAGE_STATUS_SUCCESS;
1641 }
1642
GetLengthLength() const1643 quiche::QuicheVariableLengthIntegerLength QuicPacketCreator::GetLengthLength()
1644 const {
1645 if (QuicVersionHasLongHeaderLengths(framer_->transport_version()) &&
1646 HasIetfLongHeader()) {
1647 QuicLongHeaderType long_header_type =
1648 EncryptionlevelToLongHeaderType(packet_.encryption_level);
1649 if (long_header_type == INITIAL || long_header_type == ZERO_RTT_PROTECTED ||
1650 long_header_type == HANDSHAKE) {
1651 return quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
1652 }
1653 }
1654 return quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
1655 }
1656
FillPacketHeader(QuicPacketHeader * header)1657 void QuicPacketCreator::FillPacketHeader(QuicPacketHeader* header) {
1658 header->destination_connection_id = GetDestinationConnectionId();
1659 header->destination_connection_id_included =
1660 GetDestinationConnectionIdIncluded();
1661 header->source_connection_id = GetSourceConnectionId();
1662 header->source_connection_id_included = GetSourceConnectionIdIncluded();
1663 header->reset_flag = false;
1664 header->version_flag = IncludeVersionInHeader();
1665 if (IncludeNonceInPublicHeader()) {
1666 QUICHE_DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective())
1667 << ENDPOINT;
1668 header->nonce = &diversification_nonce_;
1669 } else {
1670 header->nonce = nullptr;
1671 }
1672 packet_.packet_number = NextSendingPacketNumber();
1673 header->packet_number = packet_.packet_number;
1674 header->packet_number_length = GetPacketNumberLength();
1675 header->retry_token_length_length = GetRetryTokenLengthLength();
1676 header->retry_token = GetRetryToken();
1677 header->length_length = GetLengthLength();
1678 header->remaining_packet_length = 0;
1679 if (!HasIetfLongHeader()) {
1680 return;
1681 }
1682 header->long_packet_type =
1683 EncryptionlevelToLongHeaderType(packet_.encryption_level);
1684 }
1685
GetSerializedFrameLength(const QuicFrame & frame)1686 size_t QuicPacketCreator::GetSerializedFrameLength(const QuicFrame& frame) {
1687 size_t serialized_frame_length = framer_->GetSerializedFrameLength(
1688 frame, BytesFree(), queued_frames_.empty(),
1689 /* last_frame_in_packet= */ true, GetPacketNumberLength());
1690 if (!framer_->version().HasHeaderProtection() ||
1691 serialized_frame_length == 0) {
1692 return serialized_frame_length;
1693 }
1694 // Calculate frame bytes and bytes free with this frame added.
1695 const size_t frame_bytes = PacketSize() - PacketHeaderSize() +
1696 ExpansionOnNewFrame() + serialized_frame_length;
1697 if (frame_bytes >=
1698 MinPlaintextPacketSize(framer_->version(), GetPacketNumberLength())) {
1699 // No extra bytes is needed.
1700 return serialized_frame_length;
1701 }
1702 if (BytesFree() < serialized_frame_length) {
1703 QUIC_BUG(quic_bug_10752_35) << ENDPOINT << "Frame does not fit: " << frame;
1704 return 0;
1705 }
1706 // Please note bytes_free does not take |frame|'s expansion into account.
1707 size_t bytes_free = BytesFree() - serialized_frame_length;
1708 // Extra bytes needed (this is NOT padding needed) should be at least 1
1709 // padding + expansion.
1710 const size_t extra_bytes_needed = std::max(
1711 1 + ExpansionOnNewFrameWithLastFrame(frame, framer_->transport_version()),
1712 MinPlaintextPacketSize(framer_->version(), GetPacketNumberLength()) -
1713 frame_bytes);
1714 if (bytes_free < extra_bytes_needed) {
1715 // This frame does not fit.
1716 return 0;
1717 }
1718 return serialized_frame_length;
1719 }
1720
AddFrame(const QuicFrame & frame,TransmissionType transmission_type)1721 bool QuicPacketCreator::AddFrame(const QuicFrame& frame,
1722 TransmissionType transmission_type) {
1723 QUIC_DVLOG(1) << ENDPOINT << "Adding frame with transmission type "
1724 << transmission_type << ": " << frame;
1725 if (frame.type == STREAM_FRAME &&
1726 !QuicUtils::IsCryptoStreamId(framer_->transport_version(),
1727 frame.stream_frame.stream_id) &&
1728 AttemptingToSendUnencryptedStreamData()) {
1729 return false;
1730 }
1731
1732 // Sanity check to ensure we don't send frames at the wrong encryption level.
1733 QUICHE_DCHECK(
1734 packet_.encryption_level == ENCRYPTION_ZERO_RTT ||
1735 packet_.encryption_level == ENCRYPTION_FORWARD_SECURE ||
1736 (frame.type != GOAWAY_FRAME && frame.type != WINDOW_UPDATE_FRAME &&
1737 frame.type != HANDSHAKE_DONE_FRAME &&
1738 frame.type != NEW_CONNECTION_ID_FRAME &&
1739 frame.type != MAX_STREAMS_FRAME && frame.type != STREAMS_BLOCKED_FRAME &&
1740 frame.type != PATH_RESPONSE_FRAME &&
1741 frame.type != PATH_CHALLENGE_FRAME && frame.type != STOP_SENDING_FRAME &&
1742 frame.type != MESSAGE_FRAME && frame.type != NEW_TOKEN_FRAME &&
1743 frame.type != RETIRE_CONNECTION_ID_FRAME &&
1744 frame.type != ACK_FREQUENCY_FRAME))
1745 << ENDPOINT << frame.type << " not allowed at "
1746 << packet_.encryption_level;
1747
1748 if (frame.type == STREAM_FRAME) {
1749 if (MaybeCoalesceStreamFrame(frame.stream_frame)) {
1750 LogCoalesceStreamFrameStatus(true);
1751 return true;
1752 } else {
1753 LogCoalesceStreamFrameStatus(false);
1754 }
1755 }
1756
1757 // If this is an ACK frame, validate that it is non-empty and that
1758 // largest_acked matches the max packet number.
1759 QUICHE_DCHECK(frame.type != ACK_FRAME || (!frame.ack_frame->packets.Empty() &&
1760 frame.ack_frame->packets.Max() ==
1761 frame.ack_frame->largest_acked))
1762 << ENDPOINT << "Invalid ACK frame: " << frame;
1763
1764 size_t frame_len = GetSerializedFrameLength(frame);
1765 if (frame_len == 0 && RemoveSoftMaxPacketLength()) {
1766 // Remove soft max_packet_length and retry.
1767 frame_len = GetSerializedFrameLength(frame);
1768 }
1769 if (frame_len == 0) {
1770 QUIC_DVLOG(1) << ENDPOINT
1771 << "Flushing because current open packet is full when adding "
1772 << frame;
1773 FlushCurrentPacket();
1774 return false;
1775 }
1776 if (queued_frames_.empty()) {
1777 packet_size_ = PacketHeaderSize();
1778 }
1779 QUICHE_DCHECK_LT(0u, packet_size_) << ENDPOINT;
1780
1781 packet_size_ += ExpansionOnNewFrame() + frame_len;
1782
1783 if (QuicUtils::IsRetransmittableFrame(frame.type)) {
1784 packet_.retransmittable_frames.push_back(frame);
1785 queued_frames_.push_back(frame);
1786 if (QuicUtils::IsHandshakeFrame(frame, framer_->transport_version())) {
1787 packet_.has_crypto_handshake = IS_HANDSHAKE;
1788 }
1789 } else {
1790 if (frame.type == PADDING_FRAME &&
1791 frame.padding_frame.num_padding_bytes == -1) {
1792 // Populate the actual length of full padding frame, such that one can
1793 // know how much padding is actually added.
1794 packet_.nonretransmittable_frames.push_back(
1795 QuicFrame(QuicPaddingFrame(frame_len)));
1796 } else {
1797 packet_.nonretransmittable_frames.push_back(frame);
1798 }
1799 queued_frames_.push_back(frame);
1800 }
1801
1802 if (frame.type == ACK_FRAME) {
1803 packet_.has_ack = true;
1804 packet_.largest_acked = LargestAcked(*frame.ack_frame);
1805 if (frame.ack_frame->ecn_counters.has_value()) {
1806 packet_.has_ack_ecn = true;
1807 }
1808 } else if (frame.type == STOP_WAITING_FRAME) {
1809 packet_.has_stop_waiting = true;
1810 } else if (frame.type == ACK_FREQUENCY_FRAME) {
1811 packet_.has_ack_frequency = true;
1812 } else if (frame.type == MESSAGE_FRAME) {
1813 packet_.has_message = true;
1814 }
1815 if (debug_delegate_ != nullptr) {
1816 debug_delegate_->OnFrameAddedToPacket(frame);
1817 }
1818
1819 if (transmission_type == NOT_RETRANSMISSION) {
1820 packet_.bytes_not_retransmitted.emplace(
1821 packet_.bytes_not_retransmitted.value_or(0) + frame_len);
1822 } else if (QuicUtils::IsRetransmittableFrame(frame.type)) {
1823 // Packet transmission type is determined by the last added retransmittable
1824 // frame of a retransmission type. If a packet has no retransmittable
1825 // retransmission frames, it has type NOT_RETRANSMISSION.
1826 packet_.transmission_type = transmission_type;
1827 }
1828 return true;
1829 }
1830
MaybeAddExtraPaddingForHeaderProtection()1831 void QuicPacketCreator::MaybeAddExtraPaddingForHeaderProtection() {
1832 if (!framer_->version().HasHeaderProtection() || needs_full_padding_) {
1833 return;
1834 }
1835 const size_t frame_bytes = PacketSize() - PacketHeaderSize();
1836 if (frame_bytes >=
1837 MinPlaintextPacketSize(framer_->version(), GetPacketNumberLength())) {
1838 return;
1839 }
1840 QuicByteCount min_header_protection_padding =
1841 MinPlaintextPacketSize(framer_->version(), GetPacketNumberLength()) -
1842 frame_bytes;
1843 // Update pending_padding_bytes_.
1844 pending_padding_bytes_ =
1845 std::max(pending_padding_bytes_, min_header_protection_padding);
1846 }
1847
MaybeCoalesceStreamFrame(const QuicStreamFrame & frame)1848 bool QuicPacketCreator::MaybeCoalesceStreamFrame(const QuicStreamFrame& frame) {
1849 if (queued_frames_.empty() || queued_frames_.back().type != STREAM_FRAME) {
1850 return false;
1851 }
1852 QuicStreamFrame* candidate = &queued_frames_.back().stream_frame;
1853 if (candidate->stream_id != frame.stream_id ||
1854 candidate->offset + candidate->data_length != frame.offset ||
1855 frame.data_length > BytesFree()) {
1856 return false;
1857 }
1858 candidate->data_length += frame.data_length;
1859 candidate->fin = frame.fin;
1860
1861 // The back of retransmittable frames must be the same as the original
1862 // queued frames' back.
1863 QUICHE_DCHECK_EQ(packet_.retransmittable_frames.back().type, STREAM_FRAME)
1864 << ENDPOINT;
1865 QuicStreamFrame* retransmittable =
1866 &packet_.retransmittable_frames.back().stream_frame;
1867 QUICHE_DCHECK_EQ(retransmittable->stream_id, frame.stream_id) << ENDPOINT;
1868 QUICHE_DCHECK_EQ(retransmittable->offset + retransmittable->data_length,
1869 frame.offset)
1870 << ENDPOINT;
1871 retransmittable->data_length = candidate->data_length;
1872 retransmittable->fin = candidate->fin;
1873 packet_size_ += frame.data_length;
1874 if (debug_delegate_ != nullptr) {
1875 debug_delegate_->OnStreamFrameCoalesced(*candidate);
1876 }
1877 return true;
1878 }
1879
RemoveSoftMaxPacketLength()1880 bool QuicPacketCreator::RemoveSoftMaxPacketLength() {
1881 if (latched_hard_max_packet_length_ == 0) {
1882 return false;
1883 }
1884 if (!CanSetMaxPacketLength()) {
1885 return false;
1886 }
1887 QUIC_DVLOG(1) << ENDPOINT << "Restoring max packet length to: "
1888 << latched_hard_max_packet_length_;
1889 SetMaxPacketLength(latched_hard_max_packet_length_);
1890 // Reset latched_max_packet_length_.
1891 latched_hard_max_packet_length_ = 0;
1892 return true;
1893 }
1894
MaybeAddPadding()1895 void QuicPacketCreator::MaybeAddPadding() {
1896 // The current packet should have no padding bytes because padding is only
1897 // added when this method is called just before the packet is serialized.
1898 if (BytesFreeForPadding() == 0) {
1899 // Don't pad full packets.
1900 return;
1901 }
1902
1903 if (packet_.fate == COALESCE) {
1904 // Do not add full padding if the packet is going to be coalesced.
1905 needs_full_padding_ = false;
1906 }
1907
1908 // Header protection requires a minimum plaintext packet size.
1909 MaybeAddExtraPaddingForHeaderProtection();
1910
1911 QUIC_DVLOG(3) << "MaybeAddPadding for " << packet_.packet_number
1912 << ": transmission_type:" << packet_.transmission_type
1913 << ", fate:" << packet_.fate
1914 << ", needs_full_padding_:" << needs_full_padding_
1915 << ", pending_padding_bytes_:" << pending_padding_bytes_
1916 << ", BytesFree:" << BytesFree();
1917
1918 if (!needs_full_padding_ && pending_padding_bytes_ == 0) {
1919 // Do not need padding.
1920 return;
1921 }
1922
1923 int padding_bytes = -1;
1924 if (!needs_full_padding_) {
1925 padding_bytes =
1926 std::min<int16_t>(pending_padding_bytes_, BytesFreeForPadding());
1927 pending_padding_bytes_ -= padding_bytes;
1928 }
1929
1930 if (!queued_frames_.empty()) {
1931 // Insert PADDING before the other frames to avoid adding a length field
1932 // to any trailing STREAM frame.
1933 if (needs_full_padding_) {
1934 padding_bytes = BytesFreeForPadding();
1935 }
1936 // AddFrame cannot be used here because it adds the frame to the end of the
1937 // packet.
1938 QuicFrame frame{QuicPaddingFrame(padding_bytes)};
1939 queued_frames_.insert(queued_frames_.begin(), frame);
1940 packet_size_ += padding_bytes;
1941 packet_.nonretransmittable_frames.push_back(frame);
1942 if (packet_.transmission_type == NOT_RETRANSMISSION) {
1943 packet_.bytes_not_retransmitted.emplace(
1944 packet_.bytes_not_retransmitted.value_or(0) + padding_bytes);
1945 }
1946 } else {
1947 bool success = AddFrame(QuicFrame(QuicPaddingFrame(padding_bytes)),
1948 packet_.transmission_type);
1949 QUIC_BUG_IF(quic_bug_10752_36, !success)
1950 << ENDPOINT << "Failed to add padding_bytes: " << padding_bytes
1951 << " transmission_type: " << packet_.transmission_type;
1952 }
1953 }
1954
IncludeNonceInPublicHeader() const1955 bool QuicPacketCreator::IncludeNonceInPublicHeader() const {
1956 return have_diversification_nonce_ &&
1957 packet_.encryption_level == ENCRYPTION_ZERO_RTT;
1958 }
1959
IncludeVersionInHeader() const1960 bool QuicPacketCreator::IncludeVersionInHeader() const {
1961 return packet_.encryption_level < ENCRYPTION_FORWARD_SECURE;
1962 }
1963
AddPendingPadding(QuicByteCount size)1964 void QuicPacketCreator::AddPendingPadding(QuicByteCount size) {
1965 pending_padding_bytes_ += size;
1966 QUIC_DVLOG(3) << "After AddPendingPadding(" << size
1967 << "), pending_padding_bytes_:" << pending_padding_bytes_;
1968 }
1969
StreamFrameIsClientHello(const QuicStreamFrame & frame) const1970 bool QuicPacketCreator::StreamFrameIsClientHello(
1971 const QuicStreamFrame& frame) const {
1972 if (framer_->perspective() == Perspective::IS_SERVER ||
1973 !QuicUtils::IsCryptoStreamId(framer_->transport_version(),
1974 frame.stream_id)) {
1975 return false;
1976 }
1977 // The ClientHello is always sent with INITIAL encryption.
1978 return packet_.encryption_level == ENCRYPTION_INITIAL;
1979 }
1980
SetServerConnectionIdIncluded(QuicConnectionIdIncluded server_connection_id_included)1981 void QuicPacketCreator::SetServerConnectionIdIncluded(
1982 QuicConnectionIdIncluded server_connection_id_included) {
1983 QUICHE_DCHECK(server_connection_id_included == CONNECTION_ID_PRESENT ||
1984 server_connection_id_included == CONNECTION_ID_ABSENT)
1985 << ENDPOINT;
1986 QUICHE_DCHECK(framer_->perspective() == Perspective::IS_SERVER ||
1987 server_connection_id_included != CONNECTION_ID_ABSENT)
1988 << ENDPOINT;
1989 server_connection_id_included_ = server_connection_id_included;
1990 }
1991
SetServerConnectionId(QuicConnectionId server_connection_id)1992 void QuicPacketCreator::SetServerConnectionId(
1993 QuicConnectionId server_connection_id) {
1994 server_connection_id_ = server_connection_id;
1995 }
1996
SetClientConnectionId(QuicConnectionId client_connection_id)1997 void QuicPacketCreator::SetClientConnectionId(
1998 QuicConnectionId client_connection_id) {
1999 QUICHE_DCHECK(client_connection_id.IsEmpty() ||
2000 framer_->version().SupportsClientConnectionIds())
2001 << ENDPOINT;
2002 client_connection_id_ = client_connection_id;
2003 }
2004
GetCurrentLargestMessagePayload() const2005 QuicPacketLength QuicPacketCreator::GetCurrentLargestMessagePayload() const {
2006 const size_t packet_header_size = GetPacketHeaderSize(
2007 framer_->transport_version(), GetDestinationConnectionIdLength(),
2008 GetSourceConnectionIdLength(), IncludeVersionInHeader(),
2009 IncludeNonceInPublicHeader(), GetPacketNumberLength(),
2010 // No Retry token on packets containing application data.
2011 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, GetLengthLength());
2012 // This is the largest possible message payload when the length field is
2013 // omitted.
2014 size_t max_plaintext_size =
2015 latched_hard_max_packet_length_ == 0
2016 ? max_plaintext_size_
2017 : framer_->GetMaxPlaintextSize(latched_hard_max_packet_length_);
2018 size_t largest_frame =
2019 max_plaintext_size - std::min(max_plaintext_size, packet_header_size);
2020 if (static_cast<QuicByteCount>(largest_frame) > max_datagram_frame_size_) {
2021 largest_frame = static_cast<size_t>(max_datagram_frame_size_);
2022 }
2023 return largest_frame - std::min(largest_frame, kQuicFrameTypeSize);
2024 }
2025
GetGuaranteedLargestMessagePayload() const2026 QuicPacketLength QuicPacketCreator::GetGuaranteedLargestMessagePayload() const {
2027 // QUIC Crypto server packets may include a diversification nonce.
2028 const bool may_include_nonce =
2029 framer_->version().handshake_protocol == PROTOCOL_QUIC_CRYPTO &&
2030 framer_->perspective() == Perspective::IS_SERVER;
2031 // IETF QUIC long headers include a length on client 0RTT packets.
2032 quiche::QuicheVariableLengthIntegerLength length_length =
2033 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2034 if (framer_->perspective() == Perspective::IS_CLIENT) {
2035 length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_2;
2036 }
2037 if (!QuicVersionHasLongHeaderLengths(framer_->transport_version())) {
2038 length_length = quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0;
2039 }
2040 const size_t packet_header_size = GetPacketHeaderSize(
2041 framer_->transport_version(), GetDestinationConnectionIdLength(),
2042 // Assume CID lengths don't change, but version may be present.
2043 GetSourceConnectionIdLength(), kIncludeVersion, may_include_nonce,
2044 PACKET_4BYTE_PACKET_NUMBER,
2045 // No Retry token on packets containing application data.
2046 quiche::VARIABLE_LENGTH_INTEGER_LENGTH_0, 0, length_length);
2047 // This is the largest possible message payload when the length field is
2048 // omitted.
2049 size_t max_plaintext_size =
2050 latched_hard_max_packet_length_ == 0
2051 ? max_plaintext_size_
2052 : framer_->GetMaxPlaintextSize(latched_hard_max_packet_length_);
2053 size_t largest_frame =
2054 max_plaintext_size - std::min(max_plaintext_size, packet_header_size);
2055 if (static_cast<QuicByteCount>(largest_frame) > max_datagram_frame_size_) {
2056 largest_frame = static_cast<size_t>(max_datagram_frame_size_);
2057 }
2058 const QuicPacketLength largest_payload =
2059 largest_frame - std::min(largest_frame, kQuicFrameTypeSize);
2060 // This must always be less than or equal to GetCurrentLargestMessagePayload.
2061 QUICHE_DCHECK_LE(largest_payload, GetCurrentLargestMessagePayload())
2062 << ENDPOINT;
2063 return largest_payload;
2064 }
2065
AttemptingToSendUnencryptedStreamData()2066 bool QuicPacketCreator::AttemptingToSendUnencryptedStreamData() {
2067 if (packet_.encryption_level == ENCRYPTION_ZERO_RTT ||
2068 packet_.encryption_level == ENCRYPTION_FORWARD_SECURE) {
2069 return false;
2070 }
2071 const std::string error_details =
2072 absl::StrCat("Cannot send stream data with level: ",
2073 EncryptionLevelToString(packet_.encryption_level));
2074 QUIC_BUG(quic_bug_10752_37) << ENDPOINT << error_details;
2075 delegate_->OnUnrecoverableError(QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA,
2076 error_details);
2077 return true;
2078 }
2079
HasIetfLongHeader() const2080 bool QuicPacketCreator::HasIetfLongHeader() const {
2081 return packet_.encryption_level < ENCRYPTION_FORWARD_SECURE;
2082 }
2083
2084 // static
MinPlaintextPacketSize(const ParsedQuicVersion & version,QuicPacketNumberLength packet_number_length)2085 size_t QuicPacketCreator::MinPlaintextPacketSize(
2086 const ParsedQuicVersion& version,
2087 QuicPacketNumberLength packet_number_length) {
2088 if (!version.HasHeaderProtection()) {
2089 return 0;
2090 }
2091 // Header protection samples 16 bytes of ciphertext starting 4 bytes after the
2092 // packet number. In IETF QUIC, all AEAD algorithms have a 16-byte auth tag
2093 // (i.e. the ciphertext is 16 bytes larger than the plaintext). Since packet
2094 // numbers could be as small as 1 byte, but the sample starts 4 bytes after
2095 // the packet number, at least 3 bytes of plaintext are needed to make sure
2096 // that there is enough ciphertext to sample.
2097 //
2098 // Google QUIC crypto uses different AEAD algorithms - in particular the auth
2099 // tags are only 12 bytes instead of 16 bytes. Since the auth tag is 4 bytes
2100 // shorter, 4 more bytes of plaintext are needed to guarantee there is enough
2101 // ciphertext to sample.
2102 //
2103 // This method could check for PROTOCOL_TLS1_3 vs PROTOCOL_QUIC_CRYPTO and
2104 // return 3 when TLS 1.3 is in use (the use of IETF vs Google QUIC crypters is
2105 // determined based on the handshake protocol used). However, even when TLS
2106 // 1.3 is used, unittests still use NullEncrypter/NullDecrypter (and other
2107 // test crypters) which also only use 12 byte tags.
2108 //
2109 return (version.UsesTls() ? 4 : 8) - packet_number_length;
2110 }
2111
NextSendingPacketNumber() const2112 QuicPacketNumber QuicPacketCreator::NextSendingPacketNumber() const {
2113 if (!packet_number().IsInitialized()) {
2114 return framer_->first_sending_packet_number();
2115 }
2116 return packet_number() + 1;
2117 }
2118
PacketFlusherAttached() const2119 bool QuicPacketCreator::PacketFlusherAttached() const {
2120 return flusher_attached_;
2121 }
2122
HasSoftMaxPacketLength() const2123 bool QuicPacketCreator::HasSoftMaxPacketLength() const {
2124 return latched_hard_max_packet_length_ != 0;
2125 }
2126
SetDefaultPeerAddress(QuicSocketAddress address)2127 void QuicPacketCreator::SetDefaultPeerAddress(QuicSocketAddress address) {
2128 if (!packet_.peer_address.IsInitialized()) {
2129 packet_.peer_address = address;
2130 return;
2131 }
2132 if (packet_.peer_address != address) {
2133 FlushCurrentPacket();
2134 packet_.peer_address = address;
2135 }
2136 }
2137
2138 #define ENDPOINT2 \
2139 (creator_->framer_->perspective() == Perspective::IS_SERVER ? "Server: " \
2140 : "Client: ")
2141
ScopedPeerAddressContext(QuicPacketCreator * creator,QuicSocketAddress address,const QuicConnectionId & client_connection_id,const QuicConnectionId & server_connection_id)2142 QuicPacketCreator::ScopedPeerAddressContext::ScopedPeerAddressContext(
2143 QuicPacketCreator* creator, QuicSocketAddress address,
2144 const QuicConnectionId& client_connection_id,
2145 const QuicConnectionId& server_connection_id)
2146 : creator_(creator),
2147 old_peer_address_(creator_->packet_.peer_address),
2148 old_client_connection_id_(creator_->GetClientConnectionId()),
2149 old_server_connection_id_(creator_->GetServerConnectionId()) {
2150 QUIC_BUG_IF(quic_bug_12398_19, !old_peer_address_.IsInitialized())
2151 << ENDPOINT2
2152 << "Context is used before serialized packet's peer address is "
2153 "initialized.";
2154 creator_->SetDefaultPeerAddress(address);
2155 if (creator_->version().HasIetfQuicFrames()) {
2156 // Flush current packet if connection ID length changes.
2157 if (address == old_peer_address_ &&
2158 ((client_connection_id.length() !=
2159 old_client_connection_id_.length()) ||
2160 (server_connection_id.length() !=
2161 old_server_connection_id_.length()))) {
2162 creator_->FlushCurrentPacket();
2163 }
2164 creator_->SetClientConnectionId(client_connection_id);
2165 creator_->SetServerConnectionId(server_connection_id);
2166 }
2167 }
2168
~ScopedPeerAddressContext()2169 QuicPacketCreator::ScopedPeerAddressContext::~ScopedPeerAddressContext() {
2170 creator_->SetDefaultPeerAddress(old_peer_address_);
2171 if (creator_->version().HasIetfQuicFrames()) {
2172 creator_->SetClientConnectionId(old_client_connection_id_);
2173 creator_->SetServerConnectionId(old_server_connection_id_);
2174 }
2175 }
2176
2177 QuicPacketCreator::ScopedSerializationFailureHandler::
ScopedSerializationFailureHandler(QuicPacketCreator * creator)2178 ScopedSerializationFailureHandler(QuicPacketCreator* creator)
2179 : creator_(creator) {}
2180
2181 QuicPacketCreator::ScopedSerializationFailureHandler::
~ScopedSerializationFailureHandler()2182 ~ScopedSerializationFailureHandler() {
2183 if (creator_ == nullptr) {
2184 return;
2185 }
2186 // Always clear queued_frames_.
2187 creator_->queued_frames_.clear();
2188
2189 if (creator_->packet_.encrypted_buffer == nullptr) {
2190 const std::string error_details = "Failed to SerializePacket.";
2191 QUIC_BUG(quic_bug_10752_38) << ENDPOINT2 << error_details;
2192 creator_->delegate_->OnUnrecoverableError(QUIC_FAILED_TO_SERIALIZE_PACKET,
2193 error_details);
2194 }
2195 }
2196
2197 #undef ENDPOINT2
2198
set_encryption_level(EncryptionLevel level)2199 void QuicPacketCreator::set_encryption_level(EncryptionLevel level) {
2200 QUICHE_DCHECK(level == packet_.encryption_level || !HasPendingFrames())
2201 << ENDPOINT << "Cannot update encryption level from "
2202 << packet_.encryption_level << " to " << level
2203 << " when we already have pending frames: "
2204 << QuicFramesToString(queued_frames_);
2205 packet_.encryption_level = level;
2206 }
2207
AddPathChallengeFrame(const QuicPathFrameBuffer & payload)2208 void QuicPacketCreator::AddPathChallengeFrame(
2209 const QuicPathFrameBuffer& payload) {
2210 // TODO(danzh) Unify similar checks at several entry points into one in
2211 // AddFrame(). Sort out test helper functions and peer class that don't
2212 // enforce this check.
2213 QUIC_BUG_IF(quic_bug_10752_39, !flusher_attached_)
2214 << ENDPOINT
2215 << "Packet flusher is not attached when "
2216 "generator tries to write stream data.";
2217 // Write a PATH_CHALLENGE frame, which has a random 8-byte payload.
2218 QuicFrame frame(QuicPathChallengeFrame(0, payload));
2219 if (AddPaddedFrameWithRetry(frame)) {
2220 return;
2221 }
2222 // Fail silently if the probing packet cannot be written, path validation
2223 // initiator will retry sending automatically.
2224 // TODO(danzh) This will consume retry budget, if it causes performance
2225 // regression, consider to notify the caller about the sending failure and let
2226 // the caller to decide if it worth retrying.
2227 QUIC_DVLOG(1) << ENDPOINT << "Can't send PATH_CHALLENGE now";
2228 }
2229
AddPathResponseFrame(const QuicPathFrameBuffer & data_buffer)2230 bool QuicPacketCreator::AddPathResponseFrame(
2231 const QuicPathFrameBuffer& data_buffer) {
2232 QuicFrame frame(QuicPathResponseFrame(kInvalidControlFrameId, data_buffer));
2233 if (AddPaddedFrameWithRetry(frame)) {
2234 return true;
2235 }
2236
2237 QUIC_DVLOG(1) << ENDPOINT << "Can't send PATH_RESPONSE now";
2238 return false;
2239 }
2240
AddPaddedFrameWithRetry(const QuicFrame & frame)2241 bool QuicPacketCreator::AddPaddedFrameWithRetry(const QuicFrame& frame) {
2242 if (HasPendingFrames()) {
2243 if (AddPaddedSavedFrame(frame, NOT_RETRANSMISSION)) {
2244 // Frame is queued.
2245 return true;
2246 }
2247 }
2248 // Frame was not queued but queued frames were flushed.
2249 QUICHE_DCHECK(!HasPendingFrames()) << ENDPOINT;
2250 if (!delegate_->ShouldGeneratePacket(NO_RETRANSMITTABLE_DATA,
2251 NOT_HANDSHAKE)) {
2252 return false;
2253 }
2254 bool success = AddPaddedSavedFrame(frame, NOT_RETRANSMISSION);
2255 QUIC_BUG_IF(quic_bug_12398_20, !success) << ENDPOINT;
2256 return true;
2257 }
2258
HasRetryToken() const2259 bool QuicPacketCreator::HasRetryToken() const { return !retry_token_.empty(); }
2260
2261 #undef ENDPOINT // undef for jumbo builds
2262 } // namespace quic
2263