| 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_packet_generator.h" | 5 #include "net/quic/quic_packet_generator.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "net/quic/quic_fec_group.h" | 8 #include "net/quic/quic_fec_group.h" |
| 9 #include "net/quic/quic_utils.h" | 9 #include "net/quic/quic_utils.h" |
| 10 | 10 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 break; | 48 break; |
| 49 case NUM_FRAME_TYPES: | 49 case NUM_FRAME_TYPES: |
| 50 DCHECK(false) << "Cannot delete type: " << it->type; | 50 DCHECK(false) << "Cannot delete type: " << it->type; |
| 51 } | 51 } |
| 52 } | 52 } |
| 53 } | 53 } |
| 54 | 54 |
| 55 void QuicPacketGenerator::SetShouldSendAck(bool also_send_feedback) { | 55 void QuicPacketGenerator::SetShouldSendAck(bool also_send_feedback) { |
| 56 should_send_ack_ = true; | 56 should_send_ack_ = true; |
| 57 should_send_feedback_ = also_send_feedback; | 57 should_send_feedback_ = also_send_feedback; |
| 58 SendQueuedData(); | 58 SendQueuedFrames(); |
| 59 } | 59 } |
| 60 | 60 |
| 61 | 61 |
| 62 void QuicPacketGenerator::AddControlFrame(const QuicFrame& frame) { | 62 void QuicPacketGenerator::AddControlFrame(const QuicFrame& frame) { |
| 63 queued_control_frames_.push_back(frame); | 63 queued_control_frames_.push_back(frame); |
| 64 SendQueuedData(); | 64 SendQueuedFrames(); |
| 65 } | 65 } |
| 66 | 66 |
| 67 QuicConsumedData QuicPacketGenerator::ConsumeData(QuicStreamId id, | 67 QuicConsumedData QuicPacketGenerator::ConsumeData(QuicStreamId id, |
| 68 StringPiece data, | 68 StringPiece data, |
| 69 QuicStreamOffset offset, | 69 QuicStreamOffset offset, |
| 70 bool fin) { | 70 bool fin) { |
| 71 SendQueuedData(); | 71 SendQueuedFrames(); |
| 72 | 72 |
| 73 size_t total_bytes_consumed = 0; | 73 size_t total_bytes_consumed = 0; |
| 74 bool fin_consumed = false; | 74 bool fin_consumed = false; |
| 75 | 75 |
| 76 while (delegate_->CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)) { | 76 while (delegate_->CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)) { |
| 77 // TODO(rch) figure out FEC. | |
| 78 // packet_creator_.MaybeStartFEC(); | |
| 79 QuicFrame frame; | 77 QuicFrame frame; |
| 80 size_t bytes_consumed = packet_creator_->CreateStreamFrame( | 78 size_t bytes_consumed = packet_creator_->CreateStreamFrame( |
| 81 id, data, offset + total_bytes_consumed, fin, &frame); | 79 id, data, offset + total_bytes_consumed, fin, &frame); |
| 82 bool success = packet_creator_->AddSavedFrame(frame); | 80 bool success = packet_creator_->AddSavedFrame(frame); |
| 83 DCHECK(success); | 81 DCHECK(success); |
| 84 | 82 |
| 85 total_bytes_consumed += bytes_consumed; | 83 total_bytes_consumed += bytes_consumed; |
| 86 fin_consumed = fin && bytes_consumed == data.size(); | 84 fin_consumed = fin && bytes_consumed == data.size(); |
| 87 data.remove_prefix(bytes_consumed); | 85 data.remove_prefix(bytes_consumed); |
| 88 DCHECK(data.empty() || packet_creator_->BytesFree() == 0u); | 86 DCHECK(data.empty() || packet_creator_->BytesFree() == 0u); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 105 if (should_flush_ && packet_creator_->ShouldSendFec(true)) { | 103 if (should_flush_ && packet_creator_->ShouldSendFec(true)) { |
| 106 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); | 104 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); |
| 107 DCHECK(serialized_fec.packet); | 105 DCHECK(serialized_fec.packet); |
| 108 delegate_->OnSerializedPacket(serialized_fec); | 106 delegate_->OnSerializedPacket(serialized_fec); |
| 109 } | 107 } |
| 110 | 108 |
| 111 DCHECK(!should_flush_ || !packet_creator_->HasPendingFrames()); | 109 DCHECK(!should_flush_ || !packet_creator_->HasPendingFrames()); |
| 112 return QuicConsumedData(total_bytes_consumed, fin_consumed); | 110 return QuicConsumedData(total_bytes_consumed, fin_consumed); |
| 113 } | 111 } |
| 114 | 112 |
| 115 void QuicPacketGenerator::SendQueuedData() { | 113 void QuicPacketGenerator::SendQueuedFrames() { |
| 116 while (HasPendingData() && delegate_->CanWrite(NOT_RETRANSMISSION, | 114 packet_creator_->MaybeStartFEC(); |
| 115 while (HasPendingFrames() && delegate_->CanWrite(NOT_RETRANSMISSION, |
| 117 packet_creator_->HasPendingFrames() ? | 116 packet_creator_->HasPendingFrames() ? |
| 118 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA)) { | 117 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA)) { |
| 119 if (!AddNextPendingFrame()) { | 118 if (!AddNextPendingFrame()) { |
| 120 // Packet was full, so serialize and send it. | 119 // Packet was full, so serialize and send it. |
| 121 SerializeAndSendPacket(); | 120 SerializeAndSendPacket(); |
| 122 } | 121 } |
| 123 } | 122 } |
| 124 | 123 |
| 125 if (should_flush_) { | 124 if (should_flush_) { |
| 126 if (packet_creator_->HasPendingFrames()) { | 125 if (packet_creator_->HasPendingFrames()) { |
| 127 SerializeAndSendPacket(); | 126 SerializeAndSendPacket(); |
| 128 } | 127 } |
| 129 | 128 |
| 130 // Ensure the FEC group is closed at the end of this method unless other | 129 // Ensure the FEC group is closed at the end of this method unless other |
| 131 // writes are pending. | 130 // writes are pending. |
| 132 if (packet_creator_->ShouldSendFec(true)) { | 131 if (packet_creator_->ShouldSendFec(true)) { |
| 133 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); | 132 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); |
| 134 DCHECK(serialized_fec.packet); | 133 DCHECK(serialized_fec.packet); |
| 135 delegate_->OnSerializedPacket(serialized_fec); | 134 delegate_->OnSerializedPacket(serialized_fec); |
| 135 packet_creator_->MaybeStartFEC(); |
| 136 } | 136 } |
| 137 } | 137 } |
| 138 } | 138 } |
| 139 | 139 |
| 140 void QuicPacketGenerator::StartBatchOperations() { | 140 void QuicPacketGenerator::StartBatchOperations() { |
| 141 should_flush_ = false; | 141 should_flush_ = false; |
| 142 } | 142 } |
| 143 | 143 |
| 144 void QuicPacketGenerator::FinishBatchOperations() { | 144 void QuicPacketGenerator::FinishBatchOperations() { |
| 145 should_flush_ = true; | 145 should_flush_ = true; |
| 146 SendQueuedData(); | 146 SendQueuedFrames(); |
| 147 } | 147 } |
| 148 | 148 |
| 149 bool QuicPacketGenerator::HasQueuedData() const { | 149 bool QuicPacketGenerator::HasQueuedFrames() const { |
| 150 return packet_creator_->HasPendingFrames() || HasPendingData(); | 150 return packet_creator_->HasPendingFrames() || HasPendingFrames(); |
| 151 } | 151 } |
| 152 | 152 |
| 153 bool QuicPacketGenerator::HasPendingData() const { | 153 bool QuicPacketGenerator::HasPendingFrames() const { |
| 154 return should_send_ack_ || should_send_feedback_ || | 154 return should_send_ack_ || should_send_feedback_ || |
| 155 !queued_control_frames_.empty(); | 155 !queued_control_frames_.empty(); |
| 156 } | 156 } |
| 157 | 157 |
| 158 bool QuicPacketGenerator::AddNextPendingFrame() { | 158 bool QuicPacketGenerator::AddNextPendingFrame() { |
| 159 if (should_send_ack_) { | 159 if (should_send_ack_) { |
| 160 pending_ack_frame_.reset(delegate_->CreateAckFrame()); | 160 pending_ack_frame_.reset(delegate_->CreateAckFrame()); |
| 161 if (!packet_creator_->AddSavedFrame(QuicFrame(pending_ack_frame_.get()))) { | 161 if (!packet_creator_->AddSavedFrame(QuicFrame(pending_ack_frame_.get()))) { |
| 162 // packet was full | 162 // packet was full |
| 163 return false; | 163 return false; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 180 DCHECK(!queued_control_frames_.empty()); | 180 DCHECK(!queued_control_frames_.empty()); |
| 181 if (!packet_creator_->AddSavedFrame(queued_control_frames_.back())) { | 181 if (!packet_creator_->AddSavedFrame(queued_control_frames_.back())) { |
| 182 // packet was full | 182 // packet was full |
| 183 return false; | 183 return false; |
| 184 } | 184 } |
| 185 queued_control_frames_.pop_back(); | 185 queued_control_frames_.pop_back(); |
| 186 return true; | 186 return true; |
| 187 } | 187 } |
| 188 | 188 |
| 189 void QuicPacketGenerator::SerializeAndSendPacket() { | 189 void QuicPacketGenerator::SerializeAndSendPacket() { |
| 190 packet_creator_->MaybeStartFEC(); | |
| 191 SerializedPacket serialized_packet = packet_creator_->SerializePacket(); | 190 SerializedPacket serialized_packet = packet_creator_->SerializePacket(); |
| 192 DCHECK(serialized_packet.packet); | 191 DCHECK(serialized_packet.packet); |
| 193 delegate_->OnSerializedPacket(serialized_packet); | 192 delegate_->OnSerializedPacket(serialized_packet); |
| 194 | 193 |
| 195 if (packet_creator_->ShouldSendFec(false)) { | 194 if (packet_creator_->ShouldSendFec(false)) { |
| 196 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); | 195 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); |
| 197 DCHECK(serialized_fec.packet); | 196 DCHECK(serialized_fec.packet); |
| 198 delegate_->OnSerializedPacket(serialized_fec); | 197 delegate_->OnSerializedPacket(serialized_fec); |
| 198 packet_creator_->MaybeStartFEC(); |
| 199 } | 199 } |
| 200 } | 200 } |
| 201 | 201 |
| 202 } // namespace net | 202 } // namespace net |
| OLD | NEW |