quic_protocol.h revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_QUIC_QUIC_PROTOCOL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_QUIC_QUIC_PROTOCOL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <ostream>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utility>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/hash_tables.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/string_piece.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_time.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/uint128.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuicPacket;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64 QuicGuid;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint32 QuicStreamId;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64 QuicStreamOffset;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint64 QuicPacketSequenceNumber;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef uint8 QuicFecGroupNumber;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rch): Consider Quic specific names for these constants.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kMaxPacketSize = 1200;  // Maximum size in bytes of a QUIC packet.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Maximum number of open streams per connection.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kDefaultMaxStreamsPerConnection = 100;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Size in bytes of the packet header common across all packets.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kPacketHeaderSize = 16;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index of the first byte in a QUIC packet of FEC protected data.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kStartOfFecProtectedData = kPacketHeaderSize;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index of the first byte in a QUIC packet of encrypted data.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kStartOfEncryptedData = kPacketHeaderSize - 1;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index of the first byte in a QUIC packet which is hashed.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kStartOfHashData = 0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index into the sequence number offset in the header.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kSequenceNumberOffset = 8;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index into the flags offset in the header.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kFlagsOffset = 14;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Index into the fec group offset in the header.
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kFecGroupOffset = 15;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Size in bytes of all stream frame fields.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kMinStreamFrameLength = 15;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Limit on the delta between stream IDs.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const QuicStreamId kMaxStreamIdDelta = 100;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Reserved ID for the crypto stream.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(rch): ensure that this is not usable by any other streams.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const QuicStreamId kCryptoStreamId = 1;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::pair<QuicPacketSequenceNumber, QuicPacket*> PacketPair;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int64 kDefaultTimeoutUs = 600000000;  // 10 minutes.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuicFrameType {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  STREAM_FRAME = 0,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PDU_FRAME,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ACK_FRAME,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RST_STREAM_FRAME,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CONNECTION_CLOSE_FRAME,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NUM_FRAME_TYPES
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuicPacketFlags {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PACKET_FLAGS_NONE = 0,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PACKET_FLAGS_FEC = 1,  // Payload is FEC as opposed to frames.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PACKET_FLAGS_MAX = PACKET_FLAGS_FEC
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum QuicErrorCode {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stream errors.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_NO_ERROR = 0,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There were data frames after the a fin or reset.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_STREAM_DATA_AFTER_TERMINATION,
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was some server error which halted stream processing.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_SERVER_ERROR_PROCESSING_STREAM,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got two fin or reset offsets which did not match.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_MULTIPLE_TERMINATION_OFFSETS,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We got bad payload and can not respond to it at the protocol level.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_BAD_APPLICATION_PAYLOAD,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection errors.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Control frame is malformed.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_PACKET_HEADER,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Frame data is malformed.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FRAME_DATA,
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FEC data is malformed.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_FEC_DATA,
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stream rst data is malformed
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_RST_STREAM_DATA,
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Connection close data is malformed.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CONNECTION_CLOSE_DATA,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ack data is malformed.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_ACK_DATA,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error decrypting.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_DECRYPTION_FAILURE,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // There was an error encrypting.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_ENCRYPTION_FAILURE,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The packet exceeded kMaxPacketSize.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_TOO_LARGE,
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Data was sent for a stream which did not exist.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_PACKET_FOR_NONEXISTENT_STREAM,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The client is going away (browser close, etc.)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CLIENT_GOING_AWAY,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The server is going away (restart etc.)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_SERVER_GOING_AWAY,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A stream ID was invalid.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_STREAM_ID,
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Too many streams already open.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_TOO_MANY_OPEN_STREAMS,
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We hit our prenegotiated (or default) timeout
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CONNECTION_TIMED_OUT,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Crypto errors.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained out of order tags.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TAGS_OUT_OF_ORDER,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained too many entires.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_TOO_MANY_ENTRIES,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handshake message contained an invalid value length.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_INVALID_VALUE_LENGTH,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A crypto message was received after the handshake was complete.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_CRYPTO_MESSAGE_AFTER_HANDSHAKE_COMPLETE,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A crypto message was receieved with an illegal message tag.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QUIC_INVALID_CRYPTO_MESSAGE_TYPE,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketHeader {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Includes the ConnectionHeader and CongestionMonitoredHeader
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // from the design docs, as well as some elements of DecryptedData.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicGuid guid;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber packet_sequence_number;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketFlags flags;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicStreamFrame {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamFrame(QuicStreamId stream_id,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool fin,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  uint64 offset,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  base::StringPiece data);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool fin;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 offset;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece data;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE ReceivedPacketInfo {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReceivedPacketInfo();
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~ReceivedPacketInfo();
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The highest packet sequence number we've received from the peer.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber largest_received;
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The time at which we received the above packet.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicTime time_received;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of packets which we're expecting and have not received.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This includes any packets between the lowest and largest_received
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which we have neither seen nor been informed are non-retransmitting.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::hash_set<QuicPacketSequenceNumber> missing_packets;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE SentPacketInfo {
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SentPacketInfo();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~SentPacketInfo();
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The lowest packet we've sent which is unacked, and we expect an ack for.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber least_unacked;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The set of packets between least_unacked and the last packet we have sent
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which we will not resend.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::hash_set<QuicPacketSequenceNumber> non_retransmiting;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Defines for all types of congestion feedback that will be negotiated in QUIC,
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kTCP MUST be supported by all QUIC implementations to guarentee 100%
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// compatibility.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum CongestionFeedbackType {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kNone = 0,  // No feedback provided
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kTCP,  // Used to mimic TCP.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kInterArrival,  // Use additional inter arrival information.
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  kFixRate,  // Provided for testing.
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageTCP {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 receive_window;  // Number of bytes >> 4.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageInterArrival {
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 accumulated_number_of_lost_packets;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int16 offset_time;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 delta_time;  // delta time is described below.
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Description of delta time.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 0                   1
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * |D|S|       offset_time         |
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Where:
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   D is the time domain. If set time domain is in milliseconds, else in
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    microseconds.
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   S is the sign bit.
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   offset_time is the time offset where the relative packet size is equal to
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    0.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionFeedbackMessageFixRate {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 bitrate_in_bytes_per_second;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE CongestionInfo {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CongestionFeedbackType type;
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CongestionFeedbackMessageTCP tcp;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CongestionFeedbackMessageInterArrival inter_arrival;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CongestionFeedbackMessageFixRate fix_rate;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicAckFrame {
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicAckFrame() {}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicAckFrame(QuicPacketSequenceNumber largest_received,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               QuicTime time_received,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               QuicPacketSequenceNumber least_unacked) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_info.largest_received = largest_received;
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_info.time_received = time_received;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    sent_info.least_unacked = least_unacked;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    congestion_info.type = kNone;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NET_EXPORT_PRIVATE friend std::ostream& operator<<(std::ostream& os,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                     const QuicAckFrame& s);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SentPacketInfo sent_info;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReceivedPacketInfo received_info;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CongestionInfo congestion_info;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicRstStreamFrame {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicRstStreamFrame() {}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicRstStreamFrame(QuicStreamId stream_id, uint64 offset,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        QuicErrorCode error_code)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : stream_id(stream_id), offset(offset), error_code(error_code) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_LE(error_code, std::numeric_limits<uint8>::max());
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId stream_id;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 offset;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicErrorCode error_code;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicConnectionCloseFrame {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicErrorCode error_code;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicAckFrame ack_frame;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string error_details;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFrame {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrame() {}
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicStreamFrame* stream_frame)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(STREAM_FRAME), stream_frame(stream_frame) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicAckFrame* frame)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(ACK_FRAME), ack_frame(frame) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicRstStreamFrame* frame)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(RST_STREAM_FRAME),
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rst_stream_frame(frame) {
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit QuicFrame(QuicConnectionCloseFrame* frame)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : type(CONNECTION_CLOSE_FRAME),
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        connection_close_frame(frame) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFrameType type;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicStreamFrame* stream_frame;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicAckFrame* ack_frame;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicRstStreamFrame* rst_stream_frame;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    QuicConnectionCloseFrame* connection_close_frame;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef std::vector<QuicFrame> QuicFrames;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicFecData {
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecData();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool operator==(const QuicFecData& other) const;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicFecGroupNumber fec_group;
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketSequenceNumber min_protected_packet_sequence_number;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The last protected packet's sequence number will be one
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // less than the sequence number of the FEC packet.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece redundancy;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NET_EXPORT_PRIVATE QuicPacketData {
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string data;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicData {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(const char* buffer, size_t length)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        owns_buffer_(false) { }
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicData(char* buffer, size_t length, bool owns_buffer)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : buffer_(buffer),
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        length_(length),
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        owns_buffer_(owns_buffer) { }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuicData();
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece AsStringPiece() const {
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data(), length());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* data() const { return buffer_; }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length() const { return length_; }
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* buffer_;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t length_;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool owns_buffer_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicData);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicPacket : public QuicData {
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacket(
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      char* buffer, size_t length, bool owns_buffer, QuicPacketFlags flags)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : QuicData(buffer, length, owns_buffer),
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        buffer_(buffer),
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        flags_(flags) { }
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece FecProtectedData() const {
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data() + kStartOfFecProtectedData,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             length() - kStartOfFecProtectedData);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece AssociatedData() const {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data() + kStartOfHashData, kStartOfEncryptedData);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece Plaintext() const {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data() + kStartOfEncryptedData,
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             length() - kStartOfEncryptedData);
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFecPacket() const {
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return flags_ == PACKET_FLAGS_FEC;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* mutable_data() { return buffer_; }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* buffer_;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const QuicPacketFlags flags_;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicPacket);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicEncryptedPacket : public QuicData {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(const char* buffer, size_t length)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : QuicData(buffer, length) { }
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicEncryptedPacket(char* buffer, size_t length, bool owns_buffer)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : QuicData(buffer, length, owns_buffer) { }
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringPiece AssociatedData() const {
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::StringPiece(data() + kStartOfHashData, kStartOfEncryptedData);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicEncryptedPacket);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_QUIC_QUIC_PROTOCOL_H_
406