| 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; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 QuicVersionVector QuicSupportedVersions() { | 152 QuicVersionVector QuicSupportedVersions() { |
| 153 QuicVersionVector supported_versions; | 153 QuicVersionVector supported_versions; |
| 154 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { | 154 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { |
| 155 supported_versions.push_back(kSupportedQuicVersions[i]); | 155 supported_versions.push_back(kSupportedQuicVersions[i]); |
| 156 } | 156 } |
| 157 return supported_versions; | 157 return supported_versions; |
| 158 } | 158 } |
| 159 | 159 |
| 160 QuicTag QuicVersionToQuicTag(const QuicVersion version) { | 160 QuicTag QuicVersionToQuicTag(const QuicVersion version) { |
| 161 switch (version) { | 161 switch (version) { |
| 162 case QUIC_VERSION_15: | |
| 163 return MakeQuicTag('Q', '0', '1', '5'); | |
| 164 case QUIC_VERSION_16: | 162 case QUIC_VERSION_16: |
| 165 return MakeQuicTag('Q', '0', '1', '6'); | 163 return MakeQuicTag('Q', '0', '1', '6'); |
| 166 case QUIC_VERSION_18: | 164 case QUIC_VERSION_18: |
| 167 return MakeQuicTag('Q', '0', '1', '8'); | 165 return MakeQuicTag('Q', '0', '1', '8'); |
| 168 case QUIC_VERSION_19: | 166 case QUIC_VERSION_19: |
| 169 return MakeQuicTag('Q', '0', '1', '9'); | 167 return MakeQuicTag('Q', '0', '1', '9'); |
| 170 case QUIC_VERSION_20: | 168 case QUIC_VERSION_20: |
| 171 return MakeQuicTag('Q', '0', '2', '0'); | 169 return MakeQuicTag('Q', '0', '2', '0'); |
| 172 case QUIC_VERSION_21: | 170 case QUIC_VERSION_21: |
| 173 return MakeQuicTag('Q', '0', '2', '1'); | 171 return MakeQuicTag('Q', '0', '2', '1'); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 190 << QuicUtils::TagToString(version_tag); | 188 << QuicUtils::TagToString(version_tag); |
| 191 return QUIC_VERSION_UNSUPPORTED; | 189 return QUIC_VERSION_UNSUPPORTED; |
| 192 } | 190 } |
| 193 | 191 |
| 194 #define RETURN_STRING_LITERAL(x) \ | 192 #define RETURN_STRING_LITERAL(x) \ |
| 195 case x: \ | 193 case x: \ |
| 196 return #x | 194 return #x |
| 197 | 195 |
| 198 string QuicVersionToString(const QuicVersion version) { | 196 string QuicVersionToString(const QuicVersion version) { |
| 199 switch (version) { | 197 switch (version) { |
| 200 RETURN_STRING_LITERAL(QUIC_VERSION_15); | |
| 201 RETURN_STRING_LITERAL(QUIC_VERSION_16); | 198 RETURN_STRING_LITERAL(QUIC_VERSION_16); |
| 202 RETURN_STRING_LITERAL(QUIC_VERSION_18); | 199 RETURN_STRING_LITERAL(QUIC_VERSION_18); |
| 203 RETURN_STRING_LITERAL(QUIC_VERSION_19); | 200 RETURN_STRING_LITERAL(QUIC_VERSION_19); |
| 204 RETURN_STRING_LITERAL(QUIC_VERSION_20); | 201 RETURN_STRING_LITERAL(QUIC_VERSION_20); |
| 205 RETURN_STRING_LITERAL(QUIC_VERSION_21); | 202 RETURN_STRING_LITERAL(QUIC_VERSION_21); |
| 206 default: | 203 default: |
| 207 return "QUIC_VERSION_UNSUPPORTED"; | 204 return "QUIC_VERSION_UNSUPPORTED"; |
| 208 } | 205 } |
| 209 } | 206 } |
| 210 | 207 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 234 } | 231 } |
| 235 os << ", fec_flag: " << header.fec_flag | 232 os << ", fec_flag: " << header.fec_flag |
| 236 << ", entropy_flag: " << header.entropy_flag | 233 << ", entropy_flag: " << header.entropy_flag |
| 237 << ", entropy hash: " << static_cast<int>(header.entropy_hash) | 234 << ", entropy hash: " << static_cast<int>(header.entropy_hash) |
| 238 << ", sequence_number: " << header.packet_sequence_number | 235 << ", sequence_number: " << header.packet_sequence_number |
| 239 << ", is_in_fec_group:" << header.is_in_fec_group | 236 << ", is_in_fec_group:" << header.is_in_fec_group |
| 240 << ", fec_group: " << header.fec_group<< "}\n"; | 237 << ", fec_group: " << header.fec_group<< "}\n"; |
| 241 return os; | 238 return os; |
| 242 } | 239 } |
| 243 | 240 |
| 244 ReceivedPacketInfo::ReceivedPacketInfo() | 241 bool IsAwaitingPacket(const QuicAckFrame& ack_frame, |
| 245 : entropy_hash(0), | |
| 246 largest_observed(0), | |
| 247 delta_time_largest_observed(QuicTime::Delta::Infinite()), | |
| 248 is_truncated(false) {} | |
| 249 | |
| 250 ReceivedPacketInfo::~ReceivedPacketInfo() {} | |
| 251 | |
| 252 bool IsAwaitingPacket(const ReceivedPacketInfo& received_info, | |
| 253 QuicPacketSequenceNumber sequence_number) { | 242 QuicPacketSequenceNumber sequence_number) { |
| 254 return sequence_number > received_info.largest_observed || | 243 return sequence_number > ack_frame.largest_observed || |
| 255 ContainsKey(received_info.missing_packets, sequence_number); | 244 ContainsKey(ack_frame.missing_packets, sequence_number); |
| 256 } | 245 } |
| 257 | 246 |
| 258 void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info, | 247 void InsertMissingPacketsBetween(QuicAckFrame* ack_frame, |
| 259 QuicPacketSequenceNumber lower, | 248 QuicPacketSequenceNumber lower, |
| 260 QuicPacketSequenceNumber higher) { | 249 QuicPacketSequenceNumber higher) { |
| 261 for (QuicPacketSequenceNumber i = lower; i < higher; ++i) { | 250 for (QuicPacketSequenceNumber i = lower; i < higher; ++i) { |
| 262 received_info->missing_packets.insert(i); | 251 ack_frame->missing_packets.insert(i); |
| 263 } | 252 } |
| 264 } | 253 } |
| 265 | 254 |
| 266 QuicStopWaitingFrame::QuicStopWaitingFrame() | 255 QuicStopWaitingFrame::QuicStopWaitingFrame() |
| 267 : entropy_hash(0), | 256 : entropy_hash(0), |
| 268 least_unacked(0) { | 257 least_unacked(0) { |
| 269 } | 258 } |
| 270 | 259 |
| 271 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} | 260 QuicStopWaitingFrame::~QuicStopWaitingFrame() {} |
| 272 | 261 |
| 273 QuicAckFrame::QuicAckFrame() {} | 262 QuicAckFrame::QuicAckFrame() |
| 263 : entropy_hash(0), |
| 264 largest_observed(0), |
| 265 delta_time_largest_observed(QuicTime::Delta::Infinite()), |
| 266 is_truncated(false) {} |
| 267 |
| 268 QuicAckFrame::~QuicAckFrame() {} |
| 274 | 269 |
| 275 CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP() | 270 CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP() |
| 276 : receive_window(0) { | 271 : receive_window(0) { |
| 277 } | 272 } |
| 278 | 273 |
| 279 CongestionFeedbackMessageInterArrival::CongestionFeedbackMessageInterArrival() { | 274 CongestionFeedbackMessageInterArrival::CongestionFeedbackMessageInterArrival() { |
| 280 } | 275 } |
| 281 | 276 |
| 282 CongestionFeedbackMessageInterArrival:: | 277 CongestionFeedbackMessageInterArrival:: |
| 283 ~CongestionFeedbackMessageInterArrival() {} | 278 ~CongestionFeedbackMessageInterArrival() {} |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 377 } | 372 } |
| 378 | 373 |
| 379 QuicFecData::QuicFecData() : fec_group(0) {} | 374 QuicFecData::QuicFecData() : fec_group(0) {} |
| 380 | 375 |
| 381 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { | 376 ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { |
| 382 os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash) | 377 os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash) |
| 383 << " least_unacked: " << sent_info.least_unacked; | 378 << " least_unacked: " << sent_info.least_unacked; |
| 384 return os; | 379 return os; |
| 385 } | 380 } |
| 386 | 381 |
| 387 ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) { | 382 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { |
| 388 os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash) | 383 os << "entropy_hash: " << static_cast<int>(ack_frame.entropy_hash) |
| 389 << " is_truncated: " << received_info.is_truncated | 384 << " is_truncated: " << ack_frame.is_truncated |
| 390 << " largest_observed: " << received_info.largest_observed | 385 << " largest_observed: " << ack_frame.largest_observed |
| 391 << " delta_time_largest_observed: " | 386 << " delta_time_largest_observed: " |
| 392 << received_info.delta_time_largest_observed.ToMicroseconds() | 387 << ack_frame.delta_time_largest_observed.ToMicroseconds() |
| 393 << " missing_packets: [ "; | 388 << " missing_packets: [ "; |
| 394 for (SequenceNumberSet::const_iterator it = | 389 for (SequenceNumberSet::const_iterator it = ack_frame.missing_packets.begin(); |
| 395 received_info.missing_packets.begin(); | 390 it != ack_frame.missing_packets.end(); ++it) { |
| 396 it != received_info.missing_packets.end(); ++it) { | |
| 397 os << *it << " "; | 391 os << *it << " "; |
| 398 } | 392 } |
| 399 os << " ] revived_packets: [ "; | 393 os << " ] revived_packets: [ "; |
| 400 for (SequenceNumberSet::const_iterator it = | 394 for (SequenceNumberSet::const_iterator it = ack_frame.revived_packets.begin(); |
| 401 received_info.revived_packets.begin(); | 395 it != ack_frame.revived_packets.end(); ++it) { |
| 402 it != received_info.revived_packets.end(); ++it) { | |
| 403 os << *it << " "; | 396 os << *it << " "; |
| 404 } | 397 } |
| 405 os << " ]"; | 398 os << " ]"; |
| 406 return os; | 399 return os; |
| 407 } | 400 } |
| 408 | 401 |
| 409 ostream& operator<<(ostream& os, const QuicFrame& frame) { | 402 ostream& operator<<(ostream& os, const QuicFrame& frame) { |
| 410 switch (frame.type) { | 403 switch (frame.type) { |
| 411 case PADDING_FRAME: { | 404 case PADDING_FRAME: { |
| 412 os << "type { PADDING_FRAME } "; | 405 os << "type { PADDING_FRAME } "; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 443 } | 436 } |
| 444 case CONGESTION_FEEDBACK_FRAME: { | 437 case CONGESTION_FEEDBACK_FRAME: { |
| 445 os << "type { CONGESTION_FEEDBACK_FRAME } " | 438 os << "type { CONGESTION_FEEDBACK_FRAME } " |
| 446 << *(frame.congestion_feedback_frame); | 439 << *(frame.congestion_feedback_frame); |
| 447 break; | 440 break; |
| 448 } | 441 } |
| 449 case STOP_WAITING_FRAME: { | 442 case STOP_WAITING_FRAME: { |
| 450 os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame); | 443 os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame); |
| 451 break; | 444 break; |
| 452 } | 445 } |
| 446 case PING_FRAME: { |
| 447 os << "type { PING_FRAME } "; |
| 448 break; |
| 449 } |
| 453 default: { | 450 default: { |
| 454 LOG(ERROR) << "Unknown frame type: " << frame.type; | 451 LOG(ERROR) << "Unknown frame type: " << frame.type; |
| 455 break; | 452 break; |
| 456 } | 453 } |
| 457 } | 454 } |
| 458 return os; | 455 return os; |
| 459 } | 456 } |
| 460 | 457 |
| 461 ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) { | 458 ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) { |
| 462 os << "stream_id { " << rst_frame.stream_id << " } " | 459 os << "stream_id { " << rst_frame.stream_id << " } " |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 494 ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) { | 491 ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) { |
| 495 os << "stream_id { " << stream_frame.stream_id << " } " | 492 os << "stream_id { " << stream_frame.stream_id << " } " |
| 496 << "fin { " << stream_frame.fin << " } " | 493 << "fin { " << stream_frame.fin << " } " |
| 497 << "offset { " << stream_frame.offset << " } " | 494 << "offset { " << stream_frame.offset << " } " |
| 498 << "data { " | 495 << "data { " |
| 499 << QuicUtils::StringToHexASCIIDump(*(stream_frame.GetDataAsString())) | 496 << QuicUtils::StringToHexASCIIDump(*(stream_frame.GetDataAsString())) |
| 500 << " }\n"; | 497 << " }\n"; |
| 501 return os; | 498 return os; |
| 502 } | 499 } |
| 503 | 500 |
| 504 ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { | |
| 505 os << "sent info { " << ack_frame.sent_info << " } " | |
| 506 << "received info { " << ack_frame.received_info << " }\n"; | |
| 507 return os; | |
| 508 } | |
| 509 | |
| 510 ostream& operator<<(ostream& os, | 501 ostream& operator<<(ostream& os, |
| 511 const QuicCongestionFeedbackFrame& congestion_frame) { | 502 const QuicCongestionFeedbackFrame& congestion_frame) { |
| 512 os << "type: " << congestion_frame.type; | 503 os << "type: " << congestion_frame.type; |
| 513 switch (congestion_frame.type) { | 504 switch (congestion_frame.type) { |
| 514 case kInterArrival: { | 505 case kInterArrival: { |
| 515 const CongestionFeedbackMessageInterArrival& inter_arrival = | 506 const CongestionFeedbackMessageInterArrival& inter_arrival = |
| 516 congestion_frame.inter_arrival; | 507 congestion_frame.inter_arrival; |
| 517 os << " received packets: [ "; | 508 os << " received packets: [ "; |
| 518 for (TimeMap::const_iterator it = | 509 for (TimeMap::const_iterator it = |
| 519 inter_arrival.received_packet_times.begin(); | 510 inter_arrival.received_packet_times.begin(); |
| 520 it != inter_arrival.received_packet_times.end(); ++it) { | 511 it != inter_arrival.received_packet_times.end(); ++it) { |
| 521 os << it->first << "@" << it->second.ToDebuggingValue() << " "; | 512 os << it->first << "@" << it->second.ToDebuggingValue() << " "; |
| 522 } | 513 } |
| 523 os << "]"; | 514 os << "]"; |
| 524 break; | 515 break; |
| 525 } | 516 } |
| 526 case kFixRate: { | |
| 527 os << " bitrate_in_bytes_per_second: " | |
| 528 << congestion_frame.fix_rate.bitrate.ToBytesPerSecond(); | |
| 529 break; | |
| 530 } | |
| 531 case kTCP: { | 517 case kTCP: { |
| 532 const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp; | 518 const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp; |
| 533 os << " receive_window: " << tcp.receive_window; | 519 os << " receive_window: " << tcp.receive_window; |
| 534 break; | 520 break; |
| 535 } | 521 } |
| 536 } | 522 } |
| 537 return os; | 523 return os; |
| 538 } | 524 } |
| 539 | 525 |
| 540 CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate() | |
| 541 : bitrate(QuicBandwidth::Zero()) { | |
| 542 } | |
| 543 | |
| 544 QuicGoAwayFrame::QuicGoAwayFrame() | 526 QuicGoAwayFrame::QuicGoAwayFrame() |
| 545 : error_code(QUIC_NO_ERROR), | 527 : error_code(QUIC_NO_ERROR), |
| 546 last_good_stream_id(0) { | 528 last_good_stream_id(0) { |
| 547 } | 529 } |
| 548 | 530 |
| 549 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code, | 531 QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code, |
| 550 QuicStreamId last_good_stream_id, | 532 QuicStreamId last_good_stream_id, |
| 551 const string& reason) | 533 const string& reason) |
| 552 : error_code(error_code), | 534 : error_code(error_code), |
| 553 last_good_stream_id(last_good_stream_id), | 535 last_good_stream_id(last_good_stream_id), |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 780 sent_time(QuicTime::Zero()), | 762 sent_time(QuicTime::Zero()), |
| 781 bytes_sent(0), | 763 bytes_sent(0), |
| 782 nack_count(0), | 764 nack_count(0), |
| 783 transmission_type(transmission_type), | 765 transmission_type(transmission_type), |
| 784 all_transmissions(all_transmissions), | 766 all_transmissions(all_transmissions), |
| 785 in_flight(false) { | 767 in_flight(false) { |
| 786 all_transmissions->insert(sequence_number); | 768 all_transmissions->insert(sequence_number); |
| 787 } | 769 } |
| 788 | 770 |
| 789 } // namespace net | 771 } // namespace net |
| OLD | NEW |