• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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