quic_protocol.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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 3// found in the LICENSE file. 4 5#include "net/quic/quic_protocol.h" 6 7#include "base/stl_util.h" 8#include "net/quic/quic_utils.h" 9 10using base::StringPiece; 11using std::map; 12using std::numeric_limits; 13using std::ostream; 14using std::string; 15 16namespace net { 17 18size_t GetPacketHeaderSize(const QuicPacketHeader& header) { 19 return GetPacketHeaderSize(header.public_header.connection_id_length, 20 header.public_header.version_flag, 21 header.public_header.sequence_number_length, 22 header.is_in_fec_group); 23} 24 25size_t GetPacketHeaderSize(QuicConnectionIdLength connection_id_length, 26 bool include_version, 27 QuicSequenceNumberLength sequence_number_length, 28 InFecGroup is_in_fec_group) { 29 return kPublicFlagsSize + connection_id_length + 30 (include_version ? kQuicVersionSize : 0) + sequence_number_length + 31 kPrivateFlagsSize + (is_in_fec_group == IN_FEC_GROUP ? kFecGroupSize : 0); 32} 33 34size_t GetStartOfFecProtectedData( 35 QuicConnectionIdLength connection_id_length, 36 bool include_version, 37 QuicSequenceNumberLength sequence_number_length) { 38 return GetPacketHeaderSize(connection_id_length, 39 include_version, 40 sequence_number_length, 41 IN_FEC_GROUP); 42} 43 44size_t GetStartOfEncryptedData( 45 QuicConnectionIdLength connection_id_length, 46 bool include_version, 47 QuicSequenceNumberLength sequence_number_length) { 48 // Don't include the fec size, since encryption starts before private flags. 49 return GetPacketHeaderSize(connection_id_length, 50 include_version, 51 sequence_number_length, 52 NOT_IN_FEC_GROUP) - kPrivateFlagsSize; 53} 54 55QuicPacketPublicHeader::QuicPacketPublicHeader() 56 : connection_id(0), 57 connection_id_length(PACKET_8BYTE_CONNECTION_ID), 58 reset_flag(false), 59 version_flag(false), 60 sequence_number_length(PACKET_6BYTE_SEQUENCE_NUMBER) { 61} 62 63QuicPacketPublicHeader::QuicPacketPublicHeader( 64 const QuicPacketPublicHeader& other) 65 : connection_id(other.connection_id), 66 connection_id_length(other.connection_id_length), 67 reset_flag(other.reset_flag), 68 version_flag(other.version_flag), 69 sequence_number_length(other.sequence_number_length), 70 versions(other.versions) { 71} 72 73QuicPacketPublicHeader::~QuicPacketPublicHeader() {} 74 75QuicPacketHeader::QuicPacketHeader() 76 : fec_flag(false), 77 entropy_flag(false), 78 entropy_hash(0), 79 packet_sequence_number(0), 80 is_in_fec_group(NOT_IN_FEC_GROUP), 81 fec_group(0) { 82} 83 84QuicPacketHeader::QuicPacketHeader(const QuicPacketPublicHeader& header) 85 : public_header(header), 86 fec_flag(false), 87 entropy_flag(false), 88 entropy_hash(0), 89 packet_sequence_number(0), 90 is_in_fec_group(NOT_IN_FEC_GROUP), 91 fec_group(0) { 92} 93 94QuicPublicResetPacket::QuicPublicResetPacket() 95 : nonce_proof(0), 96 rejected_sequence_number(0) {} 97 98QuicPublicResetPacket::QuicPublicResetPacket( 99 const QuicPacketPublicHeader& header) 100 : public_header(header), 101 nonce_proof(0), 102 rejected_sequence_number(0) {} 103 104QuicStreamFrame::QuicStreamFrame() 105 : stream_id(0), 106 fin(false), 107 offset(0), 108 notifier(NULL) {} 109 110QuicStreamFrame::QuicStreamFrame(const QuicStreamFrame& frame) 111 : stream_id(frame.stream_id), 112 fin(frame.fin), 113 offset(frame.offset), 114 data(frame.data), 115 notifier(frame.notifier) { 116} 117 118QuicStreamFrame::QuicStreamFrame(QuicStreamId stream_id, 119 bool fin, 120 QuicStreamOffset offset, 121 IOVector data) 122 : stream_id(stream_id), 123 fin(fin), 124 offset(offset), 125 data(data), 126 notifier(NULL) { 127} 128 129string* QuicStreamFrame::GetDataAsString() const { 130 string* data_string = new string(); 131 data_string->reserve(data.TotalBufferSize()); 132 for (size_t i = 0; i < data.Size(); ++i) { 133 data_string->append(static_cast<char*>(data.iovec()[i].iov_base), 134 data.iovec()[i].iov_len); 135 } 136 DCHECK_EQ(data_string->size(), data.TotalBufferSize()); 137 return data_string; 138} 139 140uint32 MakeQuicTag(char a, char b, char c, char d) { 141 return static_cast<uint32>(a) | 142 static_cast<uint32>(b) << 8 | 143 static_cast<uint32>(c) << 16 | 144 static_cast<uint32>(d) << 24; 145} 146 147QuicVersionVector QuicSupportedVersions() { 148 QuicVersionVector supported_versions; 149 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { 150 supported_versions.push_back(kSupportedQuicVersions[i]); 151 } 152 return supported_versions; 153} 154 155QuicTag QuicVersionToQuicTag(const QuicVersion version) { 156 switch (version) { 157 case QUIC_VERSION_15: 158 return MakeQuicTag('Q', '0', '1', '5'); 159 case QUIC_VERSION_16: 160 return MakeQuicTag('Q', '0', '1', '6'); 161 case QUIC_VERSION_17: 162 return MakeQuicTag('Q', '0', '1', '7'); 163 case QUIC_VERSION_18: 164 return MakeQuicTag('Q', '0', '1', '8'); 165 default: 166 // This shold be an ERROR because we should never attempt to convert an 167 // invalid QuicVersion to be written to the wire. 168 LOG(ERROR) << "Unsupported QuicVersion: " << version; 169 return 0; 170 } 171} 172 173QuicVersion QuicTagToQuicVersion(const QuicTag version_tag) { 174 for (size_t i = 0; i < arraysize(kSupportedQuicVersions); ++i) { 175 if (version_tag == QuicVersionToQuicTag(kSupportedQuicVersions[i])) { 176 return kSupportedQuicVersions[i]; 177 } 178 } 179 // Reading from the client so this should not be considered an ERROR. 180 DVLOG(1) << "Unsupported QuicTag version: " 181 << QuicUtils::TagToString(version_tag); 182 return QUIC_VERSION_UNSUPPORTED; 183} 184 185#define RETURN_STRING_LITERAL(x) \ 186case x: \ 187return #x 188 189string QuicVersionToString(const QuicVersion version) { 190 switch (version) { 191 RETURN_STRING_LITERAL(QUIC_VERSION_15); 192 RETURN_STRING_LITERAL(QUIC_VERSION_16); 193 RETURN_STRING_LITERAL(QUIC_VERSION_17); 194 RETURN_STRING_LITERAL(QUIC_VERSION_18); 195 default: 196 return "QUIC_VERSION_UNSUPPORTED"; 197 } 198} 199 200string QuicVersionVectorToString(const QuicVersionVector& versions) { 201 string result = ""; 202 for (size_t i = 0; i < versions.size(); ++i) { 203 if (i != 0) { 204 result.append(","); 205 } 206 result.append(QuicVersionToString(versions[i])); 207 } 208 return result; 209} 210 211ostream& operator<<(ostream& os, const QuicPacketHeader& header) { 212 os << "{ connection_id: " << header.public_header.connection_id 213 << ", connection_id_length:" << header.public_header.connection_id_length 214 << ", sequence_number_length:" 215 << header.public_header.sequence_number_length 216 << ", reset_flag: " << header.public_header.reset_flag 217 << ", version_flag: " << header.public_header.version_flag; 218 if (header.public_header.version_flag) { 219 os << " version: "; 220 for (size_t i = 0; i < header.public_header.versions.size(); ++i) { 221 os << header.public_header.versions[0] << " "; 222 } 223 } 224 os << ", fec_flag: " << header.fec_flag 225 << ", entropy_flag: " << header.entropy_flag 226 << ", entropy hash: " << static_cast<int>(header.entropy_hash) 227 << ", sequence_number: " << header.packet_sequence_number 228 << ", is_in_fec_group:" << header.is_in_fec_group 229 << ", fec_group: " << header.fec_group<< "}\n"; 230 return os; 231} 232 233ReceivedPacketInfo::ReceivedPacketInfo() 234 : entropy_hash(0), 235 largest_observed(0), 236 delta_time_largest_observed(QuicTime::Delta::Infinite()), 237 is_truncated(false) {} 238 239ReceivedPacketInfo::~ReceivedPacketInfo() {} 240 241bool IsAwaitingPacket(const ReceivedPacketInfo& received_info, 242 QuicPacketSequenceNumber sequence_number) { 243 return sequence_number > received_info.largest_observed || 244 ContainsKey(received_info.missing_packets, sequence_number); 245} 246 247void InsertMissingPacketsBetween(ReceivedPacketInfo* received_info, 248 QuicPacketSequenceNumber lower, 249 QuicPacketSequenceNumber higher) { 250 for (QuicPacketSequenceNumber i = lower; i < higher; ++i) { 251 received_info->missing_packets.insert(i); 252 } 253} 254 255QuicStopWaitingFrame::QuicStopWaitingFrame() 256 : entropy_hash(0), 257 least_unacked(0) { 258} 259 260QuicStopWaitingFrame::~QuicStopWaitingFrame() {} 261 262QuicAckFrame::QuicAckFrame() {} 263 264CongestionFeedbackMessageTCP::CongestionFeedbackMessageTCP() 265 : receive_window(0) { 266} 267 268CongestionFeedbackMessageInterArrival::CongestionFeedbackMessageInterArrival() { 269} 270 271CongestionFeedbackMessageInterArrival:: 272 ~CongestionFeedbackMessageInterArrival() {} 273 274QuicCongestionFeedbackFrame::QuicCongestionFeedbackFrame() : type(kTCP) {} 275 276QuicCongestionFeedbackFrame::~QuicCongestionFeedbackFrame() {} 277 278QuicRstStreamErrorCode AdjustErrorForVersion( 279 QuicRstStreamErrorCode error_code, 280 QuicVersion version) { 281 switch (error_code) { 282 case QUIC_RST_FLOW_CONTROL_ACCOUNTING: 283 if (version <= QUIC_VERSION_17) { 284 return QUIC_STREAM_NO_ERROR; 285 } 286 break; 287 default: 288 return error_code; 289 } 290 return error_code; 291} 292 293QuicRstStreamFrame::QuicRstStreamFrame() 294 : stream_id(0), 295 error_code(QUIC_STREAM_NO_ERROR) { 296} 297 298QuicRstStreamFrame::QuicRstStreamFrame(QuicStreamId stream_id, 299 QuicRstStreamErrorCode error_code, 300 QuicStreamOffset bytes_written) 301 : stream_id(stream_id), 302 error_code(error_code), 303 byte_offset(bytes_written) { 304 DCHECK_LE(error_code, numeric_limits<uint8>::max()); 305} 306 307QuicConnectionCloseFrame::QuicConnectionCloseFrame() 308 : error_code(QUIC_NO_ERROR) { 309} 310 311QuicFrame::QuicFrame() {} 312 313QuicFrame::QuicFrame(QuicPaddingFrame* padding_frame) 314 : type(PADDING_FRAME), 315 padding_frame(padding_frame) { 316} 317 318QuicFrame::QuicFrame(QuicStreamFrame* stream_frame) 319 : type(STREAM_FRAME), 320 stream_frame(stream_frame) { 321} 322 323QuicFrame::QuicFrame(QuicAckFrame* frame) 324 : type(ACK_FRAME), 325 ack_frame(frame) { 326} 327 328QuicFrame::QuicFrame(QuicCongestionFeedbackFrame* frame) 329 : type(CONGESTION_FEEDBACK_FRAME), 330 congestion_feedback_frame(frame) { 331} 332 333QuicFrame::QuicFrame(QuicStopWaitingFrame* frame) 334 : type(STOP_WAITING_FRAME), 335 stop_waiting_frame(frame) { 336} 337 338QuicFrame::QuicFrame(QuicPingFrame* frame) 339 : type(PING_FRAME), 340 ping_frame(frame) { 341} 342 343QuicFrame::QuicFrame(QuicRstStreamFrame* frame) 344 : type(RST_STREAM_FRAME), 345 rst_stream_frame(frame) { 346} 347 348QuicFrame::QuicFrame(QuicConnectionCloseFrame* frame) 349 : type(CONNECTION_CLOSE_FRAME), 350 connection_close_frame(frame) { 351} 352 353QuicFrame::QuicFrame(QuicGoAwayFrame* frame) 354 : type(GOAWAY_FRAME), 355 goaway_frame(frame) { 356} 357 358QuicFrame::QuicFrame(QuicWindowUpdateFrame* frame) 359 : type(WINDOW_UPDATE_FRAME), 360 window_update_frame(frame) { 361} 362 363QuicFrame::QuicFrame(QuicBlockedFrame* frame) 364 : type(BLOCKED_FRAME), 365 blocked_frame(frame) { 366} 367 368QuicFecData::QuicFecData() : fec_group(0) {} 369 370ostream& operator<<(ostream& os, const QuicStopWaitingFrame& sent_info) { 371 os << "entropy_hash: " << static_cast<int>(sent_info.entropy_hash) 372 << " least_unacked: " << sent_info.least_unacked; 373 return os; 374} 375 376ostream& operator<<(ostream& os, const ReceivedPacketInfo& received_info) { 377 os << "entropy_hash: " << static_cast<int>(received_info.entropy_hash) 378 << " is_truncated: " << received_info.is_truncated 379 << " largest_observed: " << received_info.largest_observed 380 << " delta_time_largest_observed: " 381 << received_info.delta_time_largest_observed.ToMicroseconds() 382 << " missing_packets: [ "; 383 for (SequenceNumberSet::const_iterator it = 384 received_info.missing_packets.begin(); 385 it != received_info.missing_packets.end(); ++it) { 386 os << *it << " "; 387 } 388 os << " ] revived_packets: [ "; 389 for (SequenceNumberSet::const_iterator it = 390 received_info.revived_packets.begin(); 391 it != received_info.revived_packets.end(); ++it) { 392 os << *it << " "; 393 } 394 os << " ]"; 395 return os; 396} 397 398ostream& operator<<(ostream& os, const QuicFrame& frame) { 399 switch (frame.type) { 400 case PADDING_FRAME: { 401 os << "type { PADDING_FRAME } "; 402 break; 403 } 404 case RST_STREAM_FRAME: { 405 os << "type { " << RST_STREAM_FRAME << " } " << *(frame.rst_stream_frame); 406 break; 407 } 408 case CONNECTION_CLOSE_FRAME: { 409 os << "type { CONNECTION_CLOSE_FRAME } " 410 << *(frame.connection_close_frame); 411 break; 412 } 413 case GOAWAY_FRAME: { 414 os << "type { GOAWAY_FRAME } " << *(frame.goaway_frame); 415 break; 416 } 417 case WINDOW_UPDATE_FRAME: { 418 os << "type { WINDOW_UPDATE_FRAME } " << *(frame.window_update_frame); 419 break; 420 } 421 case BLOCKED_FRAME: { 422 os << "type { BLOCKED_FRAME } " << *(frame.blocked_frame); 423 break; 424 } 425 case STREAM_FRAME: { 426 os << "type { STREAM_FRAME } " << *(frame.stream_frame); 427 break; 428 } 429 case ACK_FRAME: { 430 os << "type { ACK_FRAME } " << *(frame.ack_frame); 431 break; 432 } 433 case CONGESTION_FEEDBACK_FRAME: { 434 os << "type { CONGESTION_FEEDBACK_FRAME } " 435 << *(frame.congestion_feedback_frame); 436 break; 437 } 438 case STOP_WAITING_FRAME: { 439 os << "type { STOP_WAITING_FRAME } " << *(frame.stop_waiting_frame); 440 break; 441 } 442 default: { 443 LOG(ERROR) << "Unknown frame type: " << frame.type; 444 break; 445 } 446 } 447 return os; 448} 449 450ostream& operator<<(ostream& os, const QuicRstStreamFrame& rst_frame) { 451 os << "stream_id { " << rst_frame.stream_id << " } " 452 << "error_code { " << rst_frame.error_code << " } " 453 << "error_details { " << rst_frame.error_details << " }\n"; 454 return os; 455} 456 457ostream& operator<<(ostream& os, 458 const QuicConnectionCloseFrame& connection_close_frame) { 459 os << "error_code { " << connection_close_frame.error_code << " } " 460 << "error_details { " << connection_close_frame.error_details << " }\n"; 461 return os; 462} 463 464ostream& operator<<(ostream& os, const QuicGoAwayFrame& goaway_frame) { 465 os << "error_code { " << goaway_frame.error_code << " } " 466 << "last_good_stream_id { " << goaway_frame.last_good_stream_id << " } " 467 << "reason_phrase { " << goaway_frame.reason_phrase << " }\n"; 468 return os; 469} 470 471ostream& operator<<(ostream& os, 472 const QuicWindowUpdateFrame& window_update_frame) { 473 os << "stream_id { " << window_update_frame.stream_id << " } " 474 << "byte_offset { " << window_update_frame.byte_offset << " }\n"; 475 return os; 476} 477 478ostream& operator<<(ostream& os, const QuicBlockedFrame& blocked_frame) { 479 os << "stream_id { " << blocked_frame.stream_id << " }\n"; 480 return os; 481} 482 483ostream& operator<<(ostream& os, const QuicStreamFrame& stream_frame) { 484 os << "stream_id { " << stream_frame.stream_id << " } " 485 << "fin { " << stream_frame.fin << " } " 486 << "offset { " << stream_frame.offset << " } " 487 << "data { " 488 << QuicUtils::StringToHexASCIIDump(*(stream_frame.GetDataAsString())) 489 << " }\n"; 490 return os; 491} 492 493ostream& operator<<(ostream& os, const QuicAckFrame& ack_frame) { 494 os << "sent info { " << ack_frame.sent_info << " } " 495 << "received info { " << ack_frame.received_info << " }\n"; 496 return os; 497} 498 499ostream& operator<<(ostream& os, 500 const QuicCongestionFeedbackFrame& congestion_frame) { 501 os << "type: " << congestion_frame.type; 502 switch (congestion_frame.type) { 503 case kInterArrival: { 504 const CongestionFeedbackMessageInterArrival& inter_arrival = 505 congestion_frame.inter_arrival; 506 os << " received packets: [ "; 507 for (TimeMap::const_iterator it = 508 inter_arrival.received_packet_times.begin(); 509 it != inter_arrival.received_packet_times.end(); ++it) { 510 os << it->first << "@" << it->second.ToDebuggingValue() << " "; 511 } 512 os << "]"; 513 break; 514 } 515 case kFixRate: { 516 os << " bitrate_in_bytes_per_second: " 517 << congestion_frame.fix_rate.bitrate.ToBytesPerSecond(); 518 break; 519 } 520 case kTCP: { 521 const CongestionFeedbackMessageTCP& tcp = congestion_frame.tcp; 522 os << " receive_window: " << tcp.receive_window; 523 break; 524 } 525 } 526 return os; 527} 528 529CongestionFeedbackMessageFixRate::CongestionFeedbackMessageFixRate() 530 : bitrate(QuicBandwidth::Zero()) { 531} 532 533QuicGoAwayFrame::QuicGoAwayFrame() 534 : error_code(QUIC_NO_ERROR), 535 last_good_stream_id(0) { 536} 537 538QuicGoAwayFrame::QuicGoAwayFrame(QuicErrorCode error_code, 539 QuicStreamId last_good_stream_id, 540 const string& reason) 541 : error_code(error_code), 542 last_good_stream_id(last_good_stream_id), 543 reason_phrase(reason) { 544 DCHECK_LE(error_code, numeric_limits<uint8>::max()); 545} 546 547QuicData::QuicData(const char* buffer, 548 size_t length) 549 : buffer_(buffer), 550 length_(length), 551 owns_buffer_(false) { 552} 553 554QuicData::QuicData(char* buffer, 555 size_t length, 556 bool owns_buffer) 557 : buffer_(buffer), 558 length_(length), 559 owns_buffer_(owns_buffer) { 560} 561 562QuicData::~QuicData() { 563 if (owns_buffer_) { 564 delete [] const_cast<char*>(buffer_); 565 } 566} 567 568QuicWindowUpdateFrame::QuicWindowUpdateFrame(QuicStreamId stream_id, 569 QuicStreamOffset byte_offset) 570 : stream_id(stream_id), 571 byte_offset(byte_offset) {} 572 573QuicBlockedFrame::QuicBlockedFrame(QuicStreamId stream_id) 574 : stream_id(stream_id) {} 575 576QuicPacket::QuicPacket(char* buffer, 577 size_t length, 578 bool owns_buffer, 579 QuicConnectionIdLength connection_id_length, 580 bool includes_version, 581 QuicSequenceNumberLength sequence_number_length, 582 bool is_fec_packet) 583 : QuicData(buffer, length, owns_buffer), 584 buffer_(buffer), 585 is_fec_packet_(is_fec_packet), 586 connection_id_length_(connection_id_length), 587 includes_version_(includes_version), 588 sequence_number_length_(sequence_number_length) { 589} 590 591QuicEncryptedPacket::QuicEncryptedPacket(const char* buffer, 592 size_t length) 593 : QuicData(buffer, length) { 594} 595 596QuicEncryptedPacket::QuicEncryptedPacket(char* buffer, 597 size_t length, 598 bool owns_buffer) 599 : QuicData(buffer, length, owns_buffer) { 600} 601 602StringPiece QuicPacket::FecProtectedData() const { 603 const size_t start_of_fec = GetStartOfFecProtectedData( 604 connection_id_length_, includes_version_, sequence_number_length_); 605 return StringPiece(data() + start_of_fec, length() - start_of_fec); 606} 607 608StringPiece QuicPacket::AssociatedData() const { 609 return StringPiece( 610 data() + kStartOfHashData, 611 GetStartOfEncryptedData( 612 connection_id_length_, includes_version_, sequence_number_length_) - 613 kStartOfHashData); 614} 615 616StringPiece QuicPacket::BeforePlaintext() const { 617 return StringPiece(data(), GetStartOfEncryptedData(connection_id_length_, 618 includes_version_, 619 sequence_number_length_)); 620} 621 622StringPiece QuicPacket::Plaintext() const { 623 const size_t start_of_encrypted_data = 624 GetStartOfEncryptedData( 625 connection_id_length_, includes_version_, sequence_number_length_); 626 return StringPiece(data() + start_of_encrypted_data, 627 length() - start_of_encrypted_data); 628} 629 630RetransmittableFrames::RetransmittableFrames() 631 : encryption_level_(NUM_ENCRYPTION_LEVELS) { 632} 633 634RetransmittableFrames::~RetransmittableFrames() { 635 for (QuicFrames::iterator it = frames_.begin(); it != frames_.end(); ++it) { 636 switch (it->type) { 637 case PADDING_FRAME: 638 delete it->padding_frame; 639 break; 640 case STREAM_FRAME: 641 delete it->stream_frame; 642 break; 643 case ACK_FRAME: 644 delete it->ack_frame; 645 break; 646 case CONGESTION_FEEDBACK_FRAME: 647 delete it->congestion_feedback_frame; 648 break; 649 case STOP_WAITING_FRAME: 650 delete it->stop_waiting_frame; 651 break; 652 case PING_FRAME: 653 delete it->ping_frame; 654 break; 655 case RST_STREAM_FRAME: 656 delete it->rst_stream_frame; 657 break; 658 case CONNECTION_CLOSE_FRAME: 659 delete it->connection_close_frame; 660 break; 661 case GOAWAY_FRAME: 662 delete it->goaway_frame; 663 break; 664 case WINDOW_UPDATE_FRAME: 665 delete it->window_update_frame; 666 break; 667 case BLOCKED_FRAME: 668 delete it->blocked_frame; 669 break; 670 case NUM_FRAME_TYPES: 671 DCHECK(false) << "Cannot delete type: " << it->type; 672 } 673 } 674 STLDeleteElements(&stream_data_); 675} 676 677const QuicFrame& RetransmittableFrames::AddStreamFrame( 678 QuicStreamFrame* stream_frame) { 679 // Make an owned copy of the stream frame's data. 680 stream_data_.push_back(stream_frame->GetDataAsString()); 681 // Ensure the stream frame's IOVector points to the owned copy of the data. 682 stream_frame->data.Clear(); 683 stream_frame->data.Append(const_cast<char*>(stream_data_.back()->data()), 684 stream_data_.back()->size()); 685 frames_.push_back(QuicFrame(stream_frame)); 686 return frames_.back(); 687} 688 689const QuicFrame& RetransmittableFrames::AddNonStreamFrame( 690 const QuicFrame& frame) { 691 DCHECK_NE(frame.type, STREAM_FRAME); 692 frames_.push_back(frame); 693 return frames_.back(); 694} 695 696IsHandshake RetransmittableFrames::HasCryptoHandshake() const { 697 for (size_t i = 0; i < frames().size(); ++i) { 698 if (frames()[i].type == STREAM_FRAME && 699 frames()[i].stream_frame->stream_id == kCryptoStreamId) { 700 return IS_HANDSHAKE; 701 } 702 } 703 return NOT_HANDSHAKE; 704} 705 706void RetransmittableFrames::set_encryption_level(EncryptionLevel level) { 707 encryption_level_ = level; 708} 709 710SerializedPacket::SerializedPacket( 711 QuicPacketSequenceNumber sequence_number, 712 QuicSequenceNumberLength sequence_number_length, 713 QuicPacket* packet, 714 QuicPacketEntropyHash entropy_hash, 715 RetransmittableFrames* retransmittable_frames) 716 : sequence_number(sequence_number), 717 sequence_number_length(sequence_number_length), 718 packet(packet), 719 entropy_hash(entropy_hash), 720 retransmittable_frames(retransmittable_frames) { 721} 722 723SerializedPacket::~SerializedPacket() {} 724 725QuicEncryptedPacket* QuicEncryptedPacket::Clone() const { 726 char* buffer = new char[this->length()]; 727 memcpy(buffer, this->data(), this->length()); 728 return new QuicEncryptedPacket(buffer, this->length(), true); 729} 730 731ostream& operator<<(ostream& os, const QuicEncryptedPacket& s) { 732 os << s.length() << "-byte data"; 733 return os; 734} 735 736QuicConsumedData::QuicConsumedData(size_t bytes_consumed, 737 bool fin_consumed) 738 : bytes_consumed(bytes_consumed), 739 fin_consumed(fin_consumed) { 740} 741 742ostream& operator<<(ostream& os, const QuicConsumedData& s) { 743 os << "bytes_consumed: " << s.bytes_consumed 744 << " fin_consumed: " << s.fin_consumed; 745 return os; 746} 747 748WriteResult::WriteResult() 749 : status(WRITE_STATUS_ERROR), 750 bytes_written(0) { 751} 752 753WriteResult::WriteResult(WriteStatus status, 754 int bytes_written_or_error_code) 755 : status(status), 756 bytes_written(bytes_written_or_error_code) { 757} 758 759} // namespace net 760