Index: net/quic/core/quic_packets.h |
diff --git a/net/quic/core/quic_packets.h b/net/quic/core/quic_packets.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ed23bce8a1b162b1f7572447f2222b50e3896256 |
--- /dev/null |
+++ b/net/quic/core/quic_packets.h |
@@ -0,0 +1,263 @@ |
+// 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. |
+ |
+#ifndef NET_QUIC_QUIC_PROTOCOL_H_ |
+#define NET_QUIC_QUIC_PROTOCOL_H_ |
+ |
+#include <limits> |
+#include <list> |
+#include <memory> |
+#include <ostream> |
+#include <string> |
+#include <utility> |
+#include <vector> |
+ |
+#include "base/logging.h" |
+#include "base/macros.h" |
+#include "base/memory/ref_counted.h" |
+#include "base/strings/string_piece.h" |
+#include "net/base/int128.h" |
+#include "net/base/iovec.h" |
+#include "net/base/net_export.h" |
+#include "net/quic/core/frames/quic_frame.h" |
+#include "net/quic/core/quic_ack_listener_interface.h" |
+#include "net/quic/core/quic_bandwidth.h" |
+#include "net/quic/core/quic_constants.h" |
+#include "net/quic/core/quic_error_codes.h" |
+#include "net/quic/core/quic_time.h" |
+#include "net/quic/core/quic_types.h" |
+#include "net/quic/core/quic_versions.h" |
+#include "net/quic/platform/api/quic_socket_address.h" |
+ |
+namespace net { |
+ |
+class QuicPacket; |
+struct QuicPacketHeader; |
+ |
+// Size in bytes of the data packet header. |
+NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(QuicVersion version, |
+ const QuicPacketHeader& header); |
+ |
+NET_EXPORT_PRIVATE size_t |
+GetPacketHeaderSize(QuicVersion version, |
+ QuicConnectionIdLength connection_id_length, |
+ bool include_version, |
+ bool include_path_id, |
+ bool include_diversification_nonce, |
+ QuicPacketNumberLength packet_number_length); |
+ |
+// Index of the first byte in a QUIC packet of encrypted data. |
+NET_EXPORT_PRIVATE size_t |
+GetStartOfEncryptedData(QuicVersion version, const QuicPacketHeader& header); |
+ |
+NET_EXPORT_PRIVATE size_t |
+GetStartOfEncryptedData(QuicVersion version, |
+ QuicConnectionIdLength connection_id_length, |
+ bool include_version, |
+ bool include_path_id, |
+ bool include_diversification_nonce, |
+ QuicPacketNumberLength packet_number_length); |
+ |
+struct NET_EXPORT_PRIVATE QuicPacketPublicHeader { |
+ QuicPacketPublicHeader(); |
+ explicit QuicPacketPublicHeader(const QuicPacketPublicHeader& other); |
+ ~QuicPacketPublicHeader(); |
+ |
+ // Universal header. All QuicPacket headers will have a connection_id and |
+ // public flags. |
+ QuicConnectionId connection_id; |
+ QuicConnectionIdLength connection_id_length; |
+ bool multipath_flag; |
+ bool reset_flag; |
+ bool version_flag; |
+ QuicPacketNumberLength packet_number_length; |
+ QuicVersionVector versions; |
+ // nonce contains an optional, 32-byte nonce value. If not included in the |
+ // packet, |nonce| will be empty. |
+ DiversificationNonce* nonce; |
+}; |
+ |
+// Header for Data packets. |
+struct NET_EXPORT_PRIVATE QuicPacketHeader { |
+ QuicPacketHeader(); |
+ explicit QuicPacketHeader(const QuicPacketPublicHeader& header); |
+ QuicPacketHeader(const QuicPacketHeader& other); |
+ |
+ NET_EXPORT_PRIVATE friend std::ostream& operator<<(std::ostream& os, |
+ const QuicPacketHeader& s); |
+ |
+ QuicPacketPublicHeader public_header; |
+ QuicPacketNumber packet_number; |
+ QuicPathId path_id; |
+}; |
+ |
+struct NET_EXPORT_PRIVATE QuicPublicResetPacket { |
+ QuicPublicResetPacket(); |
+ explicit QuicPublicResetPacket(const QuicPacketPublicHeader& header); |
+ |
+ QuicPacketPublicHeader public_header; |
+ QuicPublicResetNonceProof nonce_proof; |
+ // TODO(fayang): remove rejected_packet_number when deprecating |
+ // FLAGS_quic_remove_packet_number_from_public_reset. |
+ QuicPacketNumber rejected_packet_number; |
+ QuicSocketAddress client_address; |
+}; |
+ |
+typedef QuicPacketPublicHeader QuicVersionNegotiationPacket; |
+ |
+class NET_EXPORT_PRIVATE QuicData { |
+ public: |
+ QuicData(const char* buffer, size_t length); |
+ QuicData(const char* buffer, size_t length, bool owns_buffer); |
+ virtual ~QuicData(); |
+ |
+ base::StringPiece AsStringPiece() const { |
+ return base::StringPiece(data(), length()); |
+ } |
+ |
+ const char* data() const { return buffer_; } |
+ size_t length() const { return length_; } |
+ |
+ private: |
+ const char* buffer_; |
+ size_t length_; |
+ bool owns_buffer_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(QuicData); |
+}; |
+ |
+class NET_EXPORT_PRIVATE QuicPacket : public QuicData { |
+ public: |
+ // TODO(fayang): 4 fields from public header are passed in as arguments. |
+ // Consider to add a convenience method which directly accepts the entire |
+ // public header. |
+ QuicPacket(char* buffer, |
+ size_t length, |
+ bool owns_buffer, |
+ QuicConnectionIdLength connection_id_length, |
+ bool includes_version, |
+ bool includes_path_id, |
+ bool includes_diversification_nonce, |
+ QuicPacketNumberLength packet_number_length); |
+ |
+ base::StringPiece AssociatedData(QuicVersion version) const; |
+ base::StringPiece Plaintext(QuicVersion version) const; |
+ |
+ char* mutable_data() { return buffer_; } |
+ |
+ private: |
+ char* buffer_; |
+ const QuicConnectionIdLength connection_id_length_; |
+ const bool includes_version_; |
+ const bool includes_path_id_; |
+ const bool includes_diversification_nonce_; |
+ const QuicPacketNumberLength packet_number_length_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(QuicPacket); |
+}; |
+ |
+class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData { |
+ public: |
+ QuicEncryptedPacket(const char* buffer, size_t length); |
+ QuicEncryptedPacket(const char* buffer, size_t length, bool owns_buffer); |
+ |
+ // Clones the packet into a new packet which owns the buffer. |
+ std::unique_ptr<QuicEncryptedPacket> Clone() const; |
+ |
+ // By default, gtest prints the raw bytes of an object. The bool data |
+ // member (in the base class QuicData) causes this object to have padding |
+ // bytes, which causes the default gtest object printer to read |
+ // uninitialize memory. So we need to teach gtest how to print this object. |
+ NET_EXPORT_PRIVATE friend std::ostream& operator<<( |
+ std::ostream& os, |
+ const QuicEncryptedPacket& s); |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(QuicEncryptedPacket); |
+}; |
+ |
+// A received encrypted QUIC packet, with a recorded time of receipt. |
+class NET_EXPORT_PRIVATE QuicReceivedPacket : public QuicEncryptedPacket { |
+ public: |
+ QuicReceivedPacket(const char* buffer, size_t length, QuicTime receipt_time); |
+ QuicReceivedPacket(const char* buffer, |
+ size_t length, |
+ QuicTime receipt_time, |
+ bool owns_buffer); |
+ QuicReceivedPacket(const char* buffer, |
+ size_t length, |
+ QuicTime receipt_time, |
+ bool owns_buffer, |
+ int ttl, |
+ bool ttl_valid); |
+ |
+ // Clones the packet into a new packet which owns the buffer. |
+ std::unique_ptr<QuicReceivedPacket> Clone() const; |
+ |
+ // Returns the time at which the packet was received. |
+ QuicTime receipt_time() const { return receipt_time_; } |
+ |
+ // This is the TTL of the packet, assuming ttl_vaild_ is true. |
+ int ttl() const { return ttl_; } |
+ |
+ // By default, gtest prints the raw bytes of an object. The bool data |
+ // member (in the base class QuicData) causes this object to have padding |
+ // bytes, which causes the default gtest object printer to read |
+ // uninitialize memory. So we need to teach gtest how to print this object. |
+ NET_EXPORT_PRIVATE friend std::ostream& operator<<( |
+ std::ostream& os, |
+ const QuicReceivedPacket& s); |
+ |
+ private: |
+ const QuicTime receipt_time_; |
+ int ttl_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(QuicReceivedPacket); |
+}; |
+ |
+struct NET_EXPORT_PRIVATE SerializedPacket { |
+ SerializedPacket(QuicPathId path_id, |
+ QuicPacketNumber packet_number, |
+ QuicPacketNumberLength packet_number_length, |
+ const char* encrypted_buffer, |
+ QuicPacketLength encrypted_length, |
+ bool has_ack, |
+ bool has_stop_waiting); |
+ SerializedPacket(const SerializedPacket& other); |
+ ~SerializedPacket(); |
+ |
+ // Not owned. |
+ const char* encrypted_buffer; |
+ QuicPacketLength encrypted_length; |
+ QuicFrames retransmittable_frames; |
+ IsHandshake has_crypto_handshake; |
+ // -1: full padding to the end of a max-sized packet |
+ // 0: no padding |
+ // otherwise: only pad up to num_padding_bytes bytes |
+ int16_t num_padding_bytes; |
+ QuicPathId path_id; |
+ QuicPacketNumber packet_number; |
+ QuicPacketNumberLength packet_number_length; |
+ EncryptionLevel encryption_level; |
+ bool has_ack; |
+ bool has_stop_waiting; |
+ TransmissionType transmission_type; |
+ QuicPathId original_path_id; |
+ QuicPacketNumber original_packet_number; |
+ |
+ // Optional notifiers which will be informed when this packet has been ACKed. |
+ std::list<AckListenerWrapper> listeners; |
+}; |
+ |
+// Deletes and clears all the frames and the packet from serialized packet. |
+NET_EXPORT_PRIVATE void ClearSerializedPacket( |
+ SerializedPacket* serialized_packet); |
+ |
+// Allocates a new char[] of size |packet.encrypted_length| and copies in |
+// |packet.encrypted_buffer|. |
+NET_EXPORT_PRIVATE char* CopyBuffer(const SerializedPacket& packet); |
+ |
+} // namespace net |
+ |
+#endif // NET_QUIC_QUIC_PROTOCOL_H_ |