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

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

Issue 16256017: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix for Android DEBUG builds with DEATH_TEST 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 12 matching lines...) Expand all
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(options_.send_guid_length, 31 packet_size_(GetPacketHeaderSize(options_.send_guid_length,
32 send_version_in_packet_, 32 send_version_in_packet_,
33 options_.send_sequence_number_length,
33 NOT_IN_FEC_GROUP)) { 34 NOT_IN_FEC_GROUP)) {
34 framer_->set_fec_builder(this); 35 framer_->set_fec_builder(this);
35 } 36 }
36 37
37 QuicPacketCreator::~QuicPacketCreator() { 38 QuicPacketCreator::~QuicPacketCreator() {
38 } 39 }
39 40
40 void QuicPacketCreator::OnBuiltFecProtectedPayload( 41 void QuicPacketCreator::OnBuiltFecProtectedPayload(
41 const QuicPacketHeader& header, StringPiece payload) { 42 const QuicPacketHeader& header, StringPiece payload) {
42 if (fec_group_.get()) { 43 if (fec_group_.get()) {
43 fec_group_->Update(header, payload); 44 fec_group_->Update(header, payload);
44 } 45 }
45 } 46 }
46 47
47 bool QuicPacketCreator::ShouldSendFec(bool force_close) const { 48 bool QuicPacketCreator::ShouldSendFec(bool force_close) const {
48 return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 && 49 return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 &&
49 (force_close || 50 (force_close ||
50 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group); 51 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group);
51 } 52 }
52 53
53 void QuicPacketCreator::MaybeStartFEC() { 54 void QuicPacketCreator::MaybeStartFEC() {
54 if (options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) { 55 if (options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) {
55 DCHECK(queued_frames_.empty()); 56 DCHECK(queued_frames_.empty());
56 // Set the fec group number to the sequence number of the next packet. 57 // Set the fec group number to the sequence number of the next packet.
57 fec_group_number_ = sequence_number() + 1; 58 fec_group_number_ = sequence_number() + 1;
58 fec_group_.reset(new QuicFecGroup()); 59 fec_group_.reset(new QuicFecGroup());
59 packet_size_ = GetPacketHeaderSize(options_.send_guid_length, 60 packet_size_ = GetPacketHeaderSize(options_.send_guid_length,
60 send_version_in_packet_, 61 send_version_in_packet_,
62 options_.send_sequence_number_length,
61 IN_FEC_GROUP); 63 IN_FEC_GROUP);
62 DCHECK_LE(packet_size_, options_.max_packet_length); 64 DCHECK_LE(packet_size_, options_.max_packet_length);
63 } 65 }
64 } 66 }
65 67
66 // Stops serializing version of the protocol in packets sent after this call. 68 // Stops serializing version of the protocol in packets sent after this call.
67 // A packet that is already open might send kQuicVersionSize bytes less than the 69 // A packet that is already open might send kQuicVersionSize bytes less than the
68 // maximum packet size if we stop sending version before it is serialized. 70 // maximum packet size if we stop sending version before it is serialized.
69 void QuicPacketCreator::StopSendingVersion() { 71 void QuicPacketCreator::StopSendingVersion() {
70 DCHECK(send_version_in_packet_); 72 DCHECK(send_version_in_packet_);
71 send_version_in_packet_ = false; 73 send_version_in_packet_ = false;
72 if (packet_size_ > 0) { 74 if (packet_size_ > 0) {
73 DCHECK_LT(kQuicVersionSize, packet_size_); 75 DCHECK_LT(kQuicVersionSize, packet_size_);
74 packet_size_ -= kQuicVersionSize; 76 packet_size_ -= kQuicVersionSize;
75 } 77 }
76 } 78 }
77 79
78 bool QuicPacketCreator::HasRoomForStreamFrame() const { 80 bool QuicPacketCreator::HasRoomForStreamFrame() const {
79 return BytesFree() > QuicFramer::GetMinStreamFrameSize(); 81 return BytesFree() > QuicFramer::GetMinStreamFrameSize();
80 } 82 }
81 83
82 // static 84 // static
83 size_t QuicPacketCreator::StreamFramePacketOverhead( 85 size_t QuicPacketCreator::StreamFramePacketOverhead(
84 int num_frames, 86 int num_frames,
85 QuicGuidLength guid_length, 87 QuicGuidLength guid_length,
86 bool include_version, 88 bool include_version,
89 QuicSequenceNumberLength sequence_number_length,
87 InFecGroup is_in_fec_group) { 90 InFecGroup is_in_fec_group) {
88 return GetPacketHeaderSize(guid_length, include_version, is_in_fec_group) + 91 return GetPacketHeaderSize(guid_length, include_version,
92 sequence_number_length, is_in_fec_group) +
89 QuicFramer::GetMinStreamFrameSize() * num_frames; 93 QuicFramer::GetMinStreamFrameSize() * num_frames;
90 } 94 }
91 95
92 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id, 96 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id,
93 StringPiece data, 97 StringPiece data,
94 QuicStreamOffset offset, 98 QuicStreamOffset offset,
95 bool fin, 99 bool fin,
96 QuicFrame* frame) { 100 QuicFrame* frame) {
97 DCHECK_GT(options_.max_packet_length, 101 DCHECK_GT(options_.max_packet_length,
98 StreamFramePacketOverhead( 102 StreamFramePacketOverhead(
99 1, PACKET_8BYTE_GUID, kIncludeVersion, IN_FEC_GROUP)); 103 1, PACKET_8BYTE_GUID, kIncludeVersion,
104 PACKET_6BYTE_SEQUENCE_NUMBER, IN_FEC_GROUP));
100 DCHECK(HasRoomForStreamFrame()); 105 DCHECK(HasRoomForStreamFrame());
101 106
102 const size_t free_bytes = BytesFree(); 107 const size_t free_bytes = BytesFree();
103 size_t bytes_consumed = 0; 108 size_t bytes_consumed = 0;
104 109
105 if (data.size() != 0) { 110 if (data.size() != 0) {
106 size_t max_data_len = free_bytes - QuicFramer::GetMinStreamFrameSize(); 111 size_t max_data_len = free_bytes - QuicFramer::GetMinStreamFrameSize();
107 bytes_consumed = min<size_t>(max_data_len, data.size()); 112 bytes_consumed = min<size_t>(max_data_len, data.size());
108 113
109 bool set_fin = fin && bytes_consumed == data.size(); // Last frame. 114 bool set_fin = fin && bytes_consumed == data.size(); // Last frame.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 SerializedPacket QuicPacketCreator::SerializePacket() { 158 SerializedPacket QuicPacketCreator::SerializePacket() {
154 DCHECK_EQ(false, queued_frames_.empty()); 159 DCHECK_EQ(false, queued_frames_.empty());
155 QuicPacketHeader header; 160 QuicPacketHeader header;
156 FillPacketHeader(fec_group_number_, false, false, &header); 161 FillPacketHeader(fec_group_number_, false, false, &header);
157 162
158 SerializedPacket serialized = framer_->ConstructFrameDataPacket( 163 SerializedPacket serialized = framer_->ConstructFrameDataPacket(
159 header, queued_frames_, packet_size_); 164 header, queued_frames_, packet_size_);
160 queued_frames_.clear(); 165 queued_frames_.clear();
161 packet_size_ = GetPacketHeaderSize(options_.send_guid_length, 166 packet_size_ = GetPacketHeaderSize(options_.send_guid_length,
162 send_version_in_packet_, 167 send_version_in_packet_,
168 options_.send_sequence_number_length,
163 fec_group_.get() != NULL ? 169 fec_group_.get() != NULL ?
164 IN_FEC_GROUP : NOT_IN_FEC_GROUP); 170 IN_FEC_GROUP : NOT_IN_FEC_GROUP);
165 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); 171 serialized.retransmittable_frames = queued_retransmittable_frames_.release();
166 return serialized; 172 return serialized;
167 } 173 }
168 174
169 SerializedPacket QuicPacketCreator::SerializeFec() { 175 SerializedPacket QuicPacketCreator::SerializeFec() {
170 DCHECK_LT(0u, fec_group_->NumReceivedPackets()); 176 DCHECK_LT(0u, fec_group_->NumReceivedPackets());
171 DCHECK_EQ(0u, queued_frames_.size()); 177 DCHECK_EQ(0u, queued_frames_.size());
172 QuicPacketHeader header; 178 QuicPacketHeader header;
173 FillPacketHeader(fec_group_number_, true, 179 FillPacketHeader(fec_group_number_, true,
174 fec_group_->entropy_parity(), &header); 180 fec_group_->entropy_parity(), &header);
175 QuicFecData fec_data; 181 QuicFecData fec_data;
176 fec_data.fec_group = fec_group_->min_protected_packet(); 182 fec_data.fec_group = fec_group_->min_protected_packet();
177 fec_data.redundancy = fec_group_->payload_parity(); 183 fec_data.redundancy = fec_group_->payload_parity();
178 SerializedPacket serialized = framer_->ConstructFecPacket(header, fec_data); 184 SerializedPacket serialized = framer_->ConstructFecPacket(header, fec_data);
179 fec_group_.reset(NULL); 185 fec_group_.reset(NULL);
180 fec_group_number_ = 0; 186 fec_group_number_ = 0;
181 // Reset packet_size_, since the next packet may not have an FEC group. 187 // Reset packet_size_, since the next packet may not have an FEC group.
182 packet_size_ = GetPacketHeaderSize(options_.send_guid_length, 188 packet_size_ = GetPacketHeaderSize(options_.send_guid_length,
183 send_version_in_packet_, 189 send_version_in_packet_,
190 options_.send_sequence_number_length,
184 NOT_IN_FEC_GROUP); 191 NOT_IN_FEC_GROUP);
185 DCHECK(serialized.packet); 192 DCHECK(serialized.packet);
186 DCHECK_GE(options_.max_packet_length, serialized.packet->length()); 193 DCHECK_GE(options_.max_packet_length, serialized.packet->length());
187 return serialized; 194 return serialized;
188 } 195 }
189 196
190 SerializedPacket QuicPacketCreator::SerializeConnectionClose( 197 SerializedPacket QuicPacketCreator::SerializeConnectionClose(
191 QuicConnectionCloseFrame* close_frame) { 198 QuicConnectionCloseFrame* close_frame) {
192 QuicFrames frames; 199 QuicFrames frames;
193 frames.push_back(QuicFrame(close_frame)); 200 frames.push_back(QuicFrame(close_frame));
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
262 queued_frames_.push_back( 269 queued_frames_.push_back(
263 queued_retransmittable_frames_->AddNonStreamFrame(frame)); 270 queued_retransmittable_frames_->AddNonStreamFrame(frame));
264 } 271 }
265 } else { 272 } else {
266 queued_frames_.push_back(frame); 273 queued_frames_.push_back(frame);
267 } 274 }
268 return true; 275 return true;
269 } 276 }
270 277
271 } // namespace net 278 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698