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