OLD | NEW |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |