quic_txp.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. /*
  2. * Copyright 2022-2025 The OpenSSL Project Authors. All Rights Reserved.
  3. *
  4. * Licensed under the Apache License 2.0 (the "License"). You may not use
  5. * this file except in compliance with the License. You can obtain a copy
  6. * in the file LICENSE in the source distribution or at
  7. * https://www.openssl.org/source/license.html
  8. */
  9. #ifndef OSSL_QUIC_TXP_H
  10. # define OSSL_QUIC_TXP_H
  11. # include <openssl/ssl.h>
  12. # include "internal/quic_types.h"
  13. # include "internal/quic_predef.h"
  14. # include "internal/quic_record_tx.h"
  15. # include "internal/quic_cfq.h"
  16. # include "internal/quic_txpim.h"
  17. # include "internal/quic_stream.h"
  18. # include "internal/quic_stream_map.h"
  19. # include "internal/quic_fc.h"
  20. # include "internal/bio_addr.h"
  21. # include "internal/time.h"
  22. # include "internal/qlog.h"
  23. # ifndef OPENSSL_NO_QUIC
  24. /*
  25. * QUIC TX Packetiser
  26. * ==================
  27. */
  28. typedef struct ossl_quic_tx_packetiser_args_st {
  29. /* Configuration Settings */
  30. QUIC_CONN_ID cur_scid; /* Current Source Connection ID we use. */
  31. QUIC_CONN_ID cur_dcid; /* Current Destination Connection ID we use. */
  32. BIO_ADDR peer; /* Current destination L4 address we use. */
  33. uint32_t ack_delay_exponent; /* ACK delay exponent used when encoding. */
  34. /* Injected Dependencies */
  35. OSSL_QTX *qtx; /* QUIC Record Layer TX we are using */
  36. QUIC_TXPIM *txpim; /* QUIC TX'd Packet Information Manager */
  37. QUIC_CFQ *cfq; /* QUIC Control Frame Queue */
  38. OSSL_ACKM *ackm; /* QUIC Acknowledgement Manager */
  39. QUIC_STREAM_MAP *qsm; /* QUIC Streams Map */
  40. QUIC_TXFC *conn_txfc; /* QUIC Connection-Level TX Flow Controller */
  41. QUIC_RXFC *conn_rxfc; /* QUIC Connection-Level RX Flow Controller */
  42. QUIC_RXFC *max_streams_bidi_rxfc; /* QUIC RXFC for MAX_STREAMS generation */
  43. QUIC_RXFC *max_streams_uni_rxfc;
  44. const OSSL_CC_METHOD *cc_method; /* QUIC Congestion Controller */
  45. OSSL_CC_DATA *cc_data; /* QUIC Congestion Controller Instance */
  46. OSSL_TIME (*now)(void *arg); /* Callback to get current time. */
  47. void *now_arg;
  48. QLOG *(*get_qlog_cb)(void *arg); /* Optional QLOG retrieval func */
  49. void *get_qlog_cb_arg;
  50. uint32_t protocol_version; /* The protocol version to try negotiating */
  51. /*
  52. * Injected dependencies - crypto streams.
  53. *
  54. * Note: There is no crypto stream for the 0-RTT EL.
  55. * crypto[QUIC_PN_SPACE_APP] is the 1-RTT crypto stream.
  56. */
  57. QUIC_SSTREAM *crypto[QUIC_PN_SPACE_NUM];
  58. } OSSL_QUIC_TX_PACKETISER_ARGS;
  59. OSSL_QUIC_TX_PACKETISER *ossl_quic_tx_packetiser_new(const OSSL_QUIC_TX_PACKETISER_ARGS *args);
  60. void ossl_quic_tx_packetiser_set_validated(OSSL_QUIC_TX_PACKETISER *txp);
  61. void ossl_quic_tx_packetiser_add_unvalidated_credit(OSSL_QUIC_TX_PACKETISER *txp,
  62. size_t credit);
  63. void ossl_quic_tx_packetiser_consume_unvalidated_credit(OSSL_QUIC_TX_PACKETISER *txp,
  64. size_t credit);
  65. int ossl_quic_tx_packetiser_check_unvalidated_credit(OSSL_QUIC_TX_PACKETISER *txp,
  66. size_t req_credit);
  67. typedef void (ossl_quic_initial_token_free_fn)(const unsigned char *buf,
  68. size_t buf_len, void *arg);
  69. void ossl_quic_tx_packetiser_free(OSSL_QUIC_TX_PACKETISER *txp);
  70. /*
  71. * When in the closing state we need to maintain a count of received bytes
  72. * so that we can limit the number of close connection frames we send.
  73. * Refer RFC 9000 s. 10.2.1 Closing Connection State.
  74. */
  75. void ossl_quic_tx_packetiser_record_received_closing_bytes(
  76. OSSL_QUIC_TX_PACKETISER *txp, size_t n);
  77. /*
  78. * Generates a datagram by polling the various ELs to determine if they want to
  79. * generate any frames, and generating a datagram which coalesces packets for
  80. * any ELs which do.
  81. *
  82. * Returns 0 on failure (e.g. allocation error or other errors), 1 otherwise.
  83. *
  84. * *status is filled with status information about the generated packet.
  85. * It is always filled even in case of failure. In particular, packets can be
  86. * sent even if failure is later returned.
  87. * See QUIC_TXP_STATUS for details.
  88. */
  89. typedef struct quic_txp_status_st {
  90. int sent_ack_eliciting; /* Was an ACK-eliciting packet sent? */
  91. int sent_handshake; /* Was a Handshake packet sent? */
  92. size_t sent_pkt; /* Number of packets sent (0 if nothing was sent) */
  93. } QUIC_TXP_STATUS;
  94. int ossl_quic_tx_packetiser_generate(OSSL_QUIC_TX_PACKETISER *txp,
  95. QUIC_TXP_STATUS *status);
  96. /*
  97. * Returns a deadline after which a call to ossl_quic_tx_packetiser_generate()
  98. * might succeed even if it did not previously. This may return
  99. * ossl_time_infinite() if there is no such deadline currently applicable. It
  100. * returns ossl_time_zero() if there is (potentially) more data to be generated
  101. * immediately. The value returned is liable to change after any call to
  102. * ossl_quic_tx_packetiser_generate() (or after ACKM or CC state changes). Note
  103. * that ossl_quic_tx_packetiser_generate() can also start to succeed for other
  104. * non-chronological reasons, such as changes to send stream buffers, etc.
  105. */
  106. OSSL_TIME ossl_quic_tx_packetiser_get_deadline(OSSL_QUIC_TX_PACKETISER *txp);
  107. /*
  108. * Set the token used in Initial packets. The callback is called when the buffer
  109. * is no longer needed; for example, when the TXP is freed or when this function
  110. * is called again with a new buffer. Fails returning 0 if the token is too big
  111. * to ever be reasonably encapsulated in an outgoing packet based on our current
  112. * understanding of our PMTU.
  113. */
  114. int ossl_quic_tx_packetiser_set_initial_token(OSSL_QUIC_TX_PACKETISER *txp,
  115. const unsigned char *token,
  116. size_t token_len,
  117. ossl_quic_initial_token_free_fn *free_cb,
  118. void *free_cb_arg);
  119. /*
  120. * Set the protocol version used when generating packets. Currently should
  121. * only ever be set to QUIC_VERSION_1
  122. */
  123. int ossl_quic_tx_packetiser_set_protocol_version(OSSL_QUIC_TX_PACKETISER *txp,
  124. uint32_t protocol_version);
  125. /* Change the DCID the TXP uses to send outgoing packets. */
  126. int ossl_quic_tx_packetiser_set_cur_dcid(OSSL_QUIC_TX_PACKETISER *txp,
  127. const QUIC_CONN_ID *dcid);
  128. /* Change the SCID the TXP uses to send outgoing (long) packets. */
  129. int ossl_quic_tx_packetiser_set_cur_scid(OSSL_QUIC_TX_PACKETISER *txp,
  130. const QUIC_CONN_ID *scid);
  131. /*
  132. * Change the destination L4 address the TXP uses to send datagrams. Specify
  133. * NULL (or AF_UNSPEC) to disable use of addressed mode.
  134. */
  135. int ossl_quic_tx_packetiser_set_peer(OSSL_QUIC_TX_PACKETISER *txp,
  136. const BIO_ADDR *peer);
  137. /*
  138. * Change the QLOG instance retrieval function in use after instantiation.
  139. */
  140. void ossl_quic_tx_packetiser_set_qlog_cb(OSSL_QUIC_TX_PACKETISER *txp,
  141. QLOG *(*get_qlog_cb)(void *arg),
  142. void *get_qlog_cb_arg);
  143. /*
  144. * Inform the TX packetiser that an EL has been discarded. Idempotent.
  145. *
  146. * This does not inform the QTX as well; the caller must also inform the QTX.
  147. *
  148. * The TXP will no longer reference the crypto[enc_level] QUIC_SSTREAM which was
  149. * provided in the TXP arguments. However, it is the callers responsibility to
  150. * free that QUIC_SSTREAM if desired.
  151. */
  152. int ossl_quic_tx_packetiser_discard_enc_level(OSSL_QUIC_TX_PACKETISER *txp,
  153. uint32_t enc_level);
  154. /*
  155. * Informs the TX packetiser that the handshake is complete. The TX packetiser
  156. * will not send 1-RTT application data until the handshake is complete,
  157. * as the authenticity of the peer is not confirmed until the handshake
  158. * complete event occurs.
  159. */
  160. void ossl_quic_tx_packetiser_notify_handshake_complete(OSSL_QUIC_TX_PACKETISER *txp);
  161. /* Asks the TXP to generate a HANDSHAKE_DONE frame in the next 1-RTT packet. */
  162. void ossl_quic_tx_packetiser_schedule_handshake_done(OSSL_QUIC_TX_PACKETISER *txp);
  163. /* Asks the TXP to ensure the next packet in the given PN space is ACK-eliciting. */
  164. void ossl_quic_tx_packetiser_schedule_ack_eliciting(OSSL_QUIC_TX_PACKETISER *txp,
  165. uint32_t pn_space);
  166. /*
  167. * Asks the TXP to ensure an ACK is put in the next packet in the given PN
  168. * space.
  169. */
  170. void ossl_quic_tx_packetiser_schedule_ack(OSSL_QUIC_TX_PACKETISER *txp,
  171. uint32_t pn_space);
  172. /*
  173. * Schedules a connection close. *f and f->reason are copied. This operation is
  174. * irreversible and causes all further packets generated by the TXP to contain a
  175. * CONNECTION_CLOSE frame. This function fails if it has already been called
  176. * successfully; the information in *f cannot be changed after the first
  177. * successful call to this function.
  178. */
  179. int ossl_quic_tx_packetiser_schedule_conn_close(OSSL_QUIC_TX_PACKETISER *txp,
  180. const OSSL_QUIC_FRAME_CONN_CLOSE *f);
  181. /* Setters for the msg_callback and msg_callback_arg */
  182. void ossl_quic_tx_packetiser_set_msg_callback(OSSL_QUIC_TX_PACKETISER *txp,
  183. ossl_msg_cb msg_callback,
  184. SSL *msg_callback_ssl);
  185. void ossl_quic_tx_packetiser_set_msg_callback_arg(OSSL_QUIC_TX_PACKETISER *txp,
  186. void *msg_callback_arg);
  187. /*
  188. * Determines the next PN which will be used for a given PN space.
  189. */
  190. QUIC_PN ossl_quic_tx_packetiser_get_next_pn(OSSL_QUIC_TX_PACKETISER *txp,
  191. uint32_t pn_space);
  192. /*
  193. * Sets a callback which is called whenever TXP sends an ACK frame. The callee
  194. * must not modify the ACK frame data. Can be used to snoop on PNs being ACKed.
  195. */
  196. void ossl_quic_tx_packetiser_set_ack_tx_cb(OSSL_QUIC_TX_PACKETISER *txp,
  197. void (*cb)(const OSSL_QUIC_FRAME_ACK *ack,
  198. uint32_t pn_space,
  199. void *arg),
  200. void *cb_arg);
  201. # endif
  202. #endif