summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHugo Landau <hlandau@openssl.org>2024-01-11 09:33:36 +0000
committerHugo Landau <hlandau@openssl.org>2024-04-19 09:29:02 +0100
commit2f557ae0ea7790acaaa2141cb4275ec11e8d7fcb (patch)
treed2fcc409230a0ab64016dbb6c07a70d91a06ae41
parentb90003009678ed12ccc59b6371592ecdd5d8fa2d (diff)
QUIC APL: Add skeleton listener API methods
Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Neil Horman <nhorman@openssl.org> (Merged from https://github.com/openssl/openssl/pull/23334)
-rw-r--r--include/internal/quic_ssl.h4
-rw-r--r--include/openssl/ssl.h.in5
-rw-r--r--ssl/quic/quic_impl.c29
-rw-r--r--ssl/ssl_lib.c53
4 files changed, 91 insertions, 0 deletions
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
@@ -2999,6 +2999,20 @@ SSL *ossl_quic_get0_connection(SSL *s)
}
/*
+ * 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;