blob: 9b2cb097a341e02ffc28466a2a6d7cf61cb4a9e2 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/quic_packets.h"
6
7#include "net/third_party/quiche/src/quic/core/quic_connection_id.h"
8#include "net/third_party/quiche/src/quic/core/quic_types.h"
9#include "net/third_party/quiche/src/quic/core/quic_utils.h"
10#include "net/third_party/quiche/src/quic/core/quic_versions.h"
11#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
12#include "net/third_party/quiche/src/quic/platform/api/quic_ptr_util.h"
13#include "net/third_party/quiche/src/quic/platform/api/quic_str_cat.h"
14#include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h"
15#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
16
17namespace quic {
18
19QuicConnectionIdLength GetIncludedConnectionIdLength(
20 QuicConnectionId connection_id,
21 QuicConnectionIdIncluded connection_id_included) {
22 DCHECK(connection_id_included == CONNECTION_ID_PRESENT ||
23 connection_id_included == CONNECTION_ID_ABSENT);
24 return connection_id_included == CONNECTION_ID_PRESENT
25 ? static_cast<QuicConnectionIdLength>(connection_id.length())
26 : PACKET_0BYTE_CONNECTION_ID;
27}
28
29QuicConnectionIdLength GetIncludedDestinationConnectionIdLength(
30 const QuicPacketHeader& header) {
31 return GetIncludedConnectionIdLength(
32 header.destination_connection_id,
33 header.destination_connection_id_included);
34}
35
36QuicConnectionIdLength GetIncludedSourceConnectionIdLength(
37 const QuicPacketHeader& header) {
38 return GetIncludedConnectionIdLength(header.source_connection_id,
39 header.source_connection_id_included);
40}
41
42size_t GetPacketHeaderSize(QuicTransportVersion version,
43 const QuicPacketHeader& header) {
44 return GetPacketHeaderSize(
45 version, GetIncludedDestinationConnectionIdLength(header),
46 GetIncludedSourceConnectionIdLength(header), header.version_flag,
47 header.nonce != nullptr, header.packet_number_length,
48 header.retry_token_length_length, header.retry_token.length(),
49 header.length_length);
50}
51
52size_t GetPacketHeaderSize(
53 QuicTransportVersion version,
54 QuicConnectionIdLength destination_connection_id_length,
55 QuicConnectionIdLength source_connection_id_length,
56 bool include_version,
57 bool include_diversification_nonce,
58 QuicPacketNumberLength packet_number_length,
59 QuicVariableLengthIntegerLength retry_token_length_length,
60 QuicByteCount retry_token_length,
61 QuicVariableLengthIntegerLength length_length) {
62 if (version > QUIC_VERSION_43) {
63 if (include_version) {
64 // Long header.
65 return kPacketHeaderTypeSize + kConnectionIdLengthSize +
66 destination_connection_id_length + source_connection_id_length +
67 (version > QUIC_VERSION_44 ? packet_number_length
68 : PACKET_4BYTE_PACKET_NUMBER) +
69 kQuicVersionSize +
70 (include_diversification_nonce ? kDiversificationNonceSize : 0) +
71 retry_token_length_length + retry_token_length + length_length;
72 }
73 // Short header.
74 return kPacketHeaderTypeSize + destination_connection_id_length +
75 packet_number_length;
76 }
77 return kPublicFlagsSize + destination_connection_id_length +
78 (include_version ? kQuicVersionSize : 0) + packet_number_length +
79 (include_diversification_nonce ? kDiversificationNonceSize : 0);
80}
81
82size_t GetStartOfEncryptedData(QuicTransportVersion version,
83 const QuicPacketHeader& header) {
84 return GetPacketHeaderSize(version, header);
85}
86
87size_t GetStartOfEncryptedData(
88 QuicTransportVersion version,
89 QuicConnectionIdLength destination_connection_id_length,
90 QuicConnectionIdLength source_connection_id_length,
91 bool include_version,
92 bool include_diversification_nonce,
93 QuicPacketNumberLength packet_number_length,
94 QuicVariableLengthIntegerLength retry_token_length_length,
95 QuicByteCount retry_token_length,
96 QuicVariableLengthIntegerLength length_length) {
97 // Encryption starts before private flags.
98 return GetPacketHeaderSize(
99 version, destination_connection_id_length, source_connection_id_length,
100 include_version, include_diversification_nonce, packet_number_length,
101 retry_token_length_length, retry_token_length, length_length);
102}
103
104QuicPacketHeader::QuicPacketHeader()
105 : destination_connection_id(EmptyQuicConnectionId()),
106 destination_connection_id_included(CONNECTION_ID_PRESENT),
107 source_connection_id(EmptyQuicConnectionId()),
108 source_connection_id_included(CONNECTION_ID_ABSENT),
109 reset_flag(false),
110 version_flag(false),
111 has_possible_stateless_reset_token(false),
112 packet_number_length(PACKET_4BYTE_PACKET_NUMBER),
113 version(UnsupportedQuicVersion()),
114 nonce(nullptr),
115 form(GOOGLE_QUIC_PACKET),
116 long_packet_type(INITIAL),
117 possible_stateless_reset_token(0),
118 retry_token_length_length(VARIABLE_LENGTH_INTEGER_LENGTH_0),
119 retry_token(QuicStringPiece()),
120 length_length(VARIABLE_LENGTH_INTEGER_LENGTH_0),
121 remaining_packet_length(0) {}
122
123QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default;
124
125QuicPacketHeader::~QuicPacketHeader() {}
126
127QuicPublicResetPacket::QuicPublicResetPacket()
128 : connection_id(EmptyQuicConnectionId()), nonce_proof(0) {}
129
130QuicPublicResetPacket::QuicPublicResetPacket(QuicConnectionId connection_id)
131 : connection_id(connection_id), nonce_proof(0) {}
132
133QuicVersionNegotiationPacket::QuicVersionNegotiationPacket()
134 : connection_id(EmptyQuicConnectionId()) {}
135
136QuicVersionNegotiationPacket::QuicVersionNegotiationPacket(
137 QuicConnectionId connection_id)
138 : connection_id(connection_id) {}
139
140QuicVersionNegotiationPacket::QuicVersionNegotiationPacket(
141 const QuicVersionNegotiationPacket& other) = default;
142
143QuicVersionNegotiationPacket::~QuicVersionNegotiationPacket() {}
144
145QuicIetfStatelessResetPacket::QuicIetfStatelessResetPacket()
146 : stateless_reset_token(0) {}
147
148QuicIetfStatelessResetPacket::QuicIetfStatelessResetPacket(
149 const QuicPacketHeader& header,
150 QuicUint128 token)
151 : header(header), stateless_reset_token(token) {}
152
153QuicIetfStatelessResetPacket::QuicIetfStatelessResetPacket(
154 const QuicIetfStatelessResetPacket& other) = default;
155
156QuicIetfStatelessResetPacket::~QuicIetfStatelessResetPacket() {}
157
158std::ostream& operator<<(std::ostream& os, const QuicPacketHeader& header) {
159 os << "{ destination_connection_id: " << header.destination_connection_id
160 << " ("
161 << (header.destination_connection_id_included == CONNECTION_ID_PRESENT
162 ? "present"
163 : "absent")
164 << "), source_connection_id: " << header.source_connection_id << " ("
165 << (header.source_connection_id_included == CONNECTION_ID_PRESENT
166 ? "present"
167 : "absent")
168 << "), packet_number_length: " << header.packet_number_length
169 << ", reset_flag: " << header.reset_flag
170 << ", version_flag: " << header.version_flag;
171 if (header.version_flag) {
172 os << ", version: " << ParsedQuicVersionToString(header.version);
173 if (header.long_packet_type != INVALID_PACKET_TYPE) {
174 os << ", long_packet_type: "
175 << QuicUtils::QuicLongHeaderTypetoString(header.long_packet_type);
176 }
177 if (header.retry_token_length_length != VARIABLE_LENGTH_INTEGER_LENGTH_0) {
178 os << ", retry_token_length_length: "
179 << static_cast<int>(header.retry_token_length_length);
180 }
181 if (header.retry_token.length() != 0) {
182 os << ", retry_token_length: " << header.retry_token.length();
183 }
184 if (header.length_length != VARIABLE_LENGTH_INTEGER_LENGTH_0) {
185 os << ", length_length: " << static_cast<int>(header.length_length);
186 }
187 if (header.remaining_packet_length != 0) {
188 os << ", remaining_packet_length: " << header.remaining_packet_length;
189 }
190 }
191 if (header.nonce != nullptr) {
192 os << ", diversification_nonce: "
193 << QuicTextUtils::HexEncode(
194 QuicStringPiece(header.nonce->data(), header.nonce->size()));
195 }
196 os << ", packet_number: " << header.packet_number << " }\n";
197 return os;
198}
199
200QuicData::QuicData(const char* buffer, size_t length)
201 : buffer_(buffer), length_(length), owns_buffer_(false) {}
202
203QuicData::QuicData(const char* buffer, size_t length, bool owns_buffer)
204 : buffer_(buffer), length_(length), owns_buffer_(owns_buffer) {}
205
206QuicData::~QuicData() {
207 if (owns_buffer_) {
208 delete[] const_cast<char*>(buffer_);
209 }
210}
211
212QuicPacket::QuicPacket(
213 char* buffer,
214 size_t length,
215 bool owns_buffer,
216 QuicConnectionIdLength destination_connection_id_length,
217 QuicConnectionIdLength source_connection_id_length,
218 bool includes_version,
219 bool includes_diversification_nonce,
220 QuicPacketNumberLength packet_number_length,
221 QuicVariableLengthIntegerLength retry_token_length_length,
222 QuicByteCount retry_token_length,
223 QuicVariableLengthIntegerLength length_length)
224 : QuicData(buffer, length, owns_buffer),
225 buffer_(buffer),
226 destination_connection_id_length_(destination_connection_id_length),
227 source_connection_id_length_(source_connection_id_length),
228 includes_version_(includes_version),
229 includes_diversification_nonce_(includes_diversification_nonce),
230 packet_number_length_(packet_number_length),
231 retry_token_length_length_(retry_token_length_length),
232 retry_token_length_(retry_token_length),
233 length_length_(length_length) {}
234
235QuicPacket::QuicPacket(QuicTransportVersion version,
236 char* buffer,
237 size_t length,
238 bool owns_buffer,
239 const QuicPacketHeader& header)
240 : QuicPacket(buffer,
241 length,
242 owns_buffer,
243 GetIncludedDestinationConnectionIdLength(header),
244 GetIncludedSourceConnectionIdLength(header),
245 header.version_flag,
246 header.nonce != nullptr,
247 header.packet_number_length,
248 header.retry_token_length_length,
249 header.retry_token.length(),
250 header.length_length) {}
251
252QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, size_t length)
253 : QuicData(buffer, length) {}
254
255QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer,
256 size_t length,
257 bool owns_buffer)
258 : QuicData(buffer, length, owns_buffer) {}
259
260std::unique_ptr<QuicEncryptedPacket> QuicEncryptedPacket::Clone() const {
261 char* buffer = new char[this->length()];
262 memcpy(buffer, this->data(), this->length());
263 return QuicMakeUnique<QuicEncryptedPacket>(buffer, this->length(), true);
264}
265
266std::ostream& operator<<(std::ostream& os, const QuicEncryptedPacket& s) {
267 os << s.length() << "-byte data";
268 return os;
269}
270
271QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
272 size_t length,
273 QuicTime receipt_time)
274 : QuicReceivedPacket(buffer,
275 length,
276 receipt_time,
277 false /* owns_buffer */) {}
278
279QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
280 size_t length,
281 QuicTime receipt_time,
282 bool owns_buffer)
283 : QuicReceivedPacket(buffer,
284 length,
285 receipt_time,
286 owns_buffer,
287 0 /* ttl */,
288 true /* ttl_valid */) {}
289
290QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
291 size_t length,
292 QuicTime receipt_time,
293 bool owns_buffer,
294 int ttl,
295 bool ttl_valid)
296 : quic::QuicReceivedPacket(buffer,
297 length,
298 receipt_time,
299 owns_buffer,
300 ttl,
301 ttl_valid,
302 nullptr /* packet_headers */,
303 0 /* headers_length */,
304 false /* owns_header_buffer */) {}
305
306QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
307 size_t length,
308 QuicTime receipt_time,
309 bool owns_buffer,
310 int ttl,
311 bool ttl_valid,
312 char* packet_headers,
313 size_t headers_length,
314 bool owns_header_buffer)
315 : QuicEncryptedPacket(buffer, length, owns_buffer),
316 receipt_time_(receipt_time),
317 ttl_(ttl_valid ? ttl : -1),
318 packet_headers_(packet_headers),
319 headers_length_(headers_length),
320 owns_header_buffer_(owns_header_buffer) {}
321
322QuicReceivedPacket::~QuicReceivedPacket() {
323 if (owns_header_buffer_) {
324 delete[] static_cast<char*>(packet_headers_);
325 }
326}
327
328std::unique_ptr<QuicReceivedPacket> QuicReceivedPacket::Clone() const {
329 char* buffer = new char[this->length()];
330 memcpy(buffer, this->data(), this->length());
331 if (this->packet_headers()) {
332 char* headers_buffer = new char[this->headers_length()];
333 memcpy(headers_buffer, this->packet_headers(), this->headers_length());
334 return QuicMakeUnique<QuicReceivedPacket>(
335 buffer, this->length(), receipt_time(), true, ttl(), ttl() >= 0,
336 headers_buffer, this->headers_length(), true);
337 }
338
339 return QuicMakeUnique<QuicReceivedPacket>(
340 buffer, this->length(), receipt_time(), true, ttl(), ttl() >= 0);
341}
342
343std::ostream& operator<<(std::ostream& os, const QuicReceivedPacket& s) {
344 os << s.length() << "-byte data";
345 return os;
346}
347
348QuicStringPiece QuicPacket::AssociatedData(QuicTransportVersion version) const {
349 return QuicStringPiece(
350 data(),
351 GetStartOfEncryptedData(version, destination_connection_id_length_,
352 source_connection_id_length_, includes_version_,
353 includes_diversification_nonce_,
354 packet_number_length_, retry_token_length_length_,
355 retry_token_length_, length_length_));
356}
357
358QuicStringPiece QuicPacket::Plaintext(QuicTransportVersion version) const {
359 const size_t start_of_encrypted_data = GetStartOfEncryptedData(
360 version, destination_connection_id_length_, source_connection_id_length_,
361 includes_version_, includes_diversification_nonce_, packet_number_length_,
362 retry_token_length_length_, retry_token_length_, length_length_);
363 return QuicStringPiece(data() + start_of_encrypted_data,
364 length() - start_of_encrypted_data);
365}
366
367SerializedPacket::SerializedPacket(QuicPacketNumber packet_number,
368 QuicPacketNumberLength packet_number_length,
369 const char* encrypted_buffer,
370 QuicPacketLength encrypted_length,
371 bool has_ack,
372 bool has_stop_waiting)
373 : encrypted_buffer(encrypted_buffer),
374 encrypted_length(encrypted_length),
375 has_crypto_handshake(NOT_HANDSHAKE),
376 num_padding_bytes(0),
377 packet_number(packet_number),
378 packet_number_length(packet_number_length),
QUICHE team6987b4a2019-03-15 16:23:04 -0700379 encryption_level(ENCRYPTION_INITIAL),
QUICHE teama6ef0a62019-03-07 20:34:33 -0500380 has_ack(has_ack),
381 has_stop_waiting(has_stop_waiting),
382 transmission_type(NOT_RETRANSMISSION) {}
383
384SerializedPacket::SerializedPacket(const SerializedPacket& other) = default;
385
386SerializedPacket& SerializedPacket::operator=(const SerializedPacket& other) =
387 default;
388
389SerializedPacket::SerializedPacket(SerializedPacket&& other)
390 : encrypted_buffer(other.encrypted_buffer),
391 encrypted_length(other.encrypted_length),
392 has_crypto_handshake(other.has_crypto_handshake),
393 num_padding_bytes(other.num_padding_bytes),
394 packet_number(other.packet_number),
395 packet_number_length(other.packet_number_length),
396 encryption_level(other.encryption_level),
397 has_ack(other.has_ack),
398 has_stop_waiting(other.has_stop_waiting),
399 transmission_type(other.transmission_type),
400 original_packet_number(other.original_packet_number),
401 largest_acked(other.largest_acked) {
402 retransmittable_frames.swap(other.retransmittable_frames);
403}
404
405SerializedPacket::~SerializedPacket() {}
406
407void ClearSerializedPacket(SerializedPacket* serialized_packet) {
408 if (!serialized_packet->retransmittable_frames.empty()) {
409 DeleteFrames(&serialized_packet->retransmittable_frames);
410 }
411 serialized_packet->encrypted_buffer = nullptr;
412 serialized_packet->encrypted_length = 0;
413 serialized_packet->largest_acked.Clear();
414}
415
416char* CopyBuffer(const SerializedPacket& packet) {
417 char* dst_buffer = new char[packet.encrypted_length];
418 memcpy(dst_buffer, packet.encrypted_buffer, packet.encrypted_length);
419 return dst_buffer;
420}
421
422} // namespace quic