Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: net/quic/quic_framer.cc

Issue 11439003: Revert 171096 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_connection_test.cc ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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;
16 15
17 namespace net { 16 namespace net {
18 17
19 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter) 18 QuicFramer::QuicFramer(QuicDecrypter* decrypter, QuicEncrypter* encrypter)
20 : visitor_(NULL), 19 : visitor_(NULL),
21 fec_builder_(NULL), 20 fec_builder_(NULL),
22 error_(QUIC_NO_ERROR), 21 error_(QUIC_NO_ERROR),
23 decrypter_(decrypter), 22 decrypter_(decrypter),
24 encrypter_(encrypter) { 23 encrypter_(encrypter) {
25 } 24 }
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 346
348 visitor_->OnStreamFrame(frame); 347 visitor_->OnStreamFrame(frame);
349 return true; 348 return true;
350 } 349 }
351 350
352 bool QuicFramer::ProcessPDUFrame() { 351 bool QuicFramer::ProcessPDUFrame() {
353 return false; 352 return false;
354 } 353 }
355 354
356 bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) { 355 bool QuicFramer::ProcessAckFrame(QuicAckFrame* frame) {
357 uint8 num_acked_packets; 356 if (!reader_->ReadUInt48(&frame->received_info.largest_received)) {
358 if (!reader_->ReadBytes(&num_acked_packets, 1)) { 357 set_detailed_error("Unable to read largest received.");
359 set_detailed_error("Unable to read num acked packets."); 358 return false;
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.");
360 return false; 371 return false;
361 } 372 }
362 373
363 uint64 smallest_received; 374 for (int i = 0; i < num_unacked_packets; ++i) {
364 if (!reader_->ReadUInt48(&smallest_received)) { 375 QuicPacketSequenceNumber sequence_number;
365 set_detailed_error("Unable to read smallest received."); 376 if (!reader_->ReadUInt48(&sequence_number)) {
366 return false; 377 set_detailed_error("Unable to read sequence number in unacked packets.");
367 }
368
369 if (num_acked_packets == 0u) {
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; 378 return false;
377 } 379 }
378 380 frame->received_info.missing_packets.insert(sequence_number);
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.");
391 return false;
392 }
393 frame->received_info.RecordAck(
394 smallest_received + sequence_delta,
395 QuicTime::FromMicroseconds(time_received_us + time_delta_us));
396 }
397 } 381 }
398 382
399 if (!reader_->ReadUInt48(&frame->sent_info.least_unacked)) { 383 if (!reader_->ReadUInt48(&frame->sent_info.least_unacked)) {
400 set_detailed_error("Unable to read least unacked."); 384 set_detailed_error("Unable to read least unacked.");
401 return false; 385 return false;
402 } 386 }
403 387
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
404 uint8 congestion_info_type; 403 uint8 congestion_info_type;
405 if (!reader_->ReadBytes(&congestion_info_type, 1)) { 404 if (!reader_->ReadBytes(&congestion_info_type, 1)) {
406 set_detailed_error("Unable to read congestion info type."); 405 set_detailed_error("Unable to read congestion info type.");
407 return false; 406 return false;
408 } 407 }
409 frame->congestion_info.type = 408 frame->congestion_info.type =
410 static_cast<CongestionFeedbackType>(congestion_info_type); 409 static_cast<CongestionFeedbackType>(congestion_info_type);
411 410
412 switch (frame->congestion_info.type) { 411 switch (frame->congestion_info.type) {
413 case kNone: 412 case kNone:
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 len += 1; // fin 575 len += 1; // fin
577 len += 8; // offset 576 len += 8; // offset
578 len += 2; // space for the 16 bit length 577 len += 2; // space for the 16 bit length
579 len += frame.stream_frame->data.size(); 578 len += frame.stream_frame->data.size();
580 break; 579 break;
581 case PDU_FRAME: 580 case PDU_FRAME:
582 DLOG(INFO) << "PDU_FRAME not yet supported"; 581 DLOG(INFO) << "PDU_FRAME not yet supported";
583 break; // Need to support this eventually :> 582 break; // Need to support this eventually :>
584 case ACK_FRAME: { 583 case ACK_FRAME: {
585 const QuicAckFrame& ack = *frame.ack_frame; 584 const QuicAckFrame& ack = *frame.ack_frame;
586 len += 1; // num acked packets
587 len += 6; // largest received packet sequence number 585 len += 6; // largest received packet sequence number
588 if (ack.received_info.received_packet_times.size() > 0) { 586 len += 8; // time delta
589 len += 8; // time 587 len += 1; // num missing packets
590 len += 5 * (ack.received_info.received_packet_times.size() - 1); 588 len += 6 * ack.received_info.missing_packets.size();
591 }
592 len += 6; // least packet sequence number awaiting an ack 589 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();
593 len += 1; // congestion control type 592 len += 1; // congestion control type
594 switch (ack.congestion_info.type) { 593 switch (ack.congestion_info.type) {
595 case kNone: 594 case kNone:
596 break; 595 break;
597 case kInterArrival: 596 case kInterArrival:
598 len += 6; 597 len += 6;
599 break; 598 break;
600 case kFixRate: 599 case kFixRate:
601 len += 4; 600 len += 4;
602 break; 601 break;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
650 if (!writer->WriteBytes(frame.data.data(), 649 if (!writer->WriteBytes(frame.data.data(),
651 frame.data.size())) { 650 frame.data.size())) {
652 return false; 651 return false;
653 } 652 }
654 return true; 653 return true;
655 } 654 }
656 655
657 bool QuicFramer::AppendAckFramePayload( 656 bool QuicFramer::AppendAckFramePayload(
658 const QuicAckFrame& frame, 657 const QuicAckFrame& frame,
659 QuicDataWriter* writer) { 658 QuicDataWriter* writer) {
660 uint8 num_acked_packets = frame.received_info.received_packet_times.size(); 659 if (!writer->WriteUInt48(frame.received_info.largest_received)) {
661 if (!writer->WriteBytes(&num_acked_packets, 1)) {
662 return false; 660 return false;
663 } 661 }
664 if (num_acked_packets == 0) { 662
665 // Special case when no packets are acked, just transmit the largest. 663 if (!writer->WriteUInt64(
666 if (!writer->WriteUInt48(frame.received_info.largest_received)) { 664 frame.received_info.time_received.ToMicroseconds())) {
665 return false;
666 }
667
668 size_t num_unacked_packets = frame.received_info.missing_packets.size();
669 if (!writer->WriteBytes(&num_unacked_packets, 1)) {
670 return false;
671 }
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)) {
667 return false; 676 return false;
668 } 677 }
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)) {
675 return false;
676 }
677
678 QuicTime lowest_time = it->second;
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)) {
688 return false;
689 }
690
691 int32 time_delta_us = it->second.Subtract(lowest_time).ToMicroseconds();
692 if (!writer->WriteBytes(&time_delta_us, sizeof(time_delta_us))) {
693 return false;
694 }
695 }
696 } 678 }
697 679
698 if (!writer->WriteUInt48(frame.sent_info.least_unacked)) { 680 if (!writer->WriteUInt48(frame.sent_info.least_unacked)) {
699 return false; 681 return false;
700 } 682 }
701 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;
694 }
695 ++it;
696 }
697
702 if (!writer->WriteBytes(&frame.congestion_info.type, 1)) { 698 if (!writer->WriteBytes(&frame.congestion_info.type, 1)) {
703 return false; 699 return false;
704 } 700 }
705 701
706 switch (frame.congestion_info.type) { 702 switch (frame.congestion_info.type) {
707 case kNone: 703 case kNone:
708 break; 704 break;
709 case kInterArrival: { 705 case kInterArrival: {
710 const CongestionFeedbackMessageInterArrival& inter_arrival = 706 const CongestionFeedbackMessageInterArrival& inter_arrival =
711 frame.congestion_info.inter_arrival; 707 frame.congestion_info.inter_arrival;
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
783 779
784 bool QuicFramer::RaiseError(QuicErrorCode error) { 780 bool QuicFramer::RaiseError(QuicErrorCode error) {
785 DLOG(INFO) << detailed_error_; 781 DLOG(INFO) << detailed_error_;
786 set_error(error); 782 set_error(error);
787 visitor_->OnError(this); 783 visitor_->OnError(this);
788 reader_.reset(NULL); 784 reader_.reset(NULL);
789 return false; 785 return false;
790 } 786 }
791 787
792 } // namespace net 788 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection_test.cc ('k') | net/quic/quic_framer_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698