OLD | NEW |
| (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_protocol.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 AckListenerWrapper::AckListenerWrapper(QuicAckListenerInterface* listener, | |
213 QuicPacketLength data_length) | |
214 : ack_listener(listener), length(data_length) { | |
215 DCHECK(listener != nullptr); | |
216 } | |
217 | |
218 AckListenerWrapper::AckListenerWrapper(const AckListenerWrapper& other) = | |
219 default; | |
220 | |
221 AckListenerWrapper::~AckListenerWrapper() {} | |
222 | |
223 SerializedPacket::SerializedPacket(QuicPathId path_id, | |
224 QuicPacketNumber packet_number, | |
225 QuicPacketNumberLength packet_number_length, | |
226 const char* encrypted_buffer, | |
227 QuicPacketLength encrypted_length, | |
228 bool has_ack, | |
229 bool has_stop_waiting) | |
230 : encrypted_buffer(encrypted_buffer), | |
231 encrypted_length(encrypted_length), | |
232 has_crypto_handshake(NOT_HANDSHAKE), | |
233 num_padding_bytes(0), | |
234 path_id(path_id), | |
235 packet_number(packet_number), | |
236 packet_number_length(packet_number_length), | |
237 encryption_level(ENCRYPTION_NONE), | |
238 has_ack(has_ack), | |
239 has_stop_waiting(has_stop_waiting), | |
240 transmission_type(NOT_RETRANSMISSION), | |
241 original_path_id(kInvalidPathId), | |
242 original_packet_number(0) {} | |
243 | |
244 SerializedPacket::SerializedPacket(const SerializedPacket& other) = default; | |
245 | |
246 SerializedPacket::~SerializedPacket() {} | |
247 | |
248 TransmissionInfo::TransmissionInfo() | |
249 : encryption_level(ENCRYPTION_NONE), | |
250 packet_number_length(PACKET_1BYTE_PACKET_NUMBER), | |
251 bytes_sent(0), | |
252 sent_time(QuicTime::Zero()), | |
253 transmission_type(NOT_RETRANSMISSION), | |
254 in_flight(false), | |
255 is_unackable(false), | |
256 has_crypto_handshake(false), | |
257 num_padding_bytes(0), | |
258 retransmission(0) {} | |
259 | |
260 void ClearSerializedPacket(SerializedPacket* serialized_packet) { | |
261 if (!serialized_packet->retransmittable_frames.empty()) { | |
262 DeleteFrames(&serialized_packet->retransmittable_frames); | |
263 } | |
264 serialized_packet->encrypted_buffer = nullptr; | |
265 serialized_packet->encrypted_length = 0; | |
266 } | |
267 | |
268 char* CopyBuffer(const SerializedPacket& packet) { | |
269 char* dst_buffer = new char[packet.encrypted_length]; | |
270 memcpy(dst_buffer, packet.encrypted_buffer, packet.encrypted_length); | |
271 return dst_buffer; | |
272 } | |
273 | |
274 TransmissionInfo::TransmissionInfo(EncryptionLevel level, | |
275 QuicPacketNumberLength packet_number_length, | |
276 TransmissionType transmission_type, | |
277 QuicTime sent_time, | |
278 QuicPacketLength bytes_sent, | |
279 bool has_crypto_handshake, | |
280 int num_padding_bytes) | |
281 : encryption_level(level), | |
282 packet_number_length(packet_number_length), | |
283 bytes_sent(bytes_sent), | |
284 sent_time(sent_time), | |
285 transmission_type(transmission_type), | |
286 in_flight(false), | |
287 is_unackable(false), | |
288 has_crypto_handshake(has_crypto_handshake), | |
289 num_padding_bytes(num_padding_bytes), | |
290 retransmission(0) {} | |
291 | |
292 TransmissionInfo::TransmissionInfo(const TransmissionInfo& other) = default; | |
293 | |
294 TransmissionInfo::~TransmissionInfo() {} | |
295 | |
296 } // namespace net | |
OLD | NEW |