quic_channel.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. /*
  2. * Copyright 2022-2024 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_CHANNEL_H
  10. # define OSSL_QUIC_CHANNEL_H
  11. # include <openssl/ssl.h>
  12. # include "internal/quic_types.h"
  13. # include "internal/quic_record_tx.h"
  14. # include "internal/quic_wire.h"
  15. # include "internal/quic_predef.h"
  16. # include "internal/qlog.h"
  17. # include "internal/time.h"
  18. # include "internal/thread.h"
  19. # ifndef OPENSSL_NO_QUIC
  20. /*
  21. * QUIC Channel
  22. * ============
  23. *
  24. * A QUIC channel (QUIC_CHANNEL) is an object which binds together all of the
  25. * various pieces of QUIC into a single top-level object, and handles connection
  26. * state which is not specific to the client or server roles. In particular, it
  27. * is strictly separated from the libssl front end I/O API personality layer,
  28. * and is not an SSL object.
  29. *
  30. * The name QUIC_CHANNEL is chosen because QUIC_CONNECTION is already in use,
  31. * but functionally these relate to the same thing (a QUIC connection). The use
  32. * of two separate objects ensures clean separation between the API personality
  33. * layer and common code for handling connections, and between the functionality
  34. * which is specific to clients and which is specific to servers, and the
  35. * functionality which is common to both.
  36. *
  37. * The API personality layer provides SSL objects (e.g. a QUIC_CONNECTION) which
  38. * consume a QUIC channel and implement a specific public API. Things which are
  39. * handled by the API personality layer include emulation of blocking semantics,
  40. * handling of SSL object mode flags like non-partial write mode, etc.
  41. *
  42. * Where the QUIC_CHANNEL is used in a server role, there is one QUIC_CHANNEL
  43. * per connection. In the future a QUIC Channel Manager will probably be defined
  44. * to handle ownership of resources which are shared between connections (e.g.
  45. * demuxers). Since we only use server-side functionality for dummy test servers
  46. * for now, which only need to handle one connection at a time, this is not
  47. * currently modelled.
  48. *
  49. * Synchronisation
  50. * ---------------
  51. *
  52. * To support thread assisted mode, QUIC_CHANNEL can be used by multiple
  53. * threads. **It is the caller's responsibility to ensure that the QUIC_CHANNEL
  54. * is only accessed (whether via its methods or via direct access to its state)
  55. * while the channel mutex is held**, except for methods explicitly marked as
  56. * not requiring prior locking. This is an unchecked precondition.
  57. *
  58. * The instantiator of the channel is responsible for providing a suitable
  59. * mutex which then serves as the channel mutex; see QUIC_CHANNEL_ARGS.
  60. */
  61. /*
  62. * The function does not acquire the channel mutex and assumes it is already
  63. * held by the calling thread.
  64. *
  65. * Any function tagged with this has the following precondition:
  66. *
  67. * Precondition: must hold channel mutex (unchecked)
  68. */
  69. # define QUIC_NEEDS_LOCK
  70. /*
  71. * The function acquires the channel mutex and releases it before returning in
  72. * all circumstances.
  73. *
  74. * Any function tagged with this has the following precondition and
  75. * postcondition:
  76. *
  77. * Precondition: must not hold channel mutex (unchecked)
  78. * Postcondition: channel mutex is not held (by calling thread)
  79. */
  80. # define QUIC_TAKES_LOCK
  81. /*
  82. * The function acquires the channel mutex and leaves it acquired
  83. * when returning success.
  84. *
  85. * Any function tagged with this has the following precondition and
  86. * postcondition:
  87. *
  88. * Precondition: must not hold channel mutex (unchecked)
  89. * Postcondition: channel mutex is held by calling thread
  90. * or function returned failure
  91. */
  92. # define QUIC_ACQUIRES_LOCK
  93. # define QUIC_TODO_LOCK
  94. # define QUIC_CHANNEL_STATE_IDLE 0
  95. # define QUIC_CHANNEL_STATE_ACTIVE 1
  96. # define QUIC_CHANNEL_STATE_TERMINATING_CLOSING 2
  97. # define QUIC_CHANNEL_STATE_TERMINATING_DRAINING 3
  98. # define QUIC_CHANNEL_STATE_TERMINATED 4
  99. typedef struct quic_channel_args_st {
  100. /*
  101. * The QUIC_PORT which the channel is to belong to. The lifetime of the
  102. * QUIC_PORT must exceed that of the created channel.
  103. */
  104. QUIC_PORT *port;
  105. /* LCIDM to register LCIDs with. */
  106. QUIC_LCIDM *lcidm;
  107. /* SRTM to register SRTs with. */
  108. QUIC_SRTM *srtm;
  109. int is_server;
  110. SSL *tls;
  111. /* Whether to use qlog. */
  112. int use_qlog;
  113. /* Title to use for the qlog session, or NULL. */
  114. const char *qlog_title;
  115. } QUIC_CHANNEL_ARGS;
  116. /* Represents the cause for a connection's termination. */
  117. typedef struct quic_terminate_cause_st {
  118. /*
  119. * If we are in a TERMINATING or TERMINATED state, this is the error code
  120. * associated with the error. This field is valid iff we are in the
  121. * TERMINATING or TERMINATED states.
  122. */
  123. uint64_t error_code;
  124. /*
  125. * If terminate_app is set and this is nonzero, this is the frame type which
  126. * caused the connection to be terminated.
  127. */
  128. uint64_t frame_type;
  129. /*
  130. * Optional reason string. When calling ossl_quic_channel_local_close, if a
  131. * reason string pointer is passed, it is copied and stored inside
  132. * QUIC_CHANNEL for the remainder of the lifetime of the channel object.
  133. * Thus the string pointed to by this value, if non-NULL, is valid for the
  134. * lifetime of the QUIC_CHANNEL object.
  135. */
  136. const char *reason;
  137. /*
  138. * Length of reason in bytes. The reason is supposed to contain a UTF-8
  139. * string but may be arbitrary data if the reason came from the network.
  140. */
  141. size_t reason_len;
  142. /* Is this error code in the transport (0) or application (1) space? */
  143. unsigned int app : 1;
  144. /*
  145. * If set, the cause of the termination is a received CONNECTION_CLOSE
  146. * frame. Otherwise, we decided to terminate ourselves and sent a
  147. * CONNECTION_CLOSE frame (regardless of whether the peer later also sends
  148. * one).
  149. */
  150. unsigned int remote : 1;
  151. } QUIC_TERMINATE_CAUSE;
  152. /*
  153. * Create a new QUIC channel using the given arguments. The argument structure
  154. * does not need to remain allocated. Returns NULL on failure.
  155. *
  156. * Only QUIC_PORT should use this function.
  157. */
  158. QUIC_CHANNEL *ossl_quic_channel_new(const QUIC_CHANNEL_ARGS *args);
  159. /* No-op if ch is NULL. */
  160. void ossl_quic_channel_free(QUIC_CHANNEL *ch);
  161. /* Set mutator callbacks for test framework support */
  162. int ossl_quic_channel_set_mutator(QUIC_CHANNEL *ch,
  163. ossl_mutate_packet_cb mutatecb,
  164. ossl_finish_mutate_cb finishmutatecb,
  165. void *mutatearg);
  166. /*
  167. * Connection Lifecycle Events
  168. * ===========================
  169. *
  170. * Various events that can be raised on the channel by other parts of the QUIC
  171. * implementation. Some of these are suitable for general use by any part of the
  172. * code (e.g. ossl_quic_channel_raise_protocol_error), others are for very
  173. * specific use by particular components only (e.g.
  174. * ossl_quic_channel_on_handshake_confirmed).
  175. */
  176. /*
  177. * To be used by a QUIC connection. Starts the channel. For a client-mode
  178. * channel, this starts sending the first handshake layer message, etc. Can only
  179. * be called in the idle state; successive calls are ignored.
  180. */
  181. int ossl_quic_channel_start(QUIC_CHANNEL *ch);
  182. /* Start a locally initiated connection shutdown. */
  183. void ossl_quic_channel_local_close(QUIC_CHANNEL *ch, uint64_t app_error_code,
  184. const char *app_reason);
  185. /*
  186. * Called when the handshake is confirmed.
  187. */
  188. int ossl_quic_channel_on_handshake_confirmed(QUIC_CHANNEL *ch);
  189. /*
  190. * Raises a protocol error. This is intended to be the universal call suitable
  191. * for handling of all peer-triggered protocol violations or errors detected by
  192. * us. We specify a QUIC transport-scope error code and optional frame type
  193. * which was responsible. If a frame type is not applicable, specify zero. The
  194. * reason string is not currently handled, but should be a string of static
  195. * storage duration. If the connection has already terminated due to a previous
  196. * protocol error, this is a no-op; first error wins.
  197. *
  198. * Usually the ossl_quic_channel_raise_protocol_error() function should be used.
  199. * The ossl_quic_channel_raise_protocol_error_loc() function can be used
  200. * directly for passing through existing call site information from an existing
  201. * error.
  202. */
  203. void ossl_quic_channel_raise_protocol_error_loc(QUIC_CHANNEL *ch,
  204. uint64_t error_code,
  205. uint64_t frame_type,
  206. const char *reason,
  207. ERR_STATE *err_state,
  208. const char *src_file,
  209. int src_line,
  210. const char *src_func);
  211. #define ossl_quic_channel_raise_protocol_error(ch, error_code, frame_type, reason) \
  212. ossl_quic_channel_raise_protocol_error_loc((ch), (error_code), \
  213. (frame_type), \
  214. (reason), \
  215. NULL, \
  216. OPENSSL_FILE, \
  217. OPENSSL_LINE, \
  218. OPENSSL_FUNC)
  219. #define ossl_quic_channel_raise_protocol_error_state(ch, error_code, frame_type, reason, state) \
  220. ossl_quic_channel_raise_protocol_error_loc((ch), (error_code), \
  221. (frame_type), \
  222. (reason), \
  223. (state), \
  224. OPENSSL_FILE, \
  225. OPENSSL_LINE, \
  226. OPENSSL_FUNC)
  227. /*
  228. * Returns 1 if permanent net error was detected on the QUIC_CHANNEL,
  229. * 0 otherwise.
  230. */
  231. int ossl_quic_channel_net_error(QUIC_CHANNEL *ch);
  232. /* Restore saved error state (best effort) */
  233. void ossl_quic_channel_restore_err_state(QUIC_CHANNEL *ch);
  234. /* For RXDP use. */
  235. void ossl_quic_channel_on_remote_conn_close(QUIC_CHANNEL *ch,
  236. OSSL_QUIC_FRAME_CONN_CLOSE *f);
  237. void ossl_quic_channel_on_new_conn_id(QUIC_CHANNEL *ch,
  238. OSSL_QUIC_FRAME_NEW_CONN_ID *f);
  239. /* Temporarily exposed during QUIC_PORT transition. */
  240. int ossl_quic_channel_on_new_conn(QUIC_CHANNEL *ch, const BIO_ADDR *peer,
  241. const QUIC_CONN_ID *peer_scid,
  242. const QUIC_CONN_ID *peer_dcid);
  243. /* For use by QUIC_PORT. You should not need to call this directly. */
  244. void ossl_quic_channel_subtick(QUIC_CHANNEL *ch, QUIC_TICK_RESULT *r,
  245. uint32_t flags);
  246. /* For use by QUIC_PORT only. */
  247. void ossl_quic_channel_raise_net_error(QUIC_CHANNEL *ch);
  248. /* For use by QUIC_PORT only. */
  249. void ossl_quic_channel_on_stateless_reset(QUIC_CHANNEL *ch);
  250. void ossl_quic_channel_inject(QUIC_CHANNEL *ch, QUIC_URXE *e);
  251. /*
  252. * Queries and Accessors
  253. * =====================
  254. */
  255. /* Gets the reactor which can be used to tick/poll on the channel. */
  256. QUIC_REACTOR *ossl_quic_channel_get_reactor(QUIC_CHANNEL *ch);
  257. /* Gets the QSM used with the channel. */
  258. QUIC_STREAM_MAP *ossl_quic_channel_get_qsm(QUIC_CHANNEL *ch);
  259. /* Gets the statistics manager used with the channel. */
  260. OSSL_STATM *ossl_quic_channel_get_statm(QUIC_CHANNEL *ch);
  261. /*
  262. * Gets/sets the current peer address. Generally this should be used before
  263. * starting a channel in client mode.
  264. */
  265. int ossl_quic_channel_get_peer_addr(QUIC_CHANNEL *ch, BIO_ADDR *peer_addr);
  266. int ossl_quic_channel_set_peer_addr(QUIC_CHANNEL *ch, const BIO_ADDR *peer_addr);
  267. /*
  268. * Returns an existing stream by stream ID. Returns NULL if the stream does not
  269. * exist.
  270. */
  271. QUIC_STREAM *ossl_quic_channel_get_stream_by_id(QUIC_CHANNEL *ch,
  272. uint64_t stream_id);
  273. /* Returns 1 if channel is terminating or terminated. */
  274. int ossl_quic_channel_is_term_any(const QUIC_CHANNEL *ch);
  275. const QUIC_TERMINATE_CAUSE *
  276. ossl_quic_channel_get_terminate_cause(const QUIC_CHANNEL *ch);
  277. int ossl_quic_channel_is_closing(const QUIC_CHANNEL *ch);
  278. int ossl_quic_channel_is_terminated(const QUIC_CHANNEL *ch);
  279. int ossl_quic_channel_is_active(const QUIC_CHANNEL *ch);
  280. int ossl_quic_channel_is_handshake_complete(const QUIC_CHANNEL *ch);
  281. int ossl_quic_channel_is_handshake_confirmed(const QUIC_CHANNEL *ch);
  282. QUIC_PORT *ossl_quic_channel_get0_port(QUIC_CHANNEL *ch);
  283. QUIC_ENGINE *ossl_quic_channel_get0_engine(QUIC_CHANNEL *ch);
  284. QUIC_DEMUX *ossl_quic_channel_get0_demux(QUIC_CHANNEL *ch);
  285. SSL *ossl_quic_channel_get0_ssl(QUIC_CHANNEL *ch);
  286. /*
  287. * Retrieves a pointer to the channel mutex which was provided at the time the
  288. * channel was instantiated. In order to allow locks to be acquired and released
  289. * with the correct granularity, it is the caller's responsibility to ensure
  290. * this lock is held for write while calling any QUIC_CHANNEL method, except for
  291. * methods explicitly designed otherwise.
  292. *
  293. * This method is thread safe and does not require prior locking. It can also be
  294. * called while the lock is already held. Note that this is simply a convenience
  295. * function to access the mutex which was passed to the channel at instantiation
  296. * time; it does not belong to the channel but rather is presumed to belong to
  297. * the owner of the channel.
  298. */
  299. CRYPTO_MUTEX *ossl_quic_channel_get_mutex(QUIC_CHANNEL *ch);
  300. /*
  301. * Creates a new locally-initiated stream in the stream mapper, choosing an
  302. * appropriate stream ID. If is_uni is 1, creates a unidirectional stream, else
  303. * creates a bidirectional stream. Returns NULL on failure.
  304. */
  305. QUIC_STREAM *ossl_quic_channel_new_stream_local(QUIC_CHANNEL *ch, int is_uni);
  306. /*
  307. * Creates a new remotely-initiated stream in the stream mapper. The stream ID
  308. * is used to confirm the initiator and determine the stream type. The stream is
  309. * automatically added to the QSM's accept queue. A pointer to the stream is
  310. * also returned. Returns NULL on failure.
  311. */
  312. QUIC_STREAM *ossl_quic_channel_new_stream_remote(QUIC_CHANNEL *ch,
  313. uint64_t stream_id);
  314. /*
  315. * Configures incoming stream auto-reject. If enabled, incoming streams have
  316. * both their sending and receiving parts automatically rejected using
  317. * STOP_SENDING and STREAM_RESET frames. aec is the application error
  318. * code to be used for those frames.
  319. */
  320. void ossl_quic_channel_set_incoming_stream_auto_reject(QUIC_CHANNEL *ch,
  321. int enable,
  322. uint64_t aec);
  323. /*
  324. * Causes the channel to reject the sending and receiving parts of a stream,
  325. * as though autorejected. Can be used if a stream has already been
  326. * accepted.
  327. */
  328. void ossl_quic_channel_reject_stream(QUIC_CHANNEL *ch, QUIC_STREAM *qs);
  329. /* Replace local connection ID in TXP and DEMUX for testing purposes. */
  330. int ossl_quic_channel_replace_local_cid(QUIC_CHANNEL *ch,
  331. const QUIC_CONN_ID *conn_id);
  332. /* Setters for the msg_callback and msg_callback_arg */
  333. void ossl_quic_channel_set_msg_callback(QUIC_CHANNEL *ch,
  334. ossl_msg_cb msg_callback,
  335. SSL *msg_callback_ssl);
  336. void ossl_quic_channel_set_msg_callback_arg(QUIC_CHANNEL *ch,
  337. void *msg_callback_arg);
  338. /* Testing use only - sets a TXKU threshold packet count override value. */
  339. void ossl_quic_channel_set_txku_threshold_override(QUIC_CHANNEL *ch,
  340. uint64_t tx_pkt_threshold);
  341. /* Testing use only - gets current 1-RTT key epochs for QTX and QRX. */
  342. uint64_t ossl_quic_channel_get_tx_key_epoch(QUIC_CHANNEL *ch);
  343. uint64_t ossl_quic_channel_get_rx_key_epoch(QUIC_CHANNEL *ch);
  344. /* Artificially trigger a spontaneous TXKU if possible. */
  345. int ossl_quic_channel_trigger_txku(QUIC_CHANNEL *ch);
  346. int ossl_quic_channel_has_pending(const QUIC_CHANNEL *ch);
  347. /* Force transmission of an ACK-eliciting packet. */
  348. int ossl_quic_channel_ping(QUIC_CHANNEL *ch);
  349. /*
  350. * These queries exist for diagnostic purposes only. They may roll over.
  351. * Do not rely on them for non-testing purposes.
  352. */
  353. uint16_t ossl_quic_channel_get_diag_num_rx_ack(QUIC_CHANNEL *ch);
  354. /*
  355. * Diagnostic use only. Gets the current local CID.
  356. */
  357. void ossl_quic_channel_get_diag_local_cid(QUIC_CHANNEL *ch, QUIC_CONN_ID *cid);
  358. /*
  359. * Returns 1 if stream count flow control allows us to create a new
  360. * locally-initiated stream.
  361. */
  362. int ossl_quic_channel_is_new_local_stream_admissible(QUIC_CHANNEL *ch, int is_uni);
  363. /*
  364. * Returns the number of additional streams that can currently be created based
  365. * on flow control.
  366. */
  367. uint64_t ossl_quic_channel_get_local_stream_count_avail(const QUIC_CHANNEL *ch,
  368. int is_uni);
  369. uint64_t ossl_quic_channel_get_remote_stream_count_avail(const QUIC_CHANNEL *ch,
  370. int is_uni);
  371. /*
  372. * Returns 1 if we have generated our local transport parameters yet.
  373. */
  374. int ossl_quic_channel_have_generated_transport_params(const QUIC_CHANNEL *ch);
  375. /* Configures the idle timeout to request from peer (milliseconds, 0=no timeout). */
  376. void ossl_quic_channel_set_max_idle_timeout_request(QUIC_CHANNEL *ch, uint64_t ms);
  377. /* Get the configured idle timeout to request from peer. */
  378. uint64_t ossl_quic_channel_get_max_idle_timeout_request(const QUIC_CHANNEL *ch);
  379. /* Get the idle timeout requested by the peer. */
  380. uint64_t ossl_quic_channel_get_max_idle_timeout_peer_request(const QUIC_CHANNEL *ch);
  381. /* Get the idle timeout actually negotiated. */
  382. uint64_t ossl_quic_channel_get_max_idle_timeout_actual(const QUIC_CHANNEL *ch);
  383. # endif
  384. #endif