| 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 |