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

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

Issue 11958018: Queueing QUIC frames to be resent instead of packets and packing RST frames with acks and congestio… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 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/quic_utils.h" 8 #include "net/quic/quic_utils.h"
9 9
10 using base::StringPiece; 10 using base::StringPiece;
(...skipping 16 matching lines...) Expand all
27 } 27 }
28 28
29 void QuicPacketCreator::OnBuiltFecProtectedPayload( 29 void QuicPacketCreator::OnBuiltFecProtectedPayload(
30 const QuicPacketHeader& header, 30 const QuicPacketHeader& header,
31 StringPiece payload) { 31 StringPiece payload) {
32 if (fec_group_.get()) { 32 if (fec_group_.get()) {
33 fec_group_->Update(header, payload); 33 fec_group_->Update(header, payload);
34 } 34 }
35 } 35 }
36 36
37 QuicPacketCreator::PacketPair QuicPacketCreator::SerializeFrames( 37 PacketPair QuicPacketCreator::SerializeAllFrames(const QuicFrames& frames) {
38 size_t num_serialized;
39 PacketPair pair = SerializeFrames(frames, &num_serialized);
40 DCHECK_EQ(frames.size(), num_serialized);
41 return pair;
42 }
43
44 PacketPair QuicPacketCreator::SerializeFrames(
38 const QuicFrames& frames, size_t* num_serialized) { 45 const QuicFrames& frames, size_t* num_serialized) {
39 QuicPacketHeader header; 46 QuicPacketHeader header;
40 FillPacketHeader(0, PACKET_FLAGS_NONE, &header); 47 FillPacketHeader(0, PACKET_FLAGS_NONE, &header);
41 48
42 QuicPacket* packet = framer_->ConstructMaxFrameDataPacket( 49 QuicPacket* packet = framer_->ConstructMaxFrameDataPacket(
43 header, frames, num_serialized); 50 header, frames, num_serialized);
44 return make_pair(header.packet_sequence_number, packet); 51 return make_pair(header.packet_sequence_number, packet);
45 } 52 }
46 53
47 size_t QuicPacketCreator::DataToStream(QuicStreamId id, 54 size_t QuicPacketCreator::DataToStream(QuicStreamId id,
48 StringPiece data, 55 StringPiece data,
49 QuicStreamOffset offset, 56 QuicStreamOffset offset,
50 bool fin, 57 bool fin,
51 vector<PacketPair>* packets) { 58 vector<PacketPair>* packets,
59 QuicFrames* packetized_frames) {
52 DCHECK_GT(options_.max_packet_length, 60 DCHECK_GT(options_.max_packet_length,
53 QuicUtils::StreamFramePacketOverhead(1)); 61 QuicUtils::StreamFramePacketOverhead(1));
54 DCHECK_LT(0u, options_.max_num_packets); 62 DCHECK_LT(0u, options_.max_num_packets);
55 QuicPacketHeader header; 63 QuicPacketHeader header;
56 64
57 QuicPacket* packet = NULL; 65 QuicPacket* packet = NULL;
58 QuicFrames frames; 66 QuicFrames frames;
59 QuicFecGroupNumber current_fec_group = 0; 67 QuicFecGroupNumber current_fec_group = 0;
60 QuicFecData fec_data; 68 QuicFecData fec_data;
61 69
(...skipping 20 matching lines...) Expand all
82 while (unconsumed_bytes > 0 && num_data_packets > 0) { 90 while (unconsumed_bytes > 0 && num_data_packets > 0) {
83 --num_data_packets; 91 --num_data_packets;
84 bool set_fin = false; 92 bool set_fin = false;
85 if (unconsumed_bytes <= frame_len) { // last loop 93 if (unconsumed_bytes <= frame_len) { // last loop
86 frame_len = min(unconsumed_bytes, frame_len); 94 frame_len = min(unconsumed_bytes, frame_len);
87 set_fin = fin; 95 set_fin = fin;
88 } 96 }
89 StringPiece data_frame(data.data() + data.size() - unconsumed_bytes, 97 StringPiece data_frame(data.data() + data.size() - unconsumed_bytes,
90 frame_len); 98 frame_len);
91 99
92 QuicStreamFrame frame(id, set_fin, offset, data_frame); 100 QuicStreamFrame* frame = new QuicStreamFrame(
93 frames.push_back(QuicFrame(&frame)); 101 id, set_fin, offset, data_frame);
102 frames.push_back(QuicFrame(frame));
94 FillPacketHeader(current_fec_group, PACKET_FLAGS_NONE, &header); 103 FillPacketHeader(current_fec_group, PACKET_FLAGS_NONE, &header);
95 offset += frame_len; 104 offset += frame_len;
96 unconsumed_bytes -= frame_len; 105 unconsumed_bytes -= frame_len;
97 106
98 // Produce the data packet (which might fin the stream). 107 // Produce the data packet (which might fin the stream).
99 packet = framer_->ConstructFrameDataPacket(header, frames); 108 packet = framer_->ConstructFrameDataPacket(header, frames);
100 DCHECK(packet); 109 DCHECK(packet);
101 DCHECK_GE(options_.max_packet_length, packet->length()); 110 DCHECK_GE(options_.max_packet_length, packet->length());
102 packets->push_back(make_pair(header.packet_sequence_number, packet)); 111 packets->push_back(make_pair(header.packet_sequence_number, packet));
112 packetized_frames->push_back(frames[0]);
103 frames.clear(); 113 frames.clear();
104 } 114 }
105 // If we haven't finished serializing all the data, don't set any final fin. 115 // If we haven't finished serializing all the data, don't set any final fin.
106 if (unconsumed_bytes > 0) { 116 if (unconsumed_bytes > 0) {
107 fin = false; 117 fin = false;
108 } 118 }
109 } 119 }
110 120
111 // Create a new packet for the fin, if necessary. 121 // Create a new packet for the fin, if necessary.
112 if (fin && data.size() == 0) { 122 if (fin && data.size() == 0) {
113 FillPacketHeader(current_fec_group, PACKET_FLAGS_NONE, &header); 123 FillPacketHeader(current_fec_group, PACKET_FLAGS_NONE, &header);
114 QuicStreamFrame frame(id, true, offset, ""); 124 QuicStreamFrame* frame = new QuicStreamFrame(id, true, offset, "");
115 frames.push_back(QuicFrame(&frame)); 125 frames.push_back(QuicFrame(frame));
116 packet = framer_->ConstructFrameDataPacket(header, frames); 126 packet = framer_->ConstructFrameDataPacket(header, frames);
117 DCHECK(packet); 127 DCHECK(packet);
128 DCHECK_GE(options_.max_packet_length, packet->length());
118 packets->push_back(make_pair(header.packet_sequence_number, packet)); 129 packets->push_back(make_pair(header.packet_sequence_number, packet));
130 packetized_frames->push_back(frames[0]);
119 frames.clear(); 131 frames.clear();
120 } 132 }
121 133
122 // Create a new FEC packet, if necessary 134 // Create a new FEC packet, if necessary
123 if (current_fec_group != 0) { 135 if (current_fec_group != 0) {
124 FillPacketHeader(current_fec_group, PACKET_FLAGS_FEC, &header); 136 FillPacketHeader(current_fec_group, PACKET_FLAGS_FEC, &header);
125 fec_data.redundancy = fec_group_->parity(); 137 fec_data.redundancy = fec_group_->parity();
126 QuicPacket* fec_packet = framer_->ConstructFecPacket(header, fec_data); 138 QuicPacket* fec_packet = framer_->ConstructFecPacket(header, fec_data);
127 DCHECK(fec_packet); 139 DCHECK(fec_packet);
140 DCHECK_GE(options_.max_packet_length, packet->length());
128 packets->push_back(make_pair(header.packet_sequence_number, fec_packet)); 141 packets->push_back(make_pair(header.packet_sequence_number, fec_packet));
129 ++fec_group_number_; 142 ++fec_group_number_;
130 } 143 }
131 /* 144 /*
132 if (options_.random_reorder) { 145 if (options_.random_reorder) {
133 int32 seed = ACMRandom::HostnamePidTimeSeed(); 146 int32 seed = ACMRandom::HostnamePidTimeSeed();
134 ACMRandom random(seed); 147 ACMRandom random(seed);
135 DLOG(INFO) << "Seed " << seed; 148 DLOG(INFO) << "Seed " << seed;
136 149
137 vector<PacketPair> tmp_store; 150 vector<PacketPair> tmp_store;
138 tmp_store.swap(*packets); 151 tmp_store.swap(*packets);
139 152
140 while (tmp_store.size() != 0) { 153 while (tmp_store.size() != 0) {
141 int idx = random.Uniform(tmp_store.size()); 154 int idx = random.Uniform(tmp_store.size());
142 packets->push_back(tmp_store[idx]); 155 packets->push_back(tmp_store[idx]);
143 tmp_store.erase(tmp_store.begin() + idx); 156 tmp_store.erase(tmp_store.begin() + idx);
144 } 157 }
145 } 158 }
146 */ 159 */
147 fec_group_.reset(NULL); 160 fec_group_.reset(NULL);
148 DCHECK(options_.max_num_packets >= packets->size()); 161 DCHECK(options_.max_num_packets >= packets->size());
149 162
150 return data.size() - unconsumed_bytes; 163 return data.size() - unconsumed_bytes;
151 } 164 }
152 165
153 QuicPacketCreator::PacketPair QuicPacketCreator::ResetStream(
154 QuicStreamId id,
155 QuicStreamOffset offset,
156 QuicErrorCode error) {
157 QuicPacketHeader header;
158 FillPacketHeader(0, PACKET_FLAGS_NONE, &header);
159
160 QuicRstStreamFrame close_frame(id, offset, error);
161
162 QuicFrames frames;
163 frames.push_back(QuicFrame(&close_frame));
164 QuicPacket* packet = framer_->ConstructFrameDataPacket(header, frames);
165 DCHECK(packet);
166 return make_pair(header.packet_sequence_number, packet);
167 }
168
169 QuicPacketCreator::PacketPair QuicPacketCreator::CloseConnection( 166 QuicPacketCreator::PacketPair QuicPacketCreator::CloseConnection(
170 QuicConnectionCloseFrame* close_frame) { 167 QuicConnectionCloseFrame* close_frame) {
171 168
172 QuicPacketHeader header; 169 QuicPacketHeader header;
173 FillPacketHeader(0, PACKET_FLAGS_NONE, &header); 170 FillPacketHeader(0, PACKET_FLAGS_NONE, &header);
174 171
175 QuicFrames frames; 172 QuicFrames frames;
176 frames.push_back(QuicFrame(close_frame)); 173 frames.push_back(QuicFrame(close_frame));
177 QuicPacket* packet = framer_->ConstructFrameDataPacket(header, frames); 174 QuicPacket* packet = framer_->ConstructFrameDataPacket(header, frames);
178 DCHECK(packet); 175 DCHECK(packet);
179 return make_pair(header.packet_sequence_number, packet); 176 return make_pair(header.packet_sequence_number, packet);
180 } 177 }
181 178
182 QuicPacketSequenceNumber QuicPacketCreator::SetNewSequenceNumber(
183 QuicPacket* packet) {
184 ++sequence_number_;
185 framer_->WriteSequenceNumber(sequence_number_, packet);
186 return sequence_number_;
187 }
188
189 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group, 179 void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group,
190 QuicPacketFlags flags, 180 QuicPacketFlags flags,
191 QuicPacketHeader* header) { 181 QuicPacketHeader* header) {
192 header->guid = guid_; 182 header->guid = guid_;
193 header->flags = flags; 183 header->flags = flags;
194 header->packet_sequence_number = ++sequence_number_; 184 header->packet_sequence_number = ++sequence_number_;
195 header->fec_group = fec_group; 185 header->fec_group = fec_group;
196 } 186 }
197 187
198 } // namespace net 188 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698