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

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

Issue 15937012: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Small bug fixes Created 7 years, 6 months 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
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_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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698