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

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

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

Powered by Google App Engine
This is Rietveld 408576698