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 |