From nobody Sun Oct 5 21:56:38 2025 Received: from mail-pl1-f172.google.com (mail-pl1-f172.google.com [209.85.214.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82B6FA29; Tue, 29 Jul 2025 02:43:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753757002; cv=none; b=APsfB84YcnWk8joovYe3MijS7cVHIi9YiOM+YdMG3HeSy8RkgvCxqe4a/ilYNWE2ql1wKmngowDMiXscKfwUKMaaGaHtCBCJCkWKZOaQwBxn9WM713NG+U1r7M9BRkLBKxUY20QydsafyF7+jbwshEuABESAXCBSC9p/8drXVsI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753757002; c=relaxed/simple; bh=HMvCQvp5ENsHuaarpg8RMhgfvpDNdnf+k13CDaf4Xco=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BzJRnEAGmH0MpXMEdytuHyTXa8NbI+U9QvgfIiEz3TcPzzMuz5ERp8pkkySsYy1cbyDqBh2HAzYVfj6lyH/H1XMfNf0BWe2Plc6ppqNT5FyG4azC49s7emT3WbGaKcVO2WdKyuJG8gD9T9nO8xwFglVng7dclvz/guMi00R7TvQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GVjSsjdH; arc=none smtp.client-ip=209.85.214.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GVjSsjdH" Received: by mail-pl1-f172.google.com with SMTP id d9443c01a7336-240763b322fso79725ad.0; Mon, 28 Jul 2025 19:43:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753757000; x=1754361800; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=8ErzOLTg/uOQwoB1OOi0W/+D3AUEpPqbgJy4pCp+H1w=; b=GVjSsjdHQHzCdgn2MvmRj73lRRy2b8QVfaBtxccXF/W8tU/HsThnvm4kOp5bL3/VZb J8SBegDfFMY6/M8AuojPPUZ74AbP7zGM5nWioXz8sHAO4WmbBHtOkHUNZYlEvYIyf+aj 3j4nl5iYgJoIpYlOqqxLMHnJgXfuzO47fJNpfugercIHNXnAToqCU10c/wqfFUMOKP7f eUbOV99ghdIw9AhvGDgU4isBS3trkodKDhOqBzcUVOYgs7qT7GJRexHrNwCzwtZ5t7iQ oyplqeUhj2TIsk2g19tz6TtnNX/QIady/8c1JwRW0wg9B++mIPgEqtmAC5ZP5fVtwLVp pSCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753757000; x=1754361800; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=8ErzOLTg/uOQwoB1OOi0W/+D3AUEpPqbgJy4pCp+H1w=; b=chMUtkd/gb8aPKeFS4RJo/4qQZcSu/UOp3FYOHIPmjAS3zUxGFVcRUbNJxc3MBgvV+ SWNUxCimNMi++jSwPVVI0wi0pZbwGqDmzDVhyKtY/M0c6hHcrQT3ZYPyPZ5He/n+nHwO 6NI3d5vb84Kw3w+Lf8j8FQ7xz0hOaweDgvzms1M5kpiwC+3Fnvuiy+jnXxxwJX20bHyL XXS4AVos5rzL1VdyhxuNFpL+m+brXVnl4M0c1UG/8tH/qYd6JeAwLhSiajsfwia9rkEZ 0TUABTLTkHHQfR7+ct2geqsnT/kE/S3LiC77tKD+rtllpKQsNE4/VfhUOBcsc9hYBrRC //2A== X-Forwarded-Encrypted: i=1; AJvYcCUDsQ+24t3a4NYAuflZibSjshJVcmBXZAi9o/V2G6BTChKR7pL6D/9eFfi0SuvNjhmiqvURdRCY@vger.kernel.org, AJvYcCWzrHyEz9P6Zedej40MH9I9fmwC92xbFAPjOJwn2sDRW+q8GX68xMhzT8HVoVYbI+I9wXT4sv8clmg=@vger.kernel.org, AJvYcCXAMJFhUwqlG9J1w1HzbK+hA6x5hhD2BVS7z9TNYBgIed2pc9aaOPpi09nBrjLWacpmBl89JOuqbvkt@vger.kernel.org X-Gm-Message-State: AOJu0YyEXXTNAJwgGzUZjbmM6abOMjFsl0elj/rd3mnhh99IelmtCj4S K6OcS5XjcI41PvyFfc3Hq0KVpZMVaOykTyjItucZQbuksYh0VrYvo0If X-Gm-Gg: ASbGncuLodE2xgMiE8tzbWd0Zthf8HdwLKcDxqiLXEXrpoqBTNupKK5RibFivDFACwH vGTQ9F8vJiaGu8wRAT3WXSz4vlAkRNVUWoAiifoeRUyyMORF4JL8s9GVJMkKFL+o0qmkG1PLQZw ewMuZNZxuAz2kANHZcB12aMKTXWXdEk6bDW2lJ3bBoRN4KZ7s3aWrFwDAQQ0MwcYrYgMiJv6EJK OJWbclojUZgnIuhnpgYtnAwq9scw9KI6fE1Ms6NOqw7xMxdjrRxdwA5l2xD3g3CrrKRUFNQWZ+w eODFO+qUIGKvMNTf9m3tA0VQkVI8vC7bMLQMMSaH6rPBBommz1sMIk2gu90F9ksJ1tJolDc8L58 8YWt2MRsOGmGjFmIUck/a3Mqlnw5RfiuUBkne X-Google-Smtp-Source: AGHT+IGm00/i/5Md9wIJ3Bm72q8ofeFJb07OGmSiJpdFtE+Ka6GuL9pJd9Sn0gk85BhTLtNCqZxtwA== X-Received: by 2002:a17:902:d507:b0:240:2145:e51f with SMTP id d9443c01a7336-2402145e7cdmr84404155ad.3.1753756999714; Mon, 28 Jul 2025 19:43:19 -0700 (PDT) Received: from fedora ([159.196.5.243]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-23fecd9ed12sm51327855ad.8.2025.07.28.19.43.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jul 2025 19:43:19 -0700 (PDT) From: Wilfred Mallawa To: alistair.francis@wdc.com, dlemoal@kernel.org, chuck.lever@oracle.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, donald.hunter@gmail.com, corbet@lwn.net, kbusch@kernel.org, axboe@kernel.dk, hch@lst.de, sagi@grimberg.me, kch@nvidia.com, borisp@nvidia.com, john.fastabend@gmail.com, jlayton@kernel.org, neil@brown.name, okorniev@redhat.com, Dai.Ngo@oracle.com, tom@talpey.com, trondmy@kernel.org, anna@kernel.org, kernel-tls-handshake@lists.linux.dev, netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-nvme@lists.infradead.org, linux-nfs@vger.kernel.org, Wilfred Mallawa Subject: [RFC 1/4] net/handshake: get negotiated tls record size limit Date: Tue, 29 Jul 2025 12:41:49 +1000 Message-ID: <20250729024150.222513-4-wilfred.opensource@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250729024150.222513-2-wilfred.opensource@gmail.com> References: <20250729024150.222513-2-wilfred.opensource@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wilfred Mallawa During a handshake, an endpoint may specify a maximum record size limit. Currently, this limit is not visble to the kernel particularly in the case where userspace handles the handshake (tlshd/gnutls). This patch adds support for retrieving the record size limit. This is the first step in ensuring that the kernel can respect the record size limit imposed by the endpoint. Signed-off-by: Wilfred Mallawa --- Documentation/netlink/specs/handshake.yaml | 3 +++ Documentation/networking/tls-handshake.rst | 8 +++++++- drivers/nvme/host/tcp.c | 3 ++- drivers/nvme/target/tcp.c | 3 ++- include/net/handshake.h | 4 +++- include/uapi/linux/handshake.h | 1 + net/handshake/genl.c | 5 +++-- net/handshake/tlshd.c | 15 +++++++++++++-- net/sunrpc/svcsock.c | 4 +++- net/sunrpc/xprtsock.c | 4 +++- 10 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Documentation/netlink/specs/handshake.yaml b/Documentation/net= link/specs/handshake.yaml index b934cc513e3d..35d5eb91a3f9 100644 --- a/Documentation/netlink/specs/handshake.yaml +++ b/Documentation/netlink/specs/handshake.yaml @@ -84,6 +84,9 @@ attribute-sets: name: remote-auth type: u32 multi-attr: true + - + name: record-size-limit + type: u32 =20 operations: list: diff --git a/Documentation/networking/tls-handshake.rst b/Documentation/net= working/tls-handshake.rst index 6f5ea1646a47..cd984a137779 100644 --- a/Documentation/networking/tls-handshake.rst +++ b/Documentation/networking/tls-handshake.rst @@ -169,7 +169,8 @@ The synopsis of this function is: .. code-block:: c =20 typedef void (*tls_done_func_t)(void *data, int status, - key_serial_t peerid); + key_serial_t peerid, + size_t tls_record_size_limit); =20 The consumer provides a cookie in the @ta_data field of the tls_handshake_args structure that is returned in the @data parameter of @@ -200,6 +201,11 @@ The @peerid parameter contains the serial number of a = key containing the remote peer's identity or the value TLS_NO_PEERID if the session is not authenticated. =20 +The @tls_record_size_limit parameter, if non-zero, exposes the tls max +record size advertised by the endpoint. Record size must not exceed this a= mount. +A negative value shall indicate that the endpoint did not advertise the +maximum record size limit. + A best practice is to close and destroy the socket immediately if the handshake failed. =20 diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index d924008c3949..65ceadb4ffed 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1673,7 +1673,8 @@ static void nvme_tcp_set_queue_io_cpu(struct nvme_tcp= _queue *queue) qid, queue->io_cpu); } =20 -static void nvme_tcp_tls_done(void *data, int status, key_serial_t pskid) +static void nvme_tcp_tls_done(void *data, int status, key_serial_t pskid, + size_t tls_record_size_limit) { struct nvme_tcp_queue *queue =3D data; struct nvme_tcp_ctrl *ctrl =3D queue->ctrl; diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 470bf37e5a63..60e308401a54 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -1780,7 +1780,8 @@ static int nvmet_tcp_tls_key_lookup(struct nvmet_tcp_= queue *queue, } =20 static void nvmet_tcp_tls_handshake_done(void *data, int status, - key_serial_t peerid) + key_serial_t peerid, + size_t tls_record_size_limit) { struct nvmet_tcp_queue *queue =3D data; =20 diff --git a/include/net/handshake.h b/include/net/handshake.h index 8ebd4f9ed26e..c00b1aaa7aba 100644 --- a/include/net/handshake.h +++ b/include/net/handshake.h @@ -15,10 +15,12 @@ enum { TLS_NO_PEERID =3D 0, TLS_NO_CERT =3D 0, TLS_NO_PRIVKEY =3D 0, + TLS_NO_RECORD_SIZE_LIMIT =3D 0, }; =20 typedef void (*tls_done_func_t)(void *data, int status, - key_serial_t peerid); + key_serial_t peerid, + size_t tls_record_size_limit); =20 struct tls_handshake_args { struct socket *ta_sock; diff --git a/include/uapi/linux/handshake.h b/include/uapi/linux/handshake.h index 3d7ea58778c9..0768eb8eb415 100644 --- a/include/uapi/linux/handshake.h +++ b/include/uapi/linux/handshake.h @@ -54,6 +54,7 @@ enum { HANDSHAKE_A_DONE_STATUS =3D 1, HANDSHAKE_A_DONE_SOCKFD, HANDSHAKE_A_DONE_REMOTE_AUTH, + HANDSHAKE_A_DONE_RECORD_SIZE_LIMIT, =20 __HANDSHAKE_A_DONE_MAX, HANDSHAKE_A_DONE_MAX =3D (__HANDSHAKE_A_DONE_MAX - 1) diff --git a/net/handshake/genl.c b/net/handshake/genl.c index f55d14d7b726..44c43ce18361 100644 --- a/net/handshake/genl.c +++ b/net/handshake/genl.c @@ -16,10 +16,11 @@ static const struct nla_policy handshake_accept_nl_poli= cy[HANDSHAKE_A_ACCEPT_HAN }; =20 /* HANDSHAKE_CMD_DONE - do */ -static const struct nla_policy handshake_done_nl_policy[HANDSHAKE_A_DONE_R= EMOTE_AUTH + 1] =3D { +static const struct nla_policy handshake_done_nl_policy[HANDSHAKE_A_DONE_R= ECORD_SIZE_LIMIT + 1] =3D { [HANDSHAKE_A_DONE_STATUS] =3D { .type =3D NLA_U32, }, [HANDSHAKE_A_DONE_SOCKFD] =3D { .type =3D NLA_S32, }, [HANDSHAKE_A_DONE_REMOTE_AUTH] =3D { .type =3D NLA_U32, }, + [HANDSHAKE_A_DONE_RECORD_SIZE_LIMIT] =3D { .type =3D NLA_U32, }, }; =20 /* Ops table for handshake */ @@ -35,7 +36,7 @@ static const struct genl_split_ops handshake_nl_ops[] =3D= { .cmd =3D HANDSHAKE_CMD_DONE, .doit =3D handshake_nl_done_doit, .policy =3D handshake_done_nl_policy, - .maxattr =3D HANDSHAKE_A_DONE_REMOTE_AUTH, + .maxattr =3D HANDSHAKE_A_DONE_RECORD_SIZE_LIMIT, .flags =3D GENL_CMD_CAP_DO, }, }; diff --git a/net/handshake/tlshd.c b/net/handshake/tlshd.c index d6f52839827e..7cafac6cff1f 100644 --- a/net/handshake/tlshd.c +++ b/net/handshake/tlshd.c @@ -26,7 +26,8 @@ =20 struct tls_handshake_req { void (*th_consumer_done)(void *data, int status, - key_serial_t peerid); + key_serial_t peerid, + size_t tls_record_size_limit); void *th_consumer_data; =20 int th_type; @@ -39,6 +40,8 @@ struct tls_handshake_req { =20 unsigned int th_num_peerids; key_serial_t th_peerid[5]; + + size_t record_size_limit; }; =20 static struct tls_handshake_req * @@ -55,6 +58,7 @@ tls_handshake_req_init(struct handshake_req *req, treq->th_num_peerids =3D 0; treq->th_certificate =3D TLS_NO_CERT; treq->th_privkey =3D TLS_NO_PRIVKEY; + treq->record_size_limit =3D TLS_NO_RECORD_SIZE_LIMIT; return treq; } =20 @@ -83,6 +87,13 @@ static void tls_handshake_remote_peerids(struct tls_hand= shake_req *treq, if (i >=3D treq->th_num_peerids) break; } + + nla_for_each_attr(nla, head, len, rem) { + if (nla_type(nla) =3D=3D HANDSHAKE_A_DONE_RECORD_SIZE_LIMIT) { + treq->record_size_limit =3D nla_get_u32(nla); + break; + } + } } =20 /** @@ -105,7 +116,7 @@ static void tls_handshake_done(struct handshake_req *re= q, set_bit(HANDSHAKE_F_REQ_SESSION, &req->hr_flags); =20 treq->th_consumer_done(treq->th_consumer_data, -status, - treq->th_peerid[0]); + treq->th_peerid[0], treq->record_size_limit); } =20 #if IS_ENABLED(CONFIG_KEYS) diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index e1c85123b445..2014d906ff06 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -417,13 +417,15 @@ static void svc_tcp_kill_temp_xprt(struct svc_xprt *x= prt) * @data: address of xprt to wake * @status: status of handshake * @peerid: serial number of key containing the remote peer's identity + * @tls_record_size_limit: Max tls_record_size_limit of the endpoint * * If a security policy is specified as an export option, we don't * have a specific export here to check. So we set a "TLS session * is present" flag on the xprt and let an upper layer enforce local * security policy. */ -static void svc_tcp_handshake_done(void *data, int status, key_serial_t pe= erid) +static void svc_tcp_handshake_done(void *data, int status, key_serial_t pe= erid, + size_t tls_record_size_limit) { struct svc_xprt *xprt =3D data; struct svc_sock *svsk =3D container_of(xprt, struct svc_sock, sk_xprt); diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 04ff66758fc3..509aa6269b0a 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -2569,9 +2569,11 @@ static int xs_tcp_tls_finish_connecting(struct rpc_x= prt *lower_xprt, * @data: address of xprt to wake * @status: status of handshake * @peerid: serial number of key containing the remote's identity + * @tls_record_size_limit: Max tls_record_size_limit of the endpoint * */ -static void xs_tls_handshake_done(void *data, int status, key_serial_t pee= rid) +static void xs_tls_handshake_done(void *data, int status, key_serial_t pee= rid, + size_t tls_record_size_limit) { struct rpc_xprt *lower_xprt =3D data; struct sock_xprt *lower_transport =3D --=20 2.50.1 From nobody Sun Oct 5 21:56:38 2025 Received: from mail-pg1-f181.google.com (mail-pg1-f181.google.com [209.85.215.181]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78AB7207DFE; Tue, 29 Jul 2025 02:43:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753757016; cv=none; b=KVFulU80Z/eRonHINBmuATNnB6KLBPB1Nk4Twr59850zHqNyAGSwrHHpsixh4kuxVxcogAwDIWhHI8l+0KBdPqJ5o2Y5yDBEF94HwcbTgsYl0G4QGDWRO1VorLc0AU99oCbxxP1EgGhexGL/7baqJlhOuK7wKGw0mIX9XNivEpI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753757016; c=relaxed/simple; bh=MRfUaealSRtdSmAeJu0e/IqHYX9b2MdOPG/HupVSKUA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=V6X4/ugbrwmcaNOj8cPQaL/sW8JCRl7EUqWwehsUMvioKY5MNmnVOfuZNVQKI12mn0E0zroX6qQQWNwfp0iK7tnRyqyCSJeHdnQQZfbL/Pxat0TbMMCfCXV/Og5jD24UslnllqXHCWP/zJzwZEOJKSNBTCi+Q455QpogyLeCOrY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=NA4c40rR; arc=none smtp.client-ip=209.85.215.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="NA4c40rR" Received: by mail-pg1-f181.google.com with SMTP id 41be03b00d2f7-b34a8f69862so4282624a12.2; Mon, 28 Jul 2025 19:43:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753757015; x=1754361815; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=CUc8kFhAV7hypvAgEkTcPRzYg5s34VrqAAtY84jsOyQ=; b=NA4c40rRoThnUi9QK84QpWE1AT+34ltvolNVaFTGVARaW1IGA8VgAda+wN/knBs+81 FyhtCGLghYXzgct1LqFGShqORvlXpDIzj80SoPgJtCBySD4UXLyJbXMooW/xopNjDUht nUuGrWIxOU7tA0eXQyRuFrgVwaWncloKIIbcqtm0Lb9uBmhY1b60awJikje/WXVJy7nB F+DNGv8dw4SXZ5X5F0jBio7Pj2Qdcwlg+zmkLFMokvVZthC20PmQCKxpNQLND9iuSysb tivccKTErEFcyz+2kUowLfK/WzK6tsl/FC/SJTkG0adPdxby/T7XWAHSyDHUuRCkmmM6 HIyA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753757015; x=1754361815; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=CUc8kFhAV7hypvAgEkTcPRzYg5s34VrqAAtY84jsOyQ=; b=CCuFIDkd6P6N05fSE8ZyKzqNwaEncilnlgR4xldg0++TTg6Xm1d2ABwU2AUPMjb47x v8gpZwAAhNb7MtEaPlMLJdMdRKYBj22bsNudd4YWt9eG+qB8LznpwKj5noZxQ54wIhF8 8LFeqkSsBA8vy3k7embs6qWpUb2tvPTxBwTobnXsGyHLZkwYH89MF8Wb6mNIhxymew0j sQHPKmk3cEgkLMelLBH6skiBMhMK0wF7yxYq248gi5N3E0F6CNdl7eyKcbLriLKIrFLy 3whtgMZ/mAoZNkEA++nQEHCgXaCi3+r9pL+tSkISiM+yfBVHDkaT2Gr7f3OwbTsPqiuy gyFw== X-Forwarded-Encrypted: i=1; AJvYcCW5G0ypzyZby7DYPBiExB7aeVXfrh331bQtPn9+ePB7n/EHOkrcMsHERM9LwcROZ1itnAbJcL/4na0=@vger.kernel.org, AJvYcCXFDc9KydQgoRM+9zFzmMRH3Bmf4EHYVdgoBObG9pfjlZ3CQZrLdDaSKfnQiG9WCgQM/KoPdGpF/QIt@vger.kernel.org, AJvYcCXhi5FMOYnk9+gi1DXqZN7fLjDGmKG1AbLxHN1fIzlbyXtsHbikhWfUqXJuSMpx6S8gKsbcKuZl@vger.kernel.org X-Gm-Message-State: AOJu0Yyqqo3TQ9yZzsCVBb/PLOyRI1dqlfdOrzz0mefeHsCHW3rIo6bi rIIAVR99vevMZbpRNbxdDG518uFgHiNNTUd2k1hxrWs1YqQ8S+DDWoPp X-Gm-Gg: ASbGncu4Y9HHJc+UyfUjw9e96Vphzmo4Vibj+mPnL/zXtD9+qSCx1LbKEo8G2/SHF6G 24MUh8W7HxqV+ZE/8i2FvqTzgckvxN9nyaXMeb+PQi+8oOPFmAqVteyIL24AfzTMtRVHIcuykFc Nfc0DynzgqoKrefMlahCzDOFtpYOTLO2+Bf3f/wF+bbUOnki/Y/mgDNVSDZBSLgBO5vV6YesBM3 cjLsgTuFuB62+0T6t+7tcJagysTPkMMkHvdNrRwuWzKfkJSuM0pKgO321izeWhdV5SLEzbrwJEZ ffMNrqkk3o49GDMX4+c8hcIkMJPwqnqvc4jVoNsAm0Z31bZ2qlyme48DRA/C372VLEHOz15J2wh G8+syoO6dlsQO4FMB9BSUDhdefg== X-Google-Smtp-Source: AGHT+IGvnSnLVLEqZTFD+PzBwy1Cdk7P5Du3q9Qu7UOjqUQgKKgrycbGzQke7Edy0NFQh/gyLC2l1w== X-Received: by 2002:a17:903:3b8b:b0:234:ba37:879e with SMTP id d9443c01a7336-23fb3178fdamr231355165ad.38.1753757014631; Mon, 28 Jul 2025 19:43:34 -0700 (PDT) Received: from fedora ([159.196.5.243]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-23fecd9ed12sm51327855ad.8.2025.07.28.19.43.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jul 2025 19:43:34 -0700 (PDT) From: Wilfred Mallawa To: alistair.francis@wdc.com, dlemoal@kernel.org, chuck.lever@oracle.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, donald.hunter@gmail.com, corbet@lwn.net, kbusch@kernel.org, axboe@kernel.dk, hch@lst.de, sagi@grimberg.me, kch@nvidia.com, borisp@nvidia.com, john.fastabend@gmail.com, jlayton@kernel.org, neil@brown.name, okorniev@redhat.com, Dai.Ngo@oracle.com, tom@talpey.com, trondmy@kernel.org, anna@kernel.org, kernel-tls-handshake@lists.linux.dev, netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-nvme@lists.infradead.org, linux-nfs@vger.kernel.org, Wilfred Mallawa Subject: [RFC 2/4] net/tls/tls_sw: use the record size limit specified Date: Tue, 29 Jul 2025 12:41:50 +1000 Message-ID: <20250729024150.222513-5-wilfred.opensource@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250729024150.222513-2-wilfred.opensource@gmail.com> References: <20250729024150.222513-2-wilfred.opensource@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wilfred Mallawa Currently, for tls_sw, the kernel uses the default 16K TLS_MAX_PAYLOAD_SIZE for records. However, if an endpoint has specified a record size much lower than that, it is currently not respected. This patch adds support to using the record size limit specified by an endpoint if it has been set. Signed-off-by: Wilfred Mallawa --- include/net/tls.h | 1 + net/tls/tls_sw.c | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/include/net/tls.h b/include/net/tls.h index 857340338b69..6248beb4a6c1 100644 --- a/include/net/tls.h +++ b/include/net/tls.h @@ -241,6 +241,7 @@ struct tls_context { =20 struct scatterlist *partially_sent_record; u16 partially_sent_offset; + u32 tls_record_size_limit; =20 bool splicing_pages; bool pending_open_record_frags; diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index fc88e34b7f33..4c64f1436832 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1024,6 +1024,7 @@ static int tls_sw_sendmsg_locked(struct sock *sk, str= uct msghdr *msg, ssize_t copied =3D 0; struct sk_msg *msg_pl, *msg_en; struct tls_rec *rec; + u32 tls_record_size_limit; int required_size; int num_async =3D 0; bool full_record; @@ -1045,6 +1046,13 @@ static int tls_sw_sendmsg_locked(struct sock *sk, st= ruct msghdr *msg, } } =20 + if (tls_ctx->tls_record_size_limit > 0) { + tls_record_size_limit =3D min(tls_ctx->tls_record_size_limit, + TLS_MAX_PAYLOAD_SIZE); + } else { + tls_record_size_limit =3D TLS_MAX_PAYLOAD_SIZE; + } + while (msg_data_left(msg)) { if (sk->sk_err) { ret =3D -sk->sk_err; @@ -1066,7 +1074,7 @@ static int tls_sw_sendmsg_locked(struct sock *sk, str= uct msghdr *msg, orig_size =3D msg_pl->sg.size; full_record =3D false; try_to_copy =3D msg_data_left(msg); - record_room =3D TLS_MAX_PAYLOAD_SIZE - msg_pl->sg.size; + record_room =3D tls_record_size_limit - msg_pl->sg.size; if (try_to_copy >=3D record_room) { try_to_copy =3D record_room; full_record =3D true; --=20 2.50.1 From nobody Sun Oct 5 21:56:38 2025 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4C7132144C9; Tue, 29 Jul 2025 02:43:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753757032; cv=none; b=bU2fiZWzrNY+jAVVOGVSWpmvDsNPDc1ZYYGZviKdMo5FU73mfb9XrpzDZO9RnIAAfWBy812hnO7zK8zfSFQ/bvHs80zrJe5AEhrPvK6/SS4CnkYusJsZFLzkLE8qCzoIiQOXWf/vgBmULuoG/mM2k8TzbG24eswprhl9ColFC70= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753757032; c=relaxed/simple; bh=l1v2UzDTGF6SZCH5BGbDUHWH2BX0eFO3PYu1YlOwF5I=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EZ3ERYwU03mSfbHMgV9AdS9eqbfmT9K1Wb1q0TXash2tY7Lu9G9w5Mcc6YJm/K891PEqVDRpw/grFAiX1HJpDtcBSN3yZg/TEA4JXh0VovIb6YILntOp+fxyCltvtk5YNl55x2Yx10VUtvpEALebUcF8n7D/xOaSUdMx17zT6tY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=HNuvCED7; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="HNuvCED7" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2401b855980so14728825ad.1; Mon, 28 Jul 2025 19:43:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753757030; x=1754361830; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QKApX5AD9aIEi6uewJIQf4uaw0UGX/OqxGUTe4X6NvU=; b=HNuvCED7sISefPcBcZiqFxrua7D51BdEeqi2bA2Dl5emuUMZC8c4kEJX6pttSIWc3v H3QmHurgc3HG41XGn6oigHZGmWbhmclHTRKnBKOyc8jDNwZK6++/HGkiqXG9yYQ3Pqa9 L1GORsGborJQUTGMRq9jL5K6LvwY1Otfnyj6GXOr/akqado1lgOGQ5gKqVWKrEkm0Hyp KmWiiCNw2b5rrO5ue+/Y/6/PbF3cfAZ3VXF6ZeBvHGFTKq8r35l0kgTcqJgO49Umuhij tSJAoaMLO9Rh062diHXkNpIG31Ga6Pq2tMnxCDdOig1ZkJi1iilBtNeGoeUlJBoy5NPv CS4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753757030; x=1754361830; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QKApX5AD9aIEi6uewJIQf4uaw0UGX/OqxGUTe4X6NvU=; b=pe3Vsyc+hAzU9z3DVUdGWnJLNMHa6ExIiG+BPgCbmC0upYZRNNTqhfpFyfp6A4xje8 J2ELiTtdb8NuvAUrO5AsnC2YC5mCvqstDRqB7JYhkwGhP2F5bAKLPxMtG+S8/2qYzpRt 8Ko+dEXcPgCJALMt+X6xr6xn2hBQcsjk6ZUveHl/AHSX0YDySZH+OMpiQdFCHlsox2OL GXBjn4hWeuD5WbT7oHzgevw/1/1eKs8dlMx06WO5O0Wu/NaCo/W9pmAvB2Geajmr9ccR ZETU+s1ugI4yz+2GQX9238pN2NYMKkU0MxbXhj9X8rlyJ5YgpTLvC0c/yxyx7lh7bL7v bRRw== X-Forwarded-Encrypted: i=1; AJvYcCVUZrK1KcacLiLByju8va545C0a4OyL0vA5fR0WPYesKrJkbpqEY/7qosA9ZUyL6jC6duGdYuG9MYk7@vger.kernel.org, AJvYcCVkRVXFiQQKPLbvl7pdDcS7QZEq8jN9nYidBPXq9SpOmzPhzwSf5UBBaf62q7dXBY3z52x3UuSM@vger.kernel.org, AJvYcCWXbCHDOqWFSsx95Qi9NzO/M5dIXfDSpUhCyyEvR6NKXkLO09edPt8lauCfUTdqVyYrscrWlv989NA=@vger.kernel.org X-Gm-Message-State: AOJu0Yx9BuBP186yGNKQO4LMOiFDytyl0x0Bb6r7LoWfXUHiJhYpcP9q riw38jIJsjhD1iOWUk/nK6GBuAK4CFGWA1wKOy88I8xIzo/hC3gYRciK X-Gm-Gg: ASbGnct7ejHBPd5Oj1ITd8dhuUwYG+RuN/ZtZrOB//zK89vwQc7ljs59k24wp8TXbL4 wnhL46t42PWsPJY7VAEFrfRmw3K1kWiGVpDGXjIDKhUewAAzxokLUSIle+E+4SepkRU1slf6eoy CV6zJJTVbsIBRuJzB9UE9wWpsNd/8jFMlWv7DOYPdPFj0djZMcRoSiKtzu9uvIwaZrl67JiW5JR CW8N9kZbYZybrd4mFF2GJaaRCzdyQ4DO2LgHL9QXNA82anQec8/RXV6r5gFrAWyBmOQTPT4WtNG kbqc+GcNpVsQ5NWB+ogA2i/bZk3YBcmk0mUbtQCLuRV9nTZn+CDmW25f/Rvdx0ko4QYy0YjN9jb ZG1ref1bLQmMvQDqtsOW7TFQhqQ== X-Google-Smtp-Source: AGHT+IHdjXTtHTwMGQwZ9/tvr6W/g4hhHNiDFkExB3KA8O1wMz4OUmUJOvFvEzI8mjgHYmK3eABYWQ== X-Received: by 2002:a17:902:ef4e:b0:240:b28:22a3 with SMTP id d9443c01a7336-2400b282b9amr114633395ad.29.1753757030520; Mon, 28 Jul 2025 19:43:50 -0700 (PDT) Received: from fedora ([159.196.5.243]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-23fecd9ed12sm51327855ad.8.2025.07.28.19.43.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jul 2025 19:43:50 -0700 (PDT) From: Wilfred Mallawa To: alistair.francis@wdc.com, dlemoal@kernel.org, chuck.lever@oracle.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, donald.hunter@gmail.com, corbet@lwn.net, kbusch@kernel.org, axboe@kernel.dk, hch@lst.de, sagi@grimberg.me, kch@nvidia.com, borisp@nvidia.com, john.fastabend@gmail.com, jlayton@kernel.org, neil@brown.name, okorniev@redhat.com, Dai.Ngo@oracle.com, tom@talpey.com, trondmy@kernel.org, anna@kernel.org, kernel-tls-handshake@lists.linux.dev, netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-nvme@lists.infradead.org, linux-nfs@vger.kernel.org, Wilfred Mallawa Subject: [RFC 3/4] nvme/host/tcp: set max record size in the tls context Date: Tue, 29 Jul 2025 12:41:51 +1000 Message-ID: <20250729024150.222513-6-wilfred.opensource@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250729024150.222513-2-wilfred.opensource@gmail.com> References: <20250729024150.222513-2-wilfred.opensource@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wilfred Mallawa During a tls handshake, a host may specify the tls record size limit using the tls "record_size_limit" extension. Currently, the NVMe TCP host driver does not specify this value to the tls layer. This patch adds support for setting the tls record size limit into the tls context, such that outgoing records may not exceed this limit specified by the endpoint. Signed-off-by: Wilfred Mallawa --- drivers/nvme/host/tcp.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c index 65ceadb4ffed..84a55736f269 100644 --- a/drivers/nvme/host/tcp.c +++ b/drivers/nvme/host/tcp.c @@ -1677,6 +1677,7 @@ static void nvme_tcp_tls_done(void *data, int status,= key_serial_t pskid, size_t tls_record_size_limit) { struct nvme_tcp_queue *queue =3D data; + struct tls_context *tls_ctx =3D tls_get_ctx(queue->sock->sk); struct nvme_tcp_ctrl *ctrl =3D queue->ctrl; int qid =3D nvme_tcp_queue_id(queue); struct key *tls_key; @@ -1700,6 +1701,20 @@ static void nvme_tcp_tls_done(void *data, int status= , key_serial_t pskid, ctrl->ctrl.tls_pskid =3D key_serial(tls_key); key_put(tls_key); queue->tls_err =3D 0; + + /* Endpoint has specified a maximum tls record size limit */ + if (tls_record_size_limit > TLS_MAX_PAYLOAD_SIZE) { + dev_err(ctrl->ctrl.device, + "queue %d: invalid tls max record size limit: %zd\n", + nvme_tcp_queue_id(queue), tls_record_size_limit); + queue->tls_err =3D -EINVAL; + goto out_complete; + } else if (tls_record_size_limit > 0) { + tls_ctx->tls_record_size_limit =3D (u32)tls_record_size_limit; + dev_dbg(ctrl->ctrl.device, + "queue %d: target specified tls_record_size_limit %u\n", + nvme_tcp_queue_id(queue), tls_ctx->tls_record_size_limit); + } } =20 out_complete: --=20 2.50.1 From nobody Sun Oct 5 21:56:38 2025 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7230D1F419A; Tue, 29 Jul 2025 02:44:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753757042; cv=none; b=Ok4wlXioj+kXbAHDIpMzvFeK+Qei0uemWCh98SErLjX9IQbfDd9doqq73YS8wOpU+mslhZFuOiYAtlgxeVrlyEJSJiYMvmgIPAARN7cd2FT7CXZyvUXWDWLRDDDYCBOyv2EwZ4pAJ94tg3Qgl0I5Qv6chWmYEo3ETwgPoAjQrTM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753757042; c=relaxed/simple; bh=EvYmYWtgKd8mjhgilzaDMPo8Q/bubDoA5KPliFrUEW8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GTxZv/w+mP7fqIQj8ut0D08b8/xNn/0ySyAeJJFjRoqqX/lL2UFn0sWPvqClILVifKFtMbkZOK9xCk6yKHnSiLZp06wBLu1cxDSL2TqiYxV9Txs/dRQAJ+8a/3iCLoMu9FevcNEiGcNc38kz12Xt/Fl1bvcHdO72MTYd3Dw5E1M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=IOW3eCtl; arc=none smtp.client-ip=209.85.215.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="IOW3eCtl" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-b31d489a76dso5258000a12.1; Mon, 28 Jul 2025 19:44:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1753757040; x=1754361840; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zgt0RW1ytIxlMXzvFaCd3u+wuWOkXNFg3PALHarFCkw=; b=IOW3eCtlPgrnTCEy8mVt92olomZDUx5FFiYk3wVMZ1KausvJWhNk7GTwCb7zvH+RaB D9Oknfxdjjd+7MRaUAb+JqGyZd/h9n35yIvW1Rv/IaSFiVaUSSQwnwdfaGW0NDsYBEuQ 4fU2CKTPQEQX6zLRFUu4L2enqyAisq3JTYpTRaSt1EjpWBf5+HynOxrYPyMyCHphbwtI zR71SmwUYkcLjVozgJ/ZEmJ7AHGuwdjJILsk8wmExWR/8nb5q1DFHRRuPz08qPapxtIZ 8NMTWW5E8embLEE4GQhXJ+IT+Ht+MZbTfQjvl6vDav+yq9yu5/Ex/S8SRT5CJ70A+cP5 Ieiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753757040; x=1754361840; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zgt0RW1ytIxlMXzvFaCd3u+wuWOkXNFg3PALHarFCkw=; b=gRHxJnoIpdj9HbZq8+so9XpmmJYijeUtSVKtaIWtsueW3IWrs60KgE0BYUClLF6AkZ h+YVcZ5hszA2gkwWVYGfOt0wtIxGUDq7fZA6zm6JzPcsc2Tz4u+wKd9erYrDpWVzF+qK jRdy2cVZHMPVFNeMAD7R8uKnbogt+WKgeVqaiRE5u/b4NA6tCzSm+lIAXkb4tnQj2b7N LjH6U6F/idjUb9c1LvDseJu+kR1FJRbfIXUo31xDq9CxP/kPNLKWJ9NeRVJJPdcy6lon J7kH1kAB60juEL8ELmQRqqzl0hut7cIRNRvoB4K1kFSu0eikLHUpUqehbnJsht2TtfOs p7WA== X-Forwarded-Encrypted: i=1; AJvYcCVOJ5RBH7mZn1kfLpUYxvrz7KZQ67WGPUve6mI08vHzfEYAQSqG9nmZ8AXdI48/lIrEphT8xLD6Nucf@vger.kernel.org, AJvYcCVU7gs4PEpPYVpm1tguPrS6jgmxEmNonjb5rDXgEYlMbkKxcKn1Adi46wK36TscLuNzfRXfx7V9OmM=@vger.kernel.org, AJvYcCXNOwvEksKaXdPR2Ty+ZuW0wgcFPRXyKgf9WR8PrESBHJOy/Tswae/bL5zzyUjiM5A5b0DghXwf@vger.kernel.org X-Gm-Message-State: AOJu0YymLxkdGXT7u0GFK61gOJHsqOXcxxhcPbhL9ecJbw++8K52RNyA f9/WMGLq7rHTa2NqlOU15mZM4VyEQYerh+Kmb0hFKydFoAzusJ8Q0VBZ X-Gm-Gg: ASbGnctGFhwUWXnydzllaxKOzA9/waAkj64iAp7X3Ach45XL8T2J7xRC23gq4p6xEWM TR86/VhkYpPGY+TkxFx2pzxbgKPU14KqQ+W9tdVCZFDifRqMAsEk2LjMCD9gq/g7Lt+zC8o0GpM peToGCIEpnPMEs7qOmhRj693DQYjxY5JKW6IpXiIgDm7i0fubSTqMQE/6OLb9H3JhMIao9ljHGh c73fRKHc49W3NIIS1IpSrjNbw2TjDPZgvEKcxBXqSyZIYpYcuIwBA3A4HsRFwthLIMIFwOI0lRB 1zu/ppOouKgLHNdYM4ER0VUu9e+TsjTSHaKo1OtWRyNxixziDVT5dX4tnwBoz1WCH0gpMNfjk35 CMyPK+aGivtiTKZD7mryIpqq8sg== X-Google-Smtp-Source: AGHT+IHoH2RqRBEpNTQOrmGzch5WJntLLn2XCTRa7EVmeo/2jrFb47DkbxUEJrAbw3CNGKSshrbO6A== X-Received: by 2002:a17:903:98d:b0:240:44aa:7f3a with SMTP id d9443c01a7336-24044aa8419mr55052065ad.31.1753757040472; Mon, 28 Jul 2025 19:44:00 -0700 (PDT) Received: from fedora ([159.196.5.243]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-23fecd9ed12sm51327855ad.8.2025.07.28.19.43.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 28 Jul 2025 19:43:59 -0700 (PDT) From: Wilfred Mallawa To: alistair.francis@wdc.com, dlemoal@kernel.org, chuck.lever@oracle.com, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, horms@kernel.org, donald.hunter@gmail.com, corbet@lwn.net, kbusch@kernel.org, axboe@kernel.dk, hch@lst.de, sagi@grimberg.me, kch@nvidia.com, borisp@nvidia.com, john.fastabend@gmail.com, jlayton@kernel.org, neil@brown.name, okorniev@redhat.com, Dai.Ngo@oracle.com, tom@talpey.com, trondmy@kernel.org, anna@kernel.org, kernel-tls-handshake@lists.linux.dev, netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, linux-nvme@lists.infradead.org, linux-nfs@vger.kernel.org, Wilfred Mallawa Subject: [RFC 4/4] nvme/target/tcp: set max record size in the tls context Date: Tue, 29 Jul 2025 12:41:52 +1000 Message-ID: <20250729024150.222513-7-wilfred.opensource@gmail.com> X-Mailer: git-send-email 2.50.1 In-Reply-To: <20250729024150.222513-2-wilfred.opensource@gmail.com> References: <20250729024150.222513-2-wilfred.opensource@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Wilfred Mallawa During a tls handshake, a host may specify the tls record size limit using the tls "record_size_limit" extension. Currently, the NVMe target driver does not specify this value to the tls layer. This patch adds support for setting the tls record size limit into the tls context, such that outgoing records may not exceed this limit specified by the endpoint. Signed-off-by: Wilfred Mallawa --- drivers/nvme/target/tcp.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c index 60e308401a54..f2ab473ea5de 100644 --- a/drivers/nvme/target/tcp.c +++ b/drivers/nvme/target/tcp.c @@ -1784,6 +1784,7 @@ static void nvmet_tcp_tls_handshake_done(void *data, = int status, size_t tls_record_size_limit) { struct nvmet_tcp_queue *queue =3D data; + struct tls_context *tls_ctx =3D tls_get_ctx(queue->sock->sk); =20 pr_debug("queue %d: TLS handshake done, key %x, status %d\n", queue->idx, peerid, status); @@ -1795,6 +1796,17 @@ static void nvmet_tcp_tls_handshake_done(void *data,= int status, if (!status) { queue->tls_pskid =3D peerid; queue->state =3D NVMET_TCP_Q_CONNECTING; + + /* Endpoint has specified a maximum tls record size limit */ + if (tls_record_size_limit > TLS_MAX_PAYLOAD_SIZE) { + pr_err("queue %d: invalid tls max record size limit: %zu\n", + queue->idx, tls_record_size_limit); + queue->state =3D NVMET_TCP_Q_FAILED; + } else if (tls_record_size_limit > 0) { + tls_ctx->tls_record_size_limit =3D (u32)tls_record_size_limit; + pr_debug("queue %d: host specified tls max record size %u\n", + queue->idx, tls_ctx->tls_record_size_limit); + } } else queue->state =3D NVMET_TCP_Q_FAILED; spin_unlock_bh(&queue->state_lock); @@ -1808,6 +1820,7 @@ static void nvmet_tcp_tls_handshake_done(void *data, = int status, nvmet_tcp_schedule_release_queue(queue); else nvmet_tcp_set_queue_sock(queue); + kref_put(&queue->kref, nvmet_tcp_release_queue); } =20 --=20 2.50.1