| 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 | 6 |
| 7 #include "base/stl_util.h" | 7 #include "base/stl_util.h" |
| 8 #include "net/quic/quic_utils.h" | 8 #include "net/quic/quic_utils.h" |
| 9 | 9 |
| 10 using base::StringPiece; | 10 using base::StringPiece; |
| 11 using std::map; | 11 using std::map; |
| 12 using std::numeric_limits; | 12 using std::numeric_limits; |
| 13 using std::ostream; | 13 using std::ostream; |
| 14 using std::string; | 14 using std::string; |
| 15 | 15 |
| 16 namespace net { | 16 namespace net { |
| 17 | 17 |
| 18 size_t GetPacketHeaderSize(const QuicPacketHeader& header) { | 18 size_t GetPacketHeaderSize(const QuicPacketHeader& header) { |
| 19 return GetPacketHeaderSize(header.public_header.connection_id_length, | 19 return GetPacketHeaderSize(header.public_header.connection_id_length, |
| 20 header.public_header.version_flag, | 20 header.public_header.version_flag, |
| 21 header.public_header.sequence_number_length, | 21 header.public_header.sequence_number_length, |
| 22 header.is_in_fec_group); | 22 header.is_in_fec_group); |
| 23 } | 23 } |
| 24 | 24 |
| 25 size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length, | 25 size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length, |
| 26 bool include_version, | 26 bool include_version, |
| 27 QuicSequenceNumberLength sequence_number_length, | 27 QuicSequenceNumberLength sequence_number_length, |
| 28 InFecGroup is_in_fec_group) { | 28 InFecGroup is_in_fec_group) { |
| 29 return kPublicFlagsSize + connection_id_length + | 29 return kPublicFlagsSize + connection_id_length + |
| 30 (include_version ? kQuicVersionSize : 0) + sequence_number_length + | 30 (include_version ? kQuicVersionSize : 0) + sequence_number_length + |
| 31 kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0); | 31 kPrivateFlagsSize + |
| 32 (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0); |
| 32 } | 33 } |
| 33 | 34 |
| 34 size_t GetStartOfFecProtectedData( | 35 size_t GetStartOfFecProtectedData( |
| 35 QuicConnectionIdLength connection_id_length, | 36 QuicConnectionIdLength connection_id_length, |
| 36 bool include_version, | 37 bool include_version, |
| 37 QuicSequenceNumberLength sequence_number_length) { | 38 QuicSequenceNumberLength sequence_number_length) { |
| 38 return GetPacketHeaderSize(connection_id_length, | 39 return GetPacketHeaderSize(connection_id_length, |
| 39 include_version, | 40 include_version, |
| 40 sequence_number_length, | 41 sequence_number_length, |
| 41 IN_FEC_GROUP); | 42 IN_FEC_GROUP); |
| 42 } | 43 } |
| 43 | 44 |
| 44 size_t GetStartOfEncryptedData( | 45 size_t GetStartOfEncryptedData( |
| 45 QuicConnectionIdLength connection_id_length, | 46 QuicConnectionIdLength connection_id_length, |
| 46 bool include_version, | 47 bool include_version, |
| 47 QuicSequenceNumberLength sequence_number_length) { | 48 QuicSequenceNumberLength sequence_number_length) { |
| 48 // 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. |
| 49 return GetPacketHeaderSize(connection_id_length, | 50 return GetPacketHeaderSize(connection_id_length, |
| 50 include_version, | 51 include_version, |
| 51 sequence_number_length, | 52 sequence_number_length, |
| 52 NOT_IN_FEC_GROUP) - kPrivateFlagsSize; | 53 NOT_IN_FEC_GROUP) - |
| 54 kPrivateFlagsSize; |
| 53 } | 55 } |
| 54 | 56 |
| 55 QuicPacketPublicHeader::QuicPacketPublicHeader() | 57 QuicPacketPublicHeader::QuicPacketPublicHeader() |
| 56 : connection_id(0), | 58 : connection_id(0), |
| 57 connection_id_length(PACKET_8BYTE_CONNECTION_ID), | 59 connection_id_length(PACKET_8BYTE_CONNECTION_ID), |
| 58 reset_flag(false), | 60 reset_flag(false), |
| 59 version_flag(false), | 61 version_flag(false), |
| 60 sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) { | 62 sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) { |
| 61 } | 63 } |
| 62 | 64 |
| 63 QuicPacketPublicHeader::QuicPacketPublicHeader( | 65 QuicPacketPublicHeader::QuicPacketPublicHeader( |
| 64 const QuicPacketPublicHeader& other) | 66 const QuicPacketPublicHeader& other) |
| 65 : connection_id(other.connection_id), | 67 : connection_id(other.connection_id), |
| 66 connection_id_length(other.connection_id_length), | 68 connection_id_length(other.connection_id_length), |
| 67 reset_flag(other.reset_flag), | 69 reset_flag(other.reset_flag), |
| 68 version_flag(other.version_flag), | 70 version_flag(other.version_flag), |
| 69 sequence_number_length(other.sequence_number_length), | 71 sequence_number_length(other.sequence_number_length), |
| 70 versions(other.versions) { | 72 versions(other.versions) { |
| 71 } | 73 } |
| 72 | 74 |
| 73 QuicPacketPublicHeader::~QuicPacketPublicHeader() {} | 75 QuicPacketPublicHeader::~QuicPacketPublicHeader() { |
| 76 } |
| 74 | 77 |
| 75 QuicPacketHeader::QuicPacketHeader() | 78 QuicPacketHeader::QuicPacketHeader() |
| 76 : fec_flag(false), | 79 : fec_flag(false), |
| 77 entropy_flag(false), | 80 entropy_flag(false), |
| 78 entropy_hash(0), | 81 entropy_hash(0), |
| 79 packet_sequence_number(0), | 82 packet_sequence_number(0), |
| 80 is_in_fec_group(NOT_IN_FEC_GROUP), | 83 is_in_fec_group(NOT_IN_FEC_GROUP), |
| 81 fec_group(0) { | 84 fec_group(0) { |
| 82 } | 85 } |
| 83 | 86 |
| 84 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) | 87 QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) |
| 85 : public_header(header), | 88 : public_header(header), |
| 86 fec_flag(false), | 89 fec_flag(false), |
| 87 entropy_flag(false), | 90 entropy_flag(false), |
| 88 entropy_hash(0), | 91 entropy_hash(0), |
| 89 packet_sequence_number(0), | 92 packet_sequence_number(0), |
| 90 is_in_fec_group(NOT_IN_FEC_GROUP), | 93 is_in_fec_group(NOT_IN_FEC_GROUP), |
| 91 fec_group(0) { | 94 fec_group(0) { |
| 92 } | 95 } |
| 93 | 96 |
| 94 QuicPublicResetPacket::QuicPublicResetPacket() | 97 QuicPublicResetPacket::QuicPublicResetPacket() |
| 95 : nonce_proof(0), | 98 : nonce_proof(0), rejected_sequence_number(0) { |
| 96 rejected_sequence_number(0) {} | 99 } |
| 97 | 100 |
| 98 QuicPublicResetPacket::QuicPublicResetPacket( | 101 QuicPublicResetPacket::QuicPublicResetPacket( |
| 99 const QuicPacketPublicHeader& header) | 102 const QuicPacketPublicHeader& header) |
| 100 : public_header(header), | 103 : public_header(header), nonce_proof(0), rejected_sequence_number(0) { |
| 101 nonce_proof(0), | 104 } |
| 102 rejected_sequence_number(0) {} | |
| 103 | 105 |
| 104 QuicStreamFrame::QuicStreamFrame() | 106 QuicStreamFrame::QuicStreamFrame() |
| 105 : stream_id(0), | 107 : stream_id(0), fin(false), offset(0), notifier(NULL) { |
| 106 fin(false), | 108 } |
| 107 offset(0), | |
| 108 notifier(NULL) {} | |
| 109 | 109 |
| 110 QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame& frame) | 110 QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame& frame) |
| 111 : stream_id(frame.stream_id), | 111 : stream_id(frame.stream_id), |
| 112 fin(frame.fin), | 112 fin(frame.fin), |
| 113 offset(frame.offset), | 113 offset(frame.offset), |
| 114 data(frame.data), | 114 data(frame.data), |
| 115 notifier(frame.notifier) { | 115 notifier(frame.notifier) { |
| 116 } | 116 } |
| 117 | 117 |
| 118 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, | 118 QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 131 data_string->reserve(data.TotalBufferSize()); | 131 data_string->reserve(data.TotalBufferSize()); |
| 132 for (size_t i = 0; i < data.Size(); ++i) { | 132 for (size_t i = 0; i < data.Size(); ++i) { |
| 133 data_string->append(static_cast<char*>(data.iovec()[i].iov_base), | 133 data_string->append(static_cast<char*>(data.iovec()[i].iov_base), |
| 134 data.iovec()[i].iov_len); | 134 data.iovec()[i].iov_len); |
| 135 } | 135 } |
| 136 DCHECK_EQ(data_string->size(), data.TotalBufferSize()); | 136 DCHECK_EQ(data_string->size(), data.TotalBufferSize()); |
| 137 return data_string; | 137 return data_string; |
| 138 } | 138 } |
| 139 | 139 |
| 140 uint32 MakeQuicTag(char a, char b, char c, char d) { | 140 uint32 MakeQuicTag(char a, char b, char c, char d) { |
| 141 return static_cast<uint32>(a) | | 141 return static_cast<uint32>(a) | static_cast<uint32>(b) << 8 | |
| 142 static_cast<uint32>(b) << 8 | | 142 static_cast<uint32>(c) << 16 | static_cast<uint32>(d) << 24; |
| 143 static_cast<uint32>(c) << 16 | | |
| 144 static_cast<uint32>(d) << 24; | |
| 145 } | 143 } |
| 146 | 144 |
| 147 QuicVersionVector QuicSupportedVersions() { | 145 QuicVersionVector QuicSupportedVersions() { |
| 148 QuicVersionVector supported_versions; | 146 QuicVersionVector supported_versions; |
| 149 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | 147 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { |
| 150 supported_versions.push_back(kSupportedQuicVersions[i]); | 148 supported_versions.push_back(kSupportedQuicVersions[i]); |
| 151 } | 149 } |
| 152 return supported_versions; | 150 return supported_versions; |
| 153 } | 151 } |
| 154 | 152 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 176 return kSupportedQuicVersions[i]; | 174 return kSupportedQuicVersions[i]; |
| 177 } | 175 } |
| 178 } | 176 } |
| 179 // Reading from the client so this should not be considered an ERROR. | 177 // Reading from the client so this should not be considered an ERROR. |
| 180 DVLOG(1) << "Unsupported QuicTag version: " | 178 DVLOG(1) << "Unsupported QuicTag version: " |
| 181 << QuicUtils::TagToString(version_tag); | 179 << QuicUtils::TagToString(version_tag); |
| 182 return QUIC_VERSION_UNSUPPORTED; | 180 return QUIC_VERSION_UNSUPPORTED; |
| 183 } | 181 } |
| 184 | 182 |
| 185 #define RETURN_STRING_LITERAL(x) \ | 183 #define RETURN_STRING_LITERAL(x) \ |
| 186 case x: \ | 184 case x: \ |
| 187 return #x | 185 return #x |
| 188 | 186 |
| 189 string QuicVersionToString(const QuicVersion version) { | 187 string QuicVersionToString(const QuicVersion version) { |
| 190 switch (version) { | 188 switch (version) { |
| 191 RETURN_STRING_LITERAL(QUIC_VERSION_15); | 189 RETURN_STRING_LITERAL(QUIC_VERSION_15); |
| 192 RETURN_STRING_LITERAL(QUIC_VERSION_16); | 190 RETURN_STRING_LITERAL(QUIC_VERSION_16); |
| 193 RETURN_STRING_LITERAL(QUIC_VERSION_17); | 191 RETURN_STRING_LITERAL(QUIC_VERSION_17); |
| 194 RETURN_STRING_LITERAL(QUIC_VERSION_18); | 192 RETURN_STRING_LITERAL(QUIC_VERSION_18); |
| 195 default: | 193 default: |
| 196 return "QUIC_VERSION_UNSUPPORTED"; | 194 return "QUIC_VERSION_UNSUPPORTED"; |
| 197 } | 195 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 219 os << " version: "; | 217 os << " version: "; |
| 220 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { | 218 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { |
| 221 os << header.public_header.versions[0] << " "; | 219 os << header.public_header.versions[0] << " "; |
| 222 } | 220 } |
| 223 } | 221 } |
| 224 os << ", fec_flag: " << header.fec_flag | 222 os << ", fec_flag: " << header.fec_flag |
| 225 << ", entropy_flag: " << header.entropy_flag | 223 << ", entropy_flag: " << header.entropy_flag |
| 226 << ", entropy hash: " << static_cast<int>(header.entropy_hash) | 224 << ", entropy hash: " << static_cast<int>(header.entropy_hash) |
| 227 << ", sequence_number: " << header.packet_sequence_number | 225 << ", sequence_number: " << header.packet_sequence_number |
| 228 << ", is_in_fec_group:" << header.is_in_fec_group | 226 << ", is_in_fec_group:" << header.is_in_fec_group |
| 229 << ", fec_group: " << header.fec_group<< "}\n"; | 227 << ", fec_group: " << header.fec_group << "}\n"; |
| 230 return os; | 228 return os; |
| 231 } | 229 } |
| 232 | 230 |
| 233 ReceivedPacketInfo::ReceivedPacketInfo() | 231 ReceivedPacketInfo::ReceivedPacketInfo() |
| 234 : entropy_hash(0), | 232 : entropy_hash(0), |
| 235 largest_observed(0), | 233 largest_observed(0), |
| 236 delta_time_largest_observed(QuicTime::Delta::Infinite()), | 234 delta_time_largest_observed(QuicTime::Delta::Infinite()), |
| 237 is_truncated(false) {} | 235 is_truncated(false) { |
| 236 } |
| 238 | 237 |
| 239 ReceivedPacketInfo::~ReceivedPacketInfo() {} | 238 ReceivedPacketInfo::~ReceivedPacketInfo() { |
| 239 } |
| 240 | 240 |
| 241 bool IsAwaitingPacket(const ReceivedPacketInfo& received_info, | 241 bool IsAwaitingPacket(const ReceivedPacketInfo& received_info, |
| 242 QuicPacketSequenceNumber sequence_number) { | 242 QuicPacketSequenceNumber sequence_number) { |
| 243 return sequence_number > received_info.largest_observed || | 243 return sequence_number > received_info.largest_observed || |
| 244 ContainsKey(received_info.missing_packets, sequence_number); | 244 ContainsKey(received_info.missing_packets, sequence_number); |
| 245 } | 245 } |
| 246 | 246 |
| 247 void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info, | 247 void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info, |
| 248 QuicPacketSequenceNumber lower, | 248 QuicPacketSequenceNumber lower, |
| 249 QuicPacketSequenceNumber higher) { | 249 QuicPacketSequenceNumber higher) { |
| 250 for (QuicPacketSequenceNumber i = lower; i < higher; ++i) { | 250 for (QuicPacketSequenceNumber i = lower; i < higher; ++i) { |
| 251 received_info->missing_packets.insert(i); | 251 received_info->missing_packets.insert(i); |
| 252 } | 252 } |
| 253 } | 253 } |
| 254 | 254 |
| 255 QuicStopWaitingFrame::QuicStopWaitingFrame() | 255 QuicStopWaitingFrame::QuicStopWaitingFrame() |
| 256 : entropy_hash(0), | 256 : entropy_hash(0), least_unacked(0) { |
| 257 least_unacked(0) { | |
| 258 } | 257 } |
| 259 | 258 |
| 260 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} | 259 QuicStopWaitingFrame::~QuicStopWaitingFrame() { |
| 260 } |
| 261 | 261 |
| 262 QuicAckFrame::QuicAckFrame() {} | 262 QuicAckFrame::QuicAckFrame() { |
| 263 } |
| 263 | 264 |
| 264 CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP() | 265 CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP() |
| 265 : receive_window(0) { | 266 : receive_window(0) { |
| 266 } | 267 } |
| 267 | 268 |
| 268 CongestionFeedbackMessageInterArrival::CongestionFeedbackMessageInterArrival() { | 269 CongestionFeedbackMessageInterArrival::CongestionFeedbackMessageInterArrival() { |
| 269 } | 270 } |
| 270 | 271 |
| 271 CongestionFeedbackMessageInterArrival:: | 272 CongestionFeedbackMessageInterArrival:: |
| 272 ~CongestionFeedbackMessageInterArrival() {} | 273 ~CongestionFeedbackMessageInterArrival() { |
| 274 } |
| 273 | 275 |
| 274 QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP) {} | 276 QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP) { |
| 277 } |
| 275 | 278 |
| 276 QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {} | 279 QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() { |
| 280 } |
| 277 | 281 |
| 278 QuicRstStreamErrorCode AdjustErrorForVersion( | 282 QuicRstStreamErrorCode AdjustErrorForVersion(QuicRstStreamErrorCode error_code, |
| 279 QuicRstStreamErrorCode error_code, | 283 QuicVersion version) { |
| 280 QuicVersion version) { | |
| 281 switch (error_code) { | 284 switch (error_code) { |
| 282 case QUIC_RST_FLOW_CONTROL_ACCOUNTING: | 285 case QUIC_RST_FLOW_CONTROL_ACCOUNTING: |
| 283 if (version <= QUIC_VERSION_17) { | 286 if (version <= QUIC_VERSION_17) { |
| 284 return QUIC_STREAM_NO_ERROR; | 287 return QUIC_STREAM_NO_ERROR; |
| 285 } | 288 } |
| 286 break; | 289 break; |
| 287 default: | 290 default: |
| 288 return error_code; | 291 return error_code; |
| 289 } | 292 } |
| 290 return error_code; | 293 return error_code; |
| 291 } | 294 } |
| 292 | 295 |
| 293 QuicRstStreamFrame::QuicRstStreamFrame() | 296 QuicRstStreamFrame::QuicRstStreamFrame() |
| 294 : stream_id(0), | 297 : stream_id(0), error_code(QUIC_STREAM_NO_ERROR) { |
| 295 error_code(QUIC_STREAM_NO_ERROR) { | |
| 296 } | 298 } |
| 297 | 299 |
| 298 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, | 300 QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, |
| 299 QuicRstStreamErrorCode error_code, | 301 QuicRstStreamErrorCode error_code, |
| 300 QuicStreamOffset bytes_written) | 302 QuicStreamOffset bytes_written) |
| 301 : stream_id(stream_id), | 303 : stream_id(stream_id), error_code(error_code), byte_offset(bytes_written) { |
| 302 error_code(error_code), | |
| 303 byte_offset(bytes_written) { | |
| 304 DCHECK_LE(error_code, numeric_limits<uint8>::max()); | 304 DCHECK_LE(error_code, numeric_limits<uint8>::max()); |
| 305 } | 305 } |
| 306 | 306 |
| 307 QuicConnectionCloseFrame::QuicConnectionCloseFrame() | 307 QuicConnectionCloseFrame::QuicConnectionCloseFrame() |
| 308 : error_code(QUIC_NO_ERROR) { | 308 : error_code(QUIC_NO_ERROR) { |
| 309 } | 309 } |
| 310 | 310 |
| 311 QuicFrame::QuicFrame() {} | 311 QuicFrame::QuicFrame() { |
| 312 } |
| 312 | 313 |
| 313 QuicFrame::QuicFrame(QuicPaddingFrame* padding_frame) | 314 QuicFrame::QuicFrame(QuicPaddingFrame* padding_frame) |
| 314 : type(PADDING_FRAME), | 315 : type(PADDING_FRAME), padding_frame(padding_frame) { |
| 315 padding_frame(padding_frame) { | |
| 316 } | 316 } |
| 317 | 317 |
| 318 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame) | 318 QuicFrame::QuicFrame(QuicStreamFrame* stream_frame) |
| 319 : type(STREAM_FRAME), | 319 : type(STREAM_FRAME), stream_frame(stream_frame) { |
| 320 stream_frame(stream_frame) { | |
| 321 } | 320 } |
| 322 | 321 |
| 323 QuicFrame::QuicFrame(QuicAckFrame* frame) | 322 QuicFrame::QuicFrame(QuicAckFrame* frame) : type(ACK_FRAME), ack_frame(frame) { |
| 324 : type(ACK_FRAME), | |
| 325 ack_frame(frame) { | |
| 326 } | 323 } |
| 327 | 324 |
| 328 QuicFrame::QuicFrame(QuicCongestionFeedbackFrame* frame) | 325 QuicFrame::QuicFrame(QuicCongestionFeedbackFrame* frame) |
| 329 : type(CONGESTION_FEEDBACK_FRAME), | 326 : type(CONGESTION_FEEDBACK_FRAME), congestion_feedback_frame(frame) { |
| 330 congestion_feedback_frame(frame) { | |
| 331 } | 327 } |
| 332 | 328 |
| 333 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame) | 329 QuicFrame::QuicFrame(QuicStopWaitingFrame* frame) |
| 334 : type(STOP_WAITING_FRAME), | 330 : type(STOP_WAITING_FRAME), stop_waiting_frame(frame) { |
| 335 stop_waiting_frame(frame) { | |
| 336 } | 331 } |
| 337 | 332 |
| 338 QuicFrame::QuicFrame(QuicPingFrame* frame) | 333 QuicFrame::QuicFrame(QuicPingFrame* frame) |
| 339 : type(PING_FRAME), | 334 : type(PING_FRAME), ping_frame(frame) { |
| 340 ping_frame(frame) { | |
| 341 } | 335 } |
| 342 | 336 |
| 343 QuicFrame::QuicFrame(QuicRstStreamFrame* frame) | 337 QuicFrame::QuicFrame(QuicRstStreamFrame* frame) |
| 344 : type(RST_STREAM_FRAME), | 338 : type(RST_STREAM_FRAME), rst_stream_frame(frame) { |
| 345 rst_stream_frame(frame) { | |
| 346 } | 339 } |
| 347 | 340 |
| 348 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame) | 341 QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame) |
| 349 : type(CONNECTION_CLOSE_FRAME), | 342 : type(CONNECTION_CLOSE_FRAME), connection_close_frame(frame) { |
| 350 connection_close_frame(frame) { | |
| 351 } | 343 } |
| 352 | 344 |
| 353 QuicFrame::QuicFrame(QuicGoAwayFrame* frame) | 345 QuicFrame::QuicFrame(QuicGoAwayFrame* frame) |
| 354 : type(GOAWAY_FRAME), | 346 : type(GOAWAY_FRAME), goaway_frame(frame) { |
| 355 goaway_frame(frame) { | |
| 356 } | 347 } |
| 357 | 348 |
| 358 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) | 349 QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) |
| 359 : type(WINDOW_UPDATE_FRAME), | 350 : type(WINDOW_UPDATE_FRAME), window_update_frame(frame) { |
| 360 window_update_frame(frame) { | |
| 361 } | 351 } |
| 362 | 352 |
| 363 QuicFrame::QuicFrame(QuicBlockedFrame* frame) | 353 QuicFrame::QuicFrame(QuicBlockedFrame* frame) |
| 364 : type(BLOCKED_FRAME), | 354 : type(BLOCKED_FRAME), blocked_frame(frame) { |
| 365 blocked_frame(frame) { | |
| 366 } | 355 } |
| 367 | 356 |
| 368 QuicFecData::QuicFecData() : fec_group(0) {} | 357 QuicFecData::QuicFecData() : fec_group(0) { |
| 358 } |
| 369 | 359 |
| 370 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { | 360 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { |
| 371 os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash) | 361 os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash) |
| 372 << " least_unacked: " << sent_info.least_unacked; | 362 << " least_unacked: " << sent_info.least_unacked; |
| 373 return os; | 363 return os; |
| 374 } | 364 } |
| 375 | 365 |
| 376 ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) { | 366 ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) { |
| 377 os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash) | 367 os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash) |
| 378 << " is_truncated: " << received_info.is_truncated | 368 << " is_truncated: " << received_info.is_truncated |
| 379 << " largest_observed: " << received_info.largest_observed | 369 << " largest_observed: " << received_info.largest_observed |
| 380 << " delta_time_largest_observed: " | 370 << " delta_time_largest_observed: " |
| 381 << received_info.delta_time_largest_observed.ToMicroseconds() | 371 << received_info.delta_time_largest_observed.ToMicroseconds() |
| 382 << " missing_packets: [ "; | 372 << " missing_packets: [ "; |
| 383 for (SequenceNumberSet::const_iterator it = | 373 for (SequenceNumberSet::const_iterator it = |
| 384 received_info.missing_packets.begin(); | 374 received_info.missing_packets.begin(); |
| 385 it != received_info.missing_packets.end(); ++it) { | 375 it != received_info.missing_packets.end(); |
| 376 ++it) { |
| 386 os << *it << " "; | 377 os << *it << " "; |
| 387 } | 378 } |
| 388 os << " ] revived_packets: [ "; | 379 os << " ] revived_packets: [ "; |
| 389 for (SequenceNumberSet::const_iterator it = | 380 for (SequenceNumberSet::const_iterator it = |
| 390 received_info.revived_packets.begin(); | 381 received_info.revived_packets.begin(); |
| 391 it != received_info.revived_packets.end(); ++it) { | 382 it != received_info.revived_packets.end(); |
| 383 ++it) { |
| 392 os << *it << " "; | 384 os << *it << " "; |
| 393 } | 385 } |
| 394 os << " ]"; | 386 os << " ]"; |
| 395 return os; | 387 return os; |
| 396 } | 388 } |
| 397 | 389 |
| 398 ostream& operator<<(ostream& os, const QuicFrame& frame) { | 390 ostream& operator<<(ostream& os, const QuicFrame& frame) { |
| 399 switch (frame.type) { | 391 switch (frame.type) { |
| 400 case PADDING_FRAME: { | 392 case PADDING_FRAME: { |
| 401 os << "type { PADDING_FRAME } "; | 393 os << "type { PADDING_FRAME } "; |
| 402 break; | 394 break; |
| 403 } | 395 } |
| 404 case RST_STREAM_FRAME: { | 396 case RST_STREAM_FRAME: { |
| 405 os << "type { " << RST_STREAM_FRAME << " } " << *(frame.rst_stream_frame); | 397 os << "type { " << RST_STREAM_FRAME << " } " << *(frame.rst_stream_frame); |
| 406 break; | 398 break; |
| 407 } | 399 } |
| 408 case CONNECTION_CLOSE_FRAME: { | 400 case CONNECTION_CLOSE_FRAME: { |
| 409 os << "type { CONNECTION_CLOSE_FRAME } " | 401 os << "type { CONNECTION_CLOSE_FRAME } " |
| 410 << *(frame.connection_close_frame); | 402 << *(frame.connection_close_frame); |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 499 ostream& operator<<(ostream& os, | 491 ostream& operator<<(ostream& os, |
| 500 const QuicCongestionFeedbackFrame& congestion_frame) { | 492 const QuicCongestionFeedbackFrame& congestion_frame) { |
| 501 os << "type: " << congestion_frame.type; | 493 os << "type: " << congestion_frame.type; |
| 502 switch (congestion_frame.type) { | 494 switch (congestion_frame.type) { |
| 503 case kInterArrival: { | 495 case kInterArrival: { |
| 504 const CongestionFeedbackMessageInterArrival& inter_arrival = | 496 const CongestionFeedbackMessageInterArrival& inter_arrival = |
| 505 congestion_frame.inter_arrival; | 497 congestion_frame.inter_arrival; |
| 506 os << " received packets: [ "; | 498 os << " received packets: [ "; |
| 507 for (TimeMap::const_iterator it = | 499 for (TimeMap::const_iterator it = |
| 508 inter_arrival.received_packet_times.begin(); | 500 inter_arrival.received_packet_times.begin(); |
| 509 it != inter_arrival.received_packet_times.end(); ++it) { | 501 it != inter_arrival.received_packet_times.end(); |
| 502 ++it) { |
| 510 os << it->first << "@" << it->second.ToDebuggingValue() << " "; | 503 os << it->first << "@" << it->second.ToDebuggingValue() << " "; |
| 511 } | 504 } |
| 512 os << "]"; | 505 os << "]"; |
| 513 break; | 506 break; |
| 514 } | 507 } |
| 515 case kFixRate: { | 508 case kFixRate: { |
| 516 os << " bitrate_in_bytes_per_second: " | 509 os << " bitrate_in_bytes_per_second: " |
| 517 << congestion_frame.fix_rate.bitrate.ToBytesPerSecond(); | 510 << congestion_frame.fix_rate.bitrate.ToBytesPerSecond(); |
| 518 break; | 511 break; |
| 519 } | 512 } |
| 520 case kTCP: { | 513 case kTCP: { |
| 521 const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp; | 514 const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp; |
| 522 os << " receive_window: " << tcp.receive_window; | 515 os << " receive_window: " << tcp.receive_window; |
| 523 break; | 516 break; |
| 524 } | 517 } |
| 525 } | 518 } |
| 526 return os; | 519 return os; |
| 527 } | 520 } |
| 528 | 521 |
| 529 CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate() | 522 CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate() |
| 530 : bitrate(QuicBandwidth::Zero()) { | 523 : bitrate(QuicBandwidth::Zero()) { |
| 531 } | 524 } |
| 532 | 525 |
| 533 QuicGoAwayFrame::QuicGoAwayFrame() | 526 QuicGoAwayFrame::QuicGoAwayFrame() |
| 534 : error_code(QUIC_NO_ERROR), | 527 : error_code(QUIC_NO_ERROR), last_good_stream_id(0) { |
| 535 last_good_stream_id(0) { | |
| 536 } | 528 } |
| 537 | 529 |
| 538 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code, | 530 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code, |
| 539 QuicStreamId last_good_stream_id, | 531 QuicStreamId last_good_stream_id, |
| 540 const string& reason) | 532 const string& reason) |
| 541 : error_code(error_code), | 533 : error_code(error_code), |
| 542 last_good_stream_id(last_good_stream_id), | 534 last_good_stream_id(last_good_stream_id), |
| 543 reason_phrase(reason) { | 535 reason_phrase(reason) { |
| 544 DCHECK_LE(error_code, numeric_limits<uint8>::max()); | 536 DCHECK_LE(error_code, numeric_limits<uint8>::max()); |
| 545 } | 537 } |
| 546 | 538 |
| 547 QuicData::QuicData(const char* buffer, | 539 QuicData::QuicData(const char* buffer, size_t length) |
| 548 size_t length) | 540 : buffer_(buffer), length_(length), owns_buffer_(false) { |
| 549 : buffer_(buffer), | |
| 550 length_(length), | |
| 551 owns_buffer_(false) { | |
| 552 } | 541 } |
| 553 | 542 |
| 554 QuicData::QuicData(char* buffer, | 543 QuicData::QuicData(char* buffer, size_t length, bool owns_buffer) |
| 555 size_t length, | 544 : buffer_(buffer), length_(length), owns_buffer_(owns_buffer) { |
| 556 bool owns_buffer) | |
| 557 : buffer_(buffer), | |
| 558 length_(length), | |
| 559 owns_buffer_(owns_buffer) { | |
| 560 } | 545 } |
| 561 | 546 |
| 562 QuicData::~QuicData() { | 547 QuicData::~QuicData() { |
| 563 if (owns_buffer_) { | 548 if (owns_buffer_) { |
| 564 delete [] const_cast<char*>(buffer_); | 549 delete[] const_cast<char*>(buffer_); |
| 565 } | 550 } |
| 566 } | 551 } |
| 567 | 552 |
| 568 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id, | 553 QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id, |
| 569 QuicStreamOffset byte_offset) | 554 QuicStreamOffset byte_offset) |
| 570 : stream_id(stream_id), | 555 : stream_id(stream_id), byte_offset(byte_offset) { |
| 571 byte_offset(byte_offset) {} | 556 } |
| 572 | 557 |
| 573 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id) | 558 QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id) |
| 574 : stream_id(stream_id) {} | 559 : stream_id(stream_id) { |
| 560 } |
| 575 | 561 |
| 576 QuicPacket::QuicPacket(char* buffer, | 562 QuicPacket::QuicPacket(char* buffer, |
| 577 size_t length, | 563 size_t length, |
| 578 bool owns_buffer, | 564 bool owns_buffer, |
| 579 QuicConnectionIdLength connection_id_length, | 565 QuicConnectionIdLength connection_id_length, |
| 580 bool includes_version, | 566 bool includes_version, |
| 581 QuicSequenceNumberLength sequence_number_length, | 567 QuicSequenceNumberLength sequence_number_length, |
| 582 bool is_fec_packet) | 568 bool is_fec_packet) |
| 583 : QuicData(buffer, length, owns_buffer), | 569 : QuicData(buffer, length, owns_buffer), |
| 584 buffer_(buffer), | 570 buffer_(buffer), |
| 585 is_fec_packet_(is_fec_packet), | 571 is_fec_packet_(is_fec_packet), |
| 586 connection_id_length_(connection_id_length), | 572 connection_id_length_(connection_id_length), |
| 587 includes_version_(includes_version), | 573 includes_version_(includes_version), |
| 588 sequence_number_length_(sequence_number_length) { | 574 sequence_number_length_(sequence_number_length) { |
| 589 } | 575 } |
| 590 | 576 |
| 591 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, | 577 QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, size_t length) |
| 592 size_t length) | |
| 593 : QuicData(buffer, length) { | 578 : QuicData(buffer, length) { |
| 594 } | 579 } |
| 595 | 580 |
| 596 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer, | 581 QuicEncryptedPacket::QuicEncryptedPacket(char* buffer, |
| 597 size_t length, | 582 size_t length, |
| 598 bool owns_buffer) | 583 bool owns_buffer) |
| 599 : QuicData(buffer, length, owns_buffer) { | 584 : QuicData(buffer, length, owns_buffer) { |
| 600 } | 585 } |
| 601 | 586 |
| 602 StringPiece QuicPacket::FecProtectedData() const { | 587 StringPiece QuicPacket::FecProtectedData() const { |
| 603 const size_t start_of_fec = GetStartOfFecProtectedData( | 588 const size_t start_of_fec = GetStartOfFecProtectedData( |
| 604 connection_id_length_, includes_version_, sequence_number_length_); | 589 connection_id_length_, includes_version_, sequence_number_length_); |
| 605 return StringPiece(data() + start_of_fec, length() - start_of_fec); | 590 return StringPiece(data() + start_of_fec, length() - start_of_fec); |
| 606 } | 591 } |
| 607 | 592 |
| 608 StringPiece QuicPacket::AssociatedData() const { | 593 StringPiece QuicPacket::AssociatedData() const { |
| 609 return StringPiece( | 594 return StringPiece( |
| 610 data() + kStartOfHashData, | 595 data() + kStartOfHashData, |
| 611 GetStartOfEncryptedData( | 596 GetStartOfEncryptedData( |
| 612 connection_id_length_, includes_version_, sequence_number_length_) - | 597 connection_id_length_, includes_version_, sequence_number_length_) - |
| 613 kStartOfHashData); | 598 kStartOfHashData); |
| 614 } | 599 } |
| 615 | 600 |
| 616 StringPiece QuicPacket::BeforePlaintext() const { | 601 StringPiece QuicPacket::BeforePlaintext() const { |
| 617 return StringPiece(data(), GetStartOfEncryptedData(connection_id_length_, | 602 return StringPiece( |
| 618 includes_version_, | 603 data(), |
| 619 sequence_number_length_)); | 604 GetStartOfEncryptedData( |
| 605 connection_id_length_, includes_version_, sequence_number_length_)); |
| 620 } | 606 } |
| 621 | 607 |
| 622 StringPiece QuicPacket::Plaintext() const { | 608 StringPiece QuicPacket::Plaintext() const { |
| 623 const size_t start_of_encrypted_data = | 609 const size_t start_of_encrypted_data = GetStartOfEncryptedData( |
| 624 GetStartOfEncryptedData( | 610 connection_id_length_, includes_version_, sequence_number_length_); |
| 625 connection_id_length_, includes_version_, sequence_number_length_); | |
| 626 return StringPiece(data() + start_of_encrypted_data, | 611 return StringPiece(data() + start_of_encrypted_data, |
| 627 length() - start_of_encrypted_data); | 612 length() - start_of_encrypted_data); |
| 628 } | 613 } |
| 629 | 614 |
| 630 RetransmittableFrames::RetransmittableFrames() | 615 RetransmittableFrames::RetransmittableFrames() |
| 631 : encryption_level_(NUM_ENCRYPTION_LEVELS) { | 616 : encryption_level_(NUM_ENCRYPTION_LEVELS) { |
| 632 } | 617 } |
| 633 | 618 |
| 634 RetransmittableFrames::~RetransmittableFrames() { | 619 RetransmittableFrames::~RetransmittableFrames() { |
| 635 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { | 620 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 713 QuicPacket* packet, | 698 QuicPacket* packet, |
| 714 QuicPacketEntropyHash entropy_hash, | 699 QuicPacketEntropyHash entropy_hash, |
| 715 RetransmittableFrames* retransmittable_frames) | 700 RetransmittableFrames* retransmittable_frames) |
| 716 : sequence_number(sequence_number), | 701 : sequence_number(sequence_number), |
| 717 sequence_number_length(sequence_number_length), | 702 sequence_number_length(sequence_number_length), |
| 718 packet(packet), | 703 packet(packet), |
| 719 entropy_hash(entropy_hash), | 704 entropy_hash(entropy_hash), |
| 720 retransmittable_frames(retransmittable_frames) { | 705 retransmittable_frames(retransmittable_frames) { |
| 721 } | 706 } |
| 722 | 707 |
| 723 SerializedPacket::~SerializedPacket() {} | 708 SerializedPacket::~SerializedPacket() { |
| 709 } |
| 724 | 710 |
| 725 QuicEncryptedPacket* QuicEncryptedPacket::Clone() const { | 711 QuicEncryptedPacket* QuicEncryptedPacket::Clone() const { |
| 726 char* buffer = new char[this->length()]; | 712 char* buffer = new char[this->length()]; |
| 727 memcpy(buffer, this->data(), this->length()); | 713 memcpy(buffer, this->data(), this->length()); |
| 728 return new QuicEncryptedPacket(buffer, this->length(), true); | 714 return new QuicEncryptedPacket(buffer, this->length(), true); |
| 729 } | 715 } |
| 730 | 716 |
| 731 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) { | 717 ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) { |
| 732 os << s.length() << "-byte data"; | 718 os << s.length() << "-byte data"; |
| 733 return os; | 719 return os; |
| 734 } | 720 } |
| 735 | 721 |
| 736 QuicConsumedData::QuicConsumedData(size_t bytes_consumed, | 722 QuicConsumedData::QuicConsumedData(size_t bytes_consumed, bool fin_consumed) |
| 737 bool fin_consumed) | 723 : bytes_consumed(bytes_consumed), fin_consumed(fin_consumed) { |
| 738 : bytes_consumed(bytes_consumed), | |
| 739 fin_consumed(fin_consumed) { | |
| 740 } | 724 } |
| 741 | 725 |
| 742 ostream& operator<<(ostream& os, const QuicConsumedData& s) { | 726 ostream& operator<<(ostream& os, const QuicConsumedData& s) { |
| 743 os << "bytes_consumed: " << s.bytes_consumed | 727 os << "bytes_consumed: " << s.bytes_consumed |
| 744 << " fin_consumed: " << s.fin_consumed; | 728 << " fin_consumed: " << s.fin_consumed; |
| 745 return os; | 729 return os; |
| 746 } | 730 } |
| 747 | 731 |
| 748 WriteResult::WriteResult() | 732 WriteResult::WriteResult() : status(WRITE_STATUS_ERROR), bytes_written(0) { |
| 749 : status(WRITE_STATUS_ERROR), | |
| 750 bytes_written(0) { | |
| 751 } | 733 } |
| 752 | 734 |
| 753 WriteResult::WriteResult(WriteStatus status, | 735 WriteResult::WriteResult(WriteStatus status, int bytes_written_or_error_code) |
| 754 int bytes_written_or_error_code) | 736 : status(status), bytes_written(bytes_written_or_error_code) { |
| 755 : status(status), | |
| 756 bytes_written(bytes_written_or_error_code) { | |
| 757 } | 737 } |
| 758 | 738 |
| 759 } // namespace net | 739 } // namespace net |
| OLD | NEW |