| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef NET_QUIC_QUIC_PROTOCOL_H_ | 5 #ifndef NET_QUIC_QUIC_PROTOCOL_H_ |
| 6 #define NET_QUIC_QUIC_PROTOCOL_H_ | 6 #define NET_QUIC_QUIC_PROTOCOL_H_ |
| 7 | 7 |
| 8 #include <stddef.h> | 8 #include <stddef.h> |
| 9 #include <limits> | 9 #include <limits> |
| 10 #include <map> | 10 #include <map> |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "net/quic/quic_time.h" | 26 #include "net/quic/quic_time.h" |
| 27 | 27 |
| 28 namespace net { | 28 namespace net { |
| 29 | 29 |
| 30 using ::operator<<; | 30 using ::operator<<; |
| 31 | 31 |
| 32 class QuicAckNotifier; | 32 class QuicAckNotifier; |
| 33 class QuicPacket; | 33 class QuicPacket; |
| 34 struct QuicPacketHeader; | 34 struct QuicPacketHeader; |
| 35 | 35 |
| 36 typedef uint64 QuicGuid; | 36 typedef uint64 QuicConnectionId; |
| 37 typedef uint32 QuicStreamId; | 37 typedef uint32 QuicStreamId; |
| 38 typedef uint64 QuicStreamOffset; | 38 typedef uint64 QuicStreamOffset; |
| 39 typedef uint64 QuicPacketSequenceNumber; | 39 typedef uint64 QuicPacketSequenceNumber; |
| 40 typedef QuicPacketSequenceNumber QuicFecGroupNumber; | 40 typedef QuicPacketSequenceNumber QuicFecGroupNumber; |
| 41 typedef uint64 QuicPublicResetNonceProof; | 41 typedef uint64 QuicPublicResetNonceProof; |
| 42 typedef uint8 QuicPacketEntropyHash; | 42 typedef uint8 QuicPacketEntropyHash; |
| 43 typedef uint32 QuicHeaderId; | 43 typedef uint32 QuicHeaderId; |
| 44 // QuicTag is the type of a tag in the wire protocol. | 44 // QuicTag is the type of a tag in the wire protocol. |
| 45 typedef uint32 QuicTag; | 45 typedef uint32 QuicTag; |
| 46 typedef std::vector<QuicTag> QuicTagVector; | 46 typedef std::vector<QuicTag> QuicTagVector; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 158 STOP_WAITING_FRAME = 6, | 158 STOP_WAITING_FRAME = 6, |
| 159 | 159 |
| 160 // STREAM, ACK, and CONGESTION_FEEDBACK frames are special frames. They are | 160 // STREAM, ACK, and CONGESTION_FEEDBACK frames are special frames. They are |
| 161 // encoded differently on the wire and their values do not need to be stable. | 161 // encoded differently on the wire and their values do not need to be stable. |
| 162 STREAM_FRAME, | 162 STREAM_FRAME, |
| 163 ACK_FRAME, | 163 ACK_FRAME, |
| 164 CONGESTION_FEEDBACK_FRAME, | 164 CONGESTION_FEEDBACK_FRAME, |
| 165 NUM_FRAME_TYPES | 165 NUM_FRAME_TYPES |
| 166 }; | 166 }; |
| 167 | 167 |
| 168 enum QuicGuidLength { | 168 enum QuicConnectionIdLength { |
| 169 PACKET_0BYTE_GUID = 0, | 169 PACKET_0BYTE_CONNECTION_ID = 0, |
| 170 PACKET_1BYTE_GUID = 1, | 170 PACKET_1BYTE_CONNECTION_ID = 1, |
| 171 PACKET_4BYTE_GUID = 4, | 171 PACKET_4BYTE_CONNECTION_ID = 4, |
| 172 PACKET_8BYTE_GUID = 8 | 172 PACKET_8BYTE_CONNECTION_ID = 8 |
| 173 }; | 173 }; |
| 174 | 174 |
| 175 enum InFecGroup { | 175 enum InFecGroup { |
| 176 NOT_IN_FEC_GROUP, | 176 NOT_IN_FEC_GROUP, |
| 177 IN_FEC_GROUP, | 177 IN_FEC_GROUP, |
| 178 }; | 178 }; |
| 179 | 179 |
| 180 enum QuicSequenceNumberLength { | 180 enum QuicSequenceNumberLength { |
| 181 PACKET_1BYTE_SEQUENCE_NUMBER = 1, | 181 PACKET_1BYTE_SEQUENCE_NUMBER = 1, |
| 182 PACKET_2BYTE_SEQUENCE_NUMBER = 2, | 182 PACKET_2BYTE_SEQUENCE_NUMBER = 2, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 195 // The public flags are specified in one byte. | 195 // The public flags are specified in one byte. |
| 196 enum QuicPacketPublicFlags { | 196 enum QuicPacketPublicFlags { |
| 197 PACKET_PUBLIC_FLAGS_NONE = 0, | 197 PACKET_PUBLIC_FLAGS_NONE = 0, |
| 198 | 198 |
| 199 // Bit 0: Does the packet header contains version info? | 199 // Bit 0: Does the packet header contains version info? |
| 200 PACKET_PUBLIC_FLAGS_VERSION = 1 << 0, | 200 PACKET_PUBLIC_FLAGS_VERSION = 1 << 0, |
| 201 | 201 |
| 202 // Bit 1: Is this packet a public reset packet? | 202 // Bit 1: Is this packet a public reset packet? |
| 203 PACKET_PUBLIC_FLAGS_RST = 1 << 1, | 203 PACKET_PUBLIC_FLAGS_RST = 1 << 1, |
| 204 | 204 |
| 205 // Bits 2 and 3 specify the length of the GUID as follows: | 205 // Bits 2 and 3 specify the length of the ConnectionId as follows: |
| 206 // ----00--: 0 bytes | 206 // ----00--: 0 bytes |
| 207 // ----01--: 1 byte | 207 // ----01--: 1 byte |
| 208 // ----10--: 4 bytes | 208 // ----10--: 4 bytes |
| 209 // ----11--: 8 bytes | 209 // ----11--: 8 bytes |
| 210 PACKET_PUBLIC_FLAGS_0BYTE_GUID = 0, | 210 PACKET_PUBLIC_FLAGS_0BYTE_CONNECTION_ID = 0, |
| 211 PACKET_PUBLIC_FLAGS_1BYTE_GUID = 1 << 2, | 211 PACKET_PUBLIC_FLAGS_1BYTE_CONNECTION_ID = 1 << 2, |
| 212 PACKET_PUBLIC_FLAGS_4BYTE_GUID = 1 << 3, | 212 PACKET_PUBLIC_FLAGS_4BYTE_CONNECTION_ID = 1 << 3, |
| 213 PACKET_PUBLIC_FLAGS_8BYTE_GUID = 1 << 3 | 1 << 2, | 213 PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID = 1 << 3 | 1 << 2, |
| 214 | 214 |
| 215 // Bits 4 and 5 describe the packet sequence number length as follows: | 215 // Bits 4 and 5 describe the packet sequence number length as follows: |
| 216 // --00----: 1 byte | 216 // --00----: 1 byte |
| 217 // --01----: 2 bytes | 217 // --01----: 2 bytes |
| 218 // --10----: 4 bytes | 218 // --10----: 4 bytes |
| 219 // --11----: 6 bytes | 219 // --11----: 6 bytes |
| 220 PACKET_PUBLIC_FLAGS_1BYTE_SEQUENCE = PACKET_FLAGS_1BYTE_SEQUENCE << 4, | 220 PACKET_PUBLIC_FLAGS_1BYTE_SEQUENCE = PACKET_FLAGS_1BYTE_SEQUENCE << 4, |
| 221 PACKET_PUBLIC_FLAGS_2BYTE_SEQUENCE = PACKET_FLAGS_2BYTE_SEQUENCE << 4, | 221 PACKET_PUBLIC_FLAGS_2BYTE_SEQUENCE = PACKET_FLAGS_2BYTE_SEQUENCE << 4, |
| 222 PACKET_PUBLIC_FLAGS_4BYTE_SEQUENCE = PACKET_FLAGS_4BYTE_SEQUENCE << 4, | 222 PACKET_PUBLIC_FLAGS_4BYTE_SEQUENCE = PACKET_FLAGS_4BYTE_SEQUENCE << 4, |
| 223 PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE = PACKET_FLAGS_6BYTE_SEQUENCE << 4, | 223 PACKET_PUBLIC_FLAGS_6BYTE_SEQUENCE = PACKET_FLAGS_6BYTE_SEQUENCE << 4, |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 305 // to reverse the order of the bytes. | 305 // to reverse the order of the bytes. |
| 306 | 306 |
| 307 // MakeQuicTag returns a value given the four bytes. For example: | 307 // MakeQuicTag returns a value given the four bytes. For example: |
| 308 // MakeQuicTag('C', 'H', 'L', 'O'); | 308 // MakeQuicTag('C', 'H', 'L', 'O'); |
| 309 NET_EXPORT_PRIVATE QuicTag MakeQuicTag(char a, char b, char c, char d); | 309 NET_EXPORT_PRIVATE QuicTag MakeQuicTag(char a, char b, char c, char d); |
| 310 | 310 |
| 311 // Size in bytes of the data or fec packet header. | 311 // Size in bytes of the data or fec packet header. |
| 312 NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(const QuicPacketHeader& header); | 312 NET_EXPORT_PRIVATE size_t GetPacketHeaderSize(const QuicPacketHeader& header); |
| 313 | 313 |
| 314 NET_EXPORT_PRIVATE size_t GetPacketHeaderSize( | 314 NET_EXPORT_PRIVATE size_t GetPacketHeaderSize( |
| 315 QuicGuidLength guid_length, | 315 QuicConnectionIdLength connection_id_length, |
| 316 bool include_version, | 316 bool include_version, |
| 317 QuicSequenceNumberLength sequence_number_length, | 317 QuicSequenceNumberLength sequence_number_length, |
| 318 InFecGroup is_in_fec_group); | 318 InFecGroup is_in_fec_group); |
| 319 | 319 |
| 320 // Index of the first byte in a QUIC packet of FEC protected data. | 320 // Index of the first byte in a QUIC packet of FEC protected data. |
| 321 NET_EXPORT_PRIVATE size_t GetStartOfFecProtectedData( | 321 NET_EXPORT_PRIVATE size_t GetStartOfFecProtectedData( |
| 322 QuicGuidLength guid_length, | 322 QuicConnectionIdLength connection_id_length, |
| 323 bool include_version, | 323 bool include_version, |
| 324 QuicSequenceNumberLength sequence_number_length); | 324 QuicSequenceNumberLength sequence_number_length); |
| 325 // Index of the first byte in a QUIC packet of encrypted data. | 325 // Index of the first byte in a QUIC packet of encrypted data. |
| 326 NET_EXPORT_PRIVATE size_t GetStartOfEncryptedData( | 326 NET_EXPORT_PRIVATE size_t GetStartOfEncryptedData( |
| 327 QuicGuidLength guid_length, | 327 QuicConnectionIdLength connection_id_length, |
| 328 bool include_version, | 328 bool include_version, |
| 329 QuicSequenceNumberLength sequence_number_length); | 329 QuicSequenceNumberLength sequence_number_length); |
| 330 | 330 |
| 331 enum QuicRstStreamErrorCode { | 331 enum QuicRstStreamErrorCode { |
| 332 QUIC_STREAM_NO_ERROR = 0, | 332 QUIC_STREAM_NO_ERROR = 0, |
| 333 | 333 |
| 334 // There was some error which halted stream processing. | 334 // There was some error which halted stream processing. |
| 335 QUIC_ERROR_PROCESSING_STREAM, | 335 QUIC_ERROR_PROCESSING_STREAM, |
| 336 // We got two fin or reset offsets which did not match. | 336 // We got two fin or reset offsets which did not match. |
| 337 QUIC_MULTIPLE_TERMINATION_OFFSETS, | 337 QUIC_MULTIPLE_TERMINATION_OFFSETS, |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 | 487 |
| 488 // No error. Used as bound while iterating. | 488 // No error. Used as bound while iterating. |
| 489 QUIC_LAST_ERROR = 61, | 489 QUIC_LAST_ERROR = 61, |
| 490 }; | 490 }; |
| 491 | 491 |
| 492 struct NET_EXPORT_PRIVATE QuicPacketPublicHeader { | 492 struct NET_EXPORT_PRIVATE QuicPacketPublicHeader { |
| 493 QuicPacketPublicHeader(); | 493 QuicPacketPublicHeader(); |
| 494 explicit QuicPacketPublicHeader(const QuicPacketPublicHeader& other); | 494 explicit QuicPacketPublicHeader(const QuicPacketPublicHeader& other); |
| 495 ~QuicPacketPublicHeader(); | 495 ~QuicPacketPublicHeader(); |
| 496 | 496 |
| 497 // Universal header. All QuicPacket headers will have a guid and public flags. | 497 // Universal header. All QuicPacket headers will have a connection_id and |
| 498 QuicGuid guid; | 498 // public flags. |
| 499 QuicGuidLength guid_length; | 499 QuicConnectionId connection_id; |
| 500 QuicConnectionIdLength connection_id_length; |
| 500 bool reset_flag; | 501 bool reset_flag; |
| 501 bool version_flag; | 502 bool version_flag; |
| 502 QuicSequenceNumberLength sequence_number_length; | 503 QuicSequenceNumberLength sequence_number_length; |
| 503 QuicVersionVector versions; | 504 QuicVersionVector versions; |
| 504 }; | 505 }; |
| 505 | 506 |
| 506 // Header for Data or FEC packets. | 507 // Header for Data or FEC packets. |
| 507 struct NET_EXPORT_PRIVATE QuicPacketHeader { | 508 struct NET_EXPORT_PRIVATE QuicPacketHeader { |
| 508 QuicPacketHeader(); | 509 QuicPacketHeader(); |
| 509 explicit QuicPacketHeader(const QuicPacketPublicHeader& header); | 510 explicit QuicPacketHeader(const QuicPacketPublicHeader& header); |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 861 | 862 |
| 862 DISALLOW_COPY_AND_ASSIGN(QuicData); | 863 DISALLOW_COPY_AND_ASSIGN(QuicData); |
| 863 }; | 864 }; |
| 864 | 865 |
| 865 class NET_EXPORT_PRIVATE QuicPacket : public QuicData { | 866 class NET_EXPORT_PRIVATE QuicPacket : public QuicData { |
| 866 public: | 867 public: |
| 867 static QuicPacket* NewDataPacket( | 868 static QuicPacket* NewDataPacket( |
| 868 char* buffer, | 869 char* buffer, |
| 869 size_t length, | 870 size_t length, |
| 870 bool owns_buffer, | 871 bool owns_buffer, |
| 871 QuicGuidLength guid_length, | 872 QuicConnectionIdLength connection_id_length, |
| 872 bool includes_version, | 873 bool includes_version, |
| 873 QuicSequenceNumberLength sequence_number_length) { | 874 QuicSequenceNumberLength sequence_number_length) { |
| 874 return new QuicPacket(buffer, length, owns_buffer, guid_length, | 875 return new QuicPacket(buffer, length, owns_buffer, connection_id_length, |
| 875 includes_version, sequence_number_length, false); | 876 includes_version, sequence_number_length, false); |
| 876 } | 877 } |
| 877 | 878 |
| 878 static QuicPacket* NewFecPacket( | 879 static QuicPacket* NewFecPacket( |
| 879 char* buffer, | 880 char* buffer, |
| 880 size_t length, | 881 size_t length, |
| 881 bool owns_buffer, | 882 bool owns_buffer, |
| 882 QuicGuidLength guid_length, | 883 QuicConnectionIdLength connection_id_length, |
| 883 bool includes_version, | 884 bool includes_version, |
| 884 QuicSequenceNumberLength sequence_number_length) { | 885 QuicSequenceNumberLength sequence_number_length) { |
| 885 return new QuicPacket(buffer, length, owns_buffer, guid_length, | 886 return new QuicPacket(buffer, length, owns_buffer, connection_id_length, |
| 886 includes_version, sequence_number_length, true); | 887 includes_version, sequence_number_length, true); |
| 887 } | 888 } |
| 888 | 889 |
| 889 base::StringPiece FecProtectedData() const; | 890 base::StringPiece FecProtectedData() const; |
| 890 base::StringPiece AssociatedData() const; | 891 base::StringPiece AssociatedData() const; |
| 891 base::StringPiece BeforePlaintext() const; | 892 base::StringPiece BeforePlaintext() const; |
| 892 base::StringPiece Plaintext() const; | 893 base::StringPiece Plaintext() const; |
| 893 | 894 |
| 894 bool is_fec_packet() const { return is_fec_packet_; } | 895 bool is_fec_packet() const { return is_fec_packet_; } |
| 895 | 896 |
| 896 char* mutable_data() { return buffer_; } | 897 char* mutable_data() { return buffer_; } |
| 897 | 898 |
| 898 private: | 899 private: |
| 899 QuicPacket(char* buffer, | 900 QuicPacket(char* buffer, |
| 900 size_t length, | 901 size_t length, |
| 901 bool owns_buffer, | 902 bool owns_buffer, |
| 902 QuicGuidLength guid_length, | 903 QuicConnectionIdLength connection_id_length, |
| 903 bool includes_version, | 904 bool includes_version, |
| 904 QuicSequenceNumberLength sequence_number_length, | 905 QuicSequenceNumberLength sequence_number_length, |
| 905 bool is_fec_packet); | 906 bool is_fec_packet); |
| 906 | 907 |
| 907 char* buffer_; | 908 char* buffer_; |
| 908 const bool is_fec_packet_; | 909 const bool is_fec_packet_; |
| 909 const QuicGuidLength guid_length_; | 910 const QuicConnectionIdLength connection_id_length_; |
| 910 const bool includes_version_; | 911 const bool includes_version_; |
| 911 const QuicSequenceNumberLength sequence_number_length_; | 912 const QuicSequenceNumberLength sequence_number_length_; |
| 912 | 913 |
| 913 DISALLOW_COPY_AND_ASSIGN(QuicPacket); | 914 DISALLOW_COPY_AND_ASSIGN(QuicPacket); |
| 914 }; | 915 }; |
| 915 | 916 |
| 916 class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData { | 917 class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData { |
| 917 public: | 918 public: |
| 918 QuicEncryptedPacket(const char* buffer, size_t length); | 919 QuicEncryptedPacket(const char* buffer, size_t length); |
| 919 QuicEncryptedPacket(char* buffer, size_t length, bool owns_buffer); | 920 QuicEncryptedPacket(char* buffer, size_t length, bool owns_buffer); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1011 WriteStatus status; | 1012 WriteStatus status; |
| 1012 union { | 1013 union { |
| 1013 int bytes_written; // only valid when status is OK | 1014 int bytes_written; // only valid when status is OK |
| 1014 int error_code; // only valid when status is ERROR | 1015 int error_code; // only valid when status is ERROR |
| 1015 }; | 1016 }; |
| 1016 }; | 1017 }; |
| 1017 | 1018 |
| 1018 } // namespace net | 1019 } // namespace net |
| 1019 | 1020 |
| 1020 #endif // NET_QUIC_QUIC_PROTOCOL_H_ | 1021 #endif // NET_QUIC_QUIC_PROTOCOL_H_ |
| OLD | NEW |