From 2f557ae0ea7790acaaa2141cb4275ec11e8d7fcb Mon Sep 17 00:00:00 2001 From: Hugo Landau Date: Thu, 11 Jan 2024 09:33:36 +0000 Subject: QUIC APL: Add skeleton listener API methods Reviewed-by: Matt Caswell Reviewed-by: Neil Horman (Merged from https://github.com/openssl/openssl/pull/23334) --- include/internal/quic_ssl.h | 4 ++++ include/openssl/ssl.h.in | 5 +++++ ssl/quic/quic_impl.c | 29 +++++++++++++++++++++++++ ssl/ssl_lib.c | 53 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+) diff --git a/include/internal/quic_ssl.h b/include/internal/quic_ssl.h index 4b8eb83d6f..f0dcf59ba0 100644 --- a/include/internal/quic_ssl.h +++ b/include/internal/quic_ssl.h @@ -77,6 +77,7 @@ __owur int ossl_quic_conn_set_initial_peer_addr(SSL *s, const BIO_ADDR *peer_addr); __owur SSL *ossl_quic_conn_stream_new(SSL *s, uint64_t flags); __owur SSL *ossl_quic_get0_connection(SSL *s); +__owur SSL *ossl_quic_get0_listener(SSL *s); __owur int ossl_quic_get_stream_type(SSL *s); __owur uint64_t ossl_quic_get_stream_id(SSL *s); __owur int ossl_quic_is_stream_local(SSL *s); @@ -91,6 +92,9 @@ __owur int ossl_quic_get_value_uint(SSL *s, uint32_t class_, uint32_t id, uint64_t *value); __owur int ossl_quic_set_value_uint(SSL *s, uint32_t class_, uint32_t id, uint64_t value); +__owur SSL *ossl_quic_accept_connection(SSL *ssl, uint64_t flags); +__owur size_t ossl_quic_get_accept_connection_queue_len(SSL *ssl); +__owur int ossl_quic_listen(SSL *ssl); __owur int ossl_quic_stream_reset(SSL *ssl, const SSL_STREAM_RESET_ARGS *args, diff --git a/include/openssl/ssl.h.in b/include/openssl/ssl.h.in index 362796e199..25c1976f9e 100644 --- a/include/openssl/ssl.h.in +++ b/include/openssl/ssl.h.in @@ -2283,7 +2283,12 @@ __owur int SSL_set1_initial_peer_addr(SSL *s, const BIO_ADDR *peer_addr); __owur SSL *SSL_get0_connection(SSL *s); __owur int SSL_is_connection(SSL *s); +__owur int SSL_is_listener(SSL *ssl); +__owur SSL *SSL_get0_listener(SSL *s); __owur SSL *SSL_new_listener(SSL_CTX *ctx, uint64_t flags); +__owur SSL *SSL_accept_connection(SSL *ssl, uint64_t flags); +__owur size_t SSL_get_accept_connection_queue_len(SSL *ssl); +__owur int SSL_listen(SSL *ssl); #define SSL_STREAM_TYPE_NONE 0 #define SSL_STREAM_TYPE_READ (1U << 0) diff --git a/ssl/quic/quic_impl.c b/ssl/quic/quic_impl.c index 10ef61a113..eb953a034c 100644 --- a/ssl/quic/quic_impl.c +++ b/ssl/quic/quic_impl.c @@ -2998,6 +2998,20 @@ SSL *ossl_quic_get0_connection(SSL *s) return &ctx.qc->obj.ssl; } +/* + * SSL_get0_listener + * ----------------- + */ +SSL *ossl_quic_get0_listener(SSL *s) +{ + QCTX ctx; + + if (!expect_quic(s, &ctx)) + return NULL; + + return NULL; // XXX TODO +} + /* * SSL_get_stream_type * ------------------- @@ -3987,6 +4001,21 @@ err: return NULL; } +SSL *ossl_quic_accept_connection(SSL *ssl, uint64_t flags) +{ + return NULL; // TODO XXX +} + +size_t ossl_quic_get_accept_connection_queue_len(SSL *ssl) +{ + return 0; // TODO XXX +} + +int ossl_quic_listen(SSL *ssl) +{ + return 0; // TODO XXX +} + /* * QUIC Front-End I/O API: SSL_CTX Management * ========================================== diff --git a/ssl/ssl_lib.c b/ssl/ssl_lib.c index 28aa428521..6374256766 100644 --- a/ssl/ssl_lib.c +++ b/ssl/ssl_lib.c @@ -7480,6 +7480,23 @@ int SSL_is_connection(SSL *s) return SSL_get0_connection(s) == s; } +SSL *SSL_get0_listener(SSL *s) +{ +#ifndef OPENSSL_NO_QUIC + if (!IS_QUIC(s)) + return s; + + return ossl_quic_get0_listener(s); +#else + return s; +#endif +} + +int SSL_is_listener(SSL *s) +{ + return SSL_get0_listener(s) == s; +} + int SSL_get_stream_type(SSL *s) { #ifndef OPENSSL_NO_QUIC @@ -7675,6 +7692,42 @@ SSL *SSL_new_listener(SSL_CTX *ctx, uint64_t flags) #endif } +SSL *SSL_accept_connection(SSL *ssl, uint64_t flags) +{ +#ifndef OPENSSL_NO_QUIC + if (!IS_QUIC(ssl)) + return NULL; + + return ossl_quic_accept_connection(ssl, flags); +#else + return NULL; +#endif +} + +size_t SSL_get_accept_connection_queue_len(SSL *ssl) +{ +#ifndef OPENSSL_NO_QUIC + if (!IS_QUIC(ssl)) + return 0; + + return ossl_quic_get_accept_connection_queue_len(ssl); +#else + return 0; +#endif +} + +int SSL_listen(SSL *ssl) +{ +#ifndef OPENSSL_NO_QUIC + if (!IS_QUIC(ssl)) + return 0; + + return ossl_quic_listen(ssl); +#else + return 0; +#endif +} + int SSL_add_expected_rpk(SSL *s, EVP_PKEY *rpk) { unsigned char *data = NULL; -- cgit v1.2.3