ircd::net: Consolidate SSL_pending related behind interface.

This commit is contained in:
Jason Volk 2023-03-18 13:49:37 -07:00
parent ee31b5a59f
commit eca02723b3
3 changed files with 26 additions and 42 deletions

View File

@ -16,8 +16,9 @@ namespace ircd::net
using mutable_buffers = vector_view<const mutable_buffer>;
// Observers
size_t readable(const socket &);
size_t available(const socket &) noexcept;
size_t readable(const socket &); // don't use w/ ssl
size_t available(const socket &) noexcept; // don't use w/ ssl
size_t pending(const socket &) noexcept; // use with either.
// Non-blocking; read into buffers in a single syscall
size_t read_one(socket &, const mutable_buffers &);

View File

@ -488,6 +488,22 @@ ircd::net::read_one(socket &socket,
return socket.read_one(buffers);
}
/// Bytes available for reading (SSL; w/ fallback).
/// @returns 0 for socket errors, unsupported, or nothing available.
size_t
ircd::net::pending(const socket &socket)
noexcept
{
if(!socket.ssl)
return available(socket);
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
return SSL_pending(mutable_cast(socket).ssl->native_handle());
#else
return 0;
#endif
}
/// Bytes available for reading (userspace)
size_t
ircd::net::available(const socket &socket)
@ -2240,28 +2256,15 @@ noexcept try
if constexpr((false)) // manual debug; large nr syscalls
{
const auto has_pending
{
#if OPENSSL_VERSION_NUMBER >= 0x1010000L
ssl?
SSL_has_pending(ssl->native_handle()):
0
#else
0
#endif
};
char ecbuf[64];
log::debug
{
log, "%s ready %s %s avail:%zu:%zu:%d:%d",
log, "%s ready %s %s avail:%zu:%zu",
loghead(*this),
reflect(type),
string(ecbuf, ec),
type == ready::READ? bytes : 0UL,
type == ready::READ? available(*this) : 0UL,
has_pending,
ssl? SSL_pending(ssl->native_handle()): 0,
type == ready::READ? pending(*this): 0UL,
};
}

View File

@ -2902,45 +2902,25 @@ void
ircd::server::link::discard_read()
{
assert(socket);
const size_t available
const size_t pending
{
net::available(*socket)
};
const ssize_t has_pending
{
#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(LIBRESSL_VERSION_NUMBER)
socket->ssl?
SSL_has_pending(socket->ssl->native_handle()):
-2L
#else
-2L
#endif
};
const ssize_t pending
{
socket->ssl?
SSL_pending(socket->ssl->native_handle()):
0L
net::pending(*socket)
};
const size_t discarded
{
discard_any(*socket, size_t(pending))
discard_any(*socket, pending)
};
if(discarded)
{
log::dwarning
{
log, "%s q:%zu discarded:%zu pending:%zd has_pending:%zd available:%zd",
log, "%s q:%zu pending:%zu discarded:%zu",
loghead(*this),
queue.size(),
discarded,
pending,
has_pending,
available,
discarded,
};
assert(peer);