From eca02723b34b5f27879eece0e9008f0bbb13707d Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sat, 18 Mar 2023 13:49:37 -0700 Subject: [PATCH] ircd::net: Consolidate SSL_pending related behind interface. --- include/ircd/net/read.h | 5 +++-- ircd/net.cc | 33 ++++++++++++++++++--------------- ircd/server.cc | 30 +++++------------------------- 3 files changed, 26 insertions(+), 42 deletions(-) diff --git a/include/ircd/net/read.h b/include/ircd/net/read.h index d41cdb026..0f3f3643d 100644 --- a/include/ircd/net/read.h +++ b/include/ircd/net/read.h @@ -16,8 +16,9 @@ namespace ircd::net using mutable_buffers = vector_view; // 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 &); diff --git a/ircd/net.cc b/ircd/net.cc index 502556b18..81e0cc5d2 100644 --- a/ircd/net.cc +++ b/ircd/net.cc @@ -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, }; } diff --git a/ircd/server.cc b/ircd/server.cc index ca592118b..8914e8806 100644 --- a/ircd/server.cc +++ b/ircd/server.cc @@ -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);