Index: net/quic/quic_packet_creator.h |
diff --git a/net/quic/quic_packet_creator.h b/net/quic/quic_packet_creator.h |
deleted file mode 100644 |
index 14cf69e5711d968cb332db35bfd84aca15736b50..0000000000000000000000000000000000000000 |
--- a/net/quic/quic_packet_creator.h |
+++ /dev/null |
@@ -1,354 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
-// |
-// Accumulates frames for the next packet until more frames no longer fit or |
-// it's time to create a packet from them. If multipath enabled, only creates |
-// packets on one path at the same time. Currently, next packet number is |
-// tracked per-path. |
- |
-#ifndef NET_QUIC_QUIC_PACKET_CREATOR_H_ |
-#define NET_QUIC_QUIC_PACKET_CREATOR_H_ |
- |
-#include <stddef.h> |
- |
-#include <memory> |
-#include <string> |
-#include <unordered_map> |
-#include <utility> |
-#include <vector> |
- |
-#include "base/macros.h" |
-#include "base/strings/string_piece.h" |
-#include "net/quic/quic_framer.h" |
-#include "net/quic/quic_protocol.h" |
- |
-namespace net { |
-namespace test { |
-class QuicPacketCreatorPeer; |
-} |
- |
-class QuicRandom; |
- |
-class NET_EXPORT_PRIVATE QuicPacketCreator { |
- public: |
- // A delegate interface for further processing serialized packet. |
- class NET_EXPORT_PRIVATE DelegateInterface |
- : public QuicConnectionCloseDelegateInterface { |
- public: |
- ~DelegateInterface() override {} |
- // Called when a packet is serialized. Delegate does not take the ownership |
- // of |serialized_packet|, but takes ownership of any frames it removes |
- // from |packet.retransmittable_frames|. |
- virtual void OnSerializedPacket(SerializedPacket* serialized_packet) = 0; |
- }; |
- |
- // Interface which gets callbacks from the QuicPacketCreator at interesting |
- // points. Implementations must not mutate the state of the creator |
- // as a result of these callbacks. |
- class NET_EXPORT_PRIVATE DebugDelegate { |
- public: |
- virtual ~DebugDelegate() {} |
- |
- // Called when a frame has been added to the current packet. |
- virtual void OnFrameAddedToPacket(const QuicFrame& frame) {} |
- }; |
- |
- // QuicRandom* required for packet entropy. |
- QuicPacketCreator(QuicConnectionId connection_id, |
- QuicFramer* framer, |
- QuicRandom* random_generator, |
- QuicBufferAllocator* buffer_allocator, |
- DelegateInterface* delegate); |
- |
- ~QuicPacketCreator(); |
- |
- // Makes the framer not serialize the protocol version in sent packets. |
- void StopSendingVersion(); |
- |
- // SetDiversificationNonce sets the nonce that will be sent in each public |
- // header of packets encrypted at the initial encryption level. Should only |
- // be called by servers. |
- void SetDiversificationNonce(const DiversificationNonce nonce); |
- |
- // Update the packet number length to use in future packets as soon as it |
- // can be safely changed. |
- // TODO(fayang): Directly set packet number length instead of compute it in |
- // creator. |
- void UpdatePacketNumberLength(QuicPacketNumber least_packet_awaited_by_peer, |
- QuicPacketCount max_packets_in_flight); |
- |
- // The overhead the framing will add for a packet with one frame. |
- static size_t StreamFramePacketOverhead( |
- QuicVersion version, |
- QuicConnectionIdLength connection_id_length, |
- bool include_version, |
- bool include_path_id, |
- bool include_diversification_nonce, |
- QuicPacketNumberLength packet_number_length, |
- QuicStreamOffset offset); |
- |
- // Returns false and flushes all pending frames if current open packet is |
- // full. |
- // If current packet is not full, converts a raw payload into a stream frame |
- // that fits into the open packet and adds it to the packet. |
- // The payload begins at |iov_offset| into the |iov|. |
- bool ConsumeData(QuicStreamId id, |
- QuicIOVector iov, |
- size_t iov_offset, |
- QuicStreamOffset offset, |
- bool fin, |
- bool needs_full_padding, |
- QuicFrame* frame); |
- |
- // Returns true if current open packet can accommodate more stream frames of |
- // stream |id| at |offset|, false otherwise. |
- bool HasRoomForStreamFrame(QuicStreamId id, QuicStreamOffset offset); |
- |
- // Re-serializes frames with the original packet's packet number length. |
- // Used for retransmitting packets to ensure they aren't too long. |
- void ReserializeAllFrames(const PendingRetransmission& retransmission, |
- char* buffer, |
- size_t buffer_len); |
- |
- // Serializes all added frames into a single packet and invokes the delegate_ |
- // to further process the SerializedPacket. |
- void Flush(); |
- |
- // Optimized method to create a QuicStreamFrame, serialize it, and encrypt it |
- // into |encrypted_buffer|. Adds the QuicStreamFrame to the returned |
- // SerializedPacket. Sets |num_bytes_consumed| to the number of bytes |
- // consumed to create the QuicStreamFrame. |
- void CreateAndSerializeStreamFrame(QuicStreamId id, |
- const QuicIOVector& iov, |
- QuicStreamOffset iov_offset, |
- QuicStreamOffset stream_offset, |
- bool fin, |
- QuicAckListenerInterface* listener, |
- char* encrypted_buffer, |
- size_t encrypted_buffer_len, |
- size_t* num_bytes_consumed); |
- |
- // Returns true if there are frames pending to be serialized. |
- bool HasPendingFrames() const; |
- |
- // Returns true if there are retransmittable frames pending to be serialized. |
- bool HasPendingRetransmittableFrames() const; |
- |
- // Returns the number of bytes which are available to be used by additional |
- // frames in the packet. Since stream frames are slightly smaller when they |
- // are the last frame in a packet, this method will return a different |
- // value than max_packet_size - PacketSize(), in this case. |
- size_t BytesFree(); |
- |
- // Returns the number of bytes that the packet will expand by if a new frame |
- // is added to the packet. If the last frame was a stream frame, it will |
- // expand slightly when a new frame is added, and this method returns the |
- // amount of expected expansion. |
- size_t ExpansionOnNewFrame() const; |
- |
- // Returns the number of bytes in the current packet, including the header, |
- // if serialized with the current frames. Adding a frame to the packet |
- // may change the serialized length of existing frames, as per the comment |
- // in BytesFree. |
- size_t PacketSize(); |
- |
- // Tries to add |frame| to the packet creator's list of frames to be |
- // serialized. If the frame does not fit into the current packet, flushes the |
- // packet and returns false. |
- bool AddSavedFrame(const QuicFrame& frame); |
- |
- // Identical to AddSavedFrame, but allows the frame to be padded. |
- bool AddPaddedSavedFrame(const QuicFrame& frame); |
- |
- // Adds |listener| to the next serialized packet and notifies the |
- // std::listener with |length| as the number of acked bytes. |
- void AddAckListener(QuicAckListenerInterface* listener, |
- QuicPacketLength length); |
- |
- // Creates a version negotiation packet which supports |supported_versions|. |
- // Caller owns the created packet. Also, sets the entropy hash of the |
- // serialized packet to a random bool and returns that value as a member of |
- // SerializedPacket. |
- QuicEncryptedPacket* SerializeVersionNegotiationPacket( |
- const QuicVersionVector& supported_versions); |
- |
- // Returns a dummy packet that is valid but contains no useful information. |
- static SerializedPacket NoPacket(); |
- |
- // Sets the encryption level that will be applied to new packets. |
- void set_encryption_level(EncryptionLevel level) { |
- packet_.encryption_level = level; |
- } |
- |
- // packet number of the last created packet, or 0 if no packets have been |
- // created. |
- QuicPacketNumber packet_number() const { return packet_.packet_number; } |
- |
- QuicConnectionIdLength connection_id_length() const { |
- return connection_id_length_; |
- } |
- |
- void set_connection_id_length(QuicConnectionIdLength length) { |
- connection_id_length_ = length; |
- } |
- |
- QuicByteCount max_packet_length() const { return max_packet_length_; } |
- |
- bool has_ack() const { return packet_.has_ack; } |
- |
- bool has_stop_waiting() const { return packet_.has_stop_waiting; } |
- |
- // Sets the encrypter to use for the encryption level and updates the max |
- // plaintext size. |
- void SetEncrypter(EncryptionLevel level, QuicEncrypter* encrypter); |
- |
- // Indicates whether the packet creator is in a state where it can change |
- // current maximum packet length. |
- bool CanSetMaxPacketLength() const; |
- |
- // Sets the maximum packet length. |
- void SetMaxPacketLength(QuicByteCount length); |
- |
- // Sets the path on which subsequent packets will be created. It is the |
- // caller's responsibility to guarantee no packet is under construction before |
- // calling this function. If |path_id| is different from current_path_, |
- // next_packet_number_length_ is recalculated. |
- void SetCurrentPath(QuicPathId path_id, |
- QuicPacketNumber least_packet_awaited_by_peer, |
- QuicPacketCount max_packets_in_flight); |
- |
- void set_debug_delegate(DebugDelegate* debug_delegate) { |
- debug_delegate_ = debug_delegate; |
- } |
- |
- private: |
- friend class test::QuicPacketCreatorPeer; |
- |
- // A QuicRandom wrapper that gets a bucket of entropy and distributes it |
- // bit-by-bit. Replenishes the bucket as needed. Not thread-safe. Expose this |
- // class if single bit randomness is needed elsewhere. |
- class QuicRandomBoolSource { |
- public: |
- // random: Source of entropy. Not owned. |
- explicit QuicRandomBoolSource(QuicRandom* random); |
- |
- ~QuicRandomBoolSource(); |
- |
- // Returns the next random bit from the bucket. |
- bool RandBool(); |
- |
- private: |
- // Source of entropy. |
- QuicRandom* random_; |
- // Stored random bits. |
- uint64_t bit_bucket_; |
- // The next available bit has "1" in the mask. Zero means empty bucket. |
- uint64_t bit_mask_; |
- |
- DISALLOW_COPY_AND_ASSIGN(QuicRandomBoolSource); |
- }; |
- |
- static bool ShouldRetransmit(const QuicFrame& frame); |
- |
- // Converts a raw payload to a frame which fits into the current open |
- // packet. The payload begins at |iov_offset| into the |iov|. |
- // If data is empty and fin is true, the expected behavior is to consume the |
- // fin but return 0. If any data is consumed, it will be copied into a |
- // new buffer that |frame| will point to and own. |
- void CreateStreamFrame(QuicStreamId id, |
- QuicIOVector iov, |
- size_t iov_offset, |
- QuicStreamOffset offset, |
- bool fin, |
- QuicFrame* frame); |
- |
- // Copies |length| bytes from iov starting at offset |iov_offset| into buffer. |
- // |iov| must be at least iov_offset+length total length and buffer must be |
- // at least |length| long. |
- static void CopyToBuffer(QuicIOVector iov, |
- size_t iov_offset, |
- size_t length, |
- char* buffer); |
- |
- // Updates packet number length on packet boundary. |
- void MaybeUpdatePacketNumberLength(); |
- |
- void FillPacketHeader(QuicPacketHeader* header); |
- |
- // Adds a |frame| if there is space and returns false and flushes all pending |
- // frames if there isn't room. If |save_retransmittable_frames| is true, |
- // saves the |frame| in the next SerializedPacket. |
- bool AddFrame(const QuicFrame& frame, bool save_retransmittable_frames); |
- |
- // Adds a padding frame to the current packet only if the current packet |
- // contains a handshake message, and there is sufficient room to fit a |
- // padding frame. |
- void MaybeAddPadding(); |
- |
- // Serializes all frames which have been added and adds any which should be |
- // retransmitted to packet_.retransmittable_frames. All frames must fit into |
- // a single packet. Sets the entropy hash of the serialized packet to a |
- // random bool. |
- // Fails if |buffer_len| isn't long enough for the encrypted packet. |
- void SerializePacket(char* encrypted_buffer, size_t buffer_len); |
- |
- // Called after a new SerialiedPacket is created to call the delegate's |
- // OnSerializedPacket and reset state. |
- void OnSerializedPacket(); |
- |
- // Clears all fields of packet_ that should be cleared between serializations. |
- void ClearPacket(); |
- |
- // Returns true if a diversification nonce should be included in the current |
- // packet's public header. |
- bool IncludeNonceInPublicHeader(); |
- |
- // Does not own these delegates or the framer. |
- DelegateInterface* delegate_; |
- DebugDelegate* debug_delegate_; |
- QuicFramer* framer_; |
- |
- QuicRandomBoolSource random_bool_source_; |
- QuicBufferAllocator* const buffer_allocator_; |
- |
- // Controls whether version should be included while serializing the packet. |
- bool send_version_in_packet_; |
- // Controls whether path id should be included while serializing the packet. |
- bool send_path_id_in_packet_; |
- // Staging variable to hold next packet number length. When sequence |
- // number length is to be changed, this variable holds the new length until |
- // a packet boundary, when the creator's packet_number_length_ can be changed |
- // to this new value. |
- QuicPacketNumberLength next_packet_number_length_; |
- // If true, then |nonce_for_public_header_| will be included in the public |
- // header of all packets created at the initial encryption level. |
- bool have_diversification_nonce_; |
- DiversificationNonce diversification_nonce_; |
- // Maximum length including headers and encryption (UDP payload length.) |
- QuicByteCount max_packet_length_; |
- size_t max_plaintext_size_; |
- // Length of connection_id to send over the wire. |
- QuicConnectionIdLength connection_id_length_; |
- |
- // Frames to be added to the next SerializedPacket |
- QuicFrames queued_frames_; |
- |
- // packet_size should never be read directly, use PacketSize() instead. |
- // TODO(ianswett): Move packet_size_ into SerializedPacket once |
- // QuicEncryptedPacket has been flattened into SerializedPacket. |
- size_t packet_size_; |
- QuicConnectionId connection_id_; |
- |
- // Packet used to invoke OnSerializedPacket. |
- SerializedPacket packet_; |
- |
- // Map mapping path_id to last sent packet number on the path. |
- std::unordered_map<QuicPathId, QuicPacketNumber> multipath_packet_number_; |
- |
- DISALLOW_COPY_AND_ASSIGN(QuicPacketCreator); |
-}; |
- |
-} // namespace net |
- |
-#endif // NET_QUIC_QUIC_PACKET_CREATOR_H_ |