lsquic_mini_conn_ietf.h revision 92f6e17b
1/* Copyright (c) 2017 - 2019 LiteSpeed Technologies Inc. See LICENSE. */ 2/* 3 * lsquic_mini_conn_ietf.h -- Mini connection used by the IETF QUIC 4 */ 5 6#ifndef LSQUIC_MINI_CONN_IETF_H 7#define LSQUIC_MINI_CONN_IETF_H 1 8 9struct lsquic_conn; 10struct lsquic_engine_public; 11struct lsquic_packet_in; 12 13enum { MCSBIT_WANTREAD, MCSBIT_WANTWRITE, }; 14 15struct mini_crypto_stream 16{ 17 unsigned mcs_read_off; 18 unsigned mcs_write_off; 19 enum { 20 MCS_WANTREAD = 1 << MCSBIT_WANTREAD, 21 MCS_WANTWRITE = 1 << MCSBIT_WANTWRITE, 22 MCS_CREATED = 1 << 2, 23 } mcs_flags:8; 24 enum enc_level mcs_enc_level:8; 25}; 26 27typedef uint64_t packno_set_t; 28#define MAX_PACKETS ((sizeof(packno_set_t) * 8) - 1) 29 30struct ietf_mini_conn 31{ 32 struct lsquic_conn imc_conn; 33 struct conn_cid_elem imc_cces[3]; 34 struct lsquic_engine_public *imc_enpub; 35 lsquic_time_t imc_created; 36 enum { 37 IMC_ENC_SESS_INITED = 1 << 0, 38 IMC_QUEUED_ACK_INIT = 1 << 1, 39 IMC_QUEUED_ACK_HSK = IMC_QUEUED_ACK_INIT << PNS_HSK, 40 IMC_QUEUED_ACK_APP = IMC_QUEUED_ACK_INIT << PNS_APP, 41 IMC_ERROR = 1 << 4, 42 IMC_HSK_OK = 1 << 5, 43 IMC_HSK_FAILED = 1 << 6, 44 IMC_HAVE_TP = 1 << 7, 45 IMC_RETRY_MODE = 1 << 8, 46 IMC_RETRY_DONE = 1 << 9, 47 IMC_IGNORE_INIT = 1 << 10, 48#define IMCBIT_PNS_BIT_SHIFT 11 49 IMC_MAX_PNS_BIT_0 = 1 << 11, 50 IMC_MAX_PNS_BIT_1 = 1 << 12, 51 IMC_TLS_ALERT = 1 << 13, 52 IMC_ABORT_ERROR = 1 << 14, 53 IMC_ABORT_ISAPP = 1 << 15, 54 IMC_BAD_TRANS_PARAMS = 1 << 16, 55 IMC_ADDR_VALIDATED = 1 << 17, 56 IMC_HSK_PACKET_SENT = 1 << 18, 57 } imc_flags; 58 struct mini_crypto_stream imc_streams[N_ENC_LEVS]; 59 void *imc_stream_ps[N_ENC_LEVS]; 60 struct { 61 struct stream_frame *frame; /* Latest frame - on stack - be careful. */ 62 enum enc_level enc_level; 63 } imc_last_in; 64 TAILQ_HEAD(, lsquic_packet_in) imc_app_packets; 65 TAILQ_HEAD(, lsquic_packet_out) imc_packets_out; 66 packno_set_t imc_sent_packnos; 67 packno_set_t imc_recvd_packnos[N_PNS]; 68 packno_set_t imc_acked_packnos[N_PNS]; 69 lsquic_time_t imc_largest_recvd[N_PNS]; 70 struct lsquic_rtt_stats imc_rtt_stats; 71 unsigned imc_error_code; 72 unsigned imc_bytes_in; 73 unsigned imc_bytes_out; 74 unsigned char imc_next_packno; 75 unsigned char imc_hsk_count; 76 /* We don't send more than eight in the first flight, and so it's OK to 77 * use uint8_t. This value is also used as a boolean: when ECN black 78 * hole is detected, it is set to zero to indicate that black hole 79 * detection is no longer active. 80 */ 81 uint8_t imc_ecn_packnos; 82 uint8_t imc_ack_exp; 83 uint8_t imc_ecn_counts_in[N_PNS][4]; 84 uint8_t imc_ecn_counts_out[N_PNS][4]; 85 uint8_t imc_incoming_ecn; 86 uint8_t imc_tls_alert; 87 struct network_path imc_path; 88}; 89 90struct lsquic_conn * 91lsquic_mini_conn_ietf_new (struct lsquic_engine_public *, 92 const struct lsquic_packet_in *, 93 enum lsquic_version, int is_ipv4, const struct lsquic_cid *); 94 95int 96lsquic_mini_conn_ietf_ecn_ok (const struct ietf_mini_conn *); 97#endif 98