/* * include/types/quic_frame.h * This file contains QUIC frame definitions. * * Copyright 2019 HAProxy Technologies, Frédéric Lécaille * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation, version 2.1 * exclusively. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef _TYPES_QUIC_FRAME_H #define _TYPES_QUIC_FRAME_H #ifdef USE_QUIC #ifndef USE_OPENSSL #error "Must define USE_OPENSSL" #endif #include #include #include /* QUIC frame types. */ enum quic_frame_type { QUIC_FT_PADDING = 0x00, QUIC_FT_PING = 0x01, QUIC_FT_ACK = 0x02, QUIC_FT_ACK_ECN = 0x03, QUIC_FT_RESET_STREAM = 0x04, QUIC_FT_STOP_SENDING = 0x05, QUIC_FT_CRYPTO = 0x06, QUIC_FT_NEW_TOKEN = 0x07, QUIC_FT_STREAM_8 = 0x08, QUIC_FT_STREAM_9 = 0x09, QUIC_FT_STREAM_A = 0x0a, QUIC_FT_STREAM_B = 0x0b, QUIC_FT_STREAM_C = 0x0c, QUIC_FT_STREAM_D = 0x0d, QUIC_FT_STREAM_E = 0x0e, QUIC_FT_STREAM_F = 0x0f, QUIC_FT_MAX_DATA = 0x10, QUIC_FT_MAX_STREAM_DATA = 0x11, QUIC_FT_MAX_STREAMS_BIDI = 0x12, QUIC_FT_MAX_STREAMS_UNI = 0x13, QUIC_FT_DATA_BLOCKED = 0x14, QUIC_FT_STREAM_DATA_BLOCKED = 0x15, QUIC_FT_STREAMS_BLOCKED_BIDI = 0x16, QUIC_FT_STREAMS_BLOCKED_UNI = 0x17, QUIC_FT_NEW_CONNECTION_ID = 0x18, QUIC_FT_RETIRE_CONNECTION_ID = 0x19, QUIC_FT_PATH_CHALLENGE = 0x1a, QUIC_FT_PATH_RESPONSE = 0x1b, QUIC_FT_CONNECTION_CLOSE = 0x1c, QUIC_FT_CONNECTION_CLOSE_APP = 0x1d, QUIC_FT_HANDSHAKE_DONE = 0x1e, /* Do not insert enums after the following one. */ QUIC_FT_MAX }; #define QUIC_FT_PKT_TYPE_I_BITMASK (1 << QUIC_PACKET_TYPE_INITIAL) #define QUIC_FT_PKT_TYPE_0_BITMASK (1 << QUIC_PACKET_TYPE_0RTT) #define QUIC_FT_PKT_TYPE_H_BITMASK (1 << QUIC_PACKET_TYPE_HANDSHAKE) #define QUIC_FT_PKT_TYPE_1_BITMASK (1 << QUIC_PACKET_TYPE_SHORT) #define QUIC_FT_PKT_TYPE_IH01_BITMASK \ (QUIC_FT_PKT_TYPE_I_BITMASK | QUIC_FT_PKT_TYPE_H_BITMASK | \ QUIC_FT_PKT_TYPE_0_BITMASK | QUIC_FT_PKT_TYPE_1_BITMASK) #define QUIC_FT_PKT_TYPE_IH_1_BITMASK \ (QUIC_FT_PKT_TYPE_I_BITMASK | QUIC_FT_PKT_TYPE_H_BITMASK | \ QUIC_FT_PKT_TYPE_1_BITMASK) #define QUIC_FT_PKT_TYPE___01_BITMASK \ (QUIC_FT_PKT_TYPE_0_BITMASK | QUIC_FT_PKT_TYPE_1_BITMASK) #define QUIC_FT_PKT_TYPE____1_BITMASK QUIC_FT_PKT_TYPE_1_BITMASK #define QUIC_STREAM_FRAME_TYPE_FIN_BIT 0x01 #define QUIC_STREAM_FRAME_TYPE_LEN_BIT 0x02 #define QUIC_STREAM_FRAME_TYPE_OFF_BIT 0x04 /* Servers have the stream initiator bit set. */ #define QUIC_STREAM_FRAME_ID_INITIATOR_BIT 0x01 /* Unidirectional streams have the direction bit set. */ #define QUIC_STREAM_FRAME_ID_DIR_BIT 0x02 #define QUIC_PATH_CHALLENGE_LEN 8 struct quic_padding { size_t len; }; struct quic_ack { uint64_t largest_ack; uint64_t ack_delay; uint64_t ack_range_num; uint64_t first_ack_range; }; /* Structure used when emitting ACK frames. */ struct quic_tx_ack { uint64_t ack_delay; struct quic_arngs *arngs; }; struct quic_reset_stream { uint64_t id; uint64_t app_error_code; uint64_t final_size; }; struct quic_stop_sending_frame { uint64_t id; uint64_t app_error_code; }; struct quic_crypto { uint64_t offset; uint64_t len; const struct quic_enc_level *qel; const unsigned char *data; }; struct quic_new_token { uint64_t len; const unsigned char *data; }; struct quic_stream { uint64_t id; uint64_t offset; uint64_t len; const unsigned char *data; }; struct quic_max_data { uint64_t max_data; }; struct quic_max_stream_data { uint64_t id; uint64_t max_stream_data; }; struct quic_max_streams { uint64_t max_streams; }; struct quic_data_blocked { uint64_t limit; }; struct quic_stream_data_blocked { uint64_t id; uint64_t limit; }; struct quic_streams_blocked { uint64_t limit; }; struct quic_new_connection_id { uint64_t seq_num; uint64_t retire_prior_to; struct { unsigned char len; const unsigned char *data; } cid; const unsigned char *stateless_reset_token; }; struct quic_retire_connection_id { uint64_t seq_num; }; struct quic_path_challenge { unsigned char data[QUIC_PATH_CHALLENGE_LEN]; }; struct quic_path_challenge_response { unsigned char data[QUIC_PATH_CHALLENGE_LEN]; }; struct quic_connection_close { uint64_t error_code; uint64_t frame_type; uint64_t reason_phrase_len; unsigned char *reason_phrase; }; struct quic_connection_close_app { uint64_t error_code; uint64_t reason_phrase_len; unsigned char *reason_phrase; }; struct quic_frame { struct list list; unsigned char type; union { struct quic_padding padding; struct quic_ack ack; struct quic_tx_ack tx_ack; struct quic_crypto crypto; struct quic_reset_stream reset_stream; struct quic_stop_sending_frame stop_sending_frame; struct quic_new_token new_token; struct quic_stream stream; struct quic_max_data max_data; struct quic_max_stream_data max_stream_data; struct quic_max_streams max_streams_bidi; struct quic_max_streams max_streams_uni; struct quic_data_blocked data_blocked; struct quic_stream_data_blocked stream_data_blocked; struct quic_streams_blocked streams_blocked_bidi; struct quic_streams_blocked streams_blocked_uni; struct quic_new_connection_id new_connection_id; struct quic_retire_connection_id retire_connection_id; struct quic_path_challenge path_challenge; struct quic_path_challenge_response path_challenge_response; struct quic_connection_close connection_close; struct quic_connection_close_app connection_close_app; }; }; #endif /* USE_QUIC */ #endif /* _TYPES_QUIC_FRAME_H */