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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 // Reserved ID for the crypto stream. | 76 // Reserved ID for the crypto stream. |
77 // TODO(rch): ensure that this is not usable by any other streams. | 77 // TODO(rch): ensure that this is not usable by any other streams. |
78 const QuicStreamId kCryptoStreamId = 1; | 78 const QuicStreamId kCryptoStreamId = 1; |
79 | 79 |
80 // This is the default network timeout a for connection till the crypto | 80 // This is the default network timeout a for connection till the crypto |
81 // handshake succeeds and the negotiated timeout from the handshake is received. | 81 // handshake succeeds and the negotiated timeout from the handshake is received. |
82 const int64 kDefaultInitialTimeoutSecs = 120; // 2 mins. | 82 const int64 kDefaultInitialTimeoutSecs = 120; // 2 mins. |
83 const int64 kDefaultTimeoutSecs = 60 * 10; // 10 minutes. | 83 const int64 kDefaultTimeoutSecs = 60 * 10; // 10 minutes. |
84 const int64 kDefaultMaxTimeForCryptoHandshakeSecs = 5; // 5 secs. | 84 const int64 kDefaultMaxTimeForCryptoHandshakeSecs = 5; // 5 secs. |
85 | 85 |
| 86 // We define an unsigned 16-bit floating point value, inspired by IEEE floats |
| 87 // (http://en.wikipedia.org/wiki/Half_precision_floating-point_format), |
| 88 // with 5-bit exponent (bias 1), 11-bit mantissa (effective 12 with hidden |
| 89 // bit) and denormals, but without signs, transfinites or fractions. Wire format |
| 90 // 16 bits (little-endian byte order) are split into exponent (high 5) and |
| 91 // mantissa (low 11) and decoded as: |
| 92 // uint64 value; |
| 93 // if (exponent == 0) value = mantissa; |
| 94 // else value = (mantissa | 1 << 11) << (exponent - 1) |
| 95 const int kUFloat16ExponentBits = 5; |
| 96 const int kUFloat16MaxExponent = (1 << kUFloat16ExponentBits) - 2; // 30 |
| 97 const int kUFloat16MantissaBits = 16 - kUFloat16ExponentBits; // 11 |
| 98 const int kUFloat16MantissaEffectiveBits = kUFloat16MantissaBits + 1; // 12 |
| 99 const uint64 kUFloat16MaxValue = // 0x3FFC0000000 |
| 100 ((GG_UINT64_C(1) << kUFloat16MantissaEffectiveBits) - 1) << |
| 101 kUFloat16MaxExponent; |
| 102 |
86 enum TransmissionType { | 103 enum TransmissionType { |
87 NOT_RETRANSMISSION, | 104 NOT_RETRANSMISSION, |
88 NACK_RETRANSMISSION, | 105 NACK_RETRANSMISSION, |
89 RTO_RETRANSMISSION, | 106 RTO_RETRANSMISSION, |
90 }; | 107 }; |
91 | 108 |
92 enum HasRetransmittableData { | 109 enum HasRetransmittableData { |
93 NO_RETRANSMITTABLE_DATA, | 110 NO_RETRANSMITTABLE_DATA, |
94 HAS_RETRANSMITTABLE_DATA, | 111 HAS_RETRANSMITTABLE_DATA, |
95 }; | 112 }; |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 | 213 |
197 // This vector contains QUIC versions which we currently support. | 214 // This vector contains QUIC versions which we currently support. |
198 // This should be ordered such that the highest supported version is the first | 215 // This should be ordered such that the highest supported version is the first |
199 // element, with subsequent elements in descending order (versions can be | 216 // element, with subsequent elements in descending order (versions can be |
200 // skipped as necessary). | 217 // skipped as necessary). |
201 static const QuicVersion kSupportedQuicVersions[] = | 218 static const QuicVersion kSupportedQuicVersions[] = |
202 {QUIC_VERSION_10}; | 219 {QUIC_VERSION_10}; |
203 | 220 |
204 typedef std::vector<QuicVersion> QuicVersionVector; | 221 typedef std::vector<QuicVersion> QuicVersionVector; |
205 | 222 |
206 // Upper limit on versions we support. | 223 // Returns a vector of QUIC versions in kSupportedQuicVersions. |
207 NET_EXPORT_PRIVATE QuicVersion QuicVersionMax(); | 224 NET_EXPORT_PRIVATE QuicVersionVector QuicSupportedVersions(); |
208 | |
209 // Lower limit on versions we support. | |
210 NET_EXPORT_PRIVATE QuicVersion QuicVersionMin(); | |
211 | 225 |
212 // QuicTag is written to and read from the wire, but we prefer to use | 226 // QuicTag is written to and read from the wire, but we prefer to use |
213 // the more readable QuicVersion at other levels. | 227 // the more readable QuicVersion at other levels. |
214 // Helper function which translates from a QuicVersion to a QuicTag. Returns 0 | 228 // Helper function which translates from a QuicVersion to a QuicTag. Returns 0 |
215 // if QuicVersion is unsupported. | 229 // if QuicVersion is unsupported. |
216 NET_EXPORT_PRIVATE QuicTag QuicVersionToQuicTag(const QuicVersion version); | 230 NET_EXPORT_PRIVATE QuicTag QuicVersionToQuicTag(const QuicVersion version); |
217 | 231 |
218 // Returns appropriate QuicVersion from a QuicTag. | 232 // Returns appropriate QuicVersion from a QuicTag. |
219 // Returns QUIC_VERSION_UNSUPPORTED if version_tag cannot be understood. | 233 // Returns QUIC_VERSION_UNSUPPORTED if version_tag cannot be understood. |
220 NET_EXPORT_PRIVATE QuicVersion QuicTagToQuicVersion(const QuicTag version_tag); | 234 NET_EXPORT_PRIVATE QuicVersion QuicTagToQuicVersion(const QuicTag version_tag); |
221 | 235 |
222 // Helper function which translates from a QuicVersion to a string. | 236 // Helper function which translates from a QuicVersion to a string. |
223 // Returns strings corresponding to enum names (e.g. QUIC_VERSION_6). | 237 // Returns strings corresponding to enum names (e.g. QUIC_VERSION_6). |
224 NET_EXPORT_PRIVATE std::string QuicVersionToString(const QuicVersion version); | 238 NET_EXPORT_PRIVATE std::string QuicVersionToString(const QuicVersion version); |
225 | 239 |
226 // Returns comma separated list of string representations of QuicVersion enum | 240 // Returns comma separated list of string representations of QuicVersion enum |
227 // values in the supplied QuicVersionArray. | 241 // values in the supplied |versions| vector. |
228 NET_EXPORT_PRIVATE std::string QuicVersionArrayToString( | 242 NET_EXPORT_PRIVATE std::string QuicVersionVectorToString( |
229 const QuicVersion versions[], int num_versions); | 243 const QuicVersionVector& versions); |
230 | 244 |
231 // Version and Crypto tags are written to the wire with a big-endian | 245 // Version and Crypto tags are written to the wire with a big-endian |
232 // representation of the name of the tag. For example | 246 // representation of the name of the tag. For example |
233 // the client hello tag (CHLO) will be written as the | 247 // the client hello tag (CHLO) will be written as the |
234 // following 4 bytes: 'C' 'H' 'L' 'O'. Since it is | 248 // following 4 bytes: 'C' 'H' 'L' 'O'. Since it is |
235 // stored in memory as a little endian uint32, we need | 249 // stored in memory as a little endian uint32, we need |
236 // to reverse the order of the bytes. | 250 // to reverse the order of the bytes. |
237 | 251 |
238 // MakeQuicTag returns a value given the four bytes. For example: | 252 // MakeQuicTag returns a value given the four bytes. For example: |
239 // MakeQuicTag('C', 'H', 'L', 'O'); | 253 // MakeQuicTag('C', 'H', 'L', 'O'); |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
886 WriteStatus status; | 900 WriteStatus status; |
887 union { | 901 union { |
888 int bytes_written; // only valid when status is OK | 902 int bytes_written; // only valid when status is OK |
889 int error_code; // only valid when status is ERROR | 903 int error_code; // only valid when status is ERROR |
890 }; | 904 }; |
891 }; | 905 }; |
892 | 906 |
893 } // namespace net | 907 } // namespace net |
894 | 908 |
895 #endif // NET_QUIC_QUIC_PROTOCOL_H_ | 909 #endif // NET_QUIC_QUIC_PROTOCOL_H_ |
OLD | NEW |