Chromium Code Reviews| 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_framer.h" | 5 #include "net/quic/quic_framer.h" |
| 6 | 6 |
| 7 #include "base/hash_tables.h" | 7 #include "base/hash_tables.h" |
| 8 #include "net/quic/crypto/quic_decrypter.h" | 8 #include "net/quic/crypto/quic_decrypter.h" |
| 9 #include "net/quic/crypto/quic_encrypter.h" | 9 #include "net/quic/crypto/quic_encrypter.h" |
| 10 #include "net/quic/quic_data_reader.h" | 10 #include "net/quic/quic_data_reader.h" |
| 11 #include "net/quic/quic_data_writer.h" | 11 #include "net/quic/quic_data_writer.h" |
| 12 #include "net/quic/quic_utils.h" | 12 #include "net/quic/quic_utils.h" |
| 13 | 13 |
| 14 using base::StringPiece; | 14 using base::StringPiece; |
| 15 using std::map; | |
| 15 | 16 |
| 16 namespace net { | 17 namespace net { |
| 17 | 18 |
| 18 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter) | 19 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter) |
| 19 : visitor_(NULL), | 20 : visitor_(NULL), |
| 20 fec_builder_(NULL), | 21 fec_builder_(NULL), |
| 21 error_(QUIC_NO_ERROR), | 22 error_(QUIC_NO_ERROR), |
| 22 decrypter_(decrypter), | 23 decrypter_(decrypter), |
| 23 encrypter_(encrypter) { | 24 encrypter_(encrypter) { |
| 24 } | 25 } |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 346 | 347 |
| 347 visitor_->OnStreamFrame(frame); | 348 visitor_->OnStreamFrame(frame); |
| 348 return true; | 349 return true; |
| 349 } | 350 } |
| 350 | 351 |
| 351 bool QuicFramer::ProcessPDUFrame() { | 352 bool QuicFramer::ProcessPDUFrame() { |
| 352 return false; | 353 return false; |
| 353 } | 354 } |
| 354 | 355 |
| 355 bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) { | 356 bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) { |
| 356 if (!reader_->ReadUInt48(&frame->received_info.largest_received)) { | 357 uint8 num_acked_packets; |
| 357 set_detailed_error("Unable to read largest received."); | 358 if (!reader_->ReadBytes(&num_acked_packets, 1)) { |
| 358 return false; | 359 set_detailed_error("Unable to read num acked packets."); |
| 359 } | |
| 360 uint64 time_received; | |
| 361 if (!reader_->ReadUInt64(&time_received)) { | |
| 362 set_detailed_error("Unable to read time received."); | |
| 363 return false; | |
| 364 } | |
| 365 frame->received_info.time_received = | |
| 366 QuicTime::FromMicroseconds(time_received); | |
| 367 | |
| 368 uint8 num_unacked_packets; | |
| 369 if (!reader_->ReadBytes(&num_unacked_packets, 1)) { | |
| 370 set_detailed_error("Unable to read num unacked packets."); | |
| 371 return false; | 360 return false; |
| 372 } | 361 } |
| 373 | 362 |
| 374 for (int i = 0; i < num_unacked_packets; ++i) { | 363 uint64 smallest_received; |
| 375 QuicPacketSequenceNumber sequence_number; | 364 if (!reader_->ReadUInt48(&smallest_received)) { |
| 376 if (!reader_->ReadUInt48(&sequence_number)) { | 365 set_detailed_error("Unable to read smallest received."); |
| 377 set_detailed_error("Unable to read sequence number in unacked packets."); | 366 return false; |
| 367 } | |
| 368 | |
| 369 if (num_acked_packets == 0u) { | |
|
jar (doing other things)
2012/11/30 16:50:33
Do we really ever send a 0 for the number of acked
Ian Swett
2012/12/04 21:40:19
It would seem very odd in practice, and right now
| |
| 370 // Ensures largest_received is set when no actual acks are transmitted. | |
| 371 frame->received_info.largest_received = smallest_received; | |
| 372 } else { | |
| 373 uint64 time_received_us; | |
| 374 if (!reader_->ReadUInt64(&time_received_us)) { | |
| 375 set_detailed_error("Unable to read time received."); | |
| 376 return false; | |
|
jar (doing other things)
2012/11/30 16:50:33
nit: indent by two more spaces.
Ryan Hamilton
2012/12/04 18:04:51
Weird, this appears to be a merge problem somehow.
| |
| 377 } | |
|
jar (doing other things)
2012/11/30 16:50:33
nit: indent by two more spaces.
Ryan Hamilton
2012/12/04 18:04:51
Done.
| |
| 378 | |
| 379 frame->received_info.RecordAck( | |
| 380 smallest_received, QuicTime::FromMicroseconds(time_received_us)); | |
| 381 | |
| 382 for (int i = 0; i < num_acked_packets - 1; ++i) { | |
| 383 uint8 sequence_delta; | |
| 384 if (!reader_->ReadBytes(&sequence_delta, 1)) { | |
| 385 set_detailed_error("Unable to read sequence delta in acked packets."); | |
| 386 return false; | |
| 387 } | |
| 388 int32 time_delta_us; | |
| 389 if (!reader_->ReadBytes(&time_delta_us, sizeof(time_delta_us))) { | |
| 390 set_detailed_error("Unable to read time delta in acked packets."); | |
| 378 return false; | 391 return false; |
|
jar (doing other things)
2012/11/30 16:50:33
nit: indent by two more spaces.
Ryan Hamilton
2012/12/04 18:04:51
Done.
| |
| 379 } | 392 } |
|
jar (doing other things)
2012/11/30 16:50:33
nit: indent by two more spaces.
Ryan Hamilton
2012/12/04 18:04:51
Done.
| |
| 380 frame->received_info.missing_packets.insert(sequence_number); | 393 frame->received_info.RecordAck( |
| 394 smallest_received + sequence_delta, | |
| 395 QuicTime::FromMicroseconds(time_received_us + time_delta_us)); | |
| 396 } | |
| 381 } | 397 } |
| 382 | 398 |
| 383 if (!reader_->ReadUInt48(&frame->sent_info.least_unacked)) { | 399 if (!reader_->ReadUInt48(&frame->sent_info.least_unacked)) { |
| 384 set_detailed_error("Unable to read least unacked."); | 400 set_detailed_error("Unable to read least unacked."); |
| 385 return false; | 401 return false; |
| 386 } | 402 } |
| 387 | 403 |
| 388 uint8 num_non_retransmiting_packets; | |
| 389 if (!reader_->ReadBytes(&num_non_retransmiting_packets, 1)) { | |
| 390 set_detailed_error("Unable to read num non-retransmitting."); | |
| 391 return false; | |
| 392 } | |
| 393 for (uint8 i = 0; i < num_non_retransmiting_packets; ++i) { | |
| 394 QuicPacketSequenceNumber sequence_number; | |
| 395 if (!reader_->ReadUInt48(&sequence_number)) { | |
| 396 set_detailed_error( | |
| 397 "Unable to read sequence number in non-retransmitting."); | |
| 398 return false; | |
| 399 } | |
| 400 frame->sent_info.non_retransmiting.insert(sequence_number); | |
| 401 } | |
| 402 | |
| 403 uint8 congestion_info_type; | 404 uint8 congestion_info_type; |
| 404 if (!reader_->ReadBytes(&congestion_info_type, 1)) { | 405 if (!reader_->ReadBytes(&congestion_info_type, 1)) { |
| 405 set_detailed_error("Unable to read congestion info type."); | 406 set_detailed_error("Unable to read congestion info type."); |
| 406 return false; | 407 return false; |
| 407 } | 408 } |
| 408 frame->congestion_info.type = | 409 frame->congestion_info.type = |
| 409 static_cast<CongestionFeedbackType>(congestion_info_type); | 410 static_cast<CongestionFeedbackType>(congestion_info_type); |
| 410 | 411 |
| 411 switch (frame->congestion_info.type) { | 412 switch (frame->congestion_info.type) { |
| 412 case kNone: | 413 case kNone: |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 575 len += 1; // fin | 576 len += 1; // fin |
| 576 len += 8; // offset | 577 len += 8; // offset |
| 577 len += 2; // space for the 16 bit length | 578 len += 2; // space for the 16 bit length |
| 578 len += frame.stream_frame->data.size(); | 579 len += frame.stream_frame->data.size(); |
| 579 break; | 580 break; |
| 580 case PDU_FRAME: | 581 case PDU_FRAME: |
| 581 DLOG(INFO) << "PDU_FRAME not yet supported"; | 582 DLOG(INFO) << "PDU_FRAME not yet supported"; |
| 582 break; // Need to support this eventually :> | 583 break; // Need to support this eventually :> |
| 583 case ACK_FRAME: { | 584 case ACK_FRAME: { |
| 584 const QuicAckFrame& ack = *frame.ack_frame; | 585 const QuicAckFrame& ack = *frame.ack_frame; |
| 586 len += 1; // num acked packets | |
| 585 len += 6; // largest received packet sequence number | 587 len += 6; // largest received packet sequence number |
| 586 len += 8; // time delta | 588 if (ack.received_info.received_packet_times.size() > 0) { |
| 587 len += 1; // num missing packets | 589 len += 8; // time |
| 588 len += 6 * ack.received_info.missing_packets.size(); | 590 len += 5 * (ack.received_info.received_packet_times.size() - 1); |
|
jar (doing other things)
2012/11/30 16:50:33
nit: add comment about what is included in this pr
Ian Swett
2012/12/04 21:40:19
Done in cleanup CL.
| |
| 591 } | |
| 589 len += 6; // least packet sequence number awaiting an ack | 592 len += 6; // least packet sequence number awaiting an ack |
| 590 len += 1; // num non retransmitting packets | |
| 591 len += 6 * ack.sent_info.non_retransmiting.size(); | |
| 592 len += 1; // congestion control type | 593 len += 1; // congestion control type |
| 593 switch (ack.congestion_info.type) { | 594 switch (ack.congestion_info.type) { |
| 594 case kNone: | 595 case kNone: |
| 595 break; | 596 break; |
| 596 case kInterArrival: | 597 case kInterArrival: |
| 597 len += 6; | 598 len += 6; |
| 598 break; | 599 break; |
| 599 case kFixRate: | 600 case kFixRate: |
| 600 len += 4; | 601 len += 4; |
| 601 break; | 602 break; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 649 if (!writer->WriteBytes(frame.data.data(), | 650 if (!writer->WriteBytes(frame.data.data(), |
| 650 frame.data.size())) { | 651 frame.data.size())) { |
| 651 return false; | 652 return false; |
| 652 } | 653 } |
| 653 return true; | 654 return true; |
| 654 } | 655 } |
| 655 | 656 |
| 656 bool QuicFramer::AppendAckFramePayload( | 657 bool QuicFramer::AppendAckFramePayload( |
| 657 const QuicAckFrame& frame, | 658 const QuicAckFrame& frame, |
| 658 QuicDataWriter* writer) { | 659 QuicDataWriter* writer) { |
| 659 if (!writer->WriteUInt48(frame.received_info.largest_received)) { | 660 uint8 num_acked_packets = frame.received_info.received_packet_times.size(); |
| 661 if (!writer->WriteBytes(&num_acked_packets, 1)) { | |
| 662 return false; | |
| 663 } | |
| 664 if (num_acked_packets == 0) { | |
| 665 // Special case when no packets are acked, just transmit the largest. | |
|
jar (doing other things)
2012/11/30 16:50:33
I'm confused about why this is needed/used.
Ian Swett
2012/12/04 21:40:19
Agreed, fixed in HEAD.
| |
| 666 if (!writer->WriteUInt48(frame.received_info.largest_received)) { | |
| 667 return false; | |
| 668 } | |
|
jar (doing other things)
2012/11/30 16:50:33
nit: indent last two lines.
Ryan Hamilton
2012/12/04 18:04:51
codereview seems to be confused. This is correctl
| |
| 669 } else { | |
| 670 map<QuicPacketSequenceNumber, QuicTime>::const_iterator it = | |
| 671 frame.received_info.received_packet_times.begin(); | |
| 672 | |
| 673 QuicPacketSequenceNumber lowest_sequence = it->first; | |
| 674 if (!writer->WriteUInt48(lowest_sequence)) { | |
| 660 return false; | 675 return false; |
| 661 } | 676 } |
|
jar (doing other things)
2012/11/30 16:50:33
nit: indent last two lines.
Is there any chance t
Ryan Hamilton
2012/12/04 18:04:51
This is also correct in the file. Not sure why co
| |
| 662 | 677 |
| 663 if (!writer->WriteUInt64( | 678 QuicTime lowest_time = it->second; |
| 664 frame.received_info.time_received.ToMicroseconds())) { | 679 // TODO(ianswett): Use time deltas from the connection's first received |
| 680 // packet. | |
| 681 if (!writer->WriteUInt64(lowest_time.ToMicroseconds())) { | |
| 682 return false; | |
| 683 } | |
| 684 | |
| 685 for (++it; it != frame.received_info.received_packet_times.end(); ++it) { | |
| 686 QuicPacketSequenceNumber sequence_delta = it->first - lowest_sequence; | |
| 687 if (!writer->WriteBytes(&sequence_delta, 1)) { | |
| 665 return false; | 688 return false; |
| 666 } | 689 } |
|
jar (doing other things)
2012/11/30 16:50:33
nit: indent last 2 lines by 4 more spaces.
Ryan Hamilton
2012/12/04 18:04:51
ditto.
| |
| 667 | 690 |
| 668 size_t num_unacked_packets = frame.received_info.missing_packets.size(); | 691 int32 time_delta_us = it->second.Subtract(lowest_time).ToMicroseconds(); |
| 669 if (!writer->WriteBytes(&num_unacked_packets, 1)) { | 692 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) { |
| 670 return false; | 693 return false; |
| 671 } | 694 } |
|
jar (doing other things)
2012/11/30 16:50:33
nit: indent last two lines.
Ryan Hamilton
2012/12/04 18:04:51
ditto
| |
| 672 | |
| 673 SequenceSet::const_iterator it = frame.received_info.missing_packets.begin(); | |
| 674 for (; it != frame.received_info.missing_packets.end(); ++it) { | |
| 675 if (!writer->WriteUInt48(*it)) { | |
| 676 return false; | |
| 677 } | 695 } |
| 678 } | 696 } |
| 679 | 697 |
| 680 if (!writer->WriteUInt48(frame.sent_info.least_unacked)) { | 698 if (!writer->WriteUInt48(frame.sent_info.least_unacked)) { |
| 681 return false; | |
| 682 } | |
| 683 | |
| 684 size_t num_non_retransmiting_packets = | |
| 685 frame.sent_info.non_retransmiting.size(); | |
| 686 if (!writer->WriteBytes(&num_non_retransmiting_packets, 1)) { | |
| 687 return false; | |
| 688 } | |
| 689 | |
| 690 it = frame.sent_info.non_retransmiting.begin(); | |
| 691 while (it != frame.sent_info.non_retransmiting.end()) { | |
| 692 if (!writer->WriteUInt48(*it)) { | |
| 693 return false; | 699 return false; |
| 694 } | 700 } |
| 695 ++it; | |
| 696 } | |
| 697 | 701 |
| 698 if (!writer->WriteBytes(&frame.congestion_info.type, 1)) { | 702 if (!writer->WriteBytes(&frame.congestion_info.type, 1)) { |
| 699 return false; | 703 return false; |
| 700 } | 704 } |
| 701 | 705 |
| 702 switch (frame.congestion_info.type) { | 706 switch (frame.congestion_info.type) { |
| 703 case kNone: | 707 case kNone: |
| 704 break; | 708 break; |
| 705 case kInterArrival: { | 709 case kInterArrival: { |
| 706 const CongestionFeedbackMessageInterArrival& inter_arrival = | 710 const CongestionFeedbackMessageInterArrival& inter_arrival = |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 779 | 783 |
| 780 bool QuicFramer::RaiseError(QuicErrorCode error) { | 784 bool QuicFramer::RaiseError(QuicErrorCode error) { |
| 781 DLOG(INFO) << detailed_error_; | 785 DLOG(INFO) << detailed_error_; |
| 782 set_error(error); | 786 set_error(error); |
| 783 visitor_->OnError(this); | 787 visitor_->OnError(this); |
| 784 reader_.reset(NULL); | 788 reader_.reset(NULL); |
| 785 return false; | 789 return false; |
| 786 } | 790 } |
| 787 | 791 |
| 788 } // namespace net | 792 } // namespace net |
| OLD | NEW |