lsquic_mini_conn_ietf.h revision 5392f7a3
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_flags;
57    struct mini_crypto_stream       imc_streams[N_ENC_LEVS];
58    void                           *imc_stream_ps[N_ENC_LEVS];
59    struct {
60        struct stream_frame    *frame;   /* Latest frame - on stack - be careful. */
61        enum enc_level          enc_level;
62    }                               imc_last_in;
63    TAILQ_HEAD(, lsquic_packet_in)  imc_app_packets;
64    TAILQ_HEAD(, lsquic_packet_out) imc_packets_out;
65    packno_set_t                    imc_sent_packnos;
66    packno_set_t                    imc_recvd_packnos[N_PNS];
67    packno_set_t                    imc_acked_packnos[N_PNS];
68    lsquic_time_t                   imc_largest_recvd[N_PNS];
69    struct lsquic_rtt_stats         imc_rtt_stats;
70    unsigned                        imc_error_code;
71    unsigned                        imc_bytes_in;
72    unsigned                        imc_bytes_out;
73    unsigned char                   imc_next_packno;
74    unsigned char                   imc_hsk_count;
75    uint8_t                         imc_ack_exp;
76    uint8_t                         imc_ecn_counts_in[N_PNS][4];
77    uint8_t                         imc_ecn_counts_out[N_PNS][4];
78    uint8_t                         imc_incoming_ecn;
79    uint8_t                         imc_tls_alert;
80    struct network_path             imc_path;
81};
82
83struct lsquic_conn *
84lsquic_mini_conn_ietf_new (struct lsquic_engine_public *,
85               const struct lsquic_packet_in *,
86               enum lsquic_version, int is_ipv4, const struct lsquic_cid *);
87
88#endif
89