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

Side by Side Diff: net/quic/quic_packet_creator.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_creator.h" 5 #include "net/quic/quic_packet_creator.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "net/quic/crypto/quic_random.h" 8 #include "net/quic/crypto/quic_random.h"
9 #include "net/quic/quic_fec_group.h" 9 #include "net/quic/quic_fec_group.h"
10 #include "net/quic/quic_utils.h" 10 #include "net/quic/quic_utils.h"
(...skipping 10 matching lines...) Expand all
21 QuicFramer* framer, 21 QuicFramer* framer,
22 QuicRandom* random_generator, 22 QuicRandom* random_generator,
23 bool is_server) 23 bool is_server)
24 : guid_(guid), 24 : guid_(guid),
25 framer_(framer), 25 framer_(framer),
26 random_generator_(random_generator), 26 random_generator_(random_generator),
27 sequence_number_(0), 27 sequence_number_(0),
28 fec_group_number_(0), 28 fec_group_number_(0),
29 is_server_(is_server), 29 is_server_(is_server),
30 send_version_in_packet_(!is_server), 30 send_version_in_packet_(!is_server),
31 packet_size_(GetPacketHeaderSize(send_version_in_packet_)) { 31 packet_size_(GetPacketHeaderSize(options_.send_guid_length,
32 send_version_in_packet_,
33 NOT_IN_FEC_GROUP)) {
32 framer_->set_fec_builder(this); 34 framer_->set_fec_builder(this);
33 } 35 }
34 36
35 QuicPacketCreator::~QuicPacketCreator() { 37 QuicPacketCreator::~QuicPacketCreator() {
36 } 38 }
37 39
38 void QuicPacketCreator::OnBuiltFecProtectedPayload( 40 void QuicPacketCreator::OnBuiltFecProtectedPayload(
39 const QuicPacketHeader& header, StringPiece payload) { 41 const QuicPacketHeader& header, StringPiece payload) {
40 if (fec_group_.get()) { 42 if (fec_group_.get()) {
41 fec_group_->Update(header, payload); 43 fec_group_->Update(header, payload);
42 } 44 }
43 } 45 }
44 46
45 bool QuicPacketCreator::ShouldSendFec(bool force_close) const { 47 bool QuicPacketCreator::ShouldSendFec(bool force_close) const {
46 return fec_group_.get() != NULL && 48 return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 &&
47 (force_close || 49 (force_close ||
48 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group); 50 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group);
49 } 51 }
50 52
51 void QuicPacketCreator::MaybeStartFEC() { 53 void QuicPacketCreator::MaybeStartFEC() {
52 if (options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) { 54 if (options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) {
55 DCHECK(queued_frames_.empty());
53 // Set the fec group number to the sequence number of the next packet. 56 // Set the fec group number to the sequence number of the next packet.
54 fec_group_number_ = sequence_number() + 1; 57 fec_group_number_ = sequence_number() + 1;
55 fec_group_.reset(new QuicFecGroup()); 58 fec_group_.reset(new QuicFecGroup());
59 packet_size_ = GetPacketHeaderSize(options_.send_guid_length,
60 send_version_in_packet_,
61 IN_FEC_GROUP);
62 DCHECK_LE(packet_size_, options_.max_packet_length);
56 } 63 }
57 } 64 }
58 65
59 // Stops serializing version of the protocol in packets sent after this call. 66 // Stops serializing version of the protocol in packets sent after this call.
60 // A packet that is already open might send kQuicVersionSize bytes less than the 67 // A packet that is already open might send kQuicVersionSize bytes less than the
61 // maximum packet size if we stop sending version before it is serialized. 68 // maximum packet size if we stop sending version before it is serialized.
62 void QuicPacketCreator::StopSendingVersion() { 69 void QuicPacketCreator::StopSendingVersion() {
63 DCHECK(send_version_in_packet_); 70 DCHECK(send_version_in_packet_);
64 send_version_in_packet_ = false; 71 send_version_in_packet_ = false;
65 if (packet_size_ > 0) { 72 if (packet_size_ > 0) {
66 DCHECK_LT(kQuicVersionSize, packet_size_); 73 DCHECK_LT(kQuicVersionSize, packet_size_);
67 packet_size_ -= kQuicVersionSize; 74 packet_size_ -= kQuicVersionSize;
68 } 75 }
69 } 76 }
70 77
71 bool QuicPacketCreator::HasRoomForStreamFrame() const { 78 bool QuicPacketCreator::HasRoomForStreamFrame() const {
72 return BytesFree() > QuicFramer::GetMinStreamFrameSize(); 79 return BytesFree() > QuicFramer::GetMinStreamFrameSize();
73 } 80 }
74 81
75 // static 82 // static
76 size_t QuicPacketCreator::StreamFramePacketOverhead(int num_frames, 83 size_t QuicPacketCreator::StreamFramePacketOverhead(
77 bool include_version) { 84 int num_frames,
78 return GetPacketHeaderSize(include_version) + 85 QuicGuidLength guid_length,
86 bool include_version,
87 InFecGroup is_in_fec_group) {
88 return GetPacketHeaderSize(guid_length, include_version, is_in_fec_group) +
79 QuicFramer::GetMinStreamFrameSize() * num_frames; 89 QuicFramer::GetMinStreamFrameSize() * num_frames;
80 } 90 }
81 91
82 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id, 92 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id,
83 StringPiece data, 93 StringPiece data,
84 QuicStreamOffset offset, 94 QuicStreamOffset offset,
85 bool fin, 95 bool fin,
86 QuicFrame* frame) { 96 QuicFrame* frame) {
87 DCHECK_GT(options_.max_packet_length, 97 DCHECK_GT(options_.max_packet_length,
88 StreamFramePacketOverhead(1, kIncludeVersion)); 98 StreamFramePacketOverhead(
99 1, PACKET_8BYTE_GUID, kIncludeVersion, IN_FEC_GROUP));
89 DCHECK(HasRoomForStreamFrame()); 100 DCHECK(HasRoomForStreamFrame());
90 101
91 const size_t free_bytes = BytesFree(); 102 const size_t free_bytes = BytesFree();
92 size_t bytes_consumed = 0; 103 size_t bytes_consumed = 0;
93 104
94 if (data.size() != 0) { 105 if (data.size() != 0) {
95 size_t max_data_len = free_bytes - QuicFramer::GetMinStreamFrameSize(); 106 size_t max_data_len = free_bytes - QuicFramer::GetMinStreamFrameSize();
96 bytes_consumed = min<size_t>(max_data_len, data.size()); 107 bytes_consumed = min<size_t>(max_data_len, data.size());
97 108
98 bool set_fin = fin && bytes_consumed == data.size(); // Last frame. 109 bool set_fin = fin && bytes_consumed == data.size(); // Last frame.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 } 151 }
141 152
142 SerializedPacket QuicPacketCreator::SerializePacket() { 153 SerializedPacket QuicPacketCreator::SerializePacket() {
143 DCHECK_EQ(false, queued_frames_.empty()); 154 DCHECK_EQ(false, queued_frames_.empty());
144 QuicPacketHeader header; 155 QuicPacketHeader header;
145 FillPacketHeader(fec_group_number_, false, false, &header); 156 FillPacketHeader(fec_group_number_, false, false, &header);
146 157
147 SerializedPacket serialized = framer_->ConstructFrameDataPacket( 158 SerializedPacket serialized = framer_->ConstructFrameDataPacket(
148 header, queued_frames_, packet_size_); 159 header, queued_frames_, packet_size_);
149 queued_frames_.clear(); 160 queued_frames_.clear();
150 packet_size_ = GetPacketHeaderSize(send_version_in_packet_); 161 packet_size_ = GetPacketHeaderSize(options_.send_guid_length,
162 send_version_in_packet_,
163 fec_group_.get() != NULL ?
164 IN_FEC_GROUP : NOT_IN_FEC_GROUP);
151 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); 165 serialized.retransmittable_frames = queued_retransmittable_frames_.release();
152 return serialized; 166 return serialized;
153 } 167 }
154 168
155 SerializedPacket QuicPacketCreator::SerializeFec() { 169 SerializedPacket QuicPacketCreator::SerializeFec() {
156 DCHECK_LT(0u, fec_group_->NumReceivedPackets()); 170 DCHECK_LT(0u, fec_group_->NumReceivedPackets());
157 DCHECK_EQ(0u, queued_frames_.size()); 171 DCHECK_EQ(0u, queued_frames_.size());
158 QuicPacketHeader header; 172 QuicPacketHeader header;
159 FillPacketHeader(fec_group_number_, true, 173 FillPacketHeader(fec_group_number_, true,
160 fec_group_->entropy_parity(), &header); 174 fec_group_->entropy_parity(), &header);
161 QuicFecData fec_data; 175 QuicFecData fec_data;
162 fec_data.fec_group = fec_group_->min_protected_packet(); 176 fec_data.fec_group = fec_group_->min_protected_packet();
163 fec_data.redundancy = fec_group_->payload_parity(); 177 fec_data.redundancy = fec_group_->payload_parity();
164 SerializedPacket serialized = framer_->ConstructFecPacket(header, fec_data); 178 SerializedPacket serialized = framer_->ConstructFecPacket(header, fec_data);
165 fec_group_.reset(NULL); 179 fec_group_.reset(NULL);
166 fec_group_number_ = 0; 180 fec_group_number_ = 0;
181 // Reset packet_size_, since the next packet may not have an FEC group.
182 packet_size_ = GetPacketHeaderSize(options_.send_guid_length,
183 send_version_in_packet_,
184 NOT_IN_FEC_GROUP);
167 DCHECK(serialized.packet); 185 DCHECK(serialized.packet);
168 DCHECK_GE(options_.max_packet_length, serialized.packet->length()); 186 DCHECK_GE(options_.max_packet_length, serialized.packet->length());
169 return serialized; 187 return serialized;
170 } 188 }
171 189
172 SerializedPacket QuicPacketCreator::SerializeConnectionClose( 190 SerializedPacket QuicPacketCreator::SerializeConnectionClose(
173 QuicConnectionCloseFrame* close_frame) { 191 QuicConnectionCloseFrame* close_frame) {
174 QuicFrames frames; 192 QuicFrames frames;
175 frames.push_back(QuicFrame(close_frame)); 193 frames.push_back(QuicFrame(close_frame));
176 return SerializeAllFrames(frames); 194 return SerializeAllFrames(frames);
(...skipping 15 matching lines...) Expand all
192 } 210 }
193 211
194 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group, 212 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group,
195 bool fec_flag, 213 bool fec_flag,
196 bool fec_entropy_flag, 214 bool fec_entropy_flag,
197 QuicPacketHeader* header) { 215 QuicPacketHeader* header) {
198 header->public_header.guid = guid_; 216 header->public_header.guid = guid_;
199 header->public_header.reset_flag = false; 217 header->public_header.reset_flag = false;
200 header->public_header.version_flag = send_version_in_packet_; 218 header->public_header.version_flag = send_version_in_packet_;
201 header->fec_flag = fec_flag; 219 header->fec_flag = fec_flag;
202 header->fec_entropy_flag = fec_entropy_flag;
203 header->packet_sequence_number = ++sequence_number_; 220 header->packet_sequence_number = ++sequence_number_;
221
222 bool entropy_flag;
204 if (header->packet_sequence_number == 1) { 223 if (header->packet_sequence_number == 1) {
224 DCHECK(!fec_flag);
205 // TODO(satyamshekhar): No entropy in the first message. 225 // TODO(satyamshekhar): No entropy in the first message.
206 // For crypto tests to pass. Fix this by using deterministic QuicRandom. 226 // For crypto tests to pass. Fix this by using deterministic QuicRandom.
207 header->entropy_flag = 0; 227 entropy_flag = 0;
228 } else if (fec_flag) {
229 // FEC packets don't have an entropy of their own. Entropy flag for FEC
230 // packets is the XOR of entropy of previous packets.
231 entropy_flag = fec_entropy_flag;
208 } else { 232 } else {
209 header->entropy_flag = random_generator_->RandBool(); 233 entropy_flag = random_generator_->RandBool();
210 } 234 }
235 header->entropy_flag = entropy_flag;
236 header->is_in_fec_group = fec_group == 0 ? NOT_IN_FEC_GROUP : IN_FEC_GROUP;
211 header->fec_group = fec_group; 237 header->fec_group = fec_group;
212 } 238 }
213 239
214 bool QuicPacketCreator::ShouldRetransmit(const QuicFrame& frame) { 240 bool QuicPacketCreator::ShouldRetransmit(const QuicFrame& frame) {
215 return frame.type != ACK_FRAME && frame.type != CONGESTION_FEEDBACK_FRAME && 241 return frame.type != ACK_FRAME && frame.type != CONGESTION_FEEDBACK_FRAME &&
216 frame.type != PADDING_FRAME; 242 frame.type != PADDING_FRAME;
217 } 243 }
218 244
219 bool QuicPacketCreator::AddFrame(const QuicFrame& frame, 245 bool QuicPacketCreator::AddFrame(const QuicFrame& frame,
220 bool save_retransmittable_frames) { 246 bool save_retransmittable_frames) {
(...skipping 15 matching lines...) Expand all
236 queued_frames_.push_back( 262 queued_frames_.push_back(
237 queued_retransmittable_frames_->AddNonStreamFrame(frame)); 263 queued_retransmittable_frames_->AddNonStreamFrame(frame));
238 } 264 }
239 } else { 265 } else {
240 queued_frames_.push_back(frame); 266 queued_frames_.push_back(frame);
241 } 267 }
242 return true; 268 return true;
243 } 269 }
244 270
245 } // namespace net 271 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698