| Index: net/quic/quic_packet_creator.cc
|
| diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc
|
| index c2a400b6c9c86a2c175096bf595b41aeec093f45..d76488ea1870ad3182fb209c6f43fd49143ed7e9 100644
|
| --- a/net/quic/quic_packet_creator.cc
|
| +++ b/net/quic/quic_packet_creator.cc
|
| @@ -69,8 +69,10 @@ class QuicRandomBoolSource {
|
|
|
| QuicPacketCreator::QuicPacketCreator(QuicConnectionId connection_id,
|
| QuicFramer* framer,
|
| - QuicRandom* random_generator)
|
| - : connection_id_(connection_id),
|
| + QuicRandom* random_generator,
|
| + DelegateInterface* delegate)
|
| + : delegate_(delegate),
|
| + connection_id_(connection_id),
|
| encryption_level_(ENCRYPTION_NONE),
|
| framer_(framer),
|
| random_bool_source_(new QuicRandomBoolSource(random_generator)),
|
| @@ -237,6 +239,28 @@ void QuicPacketCreator::UpdatePacketNumberLength(
|
| QuicFramer::GetMinSequenceNumberLength(delta * 4);
|
| }
|
|
|
| +bool QuicPacketCreator::ConsumeData(QuicStreamId id,
|
| + QuicIOVector iov,
|
| + size_t iov_offset,
|
| + QuicStreamOffset offset,
|
| + bool fin,
|
| + bool needs_padding,
|
| + QuicFrame* frame) {
|
| + if (!HasRoomForStreamFrame(id, offset)) {
|
| + Flush();
|
| + return false;
|
| + }
|
| +
|
| + UniqueStreamBuffer buffer;
|
| + CreateStreamFrame(id, iov, iov_offset, offset, fin, frame, &buffer);
|
| +
|
| + bool success = AddFrame(*frame,
|
| + /*save_retransmittable_frames=*/true, needs_padding,
|
| + std::move(buffer));
|
| + DCHECK(success);
|
| + return true;
|
| +}
|
| +
|
| bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id,
|
| QuicStreamOffset offset) const {
|
| // TODO(jri): This is a simple safe decision for now, but make
|
| @@ -413,6 +437,19 @@ SerializedPacket QuicPacketCreator::SerializeAllFrames(const QuicFrames& frames,
|
| return packet;
|
| }
|
|
|
| +void QuicPacketCreator::Flush() {
|
| + if (!HasPendingFrames()) {
|
| + return;
|
| + }
|
| +
|
| + // TODO(rtenneti): Change the default 64 alignas value (used the default
|
| + // value from CACHELINE_SIZE).
|
| + ALIGNAS(64) char seralized_packet_buffer[kMaxPacketSize];
|
| + SerializedPacket serialized_packet =
|
| + SerializePacket(seralized_packet_buffer, kMaxPacketSize);
|
| + delegate_->OnSerializedPacket(&serialized_packet);
|
| +}
|
| +
|
| bool QuicPacketCreator::HasPendingFrames() const {
|
| return !queued_frames_.empty();
|
| }
|
| @@ -649,6 +686,8 @@ bool QuicPacketCreator::AddFrame(const QuicFrame& frame,
|
| frame, BytesFree(), queued_frames_.empty(), true, is_in_fec_group,
|
| packet_number_length_);
|
| if (frame_len == 0) {
|
| + // Current open packet is full.
|
| + Flush();
|
| return false;
|
| }
|
| DCHECK_LT(0u, packet_size_);
|
|
|