OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_protocol.h" | 5 #include "net/quic/quic_protocol.h" |
6 #include "base/stl_util.h" | 6 #include "base/stl_util.h" |
7 | 7 |
8 using base::StringPiece; | 8 using base::StringPiece; |
9 using std::map; | 9 using std::map; |
10 using std::numeric_limits; | 10 using std::numeric_limits; |
11 using std::ostream; | 11 using std::ostream; |
12 using std::string; | 12 using std::string; |
13 | 13 |
14 namespace net { | 14 namespace net { |
15 | 15 |
16 size_t GetPacketHeaderSize(QuicPacketHeader header) { | 16 size_t GetPacketHeaderSize(QuicPacketHeader header) { |
17 return GetPacketHeaderSize(header.public_header.guid_length, | 17 return GetPacketHeaderSize(header.public_header.guid_length, |
18 header.public_header.version_flag, | 18 header.public_header.version_flag, |
| 19 header.public_header.sequence_number_length, |
19 header.is_in_fec_group); | 20 header.is_in_fec_group); |
20 } | 21 } |
21 | 22 |
22 size_t GetPacketHeaderSize(QuicGuidLength guid_length, | 23 size_t GetPacketHeaderSize(QuicGuidLength guid_length, |
23 bool include_version, | 24 bool include_version, |
| 25 QuicSequenceNumberLength sequence_number_length, |
24 InFecGroup is_in_fec_group) { | 26 InFecGroup is_in_fec_group) { |
25 return kPublicFlagsSize + guid_length + | 27 return kPublicFlagsSize + guid_length + |
26 (include_version ? kQuicVersionSize : 0) + kSequenceNumberSize + | 28 (include_version ? kQuicVersionSize : 0) + sequence_number_length + |
27 kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0); | 29 kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0); |
28 } | 30 } |
29 | 31 |
30 size_t GetPublicResetPacketSize() { | 32 size_t GetPublicResetPacketSize() { |
31 return kPublicFlagsSize + PACKET_8BYTE_GUID + kPublicResetNonceSize + | 33 return kPublicFlagsSize + PACKET_8BYTE_GUID + kPublicResetNonceSize + |
32 kSequenceNumberSize; | 34 PACKET_6BYTE_SEQUENCE_NUMBER; |
33 } | 35 } |
34 | 36 |
35 size_t GetStartOfFecProtectedData(QuicGuidLength guid_length, | 37 size_t GetStartOfFecProtectedData( |
36 bool include_version) { | 38 QuicGuidLength guid_length, |
37 return GetPacketHeaderSize(guid_length, include_version, IN_FEC_GROUP); | 39 bool include_version, |
| 40 QuicSequenceNumberLength sequence_number_length) { |
| 41 return GetPacketHeaderSize( |
| 42 guid_length, include_version, sequence_number_length, IN_FEC_GROUP); |
38 } | 43 } |
39 | 44 |
40 size_t GetStartOfEncryptedData(QuicGuidLength guid_length, | 45 size_t GetStartOfEncryptedData( |
41 bool include_version) { | 46 QuicGuidLength guid_length, |
| 47 bool include_version, |
| 48 QuicSequenceNumberLength sequence_number_length) { |
42 // Don't include the fec size, since encryption starts before private flags. | 49 // Don't include the fec size, since encryption starts before private flags. |
43 return GetPacketHeaderSize(guid_length, include_version, NOT_IN_FEC_GROUP) - | 50 return GetPacketHeaderSize( |
| 51 guid_length, include_version, sequence_number_length, NOT_IN_FEC_GROUP) - |
44 kPrivateFlagsSize; | 52 kPrivateFlagsSize; |
45 } | 53 } |
46 | 54 |
47 uint32 MakeQuicTag(char a, char b, char c, char d) { | 55 uint32 MakeQuicTag(char a, char b, char c, char d) { |
48 return static_cast<uint32>(a) | | 56 return static_cast<uint32>(a) | |
49 static_cast<uint32>(b) << 8 | | 57 static_cast<uint32>(b) << 8 | |
50 static_cast<uint32>(c) << 16 | | 58 static_cast<uint32>(c) << 16 | |
51 static_cast<uint32>(d) << 24; | 59 static_cast<uint32>(d) << 24; |
52 } | 60 } |
53 | 61 |
54 QuicPacketPublicHeader::QuicPacketPublicHeader() | 62 QuicPacketPublicHeader::QuicPacketPublicHeader() |
55 : guid(0), | 63 : guid(0), |
56 guid_length(PACKET_8BYTE_GUID), | 64 guid_length(PACKET_8BYTE_GUID), |
57 reset_flag(false), | 65 reset_flag(false), |
58 version_flag(false) { | 66 version_flag(false), |
| 67 sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) { |
59 } | 68 } |
60 | 69 |
61 QuicPacketPublicHeader::QuicPacketPublicHeader( | 70 QuicPacketPublicHeader::QuicPacketPublicHeader( |
62 const QuicPacketPublicHeader& other) | 71 const QuicPacketPublicHeader& other) |
63 : guid(other.guid), | 72 : guid(other.guid), |
64 guid_length(other.guid_length), | 73 guid_length(other.guid_length), |
65 reset_flag(other.reset_flag), | 74 reset_flag(other.reset_flag), |
66 version_flag(other.version_flag), | 75 version_flag(other.version_flag), |
| 76 sequence_number_length(other.sequence_number_length), |
67 versions(other.versions) { | 77 versions(other.versions) { |
68 } | 78 } |
69 | 79 |
70 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} | 80 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} |
71 | 81 |
72 QuicPacketPublicHeader& QuicPacketPublicHeader::operator=( | 82 QuicPacketPublicHeader& QuicPacketPublicHeader::operator=( |
73 const QuicPacketPublicHeader& other) { | 83 const QuicPacketPublicHeader& other) { |
74 guid = other.guid; | 84 guid = other.guid; |
75 reset_flag = other.reset_flag; | 85 reset_flag = other.reset_flag; |
76 version_flag = other.version_flag; | 86 version_flag = other.version_flag; |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 QuicStreamId last_good_stream_id, | 254 QuicStreamId last_good_stream_id, |
245 const string& reason) | 255 const string& reason) |
246 : error_code(error_code), | 256 : error_code(error_code), |
247 last_good_stream_id(last_good_stream_id), | 257 last_good_stream_id(last_good_stream_id), |
248 reason_phrase(reason) { | 258 reason_phrase(reason) { |
249 DCHECK_LE(error_code, numeric_limits<uint8>::max()); | 259 DCHECK_LE(error_code, numeric_limits<uint8>::max()); |
250 } | 260 } |
251 | 261 |
252 QuicFecData::QuicFecData() {} | 262 QuicFecData::QuicFecData() {} |
253 | 263 |
254 bool QuicFecData::operator==(const QuicFecData& other) const { | |
255 if (fec_group != other.fec_group) { | |
256 return false; | |
257 } | |
258 if (redundancy != other.redundancy) { | |
259 return false; | |
260 } | |
261 return true; | |
262 } | |
263 | |
264 QuicData::~QuicData() { | 264 QuicData::~QuicData() { |
265 if (owns_buffer_) { | 265 if (owns_buffer_) { |
266 delete [] const_cast<char*>(buffer_); | 266 delete [] const_cast<char*>(buffer_); |
267 } | 267 } |
268 } | 268 } |
269 | 269 |
270 StringPiece QuicPacket::FecProtectedData() const { | 270 StringPiece QuicPacket::FecProtectedData() const { |
271 const size_t start_of_fec = GetStartOfFecProtectedData(guid_length_, | 271 const size_t start_of_fec = GetStartOfFecProtectedData( |
272 includes_version_); | 272 guid_length_, includes_version_, sequence_number_length_); |
273 return StringPiece(data() + start_of_fec, length() - start_of_fec); | 273 return StringPiece(data() + start_of_fec, length() - start_of_fec); |
274 } | 274 } |
275 | 275 |
276 StringPiece QuicPacket::AssociatedData() const { | 276 StringPiece QuicPacket::AssociatedData() const { |
277 return StringPiece(data() + kStartOfHashData, | 277 return StringPiece( |
278 GetStartOfEncryptedData(guid_length_, includes_version_) - | 278 data() + kStartOfHashData, |
279 kStartOfHashData); | 279 GetStartOfEncryptedData( |
| 280 guid_length_, includes_version_, sequence_number_length_) - |
| 281 kStartOfHashData); |
280 } | 282 } |
281 | 283 |
282 StringPiece QuicPacket::BeforePlaintext() const { | 284 StringPiece QuicPacket::BeforePlaintext() const { |
283 return StringPiece(data(), GetStartOfEncryptedData(guid_length_, | 285 return StringPiece(data(), GetStartOfEncryptedData(guid_length_, |
284 includes_version_)); | 286 includes_version_, |
| 287 sequence_number_length_)); |
285 } | 288 } |
286 | 289 |
287 StringPiece QuicPacket::Plaintext() const { | 290 StringPiece QuicPacket::Plaintext() const { |
288 const size_t start_of_encrypted_data = | 291 const size_t start_of_encrypted_data = |
289 GetStartOfEncryptedData(guid_length_, includes_version_); | 292 GetStartOfEncryptedData( |
| 293 guid_length_, includes_version_, sequence_number_length_); |
290 return StringPiece(data() + start_of_encrypted_data, | 294 return StringPiece(data() + start_of_encrypted_data, |
291 length() - start_of_encrypted_data); | 295 length() - start_of_encrypted_data); |
292 } | 296 } |
293 | 297 |
294 RetransmittableFrames::RetransmittableFrames() | 298 RetransmittableFrames::RetransmittableFrames() |
295 : encryption_level_(NUM_ENCRYPTION_LEVELS) { | 299 : encryption_level_(NUM_ENCRYPTION_LEVELS) { |
296 } | 300 } |
297 | 301 |
298 RetransmittableFrames::~RetransmittableFrames() { | 302 RetransmittableFrames::~RetransmittableFrames() { |
299 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { | 303 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 return os; | 358 return os; |
355 } | 359 } |
356 | 360 |
357 ostream& operator<<(ostream& os, const QuicConsumedData& s) { | 361 ostream& operator<<(ostream& os, const QuicConsumedData& s) { |
358 os << "bytes_consumed: " << s.bytes_consumed | 362 os << "bytes_consumed: " << s.bytes_consumed |
359 << " fin_consumed: " << s.fin_consumed; | 363 << " fin_consumed: " << s.fin_consumed; |
360 return os; | 364 return os; |
361 } | 365 } |
362 | 366 |
363 } // namespace net | 367 } // namespace net |
OLD | NEW |