Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(245)

Side by Side Diff: net/quic/core/quic_packets.cc

Issue 2547583002: Landing Recent QUIC changes until Fri Nov 18 23:21:04 2016 +0000 (Closed)
Patch Set: Remove explicit HTTP/2 enum usage Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/core/quic_packets.h ('k') | net/quic/core/quic_pending_retransmission.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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 "net/quic/core/quic_packets.h"
6
7 #include "base/memory/ptr_util.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "net/quic/core/quic_flags.h"
10 #include "net/quic/core/quic_utils.h"
11 #include "net/quic/core/quic_versions.h"
12
13 using base::StringPiece;
14 using std::map;
15 using std::numeric_limits;
16 using std::ostream;
17 using std::string;
18
19 namespace net {
20
21 size_t GetPacketHeaderSize(QuicVersion version,
22 const QuicPacketHeader& header) {
23 return GetPacketHeaderSize(version, header.public_header.connection_id_length,
24 header.public_header.version_flag,
25 header.public_header.multipath_flag,
26 header.public_header.nonce != nullptr,
27 header.public_header.packet_number_length);
28 }
29
30 size_t GetPacketHeaderSize(QuicVersion version,
31 QuicConnectionIdLength connection_id_length,
32 bool include_version,
33 bool include_path_id,
34 bool include_diversification_nonce,
35 QuicPacketNumberLength packet_number_length) {
36 return kPublicFlagsSize + connection_id_length +
37 (include_version ? kQuicVersionSize : 0) +
38 (include_path_id ? kQuicPathIdSize : 0) + packet_number_length +
39 (include_diversification_nonce ? kDiversificationNonceSize : 0);
40 }
41
42 size_t GetStartOfEncryptedData(QuicVersion version,
43 const QuicPacketHeader& header) {
44 return GetPacketHeaderSize(version, header);
45 }
46
47 size_t GetStartOfEncryptedData(QuicVersion version,
48 QuicConnectionIdLength connection_id_length,
49 bool include_version,
50 bool include_path_id,
51 bool include_diversification_nonce,
52 QuicPacketNumberLength packet_number_length) {
53 // Encryption starts before private flags.
54 return GetPacketHeaderSize(version, connection_id_length, include_version,
55 include_path_id, include_diversification_nonce,
56 packet_number_length);
57 }
58
59 QuicPacketPublicHeader::QuicPacketPublicHeader()
60 : connection_id(0),
61 connection_id_length(PACKET_8BYTE_CONNECTION_ID),
62 multipath_flag(false),
63 reset_flag(false),
64 version_flag(false),
65 packet_number_length(PACKET_6BYTE_PACKET_NUMBER),
66 nonce(nullptr) {}
67
68 QuicPacketPublicHeader::QuicPacketPublicHeader(
69 const QuicPacketPublicHeader& other) = default;
70
71 QuicPacketPublicHeader::~QuicPacketPublicHeader() {}
72
73 QuicPacketHeader::QuicPacketHeader()
74 : packet_number(0), path_id(kDefaultPathId) {}
75
76 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header)
77 : public_header(header), packet_number(0), path_id(kDefaultPathId) {}
78
79 QuicPacketHeader::QuicPacketHeader(const QuicPacketHeader& other) = default;
80
81 QuicPublicResetPacket::QuicPublicResetPacket()
82 : nonce_proof(0), rejected_packet_number(0) {}
83
84 QuicPublicResetPacket::QuicPublicResetPacket(
85 const QuicPacketPublicHeader& header)
86 : public_header(header), nonce_proof(0), rejected_packet_number(0) {}
87
88 ostream& operator<<(ostream& os, const QuicPacketHeader& header) {
89 os << "{ connection_id: " << header.public_header.connection_id
90 << ", connection_id_length: " << header.public_header.connection_id_length
91 << ", packet_number_length: " << header.public_header.packet_number_length
92 << ", multipath_flag: " << header.public_header.multipath_flag
93 << ", reset_flag: " << header.public_header.reset_flag
94 << ", version_flag: " << header.public_header.version_flag;
95 if (header.public_header.version_flag) {
96 os << ", version:";
97 for (size_t i = 0; i < header.public_header.versions.size(); ++i) {
98 os << " ";
99 os << QuicVersionToString(header.public_header.versions[i]);
100 }
101 }
102 if (header.public_header.nonce != nullptr) {
103 os << ", diversification_nonce: "
104 << QuicUtils::HexEncode(StringPiece(header.public_header.nonce->data(),
105 header.public_header.nonce->size()));
106 }
107 os << ", path_id: " << static_cast<int>(header.path_id)
108 << ", packet_number: " << header.packet_number << " }\n";
109 return os;
110 }
111
112 QuicData::QuicData(const char* buffer, size_t length)
113 : buffer_(buffer), length_(length), owns_buffer_(false) {}
114
115 QuicData::QuicData(const char* buffer, size_t length, bool owns_buffer)
116 : buffer_(buffer), length_(length), owns_buffer_(owns_buffer) {}
117
118 QuicData::~QuicData() {
119 if (owns_buffer_) {
120 delete[] const_cast<char*>(buffer_);
121 }
122 }
123
124 QuicPacket::QuicPacket(char* buffer,
125 size_t length,
126 bool owns_buffer,
127 QuicConnectionIdLength connection_id_length,
128 bool includes_version,
129 bool includes_path_id,
130 bool includes_diversification_nonce,
131 QuicPacketNumberLength packet_number_length)
132 : QuicData(buffer, length, owns_buffer),
133 buffer_(buffer),
134 connection_id_length_(connection_id_length),
135 includes_version_(includes_version),
136 includes_path_id_(includes_path_id),
137 includes_diversification_nonce_(includes_diversification_nonce),
138 packet_number_length_(packet_number_length) {}
139
140 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, size_t length)
141 : QuicData(buffer, length) {}
142
143 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer,
144 size_t length,
145 bool owns_buffer)
146 : QuicData(buffer, length, owns_buffer) {}
147
148 std::unique_ptr<QuicEncryptedPacket> QuicEncryptedPacket::Clone() const {
149 char* buffer = new char[this->length()];
150 memcpy(buffer, this->data(), this->length());
151 return base::MakeUnique<QuicEncryptedPacket>(buffer, this->length(), true);
152 }
153
154 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) {
155 os << s.length() << "-byte data";
156 return os;
157 }
158
159 QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
160 size_t length,
161 QuicTime receipt_time)
162 : QuicEncryptedPacket(buffer, length),
163 receipt_time_(receipt_time),
164 ttl_(0) {}
165
166 QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
167 size_t length,
168 QuicTime receipt_time,
169 bool owns_buffer)
170 : QuicEncryptedPacket(buffer, length, owns_buffer),
171 receipt_time_(receipt_time),
172 ttl_(0) {}
173
174 QuicReceivedPacket::QuicReceivedPacket(const char* buffer,
175 size_t length,
176 QuicTime receipt_time,
177 bool owns_buffer,
178 int ttl,
179 bool ttl_valid)
180 : QuicEncryptedPacket(buffer, length, owns_buffer),
181 receipt_time_(receipt_time),
182 ttl_(ttl_valid ? ttl : -1) {}
183
184 std::unique_ptr<QuicReceivedPacket> QuicReceivedPacket::Clone() const {
185 char* buffer = new char[this->length()];
186 memcpy(buffer, this->data(), this->length());
187 return base::MakeUnique<QuicReceivedPacket>(
188 buffer, this->length(), receipt_time(), true, ttl(), ttl() >= 0);
189 }
190
191 ostream& operator<<(ostream& os, const QuicReceivedPacket& s) {
192 os << s.length() << "-byte data";
193 return os;
194 }
195
196 StringPiece QuicPacket::AssociatedData(QuicVersion version) const {
197 return StringPiece(
198 data(), GetStartOfEncryptedData(version, connection_id_length_,
199 includes_version_, includes_path_id_,
200 includes_diversification_nonce_,
201 packet_number_length_));
202 }
203
204 StringPiece QuicPacket::Plaintext(QuicVersion version) const {
205 const size_t start_of_encrypted_data = GetStartOfEncryptedData(
206 version, connection_id_length_, includes_version_, includes_path_id_,
207 includes_diversification_nonce_, packet_number_length_);
208 return StringPiece(data() + start_of_encrypted_data,
209 length() - start_of_encrypted_data);
210 }
211
212 SerializedPacket::SerializedPacket(QuicPathId path_id,
213 QuicPacketNumber packet_number,
214 QuicPacketNumberLength packet_number_length,
215 const char* encrypted_buffer,
216 QuicPacketLength encrypted_length,
217 bool has_ack,
218 bool has_stop_waiting)
219 : encrypted_buffer(encrypted_buffer),
220 encrypted_length(encrypted_length),
221 has_crypto_handshake(NOT_HANDSHAKE),
222 num_padding_bytes(0),
223 path_id(path_id),
224 packet_number(packet_number),
225 packet_number_length(packet_number_length),
226 encryption_level(ENCRYPTION_NONE),
227 has_ack(has_ack),
228 has_stop_waiting(has_stop_waiting),
229 transmission_type(NOT_RETRANSMISSION),
230 original_path_id(kInvalidPathId),
231 original_packet_number(0) {}
232
233 SerializedPacket::SerializedPacket(const SerializedPacket& other) = default;
234
235 SerializedPacket::~SerializedPacket() {}
236
237 void ClearSerializedPacket(SerializedPacket* serialized_packet) {
238 if (!serialized_packet->retransmittable_frames.empty()) {
239 DeleteFrames(&serialized_packet->retransmittable_frames);
240 }
241 serialized_packet->encrypted_buffer = nullptr;
242 serialized_packet->encrypted_length = 0;
243 }
244
245 char* CopyBuffer(const SerializedPacket& packet) {
246 char* dst_buffer = new char[packet.encrypted_length];
247 memcpy(dst_buffer, packet.encrypted_buffer, packet.encrypted_length);
248 return dst_buffer;
249 }
250
251 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_packets.h ('k') | net/quic/core/quic_pending_retransmission.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698