OSSL_TIME (*now_cb)(void *arg);
void *now_cb_arg;
+
+ /* Flags to pass when initialising the reactor. */
+ uint64_t reactor_flags;
} QUIC_ENGINE_ARGS;
QUIC_ENGINE *ossl_quic_engine_new(const QUIC_ENGINE_ARGS *args);
* QUIC Engine
* ===========
*/
-static int qeng_init(QUIC_ENGINE *qeng);
+static int qeng_init(QUIC_ENGINE *qeng, uint64_t reactor_flags);
static void qeng_cleanup(QUIC_ENGINE *qeng);
static void qeng_tick(QUIC_TICK_RESULT *res, void *arg, uint32_t flags);
qeng->now_cb = args->now_cb;
qeng->now_cb_arg = args->now_cb_arg;
- if (!qeng_init(qeng)) {
+ if (!qeng_init(qeng, args->reactor_flags)) {
OPENSSL_free(qeng);
return NULL;
}
OPENSSL_free(qeng);
}
-static int qeng_init(QUIC_ENGINE *qeng)
+static int qeng_init(QUIC_ENGINE *qeng, uint64_t reactor_flags)
{
- ossl_quic_reactor_init(&qeng->rtor, qeng_tick, qeng, ossl_time_zero(), 0);
- return 1;
+ return ossl_quic_reactor_init(&qeng->rtor, qeng_tick, qeng,
+ ossl_time_zero(), reactor_flags);
}
static void qeng_cleanup(QUIC_ENGINE *qeng)
{
assert(ossl_list_port_num(&qeng->port_list) == 0);
+ ossl_quic_reactor_cleanup(&qeng->rtor);
}
QUIC_REACTOR *ossl_quic_engine_get0_reactor(QUIC_ENGINE *qeng)
return 1;
}
+static int need_notifier_for_domain_flags(uint64_t domain_flags)
+{
+ return (domain_flags & SSL_DOMAIN_FLAG_THREAD_ASSISTED) != 0
+ || ((domain_flags & SSL_DOMAIN_FLAG_MULTI_THREAD) != 0
+ && (domain_flags & SSL_DOMAIN_FLAG_BLOCKING) != 0);
+}
+
QUIC_NEEDS_LOCK
static int create_channel(QUIC_CONNECTION *qc, SSL_CTX *ctx)
{
#endif
engine_args.now_cb = get_time_cb;
engine_args.now_cb_arg = qc;
+ if (need_notifier_for_domain_flags(ctx->domain_flags))
+ engine_args.reactor_flags |= QUIC_REACTOR_FLAG_USE_NOTIFIER;
+
qc->engine = ossl_quic_engine_new(&engine_args);
if (qc->engine == NULL) {
QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
#if defined(OPENSSL_THREADS)
engine_args.mutex = ql->mutex;
#endif
+ if (need_notifier_for_domain_flags(ctx->domain_flags))
+ engine_args.reactor_flags |= QUIC_REACTOR_FLAG_USE_NOTIFIER;
+
if ((ql->engine = ossl_quic_engine_new(&engine_args)) == NULL) {
QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
goto err;
#if defined(OPENSSL_THREADS)
engine_args.mutex = qd->mutex;
#endif
+ if (need_notifier_for_domain_flags(ctx->domain_flags))
+ engine_args.reactor_flags |= QUIC_REACTOR_FLAG_USE_NOTIFIER;
+
if ((qd->engine = ossl_quic_engine_new(&engine_args)) == NULL) {
QUIC_RAISE_NON_NORMAL_ERROR(NULL, ERR_R_INTERNAL_ERROR, NULL);
goto err;
return 0;
}
+ if ((domain_flags & SSL_DOMAIN_FLAG_THREAD_ASSISTED) != 0)
+ domain_flags |= SSL_DOMAIN_FLAG_MULTI_THREAD;
+
+ if ((domain_flags & (SSL_DOMAIN_FLAG_MULTI_THREAD
+ | SSL_DOMAIN_FLAG_SINGLE_THREAD)) == 0)
+ domain_flags |= SSL_DOMAIN_FLAG_MULTI_THREAD;
+
if ((domain_flags & SSL_DOMAIN_FLAG_SINGLE_THREAD) != 0
- && (domain_flags & (SSL_DOMAIN_FLAG_MULTI_THREAD
- | SSL_DOMAIN_FLAG_THREAD_ASSISTED)) != 0) {
+ && (domain_flags & SSL_DOMAIN_FLAG_MULTI_THREAD) != 0) {
ERR_raise_data(ERR_LIB_SSL, ERR_R_PASSED_INVALID_ARGUMENT,
"mutually exclusive domain flags specified");
return 0;