src/event/quic/ngx_event_quic_connection.h - nginx source code

Data types defined

Macros defined

Source code

  1. /*
  2. * Copyright (C) Nginx, Inc.
  3. */


  4. #ifndef _NGX_EVENT_QUIC_CONNECTION_H_INCLUDED_
  5. #define _NGX_EVENT_QUIC_CONNECTION_H_INCLUDED_


  6. #include <ngx_config.h>
  7. #include <ngx_core.h>
  8. #include <ngx_event.h>


  9. /* #define NGX_QUIC_DEBUG_PACKETS */  /* dump packet contents */
  10. /* #define NGX_QUIC_DEBUG_FRAMES */   /* dump frames contents */
  11. /* #define NGX_QUIC_DEBUG_ALLOC */    /* log frames and bufs alloc */
  12. /* #define NGX_QUIC_DEBUG_CRYPTO */

  13. typedef struct ngx_quic_connection_s  ngx_quic_connection_t;
  14. typedef struct ngx_quic_server_id_s   ngx_quic_server_id_t;
  15. typedef struct ngx_quic_client_id_s   ngx_quic_client_id_t;
  16. typedef struct ngx_quic_send_ctx_s    ngx_quic_send_ctx_t;
  17. typedef struct ngx_quic_socket_s      ngx_quic_socket_t;
  18. typedef struct ngx_quic_path_s        ngx_quic_path_t;
  19. typedef struct ngx_quic_keys_s        ngx_quic_keys_t;

  20. #if (NGX_QUIC_OPENSSL_COMPAT)
  21. #include <ngx_event_quic_openssl_compat.h>
  22. #endif
  23. #include <ngx_event_quic_transport.h>
  24. #include <ngx_event_quic_protection.h>
  25. #include <ngx_event_quic_frames.h>
  26. #include <ngx_event_quic_migration.h>
  27. #include <ngx_event_quic_connid.h>
  28. #include <ngx_event_quic_streams.h>
  29. #include <ngx_event_quic_ssl.h>
  30. #include <ngx_event_quic_tokens.h>
  31. #include <ngx_event_quic_ack.h>
  32. #include <ngx_event_quic_output.h>
  33. #include <ngx_event_quic_socket.h>


  34. /* RFC 9002, 6.2.2.  Handshakes and New Paths: kInitialRtt */
  35. #define NGX_QUIC_INITIAL_RTT                 333 /* ms */

  36. #define NGX_QUIC_UNSET_PN                    (uint64_t) -1

  37. #define NGX_QUIC_SEND_CTX_LAST               (NGX_QUIC_ENCRYPTION_LAST - 1)

  38. /*  0-RTT and 1-RTT data exist in the same packet number space,
  39. *  so we have 3 packet number spaces:
  40. *
  41. *  0 - Initial
  42. *  1 - Handshake
  43. *  2 - 0-RTT and 1-RTT
  44. */
  45. #define ngx_quic_get_send_ctx(qc, level)                                      \
  46.     ((level) == ssl_encryption_initial) ? &((qc)->send_ctx[0])                \
  47.         : (((level) == ssl_encryption_handshake) ? &((qc)->send_ctx[1])       \
  48.                                                  : &((qc)->send_ctx[2]))

  49. #define ngx_quic_get_connection(c)                                            \
  50.     (((c)->udp) ? (((ngx_quic_socket_t *)((c)->udp))->quic) : NULL)

  51. #define ngx_quic_get_socket(c)               ((ngx_quic_socket_t *)((c)->udp))

  52. #define ngx_quic_init_rtt(qc)                                                 \
  53.     (qc)->avg_rtt = NGX_QUIC_INITIAL_RTT;                                     \
  54.     (qc)->rttvar = NGX_QUIC_INITIAL_RTT / 2;                                  \
  55.     (qc)->min_rtt = NGX_TIMER_INFINITE;                                       \
  56.     (qc)->first_rtt = NGX_TIMER_INFINITE;                                     \
  57.     (qc)->latest_rtt = 0;


  58. typedef enum {
  59.     NGX_QUIC_PATH_IDLE = 0,
  60.     NGX_QUIC_PATH_VALIDATING,
  61.     NGX_QUIC_PATH_WAITING,
  62.     NGX_QUIC_PATH_MTUD
  63. } ngx_quic_path_state_e;


  64. struct ngx_quic_client_id_s {
  65.     ngx_queue_t                       queue;
  66.     uint64_t                          seqnum;
  67.     size_t                            len;
  68.     u_char                            id[NGX_QUIC_CID_LEN_MAX];
  69.     u_char                            sr_token[NGX_QUIC_SR_TOKEN_LEN];
  70.     ngx_uint_t                        used;  /* unsigned  used:1; */
  71. };


  72. struct ngx_quic_server_id_s {
  73.     uint64_t                          seqnum;
  74.     size_t                            len;
  75.     u_char                            id[NGX_QUIC_CID_LEN_MAX];
  76. };


  77. struct ngx_quic_path_s {
  78.     ngx_queue_t                       queue;
  79.     struct sockaddr                  *sockaddr;
  80.     ngx_sockaddr_t                    sa;
  81.     socklen_t                         socklen;
  82.     ngx_quic_client_id_t             *cid;
  83.     ngx_quic_path_state_e             state;
  84.     ngx_msec_t                        expires;
  85.     ngx_uint_t                        tries;
  86.     ngx_uint_t                        tag;
  87.     size_t                            mtu;
  88.     size_t                            mtud;
  89.     size_t                            max_mtu;
  90.     off_t                             sent;
  91.     off_t                             received;
  92.     u_char                            challenge[2][8];
  93.     uint64_t                          seqnum;
  94.     uint64_t                          mtu_pnum[NGX_QUIC_PATH_RETRIES];
  95.     ngx_str_t                         addr_text;
  96.     u_char                            text[NGX_SOCKADDR_STRLEN];
  97.     unsigned                          validated:1;
  98.     unsigned                          mtu_unvalidated:1;
  99. };


  100. struct ngx_quic_socket_s {
  101.     ngx_udp_connection_t              udp;
  102.     ngx_quic_connection_t            *quic;
  103.     ngx_queue_t                       queue;
  104.     ngx_quic_server_id_t              sid;
  105.     ngx_sockaddr_t                    sockaddr;
  106.     socklen_t                         socklen;
  107.     ngx_uint_t                        used; /* unsigned  used:1; */
  108. };


  109. typedef struct {
  110.     ngx_rbtree_t                      tree;
  111.     ngx_rbtree_node_t                 sentinel;

  112.     ngx_queue_t                       uninitialized;
  113.     ngx_queue_t                       free;

  114.     uint64_t                          sent;
  115.     uint64_t                          recv_offset;
  116.     uint64_t                          recv_window;
  117.     uint64_t                          recv_last;
  118.     uint64_t                          recv_max_data;
  119.     uint64_t                          send_offset;
  120.     uint64_t                          send_max_data;

  121.     uint64_t                          server_max_streams_uni;
  122.     uint64_t                          server_max_streams_bidi;
  123.     uint64_t                          server_streams_uni;
  124.     uint64_t                          server_streams_bidi;

  125.     uint64_t                          client_max_streams_uni;
  126.     uint64_t                          client_max_streams_bidi;
  127.     uint64_t                          client_streams_uni;
  128.     uint64_t                          client_streams_bidi;

  129.     ngx_uint_t                        initialized;
  130.                                                  /* unsigned  initialized:1; */
  131. } ngx_quic_streams_t;


  132. typedef struct {
  133.     size_t                            in_flight;
  134.     size_t                            window;
  135.     size_t                            ssthresh;
  136.     ngx_msec_t                        recovery_start;
  137. } ngx_quic_congestion_t;


  138. /*
  139. * RFC 9000, 12.3.  Packet Numbers
  140. *
  141. *  Conceptually, a packet number space is the context in which a packet
  142. *  can be processed and acknowledged.  Initial packets can only be sent
  143. *  with Initial packet protection keys and acknowledged in packets that
  144. *  are also Initial packets.
  145. */
  146. struct ngx_quic_send_ctx_s {
  147.     enum ssl_encryption_level_t       level;

  148.     ngx_quic_buffer_t                 crypto;
  149.     uint64_t                          crypto_sent;

  150.     uint64_t                          pnum;        /* to be sent */
  151.     uint64_t                          largest_ack; /* received from peer */
  152.     uint64_t                          largest_pn;  /* received from peer */

  153.     ngx_queue_t                       frames;      /* generated frames */
  154.     ngx_queue_t                       sending;     /* frames assigned to pkt */
  155.     ngx_queue_t                       sent;        /* frames waiting ACK */

  156.     uint64_t                          pending_ack; /* non sent ack-eliciting */
  157.     uint64_t                          largest_range;
  158.     uint64_t                          first_range;
  159.     ngx_msec_t                        largest_received;
  160.     ngx_msec_t                        ack_delay_start;
  161.     ngx_uint_t                        nranges;
  162.     ngx_quic_ack_range_t              ranges[NGX_QUIC_MAX_RANGES];
  163.     ngx_uint_t                        send_ack;
  164. };


  165. struct ngx_quic_connection_s {
  166.     uint32_t                          version;

  167.     ngx_quic_path_t                  *path;

  168.     ngx_queue_t                       sockets;
  169.     ngx_queue_t                       paths;
  170.     ngx_queue_t                       client_ids;
  171.     ngx_queue_t                       free_sockets;
  172.     ngx_queue_t                       free_paths;
  173.     ngx_queue_t                       free_client_ids;

  174.     ngx_uint_t                        nsockets;
  175.     ngx_uint_t                        nclient_ids;
  176.     uint64_t                          max_retired_seqnum;
  177.     uint64_t                          client_seqnum;
  178.     uint64_t                          server_seqnum;
  179.     uint64_t                          path_seqnum;

  180.     ngx_quic_tp_t                     tp;
  181.     ngx_quic_tp_t                     ctp;

  182.     ngx_quic_send_ctx_t               send_ctx[NGX_QUIC_SEND_CTX_LAST];

  183.     ngx_quic_keys_t                  *keys;

  184.     ngx_quic_conf_t                  *conf;

  185.     ngx_event_t                       push;
  186.     ngx_event_t                       pto;
  187.     ngx_event_t                       close;
  188.     ngx_event_t                       path_validation;
  189.     ngx_event_t                       key_update;

  190.     ngx_msec_t                        last_cc;

  191.     ngx_msec_t                        first_rtt;
  192.     ngx_msec_t                        latest_rtt;
  193.     ngx_msec_t                        avg_rtt;
  194.     ngx_msec_t                        min_rtt;
  195.     ngx_msec_t                        rttvar;

  196.     ngx_uint_t                        pto_count;

  197.     ngx_queue_t                       free_frames;
  198.     ngx_buf_t                        *free_bufs;
  199.     ngx_buf_t                        *free_shadow_bufs;

  200.     ngx_uint_t                        nframes;
  201. #ifdef NGX_QUIC_DEBUG_ALLOC
  202.     ngx_uint_t                        nbufs;
  203.     ngx_uint_t                        nshadowbufs;
  204. #endif

  205. #if (NGX_QUIC_OPENSSL_COMPAT)
  206.     ngx_quic_compat_t                *compat;
  207. #endif

  208.     ngx_quic_streams_t                streams;
  209.     ngx_quic_congestion_t             congestion;

  210.     uint64_t                          rst_pnum;    /* first on validated path */

  211.     off_t                             received;

  212.     ngx_uint_t                        error;
  213.     enum ssl_encryption_level_t       error_level;
  214.     ngx_uint_t                        error_ftype;
  215.     const char                       *error_reason;

  216.     ngx_uint_t                        shutdown_code;
  217.     const char                       *shutdown_reason;

  218.     unsigned                          error_app:1;
  219.     unsigned                          send_timer_set:1;
  220.     unsigned                          closing:1;
  221.     unsigned                          shutdown:1;
  222.     unsigned                          draining:1;
  223.     unsigned                          key_phase:1;
  224.     unsigned                          validated:1;
  225.     unsigned                          client_tp_done:1;
  226. };


  227. ngx_int_t ngx_quic_apply_transport_params(ngx_connection_t *c,
  228.     ngx_quic_tp_t *ctp);
  229. void ngx_quic_discard_ctx(ngx_connection_t *c,
  230.     enum ssl_encryption_level_t level);
  231. void ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc);
  232. void ngx_quic_shutdown_quic(ngx_connection_t *c);

  233. #if (NGX_DEBUG)
  234. void ngx_quic_connstate_dbg(ngx_connection_t *c);
  235. #else
  236. #define ngx_quic_connstate_dbg(c)
  237. #endif

  238. #endif /* _NGX_EVENT_QUIC_CONNECTION_H_INCLUDED_ */