lsquic_mini_conn_ietf.h revision 662de5e1
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_CLOSE_RECVD         = 1 << 19,
58    }                               imc_flags;
59    struct mini_crypto_stream       imc_streams[N_ENC_LEVS];
60    void                           *imc_stream_ps[N_ENC_LEVS];
61    struct {
62        struct stream_frame    *frame;   /* Latest frame - on stack - be careful. */
63        enum enc_level          enc_level;
64    }                               imc_last_in;
65    TAILQ_HEAD(, lsquic_packet_in)  imc_app_packets;
66    TAILQ_HEAD(, lsquic_packet_out) imc_packets_out;
67    packno_set_t                    imc_sent_packnos;
68    packno_set_t                    imc_recvd_packnos[N_PNS];
69    packno_set_t                    imc_acked_packnos[N_PNS];
70    lsquic_time_t                   imc_largest_recvd[N_PNS];
71    struct lsquic_rtt_stats         imc_rtt_stats;
72    unsigned                        imc_error_code;
73    unsigned                        imc_bytes_in;
74    unsigned                        imc_bytes_out;
75    unsigned char                   imc_next_packno;
76    unsigned char                   imc_hsk_count;
77    /* We don't send more than eight in the first flight, and so it's OK to
78     * use uint8_t.  This value is also used as a boolean: when ECN black
79     * hole is detected, it is set to zero to indicate that black hole
80     * detection is no longer active.
81     */
82    uint8_t                         imc_ecn_packnos;
83    uint8_t                         imc_ack_exp;
84    uint8_t                         imc_ecn_counts_in[N_PNS][4];
85    uint8_t                         imc_ecn_counts_out[N_PNS][4];
86    uint8_t                         imc_incoming_ecn;
87    uint8_t                         imc_tls_alert;
88    struct network_path             imc_path;
89};
90
91struct lsquic_conn *
92lsquic_mini_conn_ietf_new (struct lsquic_engine_public *,
93               const struct lsquic_packet_in *,
94               enum lsquic_version, int is_ipv4, const struct lsquic_cid *);
95
96int
97lsquic_mini_conn_ietf_ecn_ok (const struct ietf_mini_conn *);
98#endif
99