src/event/quic/ngx_event_quic_connection.h - nginx-1.31.9 nginx/ @ 2a3a19c6f

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. ‌#define NGX_QUIC_ENCRYPTION_INITIAL          0
  14. ‌#define NGX_QUIC_ENCRYPTION_EARLY_DATA       1
  15. ‌#define NGX_QUIC_ENCRYPTION_HANDSHAKE        2
  16. ‌#define NGX_QUIC_ENCRYPTION_APPLICATION      3
  17. ‌#define NGX_QUIC_ENCRYPTION_LAST             4

  18. ‌#define NGX_QUIC_SEND_CTX_LAST               (NGX_QUIC_ENCRYPTION_LAST - 1)


  19. ‌typedef struct ngx_quic_connection_s  ngx_quic_connection_t;
  20. ‌typedef struct ngx_quic_server_id_s   ngx_quic_server_id_t;
  21. ‌typedef struct ngx_quic_client_id_s   ngx_quic_client_id_t;
  22. ‌typedef struct ngx_quic_send_ctx_s    ngx_quic_send_ctx_t;
  23. ‌typedef struct ngx_quic_socket_s      ngx_quic_socket_t;
  24. ‌typedef struct ngx_quic_path_s        ngx_quic_path_t;
  25. ‌typedef struct ngx_quic_keys_s        ngx_quic_keys_t;

  26. #if (NGX_QUIC_OPENSSL_COMPAT)
  27. #include <ngx_event_quic_openssl_compat.h>
  28. #endif
  29. #include <ngx_event_quic_transport.h>
  30. #include <ngx_event_quic_protection.h>
  31. #include <ngx_event_quic_frames.h>
  32. #include <ngx_event_quic_migration.h>
  33. #include <ngx_event_quic_connid.h>
  34. #include <ngx_event_quic_streams.h>
  35. #include <ngx_event_quic_ssl.h>
  36. #include <ngx_event_quic_tokens.h>
  37. #include <ngx_event_quic_ack.h>
  38. #include <ngx_event_quic_output.h>
  39. #include <ngx_event_quic_socket.h>
  40. #if (NGX_QUIC_BPF)
  41. #include <ngx_event_quic_bpf.h>
  42. #endif


  43. /* RFC 9002, 6.2.2.  Handshakes and New Paths: kInitialRtt */
  44. ‌#define NGX_QUIC_INITIAL_RTT                 333 /* ms */

  45. ‌#define NGX_QUIC_UNSET_PN                    (uint64_t) -1

  46. /*  0-RTT and 1-RTT data exist in the same packet number space,
  47. *  so we have 3 packet number spaces:
  48. *
  49. *  0 - Initial
  50. *  1 - Handshake
  51. *  2 - 0-RTT and 1-RTT
  52. */
  53. ‌#define ngx_quic_get_send_ctx(qc, level)                                      \
  54.     ((level) == NGX_QUIC_ENCRYPTION_INITIAL) ? &((qc)->send_ctx[0])           \
  55.         : (((level) == NGX_QUIC_ENCRYPTION_HANDSHAKE) ? &((qc)->send_ctx[1])  \
  56.                                                       : &((qc)->send_ctx[2]))

  57. ‌#define ngx_quic_get_connection(c)                                            \
  58.     (((c)->udp) ? (((ngx_quic_socket_t *)((c)->udp))->quic) : NULL)

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

  60. ‌#define ngx_quic_init_rtt(qc)                                                 \
  61.     (qc)->avg_rtt = NGX_QUIC_INITIAL_RTT;                                     \
  62.     (qc)->rttvar = NGX_QUIC_INITIAL_RTT / 2;                                  \
  63.     (qc)->min_rtt = NGX_TIMER_INFINITE;                                       \
  64.     (qc)->first_rtt = NGX_TIMER_INFINITE;                                     \
  65.     (qc)->latest_rtt = 0;


  66. ‌typedef enum {
  67.     NGX_QUIC_PATH_IDLE = 0,
  68.     NGX_QUIC_PATH_VALIDATING,
  69.     NGX_QUIC_PATH_WAITING,
  70.     NGX_QUIC_PATH_MTUD
  71. ‌} ngx_quic_path_state_e;


  72. ‌struct ngx_quic_client_id_s {
  73.     ngx_queue_t                       queue;
  74.     uint64_t                          seqnum;
  75.     size_t                            len;
  76.     u_char                            id[NGX_QUIC_CID_LEN_MAX];
  77.     u_char                            sr_token[NGX_QUIC_SR_TOKEN_LEN];
  78.     ngx_uint_t                        used;  /* unsigned  used:1; */
  79. };


  80. ‌struct ngx_quic_server_id_s {
  81.     uint64_t                          seqnum;
  82.     size_t                            len;
  83.     u_char                            id[NGX_QUIC_CID_LEN_MAX];
  84. };


  85. ‌struct ngx_quic_path_s {
  86.     ngx_queue_t                       queue;
  87.     struct sockaddr                  *sockaddr;
  88.     ngx_sockaddr_t                    sa;
  89.     socklen_t                         socklen;
  90.     ngx_quic_client_id_t             *cid;
  91.     ngx_quic_path_state_e             state;
  92.     ngx_msec_t                        expires;
  93.     ngx_uint_t                        tries;
  94.     ngx_uint_t                        tag;
  95.     size_t                            mtu;
  96.     size_t                            mtud;
  97.     size_t                            max_mtu;
  98.     off_t                             sent;
  99.     off_t                             received;
  100.     u_char                            challenge[2][8];
  101.     uint64_t                          seqnum;
  102.     uint64_t                          mtu_pnum[NGX_QUIC_PATH_RETRIES];
  103.     ngx_str_t                         addr_text;
  104.     u_char                            text[NGX_SOCKADDR_STRLEN];
  105.     unsigned                          validated:1;
  106.     unsigned                          mtu_unvalidated:1;
  107. };


  108. ‌struct ngx_quic_socket_s {
  109.     ngx_udp_connection_t              udp;
  110.     ngx_quic_connection_t            *quic;
  111.     ngx_queue_t                       queue;
  112.     ngx_quic_server_id_t              sid;
  113.     ngx_sockaddr_t                    sockaddr;
  114.     socklen_t                         socklen;
  115.     ngx_uint_t                        used; /* unsigned  used:1; */
  116. };


  117. ‌typedef struct {
  118.     ngx_rbtree_t                      tree;
  119.     ngx_rbtree_node_t                 sentinel;

  120.     ngx_queue_t                       uninitialized;
  121.     ngx_queue_t                       free;

  122.     uint64_t                          sent;
  123.     uint64_t                          recv_offset;
  124.     uint64_t                          recv_window;
  125.     uint64_t                          recv_last;
  126.     uint64_t                          recv_max_data;
  127.     uint64_t                          send_offset;
  128.     uint64_t                          send_max_data;

  129.     uint64_t                          server_max_streams_uni;
  130.     uint64_t                          server_max_streams_bidi;
  131.     uint64_t                          server_streams_uni;
  132.     uint64_t                          server_streams_bidi;

  133.     uint64_t                          client_max_streams_uni;
  134.     uint64_t                          client_max_streams_bidi;
  135.     uint64_t                          client_streams_uni;
  136.     uint64_t                          client_streams_bidi;

  137.     ngx_uint_t                        initialized;
  138.                                                  /* unsigned  initialized:1; */
  139. ‌} ngx_quic_streams_t;


  140. ‌typedef struct {
  141.     size_t                            in_flight;
  142.     size_t                            window;
  143.     size_t                            ssthresh;
  144.     size_t                            w_max;
  145.     size_t                            w_est;
  146.     size_t                            w_prior;
  147.     size_t                            mtu;
  148.     ngx_msec_t                        recovery_start;
  149.     ngx_msec_t                        idle_start;
  150.     ngx_msec_t                        k;
  151.     ngx_uint_t                        idle; /* unsigned  idle:1; */
  152. ‌} ngx_quic_congestion_t;


  153. /*
  154. * RFC 9000, 12.3.  Packet Numbers
  155. *
  156. *  Conceptually, a packet number space is the context in which a packet
  157. *  can be processed and acknowledged.  Initial packets can only be sent
  158. *  with Initial packet protection keys and acknowledged in packets that
  159. *  are also Initial packets.
  160. */
  161. ‌struct ngx_quic_send_ctx_s {
  162.     ngx_uint_t                        level;

  163.     ngx_quic_buffer_t                 crypto;
  164.     uint64_t                          crypto_sent;

  165.     uint64_t                          pnum;        /* to be sent */
  166.     uint64_t                          largest_ack; /* received from peer */
  167.     uint64_t                          largest_pn;  /* received from peer */

  168.     ngx_queue_t                       frames;      /* generated frames */
  169.     ngx_queue_t                       sending;     /* frames assigned to pkt */
  170.     ngx_queue_t                       sent;        /* frames waiting ACK */

  171.     uint64_t                          pending_ack; /* non sent ack-eliciting */
  172.     uint64_t                          largest_range;
  173.     uint64_t                          first_range;
  174.     ngx_msec_t                        largest_received;
  175.     ngx_msec_t                        ack_delay_start;
  176.     ngx_uint_t                        nranges;
  177.     ngx_quic_ack_range_t              ranges[NGX_QUIC_MAX_RANGES];
  178.     ngx_uint_t                        send_ack;
  179. };


  180. ‌struct ngx_quic_connection_s {
  181.     uint32_t                          version;

  182.     ngx_quic_path_t                  *path;

  183.     ngx_queue_t                       sockets;
  184.     ngx_queue_t                       paths;
  185.     ngx_queue_t                       client_ids;
  186.     ngx_queue_t                       free_sockets;
  187.     ngx_queue_t                       free_paths;
  188.     ngx_queue_t                       free_client_ids;

  189.     ngx_uint_t                        nsockets;
  190.     ngx_uint_t                        nclient_ids;
  191.     uint64_t                          max_retired_seqnum;
  192.     uint64_t                          client_seqnum;
  193.     uint64_t                          server_seqnum;
  194.     uint64_t                          path_seqnum;

  195.     ngx_quic_tp_t                     tp;
  196.     ngx_quic_tp_t                     ctp;

  197.     ngx_quic_send_ctx_t               send_ctx[NGX_QUIC_SEND_CTX_LAST];

  198.     ngx_quic_keys_t                  *keys;

  199.     ngx_quic_conf_t                  *conf;

  200.     ngx_event_t                       push;
  201.     ngx_event_t                       pto;
  202.     ngx_event_t                       close;
  203.     ngx_event_t                       path_validation;
  204.     ngx_event_t                       key_update;

  205.     ngx_msec_t                        last_cc;

  206.     ngx_msec_t                        first_rtt;
  207.     ngx_msec_t                        latest_rtt;
  208.     ngx_msec_t                        avg_rtt;
  209.     ngx_msec_t                        min_rtt;
  210.     ngx_msec_t                        rttvar;

  211.     ngx_uint_t                        pto_count;

  212.     ngx_queue_t                       free_frames;
  213.     ngx_buf_t                        *free_bufs;
  214.     ngx_buf_t                        *free_shadow_bufs;

  215.     ngx_uint_t                        nframes;
  216.     ngx_uint_t                        max_frames;
  217. #ifdef NGX_QUIC_DEBUG_ALLOC
  218.     ngx_uint_t                        nbufs;
  219.     ngx_uint_t                        nshadowbufs;
  220. #endif

  221. #if (NGX_QUIC_OPENSSL_COMPAT)
  222.     ngx_quic_compat_t                *compat;
  223. #endif

  224.     ngx_quic_streams_t                streams;
  225.     ngx_quic_congestion_t             congestion;

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

  227.     off_t                             received;

  228.     ngx_uint_t                        error;
  229.     ngx_uint_t                        error_level;
  230.     ngx_uint_t                        error_ftype;
  231.     const char                       *error_reason;

  232.     ngx_uint_t                        shutdown_code;
  233.     const char                       *shutdown_reason;

  234.     unsigned                          error_app:1;
  235.     unsigned                          send_timer_set:1;
  236.     unsigned                          closing:1;
  237.     unsigned                          shutdown:1;
  238.     unsigned                          draining:1;
  239.     unsigned                          key_phase:1;
  240.     unsigned                          validated:1;
  241.     unsigned                          client_tp_done:1;

  242. #if (NGX_QUIC_OPENSSL_API)
  243.     unsigned                          read_level:2;
  244.     unsigned                          write_level:2;
  245. #endif
  246. };


  247. ngx_int_t ngx_quic_apply_transport_params(ngx_connection_t *c,
  248.     ngx_quic_tp_t *ctp);
  249. void ngx_quic_discard_ctx(ngx_connection_t *c, ngx_uint_t level);
  250. void ngx_quic_close_connection(ngx_connection_t *c, ngx_int_t rc);
  251. void ngx_quic_shutdown_quic(ngx_connection_t *c);
  252. void ngx_quic_address_hash(struct sockaddr *sockaddr, socklen_t socklen,
  253.     ngx_uint_t no_port, u_char *salt, size_t saltlen, u_char buf[20]);

  254. #if (NGX_DEBUG)
  255. void ngx_quic_connstate_dbg(ngx_connection_t *c);
  256. #else
  257. ‌#define ngx_quic_connstate_dbg(c)
  258. #endif

  259. #endif /* _NGX_EVENT_QUIC_CONNECTION_H_INCLUDED_ */