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

Unified Diff: net/quic/quic_packet_generator.cc

Issue 1459343009: Make QuicPacketCreator be able to serialize packet itself when it does not have room for next strea… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@107733506
Patch Set: Created 5 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: net/quic/quic_packet_generator.cc
diff --git a/net/quic/quic_packet_generator.cc b/net/quic/quic_packet_generator.cc
index f95180a95a8983fd80a088211fa2e2f7cb742b68..af3ece16612e19fbc38cf8bcb22581cabaedd422 100644
--- a/net/quic/quic_packet_generator.cc
+++ b/net/quic/quic_packet_generator.cc
@@ -40,7 +40,7 @@ QuicPacketGenerator::QuicPacketGenerator(QuicConnectionId connection_id,
DelegateInterface* delegate)
: delegate_(delegate),
debug_delegate_(nullptr),
- packet_creator_(connection_id, framer, random_generator),
+ packet_creator_(connection_id, framer, random_generator, this),
batch_mode_(false),
fec_timeout_(QuicTime::Delta::Zero()),
rtt_multiplier_for_fec_timeout_(kRttMultiplierForFecTimeout),
@@ -139,7 +139,7 @@ QuicConsumedData QuicPacketGenerator::ConsumeData(
bool fin_consumed = false;
if (!packet_creator_.HasRoomForStreamFrame(id, offset)) {
- SerializeAndSendPacket();
+ packet_creator_.Flush();
}
if (fec_protection == MUST_FEC_PROTECT) {
@@ -157,13 +157,11 @@ QuicConsumedData QuicPacketGenerator::ConsumeData(
if (!packet_creator_.ConsumeData(id, iov, total_bytes_consumed,
offset + total_bytes_consumed, fin,
has_handshake, &frame)) {
- LOG(DFATAL) << "Created but failed to add a stream frame.";
- // Inability to add a STREAM frame creates an unrecoverable hole in a
- // the stream, so it's best to close the connection.
- delegate_->CloseConnection(QUIC_INTERNAL_ERROR, false);
- return QuicConsumedData(0, false);
+ // Current packet is full and flushed.
+ continue;
}
- DCHECK(frame.stream_frame);
+
+ // A stream frame is created and added.
size_t bytes_consumed = frame.stream_frame->data.length();
if (debug_delegate_ != nullptr) {
debug_delegate_->OnFrameAddedToPacket(frame);
@@ -176,13 +174,13 @@ QuicConsumedData QuicPacketGenerator::ConsumeData(
total_bytes_consumed += bytes_consumed;
fin_consumed = fin && total_bytes_consumed == iov.total_length;
DCHECK(total_bytes_consumed == iov.total_length ||
- packet_creator_.BytesFree() == 0u);
+ (bytes_consumed > 0 && packet_creator_.HasPendingFrames()));
- if (!InBatchMode() || !packet_creator_.HasRoomForStreamFrame(id, offset)) {
+ if (!InBatchMode()) {
// TODO(rtenneti): remove MaybeSendFecPacketAndCloseGroup() from inside
// SerializeAndSendPacket() and make it an explicit call here (and
// elsewhere where we call SerializeAndSendPacket?).
- SerializeAndSendPacket();
+ packet_creator_.Flush();
}
if (total_bytes_consumed == iov.total_length) {
@@ -229,7 +227,7 @@ void QuicPacketGenerator::GenerateMtuDiscoveryPacket(
if (listener != nullptr) {
ack_listeners_.push_back(AckListenerWrapper(listener, 0));
}
- SerializeAndSendPacket();
+ packet_creator_.Flush();
// The only reason AddFrame can fail is that the packet is too full to fit in
// a ping. This is not possible for any sane MTU.
DCHECK(success);
@@ -254,13 +252,10 @@ void QuicPacketGenerator::SendQueuedFrames(bool flush, bool is_fec_timeout) {
// Only add pending frames if we are SURE we can then send the whole packet.
while (HasPendingFrames() &&
(flush || CanSendWithNextPendingFrameAddition())) {
- if (!AddNextPendingFrame()) {
- // Packet was full, so serialize and send it.
- SerializeAndSendPacket();
- }
+ AddNextPendingFrame();
}
- if (packet_creator_.HasPendingFrames() && (flush || !InBatchMode())) {
- SerializeAndSendPacket();
+ if (flush || !InBatchMode()) {
+ packet_creator_.Flush();
}
MaybeSendFecPacketAndCloseGroup(flush, is_fec_timeout);
}
@@ -425,40 +420,6 @@ bool QuicPacketGenerator::AddFrame(const QuicFrame& frame,
return success;
}
-void QuicPacketGenerator::SerializeAndSendPacket() {
- // The optimized encryption algorithm implementations run faster when
- // operating on aligned memory.
- //
- // TODO(rtenneti): Change the default 64 alignas value (used the default
- // value from CACHELINE_SIZE).
- ALIGNAS(64) char buffer[kMaxPacketSize];
- SerializedPacket serialized_packet =
- packet_creator_.SerializePacket(buffer, kMaxPacketSize);
- if (serialized_packet.packet == nullptr) {
- LOG(DFATAL) << "Failed to SerializePacket. fec_policy:" << fec_send_policy_
- << " should_fec_protect_:" << should_fec_protect_;
- delegate_->CloseConnection(QUIC_FAILED_TO_SERIALIZE_PACKET, false);
- return;
- }
-
- // There may be AckListeners interested in this packet.
- serialized_packet.listeners.swap(ack_listeners_);
- ack_listeners_.clear();
-
- delegate_->OnSerializedPacket(serialized_packet);
- MaybeSendFecPacketAndCloseGroup(/*force=*/false, /*is_fec_timeout=*/false);
-
- // Maximum packet size may be only enacted while no packet is currently being
- // constructed, so here we have a good opportunity to actually change it.
- if (packet_creator_.CanSetMaxPacketLength()) {
- packet_creator_.SetMaxPacketLength(max_packet_length_);
- }
-
- // The packet has now been serialized, so the frames are no longer queued.
- ack_queued_ = false;
- stop_waiting_queued_ = false;
-}
-
void QuicPacketGenerator::StopSendingVersion() {
packet_creator_.StopSendingVersion();
}
@@ -533,4 +494,32 @@ void QuicPacketGenerator::SetEncrypter(EncryptionLevel level,
packet_creator_.SetEncrypter(level, encrypter);
}
+void QuicPacketGenerator::OnSerializedPacket(
+ SerializedPacket* serialized_packet) {
+ if (serialized_packet->packet == nullptr) {
+ LOG(DFATAL)
+ << "Failed to SerializePacket. fec_policy:" << fec_send_policy_
+ << " should_fec_protect_:" << should_fec_protect_;
+ delegate_->CloseConnection(QUIC_FAILED_TO_SERIALIZE_PACKET, false);
+ return;
+ }
+
+ // There may be AckListeners interested in this packet.
+ serialized_packet->listeners.swap(ack_listeners_);
+ ack_listeners_.clear();
+
+ delegate_->OnSerializedPacket(*serialized_packet);
+ MaybeSendFecPacketAndCloseGroup(/*force=*/false, /*is_fec_timeout=*/false);
+
+ // Maximum packet size may be only enacted while no packet is currently being
+ // constructed, so here we have a good opportunity to actually change it.
+ if (packet_creator_.CanSetMaxPacketLength()) {
+ packet_creator_.SetMaxPacketLength(max_packet_length_);
+ }
+
+ // The packet has now been serialized, so the frames are no longer queued.
+ ack_queued_ = false;
+ stop_waiting_queued_ = false;
+}
+
} // namespace net

Powered by Google App Engine
This is Rietveld 408576698