Commit e401ef80 authored by Boris Pismenny's avatar Boris Pismenny Committed by Matt Caswell
Browse files

bio: Linux TLS Rx Offload



Add support for Linux TLS Rx offload in the BIO layer.

Change-Id: I79924b25dd290a873d69f6c8d429e1f5bb2c3365
Signed-off-by: default avatarBoris Pismenny <borisp@mellanox.com>

Reviewed-by: default avatarBernd Edlinger <bernd.edlinger@hotmail.de>
Reviewed-by: default avatarMatt Caswell <matt@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/7848)
parent f851a689
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -108,6 +108,11 @@ static int sock_read(BIO *b, char *out, int outl)

    if (out != NULL) {
        clear_socket_error();
# ifndef OPENSSL_NO_KTLS
        if (BIO_get_ktls_recv(b))
            ret = ktls_read_record(b->num, out, outl);
        else
# endif
            ret = readsocket(b->num, out, outl);
        BIO_clear_retry_flags(b);
        if (ret <= 0) {
@@ -177,20 +182,22 @@ static long sock_ctrl(BIO *b, int cmd, long num, void *ptr)
        ret = 1;
        break;
# ifndef OPENSSL_NO_KTLS
    case BIO_CTRL_SET_KTLS_SEND:
    case BIO_CTRL_SET_KTLS:
        crypto_info = (struct tls12_crypto_info_aes_gcm_128 *)ptr;
        ret = ktls_start(b->num, crypto_info, sizeof(*crypto_info), num);
        if (ret)
            BIO_set_ktls_flag(b);
            BIO_set_ktls_flag(b, num);
        break;
    case BIO_CTRL_GET_KTLS_SEND:
        return BIO_should_ktls_flag(b);
    case BIO_CTRL_SET_KTLS_SEND_CTRL_MSG:
        return BIO_should_ktls_flag(b, 1);
    case BIO_CTRL_GET_KTLS_RECV:
        return BIO_should_ktls_flag(b, 0);
    case BIO_CTRL_SET_KTLS_TX_SEND_CTRL_MSG:
        BIO_set_ktls_ctrl_msg_flag(b);
        b->ptr = (void *)num;
        ret = 0;
        break;
    case BIO_CTRL_CLEAR_KTLS_CTRL_MSG:
    case BIO_CTRL_CLEAR_KTLS_TX_CTRL_MSG:
        BIO_clear_ktls_ctrl_msg_flag(b);
        ret = 0;
        break;
+20 −17
Original line number Diff line number Diff line
@@ -35,35 +35,38 @@ void bio_cleanup(void);
int bwrite_conv(BIO *bio, const char *data, size_t datal, size_t *written);
int bread_conv(BIO *bio, char *data, size_t datal, size_t *read);

# define BIO_CTRL_SET_KTLS_SEND                 72
# define BIO_CTRL_SET_KTLS_SEND_CTRL_MSG        74
# define BIO_CTRL_CLEAR_KTLS_CTRL_MSG      75
/* Changes to these internal BIOs must also update include/openssl/bio.h */
# define BIO_CTRL_SET_KTLS                      72
# define BIO_CTRL_SET_KTLS_TX_SEND_CTRL_MSG     74
# define BIO_CTRL_CLEAR_KTLS_TX_CTRL_MSG        75

/*
 * This is used with socket BIOs:
 * BIO_FLAGS_KTLS means we are using ktls with this BIO.
 * BIO_FLAGS_KTLS_CTRL_MSG means we are about to send a ctrl message next.
 * BIO_FLAGS_KTLS_TX means we are using ktls with this BIO for sending.
 * BIO_FLAGS_KTLS_TX_CTRL_MSG means we are about to send a ctrl message next.
 * BIO_FLAGS_KTLS_RX means we are using ktls with this BIO for receiving.
 */
# define BIO_FLAGS_KTLS          0x800
# define BIO_FLAGS_KTLS_CTRL_MSG 0x1000
# define BIO_FLAGS_KTLS_TX          0x800
# define BIO_FLAGS_KTLS_TX_CTRL_MSG 0x1000
# define BIO_FLAGS_KTLS_RX          0x2000

/* KTLS related controls and flags */
# define BIO_set_ktls_flag(b) \
    BIO_set_flags(b, BIO_FLAGS_KTLS)
# define BIO_should_ktls_flag(b) \
    BIO_test_flags(b, BIO_FLAGS_KTLS)
# define BIO_set_ktls_flag(b, is_tx) \
    BIO_set_flags(b, (is_tx) ? BIO_FLAGS_KTLS_TX : BIO_FLAGS_KTLS_RX)
# define BIO_should_ktls_flag(b, is_tx) \
    BIO_test_flags(b, (is_tx) ? BIO_FLAGS_KTLS_TX : BIO_FLAGS_KTLS_RX)
# define BIO_set_ktls_ctrl_msg_flag(b) \
    BIO_set_flags(b, BIO_FLAGS_KTLS_CTRL_MSG)
    BIO_set_flags(b, BIO_FLAGS_KTLS_TX_CTRL_MSG)
# define BIO_should_ktls_ctrl_msg_flag(b) \
    BIO_test_flags(b, (BIO_FLAGS_KTLS_CTRL_MSG))
    BIO_test_flags(b, BIO_FLAGS_KTLS_TX_CTRL_MSG)
# define BIO_clear_ktls_ctrl_msg_flag(b) \
    BIO_clear_flags(b, (BIO_FLAGS_KTLS_CTRL_MSG))
    BIO_clear_flags(b, BIO_FLAGS_KTLS_TX_CTRL_MSG)

#  define BIO_set_ktls(b, keyblob, is_tx)   \
     BIO_ctrl(b, BIO_CTRL_SET_KTLS_SEND, is_tx, keyblob)
     BIO_ctrl(b, BIO_CTRL_SET_KTLS, is_tx, keyblob)
#  define BIO_set_ktls_ctrl_msg(b, record_type)   \
     BIO_ctrl(b, BIO_CTRL_SET_KTLS_SEND_CTRL_MSG, record_type, NULL)
     BIO_ctrl(b, BIO_CTRL_SET_KTLS_TX_SEND_CTRL_MSG, record_type, NULL)
#  define BIO_clear_ktls_ctrl_msg(b) \
     BIO_ctrl(b, BIO_CTRL_CLEAR_KTLS_CTRL_MSG, 0, NULL)
     BIO_ctrl(b, BIO_CTRL_CLEAR_KTLS_TX_CTRL_MSG, 0, NULL)

#endif
+7 −2
Original line number Diff line number Diff line
@@ -145,15 +145,20 @@ extern "C" {

# define BIO_CTRL_DGRAM_SET_PEEK_MODE      71

/* internal BIO see include/internal/bio.h:
/*
 * internal BIO see include/internal/bio.h:
 * # define BIO_CTRL_SET_KTLS_SEND                 72
 * # define BIO_CTRL_SET_KTLS_SEND_CTRL_MSG        74
 * # define BIO_CTRL_CLEAR_KTLS_CTRL_MSG           75
 */

#  define BIO_CTRL_GET_KTLS_SEND                 73
#  define BIO_CTRL_GET_KTLS_RECV                 76

#  define BIO_get_ktls_send(b)         \
     BIO_ctrl(b, BIO_CTRL_GET_KTLS_SEND, 0, NULL)
#  define BIO_get_ktls_recv(b)         \
     BIO_ctrl(b, BIO_CTRL_GET_KTLS_RECV, 0, NULL)

/* modifiers */
# define BIO_FP_READ             0x02