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; | |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |