Skip to content

Commit

Permalink
QUIC: Add stream write buffer queries
Browse files Browse the repository at this point in the history
Reviewed-by: Tim Hudson <tjh@openssl.org>
Reviewed-by: Neil Horman <nhorman@openssl.org>
(Merged from #23584)
  • Loading branch information
hlandau committed Mar 9, 2024
1 parent a24f29b commit b317583
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 3 deletions.
54 changes: 51 additions & 3 deletions doc/man3/SSL_get_value_uint.pod
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,13 @@ SSL_VALUE_EVENT_HANDLING_MODE_INHERIT,
SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT,
SSL_VALUE_EVENT_HANDLING_MODE_IMPLICIT,
SSL_get_event_handling_mode,
SSL_set_event_handling_mode -
SSL_set_event_handling_mode,
SSL_VALUE_STREAM_WRITE_BUF_SIZE,
SSL_get_stream_write_buf_size,
SSL_VALUE_STREAM_WRITE_BUF_USED,
SSL_get_stream_write_buf_used,
SSL_VALUE_STREAM_WRITE_BUF_AVAIL,
SSL_get_stream_write_buf_avail -
manage negotiable features and configuration values for a SSL object

=head1 SYNOPSIS
Expand Down Expand Up @@ -45,6 +51,10 @@ manage negotiable features and configuration values for a SSL object
#define SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT
#define SSL_VALUE_EVENT_HANDLING_MODE_IMPLICIT

#define SSL_VALUE_STREAM_WRITE_BUF_SIZE
#define SSL_VALUE_STREAM_WRITE_BUF_USED
#define SSL_VALUE_STREAM_WRITE_BUF_AVAIL

The following convenience macros can also be used:

int SSL_get_generic_value_uint(SSL *ssl, uint32_t id, uint64_t *value);
Expand All @@ -64,6 +74,10 @@ The following convenience macros can also be used:
int SSL_get_event_handling_mode(SSL *ssl, uint64_t *value);
int SSL_set_event_handling_mode(SSL *ssl, uint64_t value);

int SSL_get_stream_write_buf_size(SSL *ssl, uint64_t *value);
int SSL_get_stream_write_buf_avail(SSL *ssl, uint64_t *value);
int SSL_get_stream_write_buf_used(SSL *ssl, uint64_t *value);

=head1 DESCRIPTION

SSL_get_value_uint() and SSL_set_value_uint() provide access to configurable
Expand Down Expand Up @@ -131,11 +145,16 @@ SSL_get_feature_negotiated_uint() for brevity.

=back

=head1 CONFIGURABLE VALUES FOR QUIC CONNECTIONS
=head1 CONFIGURABLE VALUES FOR QUIC OBJECTS

The following configurable values are supported for QUIC SSL objects. Whether a
value is supported for a QUIC connection SSL object or a QUIC stream SSL object
is indicated in the heading for each value:
is indicated in the heading for each value. Values supported for QUIC stream SSL
objects are also supported on QUIC connection SSL objects if they have a default
stream attached.

SSL_get_value() does not cause internal event processing to occur unless the
documentation for a specific value specifies otherwise.

=over 4

Expand Down Expand Up @@ -251,6 +270,35 @@ does happen as a result of an API call to an object related to a connection,
processing of background events (for example, received QUIC network traffic) may
also affect the state of any other object related to a connection.

=item B<SSL_VALUE_STREAM_WRITE_BUF_SIZE> (stream object)

Generic read-only statistical value. The size of the write buffer allocated to
hold data written to a stream with L<SSL_write_ex(3)> until it is transmitted
and subsequently acknowledged by the peer. This value may change at any time, as
buffer sizes are optimised in response to network conditions to optimise
throughput.

Can be queried using the convenience macro SSL_get_stream_write_buf_size().

=item B<SSL_VALUE_STREAM_WRITE_BUF_USED> (stream object)

Generic read-only statistical value. The number of bytes currently consumed
in the write buffer which have yet to be acknowledged by the peer. Successful
calls to L<SSL_write_ex(3)> which accept data cause this number to increase.
This number will then decrease as data is acknowledged by the peer.

Can be queried using the convenience macro SSL_get_stream_write_buf_used().

=item B<SSL_VALUE_STREAM_WRITE_BUF_AVAIL> (stream object)

Generic read-only statistical value. The number of bytes available in the write
buffer which have yet to be consumed by calls to L<SSL_write_ex(3)>. Successful
calls to L<SSL_write_ex(3)> which accept data cause this number to decrease.
This number will increase as data is acknowledged by the peer. It may also
change if the buffer is resized automatically to optimise throughput.

Can be queried using the convenience macro SSL_get_stream_write_buf_avail().

=back

No configurable values are currently defined for non-QUIC SSL objects.
Expand Down
13 changes: 13 additions & 0 deletions include/openssl/ssl.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -2381,6 +2381,9 @@ __owur int SSL_get_conn_close_info(SSL *ssl,
# define SSL_VALUE_QUIC_STREAM_UNI_REMOTE_AVAIL 4
# define SSL_VALUE_QUIC_IDLE_TIMEOUT 5
# define SSL_VALUE_EVENT_HANDLING_MODE 6
# define SSL_VALUE_STREAM_WRITE_BUF_SIZE 7
# define SSL_VALUE_STREAM_WRITE_BUF_USED 8
# define SSL_VALUE_STREAM_WRITE_BUF_AVAIL 9

# define SSL_VALUE_EVENT_HANDLING_MODE_INHERIT 0
# define SSL_VALUE_EVENT_HANDLING_MODE_IMPLICIT 1
Expand Down Expand Up @@ -2422,6 +2425,16 @@ int SSL_set_value_uint(SSL *s, uint32_t class_, uint32_t id, uint64_t v);
SSL_set_generic_value_uint((ssl), SSL_VALUE_EVENT_HANDLING_MODE, \
(value))

# define SSL_get_stream_write_buf_size(ssl, value) \
SSL_get_generic_value_uint((ssl), SSL_VALUE_STREAM_WRITE_BUF_SIZE, \
(value))
# define SSL_get_stream_write_buf_used(ssl, value) \
SSL_get_generic_value_uint((ssl), SSL_VALUE_STREAM_WRITE_BUF_USED, \
(value))
# define SSL_get_stream_write_buf_avail(ssl, value) \
SSL_get_generic_value_uint((ssl), SSL_VALUE_STREAM_WRITE_BUF_AVAIL, \
(value))

# define SSL_POLL_EVENT_NONE 0

# define SSL_POLL_EVENT_F (1U << 0) /* F (Failure) */
Expand Down
49 changes: 49 additions & 0 deletions ssl/quic/quic_impl.c
Original file line number Diff line number Diff line change
Expand Up @@ -3371,11 +3371,50 @@ static int qc_getset_event_handling(QCTX *ctx, uint32_t class_,
return ret;
}

QUIC_TAKES_LOCK
static int qc_get_stream_write_buf_stat(QCTX *ctx, uint32_t class_,
uint64_t *p_value_out,
size_t (*getter)(QUIC_SSTREAM *sstream))
{
int ret = 0;
size_t value = 0;

quic_lock(ctx->qc);

if (class_ != SSL_VALUE_CLASS_GENERIC) {
QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_UNSUPPORTED_CONFIG_VALUE_CLASS,
NULL);
goto err;
}

if (ctx->xso == NULL) {
QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_NO_STREAM, NULL);
goto err;
}

if (!ossl_quic_stream_has_send(ctx->xso->stream)) {
QUIC_RAISE_NON_NORMAL_ERROR(ctx, SSL_R_STREAM_RECV_ONLY, NULL);
goto err;
}

if (ossl_quic_stream_has_send_buffer(ctx->xso->stream))
value = getter(ctx->xso->stream->sstream);

ret = 1;
err:
quic_unlock(ctx->qc);
*p_value_out = (uint64_t)value;
return ret;
}

QUIC_NEEDS_LOCK
static int expect_quic_for_value(SSL *s, QCTX *ctx, uint32_t id)
{
switch (id) {
case SSL_VALUE_EVENT_HANDLING_MODE:
case SSL_VALUE_STREAM_WRITE_BUF_SIZE:
case SSL_VALUE_STREAM_WRITE_BUF_USED:
case SSL_VALUE_STREAM_WRITE_BUF_AVAIL:
return expect_quic(s, ctx);
default:
return expect_quic_conn_only(s, ctx);
Expand Down Expand Up @@ -3411,6 +3450,16 @@ int ossl_quic_get_value_uint(SSL *s, uint32_t class_, uint32_t id,
case SSL_VALUE_EVENT_HANDLING_MODE:
return qc_getset_event_handling(&ctx, class_, value, NULL);

case SSL_VALUE_STREAM_WRITE_BUF_SIZE:
return qc_get_stream_write_buf_stat(&ctx, class_, value,
ossl_quic_sstream_get_buffer_size);
case SSL_VALUE_STREAM_WRITE_BUF_USED:
return qc_get_stream_write_buf_stat(&ctx, class_, value,
ossl_quic_sstream_get_buffer_used);
case SSL_VALUE_STREAM_WRITE_BUF_AVAIL:
return qc_get_stream_write_buf_stat(&ctx, class_, value,
ossl_quic_sstream_get_buffer_avail);

default:
return QUIC_RAISE_NON_NORMAL_ERROR(&ctx,
SSL_R_UNSUPPORTED_CONFIG_VALUE, NULL);
Expand Down
6 changes: 6 additions & 0 deletions util/other.syms
Original file line number Diff line number Diff line change
Expand Up @@ -687,6 +687,9 @@ SSL_get_quic_stream_uni_local_avail define
SSL_get_quic_stream_uni_remote_avail define
SSL_get_event_handling_mode define
SSL_set_event_handling_mode define
SSL_get_stream_write_buf_size define
SSL_get_stream_write_buf_used define
SSL_get_stream_write_buf_avail define
SSL_CONN_CLOSE_FLAG_LOCAL define
SSL_CONN_CLOSE_FLAG_TRANSPORT define
SSLv23_client_method define
Expand Down Expand Up @@ -752,6 +755,9 @@ SSL_VALUE_EVENT_HANDLING_MODE define
SSL_VALUE_EVENT_HANDLING_MODE_INHERIT define
SSL_VALUE_EVENT_HANDLING_MODE_IMPLICIT define
SSL_VALUE_EVENT_HANDLING_MODE_EXPLICIT define
SSL_VALUE_STREAM_WRITE_BUF_SIZE define
SSL_VALUE_STREAM_WRITE_BUF_USED define
SSL_VALUE_STREAM_WRITE_BUF_AVAIL define
TLS_DEFAULT_CIPHERSUITES define deprecated 3.0.0
X509_CRL_http_nbio define deprecated 3.0.0
X509_http_nbio define deprecated 3.0.0
Expand Down

0 comments on commit b317583

Please sign in to comment.