QUIC POLLING: Implement autotick
authorHugo Landau <hlandau@openssl.org>
Fri, 2 Feb 2024 12:30:41 +0000 (12:30 +0000)
committerHugo Landau <hlandau@openssl.org>
Sat, 10 Feb 2024 11:37:14 +0000 (11:37 +0000)
Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/23495)

include/internal/quic_ssl.h
ssl/quic/quic_impl.c
ssl/rio/poll_immediate.c

index b8922363bda1ae2176b898553c5d6b6f32e24bb3..54e8a2e7e3e1b77adf743bd28321f899c4197316 100644 (file)
@@ -143,7 +143,8 @@ int ossl_quic_get_shutdown(const SSL *s);
 int ossl_quic_set_diag_title(SSL_CTX *ctx, const char *title);
 
 /* APIs used by the polling infrastructure */
-int ossl_quic_conn_poll_events(SSL *ssl, uint64_t events, uint64_t *revents);
+int ossl_quic_conn_poll_events(SSL *ssl, uint64_t events, int do_tick,
+                               uint64_t *revents);
 
 # endif
 
index 42e7b085e7f43d5a5b66525a2e449df422c9ec52..d0dc04bb3740b653593ae3c68cb3bf3a6b5177c4 100644 (file)
@@ -3921,7 +3921,8 @@ static int test_poll_event_os(QUIC_CONNECTION *qc, int is_uni)
 }
 
 QUIC_TAKES_LOCK
-int ossl_quic_conn_poll_events(SSL *ssl, uint64_t events, uint64_t *p_revents)
+int ossl_quic_conn_poll_events(SSL *ssl, uint64_t events, int do_tick,
+                               uint64_t *p_revents)
 {
     QCTX ctx;
     uint64_t revents = 0;
@@ -3931,6 +3932,9 @@ int ossl_quic_conn_poll_events(SSL *ssl, uint64_t events, uint64_t *p_revents)
 
     quic_lock(ctx.qc);
 
+    if (do_tick)
+        ossl_quic_reactor_tick(ossl_quic_channel_get_reactor(ctx.qc->ch), 0);
+
     if (ctx.xso != NULL) {
         /* SSL object has a stream component. */
 
index 7de211742add72b482edaa45813e5445361d9a97..d4fd62ad951c0186dd872a21957d6e549e4975eb 100644 (file)
@@ -61,13 +61,6 @@ int SSL_poll(SSL_POLL_ITEM *items,
         FAIL_FROM(0);
     }
 
-    if (do_tick) {
-        ERR_raise_data(ERR_LIB_SSL, SSL_R_POLL_REQUEST_NOT_SUPPORTED,
-                       "SSL_poll does not currently support implicit I/O "
-                       "processing");
-        FAIL_FROM(0);
-    }
-
     /* Trivial case. */
     if (num_items == 0)
         goto out;
@@ -88,7 +81,7 @@ int SSL_poll(SSL_POLL_ITEM *items,
             switch (ssl->type) {
             case SSL_TYPE_QUIC_CONNECTION:
             case SSL_TYPE_QUIC_XSO:
-                if (!ossl_quic_conn_poll_events(ssl, events, &revents))
+                if (!ossl_quic_conn_poll_events(ssl, events, do_tick, &revents))
                     /* above call raises ERR */
                     FAIL_ITEM(i);
 
@@ -121,7 +114,6 @@ int SSL_poll(SSL_POLL_ITEM *items,
 
     /* TODO(QUIC POLLING): Blocking mode */
     /* TODO(QUIC POLLING): Support for polling FDs */
-    /* TODO(QUIC POLLING): Support for autotick */
 
 out:
     if (p_result_count != NULL)