From nobody Mon Sep 28 16:20:35 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4htmkX0w2mz6WtBn for ; Mon, 28 Sep 2026 16:20:36 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "YR2" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4htmkW3BzPz4Wm1 for ; Mon, 28 Sep 2026 16:20:35 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790612435; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=w3xW3zdYICWBUYjBDeZvh76n0Ti4boHp6rfO454GgQY=; b=X6Yw0kqGVjxpD5ZA2KTdKfyMhe3AadNmMd4z4pJGysmnrBhu2Fbg8cwHOWD5KluB8pNwc9 la9DJ8HAFbhvTyzQ91UzEmuSPwyRK+NCKe9/U8B5UcfsTb5zEF34mqsH6MdPAyeeiTzqbQ 6aAYOIjjE+PC34/o5WMHTt4eSSwExcD9FgwquK7gZohNzppEtewpty6baIkX18ffue6w8P h8i8MmyAZwJYLhqm8KmzQZR+wGNfYEavroSreIDdA774XJLPUxXb3gwxdFpA9fsyECufw9 gBbveeXI/64KIbZYxyv6qUePopSiLV7ou0pXP59aNVvl6bt0oS/ap+HKztyXTw== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1790612435; b=x+9uVWO03Fc515YeiaBOpL5934jprnM3lnyHP9bQJgrWYaxIfUX4Mo8Fuv14PPuFrAwTqw FVC83UEijXDPVTuhxUl9SZ7Hse2YipLMgUu6GTi/sZoCzDYfMJYCbAwsPfc2sb08FLrly6 UuB4EwYGB0CEzzW/jHaJXhCVjKMWyzufIERc2+Impy8451gwvMfbCCY81T8krxQS7iXo3c TbdZwK3bMr2dR1bJ7lXajoydy1I0QzxNrVqIH6pcUrfUZqx9BHw0D3tBg3AvoosvSIC0AX a9KdzzVKpqDf45vb6RPwc+BYA1kf+AogC3UDKUCmWC+vx+A/y5zhG4HVBlZO7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1790612435; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=w3xW3zdYICWBUYjBDeZvh76n0Ti4boHp6rfO454GgQY=; b=g75zmntEYEiApSF9B078pjxV1DBALaSUCw6rp57wmXuFPugx1MLGev85guL0dG84FZyQ0k 6hKvIADgATfPgE8MuJrz8q0Y7Z/M4+YRz2HRNWBbN0Bb+Gv/PCE1Ioz9/S5D+n48iVt8uZ e81keNztij/JloHPmMzjsN8zHkJZkJUl35Xo+4Kp2DxJZYz+ckwQzUWB74dIJ/9+uFLISe z0T5eRMLIH2xoojgdLoomzA1OeURaxYi9xp4QFeJ7MGN27CnL7GUE+zPzl/S+TPn9k6iX2 RF4NY9t/29nC4zUwwmJIkOjt3amhQBLXg1bA6iwOR0uOvLoSq8LF5nd6GVFTnw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4htmkW2HRWzbW5 for ; Mon, 28 Sep 2026 16:20:35 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 30c93 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 28 Sep 2026 16:20:35 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org Cc: Andrew Gallatin From: Mark Johnston Subject: git: f80f8c38fada - stable/14 - ktls: Add a tunable to disable TLS receive List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: f80f8c38fada66163324e509d9eb6b2c844d7c58 Auto-Submitted: auto-generated Date: Mon, 28 Sep 2026 16:20:35 +0000 Message-Id: <6aba93d3.30c93.49f853ef@gitrepo.freebsd.org> The branch stable/14 has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=f80f8c38fada66163324e509d9eb6b2c844d7c58 commit f80f8c38fada66163324e509d9eb6b2c844d7c58 Author: Andrew Gallatin AuthorDate: 2026-07-01 00:53:15 +0000 Commit: Mark Johnston CommitDate: 2026-09-28 13:57:00 +0000 ktls: Add a tunable to disable TLS receive TLS receive offload is really only beneficial for in-kernel use cases (such as NFS over TLS) or when using a hardware offload. In addition, several recent SAs have involved the TLS receive path, but the only current mitigation for those is to disable TLS offload entirely. Reviewed by: ziaee, gallatin, markj Relnotes: yes Sponsored by: Netflix Sponsored by: Chelsio Communications Co-authored-by: John Baldwin Differential Revision: https://reviews.freebsd.org/D57974 (cherry picked from commit 08cda4bcd43cfcb2c0b1abd29bc7cd30896727bc) --- share/man/man4/ktls.4 | 4 ++- sys/kern/uipc_ktls.c | 7 +++- tests/sys/kern/ktls_test.c | 90 +++++++++++++++++++++++++++++----------------- 3 files changed, 67 insertions(+), 34 deletions(-) diff --git a/share/man/man4/ktls.4 b/share/man/man4/ktls.4 index 56b03d45faf7..5fca616dae4d 100644 --- a/share/man/man4/ktls.4 +++ b/share/man/man4/ktls.4 @@ -29,7 +29,7 @@ .\" .\" * Other names and brands may be claimed as the property of others. .\" -.Dd October 31, 2024 +.Dd June 30, 2026 .Dt KTLS 4 .Os .Sh NAME @@ -182,6 +182,8 @@ A few of them are described below: .Bl -tag -width ".Va kern.ipc.tls.cbc_enable" .It Va kern.ipc.tls.enable Determines if new kernel TLS sessions can be created. +.It Va kern.ipc.tls.rx_enable +Determines if new kernel TLS receive sessions can be created. .It Va kern.ipc.tls.cbc_enable Determines if new kernel TLS sessions with a cipher suite using AES-CBC can be created. diff --git a/sys/kern/uipc_ktls.c b/sys/kern/uipc_ktls.c index 81914324fe5b..0273a82dd9fc 100644 --- a/sys/kern/uipc_ktls.c +++ b/sys/kern/uipc_ktls.c @@ -141,6 +141,11 @@ SYSCTL_BOOL(_kern_ipc_tls, OID_AUTO, enable, CTLFLAG_RWTUN, &ktls_offload_enable, 0, "Enable support for kernel TLS offload"); +static bool ktls_rx_offload_enable = true; +SYSCTL_BOOL(_kern_ipc_tls, OID_AUTO, rx_enable, CTLFLAG_RWTUN, + &ktls_rx_offload_enable, 0, + "Enable support for kernel TLS receive offload"); + static bool ktls_cbc_enable = true; SYSCTL_BOOL(_kern_ipc_tls, OID_AUTO, cbc_enable, CTLFLAG_RWTUN, &ktls_cbc_enable, 1, @@ -1211,7 +1216,7 @@ ktls_enable_rx(struct socket *so, struct tls_enable *en) struct ktls_session *tls; int error; - if (!ktls_offload_enable) + if (!ktls_offload_enable || !ktls_rx_offload_enable) return (ENOTSUP); counter_u64_add(ktls_offload_enable_calls, 1); diff --git a/tests/sys/kern/ktls_test.c b/tests/sys/kern/ktls_test.c index d895f5d4ffe5..d3a79aeb1470 100644 --- a/tests/sys/kern/ktls_test.c +++ b/tests/sys/kern/ktls_test.c @@ -69,6 +69,28 @@ require_ktls(void) #define ATF_REQUIRE_KTLS() require_ktls() +static void +require_ktls_rx(void) +{ + size_t len; + bool enable; + + ATF_REQUIRE_KTLS(); + + len = sizeof(enable); + if (sysctlbyname("kern.ipc.tls.rx_enable", &enable, &len, NULL, 0) == + -1) { + if (errno == ENOENT) + atf_tc_skip("kernel does not support TLS offload"); + atf_libc_error(errno, "Failed to read kern.ipc.tls.rx_enable"); + } + + if (!enable) + atf_tc_skip("Kernel TLS receive is disabled"); +} + +#define ATF_REQUIRE_KTLS_RX() require_ktls_rx() + static void check_tls_mode(const atf_tc_t *tc, int s, int sockopt) { @@ -2286,7 +2308,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2306,7 +2328,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_bad_data, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2326,7 +2348,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_bad_mac, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2346,7 +2368,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_truncated_record, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2366,7 +2388,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_bad_major, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2386,7 +2408,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_bad_minor, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2406,7 +2428,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_##name, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2426,7 +2448,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_split_##name, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2622,7 +2644,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_bad_padding, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2679,7 +2701,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_bad_iv, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2722,7 +2744,7 @@ ATF_TC_BODY(ktls_receive_##cipher_name##_bad_type, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2781,7 +2803,7 @@ ATF_TC_BODY(ktls_receive_invalid_##name, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2820,7 +2842,7 @@ ATF_TC_BODY(ktls_receive_unsupported_##name, tc) \ struct tls_enable en; \ uint64_t seqno; \ \ - ATF_REQUIRE_KTLS(); \ + ATF_REQUIRE_KTLS_RX(); \ seqno = random(); \ build_tls_enable(tc, cipher_alg, key_size, auth_alg, minor, \ seqno, &en); \ @@ -2881,29 +2903,18 @@ ATF_TC_BODY(ktls_sendto_baddst, tc) * Make sure that listen(2) returns an error for KTLS-enabled sockets, and * verify that an attempt to enable KTLS on a listening socket fails. */ -ATF_TC_WITHOUT_HEAD(ktls_listening_socket); -ATF_TC_BODY(ktls_listening_socket, tc) +static void +ktls_listening_socket(const atf_tc_t *tc, int optname) { struct tls_enable en; struct sockaddr_in sin; int s; - ATF_REQUIRE_KTLS(); - - s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - ATF_REQUIRE(s >= 0); - build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, - TLS_MINOR_VER_THREE, (uint64_t)random(), &en); - ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en, - sizeof(en)) == 0); - ATF_REQUIRE_ERRNO(EINVAL, listen(s, 1) == -1); - ATF_REQUIRE(close(s) == 0); - s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); ATF_REQUIRE(s >= 0); build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, TLS_MINOR_VER_THREE, (uint64_t)random(), &en); - ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, TCP_RXTLS_ENABLE, &en, + ATF_REQUIRE(setsockopt(s, IPPROTO_TCP, optname, &en, sizeof(en)) == 0); ATF_REQUIRE_ERRNO(EINVAL, listen(s, 1) == -1); ATF_REQUIRE(close(s) == 0); @@ -2918,12 +2929,26 @@ ATF_TC_BODY(ktls_listening_socket, tc) build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, TLS_MINOR_VER_THREE, (uint64_t)random(), &en); ATF_REQUIRE_ERRNO(ENOTCONN, - setsockopt(s, IPPROTO_TCP, TCP_TXTLS_ENABLE, &en, sizeof(en)) != 0); - ATF_REQUIRE_ERRNO(ENOTCONN, - setsockopt(s, IPPROTO_TCP, TCP_RXTLS_ENABLE, &en, sizeof(en)) != 0); + setsockopt(s, IPPROTO_TCP, optname, &en, sizeof(en)) != 0); ATF_REQUIRE(close(s) == 0); } +ATF_TC_WITHOUT_HEAD(ktls_listening_socket_tx); +ATF_TC_BODY(ktls_listening_socket_tx, tc) +{ + ATF_REQUIRE_KTLS(); + + ktls_listening_socket(tc, TCP_TXTLS_ENABLE); +} + +ATF_TC_WITHOUT_HEAD(ktls_listening_socket_rx); +ATF_TC_BODY(ktls_listening_socket_rx, tc) +{ + ATF_REQUIRE_KTLS_RX(); + + ktls_listening_socket(tc, TCP_RXTLS_ENABLE); +} + /* * Verify that the KTLS receive path does not overwrite data belonging * to a file whose payload is transmitted over a loopback connection @@ -2947,7 +2972,7 @@ ATF_TC_BODY(ktls_receive_loopback_sendfile, tc) int mode, shm, sockets[2]; socklen_t slen; - ATF_REQUIRE_KTLS(); + ATF_REQUIRE_KTLS_RX(); seqno = random(); build_tls_enable(tc, CRYPTO_AES_NIST_GCM_16, 128 / 8, 0, TLS_MINOR_VER_TWO, seqno, &en); @@ -3040,7 +3065,8 @@ ATF_TP_ADD_TCS(tp) /* Miscellaneous */ ATF_TP_ADD_TC(tp, ktls_sendto_baddst); - ATF_TP_ADD_TC(tp, ktls_listening_socket); + ATF_TP_ADD_TC(tp, ktls_listening_socket_tx); + ATF_TP_ADD_TC(tp, ktls_listening_socket_rx); ATF_TP_ADD_TC(tp, ktls_receive_loopback_sendfile); return (atf_no_error());