| 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/basictypes.h" | 7 #include "base/basictypes.h" | 
| 8 #include "base/logging.h" | 8 #include "base/logging.h" | 
| 9 #include "net/quic/crypto/quic_random.h" | 9 #include "net/quic/crypto/quic_random.h" | 
| 10 #include "net/quic/quic_ack_notifier.h" | 10 #include "net/quic/quic_ack_notifier.h" | 
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 200   next_sequence_number_length_ = | 200   next_sequence_number_length_ = | 
| 201       QuicFramer::GetMinSequenceNumberLength(delta * 4); | 201       QuicFramer::GetMinSequenceNumberLength(delta * 4); | 
| 202 } | 202 } | 
| 203 | 203 | 
| 204 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, | 204 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, | 
| 205                                               QuicStreamOffset offset) const { | 205                                               QuicStreamOffset offset) const { | 
| 206   // TODO(jri): This is a simple safe decision for now, but make | 206   // TODO(jri): This is a simple safe decision for now, but make | 
| 207   // is_in_fec_group a parameter. Same as with all public methods in | 207   // is_in_fec_group a parameter. Same as with all public methods in | 
| 208   // QuicPacketCreator. | 208   // QuicPacketCreator. | 
| 209   return BytesFree() > | 209   return BytesFree() > | 
| 210       QuicFramer::GetMinStreamFrameSize(framer_->version(), id, offset, true, | 210       QuicFramer::GetMinStreamFrameSize(id, offset, true, | 
| 211                                         should_fec_protect_ ? IN_FEC_GROUP : | 211                                         should_fec_protect_ ? IN_FEC_GROUP : | 
| 212                                                               NOT_IN_FEC_GROUP); | 212                                                               NOT_IN_FEC_GROUP); | 
| 213 } | 213 } | 
| 214 | 214 | 
| 215 // static | 215 // static | 
| 216 size_t QuicPacketCreator::StreamFramePacketOverhead( | 216 size_t QuicPacketCreator::StreamFramePacketOverhead( | 
| 217     QuicVersion version, |  | 
| 218     QuicConnectionIdLength connection_id_length, | 217     QuicConnectionIdLength connection_id_length, | 
| 219     bool include_version, | 218     bool include_version, | 
| 220     QuicSequenceNumberLength sequence_number_length, | 219     QuicSequenceNumberLength sequence_number_length, | 
| 221     QuicStreamOffset offset, | 220     QuicStreamOffset offset, | 
| 222     InFecGroup is_in_fec_group) { | 221     InFecGroup is_in_fec_group) { | 
| 223   return GetPacketHeaderSize(connection_id_length, include_version, | 222   return GetPacketHeaderSize(connection_id_length, include_version, | 
| 224                              sequence_number_length, is_in_fec_group) + | 223                              sequence_number_length, is_in_fec_group) + | 
| 225       // Assumes this is a stream with a single lone packet. | 224       // Assumes this is a stream with a single lone packet. | 
| 226       QuicFramer::GetMinStreamFrameSize(version, 1u, offset, true, | 225       QuicFramer::GetMinStreamFrameSize(1u, offset, true, is_in_fec_group); | 
| 227                                         is_in_fec_group); |  | 
| 228 } | 226 } | 
| 229 | 227 | 
| 230 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id, | 228 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id, | 
| 231                                             const IOVector& data, | 229                                             const IOVector& data, | 
| 232                                             QuicStreamOffset offset, | 230                                             QuicStreamOffset offset, | 
| 233                                             bool fin, | 231                                             bool fin, | 
| 234                                             QuicFrame* frame) { | 232                                             QuicFrame* frame) { | 
| 235   DCHECK_GT(max_packet_length_, StreamFramePacketOverhead( | 233   DCHECK_GT(max_packet_length_, StreamFramePacketOverhead( | 
| 236                 framer_->version(), PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, | 234                 PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, | 
| 237                 PACKET_6BYTE_SEQUENCE_NUMBER, offset, IN_FEC_GROUP)); | 235                 PACKET_6BYTE_SEQUENCE_NUMBER, offset, IN_FEC_GROUP)); | 
| 238 | 236 | 
| 239   InFecGroup is_in_fec_group = MaybeUpdateLengthsAndStartFec(); | 237   InFecGroup is_in_fec_group = MaybeUpdateLengthsAndStartFec(); | 
| 240 | 238 | 
| 241   LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset)) | 239   LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset)) | 
| 242       << "No room for Stream frame, BytesFree: " << BytesFree() | 240       << "No room for Stream frame, BytesFree: " << BytesFree() | 
| 243       << " MinStreamFrameSize: " | 241       << " MinStreamFrameSize: " | 
| 244       << QuicFramer::GetMinStreamFrameSize( | 242       << QuicFramer::GetMinStreamFrameSize(id, offset, true, is_in_fec_group); | 
| 245           framer_->version(), id, offset, true, is_in_fec_group); |  | 
| 246 | 243 | 
| 247   if (data.Empty()) { | 244   if (data.Empty()) { | 
| 248     LOG_IF(DFATAL, !fin) | 245     LOG_IF(DFATAL, !fin) | 
| 249         << "Creating a stream frame with no data or fin."; | 246         << "Creating a stream frame with no data or fin."; | 
| 250     // Create a new packet for the fin, if necessary. | 247     // Create a new packet for the fin, if necessary. | 
| 251     *frame = QuicFrame(new QuicStreamFrame(id, true, offset, data)); | 248     *frame = QuicFrame(new QuicStreamFrame(id, true, offset, data)); | 
| 252     return 0; | 249     return 0; | 
| 253   } | 250   } | 
| 254 | 251 | 
| 255   const size_t data_size = data.TotalBufferSize(); | 252   const size_t data_size = data.TotalBufferSize(); | 
| 256   size_t min_frame_size = QuicFramer::GetMinStreamFrameSize( | 253   size_t min_frame_size = QuicFramer::GetMinStreamFrameSize( | 
| 257       framer_->version(), id, offset, /*last_frame_in_packet=*/ true, | 254       id, offset, /* last_frame_in_packet= */ true, is_in_fec_group); | 
| 258       is_in_fec_group); |  | 
| 259   size_t bytes_consumed = min<size_t>(BytesFree() - min_frame_size, data_size); | 255   size_t bytes_consumed = min<size_t>(BytesFree() - min_frame_size, data_size); | 
| 260 | 256 | 
| 261   bool set_fin = fin && bytes_consumed == data_size;  // Last frame. | 257   bool set_fin = fin && bytes_consumed == data_size;  // Last frame. | 
| 262   IOVector frame_data; | 258   IOVector frame_data; | 
| 263   frame_data.AppendIovecAtMostBytes(data.iovec(), data.Size(), | 259   frame_data.AppendIovecAtMostBytes(data.iovec(), data.Size(), | 
| 264                                     bytes_consumed); | 260                                     bytes_consumed); | 
| 265   DCHECK_EQ(frame_data.TotalBufferSize(), bytes_consumed); | 261   DCHECK_EQ(frame_data.TotalBufferSize(), bytes_consumed); | 
| 266   *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, frame_data)); | 262   *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, frame_data)); | 
| 267   return bytes_consumed; | 263   return bytes_consumed; | 
| 268 } | 264 } | 
| (...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 524   if (!is_handshake) { | 520   if (!is_handshake) { | 
| 525     return; | 521     return; | 
| 526   } | 522   } | 
| 527 | 523 | 
| 528   QuicPaddingFrame padding; | 524   QuicPaddingFrame padding; | 
| 529   bool success = AddFrame(QuicFrame(&padding), false); | 525   bool success = AddFrame(QuicFrame(&padding), false); | 
| 530   DCHECK(success); | 526   DCHECK(success); | 
| 531 } | 527 } | 
| 532 | 528 | 
| 533 }  // namespace net | 529 }  // namespace net | 
| OLD | NEW | 
|---|