| Index: net/quic/quic_packet_creator.cc
|
| diff --git a/net/quic/quic_packet_creator.cc b/net/quic/quic_packet_creator.cc
|
| index ea1e90aff7a8db6683e526436ae1f44ee0ba7cab..05a68934782183a83768db89ebe3343481565c65 100644
|
| --- a/net/quic/quic_packet_creator.cc
|
| +++ b/net/quic/quic_packet_creator.cc
|
| @@ -9,7 +9,6 @@
|
| #include "net/quic/quic_fec_group.h"
|
| #include "net/quic/quic_utils.h"
|
|
|
| -
|
| using base::StringPiece;
|
| using std::make_pair;
|
| using std::min;
|
| @@ -20,14 +19,16 @@ namespace net {
|
|
|
| QuicPacketCreator::QuicPacketCreator(QuicGuid guid,
|
| QuicFramer* framer,
|
| - QuicRandom* random_generator)
|
| + QuicRandom* random_generator,
|
| + bool is_server)
|
| : guid_(guid),
|
| framer_(framer),
|
| random_generator_(random_generator),
|
| sequence_number_(0),
|
| fec_group_number_(0),
|
| - // TODO(satyashekhar): Fix this when versioning is implemented.
|
| - packet_size_(GetPacketHeaderSize(!kIncludeVersion)) {
|
| + is_server_(is_server),
|
| + send_version_in_packet_(!is_server),
|
| + packet_size_(GetPacketHeaderSize(send_version_in_packet_)) {
|
| framer_->set_fec_builder(this);
|
| }
|
|
|
| @@ -55,6 +56,18 @@ void QuicPacketCreator::MaybeStartFEC() {
|
| }
|
| }
|
|
|
| +// Stops serializing version of the protocol in packets sent after this call.
|
| +// A packet that is already open might send kQuicVersionSize bytes less than the
|
| +// maximum packet size if we stop sending version before it is serialized.
|
| +void QuicPacketCreator::StopSendingVersion() {
|
| + DCHECK(send_version_in_packet_);
|
| + send_version_in_packet_ = false;
|
| + if (packet_size_ > 0) {
|
| + DCHECK_LT(kQuicVersionSize, packet_size_);
|
| + packet_size_ -= kQuicVersionSize;
|
| + }
|
| +}
|
| +
|
| bool QuicPacketCreator::HasRoomForStreamFrame() const {
|
| return BytesFree() > QuicFramer::GetMinStreamFrameSize();
|
| }
|
| @@ -134,8 +147,7 @@ SerializedPacket QuicPacketCreator::SerializePacket() {
|
| SerializedPacket serialized = framer_->ConstructFrameDataPacket(
|
| header, queued_frames_, packet_size_);
|
| queued_frames_.clear();
|
| - // TODO(satyamshekhar) Fix this versioning is implemented.
|
| - packet_size_ = GetPacketHeaderSize(false);
|
| + packet_size_ = GetPacketHeaderSize(send_version_in_packet_);
|
| serialized.retransmittable_frames = queued_retransmittable_frames_.release();
|
| return serialized;
|
| }
|
| @@ -164,13 +176,28 @@ SerializedPacket QuicPacketCreator::SerializeConnectionClose(
|
| return SerializeAllFrames(frames);
|
| }
|
|
|
| +QuicEncryptedPacket* QuicPacketCreator::SerializeVersionNegotiationPacket(
|
| + const QuicVersionTagList& supported_versions) {
|
| + DCHECK(!is_server_);
|
| + QuicPacketPublicHeader header;
|
| + header.guid = guid_;
|
| + header.reset_flag = false;
|
| + header.version_flag = true;
|
| + header.versions = supported_versions;
|
| + QuicEncryptedPacket* encrypted =
|
| + framer_->ConstructVersionNegotiationPacket(header, supported_versions);
|
| + DCHECK(encrypted);
|
| + DCHECK_GE(options_.max_packet_length, encrypted->length());
|
| + return encrypted;
|
| +}
|
| +
|
| void QuicPacketCreator::FillPacketHeader(QuicFecGroupNumber fec_group,
|
| bool fec_flag,
|
| bool fec_entropy_flag,
|
| QuicPacketHeader* header) {
|
| header->public_header.guid = guid_;
|
| header->public_header.reset_flag = false;
|
| - header->public_header.version_flag = false;
|
| + header->public_header.version_flag = send_version_in_packet_;
|
| header->fec_flag = fec_flag;
|
| header->fec_entropy_flag = fec_entropy_flag;
|
| header->packet_sequence_number = ++sequence_number_;
|
|
|