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

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

Issue 12806002: Land Recent QUIC Changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: minor comment fix Created 7 years, 9 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
« no previous file with comments | « net/quic/quic_packet_creator.h ('k') | net/quic/quic_packet_creator_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_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"
11 11
12
13 using base::StringPiece; 12 using base::StringPiece;
14 using std::make_pair; 13 using std::make_pair;
15 using std::min; 14 using std::min;
16 using std::pair; 15 using std::pair;
17 using std::vector; 16 using std::vector;
18 17
19 namespace net { 18 namespace net {
20 19
21 QuicPacketCreator::QuicPacketCreator(QuicGuid guid, 20 QuicPacketCreator::QuicPacketCreator(QuicGuid guid,
22 QuicFramer* framer, 21 QuicFramer* framer,
23 QuicRandom* random_generator) 22 QuicRandom* random_generator,
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 // TODO(satyashekhar): Fix this when versioning is implemented. 29 is_server_(is_server),
30 packet_size_(GetPacketHeaderSize(!kIncludeVersion)) { 30 send_version_in_packet_(!is_server),
31 packet_size_(GetPacketHeaderSize(send_version_in_packet_)) {
31 framer_->set_fec_builder(this); 32 framer_->set_fec_builder(this);
32 } 33 }
33 34
34 QuicPacketCreator::~QuicPacketCreator() { 35 QuicPacketCreator::~QuicPacketCreator() {
35 } 36 }
36 37
37 void QuicPacketCreator::OnBuiltFecProtectedPayload( 38 void QuicPacketCreator::OnBuiltFecProtectedPayload(
38 const QuicPacketHeader& header, StringPiece payload) { 39 const QuicPacketHeader& header, StringPiece payload) {
39 if (fec_group_.get()) { 40 if (fec_group_.get()) {
40 fec_group_->Update(header, payload); 41 fec_group_->Update(header, payload);
41 } 42 }
42 } 43 }
43 44
44 bool QuicPacketCreator::ShouldSendFec(bool force_close) const { 45 bool QuicPacketCreator::ShouldSendFec(bool force_close) const {
45 return fec_group_.get() != NULL && 46 return fec_group_.get() != NULL &&
46 (force_close || 47 (force_close ||
47 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group); 48 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group);
48 } 49 }
49 50
50 void QuicPacketCreator::MaybeStartFEC() { 51 void QuicPacketCreator::MaybeStartFEC() {
51 if (options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) { 52 if (options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) {
52 // Set the fec group number to the sequence number of the next packet. 53 // Set the fec group number to the sequence number of the next packet.
53 fec_group_number_ = sequence_number() + 1; 54 fec_group_number_ = sequence_number() + 1;
54 fec_group_.reset(new QuicFecGroup()); 55 fec_group_.reset(new QuicFecGroup());
55 } 56 }
56 } 57 }
57 58
59 // 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
61 // maximum packet size if we stop sending version before it is serialized.
62 void QuicPacketCreator::StopSendingVersion() {
63 DCHECK(send_version_in_packet_);
64 send_version_in_packet_ = false;
65 if (packet_size_ > 0) {
66 DCHECK_LT(kQuicVersionSize, packet_size_);
67 packet_size_ -= kQuicVersionSize;
68 }
69 }
70
58 bool QuicPacketCreator::HasRoomForStreamFrame() const { 71 bool QuicPacketCreator::HasRoomForStreamFrame() const {
59 return BytesFree() > QuicFramer::GetMinStreamFrameSize(); 72 return BytesFree() > QuicFramer::GetMinStreamFrameSize();
60 } 73 }
61 74
62 // static 75 // static
63 size_t QuicPacketCreator::StreamFramePacketOverhead(int num_frames, 76 size_t QuicPacketCreator::StreamFramePacketOverhead(int num_frames,
64 bool include_version) { 77 bool include_version) {
65 return GetPacketHeaderSize(include_version) + 78 return GetPacketHeaderSize(include_version) +
66 QuicFramer::GetMinStreamFrameSize() * num_frames; 79 QuicFramer::GetMinStreamFrameSize() * num_frames;
67 } 80 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 } 140 }
128 141
129 SerializedPacket QuicPacketCreator::SerializePacket() { 142 SerializedPacket QuicPacketCreator::SerializePacket() {
130 DCHECK_EQ(false, queued_frames_.empty()); 143 DCHECK_EQ(false, queued_frames_.empty());
131 QuicPacketHeader header; 144 QuicPacketHeader header;
132 FillPacketHeader(fec_group_number_, false, false, &header); 145 FillPacketHeader(fec_group_number_, false, false, &header);
133 146
134 SerializedPacket serialized = framer_->ConstructFrameDataPacket( 147 SerializedPacket serialized = framer_->ConstructFrameDataPacket(
135 header, queued_frames_, packet_size_); 148 header, queued_frames_, packet_size_);
136 queued_frames_.clear(); 149 queued_frames_.clear();
137 // TODO(satyamshekhar) Fix this versioning is implemented. 150 packet_size_ = GetPacketHeaderSize(send_version_in_packet_);
138 packet_size_ = GetPacketHeaderSize(false);
139 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); 151 serialized.retransmittable_frames = queued_retransmittable_frames_.release();
140 return serialized; 152 return serialized;
141 } 153 }
142 154
143 SerializedPacket QuicPacketCreator::SerializeFec() { 155 SerializedPacket QuicPacketCreator::SerializeFec() {
144 DCHECK_LT(0u, fec_group_->NumReceivedPackets()); 156 DCHECK_LT(0u, fec_group_->NumReceivedPackets());
145 DCHECK_EQ(0u, queued_frames_.size()); 157 DCHECK_EQ(0u, queued_frames_.size());
146 QuicPacketHeader header; 158 QuicPacketHeader header;
147 FillPacketHeader(fec_group_number_, true, 159 FillPacketHeader(fec_group_number_, true,
148 fec_group_->entropy_parity(), &header); 160 fec_group_->entropy_parity(), &header);
149 QuicFecData fec_data; 161 QuicFecData fec_data;
150 fec_data.fec_group = fec_group_->min_protected_packet(); 162 fec_data.fec_group = fec_group_->min_protected_packet();
151 fec_data.redundancy = fec_group_->payload_parity(); 163 fec_data.redundancy = fec_group_->payload_parity();
152 SerializedPacket serialized = framer_->ConstructFecPacket(header, fec_data); 164 SerializedPacket serialized = framer_->ConstructFecPacket(header, fec_data);
153 fec_group_.reset(NULL); 165 fec_group_.reset(NULL);
154 fec_group_number_ = 0; 166 fec_group_number_ = 0;
155 DCHECK(serialized.packet); 167 DCHECK(serialized.packet);
156 DCHECK_GE(options_.max_packet_length, serialized.packet->length()); 168 DCHECK_GE(options_.max_packet_length, serialized.packet->length());
157 return serialized; 169 return serialized;
158 } 170 }
159 171
160 SerializedPacket QuicPacketCreator::SerializeConnectionClose( 172 SerializedPacket QuicPacketCreator::SerializeConnectionClose(
161 QuicConnectionCloseFrame* close_frame) { 173 QuicConnectionCloseFrame* close_frame) {
162 QuicFrames frames; 174 QuicFrames frames;
163 frames.push_back(QuicFrame(close_frame)); 175 frames.push_back(QuicFrame(close_frame));
164 return SerializeAllFrames(frames); 176 return SerializeAllFrames(frames);
165 } 177 }
166 178
179 QuicEncryptedPacket* QuicPacketCreator::SerializeVersionNegotiationPacket(
180 const QuicVersionTagList& supported_versions) {
181 DCHECK(!is_server_);
182 QuicPacketPublicHeader header;
183 header.guid = guid_;
184 header.reset_flag = false;
185 header.version_flag = true;
186 header.versions = supported_versions;
187 QuicEncryptedPacket* encrypted =
188 framer_->ConstructVersionNegotiationPacket(header, supported_versions);
189 DCHECK(encrypted);
190 DCHECK_GE(options_.max_packet_length, encrypted->length());
191 return encrypted;
192 }
193
167 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group, 194 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group,
168 bool fec_flag, 195 bool fec_flag,
169 bool fec_entropy_flag, 196 bool fec_entropy_flag,
170 QuicPacketHeader* header) { 197 QuicPacketHeader* header) {
171 header->public_header.guid = guid_; 198 header->public_header.guid = guid_;
172 header->public_header.reset_flag = false; 199 header->public_header.reset_flag = false;
173 header->public_header.version_flag = false; 200 header->public_header.version_flag = send_version_in_packet_;
174 header->fec_flag = fec_flag; 201 header->fec_flag = fec_flag;
175 header->fec_entropy_flag = fec_entropy_flag; 202 header->fec_entropy_flag = fec_entropy_flag;
176 header->packet_sequence_number = ++sequence_number_; 203 header->packet_sequence_number = ++sequence_number_;
177 if (header->packet_sequence_number == 1) { 204 if (header->packet_sequence_number == 1) {
178 // TODO(satyamshekhar): No entropy in the first message. 205 // TODO(satyamshekhar): No entropy in the first message.
179 // For crypto tests to pass. Fix this by using deterministic QuicRandom. 206 // For crypto tests to pass. Fix this by using deterministic QuicRandom.
180 header->entropy_flag = 0; 207 header->entropy_flag = 0;
181 } else { 208 } else {
182 header->entropy_flag = random_generator_->RandBool(); 209 header->entropy_flag = random_generator_->RandBool();
183 } 210 }
(...skipping 25 matching lines...) Expand all
209 queued_frames_.push_back( 236 queued_frames_.push_back(
210 queued_retransmittable_frames_->AddNonStreamFrame(frame)); 237 queued_retransmittable_frames_->AddNonStreamFrame(frame));
211 } 238 }
212 } else { 239 } else {
213 queued_frames_.push_back(frame); 240 queued_frames_.push_back(frame);
214 } 241 }
215 return true; 242 return true;
216 } 243 }
217 244
218 } // namespace net 245 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_creator.h ('k') | net/quic/quic_packet_creator_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698