| 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(bool include_version) { | 16 size_t GetPacketHeaderSize(QuicPacketHeader header) { |
| 17 return kPublicFlagsSize + kQuicGuidSize + | 17 return GetPacketHeaderSize(header.public_header.guid_length, |
| 18 header.public_header.version_flag, |
| 19 header.is_in_fec_group); |
| 20 } |
| 21 |
| 22 size_t GetPacketHeaderSize(QuicGuidLength guid_length, |
| 23 bool include_version, |
| 24 InFecGroup is_in_fec_group) { |
| 25 return kPublicFlagsSize + guid_length + |
| 18 (include_version ? kQuicVersionSize : 0) + kSequenceNumberSize + | 26 (include_version ? kQuicVersionSize : 0) + kSequenceNumberSize + |
| 19 kPrivateFlagsSize + kFecGroupSize; | 27 kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0); |
| 20 } | 28 } |
| 21 | 29 |
| 22 size_t GetPublicResetPacketSize() { | 30 size_t GetPublicResetPacketSize() { |
| 23 return kPublicFlagsSize + kQuicGuidSize + kPublicResetNonceSize + | 31 return kPublicFlagsSize + PACKET_8BYTE_GUID + kPublicResetNonceSize + |
| 24 kSequenceNumberSize; | 32 kSequenceNumberSize; |
| 25 } | 33 } |
| 26 | 34 |
| 27 size_t GetStartOfFecProtectedData(bool include_version) { | 35 size_t GetStartOfFecProtectedData(QuicGuidLength guid_length, |
| 28 return GetPacketHeaderSize(include_version); | 36 bool include_version) { |
| 37 return GetPacketHeaderSize(guid_length, include_version, IN_FEC_GROUP); |
| 29 } | 38 } |
| 30 | 39 |
| 31 size_t GetStartOfEncryptedData(bool include_version) { | 40 size_t GetStartOfEncryptedData(QuicGuidLength guid_length, |
| 32 return GetPacketHeaderSize(include_version) - kPrivateFlagsSize - | 41 bool include_version) { |
| 33 kFecGroupSize; | 42 // Don't include the fec size, since encryption starts before private flags. |
| 43 return GetPacketHeaderSize(guid_length, include_version, NOT_IN_FEC_GROUP) - |
| 44 kPrivateFlagsSize; |
| 34 } | 45 } |
| 35 | 46 |
| 36 uint32 MakeQuicTag(char a, char b, char c, char d) { | 47 uint32 MakeQuicTag(char a, char b, char c, char d) { |
| 37 return static_cast<uint32>(a) | | 48 return static_cast<uint32>(a) | |
| 38 static_cast<uint32>(b) << 8 | | 49 static_cast<uint32>(b) << 8 | |
| 39 static_cast<uint32>(c) << 16 | | 50 static_cast<uint32>(c) << 16 | |
| 40 static_cast<uint32>(d) << 24; | 51 static_cast<uint32>(d) << 24; |
| 41 } | 52 } |
| 42 | 53 |
| 43 QuicPacketPublicHeader::QuicPacketPublicHeader() | 54 QuicPacketPublicHeader::QuicPacketPublicHeader() |
| 44 : guid(0), | 55 : guid(0), |
| 56 guid_length(PACKET_8BYTE_GUID), |
| 45 reset_flag(false), | 57 reset_flag(false), |
| 46 version_flag(false) { | 58 version_flag(false) { |
| 47 } | 59 } |
| 48 | 60 |
| 49 QuicPacketPublicHeader::QuicPacketPublicHeader( | 61 QuicPacketPublicHeader::QuicPacketPublicHeader( |
| 50 const QuicPacketPublicHeader& other) | 62 const QuicPacketPublicHeader& other) |
| 51 : guid(other.guid), | 63 : guid(other.guid), |
| 64 guid_length(other.guid_length), |
| 52 reset_flag(other.reset_flag), | 65 reset_flag(other.reset_flag), |
| 53 version_flag(other.version_flag), | 66 version_flag(other.version_flag), |
| 54 versions(other.versions) { | 67 versions(other.versions) { |
| 55 } | 68 } |
| 56 | 69 |
| 57 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} | 70 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} |
| 58 | 71 |
| 59 QuicPacketPublicHeader& QuicPacketPublicHeader::operator=( | 72 QuicPacketPublicHeader& QuicPacketPublicHeader::operator=( |
| 60 const QuicPacketPublicHeader& other) { | 73 const QuicPacketPublicHeader& other) { |
| 61 guid = other.guid; | 74 guid = other.guid; |
| 62 reset_flag = other.reset_flag; | 75 reset_flag = other.reset_flag; |
| 63 version_flag = other.version_flag; | 76 version_flag = other.version_flag; |
| 64 versions = other.versions; | 77 versions = other.versions; |
| 65 return *this; | 78 return *this; |
| 66 } | 79 } |
| 67 | 80 |
| 68 QuicPacketHeader::QuicPacketHeader() | 81 QuicPacketHeader::QuicPacketHeader() |
| 69 : fec_flag(false), | 82 : fec_flag(false), |
| 70 fec_entropy_flag(false), | |
| 71 entropy_flag(false), | 83 entropy_flag(false), |
| 72 entropy_hash(0), | 84 entropy_hash(0), |
| 73 packet_sequence_number(0), | 85 packet_sequence_number(0), |
| 86 is_in_fec_group(NOT_IN_FEC_GROUP), |
| 74 fec_group(0) { | 87 fec_group(0) { |
| 75 } | 88 } |
| 76 | 89 |
| 77 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) | 90 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) |
| 78 : public_header(header), | 91 : public_header(header), |
| 79 fec_flag(false), | 92 fec_flag(false), |
| 80 fec_entropy_flag(false), | |
| 81 entropy_flag(false), | 93 entropy_flag(false), |
| 82 entropy_hash(0), | 94 entropy_hash(0), |
| 83 packet_sequence_number(0), | 95 packet_sequence_number(0), |
| 96 is_in_fec_group(NOT_IN_FEC_GROUP), |
| 84 fec_group(0) { | 97 fec_group(0) { |
| 85 } | 98 } |
| 86 | 99 |
| 87 QuicStreamFrame::QuicStreamFrame() {} | 100 QuicStreamFrame::QuicStreamFrame() {} |
| 88 | 101 |
| 89 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, | 102 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, |
| 90 bool fin, | 103 bool fin, |
| 91 QuicStreamOffset offset, | 104 QuicStreamOffset offset, |
| 92 StringPiece data) | 105 StringPiece data) |
| 93 : stream_id(stream_id), | 106 : stream_id(stream_id), |
| 94 fin(fin), | 107 fin(fin), |
| 95 offset(offset), | 108 offset(offset), |
| 96 data(data) { | 109 data(data) { |
| 97 } | 110 } |
| 98 | 111 |
| 99 ostream& operator<<(ostream& os, const QuicPacketHeader& header) { | 112 ostream& operator<<(ostream& os, const QuicPacketHeader& header) { |
| 100 os << "{ guid: " << header.public_header.guid | 113 os << "{ guid: " << header.public_header.guid |
| 114 << ", guid_length:" << header.public_header.guid_length |
| 101 << ", reset_flag: " << header.public_header.reset_flag | 115 << ", reset_flag: " << header.public_header.reset_flag |
| 102 << ", version_flag: " << header.public_header.version_flag; | 116 << ", version_flag: " << header.public_header.version_flag; |
| 103 if (header.public_header.version_flag) { | 117 if (header.public_header.version_flag) { |
| 104 os << " version: "; | 118 os << " version: "; |
| 105 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { | 119 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { |
| 106 os << header.public_header.versions[0] << " "; | 120 os << header.public_header.versions[0] << " "; |
| 107 } | 121 } |
| 108 } | 122 } |
| 109 os << ", fec_flag: " << header.fec_flag | 123 os << ", fec_flag: " << header.fec_flag |
| 110 << ", entropy_flag: " << header.entropy_flag | 124 << ", entropy_flag: " << header.entropy_flag |
| 111 << ", entropy hash: " << static_cast<int>(header.entropy_hash) | 125 << ", entropy hash: " << static_cast<int>(header.entropy_hash) |
| 112 << ", sequence_number: " << header.packet_sequence_number | 126 << ", sequence_number: " << header.packet_sequence_number |
| 127 << ", is_in_fec_group:" << header.is_in_fec_group |
| 113 << ", fec_group: " << header.fec_group<< "}\n"; | 128 << ", fec_group: " << header.fec_group<< "}\n"; |
| 114 return os; | 129 return os; |
| 115 } | 130 } |
| 116 | 131 |
| 117 // TODO(ianswett): Initializing largest_observed to 0 should not be necessary. | 132 // TODO(ianswett): Initializing largest_observed to 0 should not be necessary. |
| 118 ReceivedPacketInfo::ReceivedPacketInfo() | 133 ReceivedPacketInfo::ReceivedPacketInfo() |
| 119 : largest_observed(0), | 134 : largest_observed(0), |
| 120 delta_time_largest_observed(QuicTime::Delta::Infinite()) { | 135 delta_time_largest_observed(QuicTime::Delta::Infinite()) { |
| 121 } | 136 } |
| 122 | 137 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 return true; | 261 return true; |
| 247 } | 262 } |
| 248 | 263 |
| 249 QuicData::~QuicData() { | 264 QuicData::~QuicData() { |
| 250 if (owns_buffer_) { | 265 if (owns_buffer_) { |
| 251 delete [] const_cast<char*>(buffer_); | 266 delete [] const_cast<char*>(buffer_); |
| 252 } | 267 } |
| 253 } | 268 } |
| 254 | 269 |
| 255 StringPiece QuicPacket::FecProtectedData() const { | 270 StringPiece QuicPacket::FecProtectedData() const { |
| 256 const size_t start_of_fec = GetStartOfFecProtectedData(includes_version_); | 271 const size_t start_of_fec = GetStartOfFecProtectedData(guid_length_, |
| 272 includes_version_); |
| 257 return StringPiece(data() + start_of_fec, length() - start_of_fec); | 273 return StringPiece(data() + start_of_fec, length() - start_of_fec); |
| 258 } | 274 } |
| 259 | 275 |
| 260 StringPiece QuicPacket::AssociatedData() const { | 276 StringPiece QuicPacket::AssociatedData() const { |
| 261 return StringPiece(data() + kStartOfHashData, | 277 return StringPiece(data() + kStartOfHashData, |
| 262 GetStartOfEncryptedData(includes_version_) - | 278 GetStartOfEncryptedData(guid_length_, includes_version_) - |
| 263 kStartOfHashData); | 279 kStartOfHashData); |
| 264 } | 280 } |
| 265 | 281 |
| 266 StringPiece QuicPacket::BeforePlaintext() const { | 282 StringPiece QuicPacket::BeforePlaintext() const { |
| 267 return StringPiece(data(), GetStartOfEncryptedData(includes_version_)); | 283 return StringPiece(data(), GetStartOfEncryptedData(guid_length_, |
| 284 includes_version_)); |
| 268 } | 285 } |
| 269 | 286 |
| 270 StringPiece QuicPacket::Plaintext() const { | 287 StringPiece QuicPacket::Plaintext() const { |
| 271 const size_t start_of_encrypted_data = | 288 const size_t start_of_encrypted_data = |
| 272 GetStartOfEncryptedData(includes_version_); | 289 GetStartOfEncryptedData(guid_length_, includes_version_); |
| 273 return StringPiece(data() + start_of_encrypted_data, | 290 return StringPiece(data() + start_of_encrypted_data, |
| 274 length() - start_of_encrypted_data); | 291 length() - start_of_encrypted_data); |
| 275 } | 292 } |
| 276 | 293 |
| 277 RetransmittableFrames::RetransmittableFrames() | 294 RetransmittableFrames::RetransmittableFrames() |
| 278 : encryption_level_(NUM_ENCRYPTION_LEVELS) { | 295 : encryption_level_(NUM_ENCRYPTION_LEVELS) { |
| 279 } | 296 } |
| 280 | 297 |
| 281 RetransmittableFrames::~RetransmittableFrames() { | 298 RetransmittableFrames::~RetransmittableFrames() { |
| 282 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { | 299 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 return os; | 354 return os; |
| 338 } | 355 } |
| 339 | 356 |
| 340 ostream& operator<<(ostream& os, const QuicConsumedData& s) { | 357 ostream& operator<<(ostream& os, const QuicConsumedData& s) { |
| 341 os << "bytes_consumed: " << s.bytes_consumed | 358 os << "bytes_consumed: " << s.bytes_consumed |
| 342 << " fin_consumed: " << s.fin_consumed; | 359 << " fin_consumed: " << s.fin_consumed; |
| 343 return os; | 360 return os; |
| 344 } | 361 } |
| 345 | 362 |
| 346 } // namespace net | 363 } // namespace net |
| OLD | NEW |